0031275: Visualization, TKOpenGl - handle normal-map texture with Path-Tracing
[occt.git] / src / Shaders / Shaders_RaytraceBase_fs.pxx
index 6b852d4..63f44e1 100644 (file)
@@ -173,6 +173,14 @@ static const char Shaders_RaytraceBase_fs[] =
   "  vec3 Normal;\n"
   "};\n"
   "\n"
+  "//! Stores triangle's vertex indexes and vertexes itself\n"
+  "struct STriangle\n"
+  "{\n"
+  "  ivec4 TriIndex;\n"
+  "\n"
+  "  vec3 Points[3];\n"
+  "};\n"
+  "\n"
   "/////////////////////////////////////////////////////////////////////////////////////////\n"
   "// Some useful constants\n"
   "\n"
@@ -465,7 +473,7 @@ static const char Shaders_RaytraceBase_fs[] =
   "#define TRG_OFFSET(treelet) treelet.SubData.w\n"
   "\n"
   "//! Identifies the absence of intersection.\n"
-  "#define INALID_HIT ivec4 (-1)\n"
+  "#define INVALID_HIT ivec4 (-1)\n"
   "\n"
   "//! Global stack shared between traversal functions.\n"
   "int Stack[STACK_SIZE];\n"
@@ -501,9 +509,9 @@ static const char Shaders_RaytraceBase_fs[] =
   "// function : SceneNearestHit\n"
   "// purpose  : Finds intersection with nearest scene triangle\n"
   "// =======================================================================\n"
-  "ivec4 SceneNearestHit (in SRay theRay, in vec3 theInverse, inout SIntersect theHit, out int theTrsfId)\n"
+  "STriangle SceneNearestHit (in SRay theRay, in vec3 theInverse, inout SIntersect theHit, out int theTrsfId)\n"
   "{\n"
-  "  ivec4 aTriIndex = INALID_HIT;\n"
+  "  STriangle aTriangle = STriangle (INVALID_HIT, vec3[](vec3(0.0), vec3(0.0), vec3(0.0)));\n"
   "\n"
   "  int aNode =  0; // node to traverse\n"
   "  int aHead = -1; // pointer of stack\n"
@@ -610,17 +618,22 @@ static const char Shaders_RaytraceBase_fs[] =
   "\n"
   "      for (int anIdx = aData.y; anIdx <= aData.z; ++anIdx)\n"
   "      {\n"
-  "        ivec4 aTriangle = texelFetch (uGeometryTriangTexture, anIdx + TRG_OFFSET (aSubTree));\n"
+  "        ivec4 aTriIndex = texelFetch (uGeometryTriangTexture, anIdx + TRG_OFFSET (aSubTree));\n"
+  "        vec3 aPoints[3];\n"
   "\n"
-  "        vec3 aPoint0 = texelFetch (uGeometryVertexTexture, aTriangle.x += VRT_OFFSET (aSubTree)).xyz;\n"
-  "        vec3 aPoint1 = texelFetch (uGeometryVertexTexture, aTriangle.y += VRT_OFFSET (aSubTree)).xyz;\n"
-  "        vec3 aPoint2 = texelFetch (uGeometryVertexTexture, aTriangle.z += VRT_OFFSET (aSubTree)).xyz;\n"
+  "        aPoints[0] = texelFetch (uGeometryVertexTexture, aTriIndex.x += VRT_OFFSET (aSubTree)).xyz;\n"
+  "        aPoints[1] = texelFetch (uGeometryVertexTexture, aTriIndex.y += VRT_OFFSET (aSubTree)).xyz;\n"
+  "        aPoints[2] = texelFetch (uGeometryVertexTexture, aTriIndex.z += VRT_OFFSET (aSubTree)).xyz;\n"
   "\n"
-  "        IntersectTriangle (aSubTree.TrsfRay, aPoint0, aPoint1, aPoint2, aTimeUV, aNormal);\n"
+  "        IntersectTriangle (aSubTree.TrsfRay, aPoints[0], aPoints[1], aPoints[2], aTimeUV, aNormal);\n"
   "\n"
   "        if (aTimeUV.x < theHit.Time)\n"
   "        {\n"
-  "          aTriIndex = aTriangle;\n"
+  "          aTriangle.TriIndex = aTriIndex;\n"
+  "          for (int i = 0; i < 3; ++i)\n"
+  "          {\n"
+  "            aTriangle.Points[i] = aPoints[i];\n"
+  "          }\n"
   "\n"
   "          theTrsfId = TRS_OFFSET (aSubTree);\n"
   "\n"
@@ -667,7 +680,7 @@ static const char Shaders_RaytraceBase_fs[] =
   "    }\n"
   "  }\n"
   "\n"
-  "  return aTriIndex;\n"
+  "  return aTriangle;\n"
   "}\n"
   "\n"
   "// =======================================================================\n"
@@ -917,15 +930,21 @@ static const char Shaders_RaytraceBase_fs[] =
   "// purpose  : Interpolates UV coordinates across the triangle\n"
   "// =======================================================================\n"
   "#ifdef USE_TEXTURES\n"
-  "vec2 SmoothUV (in vec2 theUV, in ivec4 theTriangle)\n"
+  "vec2 SmoothUV (in vec2 theUV, in ivec4 theTriangle, out vec2[3] theUVs)\n"
   "{\n"
-  "  vec2 aTexCrd0 = texelFetch (uGeometryTexCrdTexture, theTriangle.x).st;\n"
-  "  vec2 aTexCrd1 = texelFetch (uGeometryTexCrdTexture, theTriangle.y).st;\n"
-  "  vec2 aTexCrd2 = texelFetch (uGeometryTexCrdTexture, theTriangle.z).st;\n"
+  "  theUVs[0] = texelFetch (uGeometryTexCrdTexture, theTriangle.x).st;\n"
+  "  theUVs[1] = texelFetch (uGeometryTexCrdTexture, theTriangle.y).st;\n"
+  "  theUVs[2] = texelFetch (uGeometryTexCrdTexture, theTriangle.z).st;\n"
   "\n"
-  "  return aTexCrd1 * theUV.x +\n"
-  "         aTexCrd2 * theUV.y +\n"
-  "         aTexCrd0 * (1.0f - theUV.x - theUV.y);\n"
+  "  return theUVs[1] * theUV.x +\n"
+  "         theUVs[2] * theUV.y +\n"
+  "         theUVs[0] * (1.0f - theUV.x - theUV.y);\n"
+  "}\n"
+  "\n"
+  "vec2 SmoothUV (in vec2 theUV, in ivec4 theTriangle)\n"
+  "{\n"
+  "  vec2 aUVs[3];\n"
+  "  return SmoothUV (theUV, theTriangle, aUVs);\n"
   "}\n"
   "#endif\n"
   "\n"
@@ -1012,7 +1031,7 @@ static const char Shaders_RaytraceBase_fs[] =
   "  {\n"
   "    SIntersect aHit = SIntersect (MAXFLOAT, vec2 (ZERO), ZERO);\n"
   "\n"
-  "    ivec4 aTriIndex = SceneNearestHit (theRay, theInverse, aHit, aTrsfId);\n"
+  "    ivec4 aTriIndex = SceneNearestHit (theRay, theInverse, aHit, aTrsfId).TriIndex;\n"
   "\n"
   "    if (aTriIndex.x == -1)\n"
   "    {\n"