OpenTK.Vector4 specularColor;\r
float drawDistance = 48f;\r
float drawDistanceSquared = 48f * 48f;\r
+ bool enableShiny;\r
\r
GridClient Client;\r
RadegastInstance Instance;\r
\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
TextureThreadContextReady.WaitOne(1000, false);\r
glControl.MakeCurrent();\r
InitWater();\r
+ InitShaders();\r
RenderingEnabled = true;\r
LoadCurrentPrims();\r
}\r
}\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
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
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
GL.Enable(EnableCap.Texture2D);\r
GL.BindTexture(TextureTarget.Texture2D, data.TextureInfo.TexturePointer);\r
}\r
-\r
}\r
else\r
{\r
});\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
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)
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;
--- /dev/null
+#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