diff --git a/opensubdiv/osd/glslPatchCommon.glsl b/opensubdiv/osd/glslPatchCommon.glsl index c9a91fa4..81b6e5d2 100644 --- a/opensubdiv/osd/glslPatchCommon.glsl +++ b/opensubdiv/osd/glslPatchCommon.glsl @@ -1176,17 +1176,38 @@ OsdEvalPatchGregory(ivec3 patchParam, vec2 UV, vec3 cv[20], float u = UV.x, v = UV.y; float U = 1-u, V = 1-v; - float d11 = u+v; if(u+v==0.0f) d11 = 1.0f; - float d12 = U+v; if(U+v==0.0f) d12 = 1.0f; - float d21 = u+V; if(u+V==0.0f) d21 = 1.0f; - float d22 = U+V; if(U+V==0.0f) d22 = 1.0f; + //(0,1) (1,1) + // P3 e3- e2+ E2 + // 15------17-------11-------10 + // | | | | + // | | | | + // | | f3- | f2+ | + // | 19 13 | + // e3+ 16-----18 14-----12 e2- + // | f3+ f2- | + // | | + // | | + // | f0- f1+ | + // e0- 2------4 8------6 e1+ + // | 3 f0+ 9 | + // | | | f1- | + // | | | | + // | | | | + // 0--------1--------7--------5 + // P0 e0+ e1- E1 + //(0,0) (1,0) + + float d11 = u+v; + float d12 = U+v; + float d21 = u+V; + float d22 = U+V; vec3 q[16]; - q[ 5] = (u*cv[3] + v*cv[4])/d11; - q[ 6] = (U*cv[9] + v*cv[8])/d12; - q[ 9] = (u*cv[19] + V*cv[18])/d21; - q[10] = (U*cv[13] + V*cv[14])/d22; + q[ 5] = (d11 == 0.0) ? cv[3] : (u*cv[3] + v*cv[4])/d11; + q[ 6] = (d12 == 0.0) ? cv[8] : (U*cv[9] + v*cv[8])/d12; + q[ 9] = (d21 == 0.0) ? cv[18] : (u*cv[19] + V*cv[18])/d21; + q[10] = (d22 == 0.0) ? cv[13] : (U*cv[13] + V*cv[14])/d22; q[ 0] = cv[0]; q[ 1] = cv[1]; diff --git a/opensubdiv/osd/hlslPatchCommon.hlsl b/opensubdiv/osd/hlslPatchCommon.hlsl index 68cba712..ef75ac2b 100644 --- a/opensubdiv/osd/hlslPatchCommon.hlsl +++ b/opensubdiv/osd/hlslPatchCommon.hlsl @@ -1052,17 +1052,38 @@ OsdEvalPatchGregory(int3 patchParam, float2 UV, float3 cv[20], float u = UV.x, v = UV.y; float U = 1-u, V = 1-v; - float d11 = u+v; if(u+v==0.0f) d11 = 1.0f; - float d12 = U+v; if(U+v==0.0f) d12 = 1.0f; - float d21 = u+V; if(u+V==0.0f) d21 = 1.0f; - float d22 = U+V; if(U+V==0.0f) d22 = 1.0f; + //(0,1) (1,1) + // P3 e3- e2+ E2 + // 15------17-------11-------10 + // | | | | + // | | | | + // | | f3- | f2+ | + // | 19 13 | + // e3+ 16-----18 14-----12 e2- + // | f3+ f2- | + // | | + // | | + // | f0- f1+ | + // e0- 2------4 8------6 e1+ + // | 3 f0+ 9 | + // | | | f1- | + // | | | | + // | | | | + // 0--------1--------7--------5 + // P0 e0+ e1- E1 + //(0,0) (1,0) + + float d11 = u+v; + float d12 = U+v; + float d21 = u+V; + float d22 = U+V; float3 q[16]; - q[ 5] = (u*cv[3] + v*cv[4])/d11; - q[ 6] = (U*cv[9] + v*cv[8])/d12; - q[ 9] = (u*cv[19] + V*cv[18])/d21; - q[10] = (U*cv[13] + V*cv[14])/d22; + q[ 5] = (d11 == 0.0) ? cv[3] : (u*cv[3] + v*cv[4])/d11; + q[ 6] = (d12 == 0.0) ? cv[8] : (U*cv[9] + v*cv[8])/d12; + q[ 9] = (d21 == 0.0) ? cv[18] : (u*cv[19] + V*cv[18])/d21; + q[10] = (d22 == 0.0) ? cv[13] : (U*cv[13] + V*cv[14])/d22; q[ 0] = cv[0]; q[ 1] = cv[1];