OSDN Git Service

Remove static TestShader.lightsCount
authorXoppa <contact@xoppa.nl>
Mon, 1 Apr 2013 21:03:38 +0000 (23:03 +0200)
committerXoppa <contact@xoppa.nl>
Mon, 1 Apr 2013 21:03:38 +0000 (23:03 +0200)
demos/invaders/gdx-invaders/src/com/badlogic/gdxinvaders/Renderer.java
gdx/src/com/badlogic/gdx/graphics/g3d/test/GLES10Shader.java
gdx/src/com/badlogic/gdx/graphics/g3d/test/TestShader.java
gdx/src/com/badlogic/gdx/graphics/g3d/utils/DefaultShaderProvider.java
tests/gdx-tests/src/com/badlogic/gdx/tests/CullTest.java
tests/gdx-tests/src/com/badlogic/gdx/tests/EdgeDetectionTest.java
tests/gdx-tests/src/com/badlogic/gdx/tests/bullet/BaseBulletTest.java

index 779363d..8dfdd16 100644 (file)
@@ -79,7 +79,6 @@ public class Renderer {
                        spriteBatch = new SpriteBatch();\r
                        modelBatch = new ModelBatch();\r
                        TestShader.ignoreUnimplemented = true;\r
-                       TestShader.lightsCount = 0;\r
 \r
                        backgroundTexture = new Texture(Gdx.files.internal("data/planet.jpg"), Format.RGB565, true);\r
                        backgroundTexture.setFilter(TextureFilter.MipMap, TextureFilter.Linear);\r
index 7c04850..24c6fe9 100644 (file)
@@ -27,7 +27,7 @@ public class GLES10Shader implements Shader{
        private Material currentMaterial;
        private Texture currentTexture0;
        private Mesh currentMesh;
-       private Light lights[] = new Light[lightsCount];
+       private final Light lights[] = new Light[lightsCount];
        
        public GLES10Shader() {
                if (Gdx.gl10 == null)
@@ -131,9 +131,14 @@ public class GLES10Shader implements Shader{
                        Gdx.gl10.glPushMatrix();
                        Gdx.gl10.glLoadMatrixf(currentTransform.val, 0);
                }
-               for (int i = 0; i < lightsCount; i++) {
-                       final Light light = (renderable.lights == null || renderable.lights.length <= i) ? null : renderable.lights[i];
-                       bindLight(i, light);
+               if (renderable.lights == null)
+                       Gdx.gl10.glDisable(GL10.GL_LIGHTING);
+               else {
+                       Gdx.gl10.glEnable(GL10.GL_LIGHTING);
+                       for (int i = 0; i < lightsCount; i++) {
+                               final Light light = renderable.lights.length > i ? renderable.lights[i] : null;
+                               bindLight(i, light);
+                       }
                }
                if (currentMesh != renderable.mesh) {
                        if (currentMesh != null)
index c03ec4d..478ffbd 100644 (file)
@@ -44,41 +44,42 @@ public class TestShader implements Shader {
        protected int normalTransLoc;
        protected int diffuseTextureLoc;
        protected int diffuseColorLoc;
-       public static int lightsCount = 5;
        protected int lightsLoc;
        protected int lightSize;
        protected int lightPositionOffset;
        protected int lightPowerOffset;
        
-       private Light[] currentLights = new Light[lightsCount];
+       private final Light[] currentLights;
        
        protected RenderContext context;
        protected long mask;
        
-       public TestShader(final Material material) {
-               this(getDefaultVertexShader(), getDefaultFragmentShader(), material);
+       public TestShader(final Material material, int maxLightsCount) {
+               this(getDefaultVertexShader(), getDefaultFragmentShader(), material, maxLightsCount);
        }
        
-       public TestShader(final long mask) {
-               this(getDefaultVertexShader(), getDefaultFragmentShader(), mask);
+       public TestShader(final long mask, int maxLightsCount) {
+               this(getDefaultVertexShader(), getDefaultFragmentShader(), mask, maxLightsCount);
        }
 
-       public TestShader(final String vertexShader, final String fragmentShader, final Material material) {
-               this(vertexShader, fragmentShader, material.getMask());
+       public TestShader(final String vertexShader, final String fragmentShader, final Material material, int maxLightsCount) {
+               this(vertexShader, fragmentShader, material.getMask(), maxLightsCount);
        }
        
-       public TestShader(final String vertexShader, final String fragmentShader, final long mask) {
+       public TestShader(final String vertexShader, final String fragmentShader, final long mask, int maxLightsCount) {
                if (!Gdx.graphics.isGL20Available())
                        throw new GdxRuntimeException("This shader requires OpenGL ES 2.0");
                
+               currentLights = maxLightsCount > 0 ? new Light[maxLightsCount] : null;
+               
                String prefix = "";
                this.mask = mask;
                
                if (!ignoreUnimplemented && (implementedFlags & mask) != mask)
                        throw new GdxRuntimeException("Some attributes not implemented yet ("+mask+")");
                
-               if (lightsCount > 0)
-                       prefix += "#define lightsCount "+lightsCount+"\n";
+               if (maxLightsCount > 0)
+                       prefix += "#define lightsCount "+maxLightsCount+"\n";
                if ((mask & BlendingAttribute.Type) == BlendingAttribute.Type)
                        prefix += "#define "+BlendingAttribute.Alias+"Flag\n";
                if ((mask & TextureAttribute.Diffuse) == TextureAttribute.Diffuse)
@@ -95,15 +96,15 @@ public class TestShader implements Shader {
                normalTransLoc = program.getUniformLocation(NORMAL_TRANSFORM);
                diffuseTextureLoc = ((mask & TextureAttribute.Diffuse) != TextureAttribute.Diffuse) ? -1 : program.getUniformLocation(TextureAttribute.DiffuseAlias);
                diffuseColorLoc = ((mask & ColorAttribute.Diffuse) != ColorAttribute.Diffuse) ? -1 : program.getUniformLocation(ColorAttribute.DiffuseAlias);
-               lightsLoc = lightsCount > 0 ? program.getUniformLocation("lights[0].color") : -1;
-               lightSize = (lightsLoc >= 0 && lightsCount > 1) ? (program.getUniformLocation("lights[1].color") - lightsLoc) : -1;
+               lightsLoc = maxLightsCount > 0 ? program.getUniformLocation("lights[0].color") : -1;
+               lightSize = (lightsLoc >= 0 && maxLightsCount > 1) ? (program.getUniformLocation("lights[1].color") - lightsLoc) : -1;
                lightPositionOffset = lightsLoc >= 0 ? program.getUniformLocation("lights[0].position") - lightsLoc : -1;
                lightPowerOffset = lightsLoc >= 0 ? program.getUniformLocation("lights[0].power") - lightsLoc : -1;
        }
        
        @Override
        public boolean canRender(final Renderable renderable) {
-               return mask == renderable.material.getMask();
+               return mask == renderable.material.getMask() && (renderable.lights == null) == (currentLights == null);
        }
        
        /*@Override
@@ -138,8 +139,9 @@ public class TestShader implements Shader {
                program.begin();
                context.setDepthTest(true, GL10.GL_LEQUAL);
                program.setUniformMatrix(projTransLoc, camera.combined);
-               for (int i = 0; i < currentLights.length; i++)
-                       currentLights[i] = null;
+               if (currentLights != null)
+                       for (int i = 0; i < currentLights.length; i++)
+                               currentLights[i] = null;
        }
 
        @Override
@@ -173,7 +175,6 @@ public class TestShader implements Shader {
                program.end();
        }
        
-       /////// bindMaterial /////////
        Material currentMaterial;
        private final void bindMaterial(final Renderable renderable) {
                if (currentMaterial == renderable.material)
@@ -203,7 +204,6 @@ public class TestShader implements Shader {
                }
        }
 
-       /////// bindTextureAttribute /////////
        TextureAttribute currentTextureAttribute;
        private final void bindTextureAttribute(final int uniform, final TextureAttribute attribute) {
                final int unit = context.textureBinder.bind(attribute.textureDescription);
@@ -212,7 +212,7 @@ public class TestShader implements Shader {
        }
         
        private final void bindLights(final Renderable renderable) {
-               for (int i = 0; i < lightsCount; i++) {
+               for (int i = 0; i < currentLights.length; i++) {
                        final int loc = lightsLoc + i * lightSize;
                        if (renderable.lights.length <= i) {
                                if (currentLights[i] != null) {
index 5e50a26..93607f9 100644 (file)
@@ -8,12 +8,14 @@ import com.badlogic.gdx.graphics.g3d.test.GLES10Shader;
 import com.badlogic.gdx.graphics.g3d.test.TestShader;
 import com.badlogic.gdx.utils.Array;
 
-public class DefaultShaderProvider extends BaseShaderProvider {        
+public class DefaultShaderProvider extends BaseShaderProvider {
+       public int maxLightsCount = 5;
+       
        @Override
        protected Shader createShader(final Renderable renderable) {
                Gdx.app.log("DefaultShaderProvider", "Creating new shader");
                if (Gdx.graphics.isGL20Available())
-                       return new TestShader(renderable.material);
+                       return new TestShader(renderable.material, renderable.lights == null ? 0 : maxLightsCount);
                return new GLES10Shader();
        }
 }
index 8545b7f..561a1ce 100644 (file)
@@ -59,7 +59,6 @@ public class CullTest extends GdxTest implements ApplicationListener {
 \r
        @Override\r
        public void create () {\r
-               TestShader.lightsCount = 0;\r
                ModelBuilder builder = new ModelBuilder();\r
                sphere = builder.createSphere(2f, 2f, 2f, 16, 16, new Material(new ColorAttribute(ColorAttribute.Diffuse, Color.WHITE)), new VertexAttributes(new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE), new VertexAttribute(Usage.Normal, 3, ShaderProgram.NORMAL_ATTRIBUTE)));\r
                // cam = new PerspectiveCamera(45, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());\r
index 70d425e..50d80b4 100644 (file)
@@ -72,7 +72,6 @@ public class EdgeDetectionTest extends GdxTest {
                        Gdx.app.log("EdgeDetectionTest", "couldn't compile post-processing shader: " + batchShader.getLog());\r
                }\r
 \r
-               TestShader.lightsCount = 0;\r
                TestShader.ignoreUnimplemented = true;\r
                ObjLoader objLoader = new ObjLoader();\r
                scene = objLoader.loadObj(Gdx.files.internal("data/scene.obj"));\r
index 40be8ad..919cfd1 100644 (file)
@@ -92,7 +92,6 @@ public class BaseBulletTest extends BulletTest {
                init();
                modelBatch = new ModelBatch();
                TestShader.ignoreUnimplemented = true;
-               TestShader.lightsCount = 5;
                
                world = createWorld();
                world.performanceCounter = performanceCounter;