@woosh/meep-engine 3.11.3 → 3.12.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 (401) hide show
  1. package/README.md +14 -18
  2. package/editor/SelectionVisualizer.js +127 -127
  3. package/editor/entity_world_bounds.js +27 -27
  4. package/editor/particles/rebuildParticleEmitter.js +31 -31
  5. package/editor/process/SymbolicDisplayProcess.js +1 -1
  6. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  7. package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
  8. package/editor/prototypeEditorShell.js +156 -156
  9. package/editor/selection/editor_pick.js +130 -130
  10. package/editor/selection/screen_rect_frustum.js +119 -119
  11. package/editor/tools/v2/TransformControls.js +971 -971
  12. package/package.json +1 -1
  13. package/src/engine/Engine.d.ts +3 -3
  14. package/src/engine/Engine.d.ts.map +1 -1
  15. package/src/engine/Engine.js +726 -726
  16. package/src/engine/EngineHarness.d.ts +1 -1
  17. package/src/engine/EngineHarness.js +590 -590
  18. package/src/engine/ecs/HIERARCHY_REVIEW.md +717 -717
  19. package/src/engine/ecs/terrain/ecs/BuildLightTexture.d.ts +1 -1
  20. package/src/engine/ecs/terrain/ecs/BuildLightTexture.js +27 -27
  21. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +1 -5
  22. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  23. package/src/engine/ecs/terrain/ecs/Terrain.js +790 -790
  24. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -129
  25. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +1 -1
  26. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -28
  27. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +1 -1
  28. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +428 -428
  29. package/src/engine/graphics/ecs/water/Water.d.ts +1 -1
  30. package/src/engine/graphics/ecs/water/Water.js +104 -104
  31. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +1 -1
  32. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1 -1
  33. package/src/engine/graphics3/AnimationGraphSystem.d.ts +65 -0
  34. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -0
  35. package/src/engine/graphics3/AnimationGraphSystem.js +329 -0
  36. package/src/engine/graphics3/AnimationGraphSystem3.d.ts +6 -61
  37. package/src/engine/graphics3/AnimationGraphSystem3.d.ts.map +1 -1
  38. package/src/engine/graphics3/AnimationGraphSystem3.js +6 -325
  39. package/src/engine/graphics3/AnimationSystem.d.ts +76 -0
  40. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -0
  41. package/src/engine/graphics3/AnimationSystem.js +352 -0
  42. package/src/engine/graphics3/AnimationSystem3.d.ts +6 -72
  43. package/src/engine/graphics3/AnimationSystem3.d.ts.map +1 -1
  44. package/src/engine/graphics3/AnimationSystem3.js +6 -348
  45. package/src/engine/graphics3/CameraSystem.d.ts +49 -0
  46. package/src/engine/graphics3/CameraSystem.d.ts.map +1 -0
  47. package/src/engine/graphics3/CameraSystem.js +170 -0
  48. package/src/engine/graphics3/CameraSystem3.d.ts +6 -45
  49. package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
  50. package/src/engine/graphics3/CameraSystem3.js +6 -166
  51. package/src/engine/graphics3/DebugDrawSystem.d.ts +72 -0
  52. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -0
  53. package/src/engine/graphics3/DebugDrawSystem.js +205 -0
  54. package/src/engine/graphics3/DebugDrawSystem3.d.ts +6 -68
  55. package/src/engine/graphics3/DebugDrawSystem3.d.ts.map +1 -1
  56. package/src/engine/graphics3/DebugDrawSystem3.js +6 -201
  57. package/src/engine/graphics3/DecalSystem.d.ts +81 -0
  58. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -0
  59. package/src/engine/graphics3/DecalSystem.js +441 -0
  60. package/src/engine/graphics3/DecalSystem3.d.ts +6 -77
  61. package/src/engine/graphics3/DecalSystem3.d.ts.map +1 -1
  62. package/src/engine/graphics3/DecalSystem3.js +6 -437
  63. package/src/engine/graphics3/FogOfWarSystem.d.ts +74 -0
  64. package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -0
  65. package/src/engine/graphics3/FogOfWarSystem.js +265 -0
  66. package/src/engine/graphics3/FogOfWarSystem3.d.ts +6 -70
  67. package/src/engine/graphics3/FogOfWarSystem3.d.ts.map +1 -1
  68. package/src/engine/graphics3/FogOfWarSystem3.js +6 -261
  69. package/src/engine/graphics3/GraphicsEngine.d.ts +340 -0
  70. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -0
  71. package/src/engine/graphics3/GraphicsEngine.js +790 -0
  72. package/src/engine/graphics3/GraphicsEngine3.d.ts +6 -336
  73. package/src/engine/graphics3/GraphicsEngine3.d.ts.map +1 -1
  74. package/src/engine/graphics3/GraphicsEngine3.js +6 -786
  75. package/src/engine/graphics3/HighlightSystem.d.ts +82 -0
  76. package/src/engine/graphics3/HighlightSystem.d.ts.map +1 -0
  77. package/src/engine/graphics3/HighlightSystem.js +241 -0
  78. package/src/engine/graphics3/HighlightSystem3.d.ts +6 -78
  79. package/src/engine/graphics3/HighlightSystem3.d.ts.map +1 -1
  80. package/src/engine/graphics3/HighlightSystem3.js +6 -237
  81. package/src/engine/graphics3/LightSystem.d.ts +40 -0
  82. package/src/engine/graphics3/LightSystem.d.ts.map +1 -0
  83. package/src/engine/graphics3/LightSystem.js +211 -0
  84. package/src/engine/graphics3/LightSystem3.d.ts +6 -36
  85. package/src/engine/graphics3/LightSystem3.d.ts.map +1 -1
  86. package/src/engine/graphics3/LightSystem3.js +6 -207
  87. package/src/engine/graphics3/MeshSystem.d.ts +106 -0
  88. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -0
  89. package/src/engine/graphics3/MeshSystem.js +647 -0
  90. package/src/engine/graphics3/MeshSystem3.d.ts +6 -102
  91. package/src/engine/graphics3/MeshSystem3.d.ts.map +1 -1
  92. package/src/engine/graphics3/MeshSystem3.js +6 -642
  93. package/src/engine/graphics3/ParticipatingMedia.d.ts +2 -2
  94. package/src/engine/graphics3/ParticipatingMedia.js +203 -203
  95. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +87 -0
  96. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -0
  97. package/src/engine/graphics3/ParticipatingMediaSystem.js +184 -0
  98. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts +6 -83
  99. package/src/engine/graphics3/ParticipatingMediaSystem3.d.ts.map +1 -1
  100. package/src/engine/graphics3/ParticipatingMediaSystem3.js +6 -180
  101. package/src/engine/graphics3/ParticleEmitterSystem.d.ts +76 -0
  102. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -0
  103. package/src/engine/graphics3/ParticleEmitterSystem.js +289 -0
  104. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +6 -72
  105. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
  106. package/src/engine/graphics3/ParticleEmitterSystem3.js +6 -285
  107. package/src/engine/graphics3/PathDisplaySystem.d.ts +70 -0
  108. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -0
  109. package/src/engine/graphics3/PathDisplaySystem.js +309 -0
  110. package/src/engine/graphics3/PathDisplaySystem3.d.ts +6 -66
  111. package/src/engine/graphics3/PathDisplaySystem3.d.ts.map +1 -1
  112. package/src/engine/graphics3/PathDisplaySystem3.js +6 -305
  113. package/src/engine/graphics3/Pickable.d.ts +1 -1
  114. package/src/engine/graphics3/Pickable.js +65 -65
  115. package/src/engine/graphics3/PickingQuery.d.ts +1 -1
  116. package/src/engine/graphics3/PickingQuery.js +48 -48
  117. package/src/engine/graphics3/PickingSystem.d.ts +67 -0
  118. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -0
  119. package/src/engine/graphics3/PickingSystem.js +273 -0
  120. package/src/engine/graphics3/PickingSystem3.d.ts +6 -63
  121. package/src/engine/graphics3/PickingSystem3.d.ts.map +1 -1
  122. package/src/engine/graphics3/PickingSystem3.js +6 -269
  123. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +47 -0
  124. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -0
  125. package/src/engine/graphics3/ShadedGeometrySystem.js +169 -0
  126. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts +6 -43
  127. package/src/engine/graphics3/ShadedGeometrySystem3.d.ts.map +1 -1
  128. package/src/engine/graphics3/ShadedGeometrySystem3.js +6 -165
  129. package/src/engine/graphics3/TerrainSystem.d.ts +80 -0
  130. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -0
  131. package/src/engine/graphics3/TerrainSystem.js +566 -0
  132. package/src/engine/graphics3/TerrainSystem3.d.ts +6 -76
  133. package/src/engine/graphics3/TerrainSystem3.d.ts.map +1 -1
  134. package/src/engine/graphics3/TerrainSystem3.js +6 -562
  135. package/src/engine/graphics3/TooltipComponentSystem.d.ts +65 -0
  136. package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -0
  137. package/src/engine/graphics3/TooltipComponentSystem.js +328 -0
  138. package/src/engine/graphics3/TooltipComponentSystem3.d.ts +6 -61
  139. package/src/engine/graphics3/TooltipComponentSystem3.d.ts.map +1 -1
  140. package/src/engine/graphics3/TooltipComponentSystem3.js +6 -324
  141. package/src/engine/graphics3/Trail3DSystem.d.ts +73 -0
  142. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -0
  143. package/src/engine/graphics3/Trail3DSystem.js +221 -0
  144. package/src/engine/graphics3/Trail3DSystem3.d.ts +6 -69
  145. package/src/engine/graphics3/Trail3DSystem3.d.ts.map +1 -1
  146. package/src/engine/graphics3/Trail3DSystem3.js +6 -217
  147. package/src/engine/graphics3/VolumetricLightMap.d.ts +2 -2
  148. package/src/engine/graphics3/VolumetricLightMap.js +2 -2
  149. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts +98 -0
  150. package/src/engine/graphics3/VolumetricLightMapSystem.d.ts.map +1 -0
  151. package/src/engine/graphics3/VolumetricLightMapSystem.js +261 -0
  152. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts +6 -94
  153. package/src/engine/graphics3/VolumetricLightMapSystem3.d.ts.map +1 -1
  154. package/src/engine/graphics3/VolumetricLightMapSystem3.js +10 -261
  155. package/src/engine/graphics3/WaterSystem.d.ts +59 -0
  156. package/src/engine/graphics3/WaterSystem.d.ts.map +1 -0
  157. package/src/engine/graphics3/WaterSystem.js +293 -0
  158. package/src/engine/graphics3/WaterSystem3.d.ts +6 -55
  159. package/src/engine/graphics3/WaterSystem3.d.ts.map +1 -1
  160. package/src/engine/graphics3/WaterSystem3.js +6 -289
  161. package/src/engine/graphics3/animation/AnimationGraphController.d.ts +1 -1
  162. package/src/engine/graphics3/animation/AnimationGraphController.js +518 -518
  163. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +1 -1
  164. package/src/engine/graphics3/animation/ClipListPlayer.js +263 -263
  165. package/src/engine/graphics3/animation/ClipPlayback.d.ts +2 -2
  166. package/src/engine/graphics3/animation/ClipPlayback.js +84 -84
  167. package/src/engine/graphics3/decal/graph_build_decal_clusters.d.ts.map +1 -1
  168. package/src/engine/graphics3/decal/graph_build_decal_clusters.js +6 -8
  169. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts +0 -7
  170. package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
  171. package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +1 -1
  172. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts +0 -4
  173. package/src/engine/graphics3/decal/shader_cull_decals_frustum.d.ts.map +1 -1
  174. package/src/engine/graphics3/decal/shader_cull_decals_frustum.js +1 -1
  175. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +2 -2
  176. package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
  177. package/src/engine/graphics3/highlight/pack_highlight_table.js +74 -74
  178. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +1 -1
  179. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +101 -101
  180. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts +3 -3
  181. package/src/engine/graphics3/preview/make_model_thumbnail.d.ts.map +1 -1
  182. package/src/engine/graphics3/preview/make_model_thumbnail.js +48 -48
  183. package/src/engine/graphics3/shade_camera_projection_ray.d.ts +1 -1
  184. package/src/engine/graphics3/shade_camera_projection_ray.js +77 -77
  185. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +1 -1
  186. package/src/engine/graphics3/shade_node_to_entity_composition.js +84 -84
  187. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  188. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +0 -1
  189. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  190. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +0 -1
  191. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  192. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +133 -134
  193. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +202 -202
  194. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +249 -249
  195. package/src/shade/renderer/STATIC_GRAPHICS_ENGINE_ASSETS.js +1 -1
  196. package/src/shade/renderer/animation/pose/PosePlayback.d.ts +2 -1
  197. package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
  198. package/src/shade/renderer/animation/pose/PosePlayback.js +2 -1
  199. package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
  200. package/src/shade/renderer/animation/shader_animation_apply.js +128 -129
  201. package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
  202. package/src/shade/renderer/animation/shader_animation_pose_resolve.js +176 -177
  203. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  204. package/src/shade/renderer/animation/shader_animation_tick.js +125 -126
  205. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  206. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +98 -99
  207. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  208. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +212 -213
  209. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  210. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +120 -121
  211. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  212. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +75 -76
  213. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  214. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +371 -372
  215. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
  216. package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +104 -105
  217. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  218. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +0 -1
  219. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +136 -136
  220. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  221. package/src/shade/renderer/buffer/table/GPUDatabase.js +2 -3
  222. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +319 -319
  223. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  224. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +41 -42
  225. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.d.ts.map +1 -1
  226. package/src/shade/renderer/buffer/util/shader_buffer_intra_copy_regions.js +83 -84
  227. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  228. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +177 -170
  229. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +918 -918
  230. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +4 -4
  231. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  232. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +121 -122
  233. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +774 -774
  234. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts +1 -1
  235. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  236. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +69 -70
  237. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +367 -367
  238. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +184 -184
  239. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1115 -1115
  240. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  241. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  242. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +142 -143
  243. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  244. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +0 -1
  245. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  246. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +140 -141
  247. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  248. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +0 -1
  249. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  250. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +0 -1
  251. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  252. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +191 -198
  253. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts +0 -6
  254. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.d.ts.map +1 -1
  255. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_frustum.js +120 -120
  256. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts +0 -4
  257. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.d.ts.map +1 -1
  258. package/src/shade/renderer/light/cluster/cull/shader_cull_lights_hzb.js +112 -112
  259. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  260. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +4 -7
  261. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts +0 -6
  262. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
  263. package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +1 -1
  264. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +222 -222
  265. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_tile_composit.js +81 -81
  266. package/src/shade/renderer/material/GPUMaterialContext.js +380 -380
  267. package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +169 -169
  268. package/src/shade/renderer/object_property/shader_object_property_process.d.ts.map +1 -1
  269. package/src/shade/renderer/object_property/shader_object_property_process.js +83 -84
  270. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
  271. package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +57 -58
  272. package/src/shade/renderer/particles/prototypeParticleSystem.js +2 -3
  273. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  274. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +117 -118
  275. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  276. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +77 -79
  277. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  278. package/src/shade/renderer/particles/shaders/shader_particle_render.js +190 -183
  279. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  280. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +99 -100
  281. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  282. package/src/shade/renderer/particles/sort/shader_particle_sort.js +158 -161
  283. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +184 -184
  284. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +119 -119
  285. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +3 -4
  286. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  287. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +266 -267
  288. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  289. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +270 -271
  290. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  291. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +68 -69
  292. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.d.ts.map +1 -1
  293. package/src/shade/renderer/postprocess/nss/shader_nss_conv_layer.js +225 -226
  294. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.d.ts.map +1 -1
  295. package/src/shade/renderer/postprocess/nss/shader_nss_extract_feedback.js +49 -50
  296. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
  297. package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +291 -292
  298. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
  299. package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +230 -231
  300. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +16 -2
  301. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +1 -1
  302. package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.js +12 -12
  303. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +2 -2
  304. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
  305. package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +68 -69
  306. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.d.ts.map +1 -1
  307. package/src/shade/renderer/rasterize/bucket/shader_make_meshlet_indirect_draw_commands_by_material.js +59 -60
  308. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  309. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +0 -1
  310. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
  311. package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +64 -65
  312. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
  313. package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +168 -169
  314. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.d.ts.map +1 -1
  315. package/src/shade/renderer/rasterize/compute/graph_mesh_sphere_cull.js +160 -161
  316. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  317. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +109 -110
  318. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  319. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +115 -116
  320. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.d.ts.map +1 -1
  321. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_classify_bucket.js +139 -140
  322. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.d.ts.map +1 -1
  323. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_count_by_rasterization_bucket.js +91 -92
  324. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
  325. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +88 -89
  326. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  327. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +90 -91
  328. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  329. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +65 -66
  330. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  331. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +89 -90
  332. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
  333. package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +169 -170
  334. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  335. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +89 -90
  336. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.d.ts.map +1 -1
  337. package/src/shade/renderer/rasterize/expand/mesh/shader_meshes_to_meshlet_counts.js +61 -62
  338. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  339. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +153 -154
  340. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +144 -144
  341. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +88 -88
  342. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +217 -217
  343. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +179 -179
  344. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +178 -178
  345. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +194 -194
  346. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_opaque_pass_descriptor.js +76 -76
  347. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  348. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +136 -137
  349. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  350. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +129 -130
  351. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  352. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +99 -100
  353. package/src/shade/renderer/restir/di/shader_restir_di_spatial.d.ts.map +1 -1
  354. package/src/shade/renderer/restir/di/shader_restir_di_spatial.js +116 -117
  355. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +383 -383
  356. package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy_naive.js +123 -123
  357. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.d.ts.map +1 -1
  358. package/src/shade/renderer/scene/hierarchy/shader_nodes_record_input_positions.js +64 -65
  359. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.d.ts.map +1 -1
  360. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy.js +372 -373
  361. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.d.ts.map +1 -1
  362. package/src/shade/renderer/scene/hierarchy/shader_nodes_update_transform_hierarchy_naive.js +111 -112
  363. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  364. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +0 -1
  365. package/src/shade/renderer/shader/ComputeShader.d.ts +24 -3
  366. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  367. package/src/shade/renderer/shader/ComputeShader.js +350 -296
  368. package/src/shade/renderer/shader/ImageShader.js +217 -217
  369. package/src/shade/renderer/shader/ShaderDescriptor.d.ts +5 -0
  370. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  371. package/src/shade/renderer/shader/ShaderDescriptor.js +20 -0
  372. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts +47 -0
  373. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.d.ts.map +1 -0
  374. package/src/shade/renderer/shader/util/compute_infer_workgroup_size_from_source.js +448 -0
  375. package/src/shade/renderer/shadow/map/csm/graph_csm_setup_cascades.js +3 -3
  376. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +3 -3
  377. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +2 -2
  378. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +4 -4
  379. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  380. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +231 -232
  381. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +1 -1
  382. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  383. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +12 -15
  384. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +3 -2
  385. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  386. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +3 -2
  387. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts +0 -2
  388. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
  389. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +17 -6
  390. package/src/shade/renderer/water/shader_water.js +246 -246
  391. package/src/shade/vitest.setup.mjs +1 -1
  392. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +291 -291
  393. package/src/view/minimap/Minimap.d.ts +2 -2
  394. package/src/view/minimap/Minimap.d.ts.map +1 -1
  395. package/src/view/minimap/Minimap.js +225 -225
  396. package/src/view/minimap/dom/MinimapCameraView.d.ts +3 -3
  397. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  398. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  399. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts +0 -3
  400. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.d.ts.map +0 -1
  401. package/src/shade/renderer/shadow/map/csm/shader/shader_setup_cascades.js +0 -20
@@ -1,590 +1,590 @@
1
- import Stats from "stats.js";
2
- import { assert } from "../core/assert.js";
3
- import { Color } from "../core/color/Color.js";
4
-
5
- import { noop } from "../core/function/noop.js";
6
- import Vector2 from "../core/geom/Vector2.js";
7
- import Vector3 from "../core/geom/Vector3.js";
8
- import EmptyView from "../view/elements/EmptyView.js";
9
- import { JsonAssetLoader } from "./asset/loaders/JsonAssetLoader.js";
10
- import { SerializationMetadata } from "./ecs/components/SerializationMetadata.js";
11
- import Tag from "./ecs/components/Tag.js";
12
- import Entity from "./ecs/Entity.js";
13
- import { TerrainLayer } from "./ecs/terrain/ecs/layers/TerrainLayer.js";
14
- import Terrain from "./ecs/terrain/ecs/Terrain.js";
15
- import { Transform } from "./ecs/transform/Transform.js";
16
- import Engine from "./Engine.js";
17
- import { EngineConfiguration } from "./EngineConfiguration.js";
18
- import { makeOrbitalCameraController } from "./graphics/camera/makeOrbitalCameraController.js";
19
- import { Camera } from "./graphics/ecs/camera/Camera.js";
20
- import { CameraSystem3 } from "./graphics3/CameraSystem3.js";
21
- import { LightSystem3 } from "./graphics3/LightSystem3.js";
22
- import { TerrainSystem3 } from "./graphics3/TerrainSystem3.js";
23
- import { WaterSystem3 } from "./graphics3/WaterSystem3.js";
24
- import { Scene } from "../shade/renderer/scene/Scene.js";
25
- import TopDownCameraController from "./graphics/ecs/camera/topdown/TopDownCameraController.js";
26
- import TopDownCameraControllerSystem from "./graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js";
27
- import { Light } from "./graphics/ecs/light/Light.js";
28
- import Water from "./graphics/ecs/water/Water.js";
29
- import { MouseEvents } from "./input/devices/events/MouseEvents.js";
30
- import KeyboardCameraController from "./input/ecs/controllers/KeyboardCameraController.js";
31
- import InputControllerSystem from "./input/ecs/systems/InputControllerSystem.js";
32
- import { ConsoleLoggerBackend } from "./logging/ConsoleLoggerBackend.js";
33
- import { logger } from "./logging/GlobalLogger.js";
34
- import { getURLHash } from "./platform/GetURLHash.js";
35
- import { WebEnginePlatform } from "./platform/WebEnginePlatform.js";
36
- import SoundListener from "./sound/ecs/SoundListener.js";
37
- import SoundListenerSystem from "./sound/ecs/SoundListenerSystem.js";
38
-
39
- /**
40
- * The Shade scene a harness's systems draw into, one per engine.
41
- *
42
- * **One scene, shared**, for the same reason the game's graphics profile says so: meshes, lights and
43
- * terrain each tell the facade which scene to draw, and any two of them holding different ones draws
44
- * a frame with most of the content missing. The facade hands no scene back out (D14), so somebody
45
- * has to remember it, and for a harness that somebody is the harness.
46
- *
47
- * @type {WeakMap<Engine, Scene>}
48
- */
49
- const shade_scenes = new WeakMap();
50
-
51
- /**
52
- *
53
- * @param {Engine} engine
54
- * @returns {Promise}
55
- */
56
- function setLocale(engine) {
57
-
58
- const urlHash = getURLHash();
59
-
60
- let locale;
61
- if (urlHash.lang !== undefined) {
62
- locale = urlHash.lang;
63
- } else {
64
- locale = "en-gb";
65
- }
66
-
67
- return engine.localization.loadLocale(locale);
68
- }
69
-
70
- /**
71
- * Equal to ~ 5500 K light color
72
- * @type {Readonly<Color>}
73
- */
74
- const DEFAULT_SUNLIGHT_COLOR = Object.freeze(new Color(1, 0.93, 0.87));
75
-
76
- export class EngineHarness {
77
- /**
78
- * @readonly
79
- * @type {Promise|null}
80
- */
81
- p = null;
82
-
83
- constructor() {
84
- /**
85
- *
86
- * @type {Engine}
87
- */
88
- this.engine = new Engine(new WebEnginePlatform());
89
-
90
- window.engine = this.engine;
91
-
92
- logger.addBackend(ConsoleLoggerBackend.INSTANCE);
93
- }
94
-
95
- /**
96
- * Quick initialization of the engine in a sensible default configuration
97
- * @param {(config:EngineConfiguration,engine:Engine)=>*} [configuration]
98
- * @return {Promise<Engine>}
99
- */
100
- static async bootstrap({ configuration } = {}) {
101
- const harness = new EngineHarness();
102
-
103
- return harness.initialize({ configuration });
104
- }
105
-
106
- /**
107
- * The Shade scene this engine's harness systems draw into, made on first ask.
108
- *
109
- * A harness that registers a `MeshSystem3` of its own — the editor shell does — asks for it here
110
- * rather than making one, so that its models land in the same scene the harness's lights and
111
- * terrain do.
112
- *
113
- * @param {Engine} engine
114
- * @returns {Scene}
115
- */
116
- static shadeScene(engine) {
117
- let scene = shade_scenes.get(engine);
118
-
119
- if (scene === undefined) {
120
- scene = new Scene();
121
-
122
- shade_scenes.set(engine, scene);
123
- }
124
-
125
- return scene;
126
- }
127
-
128
- /**
129
- *
130
- * @param {Engine} engine
131
- */
132
- static addFpsCounter(engine) {
133
- /*
134
- `stats.js` by its own name. three shipped a copy of it as
135
- `examples/jsm/libs/stats.module.js`, which is what this used to import; moh already declares
136
- the package, so this is the same code under the name its author gives it (D64).
137
- */
138
- const stats = new Stats();
139
-
140
- engine.graphics.on.postRender.add(stats.update, stats);
141
-
142
- const view = new EmptyView({
143
- el: stats.domElement
144
- });
145
-
146
- engine.viewStack.addChild(view);
147
- }
148
-
149
- /**
150
- * @param {Object} [params]
151
- * @param {(config:EngineConfiguration,engine:Engine)=>*} [params.configuration]
152
- * @param {boolean} [params.enable_localization] Whether or not to load localization data
153
- * @returns {Promise<Engine>}
154
- */
155
- initialize({
156
- configuration = noop,
157
- enable_localization = false,
158
- } = {}) {
159
-
160
- if (this.p !== null) {
161
- return this.p;
162
- }
163
-
164
- const engine = this.engine;
165
-
166
- const promise = new Promise(async function (resolve, reject) {
167
- const config = new EngineConfiguration();
168
-
169
- configuration(config, engine);
170
-
171
- if (!config.hasLoader('json')) {
172
- config.addLoader('json', new JsonAssetLoader());
173
- }
174
-
175
- await config.apply(engine);
176
-
177
- engine.sceneManager.create("main");
178
- engine.sceneManager.set("main");
179
-
180
- await engine.start();
181
-
182
- if (enable_localization) {
183
- try {
184
- await setLocale(engine);
185
- } catch (e) {
186
- console.warn('Failed to load localization:', e);
187
- }
188
- }
189
-
190
- document.body.appendChild(engine.viewStack.el);
191
- engine.viewStack.link();
192
-
193
- // set css
194
- document.body.style.margin = "0";
195
- document.body.style.overflow = "hidden";
196
-
197
- function handleInput() {
198
- window.removeEventListener(MouseEvents.Down, handleInput);
199
-
200
- engine.sound.resumeContext();
201
- }
202
-
203
- window.addEventListener(MouseEvents.Down, handleInput);
204
-
205
- resolve(engine);
206
- });
207
-
208
- this.p = promise;
209
-
210
- return promise;
211
- }
212
-
213
- /**
214
- * @param {Object} param
215
- * @param {Engine} param.engine
216
- * @param {EntityComponentDataset} [param.ecd]
217
- * @param {Vector3} [param.target]
218
- * @param {number} [param.distance]
219
- * @param {number} [param.pitch]
220
- * @param {number} [param.yaw]
221
- * @param {boolean} [param.autoClip]
222
- * @param {number} [param.distanceMin]
223
- * @param {number} [param.distanceMax]
224
- * @param {number} [param.fieldOfView] in degrees
225
- * @returns {Entity}
226
- */
227
- static buildCamera(
228
- {
229
- engine,
230
- ecd = engine.entityManager.dataset,
231
- target = new Vector3(),
232
- distance = 10,
233
- pitch = 1.4,
234
- yaw = 0,
235
- autoClip = true,
236
- distanceMin = 0.01,
237
- distanceMax = 1000,
238
- fieldOfView = 45
239
- }
240
- ) {
241
- const em = engine.entityManager;
242
-
243
- if (em.getSystem(TopDownCameraControllerSystem) === null) {
244
- em.addSystem(new TopDownCameraControllerSystem());
245
- }
246
- if (em.getSystem(CameraSystem3) === null) {
247
- em.addSystem(new CameraSystem3(engine.graphics));
248
- }
249
-
250
- if (em.getSystem(SoundListenerSystem) === null) {
251
- em.addSystem(new SoundListenerSystem(engine.sound.context));
252
- }
253
-
254
- if (!ecd.isComponentTypeRegistered(Tag)) {
255
- ecd.registerComponentType(Tag);
256
- }
257
-
258
- const transform = new Transform();
259
-
260
- const cameraController = new TopDownCameraController();
261
- cameraController.pitch = pitch;
262
- cameraController.yaw = yaw;
263
- cameraController.distance = distance;
264
- cameraController.distanceMin = distanceMin;
265
- cameraController.distanceMax = distanceMax;
266
- cameraController.target.copy(target);
267
-
268
- const camera = new Camera();
269
-
270
- camera.active.set(true);
271
- camera.autoClip = autoClip;
272
- camera.clip_far = distanceMax;
273
- camera.fov.set(fieldOfView);
274
-
275
- const entityBuilder = new Entity();
276
-
277
- entityBuilder
278
- .add(transform)
279
- .add(cameraController)
280
- .add(camera)
281
- .add(new SoundListener())
282
- .add(Tag.fromJSON(["Camera"]))
283
- .build(ecd);
284
-
285
- console.log("build camera", entityBuilder);
286
-
287
- return entityBuilder;
288
- }
289
-
290
- /**
291
- * @param {Object} params
292
- * @param {Engine} params.engine
293
- * @param {{x:number,y:number,z:number}} [params.focus]
294
- * @param [params.heightMap]
295
- * @param [params.heightRange]
296
- * @param {number} [params.pitch]
297
- * @param {number} [params.yaw]
298
- * @param {number} [params.distance]
299
- * @param {{x:number, y:number}} [params.terrainSize]
300
- * @param {number} [params.terrainResolution]
301
- * @param {boolean} [params.enableWater]
302
- * @param {boolean} [params.enableTerrain]
303
- * @param {boolean} [params.enableLights=true]
304
- * @param {boolean} [params.enableShadows=true] if lights are enabled, enable shadows for sun
305
- * @param {number} [params.cameraFieldOfView]
306
- * @param {number} [params.cameraFarDistance]
307
- * @param {boolean} [params.cameraController=true]
308
- * @param {boolean} [params.cameraAutoClip]
309
- * @param {number} [params.shadowmapResolution]
310
- * @param {boolean} [params.showFps]
311
- */
312
- static async buildBasics({
313
- engine,
314
- focus = new Vector3(0, 0, 0),
315
- heightMap,
316
- heightRange,
317
- pitch = 0.7,
318
- yaw = 0,
319
- distance = 10,
320
- terrainSize = new Vector2(10, 10),
321
- terrainResolution = 10,
322
- enableWater = true,
323
- enableTerrain = true,
324
- enableLights = true,
325
- enableShadows = true,
326
- cameraFieldOfView,
327
- cameraFarDistance,
328
- cameraController = true,
329
- cameraAutoClip = true,
330
- shadowmapResolution,
331
- showFps = false
332
- }) {
333
-
334
- if (showFps) {
335
- EngineHarness.addFpsCounter(engine);
336
- }
337
-
338
- if (enableLights) {
339
- await EngineHarness.buildLights({
340
- engine: engine,
341
- shadowmapResolution,
342
- castShadow: enableShadows,
343
- });
344
- }
345
-
346
- const camera = EngineHarness.buildCamera({
347
- engine,
348
- target: focus,
349
- pitch,
350
- yaw,
351
- distance,
352
- fieldOfView: cameraFieldOfView,
353
- distanceMax: cameraFarDistance,
354
- autoClip: cameraAutoClip
355
- });
356
-
357
- const cameraEntity = camera.id;
358
-
359
- if (enableTerrain) {
360
- await EngineHarness.buildTerrain({
361
- engine,
362
- heightMap,
363
- heightRange,
364
- resolution: terrainResolution,
365
- size: terrainSize,
366
- enableWater
367
- });
368
- }
369
-
370
- if (cameraController) {
371
- await EngineHarness.buildOrbitalCameraController({
372
- engine,
373
- cameraEntity: cameraEntity
374
- });
375
-
376
- const ecd = engine.entityManager.dataset;
377
- const keyboardCameraController = new KeyboardCameraController({
378
- component: ecd.getComponent(cameraEntity, TopDownCameraController),
379
- entity: cameraEntity
380
- }, ecd);
381
-
382
- keyboardCameraController.build(ecd);
383
- }
384
- }
385
-
386
-
387
- /**
388
- * @param {Object} param
389
- * @param {Engine} param.engine
390
- * @param {EntityComponentDataset} [param.ecd]
391
- * @param {number} [param.shadowmapResolution]
392
- * @param {boolean} [param.castShadow]
393
- * @param {Color} [param.sun]
394
- * @param {number} [param.sunIntensity]
395
- * @param {Vector3} [param.sunDirection]
396
- * @param {Color} [param.ambient]
397
- * @param {number} [param.ambientIntensity]
398
- * @param {number} [param.sunShadowDistance] Maximum draw distance for sun's shadow. Allows better use of shadowmap resolution.
399
- */
400
- static async buildLights({
401
- engine,
402
- ecd = engine.entityManager.dataset,
403
- shadowmapResolution = 2048,
404
- castShadow = true,
405
- sun = DEFAULT_SUNLIGHT_COLOR,
406
- sunIntensity = 0.9,
407
- sunDirection = new Vector3(0.17, -1, 0.17),
408
- sunShadowDistance = 1000,
409
- ambient = Color.white,
410
- ambientIntensity = 0.07
411
- }) {
412
- const em = engine.entityManager;
413
-
414
- if (!em.hasSystem(LightSystem3)) {
415
- await em.addSystem(new LightSystem3(engine.graphics, EngineHarness.shadeScene(engine)));
416
- }
417
-
418
- if (!ecd.isComponentTypeRegistered(Tag)) {
419
- ecd.registerComponentType(Tag);
420
- }
421
-
422
- const key = new Light();
423
- key.type.set(Light.Type.DIRECTION);
424
- key.color.copy(sun);
425
- key.maxShadowDistance.set(sunShadowDistance);
426
- key.intensity.set(sunIntensity);
427
- key.castShadow.set(castShadow);
428
-
429
- const transform = new Transform();
430
- transform.position.set(30, 70, 30);
431
- transform.rotation.lookRotation(sunDirection);
432
-
433
- new Entity()
434
- .add(key)
435
- .add(transform)
436
- .add(Tag.fromJSON(["Light", "Key"]))
437
- .build(ecd);
438
-
439
-
440
- const fill = new Light();
441
- fill.type.set(Light.Type.AMBIENT);
442
- fill.color.copy(ambient);
443
- fill.intensity.set(ambientIntensity);
444
-
445
-
446
- new Entity()
447
- .add(fill)
448
- .add(new Transform())
449
- .add(Tag.fromJSON(["Light", "Ambient"]))
450
- .build(ecd);
451
- }
452
-
453
- /**
454
- * @param {Object} param
455
- * @param {number} [param.cameraEntity]
456
- * @param {Engine} param.engine
457
- * @param {number} [param.sensitivity]
458
- * @param {EntityComponentDataset} [param.ecd]
459
- * @returns {Promise<Entity>}
460
- */
461
- static async buildOrbitalCameraController({
462
- cameraEntity,
463
- engine,
464
- ecd = engine.entityManager.dataset,
465
- sensitivity = 1
466
- }) {
467
-
468
- if (cameraEntity === undefined) {
469
- cameraEntity = ecd.getAnyComponent(Camera).entity;
470
- }
471
-
472
- assert.defined(cameraEntity, "cameraEntity");
473
-
474
- const em = engine.entityManager;
475
-
476
- if (em.getSystem(InputControllerSystem) === null) {
477
- await em.addSystem(new InputControllerSystem(engine.devices));
478
- }
479
-
480
- if (!ecd.isComponentTypeRegistered(SerializationMetadata)) {
481
- ecd.registerComponentType(SerializationMetadata);
482
- }
483
-
484
- const domElement = engine.graphics.domElement;
485
-
486
-
487
- domElement.addEventListener("contextmenu", (event) => {
488
- event.preventDefault();
489
- });
490
-
491
- const eb = makeOrbitalCameraController({
492
- camera_entity: cameraEntity,
493
- ecd,
494
- dom_element: domElement,
495
- sensitivity
496
- });
497
-
498
- eb.add(Tag.fromJSON(['CameraController']));
499
- eb.add(SerializationMetadata.Transient);
500
-
501
- eb.build(ecd);
502
-
503
- return eb;
504
- }
505
-
506
-
507
- /**
508
- *
509
- * @param {Engine} engine
510
- * @param {Vector2} [size]
511
- * @param {String} [diffuse0]
512
- * @param heightMap
513
- * @param {number} [resolution]
514
- * @param {number} [waterLevel]
515
- * @param {boolean} [enableWater]
516
- * @returns {Terrain}
517
- */
518
- static async buildTerrain(
519
- {
520
- engine,
521
- size = new Vector2(10, 10),
522
- diffuse0 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdj+P///38ACfsD/QVDRcoAAAAASUVORK5CYII=",
523
- resolution = 10,
524
- waterLevel = 0,
525
- enableWater = true,
526
- }
527
- ) {
528
-
529
- const em = engine.entityManager;
530
-
531
- if (em.getSystem(TerrainSystem3) === null) {
532
- await em.addSystem(new TerrainSystem3(
533
- engine.graphics,
534
- EngineHarness.shadeScene(engine),
535
- engine.assetManager
536
- ));
537
- }
538
-
539
- const terrain = new Terrain();
540
-
541
- terrain.size.copy(size);
542
- terrain.resolution = resolution;
543
- terrain.gridScale = 2;
544
- terrain.layers.addLayer(TerrainLayer.from(
545
- diffuse0,
546
- 5,
547
- 5
548
- ));
549
- terrain.splat.resize(1, 1, 1);
550
- terrain.splat.fillLayerWeights(0, 255);
551
-
552
- const eb = new Entity();
553
-
554
- eb.add(new Transform())
555
- eb.add(terrain);
556
-
557
- if (enableWater) {
558
-
559
- if (em.getSystem(WaterSystem3) === null) {
560
- em.addSystem(new WaterSystem3(engine.graphics));
561
- }
562
-
563
- const water = new Water();
564
-
565
- water.level.set(waterLevel);
566
-
567
- eb.add(water);
568
- }
569
-
570
- eb.build(engine.entityManager.dataset);
571
-
572
- return terrain;
573
-
574
- }
575
- }
576
-
577
- let singleton = null;
578
-
579
- /**
580
- *
581
- * @returns {EngineHarness}
582
- */
583
- EngineHarness.getSingleton = function () {
584
- if (singleton === null) {
585
- singleton = new EngineHarness();
586
- }
587
-
588
- return singleton;
589
- };
590
-
1
+ import Stats from "stats.js";
2
+ import { assert } from "../core/assert.js";
3
+ import { Color } from "../core/color/Color.js";
4
+
5
+ import { noop } from "../core/function/noop.js";
6
+ import Vector2 from "../core/geom/Vector2.js";
7
+ import Vector3 from "../core/geom/Vector3.js";
8
+ import EmptyView from "../view/elements/EmptyView.js";
9
+ import { JsonAssetLoader } from "./asset/loaders/JsonAssetLoader.js";
10
+ import { SerializationMetadata } from "./ecs/components/SerializationMetadata.js";
11
+ import Tag from "./ecs/components/Tag.js";
12
+ import Entity from "./ecs/Entity.js";
13
+ import { TerrainLayer } from "./ecs/terrain/ecs/layers/TerrainLayer.js";
14
+ import Terrain from "./ecs/terrain/ecs/Terrain.js";
15
+ import { Transform } from "./ecs/transform/Transform.js";
16
+ import Engine from "./Engine.js";
17
+ import { EngineConfiguration } from "./EngineConfiguration.js";
18
+ import { makeOrbitalCameraController } from "./graphics/camera/makeOrbitalCameraController.js";
19
+ import { Camera } from "./graphics/ecs/camera/Camera.js";
20
+ import { CameraSystem } from "./graphics3/CameraSystem.js";
21
+ import { LightSystem } from "./graphics3/LightSystem.js";
22
+ import { TerrainSystem } from "./graphics3/TerrainSystem.js";
23
+ import { WaterSystem } from "./graphics3/WaterSystem.js";
24
+ import { Scene } from "../shade/renderer/scene/Scene.js";
25
+ import TopDownCameraController from "./graphics/ecs/camera/topdown/TopDownCameraController.js";
26
+ import TopDownCameraControllerSystem from "./graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js";
27
+ import { Light } from "./graphics/ecs/light/Light.js";
28
+ import Water from "./graphics/ecs/water/Water.js";
29
+ import { MouseEvents } from "./input/devices/events/MouseEvents.js";
30
+ import KeyboardCameraController from "./input/ecs/controllers/KeyboardCameraController.js";
31
+ import InputControllerSystem from "./input/ecs/systems/InputControllerSystem.js";
32
+ import { ConsoleLoggerBackend } from "./logging/ConsoleLoggerBackend.js";
33
+ import { logger } from "./logging/GlobalLogger.js";
34
+ import { getURLHash } from "./platform/GetURLHash.js";
35
+ import { WebEnginePlatform } from "./platform/WebEnginePlatform.js";
36
+ import SoundListener from "./sound/ecs/SoundListener.js";
37
+ import SoundListenerSystem from "./sound/ecs/SoundListenerSystem.js";
38
+
39
+ /**
40
+ * The Shade scene a harness's systems draw into, one per engine.
41
+ *
42
+ * **One scene, shared**, for the same reason the game's graphics profile says so: meshes, lights and
43
+ * terrain each tell the facade which scene to draw, and any two of them holding different ones draws
44
+ * a frame with most of the content missing. The facade hands no scene back out (D14), so somebody
45
+ * has to remember it, and for a harness that somebody is the harness.
46
+ *
47
+ * @type {WeakMap<Engine, Scene>}
48
+ */
49
+ const shade_scenes = new WeakMap();
50
+
51
+ /**
52
+ *
53
+ * @param {Engine} engine
54
+ * @returns {Promise}
55
+ */
56
+ function setLocale(engine) {
57
+
58
+ const urlHash = getURLHash();
59
+
60
+ let locale;
61
+ if (urlHash.lang !== undefined) {
62
+ locale = urlHash.lang;
63
+ } else {
64
+ locale = "en-gb";
65
+ }
66
+
67
+ return engine.localization.loadLocale(locale);
68
+ }
69
+
70
+ /**
71
+ * Equal to ~ 5500 K light color
72
+ * @type {Readonly<Color>}
73
+ */
74
+ const DEFAULT_SUNLIGHT_COLOR = Object.freeze(new Color(1, 0.93, 0.87));
75
+
76
+ export class EngineHarness {
77
+ /**
78
+ * @readonly
79
+ * @type {Promise|null}
80
+ */
81
+ p = null;
82
+
83
+ constructor() {
84
+ /**
85
+ *
86
+ * @type {Engine}
87
+ */
88
+ this.engine = new Engine(new WebEnginePlatform());
89
+
90
+ window.engine = this.engine;
91
+
92
+ logger.addBackend(ConsoleLoggerBackend.INSTANCE);
93
+ }
94
+
95
+ /**
96
+ * Quick initialization of the engine in a sensible default configuration
97
+ * @param {(config:EngineConfiguration,engine:Engine)=>*} [configuration]
98
+ * @return {Promise<Engine>}
99
+ */
100
+ static async bootstrap({ configuration } = {}) {
101
+ const harness = new EngineHarness();
102
+
103
+ return harness.initialize({ configuration });
104
+ }
105
+
106
+ /**
107
+ * The Shade scene this engine's harness systems draw into, made on first ask.
108
+ *
109
+ * A harness that registers a `MeshSystem` of its own — the editor shell does — asks for it here
110
+ * rather than making one, so that its models land in the same scene the harness's lights and
111
+ * terrain do.
112
+ *
113
+ * @param {Engine} engine
114
+ * @returns {Scene}
115
+ */
116
+ static shadeScene(engine) {
117
+ let scene = shade_scenes.get(engine);
118
+
119
+ if (scene === undefined) {
120
+ scene = new Scene();
121
+
122
+ shade_scenes.set(engine, scene);
123
+ }
124
+
125
+ return scene;
126
+ }
127
+
128
+ /**
129
+ *
130
+ * @param {Engine} engine
131
+ */
132
+ static addFpsCounter(engine) {
133
+ /*
134
+ `stats.js` by its own name. three shipped a copy of it as
135
+ `examples/jsm/libs/stats.module.js`, which is what this used to import; moh already declares
136
+ the package, so this is the same code under the name its author gives it (D64).
137
+ */
138
+ const stats = new Stats();
139
+
140
+ engine.graphics.on.postRender.add(stats.update, stats);
141
+
142
+ const view = new EmptyView({
143
+ el: stats.domElement
144
+ });
145
+
146
+ engine.viewStack.addChild(view);
147
+ }
148
+
149
+ /**
150
+ * @param {Object} [params]
151
+ * @param {(config:EngineConfiguration,engine:Engine)=>*} [params.configuration]
152
+ * @param {boolean} [params.enable_localization] Whether or not to load localization data
153
+ * @returns {Promise<Engine>}
154
+ */
155
+ initialize({
156
+ configuration = noop,
157
+ enable_localization = false,
158
+ } = {}) {
159
+
160
+ if (this.p !== null) {
161
+ return this.p;
162
+ }
163
+
164
+ const engine = this.engine;
165
+
166
+ const promise = new Promise(async function (resolve, reject) {
167
+ const config = new EngineConfiguration();
168
+
169
+ configuration(config, engine);
170
+
171
+ if (!config.hasLoader('json')) {
172
+ config.addLoader('json', new JsonAssetLoader());
173
+ }
174
+
175
+ await config.apply(engine);
176
+
177
+ engine.sceneManager.create("main");
178
+ engine.sceneManager.set("main");
179
+
180
+ await engine.start();
181
+
182
+ if (enable_localization) {
183
+ try {
184
+ await setLocale(engine);
185
+ } catch (e) {
186
+ console.warn('Failed to load localization:', e);
187
+ }
188
+ }
189
+
190
+ document.body.appendChild(engine.viewStack.el);
191
+ engine.viewStack.link();
192
+
193
+ // set css
194
+ document.body.style.margin = "0";
195
+ document.body.style.overflow = "hidden";
196
+
197
+ function handleInput() {
198
+ window.removeEventListener(MouseEvents.Down, handleInput);
199
+
200
+ engine.sound.resumeContext();
201
+ }
202
+
203
+ window.addEventListener(MouseEvents.Down, handleInput);
204
+
205
+ resolve(engine);
206
+ });
207
+
208
+ this.p = promise;
209
+
210
+ return promise;
211
+ }
212
+
213
+ /**
214
+ * @param {Object} param
215
+ * @param {Engine} param.engine
216
+ * @param {EntityComponentDataset} [param.ecd]
217
+ * @param {Vector3} [param.target]
218
+ * @param {number} [param.distance]
219
+ * @param {number} [param.pitch]
220
+ * @param {number} [param.yaw]
221
+ * @param {boolean} [param.autoClip]
222
+ * @param {number} [param.distanceMin]
223
+ * @param {number} [param.distanceMax]
224
+ * @param {number} [param.fieldOfView] in degrees
225
+ * @returns {Entity}
226
+ */
227
+ static buildCamera(
228
+ {
229
+ engine,
230
+ ecd = engine.entityManager.dataset,
231
+ target = new Vector3(),
232
+ distance = 10,
233
+ pitch = 1.4,
234
+ yaw = 0,
235
+ autoClip = true,
236
+ distanceMin = 0.01,
237
+ distanceMax = 1000,
238
+ fieldOfView = 45
239
+ }
240
+ ) {
241
+ const em = engine.entityManager;
242
+
243
+ if (em.getSystem(TopDownCameraControllerSystem) === null) {
244
+ em.addSystem(new TopDownCameraControllerSystem());
245
+ }
246
+ if (em.getSystem(CameraSystem) === null) {
247
+ em.addSystem(new CameraSystem(engine.graphics));
248
+ }
249
+
250
+ if (em.getSystem(SoundListenerSystem) === null) {
251
+ em.addSystem(new SoundListenerSystem(engine.sound.context));
252
+ }
253
+
254
+ if (!ecd.isComponentTypeRegistered(Tag)) {
255
+ ecd.registerComponentType(Tag);
256
+ }
257
+
258
+ const transform = new Transform();
259
+
260
+ const cameraController = new TopDownCameraController();
261
+ cameraController.pitch = pitch;
262
+ cameraController.yaw = yaw;
263
+ cameraController.distance = distance;
264
+ cameraController.distanceMin = distanceMin;
265
+ cameraController.distanceMax = distanceMax;
266
+ cameraController.target.copy(target);
267
+
268
+ const camera = new Camera();
269
+
270
+ camera.active.set(true);
271
+ camera.autoClip = autoClip;
272
+ camera.clip_far = distanceMax;
273
+ camera.fov.set(fieldOfView);
274
+
275
+ const entityBuilder = new Entity();
276
+
277
+ entityBuilder
278
+ .add(transform)
279
+ .add(cameraController)
280
+ .add(camera)
281
+ .add(new SoundListener())
282
+ .add(Tag.fromJSON(["Camera"]))
283
+ .build(ecd);
284
+
285
+ console.log("build camera", entityBuilder);
286
+
287
+ return entityBuilder;
288
+ }
289
+
290
+ /**
291
+ * @param {Object} params
292
+ * @param {Engine} params.engine
293
+ * @param {{x:number,y:number,z:number}} [params.focus]
294
+ * @param [params.heightMap]
295
+ * @param [params.heightRange]
296
+ * @param {number} [params.pitch]
297
+ * @param {number} [params.yaw]
298
+ * @param {number} [params.distance]
299
+ * @param {{x:number, y:number}} [params.terrainSize]
300
+ * @param {number} [params.terrainResolution]
301
+ * @param {boolean} [params.enableWater]
302
+ * @param {boolean} [params.enableTerrain]
303
+ * @param {boolean} [params.enableLights=true]
304
+ * @param {boolean} [params.enableShadows=true] if lights are enabled, enable shadows for sun
305
+ * @param {number} [params.cameraFieldOfView]
306
+ * @param {number} [params.cameraFarDistance]
307
+ * @param {boolean} [params.cameraController=true]
308
+ * @param {boolean} [params.cameraAutoClip]
309
+ * @param {number} [params.shadowmapResolution]
310
+ * @param {boolean} [params.showFps]
311
+ */
312
+ static async buildBasics({
313
+ engine,
314
+ focus = new Vector3(0, 0, 0),
315
+ heightMap,
316
+ heightRange,
317
+ pitch = 0.7,
318
+ yaw = 0,
319
+ distance = 10,
320
+ terrainSize = new Vector2(10, 10),
321
+ terrainResolution = 10,
322
+ enableWater = true,
323
+ enableTerrain = true,
324
+ enableLights = true,
325
+ enableShadows = true,
326
+ cameraFieldOfView,
327
+ cameraFarDistance,
328
+ cameraController = true,
329
+ cameraAutoClip = true,
330
+ shadowmapResolution,
331
+ showFps = false
332
+ }) {
333
+
334
+ if (showFps) {
335
+ EngineHarness.addFpsCounter(engine);
336
+ }
337
+
338
+ if (enableLights) {
339
+ await EngineHarness.buildLights({
340
+ engine: engine,
341
+ shadowmapResolution,
342
+ castShadow: enableShadows,
343
+ });
344
+ }
345
+
346
+ const camera = EngineHarness.buildCamera({
347
+ engine,
348
+ target: focus,
349
+ pitch,
350
+ yaw,
351
+ distance,
352
+ fieldOfView: cameraFieldOfView,
353
+ distanceMax: cameraFarDistance,
354
+ autoClip: cameraAutoClip
355
+ });
356
+
357
+ const cameraEntity = camera.id;
358
+
359
+ if (enableTerrain) {
360
+ await EngineHarness.buildTerrain({
361
+ engine,
362
+ heightMap,
363
+ heightRange,
364
+ resolution: terrainResolution,
365
+ size: terrainSize,
366
+ enableWater
367
+ });
368
+ }
369
+
370
+ if (cameraController) {
371
+ await EngineHarness.buildOrbitalCameraController({
372
+ engine,
373
+ cameraEntity: cameraEntity
374
+ });
375
+
376
+ const ecd = engine.entityManager.dataset;
377
+ const keyboardCameraController = new KeyboardCameraController({
378
+ component: ecd.getComponent(cameraEntity, TopDownCameraController),
379
+ entity: cameraEntity
380
+ }, ecd);
381
+
382
+ keyboardCameraController.build(ecd);
383
+ }
384
+ }
385
+
386
+
387
+ /**
388
+ * @param {Object} param
389
+ * @param {Engine} param.engine
390
+ * @param {EntityComponentDataset} [param.ecd]
391
+ * @param {number} [param.shadowmapResolution]
392
+ * @param {boolean} [param.castShadow]
393
+ * @param {Color} [param.sun]
394
+ * @param {number} [param.sunIntensity]
395
+ * @param {Vector3} [param.sunDirection]
396
+ * @param {Color} [param.ambient]
397
+ * @param {number} [param.ambientIntensity]
398
+ * @param {number} [param.sunShadowDistance] Maximum draw distance for sun's shadow. Allows better use of shadowmap resolution.
399
+ */
400
+ static async buildLights({
401
+ engine,
402
+ ecd = engine.entityManager.dataset,
403
+ shadowmapResolution = 2048,
404
+ castShadow = true,
405
+ sun = DEFAULT_SUNLIGHT_COLOR,
406
+ sunIntensity = 0.9,
407
+ sunDirection = new Vector3(0.17, -1, 0.17),
408
+ sunShadowDistance = 1000,
409
+ ambient = Color.white,
410
+ ambientIntensity = 0.07
411
+ }) {
412
+ const em = engine.entityManager;
413
+
414
+ if (!em.hasSystem(LightSystem)) {
415
+ await em.addSystem(new LightSystem(engine.graphics, EngineHarness.shadeScene(engine)));
416
+ }
417
+
418
+ if (!ecd.isComponentTypeRegistered(Tag)) {
419
+ ecd.registerComponentType(Tag);
420
+ }
421
+
422
+ const key = new Light();
423
+ key.type.set(Light.Type.DIRECTION);
424
+ key.color.copy(sun);
425
+ key.maxShadowDistance.set(sunShadowDistance);
426
+ key.intensity.set(sunIntensity);
427
+ key.castShadow.set(castShadow);
428
+
429
+ const transform = new Transform();
430
+ transform.position.set(30, 70, 30);
431
+ transform.rotation.lookRotation(sunDirection);
432
+
433
+ new Entity()
434
+ .add(key)
435
+ .add(transform)
436
+ .add(Tag.fromJSON(["Light", "Key"]))
437
+ .build(ecd);
438
+
439
+
440
+ const fill = new Light();
441
+ fill.type.set(Light.Type.AMBIENT);
442
+ fill.color.copy(ambient);
443
+ fill.intensity.set(ambientIntensity);
444
+
445
+
446
+ new Entity()
447
+ .add(fill)
448
+ .add(new Transform())
449
+ .add(Tag.fromJSON(["Light", "Ambient"]))
450
+ .build(ecd);
451
+ }
452
+
453
+ /**
454
+ * @param {Object} param
455
+ * @param {number} [param.cameraEntity]
456
+ * @param {Engine} param.engine
457
+ * @param {number} [param.sensitivity]
458
+ * @param {EntityComponentDataset} [param.ecd]
459
+ * @returns {Promise<Entity>}
460
+ */
461
+ static async buildOrbitalCameraController({
462
+ cameraEntity,
463
+ engine,
464
+ ecd = engine.entityManager.dataset,
465
+ sensitivity = 1
466
+ }) {
467
+
468
+ if (cameraEntity === undefined) {
469
+ cameraEntity = ecd.getAnyComponent(Camera).entity;
470
+ }
471
+
472
+ assert.defined(cameraEntity, "cameraEntity");
473
+
474
+ const em = engine.entityManager;
475
+
476
+ if (em.getSystem(InputControllerSystem) === null) {
477
+ await em.addSystem(new InputControllerSystem(engine.devices));
478
+ }
479
+
480
+ if (!ecd.isComponentTypeRegistered(SerializationMetadata)) {
481
+ ecd.registerComponentType(SerializationMetadata);
482
+ }
483
+
484
+ const domElement = engine.graphics.domElement;
485
+
486
+
487
+ domElement.addEventListener("contextmenu", (event) => {
488
+ event.preventDefault();
489
+ });
490
+
491
+ const eb = makeOrbitalCameraController({
492
+ camera_entity: cameraEntity,
493
+ ecd,
494
+ dom_element: domElement,
495
+ sensitivity
496
+ });
497
+
498
+ eb.add(Tag.fromJSON(['CameraController']));
499
+ eb.add(SerializationMetadata.Transient);
500
+
501
+ eb.build(ecd);
502
+
503
+ return eb;
504
+ }
505
+
506
+
507
+ /**
508
+ *
509
+ * @param {Engine} engine
510
+ * @param {Vector2} [size]
511
+ * @param {String} [diffuse0]
512
+ * @param heightMap
513
+ * @param {number} [resolution]
514
+ * @param {number} [waterLevel]
515
+ * @param {boolean} [enableWater]
516
+ * @returns {Terrain}
517
+ */
518
+ static async buildTerrain(
519
+ {
520
+ engine,
521
+ size = new Vector2(10, 10),
522
+ diffuse0 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdj+P///38ACfsD/QVDRcoAAAAASUVORK5CYII=",
523
+ resolution = 10,
524
+ waterLevel = 0,
525
+ enableWater = true,
526
+ }
527
+ ) {
528
+
529
+ const em = engine.entityManager;
530
+
531
+ if (em.getSystem(TerrainSystem) === null) {
532
+ await em.addSystem(new TerrainSystem(
533
+ engine.graphics,
534
+ EngineHarness.shadeScene(engine),
535
+ engine.assetManager
536
+ ));
537
+ }
538
+
539
+ const terrain = new Terrain();
540
+
541
+ terrain.size.copy(size);
542
+ terrain.resolution = resolution;
543
+ terrain.gridScale = 2;
544
+ terrain.layers.addLayer(TerrainLayer.from(
545
+ diffuse0,
546
+ 5,
547
+ 5
548
+ ));
549
+ terrain.splat.resize(1, 1, 1);
550
+ terrain.splat.fillLayerWeights(0, 255);
551
+
552
+ const eb = new Entity();
553
+
554
+ eb.add(new Transform())
555
+ eb.add(terrain);
556
+
557
+ if (enableWater) {
558
+
559
+ if (em.getSystem(WaterSystem) === null) {
560
+ em.addSystem(new WaterSystem(engine.graphics));
561
+ }
562
+
563
+ const water = new Water();
564
+
565
+ water.level.set(waterLevel);
566
+
567
+ eb.add(water);
568
+ }
569
+
570
+ eb.build(engine.entityManager.dataset);
571
+
572
+ return terrain;
573
+
574
+ }
575
+ }
576
+
577
+ let singleton = null;
578
+
579
+ /**
580
+ *
581
+ * @returns {EngineHarness}
582
+ */
583
+ EngineHarness.getSingleton = function () {
584
+ if (singleton === null) {
585
+ singleton = new EngineHarness();
586
+ }
587
+
588
+ return singleton;
589
+ };
590
+