/*
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.Node;
import org.gephi.visualization.VizModel;
import org.gephi.visualization.apiimpl.ModelImpl;
import org.gephi.lib.gleem.linalg.Vecf;
import org.gephi.visualization.hull.ConvexHull;
import org.gephi.visualization.opengl.octree.Octant;
/**
*
* @author Mathieu Bastian
*/
public class ConvexHullModel extends ModelImpl<ConvexHull> {
protected boolean autoSelect = false;
protected boolean requestUpdate = true;
protected float scale = 0.1f;
protected float scaleQuantum = 0.1f;
@Override
public int[] octreePosition(float centerX, float centerY, float centerZ, float size) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isInOctreeLeaf(Octant leaf) {
ModelImpl[] nodes = obj.getNodes();
if (nodes.length != octants.length) {
return false;
}
for (int i = 0; i < nodes.length; i++) {
ModelImpl model = nodes[i];
if (model.getOctants()[0] != octants[i]) {
return false;
}
}
return true;
}
@Override
public void display(GL gl, GLU glu, VizModel model) {
if (requestUpdate) {
requestUpdate = false;
obj.recompute();
}
float r = obj.r();
float g = obj.g();
float b = obj.b();
/*float rlight = Math.min(1, 0.5f * r + 0.5f);
float glight = Math.min(1, 0.5f * g + 0.5f);
float blight = Math.min(1, 0.5f * b + 0.5f);*/
//Fill
if (selected) {
gl.glColor4f(r, g, b, 0.8f);
} else {
gl.glColor4f(r, g, b, 0.15f);
}
//Centroid
float centroidX = 0f;
float centroidY = 0f;
//Scale factor
if (scale < 1f && scale > 0f) {
centroidX = obj.x();
centroidY = obj.y();
gl.glPushMatrix();
gl.glTranslatef(centroidX, centroidY, 0f);
gl.glScalef(scale, scale, 1f);
}
gl.glBegin(GL.GL_POLYGON);
ModelImpl[] nodes = obj.getNodes();
for (int i = 0; i < nodes.length; i++) {
ModelImpl node = nodes[i];
gl.glVertex3f(node.getObj().x() - centroidX, node.getObj().y() - centroidY, node.getObj().z());
}
gl.glEnd();
//Line
gl.glColor4f(r, g, b, 0.8f);
gl.glBegin(GL.GL_LINE_LOOP);
for (int i = 0; i < nodes.length; i++) {
ModelImpl node = nodes[i];
gl.glVertex3f(node.getObj().x() - centroidX, node.getObj().y() - centroidY, node.getObj().z());
}
gl.glEnd();
if (scale < 1f && scale > 0f) {
scale += scaleQuantum;
gl.glPopMatrix();
}
}
@Override
public boolean selectionTest(Vecf distanceFromMouse, float selectionSize) {
return false;
}
@Override
public float getCollisionDistance(double angle) {
return 0f;
}
@Override
public String toSVG() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void setOctant(Octant octant) {
}
@Override
public Octant[] getOctants() {
ModelImpl[] nodes = obj.getNodes();
Octant[] newOctants = new Octant[nodes.length];
boolean allNull = true;
for (int i = 0; i < newOctants.length; i++) {
Octant oc = nodes[i].getOctants()[0];
newOctants[i] = oc;
if (oc != null) {
allNull = false;
}
}
if (!allNull) {
octants = newOctants;
}
return octants;
}
@Override
public void resetOctant() {
if (this.octants != null) {
this.octants[0] = null;
}
}
@Override
public void destroy() {
}
@Override
public boolean isAutoSelected() {
return autoSelect;
}
@Override
public boolean onlyAutoSelect() {
return true;
}
@Override
public void setAutoSelect(boolean autoSelect) {
this.autoSelect = autoSelect;
}
@Override
public void updatePositionFlag() {
requestUpdate = true;
}
public void setScale(float scale) {
this.scale = scale;
}
public void setScaleQuantum(float scaleQuantum) {
this.scaleQuantum = scaleQuantum;
}
}