@woosh/meep-engine 3.27.0 → 3.28.0

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 (255) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/geom/3d/mat4/m4_linear_determinant.d.ts +15 -0
  4. package/src/core/geom/3d/mat4/m4_linear_determinant.d.ts.map +1 -0
  5. package/src/core/geom/3d/mat4/m4_linear_determinant.js +24 -0
  6. package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts +4 -2
  7. package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts.map +1 -1
  8. package/src/core/geom/3d/mat4/m4_normal_matrix3.js +21 -11
  9. package/src/engine/Engine.d.ts.map +1 -1
  10. package/src/engine/Engine.js +38 -1
  11. package/src/engine/graphics3/GraphicsEngine.d.ts +5 -1
  12. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  13. package/src/engine/graphics3/GraphicsEngine.js +834 -830
  14. package/src/shade/RENDERER_CONTRACT.md +19 -10
  15. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +1 -1
  16. package/src/shade/playground/vgeo_runtime/README.md +27 -13
  17. package/src/shade/playground/vgeo_runtime/main.js +18 -5
  18. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts +18 -0
  19. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -0
  20. package/src/shade/playground/{vgeo_viewer → vgeo_runtime}/sample_asset.js +9 -8
  21. package/src/shade/playground/vgeo_scene/README.md +408 -0
  22. package/src/shade/playground/vgeo_scene/index.html +144 -0
  23. package/src/shade/playground/vgeo_scene/main.d.ts +2 -0
  24. package/src/shade/playground/vgeo_scene/main.d.ts.map +1 -0
  25. package/src/shade/playground/vgeo_scene/main.js +1716 -0
  26. package/src/shade/renderer/Renderer.d.ts +4 -1
  27. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  28. package/src/shade/renderer/Renderer.js +5 -2
  29. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +1 -2
  30. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
  31. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +3 -29
  32. package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts +22 -0
  33. package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts.map +1 -0
  34. package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.js +49 -0
  35. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +4 -2
  36. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +10 -8
  37. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +12 -11
  38. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +1 -1
  39. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  40. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +1 -1
  41. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.d.ts.map +1 -1
  42. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js +5 -9
  43. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevel.d.ts +32 -0
  44. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevel.d.ts.map +1 -0
  45. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts +59 -0
  46. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -0
  47. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts +44 -0
  48. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts.map +1 -0
  49. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts +36 -0
  50. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -0
  51. package/src/shade/renderer/geometry/virtual/build/{vgeo_build_levels.js → level/vgeo_build_levels.js} +61 -95
  52. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.d.ts +19 -0
  53. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.d.ts.map +1 -0
  54. package/src/shade/renderer/geometry/virtual/build/{vgeo_build_root_group.js → level/vgeo_build_root_group.js} +1 -1
  55. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts +73 -0
  56. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -0
  57. package/src/shade/renderer/geometry/virtual/build/{VirtualGeometryMesh.js → mesh/VirtualGeometryMesh.js} +7 -7
  58. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +29 -0
  59. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -0
  60. package/src/shade/renderer/geometry/virtual/build/{vgeo_compute_vertex_normals.js → mesh/vgeo_compute_vertex_normals.js} +3 -3
  61. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts +31 -0
  62. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts.map +1 -0
  63. package/src/shade/renderer/geometry/virtual/build/{vgeo_compute_vertex_tangents.js → mesh/vgeo_compute_vertex_tangents.js} +5 -5
  64. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +46 -0
  65. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -0
  66. package/src/shade/renderer/geometry/virtual/build/{vgeo_normalize_source.js → mesh/vgeo_normalize_source.js} +9 -9
  67. package/src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.d.ts +13 -0
  68. package/src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.d.ts.map +1 -0
  69. package/src/shade/renderer/geometry/virtual/build/{vgeo_assemble_pages.js → page/vgeo_assemble_pages.js} +9 -9
  70. package/src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.d.ts +13 -0
  71. package/src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.d.ts.map +1 -0
  72. package/src/shade/renderer/geometry/virtual/build/{vgeo_build_page_nodes.js → page/vgeo_build_page_nodes.js} +4 -4
  73. package/src/shade/renderer/geometry/virtual/build/page/vgeo_page_node_count.d.ts +22 -0
  74. package/src/shade/renderer/geometry/virtual/build/page/vgeo_page_node_count.d.ts.map +1 -0
  75. package/src/shade/renderer/geometry/virtual/build/{vgeo_page_node_count.js → page/vgeo_page_node_count.js} +2 -2
  76. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts +52 -0
  77. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -0
  78. package/src/shade/renderer/geometry/virtual/build/{VGeoFaceGraph.js → partition/VGeoFaceGraph.js} +1 -1
  79. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts +14 -0
  80. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -0
  81. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_graph.d.ts +29 -0
  82. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_graph.d.ts.map +1 -0
  83. package/src/shade/renderer/geometry/virtual/build/{vgeo_partition_graph.js → partition/vgeo_partition_graph.js} +2 -2
  84. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts +41 -0
  85. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts.map +1 -0
  86. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.js +92 -0
  87. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.d.ts +10 -0
  88. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.d.ts.map +1 -0
  89. package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set.js → partition/vgeo_split_face_set.js} +12 -55
  90. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts +15 -0
  91. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -0
  92. package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set_packed.js → partition/vgeo_split_face_set_packed.js} +3 -3
  93. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_bounding_sphere.d.ts +12 -0
  94. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_bounding_sphere.d.ts.map +1 -0
  95. package/src/shade/renderer/geometry/virtual/build/{vgeo_bounding_sphere.js → sphere/vgeo_bounding_sphere.js} +3 -3
  96. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_containing_sphere.d.ts +18 -0
  97. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_containing_sphere.d.ts.map +1 -0
  98. package/src/shade/renderer/geometry/virtual/build/{vgeo_containing_sphere.js → sphere/vgeo_containing_sphere.js} +3 -3
  99. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_sphere_inflate_to_contain.d.ts +9 -0
  100. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_sphere_inflate_to_contain.d.ts.map +1 -0
  101. package/src/shade/renderer/geometry/virtual/build/{vgeo_sphere_inflate_to_contain.js → sphere/vgeo_sphere_inflate_to_contain.js} +1 -1
  102. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +24 -0
  103. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -0
  104. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +20 -0
  105. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -0
  106. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +14 -0
  107. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -0
  108. package/src/shade/renderer/geometry/virtual/build/{vgeo_extract_submesh.js → submesh/vgeo_extract_submesh.js} +5 -5
  109. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +12 -0
  110. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -0
  111. package/src/shade/renderer/geometry/virtual/build/{vgeo_gather_faces.js → submesh/vgeo_gather_faces.js} +2 -2
  112. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.d.ts +11 -0
  113. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.d.ts.map +1 -0
  114. package/src/shade/renderer/geometry/virtual/build/{vgeo_narrow_indices.js → submesh/vgeo_narrow_indices.js} +3 -3
  115. package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
  116. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +9 -11
  117. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.d.ts +8 -2
  118. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.d.ts.map +1 -1
  119. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.js +8 -2
  120. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.d.ts +15 -0
  121. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.d.ts.map +1 -0
  122. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.js +15 -0
  123. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts +28 -0
  124. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts.map +1 -1
  125. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +7 -3
  126. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
  127. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +9 -4
  128. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  129. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +18 -5
  130. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  131. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +9 -1
  132. package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +21 -2
  133. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +52 -2
  134. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  135. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +97 -1
  136. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +4 -4
  137. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
  138. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +10 -0
  139. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -1
  140. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +59 -34
  141. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts +8 -8
  142. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
  143. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +11 -88
  144. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts +19 -0
  145. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -0
  146. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +98 -0
  147. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts +31 -0
  148. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -0
  149. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +99 -0
  150. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts +17 -0
  151. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts.map +1 -0
  152. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.js +39 -0
  153. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts.map +1 -1
  154. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.js +7 -63
  155. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -1
  156. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +13 -30
  157. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
  158. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +6 -52
  159. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  160. package/src/shade/renderer/loader/gltf/load_gltf.js +0 -19
  161. package/src/shade/renderer/material/chunk_material_draw_side.d.ts +14 -0
  162. package/src/shade/renderer/material/chunk_material_draw_side.d.ts.map +1 -0
  163. package/src/shade/renderer/material/chunk_material_draw_side.js +34 -0
  164. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
  165. package/src/shade/renderer/material/standard/fragment_gbuffer.js +8 -1
  166. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
  167. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +13 -1
  168. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +19 -5
  169. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
  170. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +23 -5
  171. package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.d.ts.map +1 -1
  172. package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.js +12 -5
  173. package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.d.ts +22 -0
  174. package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.d.ts.map +1 -0
  175. package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.js +36 -0
  176. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts +15 -0
  177. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts.map +1 -0
  178. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.js +35 -0
  179. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts +10 -1
  180. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts.map +1 -1
  181. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.js +38 -29
  182. package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts +5 -0
  183. package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts.map +1 -1
  184. package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.js +63 -55
  185. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts.map +1 -1
  186. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js +1 -0
  187. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
  188. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +44 -53
  189. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
  190. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +6 -2
  191. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
  192. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +6 -2
  193. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -1
  194. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.js +19 -2
  195. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +7 -4
  196. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  197. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +3 -2
  198. package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.d.ts.map +1 -1
  199. package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.js +15 -4
  200. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  201. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +16 -5
  202. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.d.ts.map +1 -1
  203. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +16 -5
  204. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  205. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +2 -1
  206. package/src/shade/renderer/rasterize/native/rasterization_shader_resources.d.ts.map +1 -1
  207. package/src/shade/renderer/rasterize/native/rasterization_shader_resources.js +4 -0
  208. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  209. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +16 -7
  210. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  211. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +78 -88
  212. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  213. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +21 -31
  214. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  215. package/src/shade/renderer/scene/GPUSceneContext.js +2 -0
  216. package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +19 -0
  217. package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts.map +1 -1
  218. package/src/shade/renderer/scene/NODE3D_STRUCT.js +34 -0
  219. package/src/shade/renderer/scene/chunk_node3d_flags.d.ts +9 -0
  220. package/src/shade/renderer/scene/chunk_node3d_flags.d.ts.map +1 -0
  221. package/src/shade/renderer/scene/chunk_node3d_flags.js +23 -0
  222. package/src/shade/renderer/scene/chunk_scene_database_access.d.ts.map +1 -1
  223. package/src/shade/renderer/scene/chunk_scene_database_access.js +15 -1
  224. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
  225. package/src/shade/renderer/scene/rows/GPUSceneRows.js +9 -1
  226. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts +7 -0
  227. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts.map +1 -1
  228. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.js +16 -4
  229. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts +12 -0
  230. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts.map +1 -0
  231. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.js +18 -0
  232. package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts +24 -0
  233. package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts.map +1 -0
  234. package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.js +33 -0
  235. package/src/shade/playground/vgeo_viewer/README.md +0 -150
  236. package/src/shade/playground/vgeo_viewer/cut_geometry.js +0 -460
  237. package/src/shade/playground/vgeo_viewer/index.html +0 -77
  238. package/src/shade/playground/vgeo_viewer/main.js +0 -1343
  239. package/src/shade/playground/vgeo_viewer/select_cut.js +0 -481
  240. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts +0 -258
  241. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts.map +0 -1
  242. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts +0 -49
  243. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts.map +0 -1
  244. package/src/shade/renderer/loader/gltf/fix_up_material_sides.js +0 -109
  245. package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.js +0 -78
  246. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.js +0 -100
  247. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.js +0 -26
  248. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.d.ts +0 -3
  249. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.d.ts.map +0 -1
  250. /package/src/shade/renderer/geometry/virtual/build/{VGeoLevel.js → level/VGeoLevel.js} +0 -0
  251. /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelOptions.js → level/VGeoLevelOptions.js} +0 -0
  252. /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelSummary.js → level/VGeoLevelSummary.js} +0 -0
  253. /package/src/shade/renderer/geometry/virtual/build/{vgeo_graph_components.js → partition/vgeo_graph_components.js} +0 -0
  254. /package/src/shade/renderer/geometry/virtual/build/{VGeoGatheredFaces.js → submesh/VGeoGatheredFaces.js} +0 -0
  255. /package/src/shade/renderer/geometry/virtual/build/{VGeoSubmesh.js → submesh/VGeoSubmesh.js} +0 -0
@@ -61,8 +61,9 @@ stacked-card case the way the reference did and MBOIT did not. MBOIT stays selec
61
61
  Its orchestrator [`graph_rasterize_meshes_transparent_oit.js`](../oit/graph_rasterize_meshes_transparent_oit.js)
62
62
  records, per frame:
63
63
 
64
- 1. `filter_materials_by_bucket` twice — `(Transparent, Triangles, Front)` and `(…, Double)`;
65
- `ShadeDrawSide.Back` transparent materials are dropped ([`:545-561`](../oit/graph_rasterize_meshes_transparent_oit.js)).
64
+ 1. `filter_materials_by_bucket` twice — `(Transparent, Triangles, Front)` and `(…, Double)`.
65
+ *2026-09-16: `ShadeDrawSide.Back` transparent materials used to be dropped here. They are not any
66
+ more — `Back` and `Front` are one bucket now, so asking for either returns both.*
66
67
  2. `graph_prepare_meshlet_draw_commands_by_material` twice — copy bucket, HZB mesh filter, expand to meshlets,
67
68
  HZB meshlet filter, count/scan/sort by material, build one indirect draw command per material.
68
69
  3. `MBOIT/generate moments` twice (front clears, double loads) — additive MRT into `r32float` + `rgba32float`,
@@ -486,8 +487,10 @@ unambiguous, must not break anything else, and must not be situational:
486
487
  known to be that.
487
488
  - **Sparse voxel texture** (slide 122) — *no*. The deck's own future work.
488
489
  - **Chroma skew** (§4).
489
- - **`ShadeDrawSide.Back` transparent materials** — dropped today by MBOIT; the same filter is used here so the
490
- two modes draw the same set. Fixing it is a bucket-filter change that belongs to both.
490
+ - **`ShadeDrawSide.Back` transparent materials** — ~~dropped today by MBOIT; the same filter is used here so
491
+ the two modes draw the same set. Fixing it is a bucket-filter change that belongs to both.~~ **Done,
492
+ 2026-09-16 (`ca95ad3ac`)**, and it was the bucket-filter change this predicted: `Back` is `Front` with
493
+ the winding reversed in the vertex shader, so both modes draw it and neither needed a third pass.
491
494
  - **Exposing the tunables on `Renderer`** — the constants in `AVBOIT_CONSTANTS.js` are the knobs; whether any
492
495
  deserves a public field is a question for after the page in §6 has been looked at. *Revision 2:* one did —
493
496
  the transmission tint, because it changes a material's meaning rather than a quality/cost trade; it lives
@@ -1 +1 @@
1
- {"version":3,"file":"graph_rasterize_meshes_transparent_avboit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js"],"names":[],"mappings":"AAgEA;;;;;GAKG;AACH,oDAHW,UAAU,MAAM,CAAC,GACf,MAAM,EAAE,CAOpB;AAED;;;;;;;;;;;;GAYG;AACH;IAT+B,KAAK;IACA,KAAK;IACd,MAAM,EAAtB,MAAM;IACqB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACD,kBAAkB,EAAlC,MAAM;IACU,wBAAwB,EAAxC,MAAM;IACW,SAAS,GAA1B,MAAM;IACJ,MAAM,CA4DlB;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,SAAS,EAAzB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACmB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACQ,MAAM,GAA/B,cAAc;IACZ,MAAM,CAsDlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,6KAFa;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAkJjE;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,IAAI,EAApB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,QAAQ,EAAxB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACN,MAAM,CAoClB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qUAFa;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAyN7D;AAED;;;;;;;;GAQG;AACH,+EAHW,UAAU,MAAM,CAAC,GACf;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAe/E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH;IAnB+B,KAAK;IACT,OAAO,EAAvB,MAAM;IACkB,QAAQ;IACd,QAAQ,EAA1B,MAAM,EAAE;IACQ,aAAa,EAA7B,MAAM;IACU,aAAa,EAA7B,MAAM;IACuB,MAAM;IACnB,wBAAwB,EAAxC,MAAM;IACU,oBAAoB,EAApC,MAAM;IACU,kBAAkB,EAAlC,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,oBAAoB,EAApC,MAAM;IAC6B,sBAAsB,EAAzD,yBAAyB;IACA,MAAM,GAA/B,cAAc;IACiD,aAAa,GAA5E,OAAO,wBAAwB,EAAE,iBAAiB,EAAE;IAElD,MAAM,CAqRlB;+BA97B8B,qBAAqB;0CA7BV,uCAAuC"}
1
+ {"version":3,"file":"graph_rasterize_meshes_transparent_avboit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js"],"names":[],"mappings":"AAgEA;;;;;GAKG;AACH,oDAHW,UAAU,MAAM,CAAC,GACf,MAAM,EAAE,CAOpB;AAED;;;;;;;;;;;;GAYG;AACH;IAT+B,KAAK;IACA,KAAK;IACd,MAAM,EAAtB,MAAM;IACqB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACD,kBAAkB,EAAlC,MAAM;IACU,wBAAwB,EAAxC,MAAM;IACW,SAAS,GAA1B,MAAM;IACJ,MAAM,CA4DlB;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,SAAS,EAAzB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACmB,kBAAkB,EAA7C,UAAU,MAAM,CAAC;IACQ,MAAM,GAA/B,cAAc;IACZ,MAAM,CAsDlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,6KAFa;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAkJjE;AAED;;;;;;;;;;GAUG;AACH;IAP+B,KAAK;IACT,IAAI,EAApB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,QAAQ,EAAxB,MAAM;IACY,gBAAgB,EAAlC,MAAM,EAAE;IACN,MAAM,CAoClB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qUAFa;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAyN7D;AAED;;;;;;;;GAQG;AACH,+EAHW,UAAU,MAAM,CAAC,GACf;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAe/E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH;IAnB+B,KAAK;IACT,OAAO,EAAvB,MAAM;IACkB,QAAQ;IACd,QAAQ,EAA1B,MAAM,EAAE;IACQ,aAAa,EAA7B,MAAM;IACU,aAAa,EAA7B,MAAM;IACuB,MAAM;IACnB,wBAAwB,EAAxC,MAAM;IACU,oBAAoB,EAApC,MAAM;IACU,kBAAkB,EAAlC,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,eAAe,EAA/B,MAAM;IACU,oBAAoB,EAApC,MAAM;IAC6B,sBAAsB,EAAzD,yBAAyB;IACA,MAAM,GAA/B,cAAc;IACiD,aAAa,GAA5E,OAAO,wBAAwB,EAAE,iBAAiB,EAAE;IAElD,MAAM,CAsRlB;+BA/7B8B,qBAAqB;0CA7BV,uCAAuC"}
@@ -768,8 +768,9 @@ export function graph_rasterize_meshes_transparent_avboit({
768
768
 
769
769
  const scene_materials = scene_ctx.drawn_materials;
770
770
 
771
- // Front-sided and double-sided materials need different pipeline states, so every raster pass
772
- // below runs twice. `ShadeDrawSide.Back` is not drawn, the same as under MBOIT (plan §7).
771
+ // Single-sided and double-sided materials need different pipeline states, so every raster pass
772
+ // below runs twice. `ShadeDrawSide.Back` is single-sided and rides in the `Front` bucket — the
773
+ // vertex shader reverses its winding — so unlike under MBOIT (plan §7) it is drawn.
773
774
  const material_count_front = filter_materials_by_bucket(
774
775
  materials_front, 0,
775
776
  TransparencyMode.Transparent,
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_rasterize_triangle.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/native/chunk_rasterize_triangle.js"],"names":[],"mappings":"AAaA,iDA+CC;0BAlDyB,oCAAoC"}
1
+ {"version":3,"file":"chunk_rasterize_triangle.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/native/chunk_rasterize_triangle.js"],"names":[],"mappings":"AAiBA,iDAsDC;0BAzDyB,oCAAoC"}
@@ -1,4 +1,8 @@
1
+ import { chunk_triangle_winding_is_reversed } from "../chunk_triangle_winding_is_reversed.js";
1
2
  import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
3
+ import {
4
+ chunk_triangle_list_reverse_winding
5
+ } from "../../shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.js";
2
6
  import {
3
7
  chunk_encode_meshlet_element
4
8
  } from "../../shader/chunk/geometry/meshlet/chunk_encode_meshlet_element.js";
@@ -23,9 +27,17 @@ fn rasterize_triangle(
23
27
 
24
28
  let meshlet_header = meshlet_metadata[meshlet_id];
25
29
 
30
+ let mesh = scene_read_mesh(&scene_database, mesh_index);
31
+ let node = scene_read_node(&scene_database, mesh.node);
32
+
33
+ let draw_index = triangle_list_reverse_winding(
34
+ meshlet_vertex_id,
35
+ triangle_winding_is_reversed(node, materials[mesh.material].draw_side)
36
+ );
37
+
26
38
  let last_draw_index = meshlet_header.primitive_count * 3u - 1u;
27
39
 
28
- let clamped_vertex = min(meshlet_vertex_id, last_draw_index );
40
+ let clamped_vertex = min(draw_index, last_draw_index );
29
41
 
30
42
  let triangle_index = clamped_vertex / 3u;
31
43
 
@@ -44,9 +56,6 @@ fn rasterize_triangle(
44
56
  index:'meshlet_triangle_index',
45
57
  })};
46
58
 
47
- let mesh = scene_read_mesh(&scene_database, mesh_index);
48
- let node = scene_read_node(&scene_database, mesh.node);
49
-
50
59
  let projection_matrix = camera.view_projection_matrix;
51
60
 
52
61
  return projection_matrix * node.global * vec4(geometry_position, 1.0);
@@ -57,6 +66,8 @@ fn rasterize_triangle(
57
66
  chunk_read_meshlet_vertex_position,
58
67
  chunk_read_meshlet_resolved_index,
59
68
  chunk_scene_database_access,
69
+ chunk_triangle_winding_is_reversed,
70
+ chunk_triangle_list_reverse_winding,
60
71
  ]
61
72
  )
62
73
 
@@ -1 +1 @@
1
- {"version":3,"file":"shadow_rasterization_alpha_tested_pass_descriptor.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js"],"names":[],"mappings":"AAuIA,qFAA4F;qCAzHvD,8CAA8C"}
1
+ {"version":3,"file":"shadow_rasterization_alpha_tested_pass_descriptor.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js"],"names":[],"mappings":"AAkJA,qFAA4F;qCAhIvD,8CAA8C"}
@@ -1,6 +1,10 @@
1
1
  import { RenderPipelineDescriptor } from "../../../../descriptor/pipeline/render/RenderPipelineDescriptor.js";
2
2
  import { DEPTH_BACKGROUND_VALUE } from "../../../depth/DEPTH_BACKGROUND_VALUE.js";
3
+ import { chunk_triangle_winding_is_reversed } from "../../chunk_triangle_winding_is_reversed.js";
3
4
  import { chunk_scene_database_access } from "../../../scene/chunk_scene_database_access.js";
5
+ import {
6
+ chunk_triangle_list_reverse_winding
7
+ } from "../../../shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.js";
4
8
  import {
5
9
  chunk_read_meshlet_resolved_index
6
10
  } from "../../../shader/chunk/geometry/meshlet/chunk_read_meshlet_resolved_index.js";
@@ -88,16 +92,21 @@ fn main(
88
92
  return output; // discard vertex outside of meshlet bounds
89
93
  }
90
94
 
95
+ let mesh = scene_read_mesh(&scene_database, mesh_id);
96
+ let node = scene_read_node(&scene_database, mesh.node);
97
+
98
+ let draw_index = triangle_list_reverse_winding(
99
+ vertex_draw_index,
100
+ triangle_winding_is_reversed(node, material.draw_side)
101
+ );
102
+
91
103
  // resolve vertex from index
92
- let resolved_vertex_id = read_meshlet_resolved_index(meshlet_header, vertex_draw_index);
93
-
104
+ let resolved_vertex_id = read_meshlet_resolved_index(meshlet_header, draw_index);
105
+
94
106
  let meshlet_vertex = read_meshlet_vertex_uv_position(
95
107
  meshlet_header,
96
108
  resolved_vertex_id,
97
109
  );
98
-
99
- let mesh = scene_read_mesh(&scene_database, mesh_id);
100
- let node = scene_read_node(&scene_database, mesh.node);
101
110
 
102
111
  let position_world = node.global * vec4(meshlet_vertex.position, 1.0);
103
112
 
@@ -112,6 +121,8 @@ fn main(
112
121
  chunk_read_meshlet_vertex_uv_position,
113
122
  chunk_read_meshlet_resolved_index,
114
123
  chunk_scene_database_access,
124
+ chunk_triangle_winding_is_reversed,
125
+ chunk_triangle_list_reverse_winding,
115
126
  ]
116
127
  )
117
128
  });
@@ -1 +1 @@
1
- {"version":3,"file":"shadow_rasterization_pass_descriptor.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js"],"names":[],"mappings":"AAwEA,wEAA+E;qCA3D1C,8CAA8C"}
1
+ {"version":3,"file":"shadow_rasterization_pass_descriptor.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js"],"names":[],"mappings":"AAmFA,wEAA+E;qCAlE1C,8CAA8C"}
@@ -1,6 +1,10 @@
1
1
  import { RenderPipelineDescriptor } from "../../../../descriptor/pipeline/render/RenderPipelineDescriptor.js";
2
2
  import { DEPTH_BACKGROUND_VALUE } from "../../../depth/DEPTH_BACKGROUND_VALUE.js";
3
+ import { chunk_triangle_winding_is_reversed } from "../../chunk_triangle_winding_is_reversed.js";
3
4
  import { chunk_scene_database_access } from "../../../scene/chunk_scene_database_access.js";
5
+ import {
6
+ chunk_triangle_list_reverse_winding
7
+ } from "../../../shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.js";
4
8
  import {
5
9
  chunk_encode_meshlet_element
6
10
  } from "../../../shader/chunk/geometry/meshlet/chunk_encode_meshlet_element.js";
@@ -40,16 +44,21 @@ fn main(
40
44
  return vec4f(); // discard vertex outside of meshlet bounds
41
45
  }
42
46
 
47
+ let mesh = scene_read_mesh(&scene_database, mesh_id);
48
+ let node = scene_read_node(&scene_database, mesh.node);
49
+
50
+ let draw_index = triangle_list_reverse_winding(
51
+ vertex_draw_index,
52
+ triangle_winding_is_reversed(node, materials[mesh.material].draw_side)
53
+ );
54
+
43
55
  // resolve vertex from index
44
- let resolved_vertex_id = read_meshlet_resolved_index(meshlet_header, vertex_draw_index);
45
-
56
+ let resolved_vertex_id = read_meshlet_resolved_index(meshlet_header, draw_index);
57
+
46
58
  let geometry_position = read_meshlet_vertex_position(
47
59
  meshlet_header,
48
60
  resolved_vertex_id,
49
61
  );
50
-
51
- let mesh = scene_read_mesh(&scene_database, mesh_id);
52
- let node = scene_read_node(&scene_database, mesh.node);
53
62
 
54
63
  let projection_matrix = camera.view_projection_matrix;
55
64
 
@@ -62,6 +71,8 @@ fn main(
62
71
  chunk_read_meshlet_resolved_index,
63
72
  MESH_TRIANGLE_REFERENCE_STRUCT.declaration_chunk,
64
73
  chunk_scene_database_access,
74
+ chunk_triangle_winding_is_reversed,
75
+ chunk_triangle_list_reverse_winding,
65
76
  ]
66
77
  );
67
78
 
@@ -1 +1 @@
1
- {"version":3,"file":"graph_rasterize_meshes_transparent_oit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js"],"names":[],"mappings":"AAqaA;;;;;;;;;;;;;;;;GAgBG;AACH,uSAFa,MAAM,CAsOlB"}
1
+ {"version":3,"file":"graph_rasterize_meshes_transparent_oit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js"],"names":[],"mappings":"AAqaA;;;;;;;;;;;;;;;;GAgBG;AACH,uSAFa,MAAM,CAuOlB"}
@@ -484,7 +484,8 @@ export function graph_rasterize_meshes_transparent_oit({
484
484
  const scene_materials = scene_ctx.drawn_materials;
485
485
 
486
486
  // we need to draw with different pipeline states, so the code is a little convoluted
487
- // Essentially, we draw Double-side and Front-sided materials
487
+ // Essentially, we draw double-sided and single-sided materials. `ShadeDrawSide.Back` is
488
+ // single-sided and rides in the `Front` bucket — the vertex shader reverses its winding.
488
489
 
489
490
  const material_count_front = filter_materials_by_bucket(
490
491
  materials_front, 0,
@@ -1 +1 @@
1
- {"version":3,"file":"rasterization_shader_resources.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/native/rasterization_shader_resources.js"],"names":[],"mappings":"AASA,yEAAgF;4CALpC,sDAAsD"}
1
+ {"version":3,"file":"rasterization_shader_resources.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/native/rasterization_shader_resources.js"],"names":[],"mappings":"AAUA,yEAAgF;4CALpC,sDAAsD"}
@@ -1,6 +1,7 @@
1
1
  import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
2
  import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
3
  import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
4
+ import { MATERIAL_METADATA_STRUCT } from "../../material/MATERIAL_METADATA_STRUCT.js";
4
5
  import { MESHLET_COLLECTION_STRUCT } from "../MESHLET_COLLECTION_STRUCT.js";
5
6
  import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
6
7
  import { GEOMETRY_ATTRIBUTE_DATA_TYPE } from "../../geometry/GEOMETRY_ATTRIBUTE_DATA_TYPE.js";
@@ -16,4 +17,7 @@ rasterization_shader_resources.createGroup()
16
17
  .addStorageBuffer("meshlets", MESHLET_COLLECTION_STRUCT)
17
18
  .addStorageBuffer("meshlet_metadata", WebGPUArray.from(MESHLET_METADATA_STRUCT))
18
19
  .addStorageBuffer("meshlet_data", GEOMETRY_ATTRIBUTE_DATA_TYPE)
20
+ // one draw covers every material in the bucket, so the side a material draws is per-instance
21
+ // here rather than per-pass, the way the alpha-tested and forward passes can have it
22
+ .addStorageBuffer("materials", WebGPUArray.from(MATERIAL_METADATA_STRUCT))
19
23
  ;
@@ -1 +1 @@
1
- {"version":3,"file":"viz_rasterization_alpha_tested_pass_descriptor.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js"],"names":[],"mappings":"AAgLA,kFAAyF;qCA1JpD,8CAA8C"}
1
+ {"version":3,"file":"viz_rasterization_alpha_tested_pass_descriptor.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js"],"names":[],"mappings":"AAyLA,kFAAyF;qCA/JpD,8CAA8C"}
@@ -1,6 +1,10 @@
1
1
  import { RenderPipelineDescriptor } from "../../../../descriptor/pipeline/render/RenderPipelineDescriptor.js";
2
2
  import { DEPTH_BACKGROUND_VALUE } from "../../../depth/DEPTH_BACKGROUND_VALUE.js";
3
+ import { chunk_triangle_winding_is_reversed } from "../../chunk_triangle_winding_is_reversed.js";
3
4
  import { chunk_scene_database_access } from "../../../scene/chunk_scene_database_access.js";
5
+ import {
6
+ chunk_triangle_list_reverse_winding
7
+ } from "../../../shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.js";
4
8
  import { RENDER_GLOBAL_MIP_BIAS } from "../../../postprocess/taa/RENDER_GLOBAL_MIP_BIAS.js";
5
9
  import {
6
10
  chunk_encode_meshlet_element
@@ -114,17 +118,20 @@ fn main(
114
118
  }
115
119
 
116
120
  let triangle_index = encode_meshlet_element(meshlet_id, vertex_draw_index / 3u);
117
-
121
+
122
+ let mesh = scene_read_mesh(&scene_database, mesh_id);
123
+ let node = scene_read_node(&scene_database, mesh.node);
124
+
118
125
  let meshlet_vertex = read_meshlet_vertex_by_draw_index(
119
126
  meshlet_header,
120
- vertex_draw_index,
127
+ triangle_list_reverse_winding(
128
+ vertex_draw_index,
129
+ triangle_winding_is_reversed(node, material.draw_side)
130
+ ),
121
131
  );
122
-
132
+
123
133
  var output: VertexOutput;
124
-
125
- let mesh = scene_read_mesh(&scene_database, mesh_id);
126
- let node = scene_read_node(&scene_database, mesh.node);
127
-
134
+
128
135
  let instance_matrix = node.global;
129
136
 
130
137
  let position_world = instance_matrix * vec4(meshlet_vertex.position, 1.0);
@@ -144,6 +151,8 @@ fn main(
144
151
  chunk_encode_meshlet_element,
145
152
  chunk_read_meshlet_vertex_by_draw_index,
146
153
  chunk_scene_database_access,
154
+ chunk_triangle_winding_is_reversed,
155
+ chunk_triangle_list_reverse_winding,
147
156
  ]
148
157
  )
149
158
  });
@@ -1 +1 @@
1
- {"version":3,"file":"graph_rasterize_partial_opaque.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;GAeG;AACH,gMAFa;IAAC,eAAe,EAAC,MAAM,CAAC;IAAC,cAAc,EAAC,MAAM,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,EAAE,CAAA;CAAC,CA6MjG"}
1
+ {"version":3,"file":"graph_rasterize_partial_opaque.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;GAeG;AACH,gMAFa;IAAC,eAAe,EAAC,MAAM,CAAC;IAAC,cAAc,EAAC,MAAM,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,EAAE,CAAA;CAAC,CAmMjG"}
@@ -15,13 +15,13 @@ import {
15
15
  graph_build_indirect_dispatch_command,
16
16
  INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
17
17
  } from "../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
18
- import { rasterization_material_bucket } from "../expand/bucket/chunk_rasterization_material_bucket.js";
19
18
  import { graph_meshlets_rasterize } from "../expand/graph_meshlets_rasterize.js";
20
19
  import { graph_expand_meshes_to_meshlets } from "../expand/mesh/graph_expand_meshes_to_meshlets.js";
21
20
  import { graph_vgeo_expand_if_enabled } from "../../geometry/virtual/runtime/graph_vgeo_expand_if_enabled.js";
22
21
  import { MeshletFilter2WayPassData, pass_filter_meshlets_2way } from "../expand/pass1/pass_filter_meshlets_2way.js";
23
22
  import { RasterizationCollectionType } from "../expand/RasterizationCollectionType.js";
24
23
  import { construct_primitive_state, CullPolicy } from "../bucket/construct_primitive_state.js";
24
+ import { rasterization_opaque_buckets } from "../bucket/rasterization_opaque_buckets.js";
25
25
 
26
26
  /**
27
27
  *
@@ -144,93 +144,83 @@ export function graph_rasterize_partial_opaque({
144
144
 
145
145
  let is_first_draw = true;
146
146
 
147
- for (const draw_mode of Object.values(ShadeDrawMode)) {
148
- for (const side of Object.values(ShadeDrawSide)) {
149
-
150
- const bucket_id = rasterization_material_bucket(TransparencyMode.Opaque, draw_mode, side);
151
-
152
- if (!active_buckets.has(bucket_id)) {
153
- // no matching materials, skip
154
- continue;
155
- }
156
-
157
- const pass_data_instances_0 = {};
158
-
159
- const pass_instances_0 = graph.add("HZB mesh filter", pass_data_instances_0, execute);
160
-
161
- pass_data_instances_0.bucket_index = bucket_id;
162
-
163
- pass_data_instances_0.buckets = pass_instances_0.read(buckets);
164
- pass_data_instances_0.command = pass_instances_0.create("indirect dispatch command", INDIRECT_COMPUTE_COMMAND_DESCRIPTOR)
165
- pass_data_instances_0.camera_previous = pass_instances_0.read(camera_previous);
166
- pass_data_instances_0.hzb = pass_instances_0.read(hzb);
167
-
168
- pass_data_instances_0.instances_positive = pass_instances_0.create("positive meshes", BufferResourceDescriptor.from(
169
- collection_size_meshes,
170
- GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
171
- 0, 16
172
- ));
173
-
174
- gr_instances_maybe = pass_data_instances_0.instances_maybe = pass_instances_0.write(gr_instances_maybe);
175
-
176
- let meshlet_expansion_0 = graph_expand_meshes_to_meshlets({
177
- graph,
178
- input_meshes: pass_data_instances_0.instances_positive,
179
- scene: scene_ctx,
180
- expected_output_size: collection_size_meshlets,
181
- limits,
182
- });
183
-
184
- // the seam. The instance sets of the two HZB passes are disjoint, so cutting each of
185
- // them costs one cut per view in total and no instance is ever cut twice
186
- meshlet_expansion_0 = graph_vgeo_expand_if_enabled({
187
- graph,
188
- input_meshes: pass_data_instances_0.instances_positive,
189
- output_meshlets: meshlet_expansion_0,
190
- view,
191
- limits,
192
- });
193
-
194
-
195
- graph_record_stat(graph, limits.stats, RasterizationCollectionType.Meshlets, meshlet_expansion_0);
196
-
197
- // ----------
198
-
199
- const gr_command_iterate_meshlets_0 = graph_build_indirect_dispatch_command(graph, meshlet_expansion_0, COMPUTE_SHADER_DEFAULT_GROUP_SIZE);
200
-
201
- const pass_data_meshlets_1 = new MeshletFilter2WayPassData();
202
-
203
- const pass_meshlets_1 = graph.add("filter meshlets 2 way", pass_data_meshlets_1, pass_filter_meshlets_2way);
204
-
205
- pass_data_meshlets_1.view = view;
206
- pass_data_meshlets_1.hzb = pass_meshlets_1.read(hzb);
207
- pass_data_meshlets_1.command = pass_meshlets_1.read(gr_command_iterate_meshlets_0);
208
- pass_data_meshlets_1.input_meshlets = pass_meshlets_1.read(meshlet_expansion_0);
209
- pass_data_meshlets_1.out_meshlets_positive = pass_meshlets_1.create("meshlets positive", BufferResourceDescriptor.from(
210
- collection_size_meshlets,
211
- GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
212
- 0, 16 // clear count
213
- ));
214
- gr_meshlets_maybe = pass_data_meshlets_1.out_meshlets_maybe = pass_meshlets_1.write(gr_meshlets_maybe);
215
-
216
- const primitive_state = construct_primitive_state(draw_mode, side, cull_policy);
217
-
218
- // ----------
219
- [viz_depth, raster_color_targets] = graph_meshlets_rasterize({
220
- graph,
221
- view,
222
- input_meshlets: pass_data_meshlets_1.out_meshlets_positive,
223
- depth: viz_depth,
224
- color_targets: raster_color_targets,
225
- pass_descriptor: render_pass_descriptor,
226
- clear_targets: is_first_draw,
227
- primitive_state,
228
- viewport,
229
- });
230
-
231
- //
232
- is_first_draw = false;
233
- }
147
+ for (const { draw_mode, side, bucket_id } of rasterization_opaque_buckets(active_buckets)) {
148
+ const pass_data_instances_0 = {};
149
+
150
+ const pass_instances_0 = graph.add("HZB mesh filter", pass_data_instances_0, execute);
151
+
152
+ pass_data_instances_0.bucket_index = bucket_id;
153
+
154
+ pass_data_instances_0.buckets = pass_instances_0.read(buckets);
155
+ pass_data_instances_0.command = pass_instances_0.create("indirect dispatch command", INDIRECT_COMPUTE_COMMAND_DESCRIPTOR)
156
+ pass_data_instances_0.camera_previous = pass_instances_0.read(camera_previous);
157
+ pass_data_instances_0.hzb = pass_instances_0.read(hzb);
158
+
159
+ pass_data_instances_0.instances_positive = pass_instances_0.create("positive meshes", BufferResourceDescriptor.from(
160
+ collection_size_meshes,
161
+ GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
162
+ 0, 16
163
+ ));
164
+
165
+ gr_instances_maybe = pass_data_instances_0.instances_maybe = pass_instances_0.write(gr_instances_maybe);
166
+
167
+ let meshlet_expansion_0 = graph_expand_meshes_to_meshlets({
168
+ graph,
169
+ input_meshes: pass_data_instances_0.instances_positive,
170
+ scene: scene_ctx,
171
+ expected_output_size: collection_size_meshlets,
172
+ limits,
173
+ });
174
+
175
+ // the seam. The instance sets of the two HZB passes are disjoint, so cutting each of
176
+ // them costs one cut per view in total and no instance is ever cut twice
177
+ meshlet_expansion_0 = graph_vgeo_expand_if_enabled({
178
+ graph,
179
+ input_meshes: pass_data_instances_0.instances_positive,
180
+ output_meshlets: meshlet_expansion_0,
181
+ view,
182
+ limits,
183
+ });
184
+
185
+
186
+ graph_record_stat(graph, limits.stats, RasterizationCollectionType.Meshlets, meshlet_expansion_0);
187
+
188
+ // ----------
189
+
190
+ const gr_command_iterate_meshlets_0 = graph_build_indirect_dispatch_command(graph, meshlet_expansion_0, COMPUTE_SHADER_DEFAULT_GROUP_SIZE);
191
+
192
+ const pass_data_meshlets_1 = new MeshletFilter2WayPassData();
193
+
194
+ const pass_meshlets_1 = graph.add("filter meshlets 2 way", pass_data_meshlets_1, pass_filter_meshlets_2way);
195
+
196
+ pass_data_meshlets_1.view = view;
197
+ pass_data_meshlets_1.hzb = pass_meshlets_1.read(hzb);
198
+ pass_data_meshlets_1.command = pass_meshlets_1.read(gr_command_iterate_meshlets_0);
199
+ pass_data_meshlets_1.input_meshlets = pass_meshlets_1.read(meshlet_expansion_0);
200
+ pass_data_meshlets_1.out_meshlets_positive = pass_meshlets_1.create("meshlets positive", BufferResourceDescriptor.from(
201
+ collection_size_meshlets,
202
+ GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
203
+ 0, 16 // clear count
204
+ ));
205
+ gr_meshlets_maybe = pass_data_meshlets_1.out_meshlets_maybe = pass_meshlets_1.write(gr_meshlets_maybe);
206
+
207
+ const primitive_state = construct_primitive_state(draw_mode, side, cull_policy);
208
+
209
+ // ----------
210
+ [viz_depth, raster_color_targets] = graph_meshlets_rasterize({
211
+ graph,
212
+ view,
213
+ input_meshlets: pass_data_meshlets_1.out_meshlets_positive,
214
+ depth: viz_depth,
215
+ color_targets: raster_color_targets,
216
+ pass_descriptor: render_pass_descriptor,
217
+ clear_targets: is_first_draw,
218
+ primitive_state,
219
+ viewport,
220
+ });
221
+
222
+ //
223
+ is_first_draw = false;
234
224
  }
235
225
 
236
226
  // at this point we have rendered all occluders, and the uncertain cases are all stored in the "maybe" set
@@ -1 +1 @@
1
- {"version":3,"file":"graph_rasterize_remaining_opaque.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js"],"names":[],"mappings":"AAgGA;;;;;;;;;;;;;;;;;GAiBG;AACH,kOAFa;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,EAAE,CAAA;CAAC,CA4GlD"}
1
+ {"version":3,"file":"graph_rasterize_remaining_opaque.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js"],"names":[],"mappings":"AAgGA;;;;;;;;;;;;;;;;;GAiBG;AACH,kOAFa;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,EAAE,CAAA;CAAC,CAkGlD"}
@@ -7,7 +7,6 @@ import { TransparencyMode } from "../../material/TransparencyMode.js";
7
7
  import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
8
8
  import { graph_record_stat } from "../../util/graph_record_stat.js";
9
9
  import { build_indirect_compute_dispatch_command } from "../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
10
- import { rasterization_material_bucket } from "../expand/bucket/chunk_rasterization_material_bucket.js";
11
10
  import { graph_sort_meshlets_by_bucket_id } from "../expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js";
12
11
  import { shader_meshlets_extract_bucket } from "../expand/bucket/meshlet/shader_meshlets_extract_bucket.js";
13
12
  import { U32_CONTAINER_STRUCT } from "../../shader/type/U32_CONTAINER_STRUCT.js";
@@ -18,6 +17,7 @@ import { graph_expand_meshes_to_meshlets } from "../expand/mesh/graph_expand_mes
18
17
  import { graph_vgeo_expand_if_enabled } from "../../geometry/virtual/runtime/graph_vgeo_expand_if_enabled.js";
19
18
  import { RasterizationCollectionType } from "../expand/RasterizationCollectionType.js";
20
19
  import { construct_primitive_state, CullPolicy } from "../bucket/construct_primitive_state.js";
20
+ import { rasterization_opaque_buckets } from "../bucket/rasterization_opaque_buckets.js";
21
21
 
22
22
  /**
23
23
  *
@@ -180,38 +180,28 @@ export function graph_rasterize_remaining_opaque({
180
180
  limits,
181
181
  });
182
182
 
183
- for (const draw_mode of Object.values(ShadeDrawMode)) {
184
- for (const side of Object.values(ShadeDrawSide)) {
183
+ for (const { draw_mode, side, bucket_id } of rasterization_opaque_buckets(active_buckets)) {
184
+ const primitive_state = construct_primitive_state(draw_mode, side, cull_policy);
185
185
 
186
- const bucket_id = rasterization_material_bucket(TransparencyMode.Opaque, draw_mode, side);
187
-
188
- if (!active_buckets.has(bucket_id)) {
189
- // no matching materials, skip
190
- continue;
191
- }
186
+ // copy out a meshlet set
187
+ const meshlets = graph_extract_meshlets_from_bucket({
188
+ graph,
189
+ buckets: meshlet_buckets,
190
+ bucket_id,
191
+ limits,
192
+ });
192
193
 
193
- const primitive_state = construct_primitive_state(draw_mode, side, cull_policy);
194
-
195
- // copy out a meshlet set
196
- const meshlets = graph_extract_meshlets_from_bucket({
197
- graph,
198
- buckets: meshlet_buckets,
199
- bucket_id,
200
- limits,
201
- });
202
-
203
- [gr_depth_texture, raster_color_targets] = graph_meshlets_rasterize({
204
- graph,
205
- view,
206
- input_meshlets: meshlets,
207
- depth: gr_depth_texture,
208
- color_targets: raster_color_targets,
209
- pass_descriptor: render_pass_descriptor,
210
- clear_targets: false,
211
- primitive_state,
212
- viewport,
213
- });
214
- }
194
+ [gr_depth_texture, raster_color_targets] = graph_meshlets_rasterize({
195
+ graph,
196
+ view,
197
+ input_meshlets: meshlets,
198
+ depth: gr_depth_texture,
199
+ color_targets: raster_color_targets,
200
+ pass_descriptor: render_pass_descriptor,
201
+ clear_targets: false,
202
+ primitive_state,
203
+ viewport,
204
+ });
215
205
  }
216
206
 
217
207
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"GPUSceneContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/GPUSceneContext.js"],"names":[],"mappings":"AAmEA;;;;;;;;;GASG;AACH;IA0II;;;;OAIG;IACH,sBAHW,eAAe,SACf,KAAK,EAiCf;IA5KD;;;OAGG;IACH,aAFU,MAAM,CAEE;IAElB;;OAEG;IACH,YAFU,kBAAkB,CAEjB;IAEX;;OAEG;IACH,WAFU,kBAAkB,CAElB;IAGV;;OAEG;IACH,sBAFU,cAAc,CAEH;IASrB;;;OAGG;IACH,mBAEC;IAOD,uCAEC;IAQD;;;OAGG;IACH,iCAEC;IAOD;;;OAGG;IACH,8CAEC;IAOD;;;OAGG;IACH,8CAEC;IAoHD;;OAEG;IACH,kDAEC;IAED;;OAEG;IACH,gDAEC;IAED;;OAEG;IACH,kDAEC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH;QAH0C,SAAS,GAAxC,oBAAoB;QAClB,yBAAyB,CAmCrC;IAED;;OAEG;IACH,6CAEC;IAYD;;;OAGG;IACH,kCAEC;IAED;;;;;OAKG;IACH,uCAEC;IAED;;;;;;;;;;;OAWG;IACH,uCAUC;IAED,+BAUC;IAED;;;;;;;;;;OAUG;IACH,yBAEC;IAED;;;;;OAKG;IACH,sCAMC;IAOD;;;;;;;OAOG;IACH,8EAEC;IA0BD;;;;OAIG;IACH,cAqEC;IAED;;;OAGG;IACH,YAFW,eAAe,QA0BzB;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,cAHW,sBAAsB,cACtB,MAAM,QAuBhB;IAoCD,gBAYC;IAIL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;;CAN1C;8BA1pBY,OAAO,uBAAuB,EAAE,eAAe;iCAC/C,OAAO,mCAAmC,EAAE,kBAAkB;iCAC9D,OAAO,mCAAmC,EAAE,kBAAkB;4BAC9D,OAAO,8BAA8B,EAAE,aAAa;8BACpD,OAAO,iDAAiD,EAAE,eAAe;+BAtBvD,iDAAiD;sBAI1D,YAAY;oCADE,uCAAuC;mCADxC,gCAAgC;oCAD/B,mDAAmD;kDAIrC,wCAAwC;0CAfhD,0DAA0D;8BAItE,8CAA8C;iCAF3C,iDAAiD;qCAG7C,qDAAqD;oCAGtD,qCAAqC;4BAC7C,gCAAgC;uCAOrB,iDAAiD;6BAM3D,wBAAwB;wCADb,mCAAmC;uCAdpC,wCAAwC"}
1
+ {"version":3,"file":"GPUSceneContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/GPUSceneContext.js"],"names":[],"mappings":"AAqEA;;;;;;;;;GASG;AACH;IA0II;;;;OAIG;IACH,sBAHW,eAAe,SACf,KAAK,EAiCf;IA5KD;;;OAGG;IACH,aAFU,MAAM,CAEE;IAElB;;OAEG;IACH,YAFU,kBAAkB,CAEjB;IAEX;;OAEG;IACH,WAFU,kBAAkB,CAElB;IAGV;;OAEG;IACH,sBAFU,cAAc,CAEH;IASrB;;;OAGG;IACH,mBAEC;IAOD,uCAEC;IAQD;;;OAGG;IACH,iCAEC;IAOD;;;OAGG;IACH,8CAEC;IAOD;;;OAGG;IACH,8CAEC;IAoHD;;OAEG;IACH,kDAEC;IAED;;OAEG;IACH,gDAEC;IAED;;OAEG;IACH,kDAEC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH;QAH0C,SAAS,GAAxC,oBAAoB;QAClB,yBAAyB,CAmCrC;IAED;;OAEG;IACH,6CAEC;IAYD;;;OAGG;IACH,kCAEC;IAED;;;;;OAKG;IACH,uCAEC;IAED;;;;;;;;;;;OAWG;IACH,uCAUC;IAED,+BAUC;IAED;;;;;;;;;;OAUG;IACH,yBAEC;IAED;;;;;OAKG;IACH,sCAMC;IAOD;;;;;;;OAOG;IACH,8EAEC;IA0BD;;;;OAIG;IACH,cAqEC;IAED;;;OAGG;IACH,YAFW,eAAe,QA0BzB;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,cAHW,sBAAsB,cACtB,MAAM,QAuBhB;IAoCD,gBAYC;IAIL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;;CAN1C;8BA5pBY,OAAO,uBAAuB,EAAE,eAAe;iCAC/C,OAAO,mCAAmC,EAAE,kBAAkB;iCAC9D,OAAO,mCAAmC,EAAE,kBAAkB;4BAC9D,OAAO,8BAA8B,EAAE,aAAa;8BACpD,OAAO,iDAAiD,EAAE,eAAe;+BAtBvD,iDAAiD;sBAI1D,YAAY;oCADE,uCAAuC;mCADxC,gCAAgC;oCAD/B,mDAAmD;kDAIrC,wCAAwC;0CAfhD,0DAA0D;8BAItE,8CAA8C;iCAF3C,iDAAiD;qCAG7C,qDAAqD;oCAGtD,qCAAqC;4BAC7C,gCAAgC;uCAOrB,iDAAiD;6BAM3D,wBAAwB;wCADb,mCAAmC;uCAdpC,wCAAwC"}
@@ -51,6 +51,8 @@ const ROOT_RECORD = {
51
51
  global: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
52
52
  prev_global: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
53
53
  parent: NODE3D_SCENE_ID,
54
+ // identity does not reflect
55
+ global_flags: 0,
54
56
  };
55
57
 
56
58
  /**
@@ -18,6 +18,25 @@
18
18
  * shaders that need it pull in `chunk_mat4_inverse`.
19
19
  */
20
20
  export const NODE3D_STRUCT: WebGPUStruct;
21
+ /**
22
+ * `global` reflects: the determinant of its linear part is negative,
23
+ * because an odd number of negative scale axes appears somewhere in the
24
+ * chain that composed it.
25
+ *
26
+ * Two consequences, and the renderer has to act on both. Every triangle
27
+ * drawn under the node comes out of the vertex shader wound backwards,
28
+ * so fixed-function front-face determination culls exactly the faces
29
+ * pointing at the camera unless the draw reverses them. And the node's
30
+ * tangent frame changes handedness, so a bitangent reconstructed as
31
+ * `cross(N, T) * w` needs the other `w`.
32
+ *
33
+ * A node is not necessarily a mesh — bones, empties and particle
34
+ * emitters have rows in the same table — so this says nothing about
35
+ * geometry, only about the transform.
36
+ *
37
+ * @type {number}
38
+ */
39
+ export const NODE3D_GLOBAL_FLAG_MIRRORED: number;
21
40
  /**
22
41
  * Reserved row id for the scene root in the GPU `transforms` table.
23
42
  *
@@ -1 +1 @@
1
- {"version":3,"file":"NODE3D_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/NODE3D_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;GAkBG;AACH,yCA4CU;AAEV;;;;;;;;;;;;;;;GAeG;AACH,8BAFU,MAAM,CAEiB;6BAnFJ,gCAAgC"}
1
+ {"version":3,"file":"NODE3D_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/NODE3D_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;GAkBG;AACH,yCA0DU;AAEV;;;;;;;;;;;;;;;;;GAiBG;AACH,0CAFU,MAAM,CAE6B;AAE7C;;;;;;;;;;;;;;;GAeG;AACH,8BAFU,MAAM,CAEiB;6BArHJ,gCAAgC"}