package jo.util.lwjgl.win; import jo.util.jgl.obj.JGLNode; import jo.util.jgl.obj.tri.JGLObj; import org.lwjgl.opengl.GL11; public class ObjDrawHandler extends NodeDrawHandler { @Override public void draw(long tick, JGLNode node) { synchronized (node) { preDraw(tick, node); JGLObj obj = (JGLObj) node; GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY); if (obj.getNormalBuffer() != null) { GL11.glEnableClientState(GL11.GL_NORMAL_ARRAY); } if (obj.isWireframe()) { GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE); if (obj.getWireColor() != null) { GL11.glColor3f(obj.getWireColor().x, obj.getWireColor().y, obj.getWireColor().z); } } else { GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL); GL11.glShadeModel(GL11.GL_SMOOTH); } if (obj.isTextured()) { if (obj.getTextureColor() != null) { GL11.glColor4f(obj.getTextureColor().x, obj.getTextureColor().y, obj.getTextureColor().z, obj.getTextureColor().w); } GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); GL11.glBindTexture(GL11.GL_TEXTURE_2D, JGLTextureCache.getTexture(obj.getTextureID())); } else if (obj.getColorBuffer() != null) { if (obj.isAnyAlpha()) { GL11.glEnable(GL11.GL_BLEND); } GL11.glEnableClientState(GL11.GL_COLOR_ARRAY); } GL11.glFrontFace(GL11.GL_CW); GL11.glVertexPointer(3, 0, obj.getVertexBuffer()); if (obj.getNormalBuffer() != null) { GL11.glNormalPointer(0, obj.getNormalBuffer()); } if (obj.isTextured()) { GL11.glTexCoordPointer(2, 0, obj.getTexturesBuffer()); } else if (obj.getColorBuffer() != null) { GL11.glColorPointer(4, 0, obj.getColorBuffer()); } if (obj.getMode() == JGLObj.TRIANGLES) { if (obj.getIndexShortBuffer() != null) { GL11.glDrawElements(GL11.GL_TRIANGLES, obj.getIndexShortBuffer()); } else if (obj.getIndexIntBuffer() != null) { GL11.glDrawElements(GL11.GL_TRIANGLES, obj.getIndexIntBuffer()); } } else if (obj.getMode() == JGLObj.QUADS) { if (obj.getIndexShortBuffer() != null) { GL11.glDrawElements(GL11.GL_QUADS, obj.getIndexShortBuffer()); } else if (obj.getIndexIntBuffer() != null) { GL11.glDrawElements(GL11.GL_QUADS, obj.getIndexIntBuffer()); } } else { throw new IllegalArgumentException("Unknown mode: " + obj.getMode()); } GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY); if (obj.getNormalBuffer() != null) { GL11.glDisableClientState(GL11.GL_NORMAL_ARRAY); } if (obj.isTextured()) { GL11.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); GL11.glDisable(GL11.GL_BLEND); } else if (obj.getColorBuffer() != null) { GL11.glDisableClientState(GL11.GL_COLOR_ARRAY); if (obj.isAnyAlpha()) { GL11.glEnable(GL11.GL_BLEND); } } postDraw(tick, node); } } /* @Override protected void postDraw(GL2 gl, long tick, JGLNode node) { super.postDraw(tick, node); if (gl instanceof MatrixTrackingGL) { mScreenHighBounds = JGLUtils.gluProject(mHighBounds); mScreenLowBounds = JGLUtils.gluProject(mLowBounds); } } */ }