@aura3d/engine 1.4.5 → 1.5.1

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 (513) hide show
  1. package/README.md +95 -29
  2. package/dist/animation/Retargeting.d.ts +12 -0
  3. package/dist/animation/Retargeting.d.ts.map +1 -0
  4. package/dist/animation/Retargeting.js +19 -0
  5. package/dist/animation/Retargeting.js.map +1 -0
  6. package/dist/assets/GLTFLoader.d.ts +4 -0
  7. package/dist/assets/GLTFLoader.d.ts.map +1 -1
  8. package/dist/assets/GLTFLoader.js +39 -4
  9. package/dist/assets/GLTFLoader.js.map +1 -1
  10. package/dist/assets/GLTFRenderResources.d.ts +16 -0
  11. package/dist/assets/GLTFRenderResources.d.ts.map +1 -1
  12. package/dist/assets/GLTFRenderResources.js +42 -2
  13. package/dist/assets/GLTFRenderResources.js.map +1 -1
  14. package/dist/assets/asset-corpus/ProductionGLTFRenderPipeline.d.ts +6 -0
  15. package/dist/assets/asset-corpus/ProductionGLTFRenderPipeline.d.ts.map +1 -1
  16. package/dist/assets/asset-corpus/ProductionGLTFRenderPipeline.js +2 -1
  17. package/dist/assets/asset-corpus/ProductionGLTFRenderPipeline.js.map +1 -1
  18. package/dist/assets/index.d.ts +0 -1
  19. package/dist/assets/index.d.ts.map +1 -1
  20. package/dist/assets/index.js +0 -1
  21. package/dist/assets/index.js.map +1 -1
  22. package/dist/assets/loaders/index.d.ts +0 -1
  23. package/dist/assets/loaders/index.d.ts.map +1 -1
  24. package/dist/assets/loaders/index.js +0 -1
  25. package/dist/assets/loaders/index.js.map +1 -1
  26. package/dist/aura3d-cli/asset-intent.d.ts +148 -0
  27. package/dist/aura3d-cli/asset-intent.d.ts.map +1 -0
  28. package/dist/aura3d-cli/asset-intent.js +145 -0
  29. package/dist/aura3d-cli/asset-intent.js.map +1 -0
  30. package/dist/aura3d-cli/asset-role-admission.d.ts +174 -0
  31. package/dist/aura3d-cli/asset-role-admission.d.ts.map +1 -0
  32. package/dist/aura3d-cli/asset-role-admission.js +381 -0
  33. package/dist/aura3d-cli/asset-role-admission.js.map +1 -0
  34. package/dist/aura3d-cli/asset-screening-effects.d.ts +95 -0
  35. package/dist/aura3d-cli/asset-screening-effects.d.ts.map +1 -0
  36. package/dist/aura3d-cli/asset-screening-effects.js +321 -0
  37. package/dist/aura3d-cli/asset-screening-effects.js.map +1 -0
  38. package/dist/aura3d-cli/asset-screening-pipeline.d.ts +132 -0
  39. package/dist/aura3d-cli/asset-screening-pipeline.d.ts.map +1 -0
  40. package/dist/aura3d-cli/asset-screening-pipeline.js +277 -0
  41. package/dist/aura3d-cli/asset-screening-pipeline.js.map +1 -0
  42. package/dist/aura3d-cli/cartoon-asset-profiles.d.ts +15 -0
  43. package/dist/aura3d-cli/cartoon-asset-profiles.d.ts.map +1 -0
  44. package/dist/aura3d-cli/cartoon-asset-profiles.js +46 -0
  45. package/dist/aura3d-cli/cartoon-asset-profiles.js.map +1 -0
  46. package/dist/aura3d-cli/cli-help.js +1 -1
  47. package/dist/aura3d-cli/cli.js +16 -2
  48. package/dist/aura3d-cli/cli.js.map +1 -1
  49. package/dist/aura3d-cli/index.d.ts +8 -0
  50. package/dist/aura3d-cli/index.d.ts.map +1 -1
  51. package/dist/aura3d-cli/index.js +390 -17
  52. package/dist/aura3d-cli/index.js.map +1 -1
  53. package/dist/aura3d-cli/pull-bridge/search.d.ts +4 -0
  54. package/dist/aura3d-cli/pull-bridge/search.d.ts.map +1 -1
  55. package/dist/aura3d-cli/pull-bridge/search.js +22 -0
  56. package/dist/aura3d-cli/pull-bridge/search.js.map +1 -1
  57. package/dist/aura3d-cli/pull-bridge.d.ts +20 -5
  58. package/dist/aura3d-cli/pull-bridge.d.ts.map +1 -1
  59. package/dist/aura3d-cli/pull-bridge.js +38 -1
  60. package/dist/aura3d-cli/pull-bridge.js.map +1 -1
  61. package/dist/controls/ControlState.d.ts +1 -1
  62. package/dist/controls/ControlState.d.ts.map +1 -1
  63. package/dist/controls/DragControls.d.ts +21 -1
  64. package/dist/controls/DragControls.d.ts.map +1 -1
  65. package/dist/controls/DragControls.js +24 -2
  66. package/dist/controls/DragControls.js.map +1 -1
  67. package/dist/controls/FirstPersonControls.d.ts +10 -1
  68. package/dist/controls/FirstPersonControls.d.ts.map +1 -1
  69. package/dist/controls/FirstPersonControls.js +18 -2
  70. package/dist/controls/FirstPersonControls.js.map +1 -1
  71. package/dist/controls/FlyControls.d.ts +42 -0
  72. package/dist/controls/FlyControls.d.ts.map +1 -1
  73. package/dist/controls/FlyControls.js +106 -3
  74. package/dist/controls/FlyControls.js.map +1 -1
  75. package/dist/controls/MapControls.d.ts +13 -0
  76. package/dist/controls/MapControls.d.ts.map +1 -1
  77. package/dist/controls/MapControls.js +40 -2
  78. package/dist/controls/MapControls.js.map +1 -1
  79. package/dist/controls/OrbitControls.d.ts +54 -0
  80. package/dist/controls/OrbitControls.d.ts.map +1 -1
  81. package/dist/controls/OrbitControls.js +133 -0
  82. package/dist/controls/OrbitControls.js.map +1 -1
  83. package/dist/controls/PointerLockControls.d.ts +12 -5
  84. package/dist/controls/PointerLockControls.d.ts.map +1 -1
  85. package/dist/controls/PointerLockControls.js +30 -11
  86. package/dist/controls/PointerLockControls.js.map +1 -1
  87. package/dist/controls/SelectionManager.d.ts +22 -1
  88. package/dist/controls/SelectionManager.d.ts.map +1 -1
  89. package/dist/controls/SelectionManager.js +64 -6
  90. package/dist/controls/SelectionManager.js.map +1 -1
  91. package/dist/controls/TransformControls.d.ts +135 -1
  92. package/dist/controls/TransformControls.d.ts.map +1 -1
  93. package/dist/controls/TransformControls.js +534 -10
  94. package/dist/controls/TransformControls.js.map +1 -1
  95. package/dist/controls/index.d.ts +7 -2
  96. package/dist/controls/index.d.ts.map +1 -1
  97. package/dist/controls/index.js +1 -1
  98. package/dist/controls/index.js.map +1 -1
  99. package/dist/create-aura3d/showcase-spec-game-geometry-extractor.d.ts +2 -0
  100. package/dist/create-aura3d/showcase-spec-game-geometry-extractor.d.ts.map +1 -1
  101. package/dist/create-aura3d/showcase-spec-game-geometry-extractor.js +769 -42
  102. package/dist/create-aura3d/showcase-spec-game-geometry-extractor.js.map +1 -1
  103. package/dist/create-aura3d/showcase-spec-game-template-evidence.d.ts.map +1 -1
  104. package/dist/create-aura3d/showcase-spec-game-template-evidence.js +22 -2
  105. package/dist/create-aura3d/showcase-spec-game-template-evidence.js.map +1 -1
  106. package/dist/create-aura3d/showcase-spec-replacement-candidates.js +26 -0
  107. package/dist/create-aura3d/showcase-spec-replacement-candidates.js.map +1 -1
  108. package/dist/ecs/components/MeshComponent.d.ts +5 -2
  109. package/dist/ecs/components/MeshComponent.d.ts.map +1 -1
  110. package/dist/ecs/components/MeshComponent.js.map +1 -1
  111. package/dist/editor-runtime/CartoonSceneEditor.d.ts +111 -0
  112. package/dist/editor-runtime/CartoonSceneEditor.d.ts.map +1 -0
  113. package/dist/editor-runtime/CartoonSceneEditor.js +285 -0
  114. package/dist/editor-runtime/CartoonSceneEditor.js.map +1 -0
  115. package/dist/editor-runtime/InteractiveTransformGizmo.d.ts +142 -0
  116. package/dist/editor-runtime/InteractiveTransformGizmo.d.ts.map +1 -0
  117. package/dist/editor-runtime/InteractiveTransformGizmo.js +468 -0
  118. package/dist/editor-runtime/InteractiveTransformGizmo.js.map +1 -0
  119. package/dist/editor-runtime/index.d.ts +2 -0
  120. package/dist/editor-runtime/index.d.ts.map +1 -1
  121. package/dist/editor-runtime/index.js +1 -0
  122. package/dist/editor-runtime/index.js.map +1 -1
  123. package/dist/engine/agent-api/ApplicationKits.d.ts +307 -0
  124. package/dist/engine/agent-api/ApplicationKits.d.ts.map +1 -0
  125. package/dist/engine/agent-api/ApplicationKits.js +650 -0
  126. package/dist/engine/agent-api/ApplicationKits.js.map +1 -0
  127. package/dist/engine/agent-api/CartoonAssetManifest.d.ts +50 -0
  128. package/dist/engine/agent-api/CartoonAssetManifest.d.ts.map +1 -0
  129. package/dist/engine/agent-api/CartoonAssetManifest.js +65 -0
  130. package/dist/engine/agent-api/CartoonAssetManifest.js.map +1 -0
  131. package/dist/engine/agent-api/CartoonDirector.d.ts +120 -0
  132. package/dist/engine/agent-api/CartoonDirector.d.ts.map +1 -0
  133. package/dist/engine/agent-api/CartoonDirector.js +432 -0
  134. package/dist/engine/agent-api/CartoonDirector.js.map +1 -0
  135. package/dist/engine/agent-api/CartoonEpisodePackage.d.ts +51 -0
  136. package/dist/engine/agent-api/CartoonEpisodePackage.d.ts.map +1 -0
  137. package/dist/engine/agent-api/CartoonEpisodePackage.js +79 -0
  138. package/dist/engine/agent-api/CartoonEpisodePackage.js.map +1 -0
  139. package/dist/engine/agent-api/CartoonMotionQuality.d.ts +83 -0
  140. package/dist/engine/agent-api/CartoonMotionQuality.d.ts.map +1 -0
  141. package/dist/engine/agent-api/CartoonMotionQuality.js +128 -0
  142. package/dist/engine/agent-api/CartoonMotionQuality.js.map +1 -0
  143. package/dist/engine/agent-api/CartoonPerformance.d.ts +150 -0
  144. package/dist/engine/agent-api/CartoonPerformance.d.ts.map +1 -0
  145. package/dist/engine/agent-api/CartoonPerformance.js +345 -0
  146. package/dist/engine/agent-api/CartoonPerformance.js.map +1 -0
  147. package/dist/engine/agent-api/CartoonRenderQueue.d.ts +143 -0
  148. package/dist/engine/agent-api/CartoonRenderQueue.d.ts.map +1 -0
  149. package/dist/engine/agent-api/CartoonRenderQueue.js +410 -0
  150. package/dist/engine/agent-api/CartoonRenderQueue.js.map +1 -0
  151. package/dist/engine/agent-api/CartoonRouteProof.d.ts +112 -0
  152. package/dist/engine/agent-api/CartoonRouteProof.d.ts.map +1 -0
  153. package/dist/engine/agent-api/CartoonRouteProof.js +127 -0
  154. package/dist/engine/agent-api/CartoonRouteProof.js.map +1 -0
  155. package/dist/engine/agent-api/CombatFrameData.d.ts +210 -0
  156. package/dist/engine/agent-api/CombatFrameData.d.ts.map +1 -0
  157. package/dist/engine/agent-api/CombatFrameData.js +324 -0
  158. package/dist/engine/agent-api/CombatFrameData.js.map +1 -0
  159. package/dist/engine/agent-api/FocusSelection.d.ts +186 -0
  160. package/dist/engine/agent-api/FocusSelection.d.ts.map +1 -0
  161. package/dist/engine/agent-api/FocusSelection.js +436 -0
  162. package/dist/engine/agent-api/FocusSelection.js.map +1 -0
  163. package/dist/engine/agent-api/GameEvidence.d.ts +1 -0
  164. package/dist/engine/agent-api/GameEvidence.d.ts.map +1 -1
  165. package/dist/engine/agent-api/GameEvidence.js +1 -0
  166. package/dist/engine/agent-api/GameEvidence.js.map +1 -1
  167. package/dist/engine/agent-api/GameGenreKits.d.ts +43 -1
  168. package/dist/engine/agent-api/GameGenreKits.d.ts.map +1 -1
  169. package/dist/engine/agent-api/GameGenreKits.js +79 -13
  170. package/dist/engine/agent-api/GameGenreKits.js.map +1 -1
  171. package/dist/engine/agent-api/GameRuntime.d.ts +1 -0
  172. package/dist/engine/agent-api/GameRuntime.d.ts.map +1 -1
  173. package/dist/engine/agent-api/GameRuntime.js +1 -0
  174. package/dist/engine/agent-api/GameRuntime.js.map +1 -1
  175. package/dist/engine/agent-api/GameSceneGeometryBindings.d.ts +22 -0
  176. package/dist/engine/agent-api/GameSceneGeometryBindings.d.ts.map +1 -1
  177. package/dist/engine/agent-api/GameSceneGeometryBindings.js +9 -0
  178. package/dist/engine/agent-api/GameSceneGeometryBindings.js.map +1 -1
  179. package/dist/engine/agent-api/LayeredSceneComposition.d.ts +295 -0
  180. package/dist/engine/agent-api/LayeredSceneComposition.d.ts.map +1 -0
  181. package/dist/engine/agent-api/LayeredSceneComposition.js +387 -0
  182. package/dist/engine/agent-api/LayeredSceneComposition.js.map +1 -0
  183. package/dist/engine/agent-api/PlatformerMotion.d.ts +177 -0
  184. package/dist/engine/agent-api/PlatformerMotion.d.ts.map +1 -0
  185. package/dist/engine/agent-api/PlatformerMotion.js +207 -0
  186. package/dist/engine/agent-api/PlatformerMotion.js.map +1 -0
  187. package/dist/engine/agent-api/SceneGroundingUtils.d.ts +62 -0
  188. package/dist/engine/agent-api/SceneGroundingUtils.d.ts.map +1 -1
  189. package/dist/engine/agent-api/SceneGroundingUtils.js +37 -0
  190. package/dist/engine/agent-api/SceneGroundingUtils.js.map +1 -1
  191. package/dist/engine/agent-api/SceneQueries.d.ts +124 -0
  192. package/dist/engine/agent-api/SceneQueries.d.ts.map +1 -0
  193. package/dist/engine/agent-api/SceneQueries.js +221 -0
  194. package/dist/engine/agent-api/SceneQueries.js.map +1 -0
  195. package/dist/engine/agent-api/SpatialAnchoring.d.ts +232 -0
  196. package/dist/engine/agent-api/SpatialAnchoring.d.ts.map +1 -0
  197. package/dist/engine/agent-api/SpatialAnchoring.js +348 -0
  198. package/dist/engine/agent-api/SpatialAnchoring.js.map +1 -0
  199. package/dist/engine/agent-api/SubjectFramingUtils.d.ts +127 -0
  200. package/dist/engine/agent-api/SubjectFramingUtils.d.ts.map +1 -0
  201. package/dist/engine/agent-api/SubjectFramingUtils.js +126 -0
  202. package/dist/engine/agent-api/SubjectFramingUtils.js.map +1 -0
  203. package/dist/engine/agent-api/TouchControlBinding.d.ts +81 -0
  204. package/dist/engine/agent-api/TouchControlBinding.d.ts.map +1 -0
  205. package/dist/engine/agent-api/TouchControlBinding.js +116 -0
  206. package/dist/engine/agent-api/TouchControlBinding.js.map +1 -0
  207. package/dist/engine/agent-api/VehicleChassis.d.ts +192 -0
  208. package/dist/engine/agent-api/VehicleChassis.d.ts.map +1 -0
  209. package/dist/engine/agent-api/VehicleChassis.js +322 -0
  210. package/dist/engine/agent-api/VehicleChassis.js.map +1 -0
  211. package/dist/engine/agent-api/VehicleDriverAi.d.ts +123 -0
  212. package/dist/engine/agent-api/VehicleDriverAi.d.ts.map +1 -0
  213. package/dist/engine/agent-api/VehicleDriverAi.js +217 -0
  214. package/dist/engine/agent-api/VehicleDriverAi.js.map +1 -0
  215. package/dist/engine/agent-api/WorldLabelRenderer.d.ts +146 -0
  216. package/dist/engine/agent-api/WorldLabelRenderer.d.ts.map +1 -0
  217. package/dist/engine/agent-api/WorldLabelRenderer.js +331 -0
  218. package/dist/engine/agent-api/WorldLabelRenderer.js.map +1 -0
  219. package/dist/engine/agent-api/index.d.ts +69 -0
  220. package/dist/engine/agent-api/index.d.ts.map +1 -1
  221. package/dist/engine/agent-api/index.js +633 -75
  222. package/dist/engine/agent-api/index.js.map +1 -1
  223. package/dist/engine/agent-api/product-viewer-runtime.d.ts.map +1 -1
  224. package/dist/engine/production-runtime/GameRenderPreset.d.ts +32 -0
  225. package/dist/engine/production-runtime/GameRenderPreset.d.ts.map +1 -1
  226. package/dist/engine/production-runtime/GameRenderPreset.js +37 -2
  227. package/dist/engine/production-runtime/GameRenderPreset.js.map +1 -1
  228. package/dist/engine/production-runtime/TypedGLBActor.d.ts +8 -0
  229. package/dist/engine/production-runtime/TypedGLBActor.d.ts.map +1 -1
  230. package/dist/engine/production-runtime/TypedGLBActor.js +2 -1
  231. package/dist/engine/production-runtime/TypedGLBActor.js.map +1 -1
  232. package/dist/input/controls/PointerLockControls.d.ts +1 -1
  233. package/dist/input/controls/PointerLockControls.d.ts.map +1 -1
  234. package/dist/input/controls/PointerLockControls.js +12 -0
  235. package/dist/input/controls/PointerLockControls.js.map +1 -1
  236. package/dist/physics/Collider.d.ts +1 -1
  237. package/dist/physics/Collider.d.ts.map +1 -1
  238. package/dist/physics/Collider.js +2 -2
  239. package/dist/physics/Collider.js.map +1 -1
  240. package/dist/physics/CollisionEvents.d.ts +1 -0
  241. package/dist/physics/CollisionEvents.d.ts.map +1 -1
  242. package/dist/physics/CollisionEvents.js.map +1 -1
  243. package/dist/physics/NarrowPhase.d.ts +11 -0
  244. package/dist/physics/NarrowPhase.d.ts.map +1 -0
  245. package/dist/physics/NarrowPhase.js +565 -0
  246. package/dist/physics/NarrowPhase.js.map +1 -0
  247. package/dist/physics/PhysicsDebugDraw.js +19 -1
  248. package/dist/physics/PhysicsDebugDraw.js.map +1 -1
  249. package/dist/physics/PhysicsWorld.d.ts +43 -0
  250. package/dist/physics/PhysicsWorld.d.ts.map +1 -1
  251. package/dist/physics/PhysicsWorld.js +305 -30
  252. package/dist/physics/PhysicsWorld.js.map +1 -1
  253. package/dist/physics/RigidBody.d.ts +8 -1
  254. package/dist/physics/RigidBody.d.ts.map +1 -1
  255. package/dist/physics/RigidBody.js +32 -5
  256. package/dist/physics/RigidBody.js.map +1 -1
  257. package/dist/physics/Shape.d.ts +16 -2
  258. package/dist/physics/Shape.d.ts.map +1 -1
  259. package/dist/physics/Shape.js +93 -31
  260. package/dist/physics/Shape.js.map +1 -1
  261. package/dist/physics/TimeOfImpact.d.ts +15 -0
  262. package/dist/physics/TimeOfImpact.d.ts.map +1 -0
  263. package/dist/physics/TimeOfImpact.js +81 -0
  264. package/dist/physics/TimeOfImpact.js.map +1 -0
  265. package/dist/physics/index.d.ts +2 -0
  266. package/dist/physics/index.d.ts.map +1 -1
  267. package/dist/physics/index.js +2 -0
  268. package/dist/physics/index.js.map +1 -1
  269. package/dist/rendering/CascadedShadowMaps.d.ts +9 -1
  270. package/dist/rendering/CascadedShadowMaps.d.ts.map +1 -1
  271. package/dist/rendering/CascadedShadowMaps.js +68 -0
  272. package/dist/rendering/CascadedShadowMaps.js.map +1 -1
  273. package/dist/rendering/ClusteredForwardLighting.d.ts +28 -0
  274. package/dist/rendering/ClusteredForwardLighting.d.ts.map +1 -0
  275. package/dist/rendering/ClusteredForwardLighting.js +156 -0
  276. package/dist/rendering/ClusteredForwardLighting.js.map +1 -0
  277. package/dist/rendering/DepthPass.d.ts +14 -1
  278. package/dist/rendering/DepthPass.d.ts.map +1 -1
  279. package/dist/rendering/DepthPass.js +19 -4
  280. package/dist/rendering/DepthPass.js.map +1 -1
  281. package/dist/rendering/EnvironmentMapResources.d.ts +59 -1
  282. package/dist/rendering/EnvironmentMapResources.d.ts.map +1 -1
  283. package/dist/rendering/EnvironmentMapResources.js +140 -100
  284. package/dist/rendering/EnvironmentMapResources.js.map +1 -1
  285. package/dist/rendering/EnvironmentPlatform.d.ts +3 -2
  286. package/dist/rendering/EnvironmentPlatform.d.ts.map +1 -1
  287. package/dist/rendering/EnvironmentPlatform.js +99 -44
  288. package/dist/rendering/EnvironmentPlatform.js.map +1 -1
  289. package/dist/rendering/ForwardPass.d.ts +37 -0
  290. package/dist/rendering/ForwardPass.d.ts.map +1 -1
  291. package/dist/rendering/ForwardPass.js +234 -7
  292. package/dist/rendering/ForwardPass.js.map +1 -1
  293. package/dist/rendering/Geometry.d.ts +19 -0
  294. package/dist/rendering/Geometry.d.ts.map +1 -1
  295. package/dist/rendering/Geometry.js +64 -0
  296. package/dist/rendering/Geometry.js.map +1 -1
  297. package/dist/rendering/IBL.d.ts.map +1 -1
  298. package/dist/rendering/IBL.js +0 -1
  299. package/dist/rendering/IBL.js.map +1 -1
  300. package/dist/rendering/LightCollector.d.ts +5 -1
  301. package/dist/rendering/LightCollector.d.ts.map +1 -1
  302. package/dist/rendering/LightCollector.js +16 -3
  303. package/dist/rendering/LightCollector.js.map +1 -1
  304. package/dist/rendering/LightUniforms.d.ts +26 -1
  305. package/dist/rendering/LightUniforms.d.ts.map +1 -1
  306. package/dist/rendering/LightUniforms.js +140 -8
  307. package/dist/rendering/LightUniforms.js.map +1 -1
  308. package/dist/rendering/LightingRig.d.ts +77 -0
  309. package/dist/rendering/LightingRig.d.ts.map +1 -1
  310. package/dist/rendering/LightingRig.js +100 -11
  311. package/dist/rendering/LightingRig.js.map +1 -1
  312. package/dist/rendering/MeshConsolidation.d.ts +63 -0
  313. package/dist/rendering/MeshConsolidation.d.ts.map +1 -0
  314. package/dist/rendering/MeshConsolidation.js +251 -0
  315. package/dist/rendering/MeshConsolidation.js.map +1 -0
  316. package/dist/rendering/PMREM.d.ts +13 -1
  317. package/dist/rendering/PMREM.d.ts.map +1 -1
  318. package/dist/rendering/PMREM.js +18 -4
  319. package/dist/rendering/PMREM.js.map +1 -1
  320. package/dist/rendering/PostProcessPass.d.ts +24 -2
  321. package/dist/rendering/PostProcessPass.d.ts.map +1 -1
  322. package/dist/rendering/PostProcessPass.js +136 -18
  323. package/dist/rendering/PostProcessPass.js.map +1 -1
  324. package/dist/rendering/PrimitiveSubmissionAudit.d.ts +195 -0
  325. package/dist/rendering/PrimitiveSubmissionAudit.d.ts.map +1 -0
  326. package/dist/rendering/PrimitiveSubmissionAudit.js +280 -0
  327. package/dist/rendering/PrimitiveSubmissionAudit.js.map +1 -0
  328. package/dist/rendering/ProductTurntableFixtures.d.ts.map +1 -1
  329. package/dist/rendering/ProductTurntableFixtures.js +93 -13
  330. package/dist/rendering/ProductTurntableFixtures.js.map +1 -1
  331. package/dist/rendering/ReflectionProbe.d.ts +59 -0
  332. package/dist/rendering/ReflectionProbe.d.ts.map +1 -1
  333. package/dist/rendering/ReflectionProbe.js +224 -0
  334. package/dist/rendering/ReflectionProbe.js.map +1 -1
  335. package/dist/rendering/ReflectionSurfaces.d.ts +4 -2
  336. package/dist/rendering/ReflectionSurfaces.d.ts.map +1 -1
  337. package/dist/rendering/ReflectionSurfaces.js +13 -8
  338. package/dist/rendering/ReflectionSurfaces.js.map +1 -1
  339. package/dist/rendering/RenderBackend.d.ts +1 -1
  340. package/dist/rendering/RenderBackend.d.ts.map +1 -1
  341. package/dist/rendering/RenderBackend.js +5 -1
  342. package/dist/rendering/RenderBackend.js.map +1 -1
  343. package/dist/rendering/RenderDevice.d.ts +13 -2
  344. package/dist/rendering/RenderDevice.d.ts.map +1 -1
  345. package/dist/rendering/RenderDevice.js +5 -2
  346. package/dist/rendering/RenderDevice.js.map +1 -1
  347. package/dist/rendering/Renderer.d.ts +41 -1
  348. package/dist/rendering/Renderer.d.ts.map +1 -1
  349. package/dist/rendering/Renderer.js +406 -61
  350. package/dist/rendering/Renderer.js.map +1 -1
  351. package/dist/rendering/RendererPostprocessPlan.d.ts +10 -3
  352. package/dist/rendering/RendererPostprocessPlan.d.ts.map +1 -1
  353. package/dist/rendering/RendererPostprocessPlan.js +25 -5
  354. package/dist/rendering/RendererPostprocessPlan.js.map +1 -1
  355. package/dist/rendering/RendererVisualPipelineReport.d.ts +3 -2
  356. package/dist/rendering/RendererVisualPipelineReport.d.ts.map +1 -1
  357. package/dist/rendering/RendererVisualPipelineReport.js +2 -0
  358. package/dist/rendering/RendererVisualPipelineReport.js.map +1 -1
  359. package/dist/rendering/ScreenSpaceLineMaterial.d.ts +34 -0
  360. package/dist/rendering/ScreenSpaceLineMaterial.d.ts.map +1 -0
  361. package/dist/rendering/ScreenSpaceLineMaterial.js +93 -0
  362. package/dist/rendering/ScreenSpaceLineMaterial.js.map +1 -0
  363. package/dist/rendering/ShaderChunks.d.ts +7 -0
  364. package/dist/rendering/ShaderChunks.d.ts.map +1 -1
  365. package/dist/rendering/ShaderChunks.js +137 -0
  366. package/dist/rendering/ShaderChunks.js.map +1 -1
  367. package/dist/rendering/ShaderLibrary.d.ts +17 -0
  368. package/dist/rendering/ShaderLibrary.d.ts.map +1 -1
  369. package/dist/rendering/ShaderLibrary.js +940 -98
  370. package/dist/rendering/ShaderLibrary.js.map +1 -1
  371. package/dist/rendering/ShadowPass.d.ts +10 -0
  372. package/dist/rendering/ShadowPass.d.ts.map +1 -1
  373. package/dist/rendering/ShadowPass.js +8 -1
  374. package/dist/rendering/ShadowPass.js.map +1 -1
  375. package/dist/rendering/SkinnedLitMaterial.d.ts +6 -0
  376. package/dist/rendering/SkinnedLitMaterial.d.ts.map +1 -1
  377. package/dist/rendering/SkinnedLitMaterial.js +22 -8
  378. package/dist/rendering/SkinnedLitMaterial.js.map +1 -1
  379. package/dist/rendering/SkinnedUnlitMaterial.d.ts +8 -0
  380. package/dist/rendering/SkinnedUnlitMaterial.d.ts.map +1 -1
  381. package/dist/rendering/SkinnedUnlitMaterial.js +26 -9
  382. package/dist/rendering/SkinnedUnlitMaterial.js.map +1 -1
  383. package/dist/rendering/SpecularPrefilter.d.ts +42 -0
  384. package/dist/rendering/SpecularPrefilter.d.ts.map +1 -0
  385. package/dist/rendering/SpecularPrefilter.js +480 -0
  386. package/dist/rendering/SpecularPrefilter.js.map +1 -0
  387. package/dist/rendering/TerrainFixtures.d.ts +24 -0
  388. package/dist/rendering/TerrainFixtures.d.ts.map +1 -1
  389. package/dist/rendering/TerrainFixtures.js +96 -0
  390. package/dist/rendering/TerrainFixtures.js.map +1 -1
  391. package/dist/rendering/Texture.d.ts +7 -0
  392. package/dist/rendering/Texture.d.ts.map +1 -1
  393. package/dist/rendering/Texture.js +9 -0
  394. package/dist/rendering/Texture.js.map +1 -1
  395. package/dist/rendering/VertexFormat.d.ts +34 -1
  396. package/dist/rendering/VertexFormat.d.ts.map +1 -1
  397. package/dist/rendering/VertexFormat.js +61 -0
  398. package/dist/rendering/VertexFormat.js.map +1 -1
  399. package/dist/rendering/WebGL2Device.d.ts +48 -0
  400. package/dist/rendering/WebGL2Device.d.ts.map +1 -1
  401. package/dist/rendering/WebGL2Device.js +1298 -44
  402. package/dist/rendering/WebGL2Device.js.map +1 -1
  403. package/dist/rendering/WebGPUDevice.d.ts +7 -2
  404. package/dist/rendering/WebGPUDevice.d.ts.map +1 -1
  405. package/dist/rendering/WebGPUDevice.js +111 -17
  406. package/dist/rendering/WebGPUDevice.js.map +1 -1
  407. package/dist/rendering/WebGPUSkinningLimits.d.ts +14 -0
  408. package/dist/rendering/WebGPUSkinningLimits.d.ts.map +1 -0
  409. package/dist/rendering/WebGPUSkinningLimits.js +14 -0
  410. package/dist/rendering/WebGPUSkinningLimits.js.map +1 -0
  411. package/dist/rendering/cartoon/CartoonMaterialStyle.d.ts +19 -0
  412. package/dist/rendering/cartoon/CartoonMaterialStyle.d.ts.map +1 -0
  413. package/dist/rendering/cartoon/CartoonMaterialStyle.js +13 -0
  414. package/dist/rendering/cartoon/CartoonMaterialStyle.js.map +1 -0
  415. package/dist/rendering/cartoon/CartoonRenderPreset.d.ts +36 -0
  416. package/dist/rendering/cartoon/CartoonRenderPreset.d.ts.map +1 -0
  417. package/dist/rendering/cartoon/CartoonRenderPreset.js +23 -0
  418. package/dist/rendering/cartoon/CartoonRenderPreset.js.map +1 -0
  419. package/dist/rendering/cartoon/CartoonToonMaterial.d.ts +130 -0
  420. package/dist/rendering/cartoon/CartoonToonMaterial.d.ts.map +1 -0
  421. package/dist/rendering/cartoon/CartoonToonMaterial.js +303 -0
  422. package/dist/rendering/cartoon/CartoonToonMaterial.js.map +1 -0
  423. package/dist/rendering/cartoon/CartoonVisualQuality.d.ts +28 -0
  424. package/dist/rendering/cartoon/CartoonVisualQuality.d.ts.map +1 -0
  425. package/dist/rendering/cartoon/CartoonVisualQuality.js +39 -0
  426. package/dist/rendering/cartoon/CartoonVisualQuality.js.map +1 -0
  427. package/dist/rendering/cartoon/applyCartoonRenderPreset.d.ts +79 -0
  428. package/dist/rendering/cartoon/applyCartoonRenderPreset.d.ts.map +1 -0
  429. package/dist/rendering/cartoon/applyCartoonRenderPreset.js +88 -0
  430. package/dist/rendering/cartoon/applyCartoonRenderPreset.js.map +1 -0
  431. package/dist/rendering/cartoon/index.d.ts +6 -0
  432. package/dist/rendering/cartoon/index.d.ts.map +1 -0
  433. package/dist/rendering/cartoon/index.js +6 -0
  434. package/dist/rendering/cartoon/index.js.map +1 -0
  435. package/dist/rendering/index.d.ts +26 -15
  436. package/dist/rendering/index.d.ts.map +1 -1
  437. package/dist/rendering/index.js +15 -9
  438. package/dist/rendering/index.js.map +1 -1
  439. package/dist/rendering/postprocess/NativeLdrEffectLuts.d.ts +93 -0
  440. package/dist/rendering/postprocess/NativeLdrEffectLuts.d.ts.map +1 -0
  441. package/dist/rendering/postprocess/NativeLdrEffectLuts.js +202 -0
  442. package/dist/rendering/postprocess/NativeLdrEffectLuts.js.map +1 -0
  443. package/dist/rendering/production-runtime/PBRHDRPipeline.d.ts.map +1 -1
  444. package/dist/rendering/production-runtime/PBRHDRPipeline.js +3 -0
  445. package/dist/rendering/production-runtime/PBRHDRPipeline.js.map +1 -1
  446. package/dist/rendering/production-runtime/ProductionRendererTypes.d.ts +1 -0
  447. package/dist/rendering/production-runtime/ProductionRendererTypes.d.ts.map +1 -1
  448. package/dist/rendering/production-runtime/ProductionRendererTypes.js.map +1 -1
  449. package/dist/rendering/production-runtime/ProductionWebGL2Renderer.d.ts.map +1 -1
  450. package/dist/rendering/production-runtime/ProductionWebGL2Renderer.js +5 -3
  451. package/dist/rendering/production-runtime/ProductionWebGL2Renderer.js.map +1 -1
  452. package/dist/rendering/production-runtime/ProductionWebGPURenderer.d.ts.map +1 -1
  453. package/dist/rendering/production-runtime/ProductionWebGPURenderer.js +9 -5
  454. package/dist/rendering/production-runtime/ProductionWebGPURenderer.js.map +1 -1
  455. package/dist/rendering/production-runtime/TransmissionBackdropCapture.d.ts +5 -0
  456. package/dist/rendering/production-runtime/TransmissionBackdropCapture.d.ts.map +1 -1
  457. package/dist/rendering/production-runtime/TransmissionBackdropCapture.js +40 -0
  458. package/dist/rendering/production-runtime/TransmissionBackdropCapture.js.map +1 -1
  459. package/dist/rendering/production-runtime/environment/HDRLoader.d.ts +6 -0
  460. package/dist/rendering/production-runtime/environment/HDRLoader.d.ts.map +1 -1
  461. package/dist/rendering/production-runtime/environment/HDRLoader.js +19 -0
  462. package/dist/rendering/production-runtime/environment/HDRLoader.js.map +1 -1
  463. package/dist/rendering/production-runtime/index.d.ts +3 -1
  464. package/dist/rendering/production-runtime/index.d.ts.map +1 -1
  465. package/dist/rendering/production-runtime/index.js +1 -0
  466. package/dist/rendering/production-runtime/index.js.map +1 -1
  467. package/dist/scene/Light.d.ts +1 -1
  468. package/dist/scene/Light.d.ts.map +1 -1
  469. package/dist/scene/RectAreaLight.d.ts +22 -0
  470. package/dist/scene/RectAreaLight.d.ts.map +1 -0
  471. package/dist/scene/RectAreaLight.js +46 -0
  472. package/dist/scene/RectAreaLight.js.map +1 -0
  473. package/dist/scene/Scene.d.ts +6 -1
  474. package/dist/scene/Scene.d.ts.map +1 -1
  475. package/dist/scene/Scene.js +8 -1
  476. package/dist/scene/Scene.js.map +1 -1
  477. package/dist/scene/SceneSerializer.d.ts +3 -1
  478. package/dist/scene/SceneSerializer.d.ts.map +1 -1
  479. package/dist/scene/SceneSerializer.js +14 -7
  480. package/dist/scene/SceneSerializer.js.map +1 -1
  481. package/dist/scene/index.d.ts +1 -0
  482. package/dist/scene/index.d.ts.map +1 -1
  483. package/dist/scene/index.js +1 -0
  484. package/dist/scene/index.js.map +1 -1
  485. package/dist/scripting/CartoonNodeCategories.d.ts +3 -0
  486. package/dist/scripting/CartoonNodeCategories.d.ts.map +1 -0
  487. package/dist/scripting/CartoonNodeCategories.js +9 -0
  488. package/dist/scripting/CartoonNodeCategories.js.map +1 -0
  489. package/dist/scripting/CartoonVisualNodes.d.ts +3 -0
  490. package/dist/scripting/CartoonVisualNodes.d.ts.map +1 -0
  491. package/dist/scripting/CartoonVisualNodes.js +41 -0
  492. package/dist/scripting/CartoonVisualNodes.js.map +1 -0
  493. package/package.json +131 -114
  494. package/templates/production-asset-inspector/README.md +5 -0
  495. package/templates/production-asset-inspector/asset-manifest.json +9 -0
  496. package/templates/production-asset-inspector/index.html +2 -0
  497. package/templates/production-asset-inspector/package.json +17 -0
  498. package/templates/production-asset-inspector/src/main.ts +16 -0
  499. package/templates/production-material-studio/README.md +5 -0
  500. package/templates/production-material-studio/asset-manifest.json +9 -0
  501. package/templates/production-material-studio/index.html +2 -0
  502. package/templates/production-material-studio/package.json +17 -0
  503. package/templates/production-material-studio/src/main.ts +16 -0
  504. package/templates/production-product-configurator/README.md +5 -0
  505. package/templates/production-product-configurator/asset-manifest.json +9 -0
  506. package/templates/production-product-configurator/index.html +2 -0
  507. package/templates/production-product-configurator/package.json +17 -0
  508. package/templates/production-product-configurator/src/main.ts +16 -0
  509. package/templates/production-product-viewer/README.md +7 -0
  510. package/templates/production-product-viewer/asset-manifest.json +8 -0
  511. package/templates/production-product-viewer/index.html +26 -0
  512. package/templates/production-product-viewer/package.json +17 -0
  513. package/templates/production-product-viewer/src/main.ts +70 -0
@@ -0,0 +1,324 @@
1
+ /**
2
+ * Reusable frame-based combat model: frame data, spacing and a credible AI.
3
+ *
4
+ * ## The defects this addresses
5
+ *
6
+ * Aura Clash's attacks were reported as unrealistic, with weak spacing, limited
7
+ * momentum, and animations that do not correspond convincingly to hits. Converting
8
+ * the shipped move table to frames at 60fps shows why:
9
+ *
10
+ * | move | startup | active | recovery |
11
+ * | ------- | ------- | ------ | -------- |
12
+ * | light | 4 | **12** | **4** |
13
+ * | heavy | 6 | **17** | **5** |
14
+ * | special | 5 | **32** | **4** |
15
+ *
16
+ * Real fighting-game frame data is the opposite shape: a short active window (2-5
17
+ * frames) and a long recovery (10-30 frames). Aura Clash's active windows are 3-8x
18
+ * too long and its recoveries 3-6x too short, which has three consequences:
19
+ *
20
+ * 1. **Hits do not correspond to the animation.** A 32-frame active window on the
21
+ * special means the hitbox is live for over half a second, so damage lands at
22
+ * moments that look nothing like contact -- the reported "attack dealing damage
23
+ * before contact".
24
+ * 2. **No spacing game.** With a 12-frame active window and a 4-frame recovery, an
25
+ * attack is nearly always safe. Whiffing costs almost nothing, so there is no
26
+ * reason to respect range and no punish window to aim for. That is precisely
27
+ * "weak spacing".
28
+ * 3. **No trades or momentum.** Blockstun and hitstun cannot create meaningful
29
+ * advantage when every move recovers in four frames.
30
+ *
31
+ * The engine defect is that nothing validated frame data as frame data. A move table
32
+ * could declare any startup/active/recovery split and no check compared it against the
33
+ * shape that makes a combat system readable.
34
+ *
35
+ * This module adds that check ({@link validateCombatFrameData}), a solver that derives
36
+ * balanced frame data from an intended move role ({@link solveCombatFrameData}), and a
37
+ * reactive AI ({@link createCombatAi}) that behaves like an opponent: it respects
38
+ * range, reacts with a delay, blocks what it sees, and punishes what it can.
39
+ *
40
+ * Pure and dependency-free.
41
+ */
42
+ /** Frame advantage for a move. */
43
+ export function combatFrameAdvantage(move) {
44
+ return {
45
+ id: move.id,
46
+ onHit: move.hitstun - move.recovery,
47
+ onBlock: move.blockstun - move.recovery,
48
+ whiffPunishWindow: move.recovery,
49
+ totalFrames: move.startup + move.active + move.recovery
50
+ };
51
+ }
52
+ /**
53
+ * Validate a move table as frame data.
54
+ *
55
+ * This is the check that did not exist. It fails a table whose active windows are so
56
+ * long that damage cannot correspond to the animation, and one whose recoveries are so
57
+ * short that whiffing carries no risk.
58
+ */
59
+ export function validateCombatFrameData(moves, limits = {}) {
60
+ const maxActive = limits.maxActiveFrames ?? 6;
61
+ const minActive = limits.minActiveFrames ?? 2;
62
+ const minRecoveryRatio = limits.minRecoveryToActiveRatio ?? 2;
63
+ const maxOnBlock = limits.maxOnBlock ?? 2;
64
+ const minWhiffWindow = limits.minWhiffPunishWindow ?? 8;
65
+ const minHitstop = limits.minHitstop ?? 2;
66
+ const checks = [];
67
+ const annotated = moves.map((move) => ({ ...move, advantage: combatFrameAdvantage(move) }));
68
+ for (const move of annotated) {
69
+ checks.push({
70
+ id: "active-window-readable",
71
+ moveId: move.id,
72
+ description: `active window must be ${minActive}-${maxActive} frames so damage corresponds to the animation`,
73
+ passes: move.active >= minActive && move.active <= maxActive,
74
+ detail: `${move.active} active frames`
75
+ });
76
+ checks.push({
77
+ id: "recovery-creates-risk",
78
+ moveId: move.id,
79
+ description: `recovery must be at least ${minRecoveryRatio}x the active window so whiffing is punishable`,
80
+ passes: move.active <= 0 || move.recovery >= move.active * minRecoveryRatio,
81
+ detail: `recovery ${move.recovery} vs active ${move.active} (ratio ${round(move.active > 0 ? move.recovery / move.active : Number.POSITIVE_INFINITY)})`
82
+ });
83
+ checks.push({
84
+ id: "not-safe-on-block",
85
+ moveId: move.id,
86
+ description: `frame advantage on block must not exceed +${maxOnBlock}, or the move carries no risk`,
87
+ passes: move.advantage.onBlock <= maxOnBlock,
88
+ detail: `${move.advantage.onBlock >= 0 ? "+" : ""}${move.advantage.onBlock} on block`
89
+ });
90
+ checks.push({
91
+ id: "whiff-punishable",
92
+ moveId: move.id,
93
+ description: `a whiff must leave at least ${minWhiffWindow} frames of punish window`,
94
+ passes: move.advantage.whiffPunishWindow >= minWhiffWindow,
95
+ detail: `${move.advantage.whiffPunishWindow} frame punish window`
96
+ });
97
+ checks.push({
98
+ id: "hitstop-sells-impact",
99
+ moveId: move.id,
100
+ description: `hitstop must be at least ${minHitstop} frames so contact reads as impact`,
101
+ passes: move.hitstop >= minHitstop,
102
+ detail: `${move.hitstop} frames of hitstop`
103
+ });
104
+ checks.push({
105
+ id: "startup-before-active",
106
+ moveId: move.id,
107
+ description: "a move must have startup frames, so an attack telegraphs before it can hit",
108
+ passes: move.startup >= 1,
109
+ detail: `${move.startup} startup frames`
110
+ });
111
+ }
112
+ // Table-level: stronger moves must be slower, or there is no reason to use a jab.
113
+ const byDamage = [...annotated].sort((a, b) => a.damage - b.damage);
114
+ for (let index = 0; index < byDamage.length - 1; index += 1) {
115
+ const weaker = byDamage[index];
116
+ const stronger = byDamage[index + 1];
117
+ if (weaker.damage === stronger.damage)
118
+ continue;
119
+ checks.push({
120
+ id: "damage-costs-speed",
121
+ moveId: `${weaker.id}->${stronger.id}`,
122
+ description: "a stronger move must be slower to start or riskier on block",
123
+ passes: stronger.startup >= weaker.startup || stronger.advantage.onBlock <= weaker.advantage.onBlock,
124
+ detail: `${weaker.id} ${weaker.damage}dmg/${weaker.startup}f vs ${stronger.id} ${stronger.damage}dmg/${stronger.startup}f`
125
+ });
126
+ }
127
+ return {
128
+ schema: "aura3d-combat-frame-data/1.0",
129
+ moves: annotated,
130
+ checks,
131
+ passes: checks.every((check) => check.passes)
132
+ };
133
+ }
134
+ const ROLE_PROFILES = {
135
+ /*
136
+ * Frame data shaped like a real fighting game.
137
+ *
138
+ * A jab is fast and nearly neutral on block, so it is the safe poke. Heavier moves
139
+ * start slower, recover longer and are clearly minus on block, so using them is a
140
+ * decision rather than a default. Every active window is short, which is what makes a
141
+ * hit correspond to the moment of contact.
142
+ */
143
+ jab: { startup: 3, active: 2, recovery: 7, hitstun: 12, blockstun: 8, hitstop: 3, knockback: 0.18 },
144
+ light: { startup: 5, active: 3, recovery: 10, hitstun: 15, blockstun: 10, hitstop: 4, knockback: 0.28 },
145
+ medium: { startup: 8, active: 3, recovery: 15, hitstun: 19, blockstun: 12, hitstop: 5, knockback: 0.42 },
146
+ heavy: { startup: 12, active: 4, recovery: 22, hitstun: 26, blockstun: 15, hitstop: 7, knockback: 0.7 },
147
+ launcher: { startup: 11, active: 3, recovery: 26, hitstun: 34, blockstun: 14, hitstop: 6, knockback: 0.55 },
148
+ special: { startup: 14, active: 5, recovery: 28, hitstun: 30, blockstun: 18, hitstop: 9, knockback: 1.05 }
149
+ };
150
+ /**
151
+ * Derive balanced frame data from a move's intended role.
152
+ *
153
+ * Reach adds startup, because a longer poke should be slower to commit to. Damage adds
154
+ * recovery, so a big hit is a bigger risk. Neither is a free parameter.
155
+ */
156
+ export function solveCombatFrameData(request, options = {}) {
157
+ const profile = ROLE_PROFILES[request.role];
158
+ const referenceRange = Math.max(0.1, options.referenceRange ?? 1.4);
159
+ const referenceDamage = Math.max(1, options.referenceDamage ?? 10);
160
+ // Reach beyond the reference costs startup; damage beyond it costs recovery.
161
+ const rangePenalty = Math.max(0, request.range / referenceRange - 1);
162
+ const damagePenalty = Math.max(0, request.damage / referenceDamage - 1);
163
+ return {
164
+ id: request.id,
165
+ startup: Math.round(profile.startup * (1 + rangePenalty * 0.4)),
166
+ active: profile.active,
167
+ recovery: Math.round(profile.recovery * (1 + damagePenalty * 0.3)),
168
+ hitstun: profile.hitstun,
169
+ blockstun: profile.blockstun,
170
+ range: round(request.range),
171
+ damage: request.damage,
172
+ knockback: round(profile.knockback * (1 + damagePenalty * 0.2)),
173
+ hitstop: profile.hitstop
174
+ };
175
+ }
176
+ const AGGRESSION_PROFILES = {
177
+ defensive: { attackChance: 0.35, blockChance: 0.9, spacingTolerance: 0.3 },
178
+ balanced: { attackChance: 0.6, blockChance: 0.72, spacingTolerance: 0.2 },
179
+ aggressive: { attackChance: 0.85, blockChance: 0.5, spacingTolerance: 0.12 }
180
+ };
181
+ /**
182
+ * Create a reactive combat AI.
183
+ *
184
+ * Behaves like an opponent rather than a timer: it holds a preferred range, reacts to a
185
+ * telegraphed attack after a delay, blocks what it has had time to see, and punishes a
186
+ * move whose recovery leaves a window. Deterministic for a given seed.
187
+ */
188
+ export function createCombatAi(config) {
189
+ const moves = new Map(config.moves.map((move) => [move.id, move]));
190
+ const aggression = config.aggression ?? "balanced";
191
+ const profile = AGGRESSION_PROFILES[aggression];
192
+ const reactionFrames = Math.max(0, config.reactionFrames ?? 14);
193
+ const cooldownFrames = Math.max(0, config.cooldownFrames ?? 18);
194
+ // The fastest move is the punish tool; the longest-reaching is the poke.
195
+ const fastest = [...moves.values()].sort((a, b) => a.startup - b.startup)[0];
196
+ const longest = [...moves.values()].sort((a, b) => b.range - a.range)[0];
197
+ /*
198
+ * Preferred range sits just *inside* the AI's longest poke.
199
+ *
200
+ * Setting it outside its own reach looked like good spacing discipline and was in fact
201
+ * a deadlock: the AI held a distance from which nothing could connect, so it never
202
+ * attacked and only ever adjusted position. Real fighting-game spacing is to hold the
203
+ * edge of your own longest threat -- close enough to poke, far enough that the
204
+ * opponent must commit to reach you.
205
+ */
206
+ const preferredRange = config.preferredRange ?? (longest ? longest.range * 0.92 : 1.5);
207
+ let seenOpponentMove;
208
+ let framesSinceSeen = 0;
209
+ let cooldown = 0;
210
+ let decisionCount = 0;
211
+ let punishAttempts = 0;
212
+ let blockAttempts = 0;
213
+ let random = (config.seed ?? 1) >>> 0 || 1;
214
+ const nextRandom = () => {
215
+ random ^= random << 13;
216
+ random ^= random >>> 17;
217
+ random ^= random << 5;
218
+ return (random >>> 0) / 0xffffffff;
219
+ };
220
+ let lastDecision = { moveId: undefined, block: false, approach: 0, reason: "initial" };
221
+ return {
222
+ kind: "aura-combat-ai",
223
+ decide(observation) {
224
+ decisionCount += 1;
225
+ cooldown = Math.max(0, cooldown - 1);
226
+ // Track how long the opponent's current move has been visible, so reaction is
227
+ // delayed rather than instant.
228
+ if (observation.opponentMoveId !== seenOpponentMove) {
229
+ seenOpponentMove = observation.opponentMoveId;
230
+ framesSinceSeen = 0;
231
+ }
232
+ else {
233
+ framesSinceSeen += 1;
234
+ }
235
+ const reacted = seenOpponentMove !== undefined && framesSinceSeen >= reactionFrames;
236
+ const decide = (decision) => {
237
+ lastDecision = decision;
238
+ return decision;
239
+ };
240
+ // Stunned or mid-move: nothing to decide.
241
+ if (observation.stunned === true || (observation.ownRecoveryFrames ?? 0) > 0) {
242
+ return decide({ moveId: undefined, block: false, approach: 0, reason: "recovering" });
243
+ }
244
+ const opponentMove = observation.opponentMoveId ? moves.get(observation.opponentMoveId) : undefined;
245
+ /*
246
+ * Punish. When the opponent's move is in its recovery and the AI's fastest move
247
+ * can start and connect inside that window, take it. This is the behaviour that
248
+ * makes spacing matter, and it is only possible because recovery frames exist.
249
+ */
250
+ if (reacted && opponentMove && fastest && cooldown <= 0) {
251
+ const opponentFrame = observation.opponentMoveFrame ?? 0;
252
+ const recoveryStart = opponentMove.startup + opponentMove.active;
253
+ const framesLeftInRecovery = recoveryStart + opponentMove.recovery - opponentFrame;
254
+ const inRecovery = opponentFrame >= recoveryStart && framesLeftInRecovery > 0;
255
+ if (inRecovery && framesLeftInRecovery > fastest.startup && observation.distance <= fastest.range) {
256
+ punishAttempts += 1;
257
+ cooldown = cooldownFrames;
258
+ return decide({ moveId: fastest.id, block: false, approach: 0, reason: "punish-recovery" });
259
+ }
260
+ }
261
+ /*
262
+ * Block. Only after the reaction delay, and only while the attack could still
263
+ * reach: blocking a move that has already recovered is not defence, it is a tell
264
+ * that the AI is reading state it should not have.
265
+ */
266
+ if (reacted && opponentMove) {
267
+ const opponentFrame = observation.opponentMoveFrame ?? 0;
268
+ const threatening = opponentFrame < opponentMove.startup + opponentMove.active;
269
+ if (threatening && observation.distance <= opponentMove.range * 1.15 && nextRandom() < profile.blockChance) {
270
+ blockAttempts += 1;
271
+ return decide({ moveId: undefined, block: true, approach: 0, reason: "block-incoming" });
272
+ }
273
+ }
274
+ // Spacing. Hold the preferred range; step in to attack, step out when crowded.
275
+ const rangeError = observation.distance - preferredRange;
276
+ if (Math.abs(rangeError) > profile.spacingTolerance) {
277
+ const approach = rangeError > 0 ? 1 : -1;
278
+ // Attack on the way in when a move actually reaches.
279
+ const reachable = [...moves.values()].filter((move) => observation.distance <= move.range);
280
+ if (approach === 1 && reachable.length > 0 && cooldown <= 0 && nextRandom() < profile.attackChance) {
281
+ const chosen = reachable[Math.floor(nextRandom() * reachable.length)] ?? reachable[0];
282
+ cooldown = cooldownFrames;
283
+ return decide({ moveId: chosen.id, block: false, approach: 0, reason: "attack-in-range" });
284
+ }
285
+ return decide({ moveId: undefined, block: false, approach, reason: approach > 0 ? "close-distance" : "create-space" });
286
+ }
287
+ // At preferred range with nothing to react to: poke when the odds are taken.
288
+ if (cooldown <= 0 && nextRandom() < profile.attackChance) {
289
+ const reachable = [...moves.values()].filter((move) => observation.distance <= move.range);
290
+ if (reachable.length > 0) {
291
+ const chosen = reachable[Math.floor(nextRandom() * reachable.length)] ?? reachable[0];
292
+ cooldown = cooldownFrames;
293
+ return decide({ moveId: chosen.id, block: false, approach: 0, reason: "poke-at-range" });
294
+ }
295
+ }
296
+ return decide({ moveId: undefined, block: false, approach: 0, reason: "hold-range" });
297
+ },
298
+ reset() {
299
+ seenOpponentMove = undefined;
300
+ framesSinceSeen = 0;
301
+ cooldown = 0;
302
+ decisionCount = 0;
303
+ punishAttempts = 0;
304
+ blockAttempts = 0;
305
+ random = (config.seed ?? 1) >>> 0 || 1;
306
+ lastDecision = { moveId: undefined, block: false, approach: 0, reason: "reset" };
307
+ },
308
+ telemetry() {
309
+ return {
310
+ reactionFrames,
311
+ preferredRange: round(preferredRange),
312
+ aggression,
313
+ decisionCount,
314
+ punishAttempts,
315
+ blockAttempts,
316
+ lastDecision
317
+ };
318
+ }
319
+ };
320
+ }
321
+ function round(value) {
322
+ return Math.round(value * 1e4) / 1e4;
323
+ }
324
+ //# sourceMappingURL=CombatFrameData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CombatFrameData.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/CombatFrameData.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Reusable object focus and selection feedback.
3
+ *
4
+ * ## The defect this replaces
5
+ *
6
+ * The product configurator built its focus indicator by hand:
7
+ *
8
+ * ```ts
9
+ * primitives.torus({ ... }).position(...p).rotate(1.5708, 0, 0).scale([1.22, 0.08, 0.78])
10
+ * ```
11
+ *
12
+ * Aura3D's torus primitive is generated in local XY -- the ring lies in the XY
13
+ * plane with its tube thin on **Z** (`createTorusGeometry` sweeps `cos u, sin u`
14
+ * into X/Y and puts the tube's `sin v` on Z). Scaling `[1.22, 0.08, 0.78]`
15
+ * therefore squashes the ring's own **Y radius** to 8%, turning the circle into a
16
+ * flat horizontal sliver. The subsequent `rotate(pi/2, 0, 0)` tips that sliver
17
+ * into the ground plane, and it renders as the "random yellow/white bar" the
18
+ * user reported. A working ring in the same codebase uses `[0.72, 0.72, 0.028]`
19
+ * -- equal X/Y radii, thin on Z -- which is why the two looked unrelated.
20
+ *
21
+ * Changing those three constants would have fixed one route and left the trap in
22
+ * place for every other. The real defects are: primitive local axes were not
23
+ * documented, and no reusable focus feedback existed, so every route invented
24
+ * its own indicator geometry.
25
+ *
26
+ * This module removes the need to know the torus axis convention at all. A route
27
+ * states intent -- focus this target, with a ring and a callout -- and gets
28
+ * correct indicator geometry for any target size, orientation, or nonuniform
29
+ * scale.
30
+ *
31
+ * Pure and dependency-free: it returns scene-node JSON and camera intent, so it
32
+ * is unit-testable without a renderer and reusable by any route or kit.
33
+ */
34
+ import type { AuraColor, AuraSceneNode, AuraVec3 } from "./index.js";
35
+ import { type PlacedBounds, type SemanticRegion } from "./SpatialAnchoring.js";
36
+ /**
37
+ * Local-axis conventions for Aura3D primitives.
38
+ *
39
+ * Published so a route that must build custom geometry can do so correctly, and
40
+ * so the reason for the configurator defect is discoverable rather than folklore.
41
+ */
42
+ export declare const AURA_PRIMITIVE_AXES: {
43
+ /**
44
+ * A torus is a ring in the local XY plane. Its major radius spans X and Y
45
+ * equally; its tube thickness lies on Z. To thin a ring, scale **Z**. Scaling
46
+ * Y collapses the ring into a bar.
47
+ */
48
+ readonly torus: {
49
+ readonly ringPlane: "xy";
50
+ readonly tubeAxis: "z";
51
+ readonly thinAxis: "z";
52
+ };
53
+ /** A cylinder's height runs along Y; its circular cross-section spans X and Z. */
54
+ readonly cylinder: {
55
+ readonly heightAxis: "y";
56
+ readonly crossSection: "xz";
57
+ readonly thinAxis: "y";
58
+ };
59
+ /** A plane lies in XZ with its normal on Y. */
60
+ readonly plane: {
61
+ readonly plane: "xz";
62
+ readonly normalAxis: "y";
63
+ readonly thinAxis: "y";
64
+ };
65
+ /** Boxes, spheres and capsules are axis-symmetric about their own extents. */
66
+ readonly box: {
67
+ readonly thinAxis: undefined;
68
+ };
69
+ readonly sphere: {
70
+ readonly thinAxis: undefined;
71
+ };
72
+ readonly capsule: {
73
+ readonly heightAxis: "y";
74
+ readonly thinAxis: undefined;
75
+ };
76
+ };
77
+ /** Visual treatments a focus indicator can apply. */
78
+ export type FocusIndicator = "ring" | "halo" | "bounding-box" | "outline" | "emissive-highlight";
79
+ export interface FocusTargetBounds {
80
+ /** World position of the target's centre. */
81
+ readonly center: AuraVec3;
82
+ /** World-space extents of the target. */
83
+ readonly size: AuraVec3;
84
+ /**
85
+ * Euler rotation of the target, radians. Indicator geometry inherits it so a
86
+ * rotated part gets a rotated indicator rather than an axis-aligned one.
87
+ */
88
+ readonly rotation?: AuraVec3 | undefined;
89
+ }
90
+ export interface FocusTarget extends FocusTargetBounds {
91
+ readonly id: string;
92
+ /** Human-readable name used for the callout and accessibility text. */
93
+ readonly label?: string | undefined;
94
+ }
95
+ export interface FocusOptions {
96
+ /** Indicators to draw. Defaults to a ring plus a callout label. */
97
+ readonly indicators?: readonly FocusIndicator[] | undefined;
98
+ readonly color?: AuraColor | undefined;
99
+ /** Draw a callout label anchored to the target. Defaults to true. */
100
+ readonly callout?: boolean | undefined;
101
+ /** Text for the callout. Defaults to the target's label. */
102
+ readonly calloutText?: string | undefined;
103
+ /** Draw a leader line from the callout to the target. Defaults to true. */
104
+ readonly leaderLine?: boolean | undefined;
105
+ /** Dim non-focused geometry. Reported as intent; the route applies it. */
106
+ readonly dimOthers?: boolean | undefined;
107
+ /** Move the camera to frame the target. Defaults to true. */
108
+ readonly cameraFocus?: boolean | undefined;
109
+ /**
110
+ * Extra clearance between the indicator and the target surface, as a fraction
111
+ * of the target's largest extent. Defaults to 0.12 so a ring reads as
112
+ * surrounding the part rather than intersecting it.
113
+ */
114
+ readonly clearance?: number | undefined;
115
+ /** Node-name prefix, so indicator nodes are identifiable in evidence. */
116
+ readonly namePrefix?: string | undefined;
117
+ /**
118
+ * Viewport aspect ratio, used only to size camera framing distance. Defaults
119
+ * to 16/9.
120
+ */
121
+ readonly aspect?: number | undefined;
122
+ /** Mobile viewports need a wider frame; defaults to false. */
123
+ readonly compactViewport?: boolean | undefined;
124
+ }
125
+ export interface FocusCameraIntent {
126
+ readonly position: AuraVec3;
127
+ readonly target: AuraVec3;
128
+ readonly fov: number;
129
+ /** True when the target's bounds fit inside the frustum at this distance. */
130
+ readonly containsTarget: boolean;
131
+ }
132
+ export interface FocusResult {
133
+ readonly kind: "aura-focus-result";
134
+ readonly targetId: string;
135
+ /** Indicator geometry and labels to add to the scene. */
136
+ readonly nodes: readonly AuraSceneNode[];
137
+ readonly camera: FocusCameraIntent | undefined;
138
+ /** Set when `dimOthers` was requested, so the route can lower other materials. */
139
+ readonly dimOthers: boolean;
140
+ /** Machine-checkable statement that indicators surround their target. */
141
+ readonly invariants: FocusInvariantReport;
142
+ /** Screen-reader text describing the current selection. */
143
+ readonly accessibilityLabel: string;
144
+ }
145
+ export interface FocusInvariantReport {
146
+ readonly schema: "aura3d-focus-invariants/1.0";
147
+ readonly checks: readonly {
148
+ readonly id: string;
149
+ readonly description: string;
150
+ readonly passes: boolean;
151
+ readonly detail: string;
152
+ }[];
153
+ readonly passes: boolean;
154
+ }
155
+ /**
156
+ * Build focus feedback for a target.
157
+ *
158
+ * The ring is sized from the target's own extents and thinned on **Z**, the
159
+ * torus tube axis, then rotated to lie in the horizontal plane. Because the
160
+ * radius is uniform in the ring's own plane it stays a ring for any target
161
+ * aspect ratio -- which is what the flattened-bar defect got wrong.
162
+ */
163
+ export declare function focusObject(target: FocusTarget, options?: FocusOptions): FocusResult;
164
+ /**
165
+ * Focus a named region of a subject rather than a standalone object.
166
+ *
167
+ * This is how a configurator focuses "the earcups" without knowing where the
168
+ * earcups are in world space: the region is normalized to the subject's bounds,
169
+ * so it follows the asset.
170
+ */
171
+ export declare function focusSemanticRegion(subject: PlacedBounds, region: SemanticRegion, options?: FocusOptions): FocusResult;
172
+ /** Empty focus state: no indicators, no camera change, reset accessibility text. */
173
+ export declare function clearFocus(): FocusResult;
174
+ /**
175
+ * Camera pose that frames a target's bounds.
176
+ *
177
+ * Distance is derived from the vertical and horizontal half-angles so the whole
178
+ * target fits regardless of viewport aspect. A compact (mobile) viewport pulls
179
+ * back further because UI chrome takes vertical space.
180
+ */
181
+ export declare function focusCameraIntent(center: AuraVec3, size: AuraVec3, options?: {
182
+ readonly aspect?: number | undefined;
183
+ readonly compactViewport?: boolean | undefined;
184
+ readonly fov?: number | undefined;
185
+ }): FocusCameraIntent;
186
+ //# sourceMappingURL=FocusSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FocusSelection.d.ts","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/FocusSelection.ts"],"names":[],"mappings":"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"}