// // Copyright (C) Pixar. All rights reserved. // // This license governs use of the accompanying software. If you // use the software, you accept this license. If you do not accept // the license, do not use the software. // // 1. Definitions // The terms "reproduce," "reproduction," "derivative works," and // "distribution" have the same meaning here as under U.S. // copyright law. A "contribution" is the original software, or // any additions or changes to the software. // A "contributor" is any person or entity that distributes its // contribution under this license. // "Licensed patents" are a contributor's patent claims that read // directly on its contribution. // // 2. Grant of Rights // (A) Copyright Grant- Subject to the terms of this license, // including the license conditions and limitations in section 3, // each contributor grants you a non-exclusive, worldwide, // royalty-free copyright license to reproduce its contribution, // prepare derivative works of its contribution, and distribute // its contribution or any derivative works that you create. // (B) Patent Grant- Subject to the terms of this license, // including the license conditions and limitations in section 3, // each contributor grants you a non-exclusive, worldwide, // royalty-free license under its licensed patents to make, have // made, use, sell, offer for sale, import, and/or otherwise // dispose of its contribution in the software or derivative works // of the contribution in the software. // // 3. Conditions and Limitations // (A) No Trademark License- This license does not grant you // rights to use any contributor's name, logo, or trademarks. // (B) If you bring a patent claim against any contributor over // patents that you claim are infringed by the software, your // patent license from such contributor to the software ends // automatically. // (C) If you distribute any portion of the software, you must // retain all copyright, patent, trademark, and attribution // notices that are present in the software. // (D) If you distribute any portion of the software in source // code form, you may do so only under this license by including a // complete copy of this license with your distribution. If you // distribute any portion of the software in compiled or object // code form, you may only do so under a license that complies // with this license. // (E) The software is licensed "as-is." You bear the risk of // using it. The contributors give no express warranties, // guarantees or conditions. You may have additional consumer // rights under your local laws which this license cannot change. // To the extent permitted under your local laws, the contributors // exclude the implied warranties of merchantability, fitness for // a particular purpose and non-infringement. // //-------------------------------------------------------------- // Vertex Shader //-------------------------------------------------------------- #ifdef VERTEX_SHADER layout (location=0) in vec4 position; layout (location=1) in vec3 normal; out block { OutputVertex v; } output; void main() { output.v.position = ModelViewMatrix * position; output.v.normal = (ModelViewMatrix * vec4(normal, 0.0)).xyz; } #endif //-------------------------------------------------------------- // Geometry Shader //-------------------------------------------------------------- #ifdef GEOMETRY_SHADER #ifdef PRIM_QUAD layout(lines_adjacency) in; layout(triangle_strip, max_vertices = 4) out; #define EDGE_VERTS 4 in block { OutputVertex v; } input[4]; #endif // PRIM_QUAD #ifdef PRIM_TRI layout(triangles) in; layout(triangle_strip, max_vertices = 3) out; #define EDGE_VERTS 3 in block { OutputVertex v; } input[3]; #endif // PRIM_TRI #ifdef PRIM_POINT layout(points) in; layout(points, max_vertices = 1) out; in block { OutputVertex v; } input[1]; #endif // PRIM_POINT out block { OutputVertex v; } output; void emit(int index, vec3 normal) { output.v.position = input[index].v.position; #ifdef SMOOTH_NORMALS output.v.normal = input[index].v.normal; #else output.v.normal = normal; #endif gl_Position = ProjectionMatrix * input[index].v.position; EmitVertex(); } #if defined(GEOMETRY_OUT_WIRE) || defined(GEOMETRY_OUT_LINE) const float VIEWPORT_SCALE = 1024.0; // XXXdyu float edgeDistance(vec4 p, vec4 p0, vec4 p1) { return VIEWPORT_SCALE * abs((p.x - p0.x) * (p1.y - p0.y) - (p.y - p0.y) * (p1.x - p0.x)) / length(p1.xy - p0.xy); } void emit(int index, vec3 normal, vec4 edgeVerts[EDGE_VERTS]) { output.v.edgeDistance[0] = edgeDistance(edgeVerts[index], edgeVerts[0], edgeVerts[1]); output.v.edgeDistance[1] = edgeDistance(edgeVerts[index], edgeVerts[1], edgeVerts[2]); #ifdef PRIM_TRI output.v.edgeDistance[2] = edgeDistance(edgeVerts[index], edgeVerts[2], edgeVerts[0]); #endif #ifdef PRIM_QUAD output.v.edgeDistance[2] = edgeDistance(edgeVerts[index], edgeVerts[2], edgeVerts[3]); output.v.edgeDistance[3] = edgeDistance(edgeVerts[index], edgeVerts[3], edgeVerts[0]); #endif emit(index, normal); } #endif void main() { gl_PrimitiveID = gl_PrimitiveIDIn; #ifdef PRIM_POINT emit(0, vec3(0)); #endif #ifdef PRIM_QUAD vec3 A = (input[0].v.position - input[1].v.position).xyz; vec3 B = (input[3].v.position - input[1].v.position).xyz; vec3 C = (input[2].v.position - input[1].v.position).xyz; vec3 n0 = normalize(cross(B, A)); #if defined(GEOMETRY_OUT_WIRE) || defined(GEOMETRY_OUT_LINE) vec4 edgeVerts[EDGE_VERTS]; edgeVerts[0] = ProjectionMatrix * input[0].v.position; edgeVerts[1] = ProjectionMatrix * input[1].v.position; edgeVerts[2] = ProjectionMatrix * input[2].v.position; edgeVerts[3] = ProjectionMatrix * input[3].v.position; edgeVerts[0].xy /= edgeVerts[0].w; edgeVerts[1].xy /= edgeVerts[1].w; edgeVerts[2].xy /= edgeVerts[2].w; edgeVerts[3].xy /= edgeVerts[3].w; emit(0, n0, edgeVerts); emit(1, n0, edgeVerts); emit(3, n0, edgeVerts); emit(2, n0, edgeVerts); #else emit(0, n0); emit(1, n0); emit(3, n0); emit(2, n0); #endif #endif // PRIM_QUAD #ifdef PRIM_TRI vec3 A = (input[1].v.position - input[0].v.position).xyz; vec3 B = (input[2].v.position - input[0].v.position).xyz; vec3 n0 = normalize(cross(B, A)); #if defined(GEOMETRY_OUT_WIRE) || defined(GEOMETRY_OUT_LINE) vec4 edgeVerts[EDGE_VERTS]; edgeVerts[0] = ProjectionMatrix * input[0].v.position; edgeVerts[1] = ProjectionMatrix * input[1].v.position; edgeVerts[2] = ProjectionMatrix * input[2].v.position; edgeVerts[0].xy /= edgeVerts[0].w; edgeVerts[1].xy /= edgeVerts[1].w; edgeVerts[2].xy /= edgeVerts[2].w; emit(0, n0, edgeVerts); emit(1, n0, edgeVerts); emit(2, n0, edgeVerts); #else emit(0, n0); emit(1, n0); emit(2, n0); #endif #endif // PRIM_TRI EndPrimitive(); } #endif //-------------------------------------------------------------- // Fragment Shader //-------------------------------------------------------------- #ifdef FRAGMENT_SHADER in block { OutputVertex v; } input; out vec4 outColor; #define NUM_LIGHTS 2 struct LightSource { vec4 position; vec4 ambient; vec4 diffuse; vec4 specular; }; layout(std140) uniform Lighting { LightSource lightSource[NUM_LIGHTS]; }; uniform vec4 diffuseColor = vec4(1); uniform vec4 ambientColor = vec4(1); vec4 lighting(vec3 Peye, vec3 Neye) { vec4 color = vec4(0); for (int i = 0; i < NUM_LIGHTS; ++i) { vec4 Plight = lightSource[i].position; vec3 l = (Plight.w == 0.0) ? normalize(Plight.xyz) : normalize(Plight.xyz - Peye); vec3 n = normalize(Neye); vec3 h = normalize(l + vec3(0,0,1)); // directional viewer float d = max(0.0, dot(n, l)); float s = pow(max(0.0, dot(n, h)), 500.0f); color += lightSource[i].ambient * ambientColor + d * lightSource[i].diffuse * diffuseColor + s * lightSource[i].specular; } color.a = 1; return color; } #ifdef PRIM_POINT uniform vec4 fragColor; void main() { outColor = fragColor; } #endif vec4 edgeColor(vec4 Cfill, vec4 edgeDistance) { #if defined(GEOMETRY_OUT_WIRE) || defined(GEOMETRY_OUT_LINE) #ifdef PRIM_TRI float d = min(input.v.edgeDistance[0], min(input.v.edgeDistance[1], input.v.edgeDistance[2])); #endif #ifdef PRIM_QUAD float d = min(min(input.v.edgeDistance[0], input.v.edgeDistance[1]), min(input.v.edgeDistance[2], input.v.edgeDistance[3])); #endif vec4 Cedge = vec4(1.0, 1.0, 0.0, 1.0); float p = exp2(-2 * d * d); #if defined(GEOMETRY_OUT_WIRE) if (p < 0.25) discard; #endif Cfill.rgb = mix(Cfill.rgb, Cedge.rgb, p); #endif return Cfill; } #if defined(PRIM_QUAD) || defined(PRIM_TRI) void main() { vec3 N = (gl_FrontFacing ? input.v.normal : -input.v.normal); vec4 Cf = lighting(input.v.position.xyz, N); #if defined(GEOMETRY_OUT_WIRE) || defined(GEOMETRY_OUT_LINE) Cf = edgeColor(Cf, input.v.edgeDistance); #endif outColor = Cf; } #endif #endif