OSDN Git Service

+ fog moved to Lights class ( fog is active if fog's alpha is bigger than 0 )
authorblackbluegl <info@blackbluegl.de>
Fri, 31 May 2013 09:09:31 +0000 (11:09 +0200)
committerblackbluegl <info@blackbluegl.de>
Fri, 31 May 2013 09:09:31 +0000 (11:09 +0200)
gdx/src/com/badlogic/gdx/graphics/g3d/lights/Lights.java
gdx/src/com/badlogic/gdx/graphics/g3d/materials/ColorAttribute.java
gdx/src/com/badlogic/gdx/graphics/g3d/materials/FloatAttribute.java
gdx/src/com/badlogic/gdx/graphics/g3d/shaders/BaseShader.java
gdx/src/com/badlogic/gdx/graphics/g3d/shaders/DefaultShader.java
gdx/src/com/badlogic/gdx/graphics/g3d/shaders/default.fragment.glsl
gdx/src/com/badlogic/gdx/graphics/g3d/shaders/default.vertex.glsl
gdx/src/com/badlogic/gdx/graphics/g3d/utils/DefaultShaderProvider.java

index 15c5baf..231a9b3 100644 (file)
@@ -1,12 +1,12 @@
 package com.badlogic.gdx.graphics.g3d.lights;
 
 import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.math.Vector3;
 import com.badlogic.gdx.utils.Array;
 import com.badlogic.gdx.utils.GdxRuntimeException;
 
 public class Lights {
        public final Color ambientLight = new Color(0,0,0,1);
+    public final Color fog = new Color(0,0,0,0);
        public final Array<DirectionalLight> directionalLights = new Array<DirectionalLight>();
        public final Array<PointLight> pointLights = new Array<PointLight>();
        
@@ -27,6 +27,7 @@ public class Lights {
        
        public Lights clear() {
                ambientLight.set(0,0,0,1);
+        fog.set(0,0,0,0);
                directionalLights.clear();
                pointLights.clear();
                return this;
index 96726a8..e77a12d 100644 (file)
@@ -9,14 +9,12 @@ public class ColorAttribute extends Material.Attribute {
        public final static long Diffuse = register(DiffuseAlias);
        public final static String SpecularAlias = "specularColor";
        public final static long Specular = register(SpecularAlias);
-    public final static String FogAlias = "fogColor";
-    public final static long Fog = register(FogAlias);
        public final static String AmbientAlias = "ambientColor";
        public static final long Ambient = register("ambientColor");
        public final static String EmissiveAlias = "emissiveColor";
        public static final long Emissive = register("emissiveColor");
        
-       protected static long Mask = Ambient | Diffuse | Specular | Emissive | Fog;
+       protected static long Mask = Ambient | Diffuse | Specular | Emissive;
        
        public final static boolean is(final long mask) {
                return (mask & Mask) != 0;
@@ -37,14 +35,6 @@ public class ColorAttribute extends Material.Attribute {
        public final static ColorAttribute createSpecular(float r, float g, float b, float a) {
                return new ColorAttribute(Specular, r, g, b, a);
        }
-
-    public final static ColorAttribute createFog(float r, float g, float b) {
-        return new ColorAttribute(Fog, r, g, b, 1.0f);
-    }
-
-    public final static ColorAttribute createFog(final Color color) {
-        return new ColorAttribute(Fog, color);
-    }
        
        public final Color color = new Color();
        
index c7dabab..4995de7 100644 (file)
@@ -17,13 +17,6 @@ public class FloatAttribute extends Material.Attribute {
                return new FloatAttribute(AlphaTest, value);
        }
 
-    public static final String FogDistanceAlias = "fodDistance";
-    public static final long FogDistance = register(FogDistanceAlias);
-
-    public static FloatAttribute createFogDistance(float value) {
-        return new FloatAttribute(FogDistance, value);
-    }
-
     public float value;
        
        public FloatAttribute(long type) {
index e66bea2..465bf87 100644 (file)
@@ -1,13 +1,7 @@
 package com.badlogic.gdx.graphics.g3d.shaders;
 
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.graphics.Camera;
 import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.VertexAttributes;
-import com.badlogic.gdx.graphics.g3d.Renderable;
 import com.badlogic.gdx.graphics.g3d.Shader;
-import com.badlogic.gdx.graphics.g3d.materials.Material;
-import com.badlogic.gdx.graphics.g3d.utils.RenderContext;
 import com.badlogic.gdx.graphics.glutils.ShaderProgram;
 import com.badlogic.gdx.math.Matrix3;
 import com.badlogic.gdx.math.Matrix4;
@@ -121,6 +115,13 @@ public abstract class BaseShader implements Shader {
                program.setUniformf(uniformLocations[what], value);
                return true;
        }
+
+    protected boolean set(int what, final float v1, final float v2, final float v3, final float v4) {
+        if (uniformLocations[what] < 0)
+            return false;
+        program.setUniformf(uniformLocations[what], v1, v2, v3, v4);
+        return true;
+    }
        
        protected boolean set(int what, final Color value) {
                if (uniformLocations[what] < 0)
index b845639..2c5e3f9 100644 (file)
@@ -74,18 +74,17 @@ public class DefaultShader extends BaseShader {
        protected final int u_specularTexture                   = registerUniform("u_specularTexture", TextureAttribute.Specular);
        protected final int u_normalTexture                             = registerUniform("u_normalTexture", TextureAttribute.Normal);
        protected final int u_alphaTest                                 = registerUniform("u_alphaTest", FloatAttribute.AlphaTest);
-    protected final int u_fogDistance                          = registerUniform("u_fogDistance", FloatAttribute.FogDistance);
-    protected final int u_fogColor                                 = registerUniform("u_fogColor", ColorAttribute.Fog);
        // Lighting uniforms
        protected final int u_ambientLight                              = registerUniform("u_ambientLight");
        protected final int u_ambientCubemap                    = registerUniform("u_ambientCubemap");
        protected final int u_dirLights0color                   = registerUniform("u_dirLights[0].color");
        protected final int u_dirLights0direction               = registerUniform("u_dirLights[0].direction");
        protected final int u_dirLights1color                   = registerUniform("u_dirLights[1].color");
-       protected final int u_pointLights0color         = registerUniform("u_pointLights[0].color");
-       protected final int u_pointLights0position      = registerUniform("u_pointLights[0].position");
-       protected final int u_pointLights0intensity     = registerUniform("u_pointLights[0].intensity");
-       protected final int u_pointLights1color         = registerUniform("u_pointLights[1].color");
+       protected final int u_pointLights0color             = registerUniform("u_pointLights[0].color");
+       protected final int u_pointLights0position          = registerUniform("u_pointLights[0].position");
+       protected final int u_pointLights0intensity         = registerUniform("u_pointLights[0].intensity");
+       protected final int u_pointLights1color             = registerUniform("u_pointLights[1].color");
+    protected final int u_fogColor                                 = registerUniform("u_fogColor");
        // FIXME Cache vertex attribute locations...
        
        protected int dirLightsLoc;
@@ -111,20 +110,20 @@ public class DefaultShader extends BaseShader {
        
        protected final ShaderProgram program;
        
-       public DefaultShader(final Material material, final VertexAttributes attributes, boolean lighting, int numDirectional, int numPoint, int numSpot, int numBones) {
-               this(getDefaultVertexShader(), getDefaultFragmentShader(), material, attributes, lighting, numDirectional, numPoint, numSpot, numBones);
+       public DefaultShader(final Material material, final VertexAttributes attributes, boolean lighting, boolean fog, int numDirectional, int numPoint, int numSpot, int numBones) {
+               this(getDefaultVertexShader(), getDefaultFragmentShader(), material, attributes, lighting, fog, numDirectional, numPoint, numSpot, numBones);
        }
        
-       public DefaultShader(final long mask, final long attributes, boolean lighting, int numDirectional, int numPoint, int numSpot, int numBones) {
-               this(getDefaultVertexShader(), getDefaultFragmentShader(), mask, attributes, lighting, numDirectional, numPoint, numSpot, numBones);
+       public DefaultShader(final long mask, final long attributes, boolean lighting, boolean fog, int numDirectional, int numPoint, int numSpot, int numBones) {
+               this(getDefaultVertexShader(), getDefaultFragmentShader(), mask, attributes, lighting, fog, numDirectional, numPoint, numSpot, numBones);
        }
 
-       public DefaultShader(final String vertexShader, final String fragmentShader, final Material material, final VertexAttributes attributes, boolean lighting, int numDirectional, int numPoint, int numSpot, int numBones) {
-               this(vertexShader, fragmentShader, material.getMask(), getAttributesMask(attributes), lighting, numDirectional, numPoint, numSpot, numBones);
+       public DefaultShader(final String vertexShader, final String fragmentShader, final Material material, final VertexAttributes attributes, boolean lighting, boolean fog, int numDirectional, int numPoint, int numSpot, int numBones) {
+               this(vertexShader, fragmentShader, material.getMask(), getAttributesMask(attributes), lighting, fog, numDirectional, numPoint, numSpot, numBones);
        }
 
-       public DefaultShader(final String vertexShader, final String fragmentShader, final long mask, final long attributes, boolean lighting, int numDirectional, int numPoint, int numSpot, int numBones) {
-               final String prefix = createPrefix(mask, attributes, lighting, numDirectional, numPoint, numSpot, numBones);
+       public DefaultShader(final String vertexShader, final String fragmentShader, final long mask, final long attributes, boolean lighting, boolean fog, int numDirectional, int numPoint, int numSpot, int numBones) {
+               final String prefix = createPrefix(mask, attributes, lighting, fog, numDirectional, numPoint, numSpot, numBones);
                program = new ShaderProgram(prefix + vertexShader, prefix + fragmentShader);
                if(!program.isCompiled()) {
                        throw new GdxRuntimeException("Couldn't compile shader " + program.getLog());
@@ -145,16 +144,16 @@ public class DefaultShader extends BaseShader {
                if (!ignoreUnimplemented && (implementedFlags & mask) != mask)
                        throw new GdxRuntimeException("Some attributes not implemented yet ("+mask+")");
                
-               dirLightsLoc                                    = loc(u_dirLights0color);
-               dirLightsColorOffset                    = loc(u_dirLights0color) - dirLightsLoc;
+               dirLightsLoc                            = loc(u_dirLights0color);
+               dirLightsColorOffset            = loc(u_dirLights0color) - dirLightsLoc;
                dirLightsDirectionOffset        = loc(u_dirLights0direction) - dirLightsLoc;
-               dirLightsSize                                   = loc(u_dirLights1color) - dirLightsLoc;
+               dirLightsSize                           = loc(u_dirLights1color) - dirLightsLoc;
                
                pointLightsLoc                          = loc(u_pointLights0color);
                pointLightsColorOffset          = loc(u_pointLights0color) - pointLightsLoc;
                pointLightsPositionOffset       = loc(u_pointLights0position) - pointLightsLoc;
-               pointLightsIntensityOffset = loc(u_pointLights0intensity) - pointLightsLoc;
-               pointLightsSize                                 = loc(u_pointLights1color)- pointLightsLoc;
+               pointLightsIntensityOffset  = loc(u_pointLights0intensity) - pointLightsLoc;
+               pointLightsSize                         = loc(u_pointLights1color)- pointLightsLoc;
        }
        
        protected final static long tangentAttribute = Usage.Generic << 1;
@@ -177,7 +176,7 @@ public class DefaultShader extends BaseShader {
                return result;
        }
        
-       private String createPrefix(final long mask, final long attributes, boolean lighting, int numDirectional, int numPoint, int numSpot, int numBones) {
+       private String createPrefix(final long mask, final long attributes, boolean lighting, boolean fog, int numDirectional, int numPoint, int numSpot, int numBones) {
                String prefix = "";
                if (((attributes & Usage.Color) == Usage.Color) || ((attributes & Usage.ColorPacked) == Usage.ColorPacked))
                        prefix += "#define colorFlag\n";
@@ -188,6 +187,10 @@ public class DefaultShader extends BaseShader {
                                prefix += "#define ambientCubemapFlag\n";
                                prefix += "#define numDirectionalLights "+numDirectional+"\n";
                                prefix += "#define numPointLights "+numPoint+"\n";
+
+                if (fog) {
+                    prefix += "#define fogFlag\n";
+                }
                        }
                }
                for (int i = 0; i < blendAttributes.length; i++) {
@@ -209,8 +212,6 @@ public class DefaultShader extends BaseShader {
                        prefix += "#define "+ColorAttribute.DiffuseAlias+"Flag\n";
                if ((mask & ColorAttribute.Specular) == ColorAttribute.Specular)
                        prefix += "#define "+ColorAttribute.SpecularAlias+"Flag\n";
-        if ((mask & ColorAttribute.Fog) == ColorAttribute.Fog)
-            prefix += "#define "+ColorAttribute.FogAlias+"Flag\n";
                if ((mask & FloatAttribute.Shininess) == FloatAttribute.Shininess)
                        prefix += "#define "+FloatAttribute.ShininessAlias+"Flag\n";
                if ((mask & FloatAttribute.AlphaTest) == FloatAttribute.AlphaTest)
@@ -264,7 +265,7 @@ public class DefaultShader extends BaseShader {
                        context.setDepthTest(true, defaultDepthFunc);
                
                set(u_projTrans, camera.combined);
-               set(u_cameraPosition, camera.position);
+               set(u_cameraPosition, camera.position.x, camera.position.y, camera.position.z, camera.far);
                set(u_cameraDirection, camera.direction);
                set(u_cameraUp, camera.up);
                
@@ -334,8 +335,6 @@ public class DefaultShader extends BaseShader {
                                        set(u_diffuseColor, col.color);
                                else if ((t & ColorAttribute.Specular) == ColorAttribute.Specular)
                                        set(u_specularColor, col.color);
-                else if ((t & ColorAttribute.Fog) == ColorAttribute.Fog)
-                    set(u_fogColor, col.color);
                        }
                        else if (TextureAttribute.is(t)) {
                                final TextureAttribute tex = (TextureAttribute)attr;
@@ -351,8 +350,6 @@ public class DefaultShader extends BaseShader {
                                cullFace = ((IntAttribute)attr).value;
                        else if ((t & FloatAttribute.AlphaTest) == FloatAttribute.AlphaTest)
                                set(u_alphaTest, ((FloatAttribute)attr).value);
-            else if ((t & FloatAttribute.FogDistance) == FloatAttribute.FogDistance)
-                set(u_fogDistance, ((FloatAttribute)attr).value);
             else if(!ignoreUnimplemented)
                                        throw new GdxRuntimeException("Unknown material attribute: "+attr.toString());
                }
@@ -422,6 +419,10 @@ public class DefaultShader extends BaseShader {
                                        program.setUniformf(idx+pointLightsIntensityOffset, pointLights[i].intensity);
                        }
                }
+
+        if (lights.fog.a > 0) {
+            program.setUniformf(loc(u_fogColor), lights.fog);
+        }
        }
 
        @Override
index aa6726a..b7ce6a3 100644 (file)
@@ -60,10 +60,10 @@ varying vec3 v_lightSpecular;
 #endif //specularFlag
 #endif //lightingFlag
 
-#ifdef fogColorFlag
+#ifdef fogFlag
 uniform vec4 u_fogColor;
 varying float v_fog;
-#endif // fogColorFlag
+#endif // fogFlag
 
 void main() {
        #if defined(normalFlag) 
@@ -106,9 +106,9 @@ void main() {
                gl_FragColor.rgb = (diffuse.rgb * v_lightDiffuse) + specular;
        #endif //lightingFlag
 
-       #ifdef fogColorFlag
+       #ifdef fogFlag
        gl_FragColor.rgb = mix(gl_FragColor.rgb, u_fogColor.rgb, v_fog);
-    #endif // end fogColorFlag
+    #endif // end fogFlag
 
        #ifdef blendedFlag
                gl_FragColor.a = diffuse.a * v_opacity;
index fd3a271..ef8d3c4 100644 (file)
@@ -6,7 +6,7 @@
 #define specularFlag
 #endif
 
-#if defined(specularFlag) || defined(fogColorFlag)
+#if defined(specularFlag) || defined(fogFlag)
 #define cameraPositionFlag
 #endif
 
@@ -133,17 +133,12 @@ varying vec3 v_lightSpecular;
 #endif // specularFlag
 
 #ifdef cameraPositionFlag
-uniform vec3 u_cameraPosition;
+uniform vec4 u_cameraPosition;
 #endif // cameraPositionFlag
 
-#ifdef fogColorFlag
+#ifdef fogFlag
 varying float v_fog;
-#ifdef fogDistanceFlag
-uniform float u_fogDistance;
-#else
-const float u_fogDistance = 0.02;
-#endif // fogDistanceFlag
-#endif // fogColorFlag
+#endif // fogFlag
 
 
 #if defined(numDirectionalLights) && (numDirectionalLights > 0)
@@ -226,8 +221,8 @@ void main() {
                v_normal = normal;
        #endif // normalFlag
 
-    #ifdef fogColorFlag
-        float fog  = length(u_cameraPosition.xyz - pos.xyz) * u_fogDistance;
+    #ifdef fogFlag
+        float fog  = length(u_cameraPosition.xyz - pos.xyz) * (1.0 / u_cameraPosition.w);
               fog *= fog;
         v_fog = min(fog, 1.0);
     #endif
@@ -261,7 +256,7 @@ void main() {
                        
                #ifdef specularFlag
                        v_lightSpecular = vec3(0.0);
-                       vec3 viewVec = normalize(u_cameraPosition - pos.xyz);
+                       vec3 viewVec = normalize(u_cameraPosition.xyz - pos.xyz);
                #endif // specularFlag
                        
                #if defined(numDirectionalLights) && (numDirectionalLights > 0) && defined(normalFlag)
index 9df308f..b2ab1ff 100644 (file)
@@ -4,10 +4,8 @@ import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.files.FileHandle;
 import com.badlogic.gdx.graphics.g3d.Renderable;
 import com.badlogic.gdx.graphics.g3d.Shader;
-import com.badlogic.gdx.graphics.g3d.materials.Material;
-import com.badlogic.gdx.graphics.g3d.shaders.GLES10Shader;
 import com.badlogic.gdx.graphics.g3d.shaders.DefaultShader;
-import com.badlogic.gdx.utils.Array;
+import com.badlogic.gdx.graphics.g3d.shaders.GLES10Shader;
 
 public class DefaultShaderProvider extends BaseShaderProvider {
        public String vertexShader;
@@ -29,8 +27,9 @@ public class DefaultShaderProvider extends BaseShaderProvider {
        @Override
        protected Shader createShader(final Renderable renderable) {
                Gdx.app.log("DefaultShaderProvider", "Creating new shader");
-               if (Gdx.graphics.isGL20Available())
-                       return new DefaultShader(vertexShader, fragmentShader, renderable.material, renderable.mesh.getVertexAttributes(), renderable.lights != null, 2, 5, 3, renderable.bones == null ? 0 : 12);
+               if (Gdx.graphics.isGL20Available()) {
+            return new DefaultShader(vertexShader, fragmentShader, renderable.material, renderable.mesh.getVertexAttributes(), renderable.lights != null, renderable.lights != null && renderable.lights.fog.a > 0, 2, 5, 3, renderable.bones == null ? 0 : 12);
+        }
                return new GLES10Shader();
        }
 }