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