2013-01-29 23:54:18 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// Copyright 2013 Pixar
|
2013-01-29 23:54:18 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// Licensed under the Apache License, Version 2.0 (the "Apache License")
|
|
|
|
// with the following modification; you may not use this file except in
|
|
|
|
// compliance with the Apache License and the following modification to it:
|
|
|
|
// Section 6. Trademarks. is deleted and replaced with:
|
2013-01-29 23:54:18 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// 6. Trademarks. This License does not grant permission to use the trade
|
|
|
|
// names, trademarks, service marks, or product names of the Licensor
|
|
|
|
// and its affiliates, except as required to comply with Section 4(c) of
|
|
|
|
// the License and to reproduce the content of the NOTICE file.
|
2013-01-29 23:54:18 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// You may obtain a copy of the Apache License at
|
2013-01-29 23:54:18 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
2013-07-18 21:19:50 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the Apache License with the above modification is
|
|
|
|
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
|
// KIND, either express or implied. See the Apache License for the specific
|
|
|
|
// language governing permissions and limitations under the Apache License.
|
2013-01-29 23:54:18 +00:00
|
|
|
//
|
|
|
|
|
2013-07-02 18:16:27 +00:00
|
|
|
#if defined(VARYING_COLOR) || defined(FACEVARYING_COLOR)
|
2013-06-28 21:05:47 +00:00
|
|
|
#undef OSD_USER_VARYING_DECLARE
|
|
|
|
#define OSD_USER_VARYING_DECLARE \
|
|
|
|
vec3 color;
|
|
|
|
|
|
|
|
#undef OSD_USER_VARYING_ATTRIBUTE_DECLARE
|
|
|
|
#define OSD_USER_VARYING_ATTRIBUTE_DECLARE \
|
|
|
|
layout(location = 1) in vec3 color;
|
|
|
|
|
|
|
|
#undef OSD_USER_VARYING_PER_VERTEX
|
|
|
|
#define OSD_USER_VARYING_PER_VERTEX() \
|
|
|
|
outpt.color = color
|
|
|
|
|
|
|
|
#undef OSD_USER_VARYING_PER_CONTROL_POINT
|
|
|
|
#define OSD_USER_VARYING_PER_CONTROL_POINT(ID_OUT, ID_IN) \
|
|
|
|
outpt[ID_OUT].color = inpt[ID_IN].color
|
|
|
|
|
|
|
|
#undef OSD_USER_VARYING_PER_EVAL_POINT
|
|
|
|
#define OSD_USER_VARYING_PER_EVAL_POINT(UV, a, b, c, d) \
|
|
|
|
outpt.color = \
|
|
|
|
mix(mix(inpt[a].color, inpt[b].color, UV.x), \
|
|
|
|
mix(inpt[c].color, inpt[d].color, UV.x), UV.y)
|
|
|
|
#else
|
|
|
|
#define OSD_USER_VARYING_DECLARE
|
|
|
|
#define OSD_USER_VARYING_ATTRIBUTE_DECLARE
|
|
|
|
#define OSD_USER_VARYING_PER_VERTEX()
|
|
|
|
#define OSD_USER_VARYING_PER_CONTROL_POINT(ID_OUT, ID_IN)
|
|
|
|
#define OSD_USER_VARYING_PER_EVAL_POINT(UV, a, b, c, d)
|
|
|
|
#endif
|
|
|
|
|
2013-12-03 23:59:38 +00:00
|
|
|
//--------------------------------------------------------------
|
|
|
|
// Uniforms / Uniform Blocks
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
|
|
|
|
layout(std140) uniform Transform {
|
|
|
|
mat4 ModelViewMatrix;
|
|
|
|
mat4 ProjectionMatrix;
|
|
|
|
mat4 ModelViewProjectionMatrix;
|
|
|
|
};
|
|
|
|
|
|
|
|
layout(std140) uniform Tessellation {
|
|
|
|
float TessLevel;
|
|
|
|
};
|
|
|
|
|
|
|
|
uniform int GregoryQuadOffsetBase;
|
|
|
|
uniform int PrimitiveIdBase;
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
// Osd external functions
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
|
|
|
|
mat4 OsdModelViewMatrix()
|
|
|
|
{
|
|
|
|
return ModelViewMatrix;
|
|
|
|
}
|
|
|
|
mat4 OsdProjectionMatrix()
|
|
|
|
{
|
|
|
|
return ProjectionMatrix;
|
|
|
|
}
|
|
|
|
mat4 OsdModelViewProjectionMatrix()
|
|
|
|
{
|
|
|
|
return ModelViewProjectionMatrix;
|
|
|
|
}
|
|
|
|
float OsdTessLevel()
|
|
|
|
{
|
|
|
|
return TessLevel;
|
|
|
|
}
|
|
|
|
int OsdGregoryQuadOffsetBase()
|
|
|
|
{
|
|
|
|
return GregoryQuadOffsetBase;
|
|
|
|
}
|
|
|
|
int OsdPrimitiveIdBase()
|
|
|
|
{
|
|
|
|
return PrimitiveIdBase;
|
|
|
|
}
|
2014-05-09 00:20:54 +00:00
|
|
|
int OsdBaseVertex()
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
2013-12-03 23:59:38 +00:00
|
|
|
|
2013-01-29 23:54:18 +00:00
|
|
|
//--------------------------------------------------------------
|
|
|
|
// Vertex Shader
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
#ifdef VERTEX_SHADER
|
|
|
|
|
|
|
|
layout (location=0) in vec4 position;
|
2013-06-29 01:34:34 +00:00
|
|
|
OSD_USER_VARYING_ATTRIBUTE_DECLARE
|
2013-01-29 23:54:18 +00:00
|
|
|
|
|
|
|
out block {
|
|
|
|
OutputVertex v;
|
2015-05-22 07:07:34 +00:00
|
|
|
#ifdef OSD_PATCH_ENABLE_SINGLE_CREASE
|
2015-05-31 05:36:50 +00:00
|
|
|
vec2 vSegments;
|
2015-05-22 07:07:34 +00:00
|
|
|
#endif
|
2013-06-28 21:05:47 +00:00
|
|
|
OSD_USER_VARYING_DECLARE
|
2013-06-10 19:53:04 +00:00
|
|
|
} outpt;
|
2013-01-29 23:54:18 +00:00
|
|
|
|
|
|
|
void main()
|
|
|
|
{
|
2013-06-10 19:53:04 +00:00
|
|
|
outpt.v.position = ModelViewMatrix * position;
|
2015-04-09 05:14:33 +00:00
|
|
|
outpt.v.patchCoord = vec4(0);
|
2015-05-22 07:07:34 +00:00
|
|
|
#ifdef OSD_PATCH_ENABLE_SINGLE_CREASE
|
2015-05-31 05:36:50 +00:00
|
|
|
outpt.vSegments = vec2(0);
|
2015-05-22 07:07:34 +00:00
|
|
|
#endif
|
2013-06-28 21:05:47 +00:00
|
|
|
OSD_USER_VARYING_PER_VERTEX();
|
2013-01-29 23:54:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
// Geometry Shader
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
#ifdef GEOMETRY_SHADER
|
|
|
|
|
|
|
|
#ifdef PRIM_QUAD
|
|
|
|
|
|
|
|
layout(lines_adjacency) in;
|
|
|
|
|
|
|
|
#define EDGE_VERTS 4
|
|
|
|
|
|
|
|
#endif // PRIM_QUAD
|
|
|
|
|
|
|
|
#ifdef PRIM_TRI
|
|
|
|
|
|
|
|
layout(triangles) in;
|
|
|
|
|
|
|
|
#define EDGE_VERTS 3
|
|
|
|
|
|
|
|
#endif // PRIM_TRI
|
|
|
|
|
|
|
|
|
2013-06-27 19:57:21 +00:00
|
|
|
layout(triangle_strip, max_vertices = EDGE_VERTS) out;
|
|
|
|
in block {
|
|
|
|
OutputVertex v;
|
2015-04-18 22:24:24 +00:00
|
|
|
#ifdef OSD_PATCH_ENABLE_SINGLE_CREASE
|
2015-05-31 05:36:50 +00:00
|
|
|
vec2 vSegments;
|
2015-04-18 22:24:24 +00:00
|
|
|
#endif
|
2013-06-28 21:05:47 +00:00
|
|
|
OSD_USER_VARYING_DECLARE
|
2013-06-27 19:57:21 +00:00
|
|
|
} inpt[EDGE_VERTS];
|
2013-01-29 23:54:18 +00:00
|
|
|
|
|
|
|
out block {
|
|
|
|
OutputVertex v;
|
2013-06-10 22:51:27 +00:00
|
|
|
noperspective out vec4 edgeDistance;
|
2015-04-18 22:24:24 +00:00
|
|
|
#ifdef OSD_PATCH_ENABLE_SINGLE_CREASE
|
2015-05-31 05:36:50 +00:00
|
|
|
vec2 vSegments;
|
2015-04-18 22:24:24 +00:00
|
|
|
#endif
|
2013-06-29 01:34:34 +00:00
|
|
|
OSD_USER_VARYING_DECLARE
|
2013-06-10 19:53:04 +00:00
|
|
|
} outpt;
|
2013-01-29 23:54:18 +00:00
|
|
|
|
2013-07-03 19:08:10 +00:00
|
|
|
void emit(int index, vec3 normal)
|
2013-01-29 23:54:18 +00:00
|
|
|
{
|
2013-06-10 19:53:04 +00:00
|
|
|
outpt.v.position = inpt[index].v.position;
|
2015-04-08 01:34:05 +00:00
|
|
|
outpt.v.patchCoord = inpt[index].v.patchCoord;
|
2013-01-29 23:54:18 +00:00
|
|
|
#ifdef SMOOTH_NORMALS
|
2013-06-10 19:53:04 +00:00
|
|
|
outpt.v.normal = inpt[index].v.normal;
|
2013-01-29 23:54:18 +00:00
|
|
|
#else
|
2013-06-10 19:53:04 +00:00
|
|
|
outpt.v.normal = normal;
|
2013-06-27 19:57:21 +00:00
|
|
|
#endif
|
2013-07-02 18:16:27 +00:00
|
|
|
|
2015-04-18 22:24:24 +00:00
|
|
|
#ifdef OSD_PATCH_ENABLE_SINGLE_CREASE
|
2015-05-31 05:36:50 +00:00
|
|
|
outpt.vSegments = inpt[index].vSegments;
|
2015-04-18 22:24:24 +00:00
|
|
|
#endif
|
2015-04-17 23:26:57 +00:00
|
|
|
|
2013-06-27 19:57:21 +00:00
|
|
|
#ifdef VARYING_COLOR
|
2013-06-29 01:34:34 +00:00
|
|
|
outpt.color = inpt[index].color;
|
2013-01-29 23:54:18 +00:00
|
|
|
#endif
|
2013-07-02 18:16:27 +00:00
|
|
|
|
|
|
|
#ifdef FACEVARYING_COLOR
|
2013-09-23 19:56:46 +00:00
|
|
|
#ifdef LOOP // ----- scheme : LOOP
|
|
|
|
vec2 uv;
|
|
|
|
OSD_COMPUTE_FACE_VARYING_TRI_2(uv, /*fvarOffste=*/0, index);
|
|
|
|
|
|
|
|
#else // ----- scheme : CATMARK / BILINEAR
|
|
|
|
|
2013-07-02 18:16:27 +00:00
|
|
|
#ifdef UNIFORM_SUBDIVISION
|
|
|
|
vec2 quadst[4] = vec2[](vec2(0,0), vec2(1,0), vec2(1,1), vec2(0,1));
|
|
|
|
vec2 st = quadst[index];
|
|
|
|
#else
|
|
|
|
vec2 st = inpt[index].v.tessCoord;
|
|
|
|
#endif
|
2013-07-08 23:16:28 +00:00
|
|
|
vec2 uv;
|
|
|
|
OSD_COMPUTE_FACE_VARYING_2(uv, /*fvarOffset=*/0, st);
|
2013-09-23 19:56:46 +00:00
|
|
|
#endif // ------ scheme
|
2013-07-03 19:08:10 +00:00
|
|
|
outpt.color = vec3(uv.s, uv.t, 0);
|
2013-07-02 18:16:27 +00:00
|
|
|
#endif
|
|
|
|
|
2013-06-10 19:53:04 +00:00
|
|
|
gl_Position = ProjectionMatrix * inpt[index].v.position;
|
2013-01-29 23:54:18 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2013-07-03 19:08:10 +00:00
|
|
|
void emit(int index, vec3 normal, vec4 edgeVerts[EDGE_VERTS])
|
2013-01-29 23:54:18 +00:00
|
|
|
{
|
2013-06-10 22:51:27 +00:00
|
|
|
outpt.edgeDistance[0] =
|
2013-01-29 23:54:18 +00:00
|
|
|
edgeDistance(edgeVerts[index], edgeVerts[0], edgeVerts[1]);
|
2013-06-10 22:51:27 +00:00
|
|
|
outpt.edgeDistance[1] =
|
2013-01-29 23:54:18 +00:00
|
|
|
edgeDistance(edgeVerts[index], edgeVerts[1], edgeVerts[2]);
|
|
|
|
#ifdef PRIM_TRI
|
2013-06-10 22:51:27 +00:00
|
|
|
outpt.edgeDistance[2] =
|
2013-01-29 23:54:18 +00:00
|
|
|
edgeDistance(edgeVerts[index], edgeVerts[2], edgeVerts[0]);
|
|
|
|
#endif
|
|
|
|
#ifdef PRIM_QUAD
|
2013-06-10 22:51:27 +00:00
|
|
|
outpt.edgeDistance[2] =
|
2013-01-29 23:54:18 +00:00
|
|
|
edgeDistance(edgeVerts[index], edgeVerts[2], edgeVerts[3]);
|
2013-06-10 22:51:27 +00:00
|
|
|
outpt.edgeDistance[3] =
|
2013-01-29 23:54:18 +00:00
|
|
|
edgeDistance(edgeVerts[index], edgeVerts[3], edgeVerts[0]);
|
|
|
|
#endif
|
|
|
|
|
2013-07-03 19:08:10 +00:00
|
|
|
emit(index, normal);
|
2013-01-29 23:54:18 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void main()
|
|
|
|
{
|
|
|
|
gl_PrimitiveID = gl_PrimitiveIDIn;
|
2013-07-02 18:16:27 +00:00
|
|
|
|
2013-01-29 23:54:18 +00:00
|
|
|
#ifdef PRIM_QUAD
|
2013-06-10 19:53:04 +00:00
|
|
|
vec3 A = (inpt[0].v.position - inpt[1].v.position).xyz;
|
|
|
|
vec3 B = (inpt[3].v.position - inpt[1].v.position).xyz;
|
|
|
|
vec3 C = (inpt[2].v.position - inpt[1].v.position).xyz;
|
2013-01-29 23:54:18 +00:00
|
|
|
vec3 n0 = normalize(cross(B, A));
|
|
|
|
|
|
|
|
#if defined(GEOMETRY_OUT_WIRE) || defined(GEOMETRY_OUT_LINE)
|
|
|
|
vec4 edgeVerts[EDGE_VERTS];
|
2013-06-10 19:53:04 +00:00
|
|
|
edgeVerts[0] = ProjectionMatrix * inpt[0].v.position;
|
|
|
|
edgeVerts[1] = ProjectionMatrix * inpt[1].v.position;
|
|
|
|
edgeVerts[2] = ProjectionMatrix * inpt[2].v.position;
|
|
|
|
edgeVerts[3] = ProjectionMatrix * inpt[3].v.position;
|
2013-01-29 23:54:18 +00:00
|
|
|
|
|
|
|
edgeVerts[0].xy /= edgeVerts[0].w;
|
|
|
|
edgeVerts[1].xy /= edgeVerts[1].w;
|
|
|
|
edgeVerts[2].xy /= edgeVerts[2].w;
|
|
|
|
edgeVerts[3].xy /= edgeVerts[3].w;
|
|
|
|
|
2013-07-03 19:08:10 +00:00
|
|
|
emit(0, n0, edgeVerts);
|
|
|
|
emit(1, n0, edgeVerts);
|
|
|
|
emit(3, n0, edgeVerts);
|
|
|
|
emit(2, n0, edgeVerts);
|
2013-01-29 23:54:18 +00:00
|
|
|
#else
|
2013-07-03 19:08:10 +00:00
|
|
|
emit(0, n0);
|
|
|
|
emit(1, n0);
|
|
|
|
emit(3, n0);
|
|
|
|
emit(2, n0);
|
2013-01-29 23:54:18 +00:00
|
|
|
#endif
|
|
|
|
#endif // PRIM_QUAD
|
|
|
|
|
|
|
|
#ifdef PRIM_TRI
|
2013-06-10 19:53:04 +00:00
|
|
|
vec3 A = (inpt[1].v.position - inpt[0].v.position).xyz;
|
|
|
|
vec3 B = (inpt[2].v.position - inpt[0].v.position).xyz;
|
2013-01-29 23:54:18 +00:00
|
|
|
vec3 n0 = normalize(cross(B, A));
|
|
|
|
|
|
|
|
#if defined(GEOMETRY_OUT_WIRE) || defined(GEOMETRY_OUT_LINE)
|
|
|
|
vec4 edgeVerts[EDGE_VERTS];
|
2013-06-10 19:53:04 +00:00
|
|
|
edgeVerts[0] = ProjectionMatrix * inpt[0].v.position;
|
|
|
|
edgeVerts[1] = ProjectionMatrix * inpt[1].v.position;
|
|
|
|
edgeVerts[2] = ProjectionMatrix * inpt[2].v.position;
|
2013-01-29 23:54:18 +00:00
|
|
|
|
|
|
|
edgeVerts[0].xy /= edgeVerts[0].w;
|
|
|
|
edgeVerts[1].xy /= edgeVerts[1].w;
|
|
|
|
edgeVerts[2].xy /= edgeVerts[2].w;
|
|
|
|
|
2013-07-03 19:08:10 +00:00
|
|
|
emit(0, n0, edgeVerts);
|
|
|
|
emit(1, n0, edgeVerts);
|
|
|
|
emit(2, n0, edgeVerts);
|
2013-01-29 23:54:18 +00:00
|
|
|
#else
|
2013-07-03 19:08:10 +00:00
|
|
|
emit(0, n0);
|
|
|
|
emit(1, n0);
|
|
|
|
emit(2, n0);
|
2013-01-29 23:54:18 +00:00
|
|
|
#endif
|
|
|
|
#endif // PRIM_TRI
|
|
|
|
|
|
|
|
EndPrimitive();
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
// Fragment Shader
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
#ifdef FRAGMENT_SHADER
|
|
|
|
|
|
|
|
in block {
|
|
|
|
OutputVertex v;
|
2013-06-10 22:51:27 +00:00
|
|
|
noperspective in vec4 edgeDistance;
|
2015-04-18 22:24:24 +00:00
|
|
|
#ifdef OSD_PATCH_ENABLE_SINGLE_CREASE
|
2015-05-31 05:36:50 +00:00
|
|
|
vec2 vSegments;
|
2015-04-18 22:24:24 +00:00
|
|
|
#endif
|
2013-06-29 01:34:34 +00:00
|
|
|
OSD_USER_VARYING_DECLARE
|
2013-06-10 19:53:04 +00:00
|
|
|
} inpt;
|
2013-01-29 23:54:18 +00:00
|
|
|
|
|
|
|
out vec4 outColor;
|
2014-05-15 20:53:43 +00:00
|
|
|
out vec3 outNormal;
|
2013-01-29 23:54:18 +00:00
|
|
|
|
|
|
|
#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
|
2013-06-27 19:57:21 +00:00
|
|
|
lighting(vec4 diffuse, vec3 Peye, vec3 Neye)
|
2013-01-29 23:54:18 +00:00
|
|
|
{
|
|
|
|
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
|
2013-06-27 19:57:21 +00:00
|
|
|
+ d * lightSource[i].diffuse * diffuse
|
2013-01-29 23:54:18 +00:00
|
|
|
+ s * lightSource[i].specular;
|
|
|
|
}
|
|
|
|
|
|
|
|
color.a = 1;
|
|
|
|
return color;
|
|
|
|
}
|
|
|
|
|
|
|
|
vec4
|
|
|
|
edgeColor(vec4 Cfill, vec4 edgeDistance)
|
|
|
|
{
|
|
|
|
#if defined(GEOMETRY_OUT_WIRE) || defined(GEOMETRY_OUT_LINE)
|
|
|
|
#ifdef PRIM_TRI
|
|
|
|
float d =
|
2013-06-10 22:51:27 +00:00
|
|
|
min(inpt.edgeDistance[0], min(inpt.edgeDistance[1], inpt.edgeDistance[2]));
|
2013-01-29 23:54:18 +00:00
|
|
|
#endif
|
|
|
|
#ifdef PRIM_QUAD
|
|
|
|
float d =
|
2013-06-10 22:51:27 +00:00
|
|
|
min(min(inpt.edgeDistance[0], inpt.edgeDistance[1]),
|
|
|
|
min(inpt.edgeDistance[2], inpt.edgeDistance[3]));
|
2013-01-29 23:54:18 +00:00
|
|
|
#endif
|
2014-10-13 15:52:09 +00:00
|
|
|
//vec4 Cedge = vec4(1.0, 1.0, 0.0, 1.0);
|
|
|
|
float v = 0.8;
|
|
|
|
vec4 Cedge = vec4(Cfill.r*v, Cfill.g*v, Cfill.b*v, 1);
|
2013-01-29 23:54:18 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2015-04-17 14:42:53 +00:00
|
|
|
vec4
|
Updated handling of patchParam and patchCoord
Each patch has a corresponding patchParam. This is a set of three values
specifying additional information about the patch:
faceId -- topological face identifier (e.g. Ptex FaceId)
bitfield -- refinement-level, non-quad, boundary, transition, uv-offset
sharpness -- crease sharpness for a single-crease patch
These are stored in OsdPatchParamBuffer indexed by the value returned
from OsdGetPatchIndex() which is a function of the current PrimitiveID
along with an optional client provided offset.
Accessors are provided to extract values from a patchParam. These are
all named OsdGetPatch*().
While drawing patches, the patchParam is condensed into a patchCoord which
has four values (u, v, faceLevel, faceId). These patchCoords are treated
as int values during per-prim processing but are converted to float values
during per-vertex processing where the values are interpolated.
Also, cleaned up more of the shader namespace by giving an Osd prefix
to public functions, and consolidated boundary and transition handling
code into the PatchCommon shader files. The functions determining
tessellation levels are now all named OsdGetTessLevel*().
2015-05-02 00:52:37 +00:00
|
|
|
getAdaptivePatchColor(ivec3 patchParam)
|
2015-04-17 14:42:53 +00:00
|
|
|
{
|
|
|
|
const vec4 patchColors[7*6] = vec4[7*6](
|
|
|
|
vec4(1.0f, 1.0f, 1.0f, 1.0f), // regular
|
|
|
|
vec4(0.0f, 1.0f, 1.0f, 1.0f), // regular pattern 0
|
|
|
|
vec4(0.0f, 0.5f, 1.0f, 1.0f), // regular pattern 1
|
|
|
|
vec4(0.0f, 0.5f, 0.5f, 1.0f), // regular pattern 2
|
|
|
|
vec4(0.5f, 0.0f, 1.0f, 1.0f), // regular pattern 3
|
|
|
|
vec4(1.0f, 0.5f, 1.0f, 1.0f), // regular pattern 4
|
|
|
|
|
|
|
|
vec4(1.0f, 0.5f, 0.5f, 1.0f), // single crease
|
|
|
|
vec4(1.0f, 0.70f, 0.6f, 1.0f), // single crease pattern 0
|
|
|
|
vec4(1.0f, 0.65f, 0.6f, 1.0f), // single crease pattern 1
|
|
|
|
vec4(1.0f, 0.60f, 0.6f, 1.0f), // single crease pattern 2
|
|
|
|
vec4(1.0f, 0.55f, 0.6f, 1.0f), // single crease pattern 3
|
|
|
|
vec4(1.0f, 0.50f, 0.6f, 1.0f), // single crease pattern 4
|
|
|
|
|
|
|
|
vec4(0.8f, 0.0f, 0.0f, 1.0f), // boundary
|
|
|
|
vec4(0.0f, 0.0f, 0.75f, 1.0f), // boundary pattern 0
|
|
|
|
vec4(0.0f, 0.2f, 0.75f, 1.0f), // boundary pattern 1
|
|
|
|
vec4(0.0f, 0.4f, 0.75f, 1.0f), // boundary pattern 2
|
|
|
|
vec4(0.0f, 0.6f, 0.75f, 1.0f), // boundary pattern 3
|
|
|
|
vec4(0.0f, 0.8f, 0.75f, 1.0f), // boundary pattern 4
|
|
|
|
|
|
|
|
vec4(0.0f, 1.0f, 0.0f, 1.0f), // corner
|
|
|
|
vec4(0.25f, 0.25f, 0.25f, 1.0f), // corner pattern 0
|
|
|
|
vec4(0.25f, 0.25f, 0.25f, 1.0f), // corner pattern 1
|
|
|
|
vec4(0.25f, 0.25f, 0.25f, 1.0f), // corner pattern 2
|
|
|
|
vec4(0.25f, 0.25f, 0.25f, 1.0f), // corner pattern 3
|
|
|
|
vec4(0.25f, 0.25f, 0.25f, 1.0f), // corner pattern 4
|
|
|
|
|
|
|
|
vec4(1.0f, 1.0f, 0.0f, 1.0f), // gregory
|
|
|
|
vec4(1.0f, 1.0f, 0.0f, 1.0f), // gregory
|
|
|
|
vec4(1.0f, 1.0f, 0.0f, 1.0f), // gregory
|
|
|
|
vec4(1.0f, 1.0f, 0.0f, 1.0f), // gregory
|
|
|
|
vec4(1.0f, 1.0f, 0.0f, 1.0f), // gregory
|
|
|
|
vec4(1.0f, 1.0f, 0.0f, 1.0f), // gregory
|
|
|
|
|
|
|
|
vec4(1.0f, 0.5f, 0.0f, 1.0f), // gregory boundary
|
|
|
|
vec4(1.0f, 0.5f, 0.0f, 1.0f), // gregory boundary
|
|
|
|
vec4(1.0f, 0.5f, 0.0f, 1.0f), // gregory boundary
|
|
|
|
vec4(1.0f, 0.5f, 0.0f, 1.0f), // gregory boundary
|
|
|
|
vec4(1.0f, 0.5f, 0.0f, 1.0f), // gregory boundary
|
|
|
|
vec4(1.0f, 0.5f, 0.0f, 1.0f), // gregory boundary
|
|
|
|
|
|
|
|
vec4(1.0f, 0.7f, 0.3f, 1.0f), // gregory basis
|
|
|
|
vec4(1.0f, 0.7f, 0.3f, 1.0f), // gregory basis
|
|
|
|
vec4(1.0f, 0.7f, 0.3f, 1.0f), // gregory basis
|
|
|
|
vec4(1.0f, 0.7f, 0.3f, 1.0f), // gregory basis
|
|
|
|
vec4(1.0f, 0.7f, 0.3f, 1.0f), // gregory basis
|
|
|
|
vec4(1.0f, 0.7f, 0.3f, 1.0f) // gregory basis
|
|
|
|
);
|
|
|
|
|
|
|
|
int patchType = 0;
|
2015-05-15 18:03:31 +00:00
|
|
|
#if defined OSD_PATCH_ENABLE_SINGLE_CREASE
|
2015-05-31 05:36:50 +00:00
|
|
|
if (inpt.vSegments.y > 0) {
|
2015-05-15 18:03:31 +00:00
|
|
|
patchType = 1;
|
|
|
|
}
|
|
|
|
#elif defined OSD_PATCH_GREGORY
|
2015-04-17 14:42:53 +00:00
|
|
|
patchType = 4;
|
|
|
|
#elif defined OSD_PATCH_GREGORY_BOUNDARY
|
|
|
|
patchType = 5;
|
|
|
|
#elif defined OSD_PATCH_GREGORY_BASIS
|
|
|
|
patchType = 6;
|
|
|
|
#endif
|
|
|
|
|
Updated handling of patchParam and patchCoord
Each patch has a corresponding patchParam. This is a set of three values
specifying additional information about the patch:
faceId -- topological face identifier (e.g. Ptex FaceId)
bitfield -- refinement-level, non-quad, boundary, transition, uv-offset
sharpness -- crease sharpness for a single-crease patch
These are stored in OsdPatchParamBuffer indexed by the value returned
from OsdGetPatchIndex() which is a function of the current PrimitiveID
along with an optional client provided offset.
Accessors are provided to extract values from a patchParam. These are
all named OsdGetPatch*().
While drawing patches, the patchParam is condensed into a patchCoord which
has four values (u, v, faceLevel, faceId). These patchCoords are treated
as int values during per-prim processing but are converted to float values
during per-vertex processing where the values are interpolated.
Also, cleaned up more of the shader namespace by giving an Osd prefix
to public functions, and consolidated boundary and transition handling
code into the PatchCommon shader files. The functions determining
tessellation levels are now all named OsdGetTessLevel*().
2015-05-02 00:52:37 +00:00
|
|
|
int edgeCount = bitCount(OsdGetPatchBoundaryMask(patchParam));
|
2015-04-17 14:42:53 +00:00
|
|
|
if (edgeCount == 1) {
|
|
|
|
patchType = 2; // BOUNDARY
|
|
|
|
}
|
|
|
|
if (edgeCount == 2) {
|
|
|
|
patchType = 3; // CORNER
|
|
|
|
}
|
|
|
|
|
Updated handling of patchParam and patchCoord
Each patch has a corresponding patchParam. This is a set of three values
specifying additional information about the patch:
faceId -- topological face identifier (e.g. Ptex FaceId)
bitfield -- refinement-level, non-quad, boundary, transition, uv-offset
sharpness -- crease sharpness for a single-crease patch
These are stored in OsdPatchParamBuffer indexed by the value returned
from OsdGetPatchIndex() which is a function of the current PrimitiveID
along with an optional client provided offset.
Accessors are provided to extract values from a patchParam. These are
all named OsdGetPatch*().
While drawing patches, the patchParam is condensed into a patchCoord which
has four values (u, v, faceLevel, faceId). These patchCoords are treated
as int values during per-prim processing but are converted to float values
during per-vertex processing where the values are interpolated.
Also, cleaned up more of the shader namespace by giving an Osd prefix
to public functions, and consolidated boundary and transition handling
code into the PatchCommon shader files. The functions determining
tessellation levels are now all named OsdGetTessLevel*().
2015-05-02 00:52:37 +00:00
|
|
|
int pattern = bitCount(OsdGetPatchTransitionMask(patchParam));
|
2015-04-17 14:42:53 +00:00
|
|
|
|
2015-04-17 23:26:57 +00:00
|
|
|
return patchColors[6*patchType + pattern];
|
2015-04-17 14:42:53 +00:00
|
|
|
}
|
|
|
|
|
2013-01-29 23:54:18 +00:00
|
|
|
#if defined(PRIM_QUAD) || defined(PRIM_TRI)
|
|
|
|
void
|
|
|
|
main()
|
|
|
|
{
|
2013-06-10 19:53:04 +00:00
|
|
|
vec3 N = (gl_FrontFacing ? inpt.v.normal : -inpt.v.normal);
|
2013-06-27 19:57:21 +00:00
|
|
|
|
2013-07-02 18:16:27 +00:00
|
|
|
#if defined(VARYING_COLOR)
|
2013-06-29 01:34:34 +00:00
|
|
|
vec4 color = vec4(inpt.color, 1);
|
2013-07-02 18:16:27 +00:00
|
|
|
#elif defined(FACEVARYING_COLOR)
|
2013-07-03 19:08:10 +00:00
|
|
|
// generating a checkerboard pattern
|
|
|
|
vec4 color = vec4(inpt.color.rg,
|
|
|
|
int(floor(20*inpt.color.r)+floor(20*inpt.color.g))&1, 1);
|
2013-06-27 19:57:21 +00:00
|
|
|
#else
|
2015-04-17 14:42:53 +00:00
|
|
|
//vec4 color = diffuseColor;
|
Updated handling of patchParam and patchCoord
Each patch has a corresponding patchParam. This is a set of three values
specifying additional information about the patch:
faceId -- topological face identifier (e.g. Ptex FaceId)
bitfield -- refinement-level, non-quad, boundary, transition, uv-offset
sharpness -- crease sharpness for a single-crease patch
These are stored in OsdPatchParamBuffer indexed by the value returned
from OsdGetPatchIndex() which is a function of the current PrimitiveID
along with an optional client provided offset.
Accessors are provided to extract values from a patchParam. These are
all named OsdGetPatch*().
While drawing patches, the patchParam is condensed into a patchCoord which
has four values (u, v, faceLevel, faceId). These patchCoords are treated
as int values during per-prim processing but are converted to float values
during per-vertex processing where the values are interpolated.
Also, cleaned up more of the shader namespace by giving an Osd prefix
to public functions, and consolidated boundary and transition handling
code into the PatchCommon shader files. The functions determining
tessellation levels are now all named OsdGetTessLevel*().
2015-05-02 00:52:37 +00:00
|
|
|
vec4 color = getAdaptivePatchColor(OsdGetPatchParam(OsdGetPatchIndex(gl_PrimitiveID)));
|
2013-06-27 19:57:21 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
vec4 Cf = lighting(color, inpt.v.position.xyz, N);
|
2013-01-29 23:54:18 +00:00
|
|
|
|
|
|
|
#if defined(GEOMETRY_OUT_WIRE) || defined(GEOMETRY_OUT_LINE)
|
2013-06-10 22:51:27 +00:00
|
|
|
Cf = edgeColor(Cf, inpt.edgeDistance);
|
2013-01-29 23:54:18 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
outColor = Cf;
|
2014-05-15 20:53:43 +00:00
|
|
|
outNormal = N;
|
2013-01-29 23:54:18 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|