/*
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.selection;
import javax.media.opengl.GL;
import javax.media.opengl.glu.GLU;
import org.gephi.graph.api.Renderable;
import org.gephi.visualization.VizController;
import org.gephi.visualization.VizModel;
import org.gephi.visualization.apiimpl.GraphDrawable;
import org.gephi.visualization.apiimpl.GraphIO;
import org.gephi.visualization.apiimpl.ModelImpl;
import org.gephi.visualization.api.selection.SelectionArea;
import org.gephi.visualization.api.selection.SelectionManager;
import org.gephi.lib.gleem.linalg.Vecf;
/**
*
* @author Mathieu Bastian
*/
public class Cylinder implements SelectionArea {
//Architecture
private GraphIO graphIO;
private GraphDrawable drawable;
private SelectionManager selectionManager;
private VizModel vizModel;
//Variables
private static final float[] rectPoint = {1, 1};
private float[] rectangle = new float[2];
public Cylinder() {
graphIO = VizController.getInstance().getGraphIO();
drawable = VizController.getInstance().getDrawable();
selectionManager = VizController.getInstance().getSelectionManager();
vizModel = VizController.getInstance().getVizModel();
}
public float[] getSelectionAreaRectancle() {
float diameter = selectionManager.getMouseSelectionDiameter();
if (diameter == 1) {
//Point
return rectPoint;
} else {
float size;
if (selectionManager.isMouseSelectionZoomProportionnal()) {
size = diameter * (float) Math.abs(drawable.getDraggingMarkerX());
} else {
size = diameter;
}
rectangle[0] = size;
rectangle[1] = size;
return rectangle;
}
}
public float[] getSelectionAreaCenter() {
return null;
}
public boolean mouseTest(Vecf distanceFromMouse, ModelImpl object) {
float diameter = selectionManager.getMouseSelectionDiameter();
if (diameter == 1) {
//Point
return object.selectionTest(distanceFromMouse, 0);
} else {
if (selectionManager.isMouseSelectionZoomProportionnal()) {
return object.selectionTest(distanceFromMouse, diameter * (float) Math.abs(drawable.getDraggingMarkerX()));
} else {
return object.selectionTest(distanceFromMouse, diameter);
}
}
}
public boolean select(Renderable object) {
return true;
}
public boolean unselect(Renderable object) {
return true;
}
public void drawArea(GL gl, GLU glu) {
float diameter = selectionManager.getMouseSelectionDiameter();
if (diameter == 1) {
//Point
} else {
//Cylinder
float radius;
boolean lighting = vizModel.isLighting();
if (selectionManager.isMouseSelectionZoomProportionnal()) {
radius = (float) (diameter * Math.abs(drawable.getDraggingMarkerX())); //Proportionnal
} else {
radius = diameter; //Constant
}
float[] mousePosition = graphIO.getMousePosition();
float vectorX, vectorY, vectorX1 = mousePosition[0], vectorY1 = mousePosition[1];
double angle;
if (lighting) {
gl.glDisable(GL.GL_LIGHTING);
}
gl.glColor4f(0f, 0f, 0f, 0.2f);
gl.glBegin(GL.GL_TRIANGLES);
for (int i = 0; i <= 360; i++) {
angle = i / 57.29577957795135f;
vectorX = mousePosition[0] + (radius * (float) Math.sin(angle));
vectorY = mousePosition[1] + (radius * (float) Math.cos(angle));
gl.glVertex2f(mousePosition[0], mousePosition[1]);
gl.glVertex2f(vectorX1, vectorY1);
gl.glVertex2f(vectorX, vectorY);
vectorY1 = vectorY;
vectorX1 = vectorX;
}
gl.glEnd();
if (lighting) {
gl.glEnable(GL.GL_LIGHTING);
}
}
}
public boolean isEnabled() {
return selectionManager.isSelectionEnabled();
}
public boolean blockSelection() {
return false;
}
}