occt-gltf-addon-linux-x64 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/LICENSE_LGPL_21.txt +502 -0
  2. package/OCCT_LGPL_EXCEPTION.txt +10 -0
  3. package/README.md +2 -2
  4. package/index.js +63 -1
  5. package/lib/libTKBO.so.8.0.0 +0 -0
  6. package/lib/libTKBRep.so.8.0.0 +0 -0
  7. package/lib/libTKBin.so.8.0.0 +0 -0
  8. package/lib/libTKBinL.so.8.0.0 +0 -0
  9. package/lib/libTKBinTObj.so.8.0.0 +0 -0
  10. package/lib/libTKBinXCAF.so.8.0.0 +0 -0
  11. package/lib/libTKBool.so.8.0.0 +0 -0
  12. package/lib/libTKCAF.so.8.0.0 +0 -0
  13. package/lib/libTKCDF.so.8.0.0 +0 -0
  14. package/lib/libTKDE.so.8.0.0 +0 -0
  15. package/lib/libTKDECascade.so.8.0.0 +0 -0
  16. package/lib/libTKDEIGES.so.8.0.0 +0 -0
  17. package/lib/libTKDEOBJ.so.8.0.0 +0 -0
  18. package/lib/libTKDEPLY.so.8.0.0 +0 -0
  19. package/lib/libTKDESTEP.so.8.0.0 +0 -0
  20. package/lib/libTKDESTL.so.8.0.0 +0 -0
  21. package/lib/libTKDEVRML.so.8.0.0 +0 -0
  22. package/lib/libTKExpress.so.8.0.0 +0 -0
  23. package/lib/libTKFeat.so.8.0.0 +0 -0
  24. package/lib/libTKFillet.so.8.0.0 +0 -0
  25. package/lib/libTKG2d.so.8.0.0 +0 -0
  26. package/lib/libTKG3d.so.8.0.0 +0 -0
  27. package/lib/libTKGeomAlgo.so.8.0.0 +0 -0
  28. package/lib/libTKGeomBase.so.8.0.0 +0 -0
  29. package/lib/libTKHLR.so.8.0.0 +0 -0
  30. package/lib/libTKHelix.so.8.0.0 +0 -0
  31. package/lib/libTKLCAF.so.8.0.0 +0 -0
  32. package/lib/libTKMath.so.8.0.0 +0 -0
  33. package/lib/libTKMesh.so.8.0.0 +0 -0
  34. package/lib/libTKOffset.so.8.0.0 +0 -0
  35. package/lib/libTKPrim.so.8.0.0 +0 -0
  36. package/lib/libTKRWMesh.so.8.0.0 +0 -0
  37. package/lib/libTKService.so.8.0.0 +0 -0
  38. package/lib/libTKShHealing.so.8.0.0 +0 -0
  39. package/lib/libTKStd.so.8.0.0 +0 -0
  40. package/lib/libTKStdL.so.8.0.0 +0 -0
  41. package/lib/libTKTObj.so.8.0.0 +0 -0
  42. package/lib/libTKTopAlgo.so.8.0.0 +0 -0
  43. package/lib/libTKV3d.so.8.0.0 +0 -0
  44. package/lib/libTKVCAF.so.8.0.0 +0 -0
  45. package/lib/libTKXCAF.so.8.0.0 +0 -0
  46. package/lib/libTKXMesh.so.8.0.0 +0 -0
  47. package/lib/libTKXSBase.so.8.0.0 +0 -0
  48. package/lib/libTKXml.so.8.0.0 +0 -0
  49. package/lib/libTKXmlL.so.8.0.0 +0 -0
  50. package/lib/libTKXmlTObj.so.8.0.0 +0 -0
  51. package/lib/libTKXmlXCAF.so.8.0.0 +0 -0
  52. package/lib/libTKernel.so.8.0.0 +0 -0
  53. package/lib/libdraco.so.1 +0 -0
  54. package/lib/libtbb.so.2 +0 -0
  55. package/lib/libtbbmalloc.so.2 +0 -0
  56. package/lib/libtbbmalloc_proxy.so.2 +0 -0
  57. package/occt_gltf_addon.node +0 -0
  58. package/package.json +6 -2
  59. package/resources/BOPAlgo/BOPAlgo.msg +129 -0
  60. package/resources/BOPAlgo/FILES +1 -0
  61. package/resources/DrawResources/CURVES.tcl +38 -0
  62. package/resources/DrawResources/CheckCommands.tcl +1206 -0
  63. package/resources/DrawResources/DrawDefault +130 -0
  64. package/resources/DrawResources/DrawPlugin +64 -0
  65. package/resources/DrawResources/DrawTK.tcl +623 -0
  66. package/resources/DrawResources/FILES +16 -0
  67. package/resources/DrawResources/Geometry.tcl +96 -0
  68. package/resources/DrawResources/InitEnvironment.tcl +50 -0
  69. package/resources/DrawResources/Move.tcl +85 -0
  70. package/resources/DrawResources/OCC_logo.png +0 -0
  71. package/resources/DrawResources/PROFIL.tcl +726 -0
  72. package/resources/DrawResources/SCAN.tcl +192 -0
  73. package/resources/DrawResources/SURFACES.tcl +35 -0
  74. package/resources/DrawResources/StandardCommands.tcl +451 -0
  75. package/resources/DrawResources/StandardViews.tcl +284 -0
  76. package/resources/DrawResources/TKTopTest.tcl +27 -0
  77. package/resources/DrawResources/TestCommands.tcl +2969 -0
  78. package/resources/DrawResources/Vector.tcl +402 -0
  79. package/resources/DrawResources/dfb_attribns.gif +0 -0
  80. package/resources/DrawResources/dfb_attribute.gif +0 -0
  81. package/resources/DrawResources/dfb_folder.gif +0 -0
  82. package/resources/DrawResources/dftree.tcl +381 -0
  83. package/resources/DrawResources/lamp.ico +0 -0
  84. package/resources/SHMessage/FILES +2 -0
  85. package/resources/SHMessage/SHAPE.fr +267 -0
  86. package/resources/SHMessage/SHAPE.us +267 -0
  87. package/resources/Shaders/Declarations.glsl +276 -0
  88. package/resources/Shaders/DeclarationsImpl.glsl +121 -0
  89. package/resources/Shaders/Display.fs +157 -0
  90. package/resources/Shaders/FILES +27 -0
  91. package/resources/Shaders/LightShadow.glsl +48 -0
  92. package/resources/Shaders/PBRCookTorrance.glsl +20 -0
  93. package/resources/Shaders/PBRDirectionalLight.glsl +20 -0
  94. package/resources/Shaders/PBRDistribution.glsl +9 -0
  95. package/resources/Shaders/PBREnvBaking.fs +226 -0
  96. package/resources/Shaders/PBREnvBaking.vs +55 -0
  97. package/resources/Shaders/PBRFresnel.glsl +36 -0
  98. package/resources/Shaders/PBRGeometry.glsl +13 -0
  99. package/resources/Shaders/PBRIllumination.glsl +28 -0
  100. package/resources/Shaders/PBRPointLight.glsl +27 -0
  101. package/resources/Shaders/PBRSpotLight.glsl +45 -0
  102. package/resources/Shaders/PathtraceBase.fs +993 -0
  103. package/resources/Shaders/PhongDirectionalLight.glsl +29 -0
  104. package/resources/Shaders/PhongPointLight.glsl +36 -0
  105. package/resources/Shaders/PhongShading.fs +191 -0
  106. package/resources/Shaders/PhongShading.vs +43 -0
  107. package/resources/Shaders/PhongSpotLight.glsl +52 -0
  108. package/resources/Shaders/PointLightAttenuation.glsl +35 -0
  109. package/resources/Shaders/RaytraceBase.fs +1236 -0
  110. package/resources/Shaders/RaytraceBase.vs +12 -0
  111. package/resources/Shaders/RaytraceRender.fs +134 -0
  112. package/resources/Shaders/RaytraceSmooth.fs +80 -0
  113. package/resources/Shaders/SkydomBackground.fs +300 -0
  114. package/resources/Shaders/TangentSpaceNormal.glsl +17 -0
  115. package/resources/StdResource/FILES +6 -0
  116. package/resources/StdResource/MigrationSheet.txt +21 -0
  117. package/resources/StdResource/Plugin +52 -0
  118. package/resources/StdResource/Standard +25 -0
  119. package/resources/StdResource/StandardLite +22 -0
  120. package/resources/StdResource/TObj +17 -0
  121. package/resources/StdResource/XCAF +50 -0
  122. package/resources/TObj/FILES +1 -0
  123. package/resources/TObj/TObj.msg +85 -0
  124. package/resources/Textures/1d_elevation.rgb +0 -0
  125. package/resources/Textures/2d_MatraDatavision.rgb +0 -0
  126. package/resources/Textures/2d_alienskin.rgb +0 -0
  127. package/resources/Textures/2d_aluminum.rgb +0 -0
  128. package/resources/Textures/2d_blue_rock.rgb +0 -0
  129. package/resources/Textures/2d_bluewhite_paper.rgb +0 -0
  130. package/resources/Textures/2d_brushed.rgb +0 -0
  131. package/resources/Textures/2d_bubbles.rgb +0 -0
  132. package/resources/Textures/2d_bumps.rgb +0 -0
  133. package/resources/Textures/2d_cast.rgb +0 -0
  134. package/resources/Textures/2d_chess.rgba +0 -0
  135. package/resources/Textures/2d_chipbd.rgb +0 -0
  136. package/resources/Textures/2d_clouds.rgb +0 -0
  137. package/resources/Textures/2d_flesh.rgb +0 -0
  138. package/resources/Textures/2d_floor.rgb +0 -0
  139. package/resources/Textures/2d_galvnisd.rgb +0 -0
  140. package/resources/Textures/2d_grass.rgb +0 -0
  141. package/resources/Textures/2d_knurl.rgb +0 -0
  142. package/resources/Textures/2d_maple.rgb +0 -0
  143. package/resources/Textures/2d_marble.rgb +0 -0
  144. package/resources/Textures/2d_mottled.rgb +0 -0
  145. package/resources/Textures/2d_rain.rgb +0 -0
  146. package/resources/Textures/2d_rock.rgb +0 -0
  147. package/resources/Textures/FILES +31 -0
  148. package/resources/Textures/env_clouds.rgb +0 -0
  149. package/resources/Textures/env_cv.rgb +0 -0
  150. package/resources/Textures/env_lines.rgb +0 -0
  151. package/resources/Textures/env_medit.rgb +0 -0
  152. package/resources/Textures/env_pearl.rgb +0 -0
  153. package/resources/Textures/env_road.rgb +0 -0
  154. package/resources/Textures/env_sky1.rgb +0 -0
  155. package/resources/Textures/env_sky2.rgb +0 -0
  156. package/resources/UnitsAPI/CurrentUnits +74 -0
  157. package/resources/UnitsAPI/FILES +4 -0
  158. package/resources/UnitsAPI/MDTVBaseUnits +70 -0
  159. package/resources/UnitsAPI/MDTVCurrentUnits +74 -0
  160. package/resources/UnitsAPI/Units.dat +481 -0
  161. package/resources/XRResources/FILES +10 -0
  162. package/resources/XRResources/occtvr_actions.json +225 -0
  163. package/resources/XRResources/occtvr_bindings_generic.json +87 -0
  164. package/resources/XRResources/occtvr_bindings_holographic_hmd.json +18 -0
  165. package/resources/XRResources/occtvr_bindings_index_hmd.json +18 -0
  166. package/resources/XRResources/occtvr_bindings_rift.json +18 -0
  167. package/resources/XRResources/occtvr_bindings_touch.json +160 -0
  168. package/resources/XRResources/occtvr_bindings_vive.json +18 -0
  169. package/resources/XRResources/occtvr_bindings_vive_controller.json +139 -0
  170. package/resources/XRResources/occtvr_bindings_vive_cosmos.json +18 -0
  171. package/resources/XRResources/occtvr_bindings_vive_pro.json +18 -0
  172. package/resources/XSMessage/FILES +2 -0
  173. package/resources/XSMessage/XSTEP.fr +1026 -0
  174. package/resources/XSMessage/XSTEP.us +1023 -0
  175. package/resources/XSTEPResource/FILES +2 -0
  176. package/resources/XSTEPResource/IGES +65 -0
  177. package/resources/XSTEPResource/STEP +68 -0
  178. package/resources/XmlOcafResource/FILES +11 -0
  179. package/resources/XmlOcafResource/XmlOcaf.xsd +131 -0
  180. package/resources/XmlOcafResource/XmlOcaf_SmallTypes.xsd +217 -0
  181. package/resources/XmlOcafResource/XmlOcaf_TDF.xsd +33 -0
  182. package/resources/XmlOcafResource/XmlOcaf_TDataStd.xsd +230 -0
  183. package/resources/XmlOcafResource/XmlOcaf_TDataStd_Name.xsd +37 -0
  184. package/resources/XmlOcafResource/XmlOcaf_TDocStd.xsd +37 -0
  185. package/resources/XmlOcafResource/XmlOcaf_TFunction.xsd +38 -0
  186. package/resources/XmlOcafResource/XmlOcaf_TNaming.xsd +128 -0
  187. package/resources/XmlOcafResource/XmlOcaf_TNaming_NamedShape.xsd +97 -0
  188. package/resources/XmlOcafResource/XmlOcaf_TPrsStd.xsd +42 -0
  189. package/resources/XmlOcafResource/XmlXcaf.xsd +109 -0
  190. package/resources/samples/tcl/ANC101.tcl +282 -0
  191. package/resources/samples/tcl/DataExchangeDemo.tcl +85 -0
  192. package/resources/samples/tcl/MBBGehauseRohteil.tcl +268 -0
  193. package/resources/samples/tcl/ModelingDemo.tcl +120 -0
  194. package/resources/samples/tcl/Penrose.tcl +87 -0
  195. package/resources/samples/tcl/Readme.txt +4 -0
  196. package/resources/samples/tcl/VisualizationDemo.tcl +162 -0
  197. package/resources/samples/tcl/bottle.tcl +115 -0
  198. package/resources/samples/tcl/cad.tcl +63 -0
  199. package/resources/samples/tcl/cpu.tcl +327 -0
  200. package/resources/samples/tcl/cutter.tcl +91 -0
  201. package/resources/samples/tcl/dimensions.tcl +83 -0
  202. package/resources/samples/tcl/drill.tcl +147 -0
  203. package/resources/samples/tcl/logo2019.tcl +89 -0
  204. package/resources/samples/tcl/markers.tcl +76 -0
  205. package/resources/samples/tcl/materials.tcl +75 -0
  206. package/resources/samples/tcl/pathtrace_ball.tcl +79 -0
  207. package/resources/samples/tcl/pathtrace_cube.tcl +85 -0
  208. package/resources/samples/tcl/pathtrace_materials.tcl +229 -0
  209. package/resources/samples/tcl/pencil.tcl +64 -0
  210. package/resources/samples/tcl/raytrace.tcl +44 -0
  211. package/resources/samples/tcl/snowflake.tcl +161 -0
  212. package/resources/samples/tcl/spheres.tcl +148 -0
  213. package/resources/samples/tcl/vis_pbr_spheres.tcl +94 -0
  214. package/resources/samples/tcl/xde.tcl +47 -0
@@ -0,0 +1,1236 @@
1
+ #ifdef ADAPTIVE_SAMPLING
2
+ #extension GL_ARB_shader_image_load_store : require
3
+ #endif
4
+ #ifdef ADAPTIVE_SAMPLING_ATOMIC
5
+ #extension GL_NV_shader_atomic_float : require
6
+ #endif
7
+
8
+ #ifdef USE_TEXTURES
9
+ #extension GL_ARB_bindless_texture : require
10
+ #endif
11
+
12
+ //! Normalized pixel coordinates.
13
+ in vec2 vPixel;
14
+
15
+ //! Sub-pixel offset in for FSAA.
16
+ uniform vec2 uFsaaOffset;
17
+ //! Sub-pixel offset in Y direction for FSAA.
18
+ uniform float uOffsetY;
19
+
20
+ //! Origin of viewing ray in left-top corner.
21
+ uniform vec3 uOriginLT;
22
+ //! Origin of viewing ray in left-bottom corner.
23
+ uniform vec3 uOriginLB;
24
+ //! Origin of viewing ray in right-top corner.
25
+ uniform vec3 uOriginRT;
26
+ //! Origin of viewing ray in right-bottom corner.
27
+ uniform vec3 uOriginRB;
28
+
29
+ //! Width of the rendering window.
30
+ uniform int uWinSizeX;
31
+ //! Height of the rendering window.
32
+ uniform int uWinSizeY;
33
+
34
+ //! Direction of viewing ray in left-top corner.
35
+ uniform vec3 uDirectLT;
36
+ //! Direction of viewing ray in left-bottom corner.
37
+ uniform vec3 uDirectLB;
38
+ //! Direction of viewing ray in right-top corner.
39
+ uniform vec3 uDirectRT;
40
+ //! Direction of viewing ray in right-bottom corner.
41
+ uniform vec3 uDirectRB;
42
+
43
+ //! Inverse model-view-projection matrix.
44
+ uniform mat4 uUnviewMat;
45
+
46
+ //! Model-view-projection matrix.
47
+ uniform mat4 uViewMat;
48
+
49
+ //! Texture buffer of data records of bottom-level BVH nodes.
50
+ uniform isamplerBuffer uSceneNodeInfoTexture;
51
+ //! Texture buffer of minimum points of bottom-level BVH nodes.
52
+ uniform samplerBuffer uSceneMinPointTexture;
53
+ //! Texture buffer of maximum points of bottom-level BVH nodes.
54
+ uniform samplerBuffer uSceneMaxPointTexture;
55
+ //! Texture buffer of transformations of high-level BVH nodes.
56
+ uniform samplerBuffer uSceneTransformTexture;
57
+
58
+ //! Texture buffer of vertex coords.
59
+ uniform samplerBuffer uGeometryVertexTexture;
60
+ //! Texture buffer of vertex normals.
61
+ uniform samplerBuffer uGeometryNormalTexture;
62
+ #ifdef USE_TEXTURES
63
+ //! Texture buffer of per-vertex UV-coordinates.
64
+ uniform samplerBuffer uGeometryTexCrdTexture;
65
+ #endif
66
+ //! Texture buffer of triangle indices.
67
+ uniform isamplerBuffer uGeometryTriangTexture;
68
+
69
+ //! Texture buffer of material properties.
70
+ uniform samplerBuffer uRaytraceMaterialTexture;
71
+ //! Texture buffer of light source properties.
72
+ uniform samplerBuffer uRaytraceLightSrcTexture;
73
+
74
+ #ifdef BACKGROUND_CUBEMAP
75
+ //! Environment cubemap texture.
76
+ uniform samplerCube uEnvMapTexture;
77
+ //! Coefficient of Y controlling horizontal flip of cubemap
78
+ uniform int uYCoeff;
79
+ //! Coefficient of Z controlling vertical flip of cubemap
80
+ uniform int uZCoeff;
81
+ #else
82
+ //! Environment map texture.
83
+ uniform sampler2D uEnvMapTexture;
84
+ #endif
85
+
86
+ //! Total number of light sources.
87
+ uniform int uLightCount;
88
+ //! Intensity of global ambient light.
89
+ uniform vec4 uGlobalAmbient;
90
+
91
+ //! Enables/disables hard shadows.
92
+ uniform int uShadowsEnabled;
93
+ //! Enables/disables specular reflections.
94
+ uniform int uReflectEnabled;
95
+ //! Enables/disables environment map lighting.
96
+ uniform int uEnvMapEnabled;
97
+ //! Enables/disables environment map background.
98
+ uniform int uEnvMapForBack;
99
+
100
+ //! Radius of bounding sphere of the scene.
101
+ uniform float uSceneRadius;
102
+ //! Scene epsilon to prevent self-intersections.
103
+ uniform float uSceneEpsilon;
104
+
105
+ #ifdef USE_TEXTURES
106
+ //! Unique 64-bit handles of OpenGL textures.
107
+ uniform uvec2 uTextureSamplers[MAX_TEX_NUMBER];
108
+ #endif
109
+
110
+ #ifdef ADAPTIVE_SAMPLING
111
+ //! OpenGL image used for accumulating rendering result.
112
+ volatile restrict layout(r32f) uniform image2D uRenderImage;
113
+
114
+ #ifdef ADAPTIVE_SAMPLING_ATOMIC
115
+ //! OpenGL image storing offsets of sampled pixels blocks.
116
+ coherent restrict layout(rg32i) uniform iimage2D uOffsetImage;
117
+ #else
118
+ //! OpenGL image defining per-tile amount of samples.
119
+ volatile restrict layout(r32i) uniform iimage2D uTilesImage;
120
+ #endif
121
+
122
+ //! Screen space tile size.
123
+ uniform ivec2 uTileSize;
124
+ #endif
125
+
126
+ //! Top color of gradient background.
127
+ uniform vec4 uBackColorTop;
128
+ //! Bottom color of gradient background.
129
+ uniform vec4 uBackColorBot;
130
+
131
+ //! Aperture radius of camera used for depth-of-field
132
+ uniform float uApertureRadius;
133
+
134
+ //! Focal distance of camera used for depth-of field
135
+ uniform float uFocalPlaneDist;
136
+
137
+ //! Camera position used for projective mode
138
+ uniform vec3 uEyeOrig;
139
+
140
+ //! Camera view direction used for projective mode
141
+ uniform vec3 uEyeView;
142
+
143
+ //! Camera's screen vertical direction used for projective mode
144
+ uniform vec3 uEyeVert;
145
+
146
+ //! Camera's screen horizontal direction used for projective mode
147
+ uniform vec3 uEyeSide;
148
+
149
+ //! Camera's screen size used for projective mode
150
+ uniform vec2 uEyeSize;
151
+
152
+ /////////////////////////////////////////////////////////////////////////////////////////
153
+ // Specific data types
154
+
155
+ //! Stores ray parameters.
156
+ struct SRay
157
+ {
158
+ vec3 Origin;
159
+ vec3 Direct;
160
+ };
161
+
162
+ //! Stores intersection parameters.
163
+ struct SIntersect
164
+ {
165
+ float Time;
166
+ vec2 UV;
167
+ vec3 Normal;
168
+ };
169
+
170
+ //! Stores triangle's vertex indexes and vertexes itself
171
+ struct STriangle
172
+ {
173
+ ivec4 TriIndex;
174
+ vec3 Points[3];
175
+ };
176
+
177
+ /////////////////////////////////////////////////////////////////////////////////////////
178
+ // Some useful constants
179
+
180
+ #define MAXFLOAT 1e15f
181
+
182
+ #define SMALL vec3 (exp2 (-80.0f))
183
+
184
+ #define ZERO vec3 (0.0f, 0.0f, 0.0f)
185
+ #define UNIT vec3 (1.0f, 1.0f, 1.0f)
186
+
187
+ #define AXIS_X vec3 (1.0f, 0.0f, 0.0f)
188
+ #define AXIS_Y vec3 (0.0f, 1.0f, 0.0f)
189
+ #define AXIS_Z vec3 (0.0f, 0.0f, 1.0f)
190
+
191
+ #define M_PI 3.141592653f
192
+ #define M_2_PI 6.283185307f
193
+ #define M_PI_2 1.570796327f
194
+
195
+ #define LUMA vec3 (0.2126f, 0.7152f, 0.0722f)
196
+
197
+ // =======================================================================
198
+ // function : MatrixRowMultiplyDir
199
+ // purpose : Multiplies a vector by matrix
200
+ // =======================================================================
201
+ vec3 MatrixRowMultiplyDir (in vec3 v,
202
+ in vec4 m0,
203
+ in vec4 m1,
204
+ in vec4 m2)
205
+ {
206
+ return vec3 (dot (m0.xyz, v),
207
+ dot (m1.xyz, v),
208
+ dot (m2.xyz, v));
209
+ }
210
+
211
+ //! 32-bit state of random number generator.
212
+ uint RandState;
213
+
214
+ // =======================================================================
215
+ // function : SeedRand
216
+ // purpose : Applies hash function by Thomas Wang to randomize seeds
217
+ // (see http://www.burtleburtle.net/bob/hash/integer.html)
218
+ // =======================================================================
219
+ void SeedRand (in int theSeed, in int theSizeX, in int theRadius)
220
+ {
221
+ RandState = uint (int (gl_FragCoord.y) / theRadius * theSizeX + int (gl_FragCoord.x) / theRadius + theSeed);
222
+
223
+ RandState = (RandState + 0x479ab41du) + (RandState << 8);
224
+ RandState = (RandState ^ 0xe4aa10ceu) ^ (RandState >> 5);
225
+ RandState = (RandState + 0x9942f0a6u) - (RandState << 14);
226
+ RandState = (RandState ^ 0x5aedd67du) ^ (RandState >> 3);
227
+ RandState = (RandState + 0x17bea992u) + (RandState << 7);
228
+ }
229
+
230
+ // =======================================================================
231
+ // function : RandInt
232
+ // purpose : Generates integer using Xorshift algorithm by G. Marsaglia
233
+ // =======================================================================
234
+ uint RandInt()
235
+ {
236
+ RandState ^= (RandState << 13);
237
+ RandState ^= (RandState >> 17);
238
+ RandState ^= (RandState << 5);
239
+
240
+ return RandState;
241
+ }
242
+
243
+ // =======================================================================
244
+ // function : RandFloat
245
+ // purpose : Generates a random float in 0 <= x < 1 range
246
+ // =======================================================================
247
+ float RandFloat()
248
+ {
249
+ return float (RandInt()) * (1.f / 4294967296.f);
250
+ }
251
+
252
+ // =======================================================================
253
+ // function : MatrixColMultiplyPnt
254
+ // purpose : Multiplies a vector by matrix
255
+ // =======================================================================
256
+ vec3 MatrixColMultiplyPnt (in vec3 v,
257
+ in vec4 m0,
258
+ in vec4 m1,
259
+ in vec4 m2,
260
+ in vec4 m3)
261
+ {
262
+ return vec3 (m0.x * v.x + m1.x * v.y + m2.x * v.z + m3.x,
263
+ m0.y * v.x + m1.y * v.y + m2.y * v.z + m3.y,
264
+ m0.z * v.x + m1.z * v.y + m2.z * v.z + m3.z);
265
+ }
266
+
267
+ // =======================================================================
268
+ // function : MatrixColMultiplyDir
269
+ // purpose : Multiplies a vector by matrix
270
+ // =======================================================================
271
+ vec3 MatrixColMultiplyDir (in vec3 v,
272
+ in vec4 m0,
273
+ in vec4 m1,
274
+ in vec4 m2)
275
+ {
276
+ return vec3 (m0.x * v.x + m1.x * v.y + m2.x * v.z,
277
+ m0.y * v.x + m1.y * v.y + m2.y * v.z,
278
+ m0.z * v.x + m1.z * v.y + m2.z * v.z);
279
+ }
280
+
281
+ //=======================================================================
282
+ // function : InverseDirection
283
+ // purpose : Returns safely inverted direction of the given one
284
+ //=======================================================================
285
+ vec3 InverseDirection (in vec3 theInput)
286
+ {
287
+ vec3 anInverse = 1.f / max (abs (theInput), SMALL);
288
+
289
+ return mix (-anInverse, anInverse, step (ZERO, theInput));
290
+ }
291
+
292
+ //=======================================================================
293
+ // function : BackgroundColor
294
+ // purpose : Returns color of gradient background
295
+ //=======================================================================
296
+ vec4 BackgroundColor()
297
+ {
298
+ #ifdef ADAPTIVE_SAMPLING_ATOMIC
299
+
300
+ ivec2 aFragCoord = ivec2 (gl_FragCoord.xy);
301
+
302
+ ivec2 aTileXY = imageLoad (uOffsetImage, aFragCoord / uTileSize).xy * uTileSize;
303
+
304
+ aTileXY.y += aFragCoord.y % min (uWinSizeY - aTileXY.y, uTileSize.y);
305
+
306
+ return mix (uBackColorBot, uBackColorTop, float (aTileXY.y) / uWinSizeY);
307
+
308
+ #else
309
+
310
+ return mix (uBackColorBot, uBackColorTop, vPixel.y);
311
+
312
+ #endif
313
+ }
314
+
315
+ /////////////////////////////////////////////////////////////////////////////////////////
316
+ // Functions for compute ray-object intersection
317
+
318
+ //=======================================================================
319
+ // function : sampleUniformDisk
320
+ // purpose :
321
+ //=======================================================================
322
+ vec2 sampleUniformDisk ()
323
+ {
324
+ vec2 aPoint;
325
+
326
+ float aKsi1 = 2.f * RandFloat () - 1.f;
327
+ float aKsi2 = 2.f * RandFloat () - 1.f;
328
+
329
+ if (aKsi1 > -aKsi2)
330
+ {
331
+ if (aKsi1 > aKsi2)
332
+ aPoint = vec2 (aKsi1, (M_PI / 4.f) * (0.f + aKsi2 / aKsi1));
333
+ else
334
+ aPoint = vec2 (aKsi2, (M_PI / 4.f) * (2.f - aKsi1 / aKsi2));
335
+ }
336
+ else
337
+ {
338
+ if (aKsi1 < aKsi2)
339
+ aPoint = vec2 (-aKsi1, (M_PI / 4.f) * (4.f + aKsi2 / aKsi1));
340
+ else
341
+ aPoint = vec2 (-aKsi2, (M_PI / 4.f) * (6.f - aKsi1 / aKsi2));
342
+ }
343
+
344
+ return vec2 (sin (aPoint.y), cos (aPoint.y)) * aPoint.x;
345
+ }
346
+
347
+ // =======================================================================
348
+ // function : GenerateRay
349
+ // purpose :
350
+ // =======================================================================
351
+ SRay GenerateRay (in vec2 thePixel)
352
+ {
353
+ #ifndef DEPTH_OF_FIELD
354
+
355
+ vec3 aP0 = mix (uOriginLB, uOriginRB, thePixel.x);
356
+ vec3 aP1 = mix (uOriginLT, uOriginRT, thePixel.x);
357
+
358
+ vec3 aD0 = mix (uDirectLB, uDirectRB, thePixel.x);
359
+ vec3 aD1 = mix (uDirectLT, uDirectRT, thePixel.x);
360
+
361
+ vec3 aDirection = normalize (mix (aD0, aD1, thePixel.y));
362
+
363
+ return SRay (mix (aP0, aP1, thePixel.y), aDirection);
364
+
365
+ #else
366
+
367
+ vec2 aPixel = uEyeSize * (thePixel - vec2 (0.5f)) * 2.f;
368
+
369
+ vec2 aAperturePnt = sampleUniformDisk () * uApertureRadius;
370
+
371
+ vec3 aLocalDir = normalize (vec3 (
372
+ aPixel * uFocalPlaneDist - aAperturePnt, uFocalPlaneDist));
373
+
374
+ vec3 aOrigin = uEyeOrig +
375
+ uEyeSide * aAperturePnt.x +
376
+ uEyeVert * aAperturePnt.y;
377
+
378
+ vec3 aDirect = uEyeView * aLocalDir.z +
379
+ uEyeSide * aLocalDir.x +
380
+ uEyeVert * aLocalDir.y;
381
+
382
+ return SRay (aOrigin, aDirect);
383
+
384
+ #endif
385
+ }
386
+
387
+ // =======================================================================
388
+ // function : IntersectSphere
389
+ // purpose : Computes ray-sphere intersection
390
+ // =======================================================================
391
+ float IntersectSphere (in SRay theRay, in float theRadius)
392
+ {
393
+ float aDdotD = dot (theRay.Direct, theRay.Direct);
394
+ float aDdotO = dot (theRay.Direct, theRay.Origin);
395
+ float aOdotO = dot (theRay.Origin, theRay.Origin);
396
+
397
+ float aD = aDdotO * aDdotO - aDdotD * (aOdotO - theRadius * theRadius);
398
+
399
+ if (aD > 0.0f)
400
+ {
401
+ float aTime = (sqrt (aD) - aDdotO) * (1.0f / aDdotD);
402
+
403
+ return aTime > 0.0f ? aTime : MAXFLOAT;
404
+ }
405
+
406
+ return MAXFLOAT;
407
+ }
408
+
409
+ // =======================================================================
410
+ // function : IntersectTriangle
411
+ // purpose : Computes ray-triangle intersection (branchless version)
412
+ // =======================================================================
413
+ void IntersectTriangle (in SRay theRay,
414
+ in vec3 thePnt0,
415
+ in vec3 thePnt1,
416
+ in vec3 thePnt2,
417
+ out vec3 theUVT,
418
+ out vec3 theNorm)
419
+ {
420
+ vec3 aToTrg = thePnt0 - theRay.Origin;
421
+
422
+ vec3 aEdge0 = thePnt1 - thePnt0;
423
+ vec3 aEdge1 = thePnt0 - thePnt2;
424
+
425
+ theNorm = cross (aEdge1, aEdge0);
426
+
427
+ vec3 theVect = cross (theRay.Direct, aToTrg);
428
+
429
+ theUVT = vec3 (dot (theNorm, aToTrg),
430
+ dot (theVect, aEdge1),
431
+ dot (theVect, aEdge0)) * (1.f / dot (theNorm, theRay.Direct));
432
+
433
+ theUVT.x = any (lessThan (theUVT, ZERO)) || (theUVT.y + theUVT.z) > 1.f ? MAXFLOAT : theUVT.x;
434
+ }
435
+
436
+ #define EMPTY_ROOT ivec4(0)
437
+
438
+ //! Utility structure containing information about
439
+ //! currently traversing sub-tree of scene's BVH.
440
+ struct SSubTree
441
+ {
442
+ //! Transformed ray.
443
+ SRay TrsfRay;
444
+
445
+ //! Inversed ray direction.
446
+ vec3 Inverse;
447
+
448
+ //! Parameters of sub-root node.
449
+ ivec4 SubData;
450
+ };
451
+
452
+ #define MATERIAL_AMBN(index) (19 * index + 0)
453
+ #define MATERIAL_DIFF(index) (19 * index + 1)
454
+ #define MATERIAL_SPEC(index) (19 * index + 2)
455
+ #define MATERIAL_EMIS(index) (19 * index + 3)
456
+ #define MATERIAL_REFL(index) (19 * index + 4)
457
+ #define MATERIAL_REFR(index) (19 * index + 5)
458
+ #define MATERIAL_TRAN(index) (19 * index + 6)
459
+ #define MATERIAL_TRS1(index) (19 * index + 7)
460
+ #define MATERIAL_TRS2(index) (19 * index + 8)
461
+ #define MATERIAL_TRS3(index) (19 * index + 9)
462
+
463
+ #define TRS_OFFSET(treelet) treelet.SubData.x
464
+ #define BVH_OFFSET(treelet) treelet.SubData.y
465
+ #define VRT_OFFSET(treelet) treelet.SubData.z
466
+ #define TRG_OFFSET(treelet) treelet.SubData.w
467
+
468
+ //! Identifies the absence of intersection.
469
+ #define INVALID_HIT ivec4 (-1)
470
+
471
+ //! Global stack shared between traversal functions.
472
+ int Stack[STACK_SIZE];
473
+
474
+ // =======================================================================
475
+ // function : pop
476
+ // purpose :
477
+ // =======================================================================
478
+ int pop (inout int theHead)
479
+ {
480
+ int aData = Stack[theHead];
481
+
482
+ int aMask = aData >> 26;
483
+ int aNode = aMask & 0x3;
484
+
485
+ aMask >>= 2;
486
+
487
+ if ((aMask & 0x3) == aNode)
488
+ {
489
+ --theHead;
490
+ }
491
+ else
492
+ {
493
+ aMask |= (aMask << 2) & 0x30;
494
+
495
+ Stack[theHead] = (aData & 0x03FFFFFF) | (aMask << 26);
496
+ }
497
+
498
+ return (aData & 0x03FFFFFF) + aNode;
499
+ }
500
+
501
+ // =======================================================================
502
+ // function : SceneNearestHit
503
+ // purpose : Finds intersection with nearest scene triangle
504
+ // =======================================================================
505
+ STriangle SceneNearestHit (in SRay theRay, in vec3 theInverse, inout SIntersect theHit, out int theTrsfId)
506
+ {
507
+ STriangle aTriangle = STriangle (INVALID_HIT, vec3[](vec3(0.0), vec3(0.0), vec3(0.0)));
508
+
509
+ int aNode = 0; // node to traverse
510
+ int aHead = -1; // pointer of stack
511
+ int aStop = -1; // BVH level switch
512
+
513
+ SSubTree aSubTree = SSubTree (theRay, theInverse, EMPTY_ROOT);
514
+
515
+ for (bool toContinue = true; toContinue; /* none */)
516
+ {
517
+ ivec4 aData = texelFetch (uSceneNodeInfoTexture, aNode);
518
+
519
+ if (aData.x == 0) // if inner node
520
+ {
521
+ aData.y += BVH_OFFSET (aSubTree);
522
+
523
+ vec4 aHitTimes = vec4 (MAXFLOAT,
524
+ MAXFLOAT,
525
+ MAXFLOAT,
526
+ MAXFLOAT);
527
+
528
+ vec3 aRayOriginInverse = -aSubTree.TrsfRay.Origin * aSubTree.Inverse;
529
+
530
+ vec3 aNodeMin0 = texelFetch (uSceneMinPointTexture, aData.y + 0).xyz * aSubTree.Inverse + aRayOriginInverse;
531
+ vec3 aNodeMin1 = texelFetch (uSceneMinPointTexture, aData.y + 1).xyz * aSubTree.Inverse + aRayOriginInverse;
532
+ vec3 aNodeMin2 = texelFetch (uSceneMinPointTexture, aData.y + min (2, aData.z)).xyz * aSubTree.Inverse + aRayOriginInverse;
533
+ vec3 aNodeMin3 = texelFetch (uSceneMinPointTexture, aData.y + min (3, aData.z)).xyz * aSubTree.Inverse + aRayOriginInverse;
534
+ vec3 aNodeMax0 = texelFetch (uSceneMaxPointTexture, aData.y + 0).xyz * aSubTree.Inverse + aRayOriginInverse;
535
+ vec3 aNodeMax1 = texelFetch (uSceneMaxPointTexture, aData.y + 1).xyz * aSubTree.Inverse + aRayOriginInverse;
536
+ vec3 aNodeMax2 = texelFetch (uSceneMaxPointTexture, aData.y + min (2, aData.z)).xyz * aSubTree.Inverse + aRayOriginInverse;
537
+ vec3 aNodeMax3 = texelFetch (uSceneMaxPointTexture, aData.y + min (3, aData.z)).xyz * aSubTree.Inverse + aRayOriginInverse;
538
+
539
+ vec3 aTimeMax = max (aNodeMin0, aNodeMax0);
540
+ vec3 aTimeMin = min (aNodeMin0, aNodeMax0);
541
+
542
+ float aTimeLeave = min (aTimeMax.x, min (aTimeMax.y, aTimeMax.z));
543
+ float aTimeEnter = max (aTimeMin.x, max (aTimeMin.y, aTimeMin.z));
544
+
545
+ aHitTimes.x = (aTimeEnter <= aTimeLeave && aTimeEnter <= theHit.Time && aTimeLeave >= 0.f) ? aTimeEnter : MAXFLOAT;
546
+
547
+ aTimeMax = max (aNodeMin1, aNodeMax1);
548
+ aTimeMin = min (aNodeMin1, aNodeMax1);
549
+
550
+ aTimeLeave = min (aTimeMax.x, min (aTimeMax.y, aTimeMax.z));
551
+ aTimeEnter = max (aTimeMin.x, max (aTimeMin.y, aTimeMin.z));
552
+
553
+ aHitTimes.y = (aTimeEnter <= aTimeLeave && aTimeEnter <= theHit.Time && aTimeLeave >= 0.f) ? aTimeEnter : MAXFLOAT;
554
+
555
+ aTimeMax = max (aNodeMin2, aNodeMax2);
556
+ aTimeMin = min (aNodeMin2, aNodeMax2);
557
+
558
+ aTimeLeave = min (aTimeMax.x, min (aTimeMax.y, aTimeMax.z));
559
+ aTimeEnter = max (aTimeMin.x, max (aTimeMin.y, aTimeMin.z));
560
+
561
+ aHitTimes.z = (aTimeEnter <= aTimeLeave && aTimeEnter <= theHit.Time && aTimeLeave >= 0.f && aData.z > 1) ? aTimeEnter : MAXFLOAT;
562
+
563
+ aTimeMax = max (aNodeMin3, aNodeMax3);
564
+ aTimeMin = min (aNodeMin3, aNodeMax3);
565
+
566
+ aTimeLeave = min (aTimeMax.x, min (aTimeMax.y, aTimeMax.z));
567
+ aTimeEnter = max (aTimeMin.x, max (aTimeMin.y, aTimeMin.z));
568
+
569
+ aHitTimes.w = (aTimeEnter <= aTimeLeave && aTimeEnter <= theHit.Time && aTimeLeave >= 0.f && aData.z > 2) ? aTimeEnter : MAXFLOAT;
570
+
571
+ ivec4 aChildren = ivec4 (0, 1, 2, 3);
572
+
573
+ aChildren.xy = aHitTimes.y < aHitTimes.x ? aChildren.yx : aChildren.xy;
574
+ aHitTimes.xy = aHitTimes.y < aHitTimes.x ? aHitTimes.yx : aHitTimes.xy;
575
+ aChildren.zw = aHitTimes.w < aHitTimes.z ? aChildren.wz : aChildren.zw;
576
+ aHitTimes.zw = aHitTimes.w < aHitTimes.z ? aHitTimes.wz : aHitTimes.zw;
577
+ aChildren.xz = aHitTimes.z < aHitTimes.x ? aChildren.zx : aChildren.xz;
578
+ aHitTimes.xz = aHitTimes.z < aHitTimes.x ? aHitTimes.zx : aHitTimes.xz;
579
+ aChildren.yw = aHitTimes.w < aHitTimes.y ? aChildren.wy : aChildren.yw;
580
+ aHitTimes.yw = aHitTimes.w < aHitTimes.y ? aHitTimes.wy : aHitTimes.yw;
581
+ aChildren.yz = aHitTimes.z < aHitTimes.y ? aChildren.zy : aChildren.yz;
582
+ aHitTimes.yz = aHitTimes.z < aHitTimes.y ? aHitTimes.zy : aHitTimes.yz;
583
+
584
+ if (aHitTimes.x != MAXFLOAT)
585
+ {
586
+ int aHitMask = (aHitTimes.w != MAXFLOAT ? aChildren.w : aChildren.z) << 2
587
+ | (aHitTimes.z != MAXFLOAT ? aChildren.z : aChildren.y);
588
+
589
+ if (aHitTimes.y != MAXFLOAT)
590
+ Stack[++aHead] = aData.y | (aHitMask << 2 | aChildren.y) << 26;
591
+
592
+ aNode = aData.y + aChildren.x;
593
+ }
594
+ else
595
+ {
596
+ toContinue = (aHead >= 0);
597
+
598
+ if (aHead == aStop) // go to top-level BVH
599
+ {
600
+ aStop = -1; aSubTree = SSubTree (theRay, theInverse, EMPTY_ROOT);
601
+ }
602
+
603
+ if (aHead >= 0)
604
+ aNode = pop (aHead);
605
+ }
606
+ }
607
+ else if (aData.x < 0) // leaf node (contains triangles)
608
+ {
609
+ vec3 aNormal;
610
+ vec3 aTimeUV;
611
+
612
+ for (int anIdx = aData.y; anIdx <= aData.z; ++anIdx)
613
+ {
614
+ ivec4 aTriIndex = texelFetch (uGeometryTriangTexture, anIdx + TRG_OFFSET (aSubTree));
615
+ vec3 aPoints[3];
616
+
617
+ aPoints[0] = texelFetch (uGeometryVertexTexture, aTriIndex.x += VRT_OFFSET (aSubTree)).xyz;
618
+ aPoints[1] = texelFetch (uGeometryVertexTexture, aTriIndex.y += VRT_OFFSET (aSubTree)).xyz;
619
+ aPoints[2] = texelFetch (uGeometryVertexTexture, aTriIndex.z += VRT_OFFSET (aSubTree)).xyz;
620
+
621
+ IntersectTriangle (aSubTree.TrsfRay, aPoints[0], aPoints[1], aPoints[2], aTimeUV, aNormal);
622
+
623
+ if (aTimeUV.x < theHit.Time)
624
+ {
625
+ aTriangle.TriIndex = aTriIndex;
626
+ for (int i = 0; i < 3; ++i)
627
+ {
628
+ aTriangle.Points[i] = aPoints[i];
629
+ }
630
+
631
+ theTrsfId = TRS_OFFSET (aSubTree);
632
+
633
+ theHit = SIntersect (aTimeUV.x, aTimeUV.yz, aNormal);
634
+ }
635
+ }
636
+
637
+ toContinue = (aHead >= 0);
638
+
639
+ if (aHead == aStop) // go to top-level BVH
640
+ {
641
+ aStop = -1; aSubTree = SSubTree (theRay, theInverse, EMPTY_ROOT);
642
+ }
643
+
644
+ if (aHead >= 0)
645
+ aNode = pop (aHead);
646
+ }
647
+ else if (aData.x > 0) // switch node
648
+ {
649
+ aSubTree.SubData = ivec4 (4 * aData.x - 4, aData.yzw); // store BVH sub-root
650
+
651
+ vec4 aInvTransf0 = texelFetch (uSceneTransformTexture, TRS_OFFSET (aSubTree) + 0);
652
+ vec4 aInvTransf1 = texelFetch (uSceneTransformTexture, TRS_OFFSET (aSubTree) + 1);
653
+ vec4 aInvTransf2 = texelFetch (uSceneTransformTexture, TRS_OFFSET (aSubTree) + 2);
654
+ vec4 aInvTransf3 = texelFetch (uSceneTransformTexture, TRS_OFFSET (aSubTree) + 3);
655
+
656
+ aSubTree.TrsfRay.Direct = MatrixColMultiplyDir (theRay.Direct,
657
+ aInvTransf0,
658
+ aInvTransf1,
659
+ aInvTransf2);
660
+
661
+ aSubTree.Inverse = mix (-UNIT, UNIT, step (ZERO, aSubTree.TrsfRay.Direct)) /
662
+ max (abs (aSubTree.TrsfRay.Direct), SMALL);
663
+
664
+ aSubTree.TrsfRay.Origin = MatrixColMultiplyPnt (theRay.Origin,
665
+ aInvTransf0,
666
+ aInvTransf1,
667
+ aInvTransf2,
668
+ aInvTransf3);
669
+
670
+ aNode = BVH_OFFSET (aSubTree); // go to sub-root node
671
+
672
+ aStop = aHead; // store current stack pointer
673
+ }
674
+ }
675
+
676
+ return aTriangle;
677
+ }
678
+
679
+ // =======================================================================
680
+ // function : SceneAnyHit
681
+ // purpose : Finds intersection with any scene triangle
682
+ // =======================================================================
683
+ float SceneAnyHit (in SRay theRay, in vec3 theInverse, in float theDistance)
684
+ {
685
+ float aFactor = 1.f;
686
+
687
+ int aNode = 0; // node to traverse
688
+ int aHead = -1; // pointer of stack
689
+ int aStop = -1; // BVH level switch
690
+
691
+ SSubTree aSubTree = SSubTree (theRay, theInverse, EMPTY_ROOT);
692
+
693
+ for (bool toContinue = true; toContinue; /* none */)
694
+ {
695
+ ivec4 aData = texelFetch (uSceneNodeInfoTexture, aNode);
696
+
697
+ if (aData.x == 0) // if inner node
698
+ {
699
+ aData.y += BVH_OFFSET (aSubTree);
700
+
701
+ vec4 aHitTimes = vec4 (MAXFLOAT,
702
+ MAXFLOAT,
703
+ MAXFLOAT,
704
+ MAXFLOAT);
705
+
706
+ vec3 aRayOriginInverse = -aSubTree.TrsfRay.Origin * aSubTree.Inverse;
707
+
708
+ vec3 aNodeMin0 = texelFetch (uSceneMinPointTexture, aData.y + 0).xyz * aSubTree.Inverse + aRayOriginInverse;
709
+ vec3 aNodeMin1 = texelFetch (uSceneMinPointTexture, aData.y + 1).xyz * aSubTree.Inverse + aRayOriginInverse;
710
+ vec3 aNodeMin2 = texelFetch (uSceneMinPointTexture, aData.y + min (2, aData.z)).xyz * aSubTree.Inverse + aRayOriginInverse;
711
+ vec3 aNodeMin3 = texelFetch (uSceneMinPointTexture, aData.y + min (3, aData.z)).xyz * aSubTree.Inverse + aRayOriginInverse;
712
+ vec3 aNodeMax0 = texelFetch (uSceneMaxPointTexture, aData.y + 0).xyz * aSubTree.Inverse + aRayOriginInverse;
713
+ vec3 aNodeMax1 = texelFetch (uSceneMaxPointTexture, aData.y + 1).xyz * aSubTree.Inverse + aRayOriginInverse;
714
+ vec3 aNodeMax2 = texelFetch (uSceneMaxPointTexture, aData.y + min (2, aData.z)).xyz * aSubTree.Inverse + aRayOriginInverse;
715
+ vec3 aNodeMax3 = texelFetch (uSceneMaxPointTexture, aData.y + min (3, aData.z)).xyz * aSubTree.Inverse + aRayOriginInverse;
716
+
717
+ vec3 aTimeMax = max (aNodeMin0, aNodeMax0);
718
+ vec3 aTimeMin = min (aNodeMin0, aNodeMax0);
719
+
720
+ float aTimeLeave = min (aTimeMax.x, min (aTimeMax.y, aTimeMax.z));
721
+ float aTimeEnter = max (aTimeMin.x, max (aTimeMin.y, aTimeMin.z));
722
+
723
+ aHitTimes.x = (aTimeEnter <= aTimeLeave && aTimeEnter <= theDistance && aTimeLeave >= 0.f) ? aTimeEnter : MAXFLOAT;
724
+
725
+ aTimeMax = max (aNodeMin1, aNodeMax1);
726
+ aTimeMin = min (aNodeMin1, aNodeMax1);
727
+
728
+ aTimeLeave = min (aTimeMax.x, min (aTimeMax.y, aTimeMax.z));
729
+ aTimeEnter = max (aTimeMin.x, max (aTimeMin.y, aTimeMin.z));
730
+
731
+ aHitTimes.y = (aTimeEnter <= aTimeLeave && aTimeEnter <= theDistance && aTimeLeave >= 0.f) ? aTimeEnter : MAXFLOAT;
732
+
733
+ aTimeMax = max (aNodeMin2, aNodeMax2);
734
+ aTimeMin = min (aNodeMin2, aNodeMax2);
735
+
736
+ aTimeLeave = min (aTimeMax.x, min (aTimeMax.y, aTimeMax.z));
737
+ aTimeEnter = max (aTimeMin.x, max (aTimeMin.y, aTimeMin.z));
738
+
739
+ aHitTimes.z = (aTimeEnter <= aTimeLeave && aTimeEnter <= theDistance && aTimeLeave >= 0.f && aData.z > 1) ? aTimeEnter : MAXFLOAT;
740
+
741
+ aTimeMax = max (aNodeMin3, aNodeMax3);
742
+ aTimeMin = min (aNodeMin3, aNodeMax3);
743
+
744
+ aTimeLeave = min (aTimeMax.x, min (aTimeMax.y, aTimeMax.z));
745
+ aTimeEnter = max (aTimeMin.x, max (aTimeMin.y, aTimeMin.z));
746
+
747
+ aHitTimes.w = (aTimeEnter <= aTimeLeave && aTimeEnter <= theDistance && aTimeLeave >= 0.f && aData.z > 2) ? aTimeEnter : MAXFLOAT;
748
+
749
+ ivec4 aChildren = ivec4 (0, 1, 2, 3);
750
+
751
+ aChildren.xy = aHitTimes.y < aHitTimes.x ? aChildren.yx : aChildren.xy;
752
+ aHitTimes.xy = aHitTimes.y < aHitTimes.x ? aHitTimes.yx : aHitTimes.xy;
753
+ aChildren.zw = aHitTimes.w < aHitTimes.z ? aChildren.wz : aChildren.zw;
754
+ aHitTimes.zw = aHitTimes.w < aHitTimes.z ? aHitTimes.wz : aHitTimes.zw;
755
+ aChildren.xz = aHitTimes.z < aHitTimes.x ? aChildren.zx : aChildren.xz;
756
+ aHitTimes.xz = aHitTimes.z < aHitTimes.x ? aHitTimes.zx : aHitTimes.xz;
757
+ aChildren.yw = aHitTimes.w < aHitTimes.y ? aChildren.wy : aChildren.yw;
758
+ aHitTimes.yw = aHitTimes.w < aHitTimes.y ? aHitTimes.wy : aHitTimes.yw;
759
+ aChildren.yz = aHitTimes.z < aHitTimes.y ? aChildren.zy : aChildren.yz;
760
+ aHitTimes.yz = aHitTimes.z < aHitTimes.y ? aHitTimes.zy : aHitTimes.yz;
761
+
762
+ if (aHitTimes.x != MAXFLOAT)
763
+ {
764
+ int aHitMask = (aHitTimes.w != MAXFLOAT ? aChildren.w : aChildren.z) << 2
765
+ | (aHitTimes.z != MAXFLOAT ? aChildren.z : aChildren.y);
766
+
767
+ if (aHitTimes.y != MAXFLOAT)
768
+ Stack[++aHead] = aData.y | (aHitMask << 2 | aChildren.y) << 26;
769
+
770
+ aNode = aData.y + aChildren.x;
771
+ }
772
+ else
773
+ {
774
+ toContinue = (aHead >= 0);
775
+
776
+ if (aHead == aStop) // go to top-level BVH
777
+ {
778
+ aStop = -1; aSubTree = SSubTree (theRay, theInverse, EMPTY_ROOT);
779
+ }
780
+
781
+ if (aHead >= 0)
782
+ aNode = pop (aHead);
783
+ }
784
+ }
785
+ else if (aData.x < 0) // leaf node
786
+ {
787
+ vec3 aNormal;
788
+ vec3 aTimeUV;
789
+
790
+ for (int anIdx = aData.y; anIdx <= aData.z; ++anIdx)
791
+ {
792
+ ivec4 aTriangle = texelFetch (uGeometryTriangTexture, anIdx + TRG_OFFSET (aSubTree));
793
+
794
+ vec3 aPoint0 = texelFetch (uGeometryVertexTexture, aTriangle.x += VRT_OFFSET (aSubTree)).xyz;
795
+ vec3 aPoint1 = texelFetch (uGeometryVertexTexture, aTriangle.y += VRT_OFFSET (aSubTree)).xyz;
796
+ vec3 aPoint2 = texelFetch (uGeometryVertexTexture, aTriangle.z += VRT_OFFSET (aSubTree)).xyz;
797
+
798
+ IntersectTriangle (aSubTree.TrsfRay, aPoint0, aPoint1, aPoint2, aTimeUV, aNormal);
799
+
800
+ #ifdef TRANSPARENT_SHADOWS
801
+ if (aTimeUV.x < theDistance)
802
+ {
803
+ aFactor *= 1.f - texelFetch (uRaytraceMaterialTexture, MATERIAL_TRAN (aTriangle.w)).x;
804
+ }
805
+ #else
806
+ if (aTimeUV.x < theDistance)
807
+ {
808
+ aFactor = 0.f;
809
+ }
810
+ #endif
811
+ }
812
+
813
+ toContinue = (aHead >= 0) && (aFactor > 0.1f);
814
+
815
+ if (aHead == aStop) // go to top-level BVH
816
+ {
817
+ aStop = -1; aSubTree = SSubTree (theRay, theInverse, EMPTY_ROOT);
818
+ }
819
+
820
+ if (aHead >= 0)
821
+ aNode = pop (aHead);
822
+ }
823
+ else if (aData.x > 0) // switch node
824
+ {
825
+ aSubTree.SubData = ivec4 (4 * aData.x - 4, aData.yzw); // store BVH sub-root
826
+
827
+ vec4 aInvTransf0 = texelFetch (uSceneTransformTexture, TRS_OFFSET (aSubTree) + 0);
828
+ vec4 aInvTransf1 = texelFetch (uSceneTransformTexture, TRS_OFFSET (aSubTree) + 1);
829
+ vec4 aInvTransf2 = texelFetch (uSceneTransformTexture, TRS_OFFSET (aSubTree) + 2);
830
+ vec4 aInvTransf3 = texelFetch (uSceneTransformTexture, TRS_OFFSET (aSubTree) + 3);
831
+
832
+ aSubTree.TrsfRay.Direct = MatrixColMultiplyDir (theRay.Direct,
833
+ aInvTransf0,
834
+ aInvTransf1,
835
+ aInvTransf2);
836
+
837
+ aSubTree.TrsfRay.Origin = MatrixColMultiplyPnt (theRay.Origin,
838
+ aInvTransf0,
839
+ aInvTransf1,
840
+ aInvTransf2,
841
+ aInvTransf3);
842
+
843
+ aSubTree.Inverse = mix (-UNIT, UNIT, step (ZERO, aSubTree.TrsfRay.Direct)) / max (abs (aSubTree.TrsfRay.Direct), SMALL);
844
+
845
+ aNode = BVH_OFFSET (aSubTree); // go to sub-root node
846
+
847
+ aStop = aHead; // store current stack pointer
848
+ }
849
+ }
850
+
851
+ return aFactor;
852
+ }
853
+
854
+ #define PI 3.1415926f
855
+
856
+ // =======================================================================
857
+ // function : Latlong
858
+ // purpose : Converts world direction to environment texture coordinates
859
+ // =======================================================================
860
+ vec2 Latlong (in vec3 thePoint, in float theRadius)
861
+ {
862
+ float aPsi = acos (-thePoint.z / theRadius);
863
+
864
+ float aPhi = atan (thePoint.y, thePoint.x) + PI;
865
+
866
+ return vec2 (aPhi * 0.1591549f,
867
+ aPsi * 0.3183098f);
868
+ }
869
+
870
+ #ifdef BACKGROUND_CUBEMAP
871
+ //! Transform texture coordinates for cubemap lookup.
872
+ vec3 cubemapVectorTransform (in vec3 theVec, in float theRadius)
873
+ {
874
+ vec3 aVec = theVec.yzx;
875
+ aVec.y *= float(uYCoeff);
876
+ aVec.z *= float(uZCoeff);
877
+ return aVec;
878
+ }
879
+ #endif
880
+
881
+ // =======================================================================
882
+ // function : SmoothNormal
883
+ // purpose : Interpolates normal across the triangle
884
+ // =======================================================================
885
+ vec3 SmoothNormal (in vec2 theUV, in ivec4 theTriangle)
886
+ {
887
+ vec3 aNormal0 = texelFetch (uGeometryNormalTexture, theTriangle.x).xyz;
888
+ vec3 aNormal1 = texelFetch (uGeometryNormalTexture, theTriangle.y).xyz;
889
+ vec3 aNormal2 = texelFetch (uGeometryNormalTexture, theTriangle.z).xyz;
890
+
891
+ return normalize (aNormal1 * theUV.x +
892
+ aNormal2 * theUV.y +
893
+ aNormal0 * (1.0f - theUV.x - theUV.y));
894
+ }
895
+
896
+ #define POLYGON_OFFSET_UNIT 0.f
897
+ #define POLYGON_OFFSET_FACTOR 1.f
898
+ #define POLYGON_OFFSET_SCALE 0.006f
899
+
900
+ // =======================================================================
901
+ // function : PolygonOffset
902
+ // purpose : Computes OpenGL polygon offset
903
+ // =======================================================================
904
+ float PolygonOffset (in vec3 theNormal, in vec3 thePoint)
905
+ {
906
+ vec4 aProjectedNorm = vec4 (theNormal, -dot (theNormal, thePoint)) * uUnviewMat;
907
+
908
+ float aPolygonOffset = POLYGON_OFFSET_UNIT;
909
+
910
+ if (aProjectedNorm.z * aProjectedNorm.z > 1e-20f)
911
+ {
912
+ aProjectedNorm.xy *= 1.f / aProjectedNorm.z;
913
+
914
+ aPolygonOffset += POLYGON_OFFSET_FACTOR * max (abs (aProjectedNorm.x),
915
+ abs (aProjectedNorm.y));
916
+ }
917
+
918
+ return aPolygonOffset;
919
+ }
920
+
921
+ // =======================================================================
922
+ // function : SmoothUV
923
+ // purpose : Interpolates UV coordinates across the triangle
924
+ // =======================================================================
925
+ #ifdef USE_TEXTURES
926
+ vec2 SmoothUV (in vec2 theUV, in ivec4 theTriangle, out vec2[3] theUVs)
927
+ {
928
+ theUVs[0] = texelFetch (uGeometryTexCrdTexture, theTriangle.x).st;
929
+ theUVs[1] = texelFetch (uGeometryTexCrdTexture, theTriangle.y).st;
930
+ theUVs[2] = texelFetch (uGeometryTexCrdTexture, theTriangle.z).st;
931
+
932
+ return theUVs[1] * theUV.x +
933
+ theUVs[2] * theUV.y +
934
+ theUVs[0] * (1.0f - theUV.x - theUV.y);
935
+ }
936
+
937
+ vec2 SmoothUV (in vec2 theUV, in ivec4 theTriangle)
938
+ {
939
+ vec2 aUVs[3];
940
+ return SmoothUV (theUV, theTriangle, aUVs);
941
+ }
942
+ #endif
943
+
944
+ // =======================================================================
945
+ // function : FetchEnvironment
946
+ // purpose :
947
+ // =======================================================================
948
+ vec4 FetchEnvironment (in vec3 theTexCoord, in float theRadius, in bool theIsBackground)
949
+ {
950
+ if (uEnvMapEnabled == 0)
951
+ {
952
+ #ifdef PATH_TRACING
953
+ return theIsBackground ? vec4 (0.0, 0.0, 0.0, 1.0) : uGlobalAmbient;
954
+ #else
955
+ return vec4 (0.0, 0.0, 0.0, 1.0);
956
+ #endif
957
+ }
958
+
959
+ vec4 anAmbScale = theIsBackground ? vec4(1.0) : uGlobalAmbient;
960
+ vec4 anEnvColor =
961
+ #ifdef BACKGROUND_CUBEMAP
962
+ textureLod (uEnvMapTexture, cubemapVectorTransform (theTexCoord, theRadius), 0.0);
963
+ #else
964
+ textureLod (uEnvMapTexture, Latlong (theTexCoord, theRadius), 0.0);
965
+ #endif
966
+ return anEnvColor * anAmbScale;
967
+ }
968
+
969
+ // =======================================================================
970
+ // function : Refract
971
+ // purpose : Computes refraction ray (also handles TIR)
972
+ // =======================================================================
973
+ #ifndef PATH_TRACING
974
+ vec3 Refract (in vec3 theInput,
975
+ in vec3 theNormal,
976
+ in float theRefractIndex,
977
+ in float theInvRefractIndex)
978
+ {
979
+ float aNdotI = dot (theInput, theNormal);
980
+
981
+ float anIndex = aNdotI < 0.0f
982
+ ? theInvRefractIndex
983
+ : theRefractIndex;
984
+
985
+ float aSquare = anIndex * anIndex * (1.0f - aNdotI * aNdotI);
986
+
987
+ if (aSquare > 1.0f)
988
+ {
989
+ return reflect (theInput, theNormal);
990
+ }
991
+
992
+ float aNdotT = sqrt (1.0f - aSquare);
993
+
994
+ return normalize (anIndex * theInput -
995
+ (anIndex * aNdotI + (aNdotI < 0.0f ? aNdotT : -aNdotT)) * theNormal);
996
+ }
997
+ #endif
998
+
999
+ #define MIN_SLOPE 0.0001f
1000
+ #define EPS_SCALE 8.0000f
1001
+
1002
+ #define THRESHOLD vec3 (0.1f)
1003
+
1004
+ #define INVALID_BOUNCES 1000
1005
+
1006
+ #define LIGHT_POS(index) (2 * index + 1)
1007
+ #define LIGHT_PWR(index) (2 * index + 0)
1008
+
1009
+ // =======================================================================
1010
+ // function : Radiance
1011
+ // purpose : Computes color along the given ray
1012
+ // =======================================================================
1013
+ #ifndef PATH_TRACING
1014
+ vec4 Radiance (in SRay theRay, in vec3 theInverse)
1015
+ {
1016
+ vec3 aResult = vec3 (0.0f);
1017
+ vec4 aWeight = vec4 (1.0f);
1018
+
1019
+ int aTrsfId;
1020
+
1021
+ float aRaytraceDepth = MAXFLOAT;
1022
+ float aRefractionIdx = 0.0;
1023
+
1024
+ for (int aDepth = 0; aDepth < NB_BOUNCES; ++aDepth)
1025
+ {
1026
+ SIntersect aHit = SIntersect (MAXFLOAT, vec2 (ZERO), ZERO);
1027
+
1028
+ ivec4 aTriIndex = SceneNearestHit (theRay, theInverse, aHit, aTrsfId).TriIndex;
1029
+
1030
+ if (aTriIndex.x == -1)
1031
+ {
1032
+ vec4 aColor = vec4 (0.0);
1033
+
1034
+ if (bool(uEnvMapForBack) || aWeight.w == 0.0 /* reflection */)
1035
+ {
1036
+ float aRadius = uSceneRadius;
1037
+ vec3 aTexCoord = vec3 (0.0);
1038
+
1039
+ if (aDepth == 0 || (aRefractionIdx == 1.0 && aWeight.w != 0.0))
1040
+ {
1041
+ vec2 aPixel = uEyeSize * (vPixel - vec2 (0.5)) * 2.0;
1042
+ vec2 anAperturePnt = sampleUniformDisk() * uApertureRadius;
1043
+ vec3 aLocalDir = normalize (vec3 (aPixel * uFocalPlaneDist - anAperturePnt, uFocalPlaneDist));
1044
+ vec3 aDirect = uEyeView * aLocalDir.z +
1045
+ uEyeSide * aLocalDir.x +
1046
+ uEyeVert * aLocalDir.y;
1047
+
1048
+ aTexCoord = aDirect * uSceneRadius;
1049
+ aRadius = length (aTexCoord);
1050
+ }
1051
+ else
1052
+ {
1053
+ float aTime = IntersectSphere (theRay, uSceneRadius);
1054
+ aTexCoord = theRay.Direct * aTime + theRay.Origin;
1055
+ }
1056
+
1057
+ aColor = FetchEnvironment (aTexCoord, aRadius, aWeight.w != 0.0);
1058
+ }
1059
+ else
1060
+ {
1061
+ aColor = BackgroundColor();
1062
+ }
1063
+
1064
+ aResult += aWeight.xyz * aColor.xyz; aWeight.w *= aColor.w;
1065
+
1066
+ break; // terminate path
1067
+ }
1068
+
1069
+ vec3 aInvTransf0 = texelFetch (uSceneTransformTexture, aTrsfId + 0).xyz;
1070
+ vec3 aInvTransf1 = texelFetch (uSceneTransformTexture, aTrsfId + 1).xyz;
1071
+ vec3 aInvTransf2 = texelFetch (uSceneTransformTexture, aTrsfId + 2).xyz;
1072
+
1073
+ aHit.Normal = normalize (vec3 (dot (aInvTransf0, aHit.Normal),
1074
+ dot (aInvTransf1, aHit.Normal),
1075
+ dot (aInvTransf2, aHit.Normal)));
1076
+
1077
+ theRay.Origin += theRay.Direct * aHit.Time; // intersection point
1078
+
1079
+ // Evaluate depth on first hit
1080
+ if (aDepth == 0)
1081
+ {
1082
+ vec4 aNDCPoint = uViewMat * vec4 (theRay.Origin, 1.f);
1083
+
1084
+ float aPolygonOffset = PolygonOffset (aHit.Normal, theRay.Origin);
1085
+ #ifdef THE_ZERO_TO_ONE_DEPTH
1086
+ aRaytraceDepth = (aNDCPoint.z / aNDCPoint.w + aPolygonOffset * POLYGON_OFFSET_SCALE);
1087
+ #else
1088
+ aRaytraceDepth = (aNDCPoint.z / aNDCPoint.w + aPolygonOffset * POLYGON_OFFSET_SCALE) * 0.5f + 0.5f;
1089
+ #endif
1090
+ }
1091
+
1092
+ vec3 aNormal = SmoothNormal (aHit.UV, aTriIndex);
1093
+
1094
+ aNormal = normalize (vec3 (dot (aInvTransf0, aNormal),
1095
+ dot (aInvTransf1, aNormal),
1096
+ dot (aInvTransf2, aNormal)));
1097
+
1098
+ vec3 aAmbient = texelFetch (
1099
+ uRaytraceMaterialTexture, MATERIAL_AMBN (aTriIndex.w)).rgb;
1100
+ vec4 aDiffuse = texelFetch (
1101
+ uRaytraceMaterialTexture, MATERIAL_DIFF (aTriIndex.w));
1102
+ vec4 aSpecular = texelFetch (
1103
+ uRaytraceMaterialTexture, MATERIAL_SPEC (aTriIndex.w));
1104
+ vec4 aOpacity = texelFetch (
1105
+ uRaytraceMaterialTexture, MATERIAL_TRAN (aTriIndex.w));
1106
+
1107
+ #ifdef USE_TEXTURES
1108
+ if (aDiffuse.w >= 0.f)
1109
+ {
1110
+ vec4 aTexCoord = vec4 (SmoothUV (aHit.UV, aTriIndex), 0.f, 1.f);
1111
+
1112
+ vec4 aTrsfRow1 = texelFetch (
1113
+ uRaytraceMaterialTexture, MATERIAL_TRS1 (aTriIndex.w));
1114
+ vec4 aTrsfRow2 = texelFetch (
1115
+ uRaytraceMaterialTexture, MATERIAL_TRS2 (aTriIndex.w));
1116
+
1117
+ aTexCoord.st = vec2 (dot (aTrsfRow1, aTexCoord),
1118
+ dot (aTrsfRow2, aTexCoord));
1119
+
1120
+ vec4 aTexColor = textureLod (
1121
+ sampler2D (uTextureSamplers[int(aDiffuse.w)]), aTexCoord.st, 0.f);
1122
+
1123
+ aDiffuse.rgb *= aTexColor.rgb;
1124
+ aAmbient.rgb *= aTexColor.rgb;
1125
+
1126
+ // keep refractive index untouched (Z component)
1127
+ aOpacity.xy = vec2 (aTexColor.w * aOpacity.x, 1.0f - aTexColor.w * aOpacity.x);
1128
+ }
1129
+ #endif
1130
+
1131
+ vec3 aEmission = texelFetch (
1132
+ uRaytraceMaterialTexture, MATERIAL_EMIS (aTriIndex.w)).rgb;
1133
+
1134
+ float aGeomFactor = dot (aNormal, theRay.Direct);
1135
+
1136
+ aResult.xyz += aWeight.xyz * aOpacity.x * (
1137
+ uGlobalAmbient.xyz * aAmbient * max (abs (aGeomFactor), 0.5f) + aEmission);
1138
+
1139
+ vec3 aSidedNormal = mix (aNormal, -aNormal, step (0.0f, aGeomFactor));
1140
+
1141
+ for (int aLightIdx = 0; aLightIdx < uLightCount; ++aLightIdx)
1142
+ {
1143
+ vec4 aLight = texelFetch (
1144
+ uRaytraceLightSrcTexture, LIGHT_POS (aLightIdx));
1145
+
1146
+ float aDistance = MAXFLOAT;
1147
+
1148
+ if (aLight.w != 0.0f) // point light source
1149
+ {
1150
+ aDistance = length (aLight.xyz -= theRay.Origin);
1151
+
1152
+ aLight.xyz *= 1.0f / aDistance;
1153
+ }
1154
+
1155
+ float aLdotN = dot (aLight.xyz, aSidedNormal);
1156
+
1157
+ if (aLdotN > 0.0f) // first check if light source is important
1158
+ {
1159
+ float aVisibility = 1.0f;
1160
+
1161
+ if (bool(uShadowsEnabled))
1162
+ {
1163
+ SRay aShadow = SRay (theRay.Origin, aLight.xyz);
1164
+
1165
+ aShadow.Origin += uSceneEpsilon * (aLight.xyz +
1166
+ mix (-aHit.Normal, aHit.Normal, step (0.0f, dot (aHit.Normal, aLight.xyz))));
1167
+
1168
+ vec3 aInverse = 1.0f / max (abs (aLight.xyz), SMALL);
1169
+
1170
+ aVisibility = SceneAnyHit (
1171
+ aShadow, mix (-aInverse, aInverse, step (ZERO, aLight.xyz)), aDistance);
1172
+ }
1173
+
1174
+ if (aVisibility > 0.0f)
1175
+ {
1176
+ vec3 aIntensity = min (UNIT, vec3 (texelFetch (
1177
+ uRaytraceLightSrcTexture, LIGHT_PWR (aLightIdx))));
1178
+
1179
+ float aRdotV = dot (reflect (aLight.xyz, aSidedNormal), theRay.Direct);
1180
+
1181
+ aResult.xyz += aWeight.xyz * (aOpacity.x * aVisibility) * aIntensity *
1182
+ (aDiffuse.xyz * aLdotN + aSpecular.xyz * pow (max (0.f, aRdotV), aSpecular.w));
1183
+ }
1184
+ }
1185
+ }
1186
+
1187
+ if (aOpacity.x != 1.0f)
1188
+ {
1189
+ aWeight *= aOpacity.y;
1190
+ aRefractionIdx = aOpacity.z;
1191
+
1192
+ if (aOpacity.z != 1.0f)
1193
+ {
1194
+ theRay.Direct = Refract (theRay.Direct, aNormal, aOpacity.z, aOpacity.w);
1195
+ }
1196
+ }
1197
+ else
1198
+ {
1199
+ aWeight *= bool(uReflectEnabled) ?
1200
+ texelFetch (uRaytraceMaterialTexture, MATERIAL_REFL (aTriIndex.w)) : vec4 (0.0f);
1201
+
1202
+ vec3 aReflect = reflect (theRay.Direct, aNormal);
1203
+
1204
+ if (dot (aReflect, aHit.Normal) * dot (theRay.Direct, aHit.Normal) > 0.0f)
1205
+ {
1206
+ aReflect = reflect (theRay.Direct, aHit.Normal);
1207
+ }
1208
+
1209
+ theRay.Direct = aReflect;
1210
+ }
1211
+
1212
+ if (all (lessThanEqual (aWeight.xyz, THRESHOLD)))
1213
+ {
1214
+ aDepth = INVALID_BOUNCES;
1215
+ }
1216
+ else if (aOpacity.x == 1.0f || aOpacity.z != 1.0f) // if no simple transparency
1217
+ {
1218
+ theRay.Origin += aHit.Normal * mix (
1219
+ -uSceneEpsilon, uSceneEpsilon, step (0.0f, dot (aHit.Normal, theRay.Direct)));
1220
+
1221
+ theInverse = 1.0f / max (abs (theRay.Direct), SMALL);
1222
+
1223
+ theInverse = mix (-theInverse, theInverse, step (ZERO, theRay.Direct));
1224
+ }
1225
+
1226
+ theRay.Origin += theRay.Direct * uSceneEpsilon;
1227
+ }
1228
+
1229
+ gl_FragDepth = aRaytraceDepth;
1230
+
1231
+ return vec4 (aResult.x,
1232
+ aResult.y,
1233
+ aResult.z,
1234
+ aWeight.w);
1235
+ }
1236
+ #endif