package jo.util.lwjgl.win; import java.nio.FloatBuffer; import java.nio.IntBuffer; import jo.sm.logic.utils.BufferLogic; import jo.util.jgl.obj.JGLNode; import jo.vecmath.Matrix4f; import jo.vecmath.Point3f; import jo.vecmath.logic.Matrix4fLogic; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; import org.lwjgl.util.glu.GLU; public class NodeDrawHandler implements IDrawHandler { protected Matrix4f preDraw(long tick, JGLNode obj) { if (!obj.isInitialized()) { obj.init(); } Matrix4f t = obj.calcTransform(tick); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glPushMatrix(); GL11.glMultMatrix(Matrix4fLogic.toFloatBuffer(t)); return t; } @Override public void draw(long tick, JGLNode node) { // NO-OP } protected void postDraw(long tick, JGLNode obj) { projectToScreen(obj); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glPopMatrix(); } private void projectToScreen(JGLNode obj) { if ((obj.getLowBounds() == null) && (obj.getHighBounds() == null) && (obj.getData("pointMap") == null)) { return; } FloatBuffer modelView = BufferUtils.createFloatBuffer(16); FloatBuffer projection = BufferUtils.createFloatBuffer(16); FloatBuffer dviewport = BufferUtils.createFloatBuffer(16); GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelView); GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projection); GL11.glGetFloat(GL11.GL_VIEWPORT, dviewport); IntBuffer viewport = BufferLogic.create((int) dviewport.get(0), (int) dviewport.get(1), (int) dviewport.get(2), (int) dviewport.get(3)); if ((obj.getLowBounds() != null) && (obj.getHighBounds() != null)) { FloatBuffer low = BufferLogic.createFloatBuffer(3); GLU.gluProject(obj.getLowBounds().x, obj.getLowBounds().y, obj.getLowBounds().z, modelView, projection, viewport, low); FloatBuffer high = BufferLogic.createFloatBuffer(3); GLU.gluProject(obj.getHighBounds().x, obj.getHighBounds().y, obj.getHighBounds().z, modelView, projection, viewport, high); FloatBuffer mid = BufferLogic.createFloatBuffer(3); GLU.gluProject(0, 0, 0, modelView, projection, viewport, mid); obj.setScreen(new Point3f(mid.get(0), mid.get(1), mid.get(2))); obj.setScreenLowBounds(new Point3f(Math.min(low.get(0), high.get(0)), Math.min(low.get(1), high.get(1)), Math.min(low.get(2), high.get(2)))); obj.setScreenHighBounds(new Point3f(Math.max(low.get(0), high.get(0)), Math.max(low.get(1), high.get(1)), Math.max(low.get(2), high.get(2)))); // System.out.println("modelView="+DoubleUtils.toString(modelView)); // System.out.println("projection="+DoubleUtils.toString(projection)); // System.out.println("dviewport="+DoubleUtils.toString(dviewport)); // System.out.println("Screen="+DoubleUtils.toString(mid)); } Point3f pointMap = (Point3f) obj.getData("pointMap"); if (pointMap != null) { FloatBuffer pointMapped = BufferLogic.createFloatBuffer(3); GLU.gluUnProject(pointMap.x, pointMap.y, pointMap.z, modelView, projection, viewport, pointMapped); Point3f pMapped = new Point3f(pointMapped.get(0), pointMapped.get(1), pointMapped.get(2)); obj.setData("pointMap", null); obj.setData("pointMapped", pMapped); } } }