package ConnectivityEditor.ConnectivityControlGuide;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import javax.media.opengl.GL2;
import javax.media.opengl.glu.GLU;
import BrickControlGuide.AxisGuideTypeT;
import BrickControlGuide.IGuideRenderer;
import BrickControlGuide.MovementGuide;
import BrickControlGuide.RotationGuide;
import Builder.MainCamera;
import Common.Ray3;
import Common.Vector3f;
import Connectivity.IConnectivity;
import com.jogamp.opengl.util.gl2.GLUT;
public class ConnectivityMovementGuideRenderer {
private static ConnectivityMovementGuideRenderer _instance = null;
private MainCamera camera;
private GLU glu;
private GLUT glut;
private IConnectivity conn;
private IGuideRenderer selectedGuide = null;
private ArrayList<IGuideRenderer> defaultGuideList;
public static ConnectivityMovementGuideRenderer getInstance() {
return _instance;
}
public synchronized static ConnectivityMovementGuideRenderer getInstance(
MainCamera cam) {
_instance = new ConnectivityMovementGuideRenderer(cam);
return _instance;
}
private ConnectivityMovementGuideRenderer(MainCamera cam) {
camera = cam;
conn = null;
glu = new GLU(); // get GL Utilities
glut = new GLUT();
defaultGuideList = new ArrayList<IGuideRenderer>();
MovementGuide movementGuide = new MovementGuide(glu);
movementGuide.setColor3f(1, 0, 0);
movementGuide.setAxisGuideType(AxisGuideTypeT.X_Movement);
defaultGuideList.add(movementGuide);
movementGuide = new MovementGuide(glu);
movementGuide.setColor3f(0, 1, 0);
movementGuide.setAxisGuideType(AxisGuideTypeT.Y_Movement);
defaultGuideList.add(movementGuide);
movementGuide = new MovementGuide(glu);
movementGuide.setColor3f(0, 0, 1);
movementGuide.setAxisGuideType(AxisGuideTypeT.Z_Movement);
defaultGuideList.add(movementGuide);
RotationGuide rotationGuide = new RotationGuide(glu, glut);
rotationGuide.setColor3f(1, 0, 0);
rotationGuide.setAxisGuideType(AxisGuideTypeT.X_Rotate);
defaultGuideList.add(rotationGuide);
rotationGuide = new RotationGuide(glu, glut);
rotationGuide.setColor3f(0, 1, 0);
rotationGuide.setAxisGuideType(AxisGuideTypeT.Y_Rotate);
defaultGuideList.add(rotationGuide);
rotationGuide = new RotationGuide(glu, glut);
rotationGuide.setColor3f(0, 0, 1);
rotationGuide.setAxisGuideType(AxisGuideTypeT.Z_Rotate);
defaultGuideList.add(rotationGuide);
}
public void draw(GL2 gl2) {
if (camera == null)
return;
if (conn == null)
return;
Vector3f pos = conn.getCurrentPos();
gl2.glDisable(GL2.GL_LIGHTING);
gl2.glPushMatrix();
gl2.glMatrixMode(GL2.GL_MODELVIEW);
gl2.glLoadMatrixf(camera.getModelView(), 0);
if (selectedGuide == null && conn != null) {
for (IGuideRenderer guideRenderer : defaultGuideList)
guideRenderer.draw(gl2, camera, pos);
} else if (conn != null)
selectedGuide.draw(gl2, camera, pos);
gl2.glPopMatrix();
gl2.glEnable(GL2.GL_LIGHTING);
}
public IConnectivity getConn() {
return this.conn;
}
public IGuideRenderer getHittedAxisArrow(float screenX, float screenY) {
if (conn == null)
return null;
FloatBuffer distance = FloatBuffer.allocate(1);
FloatBuffer distanceTemp = FloatBuffer.allocate(1);
distance.put(0, Float.MAX_VALUE);
IGuideRenderer resultGuideRenderer = null;
for (IGuideRenderer guideRenderer : defaultGuideList) {
distanceTemp.put(0, Float.MAX_VALUE);
if (guideRenderer.isHitted(camera, conn.getCurrentPos(), screenX,
screenY, distanceTemp))
if (distanceTemp.get(0) < distance.get(0)) {
distance.put(0, distanceTemp.get(0));
resultGuideRenderer = guideRenderer;
}
}
return resultGuideRenderer;
}
public void axisSelectedType(IGuideRenderer guide) {
this.selectedGuide = guide;
}
public IGuideRenderer getSelectedGuide() {
return this.selectedGuide;
}
public void setConn(IConnectivity conn) {
if (conn != null)
this.conn = conn.getConnectivity();
else
this.conn = null;
}
}