/*
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.utils.collection.avl.AVLItemAccessor;
import org.gephi.utils.collection.avl.ParamAVLTree;
import org.gephi.graph.api.NodeData;
import org.gephi.visualization.VizModel;
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 Potato3dModel extends ModelImpl<NodeData> {
public int modelType;
private ParamAVLTree<Octant> octantsTree;
protected boolean underMouse = false;
//protected PotatoDisplay display = null;
public Potato3dModel() {
octantsTree = new ParamAVLTree<Octant>(new AVLItemAccessor<Octant>() {
public int getNumber(Octant item) {
return item.getNumber();
}
});
//potato.updatePotato();
}
@Override
public int[] octreePosition(float centerX, float centerY, float centerZ, float size) {
throw new UnsupportedOperationException("Not needed");
}
@Override
public boolean isInOctreeLeaf(Octant leaf) {
/* for (Node node : obj.getContent()) {
ModelImpl objImpl = (ModelImpl) node.getObject3d();
Octant o = objImpl.getOctants()[0];
if (o == leaf) {
return true;
}
}*/
return false;
}
@Override
public void display(GL gl, GLU glu, VizModel model) {
/*if (mark) {
this.display = obj.getDisplay();
}
if (display != null) {
//Disks
if (mark) {
if (selected) {
gl.glColor3f(0.9f, 0.9f, 0.9f);
} else {
gl.glColor3f(obj.r(), obj.g(), obj.b());
}
for (float[] disk : display.getDisks()) {
gl.glPushMatrix();
float size = disk[2];
gl.glTranslatef(disk[0], disk[1], obj.z());
gl.glScalef(size, size, size);
gl.glCallList(modelType);
gl.glPopMatrix();
}
}
//Triangles
if (!mark) {
if (selected) {
gl.glColor3f(0.9f, 0.9f, 0.9f);
} else {
gl.glColor3f(obj.r(), obj.g(), obj.b());
}
for (float[] triangle : display.getTriangles()) {
gl.glVertex3f(triangle[0], triangle[1], obj.z());
gl.glVertex3f(triangle[2], triangle[3], obj.z());
gl.glVertex3f(triangle[4], triangle[5], obj.z());
}
}
}*/
}
@Override
public boolean selectionTest(Vecf distanceFromMouse, float selectionSize) {
/*if (underMouse) {
for (Node n : obj.getContent()) {
if (n.getObject3d().isSelected()) {
return false;
}
}
for (Potato p : obj.getInnerPotatoes()) {
Potato3dModel po = (Potato3dModel) p.getObject3d();
if (po.underMouse) {
return false;
}
}
return true;
}*/
return false;
}
@Override
public float getCollisionDistance(double angle) {
return 0;
}
@Override
public String toSVG() {
return null;
}
@Override
public Octant[] getOctants() {
if (octants == null) {
//Recompute octant tree
computeOctantsTree();
}
return octants;
}
@Override
public void resetOctant() {
octants = null;
}
private void computeOctantsTree() {
octantsTree.clear();
//Compute
/* for (Node node : obj.getContent()) {
ModelImpl objImpl = (ModelImpl) node.getObject3d();
Octant o = objImpl.getOctants()[0];
octantsTree.add(o);
}
*/
octants = octantsTree.toArray(new Octant[0]);
}
public void setUnderMouse(boolean underMouse) {
this.underMouse = underMouse;
}
public boolean isParentUnderMouse() {
/* if (obj.getParent() != null && ((Potato3dModel) obj.getParent().getObject3d()).underMouse) {
return true;
}*/
return false;
}
public boolean isDisplayReady() {
//return display != null;
return false;
}
}