From f25358f17ea667753c730313d8d4a476197a0a06 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Mon, 8 Aug 2011 05:54:26 +0000 Subject: [PATCH] Shiny shader. Disabled by default. Right click on the scene window and enable it from the context menu. git-svn-id: https://radegast.googlecode.com/svn/trunk@1083 f7a694da-4d33-11de-9ad6-1127a62b9fcd --- Radegast/GUI/Rendering/Rendering.cs | 56 ++++++++++++++++++++++++++++++------- Radegast/GUI/Rendering/Shader.cs | 34 ++++++++++++++++++++-- Radegast/GUI/Rendering/Water.cs | 2 +- Radegast/Radegast.csproj | 6 ++++ Radegast/shader_data/shiny.frag | 33 ++++++++++++++++++++++ Radegast/shader_data/shiny.vert | 16 +++++++++++ 6 files changed, 133 insertions(+), 14 deletions(-) create mode 100644 Radegast/shader_data/shiny.frag create mode 100644 Radegast/shader_data/shiny.vert diff --git a/Radegast/GUI/Rendering/Rendering.cs b/Radegast/GUI/Rendering/Rendering.cs index a58091c..3ff304c 100644 --- a/Radegast/GUI/Rendering/Rendering.cs +++ b/Radegast/GUI/Rendering/Rendering.cs @@ -162,6 +162,7 @@ namespace Radegast.Rendering OpenTK.Vector4 specularColor; float drawDistance = 48f; float drawDistanceSquared = 48f * 48f; + bool enableShiny; GridClient Client; RadegastInstance Instance; @@ -199,6 +200,7 @@ namespace Radegast.Rendering chatOverlay = new ChatOverlay(instance, this); cbChatType.SelectedIndex = 1; + enableShiny = Instance.GlobalSettings["scene_viewer_shiny"]; tbDrawDistance.Value = (int)DrawDistance; lblDrawDistance.Text = string.Format("Draw distance: {0}", tbDrawDistance.Value); @@ -649,6 +651,7 @@ namespace Radegast.Rendering TextureThreadContextReady.WaitOne(1000, false); glControl.MakeCurrent(); InitWater(); + InitShaders(); RenderingEnabled = true; LoadCurrentPrims(); } @@ -659,6 +662,15 @@ namespace Radegast.Rendering } } + ShaderProgram shinyProgram = new ShaderProgram(); + void InitShaders() + { + if (RenderSettings.HasShaders) + { + shinyProgram.Load("shiny.vert", "shiny.frag"); + } + } + #endregion glControl setup and disposal #region glControl paint and resize events @@ -2237,6 +2249,7 @@ namespace Radegast.Rendering GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Specular, new float[] { 0f, 0f, 0f, 1.0f }); GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Emission, new float[] { 0f, 0f, 0f, 1.0f }); GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Shininess, 0f); + ShaderProgram.Stop(); } float LODFactor(float distance, float radius) @@ -2396,27 +2409,28 @@ namespace Radegast.Rendering switchedLightsOff = true; } + float shiny = 0f; switch (teFace.Shiny) { case Shininess.High: - GL.Material(MaterialFace.Front, MaterialParameter.Shininess, 0.94f); + shiny = 0.96f; break; case Shininess.Medium: - GL.Material(MaterialFace.Front, MaterialParameter.Shininess, 0.64f); + shiny = 0.64f; break; case Shininess.Low: - GL.Material(MaterialFace.Front, MaterialParameter.Shininess, 0.24f); - break; - - - case Shininess.None: - default: - GL.Material(MaterialFace.Front, MaterialParameter.Shininess, 0f); + shiny = 0.24f; break; } + if (shiny > 0f && enableShiny) + { + shinyProgram.Start(); + shinyProgram.SetUniform1("colorMap", 0); + } + GL.Material(MaterialFace.Front, MaterialParameter.Shininess, shiny); var faceColor = new float[] { RGBA.R, RGBA.G, RGBA.B, RGBA.A }; GL.Color4(faceColor); @@ -2464,7 +2478,6 @@ namespace Radegast.Rendering GL.Enable(EnableCap.Texture2D); GL.BindTexture(TextureTarget.Texture2D, data.TextureInfo.TexturePointer); } - } else { @@ -3492,6 +3505,29 @@ namespace Radegast.Rendering }); } ctxMenu.Items.Add(item); + + // Enable disable shiny + if (RenderSettings.HasShaders) + { + if (enableShiny) + { + item = new ToolStripMenuItem("Disable Shiny", null, (sender, e) => + { + enableShiny = false; + Instance.GlobalSettings["scene_viewer_shiny"] = false; + }); + } + else + { + item = new ToolStripMenuItem("Enable Shiny", null, (sender, e) => + { + enableShiny = true; + Instance.GlobalSettings["scene_viewer_shiny"] = true; + }); + } + ctxMenu.Items.Add(item); + } + } #endregion Context menu diff --git a/Radegast/GUI/Rendering/Shader.cs b/Radegast/GUI/Rendering/Shader.cs index 52aa48c..1ff1a52 100644 --- a/Radegast/GUI/Rendering/Shader.cs +++ b/Radegast/GUI/Rendering/Shader.cs @@ -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; diff --git a/Radegast/GUI/Rendering/Water.cs b/Radegast/GUI/Rendering/Water.cs index da55dd2..2ecec74 100644 --- a/Radegast/GUI/Rendering/Water.cs +++ b/Radegast/GUI/Rendering/Water.cs @@ -259,7 +259,7 @@ namespace Radegast.Rendering GL.ActiveTexture(TextureUnit.Texture0); GL.Disable(EnableCap.Texture2D); - waterProgram.Stop(); + ShaderProgram.Stop(); } } diff --git a/Radegast/Radegast.csproj b/Radegast/Radegast.csproj index d54d114..8831b13 100644 --- a/Radegast/Radegast.csproj +++ b/Radegast/Radegast.csproj @@ -2286,6 +2286,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/Radegast/shader_data/shiny.frag b/Radegast/shader_data/shiny.frag new file mode 100644 index 0000000..a4432f2 --- /dev/null +++ b/Radegast/shader_data/shiny.frag @@ -0,0 +1,33 @@ +#define MAX_LIGHTS 8 +#define NUM_LIGHTS 1 +varying vec3 normal, lightDir[MAX_LIGHTS], eyeVec; +varying vec2 texCoord; + +uniform sampler2D colorMap; +//uniform int numLights; + +void main (void) +{ + int numLights = 1; + vec4 base_color = texture2D(colorMap, texCoord); + //vec4 final_color = gl_FrontLightModelProduct.sceneColor; + vec4 final_color = (gl_FrontLightModelProduct.sceneColor * gl_FrontMaterial.ambient) + + (gl_LightSource[0].ambient * gl_FrontMaterial.ambient); + vec3 N = normalize(normal); + int i; + for (i=0; i 0.0) + { + final_color += gl_LightSource[i].diffuse * gl_FrontMaterial.diffuse * lambertTerm; + vec3 E = normalize(eyeVec); + vec3 R = reflect(-L, N); + float specular = clamp(pow( max(dot(R, E), 0.0), gl_FrontMaterial.shininess), 0.001, 1.0); + final_color += gl_LightSource[i].specular * specular; + } + } + final_color = clamp(final_color, 0.0, 1.0); + gl_FragColor = final_color * base_color; +} diff --git a/Radegast/shader_data/shiny.vert b/Radegast/shader_data/shiny.vert new file mode 100644 index 0000000..c981e34 --- /dev/null +++ b/Radegast/shader_data/shiny.vert @@ -0,0 +1,16 @@ +#define MAX_LIGHTS 8 +#define NUM_LIGHTS 1 +varying vec3 normal, lightDir[MAX_LIGHTS], eyeVec; +varying vec2 texCoord; + +void main() +{ + gl_Position = ftransform(); + normal = gl_NormalMatrix * gl_Normal; + vec4 vVertex = gl_ModelViewMatrix * gl_Vertex; + eyeVec = -vVertex.xyz; + texCoord = gl_MultiTexCoord0.xy; + int i; + for (i=0; i