using System; using OpenTK.Graphics.OpenGL; namespace org.nhengine.graphics { public class GlobalDefaults { private static GlobalDefaults _instance = new GlobalDefaults(); public static GlobalDefaults instance(){ return _instance; } private Shader defVertexShader, defFragmentShader; private ShaderProgram defShaderProgram; private GLCamera activeCamera; private GlobalDefaults(){ Console.WriteLine("GlobalDefaults: Shader Version: {0}", GL.GetString(StringName.ShadingLanguageVersion)); defVertexShader = new Shader(OpenTK.Graphics.OpenGL.ShaderType.VertexShader, defVertexShaderSource); defFragmentShader = new Shader(OpenTK.Graphics.OpenGL.ShaderType.FragmentShader, defFragmentShaderSource); defShaderProgram = new ShaderProgram(defVertexShader, defFragmentShader); activeCamera = new GLCamera(); } public ShaderProgram DefaultShaderProgram { get { return this.defShaderProgram;} } public Shader DefaultVertexShader { get { return defVertexShader; } } public Shader DefaultFragmentShader { get { return defFragmentShader; } } public GLCamera ActiveCamera { get { return this.activeCamera; } set { this.activeCamera = value; } } private string defVertexShaderSource = @"#version 330 in vec3 iv_position; in vec4 iv_color; in vec3 iv_normal; in vec2 iv_uv; uniform mat4 mTranslation; uniform mat4 mRotation; uniform mat4 mWorld; uniform mat4 mDistance; uniform mat4 mCamera; uniform mat4 mProjection; uniform mat4 mComplete; out vec4 color; out vec3 norm; out vec2 uv; void main() { gl_Position = mComplete * vec4( iv_position, 1 ); norm = normalize( ( mRotation * vec4( iv_normal, 1 ) ).xyz ); vec3 camray = normalize( -gl_Position.xyz ); float cosTheta = dot( norm , camray ); float visibility = 1.0; if (cosTheta < 0){ visibility = 1.0; } color = vec4( iv_color.xyz * (0.5 + (0.5 * cosTheta * cosTheta)), 0.5f ); } "; private string defFragmentShaderSource = @"#version 330 in vec4 color; in vec3 norm; in vec2 uv; out vec4 _color; void main() { _color = color; gl_FragDepth = gl_FragCoord.z; } "; } }