159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.renderer.lwjgl; 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.light.*; 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.FixedFuncBinding; 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.RenderState; 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.ColorRGBA; 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.FastMath; 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.Matrix4f; 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.Vector3f; 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.Caps; 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.GL1Renderer; 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.RenderContext; 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.Statistics; 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Mesh; 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Mesh.Mode; 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.VertexBuffer; 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.VertexBuffer.Type; 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.VertexBuffer.Usage; 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.shader.Shader; 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.shader.Shader.ShaderSource; 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.FrameBuffer; 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Image; 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Texture; 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Texture.WrapAxis; 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.BufferUtils; 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.IntMap; 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.IntMap.Entry; 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.NativeObjectManager; 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.*; 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.ArrayList; 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.EnumSet; 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger; 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport jme3tools.converters.MipMapGenerator; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport static org.lwjgl.opengl.GL11.*; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport org.lwjgl.opengl.GL12; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport org.lwjgl.opengl.GL14; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport org.lwjgl.opengl.GLContext; 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class LwjglGL1Renderer implements GL1Renderer { 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static final Logger logger = Logger.getLogger(LwjglRenderer.class.getName()); 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final ByteBuffer nameBuf = BufferUtils.createByteBuffer(250); 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final StringBuilder stringBuf = new StringBuilder(250); 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final IntBuffer ib1 = BufferUtils.createIntBuffer(1); 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final IntBuffer intBuf16 = BufferUtils.createIntBuffer(16); 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final FloatBuffer fb16 = BufferUtils.createFloatBuffer(16); 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final FloatBuffer fb4Null = BufferUtils.createFloatBuffer(4); 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final RenderContext context = new RenderContext(); 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final NativeObjectManager objManager = new NativeObjectManager(); 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final EnumSet<Caps> caps = EnumSet.noneOf(Caps.class); 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int maxTexSize; 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int maxCubeTexSize; 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int maxVertCount; 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int maxTriCount; 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int maxLights; 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private boolean gl12 = false; 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final Statistics statistics = new Statistics(); 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int vpX, vpY, vpW, vpH; 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int clipX, clipY, clipW, clipH; 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Matrix4f worldMatrix = new Matrix4f(); 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Matrix4f viewMatrix = new Matrix4f(); 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private ArrayList<Light> lightList = new ArrayList<Light>(8); 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private ColorRGBA materialAmbientColor = new ColorRGBA(); 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Vector3f tempVec = new Vector3f(); 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected void updateNameBuffer() { 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int len = stringBuf.length(); 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta nameBuf.position(0); 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta nameBuf.limit(len); 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < len; i++) { 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta nameBuf.put((byte) stringBuf.charAt(i)); 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta nameBuf.rewind(); 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Statistics getStatistics() { 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return statistics; 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public EnumSet<Caps> getCaps() { 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return caps; 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void initialize() { 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (GLContext.getCapabilities().OpenGL12){ 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta gl12 = true; 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Default values for certain GL state. 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glShadeModel(GL_SMOOTH); 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Enable rescaling/normaling of normal vectors. 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Fixes lighting issues with scaled models. 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (gl12){ 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(GL12.GL_RESCALE_NORMAL); 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(GL_NORMALIZE); 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (GLContext.getCapabilities().GL_ARB_texture_non_power_of_two) { 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta caps.add(Caps.NonPowerOfTwoTextures); 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.WARNING, "Your graphics card does not " 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta + "support non-power-of-2 textures. " 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta + "Some features might not work."); 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta maxLights = glGetInteger(GL_MAX_LIGHTS); 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void invalidateState() { 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.reset(); 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void resetGLObjects() { 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.INFO, "Reseting objects and invalidating state"); 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta objManager.resetObjects(); 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta statistics.clearMemory(); 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta invalidateState(); 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void cleanup() { 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.INFO, "Deleting objects and invalidating state"); 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta objManager.deleteAllObjects(this); 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta statistics.clearMemory(); 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta invalidateState(); 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setDepthRange(float start, float end) { 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDepthRange(start, end); 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void clearBuffers(boolean color, boolean depth, boolean stencil) { 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int bits = 0; 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (color) { 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //See explanations of the depth below, we must enable color write to be able to clear the color buffer 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (context.colorWriteEnabled == false) { 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glColorMask(true, true, true, true); 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.colorWriteEnabled = true; 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bits = GL_COLOR_BUFFER_BIT; 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (depth) { 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //glClear(GL_DEPTH_BUFFER_BIT) seems to not work when glDepthMask is false 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //here s some link on openl board 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=257223 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //if depth clear is requested, we enable the depthMask 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (context.depthWriteEnabled == false) { 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDepthMask(true); 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.depthWriteEnabled = true; 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bits |= GL_DEPTH_BUFFER_BIT; 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (stencil) { 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bits |= GL_STENCIL_BUFFER_BIT; 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (bits != 0) { 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glClear(bits); 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setBackgroundColor(ColorRGBA color) { 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glClearColor(color.r, color.g, color.b, color.a); 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void setMaterialColor(int type, ColorRGBA color, ColorRGBA defaultColor) { 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (color != null){ 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.put(color.r).put(color.g).put(color.b).put(color.a).flip(); 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.put(defaultColor.r).put(defaultColor.g).put(defaultColor.b).put(defaultColor.a).flip(); 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glMaterial(GL_FRONT_AND_BACK, type, fb16); 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Applies fixed function bindings from the context to OpenGL 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void applyFixedFuncBindings(boolean forLighting){ 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (forLighting){ 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, context.shininess); 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setMaterialColor(GL_AMBIENT, context.ambient, ColorRGBA.DarkGray); 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setMaterialColor(GL_DIFFUSE, context.diffuse, ColorRGBA.White); 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setMaterialColor(GL_SPECULAR, context.specular, ColorRGBA.Black); 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (context.useVertexColor){ 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(GL_COLOR_MATERIAL); 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDisable(GL_COLOR_MATERIAL); 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Ignore other values as they have no effect when 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // GL_LIGHTING is disabled. 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ColorRGBA color = context.color; 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (color != null){ 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glColor4f(color.r, color.g, color.b, color.a); 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glColor4f(1,1,1,1); 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Reset fixed function bindings to default values. 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void resetFixedFuncBindings(){ 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.color = null; 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.ambient = null; 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.diffuse = null; 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.specular = null; 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.shininess = 0; 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.useVertexColor = false; 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setFixedFuncBinding(FixedFuncBinding ffBinding, Object val) { 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (ffBinding) { 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Color: 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.color = (ColorRGBA) val; 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case MaterialAmbient: 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.ambient = (ColorRGBA) val; 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case MaterialDiffuse: 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.diffuse = (ColorRGBA) val; 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case MaterialSpecular: 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.specular = (ColorRGBA) val; 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case MaterialShininess: 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.shininess = (Float) val; 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case UseVertexColor: 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.useVertexColor = (Boolean) val; 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void applyRenderState(RenderState state) { 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.isWireframe() && !context.wireframe) { 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.wireframe = true; 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (!state.isWireframe() && context.wireframe) { 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.wireframe = false; 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.isDepthTest() && !context.depthTestEnabled) { 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(GL_DEPTH_TEST); 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDepthFunc(GL_LEQUAL); 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.depthTestEnabled = true; 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (!state.isDepthTest() && context.depthTestEnabled) { 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDisable(GL_DEPTH_TEST); 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.depthTestEnabled = false; 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.isAlphaTest() && !context.alphaTestEnabled) { 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(GL_ALPHA_TEST); 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glAlphaFunc(GL_GREATER, state.getAlphaFallOff()); 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.alphaTestEnabled = true; 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (!state.isAlphaTest() && context.alphaTestEnabled) { 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDisable(GL_ALPHA_TEST); 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.alphaTestEnabled = false; 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.isDepthWrite() && !context.depthWriteEnabled) { 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDepthMask(true); 27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.depthWriteEnabled = true; 27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (!state.isDepthWrite() && context.depthWriteEnabled) { 27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDepthMask(false); 27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.depthWriteEnabled = false; 27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.isColorWrite() && !context.colorWriteEnabled) { 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glColorMask(true, true, true, true); 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.colorWriteEnabled = true; 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (!state.isColorWrite() && context.colorWriteEnabled) { 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glColorMask(false, false, false, false); 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.colorWriteEnabled = false; 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.isPointSprite()) { 29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.WARNING, "Point Sprite unsupported!"); 29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.isPolyOffset()) { 29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!context.polyOffsetEnabled) { 29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(GL_POLYGON_OFFSET_FILL); 29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glPolygonOffset(state.getPolyOffsetFactor(), 29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta state.getPolyOffsetUnits()); 29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.polyOffsetEnabled = true; 29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.polyOffsetFactor = state.getPolyOffsetFactor(); 30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.polyOffsetUnits = state.getPolyOffsetUnits(); 30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.getPolyOffsetFactor() != context.polyOffsetFactor 30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta || state.getPolyOffsetUnits() != context.polyOffsetUnits) { 30459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glPolygonOffset(state.getPolyOffsetFactor(), 30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta state.getPolyOffsetUnits()); 30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.polyOffsetFactor = state.getPolyOffsetFactor(); 30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.polyOffsetUnits = state.getPolyOffsetUnits(); 30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 31159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (context.polyOffsetEnabled) { 31259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDisable(GL_POLYGON_OFFSET_FILL); 31359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.polyOffsetEnabled = false; 31459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.polyOffsetFactor = 0; 31559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.polyOffsetUnits = 0; 31659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.getFaceCullMode() != context.cullMode) { 31959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.getFaceCullMode() == RenderState.FaceCullMode.Off) { 32059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDisable(GL_CULL_FACE); 32159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 32259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(GL_CULL_FACE); 32359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 32559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (state.getFaceCullMode()) { 32659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Off: 32759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 32859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Back: 32959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glCullFace(GL_BACK); 33059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 33159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Front: 33259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glCullFace(GL_FRONT); 33359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 33459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case FrontAndBack: 33559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glCullFace(GL_FRONT_AND_BACK); 33659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 33759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 33859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unrecognized face cull mode: " 33959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta + state.getFaceCullMode()); 34059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 34159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 34259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.cullMode = state.getFaceCullMode(); 34359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 34459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 34559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.getBlendMode() != context.blendMode) { 34659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.getBlendMode() == RenderState.BlendMode.Off) { 34759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDisable(GL_BLEND); 34859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 34959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(GL_BLEND); 35059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (state.getBlendMode()) { 35159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Off: 35259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 35359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Additive: 35459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glBlendFunc(GL_ONE, GL_ONE); 35559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 35659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case AlphaAdditive: 35759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glBlendFunc(GL_SRC_ALPHA, GL_ONE); 35859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 35959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Color: 36059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR); 36159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 36259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Alpha: 36359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 36459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 36559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case PremultAlpha: 36659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 36759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 36859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Modulate: 36959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glBlendFunc(GL_DST_COLOR, GL_ZERO); 37059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 37159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case ModulateX2: 37259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR); 37359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 37459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 37559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unrecognized blend mode: " 37659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta + state.getBlendMode()); 37759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 37859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 37959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 38059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.blendMode = state.getBlendMode(); 38159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 38259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 38359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (state.isStencilTest()) { 38459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("OpenGL 1.1 doesn't support two sided stencil operations."); 38559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 38659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 38759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 38859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 38959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setViewPort(int x, int y, int w, int h) { 39059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (x != vpX || vpY != y || vpW != w || vpH != h) { 39159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glViewport(x, y, w, h); 39259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta vpX = x; 39359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta vpY = y; 39459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta vpW = w; 39559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta vpH = h; 39659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 39759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 39859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 39959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setClipRect(int x, int y, int width, int height) { 40059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!context.clipRectEnabled) { 40159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(GL_SCISSOR_TEST); 40259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.clipRectEnabled = true; 40359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 40459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (clipX != x || clipY != y || clipW != width || clipH != height) { 40559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glScissor(x, y, width, height); 40659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta clipX = x; 40759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta clipY = y; 40859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta clipW = width; 40959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta clipH = height; 41059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 41159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 41259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 41359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void clearClipRect() { 41459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (context.clipRectEnabled) { 41559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDisable(GL_SCISSOR_TEST); 41659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.clipRectEnabled = false; 41759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 41859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta clipX = 0; 41959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta clipY = 0; 42059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta clipW = 0; 42159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta clipH = 0; 42259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 42359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 42459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 42559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onFrame() { 42659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta objManager.deleteUnused(this); 42759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// statistics.clearFrame(); 42859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 42959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 43059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private FloatBuffer storeMatrix(Matrix4f matrix, FloatBuffer store) { 43159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta store.clear(); 43259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta matrix.fillFloatBuffer(store, true); 43359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta store.clear(); 43459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return store; 43559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 43659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 43759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void setModelView(Matrix4f modelMatrix, Matrix4f viewMatrix){ 43859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (context.matrixMode != GL_MODELVIEW) { 43959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glMatrixMode(GL_MODELVIEW); 44059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.matrixMode = GL_MODELVIEW; 44159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 44259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 44359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLoadMatrix(storeMatrix(viewMatrix, fb16)); 44459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glMultMatrix(storeMatrix(modelMatrix, fb16)); 44559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 44659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 44759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void setProjection(Matrix4f projMatrix){ 44859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (context.matrixMode != GL_PROJECTION) { 44959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glMatrixMode(GL_PROJECTION); 45059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.matrixMode = GL_PROJECTION; 45159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 45259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 45359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLoadMatrix(storeMatrix(projMatrix, fb16)); 45459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 45559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 45659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setWorldMatrix(Matrix4f worldMatrix) { 45759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.worldMatrix.set(worldMatrix); 45859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 45959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 46059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setViewProjectionMatrices(Matrix4f viewMatrix, Matrix4f projMatrix) { 46159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.viewMatrix.set(viewMatrix); 46259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setProjection(projMatrix); 46359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 46459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 46559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setLighting(LightList list) { 46659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // XXX: This is abuse of setLighting() to 46759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // apply fixed function bindings 46859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // and do other book keeping. 46959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (list == null || list.size() == 0){ 47059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDisable(GL_LIGHTING); 47159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta applyFixedFuncBindings(false); 47259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setModelView(worldMatrix, viewMatrix); 47359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 47459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 47559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 47659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Number of lights set previously 47759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int numLightsSetPrev = lightList.size(); 47859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 47959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // If more than maxLights are defined, they will be ignored. 48059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // The GL1 renderer is not permitted to crash due to a 48159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // GL1 limitation. It must render anything that the GL2 renderer 48259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // can render (even incorrectly). 48359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta lightList.clear(); 48459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta materialAmbientColor.set(0, 0, 0, 0); 48559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 48659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < list.size(); i++){ 48759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Light l = list.get(i); 48859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (l.getType() == Light.Type.Ambient){ 48959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Gather 49059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta materialAmbientColor.addLocal(l.getColor()); 49159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 49259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Add to list 49359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta lightList.add(l); 49459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 49559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Once maximum lights reached, exit loop. 49659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (lightList.size() >= maxLights){ 49759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 49859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 49959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 50059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 50159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 50259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta applyFixedFuncBindings(true); 50359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 50459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(GL_LIGHTING); 50559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 50659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.clear(); 50759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.put(materialAmbientColor.r) 50859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta .put(materialAmbientColor.g) 50959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta .put(materialAmbientColor.b) 51059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta .put(1).flip(); 51159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 51259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightModel(GL_LIGHT_MODEL_AMBIENT, fb16); 51359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 51459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (context.matrixMode != GL_MODELVIEW) { 51559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glMatrixMode(GL_MODELVIEW); 51659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.matrixMode = GL_MODELVIEW; 51759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 51859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Lights are already in world space, so just convert 51959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // them to view space. 52059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLoadMatrix(storeMatrix(viewMatrix, fb16)); 52159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 52259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < lightList.size(); i++){ 52359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int glLightIndex = GL_LIGHT0 + i; 52459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Light light = lightList.get(i); 52559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Light.Type lightType = light.getType(); 52659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ColorRGBA col = light.getColor(); 52759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Vector3f pos; 52859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 52959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Enable the light 53059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(glLightIndex); 53159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 53259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // OGL spec states default value for light ambient is black 53359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (lightType){ 53459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Directional: 53559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta DirectionalLight dLight = (DirectionalLight) light; 53659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 53759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.clear(); 53859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.put(col.r).put(col.g).put(col.b).put(col.a).flip(); 53959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLight(glLightIndex, GL_DIFFUSE, fb16); 54059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLight(glLightIndex, GL_SPECULAR, fb16); 54159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 54259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pos = tempVec.set(dLight.getDirection()).negateLocal().normalizeLocal(); 54359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.clear(); 54459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.put(pos.x).put(pos.y).put(pos.z).put(0.0f).flip(); 54559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLight(glLightIndex, GL_POSITION, fb16); 54659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightf(glLightIndex, GL_SPOT_CUTOFF, 180); 54759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 54859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Point: 54959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta PointLight pLight = (PointLight) light; 55059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 55159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.clear(); 55259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.put(col.r).put(col.g).put(col.b).put(col.a).flip(); 55359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLight(glLightIndex, GL_DIFFUSE, fb16); 55459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLight(glLightIndex, GL_SPECULAR, fb16); 55559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 55659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pos = pLight.getPosition(); 55759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.clear(); 55859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.put(pos.x).put(pos.y).put(pos.z).put(1.0f).flip(); 55959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLight(glLightIndex, GL_POSITION, fb16); 56059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightf(glLightIndex, GL_SPOT_CUTOFF, 180); 56159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 56259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (pLight.getRadius() > 0) { 56359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Note: this doesn't follow the same attenuation model 56459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // as the one used in the lighting shader. 56559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightf(glLightIndex, GL_CONSTANT_ATTENUATION, 1); 56659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightf(glLightIndex, GL_LINEAR_ATTENUATION, pLight.getInvRadius() * 2); 56759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightf(glLightIndex, GL_QUADRATIC_ATTENUATION, pLight.getInvRadius() * pLight.getInvRadius()); 56859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 56959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightf(glLightIndex, GL_CONSTANT_ATTENUATION, 1); 57059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightf(glLightIndex, GL_LINEAR_ATTENUATION, 0); 57159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightf(glLightIndex, GL_QUADRATIC_ATTENUATION, 0); 57259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 57359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 57459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 57559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Spot: 57659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta SpotLight sLight = (SpotLight) light; 57759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 57859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.clear(); 57959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.put(col.r).put(col.g).put(col.b).put(col.a).flip(); 58059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLight(glLightIndex, GL_DIFFUSE, fb16); 58159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLight(glLightIndex, GL_SPECULAR, fb16); 58259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 58359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pos = sLight.getPosition(); 58459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.clear(); 58559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.put(pos.x).put(pos.y).put(pos.z).put(1.0f).flip(); 58659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLight(glLightIndex, GL_POSITION, fb16); 58759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 58859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Vector3f dir = sLight.getDirection(); 58959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.clear(); 59059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fb16.put(dir.x).put(dir.y).put(dir.z).put(1.0f).flip(); 59159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLight(glLightIndex, GL_SPOT_DIRECTION, fb16); 59259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 59359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float outerAngleRad = sLight.getSpotOuterAngle(); 59459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float innerAngleRad = sLight.getSpotInnerAngle(); 59559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float spotCut = outerAngleRad * FastMath.RAD_TO_DEG; 59659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float spotExpo = 0.0f; 59759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (outerAngleRad > 0) { 59859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta spotExpo = (1.0f - (innerAngleRad / outerAngleRad)) * 128.0f; 59959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 60059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 60159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightf(glLightIndex, GL_SPOT_CUTOFF, spotCut); 60259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightf(glLightIndex, GL_SPOT_EXPONENT, spotExpo); 60359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 60459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (sLight.getSpotRange() > 0) { 60559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightf(glLightIndex, GL_LINEAR_ATTENUATION, sLight.getInvSpotRange()); 60659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 60759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLightf(glLightIndex, GL_LINEAR_ATTENUATION, 0); 60859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 60959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 61059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 61159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 61259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException( 61359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta "Unrecognized light type: " + lightType); 61459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 61559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 61659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 61759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Disable lights after the index 61859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = lightList.size(); i < numLightsSetPrev; i++){ 61959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDisable(GL_LIGHT0 + i); 62059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 62159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 62259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // This will set view matrix as well. 62359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setModelView(worldMatrix, viewMatrix); 62459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 62559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 62659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int convertTextureType(Texture.Type type) { 62759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (type) { 62859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case TwoDimensional: 62959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_TEXTURE_2D; 63059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// case ThreeDimensional: 63159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// return GL_TEXTURE_3D; 63259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// case CubeMap: 63359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// return GL_TEXTURE_CUBE_MAP; 63459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 63559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unknown texture type: " + type); 63659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 63759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 63859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 63959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int convertMagFilter(Texture.MagFilter filter) { 64059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (filter) { 64159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Bilinear: 64259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_LINEAR; 64359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Nearest: 64459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_NEAREST; 64559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 64659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unknown mag filter: " + filter); 64759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 64859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 64959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 65059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int convertMinFilter(Texture.MinFilter filter) { 65159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (filter) { 65259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Trilinear: 65359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_LINEAR_MIPMAP_LINEAR; 65459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case BilinearNearestMipMap: 65559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_LINEAR_MIPMAP_NEAREST; 65659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case NearestLinearMipMap: 65759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_NEAREST_MIPMAP_LINEAR; 65859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case NearestNearestMipMap: 65959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_NEAREST_MIPMAP_NEAREST; 66059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case BilinearNoMipMaps: 66159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_LINEAR; 66259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case NearestNoMipMaps: 66359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_NEAREST; 66459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 66559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unknown min filter: " + filter); 66659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 66759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 66859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 66959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int convertWrapMode(Texture.WrapMode mode) { 67059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (mode) { 67159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case EdgeClamp: 67259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Clamp: 67359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case BorderClamp: 67459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_CLAMP; 67559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Repeat: 67659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_REPEAT; 67759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 67859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unknown wrap mode: " + mode); 67959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 68059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 68159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 68259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void setupTextureParams(Texture tex) { 68359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int target = convertTextureType(tex.getType()); 68459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 68559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // filter things 68659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int minFilter = convertMinFilter(tex.getMinFilter()); 68759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int magFilter = convertMagFilter(tex.getMagFilter()); 68859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glTexParameteri(target, GL_TEXTURE_MIN_FILTER, minFilter); 68959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glTexParameteri(target, GL_TEXTURE_MAG_FILTER, magFilter); 69059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 69159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // repeat modes 69259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (tex.getType()) { 69359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// case ThreeDimensional: 69459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// case CubeMap: 69559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// glTexParameteri(target, GL_TEXTURE_WRAP_R, convertWrapMode(tex.getWrap(WrapAxis.R))); 69659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case TwoDimensional: 69759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glTexParameteri(target, GL_TEXTURE_WRAP_T, convertWrapMode(tex.getWrap(WrapAxis.T))); 69859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // fall down here is intentional.. 69959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// case OneDimensional: 70059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glTexParameteri(target, GL_TEXTURE_WRAP_S, convertWrapMode(tex.getWrap(WrapAxis.S))); 70159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 70259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 70359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unknown texture type: " + tex.getType()); 70459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 70559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 70659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 70759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void updateTexImageData(Image img, Texture.Type type, boolean mips, int unit) { 70859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int texId = img.getId(); 70959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (texId == -1) { 71059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // create texture 71159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glGenTextures(ib1); 71259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta texId = ib1.get(0); 71359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta img.setId(texId); 71459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta objManager.registerForCleanup(img); 71559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 71659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta statistics.onNewTexture(); 71759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 71859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 71959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // bind texture 72059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int target = convertTextureType(type); 72159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (context.boundTextureUnit != unit) { 72259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// glActiveTexture(GL_TEXTURE0 + unit); 72359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// context.boundTextureUnit = unit; 72459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 72559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (context.boundTextures[unit] != img) { 72659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(target); 72759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glBindTexture(target, texId); 72859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.boundTextures[unit] = img; 72959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 73059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta statistics.onTextureUse(img, true); 73159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 73259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 73359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Check sizes if graphics card doesn't support NPOT 73459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!GLContext.getCapabilities().GL_ARB_texture_non_power_of_two) { 73559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (img.getWidth() != 0 && img.getHeight() != 0) { 73659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!FastMath.isPowerOfTwo(img.getWidth()) 73759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta || !FastMath.isPowerOfTwo(img.getHeight())) { 73859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 73959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Resize texture to Power-of-2 size 74059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta MipMapGenerator.resizeToPowerOf2(img); 74159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 74259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 74359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 74459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 74559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 74659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!img.hasMipmaps() && mips) { 74759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // No pregenerated mips available, 74859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // generate from base level if required 74959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 75059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Check if hardware mips are supported 75159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (GLContext.getCapabilities().OpenGL14) { 75259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glTexParameteri(target, GL14.GL_GENERATE_MIPMAP, GL_TRUE); 75359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 75459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta MipMapGenerator.generateMipMaps(img); 75559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 75659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 75759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 75859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 75959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /* 76059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (target == GL_TEXTURE_CUBE_MAP) { 76159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta List<ByteBuffer> data = img.getData(); 76259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (data.size() != 6) { 76359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.WARNING, "Invalid texture: {0}\n" 76459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta + "Cubemap textures must contain 6 data units.", img); 76559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 76659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 76759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < 6; i++) { 76859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta TextureUtil.uploadTexture(img, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, i, 0, tdc); 76959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 77059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (target == EXTTextureArray.GL_TEXTURE_2D_ARRAY_EXT) { 77159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta List<ByteBuffer> data = img.getData(); 77259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // -1 index specifies prepare data for 2D Array 77359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta TextureUtil.uploadTexture(img, target, -1, 0, tdc); 77459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < data.size(); i++) { 77559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // upload each slice of 2D array in turn 77659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // this time with the appropriate index 77759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta TextureUtil.uploadTexture(img, target, i, 0, tdc); 77859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 77959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else {*/ 78059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta TextureUtil.uploadTexture(img, target, 0, 0, false); 78159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //} 78259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 78359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta img.clearUpdateNeeded(); 78459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 78559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 78659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setTexture(int unit, Texture tex) { 78759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (unit != 0 || tex.getType() != Texture.Type.TwoDimensional) { 78859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //throw new UnsupportedOperationException(); 78959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 79059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 79159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 79259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Image image = tex.getImage(); 79359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (image.isUpdateNeeded()) { 79459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta updateTexImageData(image, tex.getType(), tex.getMinFilter().usesMipMapLevels(), unit); 79559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 79659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 79759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int texId = image.getId(); 79859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta assert texId != -1; 79959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 80059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Image[] textures = context.boundTextures; 80159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 80259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int type = convertTextureType(tex.getType()); 80359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (!context.textureIndexList.moveToNew(unit)) { 80459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (context.boundTextureUnit != unit){ 80559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// glActiveTexture(GL_TEXTURE0 + unit); 80659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// context.boundTextureUnit = unit; 80759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 80859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// glEnable(type); 80959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 81059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 81159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (context.boundTextureUnit != unit) { 81259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// glActiveTexture(GL_TEXTURE0 + unit); 81359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// context.boundTextureUnit = unit; 81459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 81559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 81659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (textures[unit] != image) { 81759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(type); 81859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glBindTexture(type, texId); 81959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta textures[unit] = image; 82059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 82159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta statistics.onTextureUse(image, true); 82259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 82359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta statistics.onTextureUse(image, false); 82459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 82559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 82659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setupTextureParams(tex); 82759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 82859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 82959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void clearTextureUnits() { 83059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Image[] textures = context.boundTextures; 83159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (textures[0] != null) { 83259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDisable(GL_TEXTURE_2D); 83359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta textures[0] = null; 83459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 83559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 83659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 83759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void deleteImage(Image image) { 83859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int texId = image.getId(); 83959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (texId != -1) { 84059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ib1.put(0, texId); 84159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ib1.position(0).limit(1); 84259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDeleteTextures(ib1); 84359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta image.resetObject(); 84459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 84559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 84659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 84759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int convertArrayType(VertexBuffer.Type type) { 84859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (type) { 84959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Position: 85059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_VERTEX_ARRAY; 85159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Normal: 85259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_NORMAL_ARRAY; 85359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case TexCoord: 85459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_TEXTURE_COORD_ARRAY; 85559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Color: 85659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_COLOR_ARRAY; 85759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 85859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return -1; // unsupported 85959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 86059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 86159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 86259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int convertVertexFormat(VertexBuffer.Format fmt) { 86359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (fmt) { 86459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Byte: 86559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_BYTE; 86659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Float: 86759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_FLOAT; 86859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Int: 86959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_INT; 87059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Short: 87159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_SHORT; 87259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case UnsignedByte: 87359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_UNSIGNED_BYTE; 87459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case UnsignedInt: 87559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_UNSIGNED_INT; 87659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case UnsignedShort: 87759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_UNSIGNED_SHORT; 87859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 87959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unrecognized vertex format: " + fmt); 88059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 88159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 88259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 88359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int convertElementMode(Mesh.Mode mode) { 88459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (mode) { 88559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Points: 88659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_POINTS; 88759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Lines: 88859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_LINES; 88959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case LineLoop: 89059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_LINE_LOOP; 89159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case LineStrip: 89259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_LINE_STRIP; 89359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Triangles: 89459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_TRIANGLES; 89559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case TriangleFan: 89659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_TRIANGLE_FAN; 89759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case TriangleStrip: 89859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL_TRIANGLE_STRIP; 89959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 90059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unrecognized mesh mode: " + mode); 90159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 90259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 90359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 90459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void drawTriangleArray(Mesh.Mode mode, int count, int vertCount) { 90559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (count > 1) { 90659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException(); 90759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 90859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 90959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDrawArrays(convertElementMode(mode), 0, vertCount); 91059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 91159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 91259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setVertexAttrib(VertexBuffer vb, VertexBuffer idb) { 91359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int arrayType = convertArrayType(vb.getBufferType()); 91459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (arrayType == -1) { 91559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; // unsupported 91659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 91759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnableClientState(arrayType); 91859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.boundAttribs[vb.getBufferType().ordinal()] = vb; 91959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 92059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (vb.getBufferType() == Type.Normal) { 92159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // normalize if requested 92259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (vb.isNormalized() && !context.normalizeEnabled) { 92359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glEnable(GL_NORMALIZE); 92459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.normalizeEnabled = true; 92559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (!vb.isNormalized() && context.normalizeEnabled) { 92659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDisable(GL_NORMALIZE); 92759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.normalizeEnabled = false; 92859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 92959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 93059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 93159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // NOTE: Use data from interleaved buffer if specified 93259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Buffer data = idb != null ? idb.getData() : vb.getData(); 93359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int comps = vb.getNumComponents(); 93459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int type = convertVertexFormat(vb.getFormat()); 93559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 93659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta data.rewind(); 93759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 93859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (vb.getBufferType()) { 93959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Position: 94059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!(data instanceof FloatBuffer)) { 94159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException(); 94259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 94359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 94459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glVertexPointer(comps, vb.getStride(), (FloatBuffer) data); 94559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 94659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Normal: 94759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!(data instanceof FloatBuffer)) { 94859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException(); 94959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 95059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 95159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glNormalPointer(vb.getStride(), (FloatBuffer) data); 95259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 95359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Color: 95459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (data instanceof FloatBuffer) { 95559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glColorPointer(comps, vb.getStride(), (FloatBuffer) data); 95659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (data instanceof ByteBuffer) { 95759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glColorPointer(comps, true, vb.getStride(), (ByteBuffer) data); 95859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 95959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException(); 96059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 96159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 96259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case TexCoord: 96359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!(data instanceof FloatBuffer)) { 96459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException(); 96559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 96659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 96759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glTexCoordPointer(comps, vb.getStride(), (FloatBuffer) data); 96859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 96959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 97059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Ignore, this is an unsupported attribute for OpenGL1. 97159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 97259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 97359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 97459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 97559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setVertexAttrib(VertexBuffer vb) { 97659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setVertexAttrib(vb, null); 97759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 97859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 97959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void drawElements(int mode, int format, Buffer data) { 98059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (format) { 98159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case GL_UNSIGNED_BYTE: 98259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDrawElements(mode, (ByteBuffer) data); 98359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 98459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case GL_UNSIGNED_SHORT: 98559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDrawElements(mode, (ShortBuffer) data); 98659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 98759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case GL_UNSIGNED_INT: 98859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDrawElements(mode, (IntBuffer) data); 98959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 99059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 99159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException(); 99259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 99359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 99459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 99559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void drawTriangleList(VertexBuffer indexBuf, Mesh mesh, int count) { 99659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Mesh.Mode mode = mesh.getMode(); 99759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 99859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Buffer indexData = indexBuf.getData(); 99959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta indexData.rewind(); 100059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 100159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (mesh.getMode() == Mode.Hybrid) { 100259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException(); 100359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /* 100459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int[] modeStart = mesh.getModeStart(); 100559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int[] elementLengths = mesh.getElementLengths(); 100659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 100759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int elMode = convertElementMode(Mode.Triangles); 100859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int fmt = convertVertexFormat(indexBuf.getFormat()); 100959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // int elSize = indexBuf.getFormat().getComponentSize(); 101059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // int listStart = modeStart[0]; 101159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int stripStart = modeStart[1]; 101259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int fanStart = modeStart[2]; 101359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int curOffset = 0; 101459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < elementLengths.length; i++) { 101559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (i == stripStart) { 101659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta elMode = convertElementMode(Mode.TriangleStrip); 101759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (i == fanStart) { 101859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta elMode = convertElementMode(Mode.TriangleStrip); 101959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 102059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int elementLength = elementLengths[i]; 102159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta indexData.position(curOffset); 102259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 102359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta drawElements(elMode, 102459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fmt, 102559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta indexData); 102659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 102759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta curOffset += elementLength; 102859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }*/ 102959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 103059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta drawElements(convertElementMode(mode), 103159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta convertVertexFormat(indexBuf.getFormat()), 103259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta indexData); 103359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 103459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 103559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 103659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void clearVertexAttribs() { 103759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < 16; i++) { 103859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta VertexBuffer vb = context.boundAttribs[i]; 103959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (vb != null) { 104059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int arrayType = convertArrayType(vb.getBufferType()); 104159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDisableClientState(arrayType); 104259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.boundAttribs[vb.getBufferType().ordinal()] = null; 104359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 104459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 104559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 104659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 104759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void renderMeshDefault(Mesh mesh, int lod, int count) { 104859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta VertexBuffer indices = null; 104959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 105059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta VertexBuffer interleavedData = mesh.getBuffer(Type.InterleavedData); 105159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (interleavedData != null && interleavedData.isUpdateNeeded()) { 105259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta updateBufferData(interleavedData); 105359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 105459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 105559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta IntMap<VertexBuffer> buffers = mesh.getBuffers(); 105659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (mesh.getNumLodLevels() > 0) { 105759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta indices = mesh.getLodLevel(lod); 105859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 105959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta indices = buffers.get(Type.Index.ordinal()); 106059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 106159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (Entry<VertexBuffer> entry : buffers) { 106259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta VertexBuffer vb = entry.getValue(); 106359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 106459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (vb.getBufferType() == Type.InterleavedData 106559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta || vb.getUsage() == Usage.CpuOnly // ignore cpu-only buffers 106659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta || vb.getBufferType() == Type.Index) { 106759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta continue; 106859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 106959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 107059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (vb.getStride() == 0) { 107159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // not interleaved 107259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setVertexAttrib(vb); 107359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 107459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // interleaved 107559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setVertexAttrib(vb, interleavedData); 107659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 107759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 107859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 107959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (indices != null) { 108059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta drawTriangleList(indices, mesh, count); 108159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 108259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glDrawArrays(convertElementMode(mesh.getMode()), 0, mesh.getVertexCount()); 108359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 108459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 108559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // TODO: Fix these to use IDList?? 108659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta clearVertexAttribs(); 108759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta clearTextureUnits(); 108859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta resetFixedFuncBindings(); 108959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 109059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 109159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void renderMesh(Mesh mesh, int lod, int count) { 109259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (mesh.getVertexCount() == 0) { 109359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 109459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 109559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 109659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (context.pointSize != mesh.getPointSize()) { 109759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glPointSize(mesh.getPointSize()); 109859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.pointSize = mesh.getPointSize(); 109959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 110059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (context.lineWidth != mesh.getLineWidth()) { 110159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta glLineWidth(mesh.getLineWidth()); 110259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta context.lineWidth = mesh.getLineWidth(); 110359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 110459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 110559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean dynamic = false; 110659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (mesh.getBuffer(Type.InterleavedData) != null) { 110759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Interleaved meshes are not supported"); 110859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 110959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 111059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (mesh.getNumLodLevels() == 0) { 111159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta IntMap<VertexBuffer> bufs = mesh.getBuffers(); 111259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (Entry<VertexBuffer> entry : bufs) { 111359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (entry.getValue().getUsage() != VertexBuffer.Usage.Static) { 111459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dynamic = true; 111559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 111659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 111759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 111859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 111959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dynamic = true; 112059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 112159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 112259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta statistics.onMeshDrawn(mesh, lod); 112359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 112459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (!dynamic) { 112559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // dealing with a static object, generate display list 112659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// renderMeshDisplayList(mesh); 112759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } else { 112859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta renderMeshDefault(mesh, lod, count); 112959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 113059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 113159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 113259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 113359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 113459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setAlphaToCoverage(boolean value) { 113559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 113659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 113759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setShader(Shader shader) { 113859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 113959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 114059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void deleteShader(Shader shader) { 114159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 114259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 114359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void deleteShaderSource(ShaderSource source) { 114459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 114559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 114659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void copyFrameBuffer(FrameBuffer src, FrameBuffer dst) { 114759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 114859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 114959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void copyFrameBuffer(FrameBuffer src, FrameBuffer dst, boolean copyDepth) { 115059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 115159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 115259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setMainFrameBufferOverride(FrameBuffer fb){ 115359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 115459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 115559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setFrameBuffer(FrameBuffer fb) { 115659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 115759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 115859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void readFrameBuffer(FrameBuffer fb, ByteBuffer byteBuf) { 115959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 116059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 116159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void deleteFrameBuffer(FrameBuffer fb) { 116259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 116359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 116459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void updateBufferData(VertexBuffer vb) { 116559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 116659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 116759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void deleteBuffer(VertexBuffer vb) { 116859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 116959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 1170