/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.visualization.opengl.compatibility.objects; import javax.media.opengl.GL; import javax.media.opengl.glu.GLU; import org.gephi.graph.api.NodeData; import org.gephi.visualization.VizController; import org.gephi.visualization.VizModel; import org.gephi.visualization.apiimpl.GraphDrawable; import org.gephi.visualization.apiimpl.ModelImpl; import org.gephi.lib.gleem.linalg.Vecf; import org.gephi.visualization.opengl.octree.Octant; /** * * @author Mathieu Bastian */ public class NodeRectangeModel extends ModelImpl<NodeData> { public boolean border = true; protected float width = 20f; protected float height = 20f; public NodeRectangeModel() { octants = new Octant[1]; } @Override public int[] octreePosition(float centerX, float centerY, float centerZ, float size) { //float radius = obj.getRadius(); int index = 0; if (obj.y() < centerY) { index += 4; } if (obj.z() > centerZ) { index += 2; } if (obj.x() < centerX) { index += 1; } return new int[]{index}; } @Override public boolean isInOctreeLeaf(Octant leaf) { if (Math.abs(obj.x() - leaf.getPosX()) > (leaf.getSize() / 2 - obj.getRadius()) || Math.abs(obj.y() - leaf.getPosY()) > (leaf.getSize() / 2 - obj.getRadius()) || Math.abs(obj.z() - leaf.getPosZ()) > (leaf.getSize() / 2 - obj.getRadius())) { return false; } return true; } @Override public void display(GL gl, GLU glu, VizModel vizModel) { boolean selec = selected; boolean neighbor = false; highlight = false; if (vizModel.isAutoSelectNeighbor() && mark && !selec) { selec = true; highlight = true; neighbor = true; } mark = false; if (vizModel.isAdjustByText()) { width = obj.getTextData().getWidth(); height = obj.getTextData().getHeight(); } else { float size = obj.getSize(); width = size; height = size; } float w = width / 2f; float h = height / 2f; float x = obj.x(); float y = obj.y(); float borderSize = 1f; if (!selec) { if (vizModel.getConfig().isLightenNonSelected()) { float[] lightColor = vizModel.getConfig().getLightenNonSelectedColor(); float lightColorFactor = vizModel.getConfig().getLightenNonSelectedFactor(); float r = obj.r(); float g = obj.g(); float b = obj.b(); if (border) { float rborder = 0.498f * r; float gborder = 0.498f * g; float bborder = 0.498f * b; gl.glColor3f(rborder + (lightColor[0] - rborder) * lightColorFactor, gborder + (lightColor[1] - gborder) * lightColorFactor, bborder + (lightColor[2] - bborder) * lightColorFactor); gl.glVertex3f(x + w, y + h, 0); gl.glVertex3f(x - w, y + h, 0); gl.glVertex3f(x - w, y - h, 0); gl.glVertex3f(x + w, y - h, 0); w -= borderSize; h -= borderSize; } gl.glColor3f(r + (lightColor[0] - r) * lightColorFactor, g + (lightColor[1] - g) * lightColorFactor, b + (lightColor[2] - b) * lightColorFactor); } else { float r = obj.r(); float g = obj.g(); float b = obj.b(); if (border) { float rborder = 0.498f * r; float gborder = 0.498f * g; float bborder = 0.498f * b; gl.glColor3f(rborder, gborder, bborder); gl.glVertex3f(x + w, y + h, 0); gl.glVertex3f(x - w, y + h, 0); gl.glVertex3f(x - w, y - h, 0); gl.glVertex3f(x + w, y - h, 0); w -= borderSize; h -= borderSize; } gl.glColor3f(r, g, b); } } else { float r; float g; float b; float rborder; float gborder; float bborder; if (vizModel.isUniColorSelected()) { if (neighbor) { r = vizModel.getConfig().getUniColorSelectedNeigborColor()[0]; g = vizModel.getConfig().getUniColorSelectedNeigborColor()[1]; b = vizModel.getConfig().getUniColorSelectedNeigborColor()[2]; } else { r = vizModel.getConfig().getUniColorSelectedColor()[0]; g = vizModel.getConfig().getUniColorSelectedColor()[1]; b = vizModel.getConfig().getUniColorSelectedColor()[2]; } rborder = 0.498f * r; gborder = 0.498f * g; bborder = 0.498f * b; } else { rborder = obj.r(); gborder = obj.g(); bborder = obj.b(); r = Math.min(1, 0.5f * rborder + 0.5f); g = Math.min(1, 0.5f * gborder + 0.5f); b = Math.min(1, 0.5f * bborder + 0.5f); } if (border) { gl.glColor3f(rborder, gborder, bborder); gl.glVertex3f(x + w, y + h, 0); gl.glVertex3f(x - w, y + h, 0); gl.glVertex3f(x - w, y - h, 0); gl.glVertex3f(x + w, y - h, 0); w -= borderSize; h -= borderSize; } gl.glColor3f(r, g, b); } gl.glVertex3f(x + w, y + h, 0); gl.glVertex3f(x - w, y + h, 0); gl.glVertex3f(x - w, y - h, 0); gl.glVertex3f(x + w, y - h, 0); } @Override public boolean selectionTest(Vecf distanceFromMouse, float selectionSize) { GraphDrawable drawable = VizController.getInstance().getDrawable(); if (distanceFromMouse.get(0) < width / 2 * Math.abs(drawable.getDraggingMarkerX()) && distanceFromMouse.get(1) < height / 2 * Math.abs(drawable.getDraggingMarkerY())) { return true; } return false; } @Override public float getCollisionDistance(double angle) { double angleSinus = Math.sin(angle); double angleCosinus = Math.cos(angle); angle %= Math.PI * 2; while (angle < 0) { angle += Math.PI * 2; } if (angle < Math.atan2(height / 2, width / 2) || (angle > Math.PI - Math.atan2(height / 2, width / 2) && angle < Math.PI + Math.atan2(height / 2, width / 2)) || angle > 2 * Math.PI - Math.atan2(height / 2, width / 2)) { return (float) Math.sqrt((width * width / 4) / (1 - angleSinus * angleSinus)); } else { return (float) Math.sqrt((height * height / 4) / (1 - angleCosinus * angleCosinus)); } } @Override public String toSVG() { return null; } }