OSDN Git Service

Shiny shader. Disabled by default. Right click on the scene window and enable it...
authorLatif Khalifa <latifer@streamgrid.net>
Mon, 8 Aug 2011 05:54:26 +0000 (05:54 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Mon, 8 Aug 2011 05:54:26 +0000 (05:54 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@1083 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Rendering/Rendering.cs
Radegast/GUI/Rendering/Shader.cs
Radegast/GUI/Rendering/Water.cs
Radegast/Radegast.csproj
Radegast/shader_data/shiny.frag [new file with mode: 0644]
Radegast/shader_data/shiny.vert [new file with mode: 0644]

index a58091c..3ff304c 100644 (file)
@@ -162,6 +162,7 @@ namespace Radegast.Rendering
         OpenTK.Vector4 specularColor;\r
         float drawDistance = 48f;\r
         float drawDistanceSquared = 48f * 48f;\r
+        bool enableShiny;\r
 \r
         GridClient Client;\r
         RadegastInstance Instance;\r
@@ -199,6 +200,7 @@ namespace Radegast.Rendering
 \r
             chatOverlay = new ChatOverlay(instance, this);\r
             cbChatType.SelectedIndex = 1;\r
+            enableShiny = Instance.GlobalSettings["scene_viewer_shiny"];\r
 \r
             tbDrawDistance.Value = (int)DrawDistance;\r
             lblDrawDistance.Text = string.Format("Draw distance: {0}", tbDrawDistance.Value);\r
@@ -649,6 +651,7 @@ namespace Radegast.Rendering
                 TextureThreadContextReady.WaitOne(1000, false);\r
                 glControl.MakeCurrent();\r
                 InitWater();\r
+                InitShaders();\r
                 RenderingEnabled = true;\r
                 LoadCurrentPrims();\r
             }\r
@@ -659,6 +662,15 @@ namespace Radegast.Rendering
             }\r
         }\r
 \r
+        ShaderProgram shinyProgram = new ShaderProgram();\r
+        void InitShaders()\r
+        {\r
+            if (RenderSettings.HasShaders)\r
+            {\r
+                shinyProgram.Load("shiny.vert", "shiny.frag");\r
+            }\r
+        }\r
+\r
         #endregion glControl setup and disposal\r
 \r
         #region glControl paint and resize events\r
@@ -2237,6 +2249,7 @@ namespace Radegast.Rendering
             GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Specular, new float[] { 0f, 0f, 0f, 1.0f });\r
             GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Emission, new float[] { 0f, 0f, 0f, 1.0f });\r
             GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Shininess, 0f);\r
+            ShaderProgram.Stop();\r
         }\r
 \r
         float LODFactor(float distance, float radius)\r
@@ -2396,27 +2409,28 @@ namespace Radegast.Rendering
                         switchedLightsOff = true;\r
                     }\r
 \r
+                    float shiny = 0f;\r
                     switch (teFace.Shiny)\r
                     {\r
                         case Shininess.High:\r
-                            GL.Material(MaterialFace.Front, MaterialParameter.Shininess, 0.94f);\r
+                            shiny = 0.96f;\r
                             break;\r
 \r
                         case Shininess.Medium:\r
-                            GL.Material(MaterialFace.Front, MaterialParameter.Shininess, 0.64f);\r
+                            shiny = 0.64f;\r
                             break;\r
 \r
                         case Shininess.Low:\r
-                            GL.Material(MaterialFace.Front, MaterialParameter.Shininess, 0.24f);\r
-                            break;\r
-\r
-\r
-                        case Shininess.None:\r
-                        default:\r
-                            GL.Material(MaterialFace.Front, MaterialParameter.Shininess, 0f);\r
+                            shiny = 0.24f;\r
                             break;\r
                     }\r
 \r
+                    if (shiny > 0f && enableShiny)\r
+                    {\r
+                        shinyProgram.Start();\r
+                        shinyProgram.SetUniform1("colorMap", 0);\r
+                    }\r
+                    GL.Material(MaterialFace.Front, MaterialParameter.Shininess, shiny);\r
                     var faceColor = new float[] { RGBA.R, RGBA.G, RGBA.B, RGBA.A };\r
                     GL.Color4(faceColor);\r
 \r
@@ -2464,7 +2478,6 @@ namespace Radegast.Rendering
                         GL.Enable(EnableCap.Texture2D);\r
                         GL.BindTexture(TextureTarget.Texture2D, data.TextureInfo.TexturePointer);\r
                     }\r
-\r
                 }\r
                 else\r
                 {\r
@@ -3492,6 +3505,29 @@ namespace Radegast.Rendering
                 });\r
             }\r
             ctxMenu.Items.Add(item);\r
+\r
+            // Enable disable shiny\r
+            if (RenderSettings.HasShaders)\r
+            {\r
+                if (enableShiny)\r
+                {\r
+                    item = new ToolStripMenuItem("Disable Shiny", null, (sender, e) =>\r
+                    {\r
+                        enableShiny = false;\r
+                        Instance.GlobalSettings["scene_viewer_shiny"] = false;\r
+                    });\r
+                }\r
+                else\r
+                {\r
+                    item = new ToolStripMenuItem("Enable Shiny", null, (sender, e) =>\r
+                    {\r
+                        enableShiny = true;\r
+                        Instance.GlobalSettings["scene_viewer_shiny"] = true;\r
+                    });\r
+                }\r
+                ctxMenu.Items.Add(item);\r
+            }\r
+\r
         }\r
         #endregion Context menu\r
 \r
index 52aa48c..1ff1a52 100644 (file)
@@ -135,14 +135,20 @@ namespace Radegast.Rendering
             if (!RenderSettings.HasShaders) return;
 
             if (ID != -1)
+            {
                 GL.UseProgram(ID);
+                CurrentProgram = ID;
+            }
         }
 
-        public void Stop()
+        public static void Stop()
         {
             if (!RenderSettings.HasShaders) return;
-
-            GL.UseProgram(0);
+            
+            if (CurrentProgram != 0)
+            {
+                GL.UseProgram(0);
+            }
         }
 
         public int Uni(string var)
@@ -152,6 +158,28 @@ namespace Radegast.Rendering
             return GL.GetUniformLocation(ID, var);
         }
 
+        public void SetUniform1(string var, int value)
+        {
+            if (!RenderSettings.HasShaders || ID < 1) return;
+            int varID = Uni(var);
+            if (varID == -1)
+            {
+                return;
+            }
+            GL.Uniform1(varID, value);
+        }
+
+        public void SetUniform1(string var, float value)
+        {
+            if (!RenderSettings.HasShaders || ID < 1) return;
+            int varID = Uni(var);
+            if (varID == -1)
+            {
+                return;
+            }
+            GL.Uniform1(varID, value);
+        }
+
         public void Dispose()
         {
             if (!RenderSettings.HasShaders) return;
index da55dd2..2ecec74 100644 (file)
@@ -259,7 +259,7 @@ namespace Radegast.Rendering
                 GL.ActiveTexture(TextureUnit.Texture0);
                 GL.Disable(EnableCap.Texture2D);
 
-                waterProgram.Stop();
+                ShaderProgram.Stop();
             }
         }
 
index d54d114..8831b13 100644 (file)
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r
     </None>\r
     <None Include="Resources\target_map_pos.png" />\r
+    <None Include="shader_data\shiny.frag">\r
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r
+    </None>\r
+    <None Include="shader_data\shiny.vert">\r
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r
+    </None>\r
     <None Include="shader_data\water.frag">\r
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r
     </None>\r
diff --git a/Radegast/shader_data/shiny.frag b/Radegast/shader_data/shiny.frag
new file mode 100644 (file)
index 0000000..a4432f2
--- /dev/null
@@ -0,0 +1,33 @@
+#define MAX_LIGHTS 8\r
+#define NUM_LIGHTS 1\r
+varying vec3 normal, lightDir[MAX_LIGHTS], eyeVec;\r
+varying vec2 texCoord;\r
+\r
+uniform sampler2D colorMap;\r
+//uniform int numLights;\r
+\r
+void main (void)\r
+{\r
+  int numLights = 1;\r
+  vec4 base_color = texture2D(colorMap, texCoord);\r
+  //vec4 final_color = gl_FrontLightModelProduct.sceneColor;\r
+  vec4 final_color = (gl_FrontLightModelProduct.sceneColor * gl_FrontMaterial.ambient) + \r
+       (gl_LightSource[0].ambient * gl_FrontMaterial.ambient);\r
+  vec3 N = normalize(normal);\r
+  int i;\r
+  for (i=0; i<NUM_LIGHTS; ++i)\r
+  {  \r
+    vec3 L = normalize(lightDir[i]);\r
+    float lambertTerm = dot(N,L);\r
+    if (lambertTerm > 0.0)\r
+    {\r
+      final_color += gl_LightSource[i].diffuse * gl_FrontMaterial.diffuse * lambertTerm;       \r
+      vec3 E = normalize(eyeVec);\r
+      vec3 R = reflect(-L, N);\r
+      float specular = clamp(pow( max(dot(R, E), 0.0), gl_FrontMaterial.shininess), 0.001, 1.0);\r
+      final_color += gl_LightSource[i].specular * specular;\r
+    }\r
+  }\r
+  final_color = clamp(final_color, 0.0, 1.0);\r
+  gl_FragColor = final_color * base_color;\r
+}\r
diff --git a/Radegast/shader_data/shiny.vert b/Radegast/shader_data/shiny.vert
new file mode 100644 (file)
index 0000000..c981e34
--- /dev/null
@@ -0,0 +1,16 @@
+#define MAX_LIGHTS 8\r
+#define NUM_LIGHTS 1\r
+varying vec3 normal, lightDir[MAX_LIGHTS], eyeVec;\r
+varying vec2 texCoord;\r
+\r
+void main()\r
+{      \r
+  gl_Position = ftransform();          \r
+  normal = gl_NormalMatrix * gl_Normal;\r
+  vec4 vVertex = gl_ModelViewMatrix * gl_Vertex;\r
+  eyeVec = -vVertex.xyz;\r
+  texCoord = gl_MultiTexCoord0.xy;\r
+  int i;\r
+  for (i=0; i<NUM_LIGHTS; ++i)\r
+    lightDir[i] = vec3(gl_LightSource[i].position.xyz - vVertex.xyz);\r
+}\r