@iwsdk/core 0.5.3 → 1.0.0-rc.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 (233) hide show
  1. package/README.md +22 -1
  2. package/dist/asset/asset-manager.d.ts.map +1 -1
  3. package/dist/asset/asset-manager.js +3 -2
  4. package/dist/asset/asset-manager.js.map +1 -1
  5. package/dist/asset/cache-manager.js.map +1 -1
  6. package/dist/asset/loaders/audio-loader.js.map +1 -1
  7. package/dist/asset/loaders/cached-asset-load.js.map +1 -1
  8. package/dist/asset/loaders/gltf-loader.js.map +1 -1
  9. package/dist/asset/loaders/hdr-texture-loader.js.map +1 -1
  10. package/dist/asset/loaders/texture-loader.js.map +1 -1
  11. package/dist/asset/loaders/uikitml-loader.js.map +1 -1
  12. package/dist/audio/audio-pool.js.map +1 -1
  13. package/dist/audio/audio-system.js.map +1 -1
  14. package/dist/audio/audio-utils.js.map +1 -1
  15. package/dist/audio/audio.js.map +1 -1
  16. package/dist/camera/camera-source.js.map +1 -1
  17. package/dist/camera/camera-system.d.ts +7 -3
  18. package/dist/camera/camera-system.d.ts.map +1 -1
  19. package/dist/camera/camera-system.js +81 -50
  20. package/dist/camera/camera-system.js.map +1 -1
  21. package/dist/camera/camera-utils.d.ts +5 -0
  22. package/dist/camera/camera-utils.d.ts.map +1 -1
  23. package/dist/camera/camera-utils.js +8 -1
  24. package/dist/camera/camera-utils.js.map +1 -1
  25. package/dist/camera/types.js.map +1 -1
  26. package/dist/depth/depth-occludable.js.map +1 -1
  27. package/dist/depth/depth-sensing-system.d.ts +3 -0
  28. package/dist/depth/depth-sensing-system.d.ts.map +1 -1
  29. package/dist/depth/depth-sensing-system.js +55 -1
  30. package/dist/depth/depth-sensing-system.js.map +1 -1
  31. package/dist/depth/depth-textures.js.map +1 -1
  32. package/dist/depth/occlusion/preprocessing-pass.js.map +1 -1
  33. package/dist/depth/occlusion/preprocessing-shader.glsl.js.map +1 -1
  34. package/dist/ecs/builtin-components.js.map +1 -1
  35. package/dist/ecs/component-editor-metadata.js.map +1 -1
  36. package/dist/ecs/component-manifest.js.map +1 -1
  37. package/dist/ecs/entity.js.map +1 -1
  38. package/dist/ecs/system.js.map +1 -1
  39. package/dist/ecs/world.d.ts +2 -0
  40. package/dist/ecs/world.d.ts.map +1 -1
  41. package/dist/ecs/world.js +4 -0
  42. package/dist/ecs/world.js.map +1 -1
  43. package/dist/environment/dome-gradient.js.map +1 -1
  44. package/dist/environment/dome-texture.js.map +1 -1
  45. package/dist/environment/environment-system.js.map +1 -1
  46. package/dist/environment/gradient-environment.js.map +1 -1
  47. package/dist/environment/ibl-gradient.js.map +1 -1
  48. package/dist/environment/ibl-texture.js.map +1 -1
  49. package/dist/environment/scene-ar-environment.js.map +1 -1
  50. package/dist/environment-raycast/environment-raycast.js.map +1 -1
  51. package/dist/environment-raycast/raycast-target.js.map +1 -1
  52. package/dist/grab/distance-grabbable.d.ts +5 -0
  53. package/dist/grab/distance-grabbable.d.ts.map +1 -1
  54. package/dist/grab/distance-grabbable.js +5 -0
  55. package/dist/grab/distance-grabbable.js.map +1 -1
  56. package/dist/grab/grab-helpers.js.map +1 -1
  57. package/dist/grab/grab-system.js.map +1 -1
  58. package/dist/grab/grab-warnings.js.map +1 -1
  59. package/dist/grab/grabbed.js.map +1 -1
  60. package/dist/grab/handles.d.ts +6 -0
  61. package/dist/grab/handles.d.ts.map +1 -1
  62. package/dist/grab/handles.js +46 -12
  63. package/dist/grab/handles.js.map +1 -1
  64. package/dist/grab/index.js.map +1 -1
  65. package/dist/grab/one-hand-grabbable.d.ts +5 -0
  66. package/dist/grab/one-hand-grabbable.d.ts.map +1 -1
  67. package/dist/grab/one-hand-grabbable.js +5 -0
  68. package/dist/grab/one-hand-grabbable.js.map +1 -1
  69. package/dist/grab/pointer-events-patch.js.map +1 -1
  70. package/dist/grab/two-hands-grabbable.d.ts +5 -0
  71. package/dist/grab/two-hands-grabbable.d.ts.map +1 -1
  72. package/dist/grab/two-hands-grabbable.js +5 -0
  73. package/dist/grab/two-hands-grabbable.js.map +1 -1
  74. package/dist/index.js +4 -3
  75. package/dist/index.js.map +1 -1
  76. package/dist/init/browser-camera.js.map +1 -1
  77. package/dist/init/index.d.ts +2 -2
  78. package/dist/init/index.d.ts.map +1 -1
  79. package/dist/init/player-camera.js.map +1 -1
  80. package/dist/init/session-grant.d.ts +34 -0
  81. package/dist/init/session-grant.d.ts.map +1 -0
  82. package/dist/init/session-grant.js +89 -0
  83. package/dist/init/session-grant.js.map +1 -0
  84. package/dist/init/world-initializer.d.ts +87 -4
  85. package/dist/init/world-initializer.d.ts.map +1 -1
  86. package/dist/init/world-initializer.js +45 -41
  87. package/dist/init/world-initializer.js.map +1 -1
  88. package/dist/init/xr.d.ts +19 -0
  89. package/dist/init/xr.d.ts.map +1 -1
  90. package/dist/init/xr.js +136 -41
  91. package/dist/init/xr.js.map +1 -1
  92. package/dist/input/canvas-pointer-system.d.ts +2 -0
  93. package/dist/input/canvas-pointer-system.d.ts.map +1 -1
  94. package/dist/input/canvas-pointer-system.js +33 -13
  95. package/dist/input/canvas-pointer-system.js.map +1 -1
  96. package/dist/input/input-actions.js.map +1 -1
  97. package/dist/input/input-manager.js.map +1 -1
  98. package/dist/input/input-system.d.ts.map +1 -1
  99. package/dist/input/input-system.js +5 -2
  100. package/dist/input/input-system.js.map +1 -1
  101. package/dist/input/state-tags.js.map +1 -1
  102. package/dist/input/stateful-browser-gamepad.js.map +1 -1
  103. package/dist/input/stateful-keyboard.js.map +1 -1
  104. package/dist/layers/xr-cylinder-layer.d.ts +2 -1
  105. package/dist/layers/xr-cylinder-layer.d.ts.map +1 -1
  106. package/dist/layers/xr-cylinder-layer.js +2 -1
  107. package/dist/layers/xr-cylinder-layer.js.map +1 -1
  108. package/dist/layers/xr-layer-init.d.ts +19 -0
  109. package/dist/layers/xr-layer-init.d.ts.map +1 -0
  110. package/dist/layers/xr-layer-init.js +20 -0
  111. package/dist/layers/xr-layer-init.js.map +1 -0
  112. package/dist/layers/xr-layer-state.js.map +1 -1
  113. package/dist/layers/xr-layer-system.d.ts +41 -1
  114. package/dist/layers/xr-layer-system.d.ts.map +1 -1
  115. package/dist/layers/xr-layer-system.js +506 -132
  116. package/dist/layers/xr-layer-system.js.map +1 -1
  117. package/dist/layers/xr-layer-transform.d.ts +18 -0
  118. package/dist/layers/xr-layer-transform.d.ts.map +1 -0
  119. package/dist/layers/xr-layer-transform.js +115 -0
  120. package/dist/layers/xr-layer-transform.js.map +1 -0
  121. package/dist/layers/xr-quad-layer.d.ts +2 -1
  122. package/dist/layers/xr-quad-layer.d.ts.map +1 -1
  123. package/dist/layers/xr-quad-layer.js +2 -1
  124. package/dist/layers/xr-quad-layer.js.map +1 -1
  125. package/dist/level/level-component-applier.d.ts +2 -0
  126. package/dist/level/level-component-applier.d.ts.map +1 -1
  127. package/dist/level/level-component-applier.js +24 -5
  128. package/dist/level/level-component-applier.js.map +1 -1
  129. package/dist/level/level-player-rig.js.map +1 -1
  130. package/dist/level/level-root.js.map +1 -1
  131. package/dist/level/level-scene-environment.js.map +1 -1
  132. package/dist/level/level-scene-json-importer.js.map +1 -1
  133. package/dist/level/level-scene-material.js.map +1 -1
  134. package/dist/level/level-scene-object.js.map +1 -1
  135. package/dist/level/level-scene-primitive.js.map +1 -1
  136. package/dist/level/level-system.js.map +1 -1
  137. package/dist/level/level-tag.js.map +1 -1
  138. package/dist/lighting/light-binding.js.map +1 -1
  139. package/dist/lighting/light-components.js.map +1 -1
  140. package/dist/lighting/light-system.js.map +1 -1
  141. package/dist/locomotion/geometries/beveled-cylinder.js.map +1 -1
  142. package/dist/locomotion/locomotion-environment.js.map +1 -1
  143. package/dist/locomotion/locomotion-input-provider.js.map +1 -1
  144. package/dist/locomotion/locomotion.js.map +1 -1
  145. package/dist/locomotion/materials/line.js.map +1 -1
  146. package/dist/locomotion/slide.js.map +1 -1
  147. package/dist/locomotion/teleport.js.map +1 -1
  148. package/dist/locomotion/turn.js.map +1 -1
  149. package/dist/mcp/ecs-debug-tools.d.ts +4 -1
  150. package/dist/mcp/ecs-debug-tools.d.ts.map +1 -1
  151. package/dist/mcp/ecs-debug-tools.js +113 -10
  152. package/dist/mcp/ecs-debug-tools.js.map +1 -1
  153. package/dist/mcp/index.d.ts +1 -0
  154. package/dist/mcp/index.d.ts.map +1 -1
  155. package/dist/mcp/mcp-runtime.d.ts +2 -0
  156. package/dist/mcp/mcp-runtime.d.ts.map +1 -1
  157. package/dist/mcp/mcp-runtime.js +41 -0
  158. package/dist/mcp/mcp-runtime.js.map +1 -1
  159. package/dist/mcp/scene-tools.js.map +1 -1
  160. package/dist/mcp/ui-debug-tools.d.ts +56 -0
  161. package/dist/mcp/ui-debug-tools.d.ts.map +1 -0
  162. package/dist/mcp/ui-debug-tools.js +412 -0
  163. package/dist/mcp/ui-debug-tools.js.map +1 -0
  164. package/dist/physics/index.js +1 -1
  165. package/dist/physics/physics-runtime.d.ts +22 -0
  166. package/dist/physics/physics-runtime.d.ts.map +1 -0
  167. package/dist/physics/physics-runtime.js +423 -0
  168. package/dist/physics/physics-runtime.js.map +1 -0
  169. package/dist/physics/physics-system.d.ts +84 -108
  170. package/dist/physics/physics-system.d.ts.map +1 -1
  171. package/dist/physics/physics-system.js +686 -555
  172. package/dist/physics/physics-system.js.map +1 -1
  173. package/dist/physics/physics-transport.d.ts +20 -0
  174. package/dist/physics/physics-transport.d.ts.map +1 -0
  175. package/dist/physics/physics-transport.js +111 -0
  176. package/dist/physics/physics-transport.js.map +1 -0
  177. package/dist/physics/physics-worker-protocol.d.ts +144 -0
  178. package/dist/physics/physics-worker-protocol.d.ts.map +1 -0
  179. package/dist/physics/physics-worker-protocol.js +41 -0
  180. package/dist/physics/physics-worker-protocol.js.map +1 -0
  181. package/dist/physics/physics-worker-utils.d.ts +8 -0
  182. package/dist/physics/physics-worker-utils.d.ts.map +1 -0
  183. package/dist/physics/physics-worker-utils.js +12 -0
  184. package/dist/physics/physics-worker-utils.js.map +1 -0
  185. package/dist/physics/physics-worker.d.ts +8 -0
  186. package/dist/physics/physics-worker.d.ts.map +1 -0
  187. package/dist/physics/physics-worker.js +66 -0
  188. package/dist/physics/physics-worker.js.map +1 -0
  189. package/dist/physics/physicsBody.js.map +1 -1
  190. package/dist/physics/physicsManipulation.js.map +1 -1
  191. package/dist/physics/physicsShape.js.map +1 -1
  192. package/dist/physics/utils.js.map +1 -1
  193. package/dist/project/normalize.js +7 -1
  194. package/dist/project/normalize.js.map +1 -1
  195. package/dist/project/paths.js.map +1 -1
  196. package/dist/project/types.d.ts +7 -1
  197. package/dist/project/types.d.ts.map +1 -1
  198. package/dist/project/types.js.map +1 -1
  199. package/dist/project/validation.js +36 -2
  200. package/dist/project/validation.js.map +1 -1
  201. package/dist/runtime/three.js.map +1 -1
  202. package/dist/scene-understanding/anchor.js.map +1 -1
  203. package/dist/scene-understanding/mesh.js.map +1 -1
  204. package/dist/scene-understanding/plane.js.map +1 -1
  205. package/dist/scene-understanding/scene-understanding-system.d.ts +42 -6
  206. package/dist/scene-understanding/scene-understanding-system.d.ts.map +1 -1
  207. package/dist/scene-understanding/scene-understanding-system.js +391 -106
  208. package/dist/scene-understanding/scene-understanding-system.js.map +1 -1
  209. package/dist/schemas/iwsdk-project.v1.schema.json +20 -1
  210. package/dist/transform/synced-euler.js.map +1 -1
  211. package/dist/transform/synced-quaternion.js.map +1 -1
  212. package/dist/transform/synced-vector3.js.map +1 -1
  213. package/dist/transform/transform-component.js.map +1 -1
  214. package/dist/transform/transform-utils.js.map +1 -1
  215. package/dist/transform/transform.js.map +1 -1
  216. package/dist/ui/document.js.map +1 -1
  217. package/dist/ui/follow-component.js.map +1 -1
  218. package/dist/ui/follow.d.ts.map +1 -1
  219. package/dist/ui/follow.js +0 -1
  220. package/dist/ui/follow.js.map +1 -1
  221. package/dist/ui/panel-components.js.map +1 -1
  222. package/dist/ui/screenspace-component.js.map +1 -1
  223. package/dist/ui/screenspace.js.map +1 -1
  224. package/dist/ui/ui.js.map +1 -1
  225. package/dist/ui/uikitml-asset.js.map +1 -1
  226. package/dist/ui/uikitml.js.map +1 -1
  227. package/dist/version.d.ts +1 -1
  228. package/dist/version.d.ts.map +1 -1
  229. package/dist/version.js +1 -1
  230. package/dist/version.js.map +1 -1
  231. package/dist/visibility/visibility-component.js.map +1 -1
  232. package/dist/visibility/visibility.js.map +1 -1
  233. package/package.json +5 -5
@@ -0,0 +1,423 @@
1
+ import HavokPhysics from '@babylonjs/havok';
2
+ import { PHYSICS_PROTOCOL_VERSION, PHYSICS_HEADER_BYTES, PHYSICS_OUTPUT_RECORD_FLOATS, getCapsuleAxisEndpoints, PHYSICS_HEADER_WORDS, PHYSICS_INPUT_RECORD_FLOATS } from './physics-worker-protocol.js';
3
+ import { reusableFloat32View } from './physics-worker-utils.js';
4
+
5
+ /**
6
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
7
+ *
8
+ * This source code is licensed under the MIT license found in the
9
+ * LICENSE file in the root directory of this source tree.
10
+ */
11
+ async function initialize(state, gravity) {
12
+ if (state.destroyed) {
13
+ throw new Error('Physics runtime has been destroyed');
14
+ }
15
+ if (!state.initializePromise) {
16
+ state.initializePromise = (async () => {
17
+ const engine = await HavokPhysics();
18
+ if (state.destroyed) {
19
+ throw new Error('Physics runtime was destroyed during initialization');
20
+ }
21
+ const world = engine.HP_World_Create()[1];
22
+ try {
23
+ engine.HP_World_SetGravity(world, gravity);
24
+ }
25
+ catch (error) {
26
+ engine.HP_World_Release(world);
27
+ throw error;
28
+ }
29
+ state.havok = engine;
30
+ state.havokWorld = world;
31
+ })();
32
+ }
33
+ await state.initializePromise;
34
+ }
35
+ function requireHavok(state) {
36
+ if (!state.havok || !state.havokWorld) {
37
+ throw new Error('Physics runtime received a message before initialization');
38
+ }
39
+ return [state.havok, state.havokWorld];
40
+ }
41
+ function getHeapFloatView(state, engine) {
42
+ state.heapFloatView = reusableFloat32View(state.heapFloatView, engine.HEAPU8.buffer);
43
+ return state.heapFloatView;
44
+ }
45
+ function copyFloat32ToHeap(engine, source) {
46
+ const offset = engine._malloc(source.byteLength);
47
+ new Float32Array(engine.HEAPU8.buffer, offset, source.length).set(source);
48
+ return offset;
49
+ }
50
+ function copyInt32ToHeap(engine, source) {
51
+ const offset = engine._malloc(source.byteLength);
52
+ new Int32Array(engine.HEAPU8.buffer, offset, source.length).set(source);
53
+ return offset;
54
+ }
55
+ function configureShapeMaterial(engine, shape, descriptor) {
56
+ engine.HP_Shape_SetDensity(shape, descriptor.density);
57
+ engine.HP_Shape_SetMaterial(shape, [
58
+ descriptor.friction,
59
+ descriptor.friction,
60
+ descriptor.restitution,
61
+ engine.MaterialCombine.MINIMUM,
62
+ engine.MaterialCombine.MAXIMUM,
63
+ ]);
64
+ return shape;
65
+ }
66
+ function createShape(engine, descriptor) {
67
+ const dimensions = descriptor.dimensions;
68
+ let shape;
69
+ try {
70
+ switch (descriptor.type) {
71
+ case 'Sphere':
72
+ shape = engine.HP_Shape_CreateSphere([0, 0, 0], dimensions[0])[1];
73
+ break;
74
+ case 'Box':
75
+ shape = engine.HP_Shape_CreateBox([0, 0, 0], [0, 0, 0, 1], dimensions)[1];
76
+ break;
77
+ case 'Cylinder':
78
+ shape = engine.HP_Shape_CreateCylinder([0, -dimensions[1] / 2, 0], [0, dimensions[1] / 2, 0], dimensions[0])[1];
79
+ break;
80
+ case 'Capsules': {
81
+ const endpoints = getCapsuleAxisEndpoints(dimensions[0], dimensions[1]);
82
+ if (!endpoints) {
83
+ throw new Error('Capsule dimensions require a positive radius and a total height greater than or equal to twice the radius');
84
+ }
85
+ shape = engine.HP_Shape_CreateCapsule(endpoints[0], endpoints[1], dimensions[0])[1];
86
+ break;
87
+ }
88
+ case 'ConvexHull': {
89
+ if (!descriptor.vertices) {
90
+ throw new Error('Convex hull body is missing its vertex buffer');
91
+ }
92
+ const vertices = new Float32Array(descriptor.vertices);
93
+ const vertexOffset = copyFloat32ToHeap(engine, vertices);
94
+ try {
95
+ shape = engine.HP_Shape_CreateConvexHull(vertexOffset, vertices.length / 3)[1];
96
+ }
97
+ finally {
98
+ engine._free(vertexOffset);
99
+ }
100
+ break;
101
+ }
102
+ case 'TriMesh': {
103
+ if (!descriptor.vertices || !descriptor.indices) {
104
+ throw new Error('Tri-mesh body is missing vertex or index data');
105
+ }
106
+ const vertices = new Float32Array(descriptor.vertices);
107
+ const indices = new Uint32Array(descriptor.indices);
108
+ const vertexOffset = copyFloat32ToHeap(engine, vertices);
109
+ const indexOffset = copyInt32ToHeap(engine, indices);
110
+ try {
111
+ shape = engine.HP_Shape_CreateMesh(vertexOffset, vertices.length / 3, indexOffset, indices.length / 3)[1];
112
+ }
113
+ finally {
114
+ engine._free(vertexOffset);
115
+ engine._free(indexOffset);
116
+ }
117
+ break;
118
+ }
119
+ }
120
+ return configureShapeMaterial(engine, shape, descriptor);
121
+ }
122
+ catch (error) {
123
+ if (shape) {
124
+ engine.HP_Shape_Release(shape);
125
+ }
126
+ throw error;
127
+ }
128
+ }
129
+ function motionTypeForState(engine, state) {
130
+ switch (state) {
131
+ case 'STATIC':
132
+ return engine.MotionType.STATIC;
133
+ case 'KINEMATIC':
134
+ return engine.MotionType.KINEMATIC;
135
+ case 'DYNAMIC':
136
+ default:
137
+ return engine.MotionType.DYNAMIC;
138
+ }
139
+ }
140
+ function removeBody(state, handle) {
141
+ const entry = state.bodies.get(handle);
142
+ if (!entry) {
143
+ return;
144
+ }
145
+ const [engine, world] = requireHavok(state);
146
+ engine.HP_World_RemoveBody(world, entry.body);
147
+ engine.HP_Body_Release(entry.body);
148
+ engine.HP_Shape_Release(entry.shape);
149
+ state.bodies.delete(handle);
150
+ }
151
+ function addBody(state, message) {
152
+ const [engine, world] = requireHavok(state);
153
+ removeBody(state, message.handle);
154
+ const shape = createShape(engine, message.shape);
155
+ let body;
156
+ let addedToWorld = false;
157
+ try {
158
+ body = engine.HP_Body_Create()[1];
159
+ engine.HP_Body_SetShape(body, shape);
160
+ engine.HP_Body_SetQTransform(body, [message.position, message.quaternion]);
161
+ engine.HP_Body_SetLinearDamping(body, message.linearDamping);
162
+ engine.HP_Body_SetAngularDamping(body, message.angularDamping);
163
+ engine.HP_Body_SetGravityFactor(body, message.gravityFactor);
164
+ const shapeMass = engine.HP_Shape_BuildMassProperties(shape);
165
+ const massProperties = shapeMass[0] === engine.Result.RESULT_OK
166
+ ? shapeMass[1]
167
+ : [[0, 0, 0], 1, [1, 1, 1], [0, 0, 0, 1]];
168
+ if (message.centerOfMass.every((value) => value === Infinity)) {
169
+ message.centerOfMass = [...massProperties[0]];
170
+ }
171
+ else {
172
+ massProperties[0] = [...message.centerOfMass];
173
+ }
174
+ engine.HP_Body_SetMassProperties(body, massProperties);
175
+ engine.HP_Body_SetMotionType(body, motionTypeForState(engine, message.state));
176
+ engine.HP_World_AddBody(world, body, false);
177
+ addedToWorld = true;
178
+ state.bodies.set(message.handle, {
179
+ body,
180
+ shape,
181
+ state: message.state,
182
+ transformOffset: engine.HP_Body_GetWorldTransformOffset(body)[1],
183
+ });
184
+ }
185
+ catch (error) {
186
+ if (body) {
187
+ if (addedToWorld) {
188
+ engine.HP_World_RemoveBody(world, body);
189
+ }
190
+ engine.HP_Body_Release(body);
191
+ }
192
+ engine.HP_Shape_Release(shape);
193
+ throw error;
194
+ }
195
+ return message.centerOfMass;
196
+ }
197
+ function applyCommands(state, buffer) {
198
+ const [engine] = requireHavok(state);
199
+ const ints = new Int32Array(buffer);
200
+ const floats = new Float32Array(buffer);
201
+ const commandCount = ints[2 /* PhysicsHeaderIndex.CommandCount */];
202
+ for (let index = 0; index < commandCount; index++) {
203
+ const base = PHYSICS_HEADER_WORDS + index * PHYSICS_INPUT_RECORD_FLOATS;
204
+ const handle = floats[base + 0 /* PhysicsInputOffset.Handle */];
205
+ const flags = floats[base + 1 /* PhysicsInputOffset.Flags */];
206
+ const entry = state.bodies.get(handle);
207
+ if (!entry) {
208
+ continue;
209
+ }
210
+ if (flags &
211
+ (2 /* PhysicsCommandFlag.SetTransform */ | 1 /* PhysicsCommandFlag.SetTargetTransform */)) {
212
+ const position = [
213
+ floats[base + 2 /* PhysicsInputOffset.PositionX */],
214
+ floats[base + 3 /* PhysicsInputOffset.PositionY */],
215
+ floats[base + 4 /* PhysicsInputOffset.PositionZ */],
216
+ ];
217
+ const quaternion = [
218
+ floats[base + 5 /* PhysicsInputOffset.QuaternionX */],
219
+ floats[base + 6 /* PhysicsInputOffset.QuaternionY */],
220
+ floats[base + 7 /* PhysicsInputOffset.QuaternionZ */],
221
+ floats[base + 8 /* PhysicsInputOffset.QuaternionW */],
222
+ ];
223
+ if (flags & 2 /* PhysicsCommandFlag.SetTransform */) {
224
+ engine.HP_Body_SetQTransform(entry.body, [position, quaternion]);
225
+ }
226
+ if (flags & 1 /* PhysicsCommandFlag.SetTargetTransform */) {
227
+ engine.HP_Body_SetTargetQTransform(entry.body, [position, quaternion]);
228
+ }
229
+ }
230
+ if (flags & 4 /* PhysicsCommandFlag.ResetLinearVelocity */) {
231
+ engine.HP_Body_SetLinearVelocity(entry.body, [0, 0, 0]);
232
+ }
233
+ if (flags & 8 /* PhysicsCommandFlag.ResetAngularVelocity */) {
234
+ engine.HP_Body_SetAngularVelocity(entry.body, [0, 0, 0]);
235
+ }
236
+ if (flags & 16 /* PhysicsCommandFlag.ApplyImpulse */) {
237
+ engine.HP_Body_ApplyImpulse(entry.body, [
238
+ floats[base + 9 /* PhysicsInputOffset.ImpulsePointX */],
239
+ floats[base + 10 /* PhysicsInputOffset.ImpulsePointY */],
240
+ floats[base + 11 /* PhysicsInputOffset.ImpulsePointZ */],
241
+ ], [
242
+ floats[base + 12 /* PhysicsInputOffset.ImpulseX */],
243
+ floats[base + 13 /* PhysicsInputOffset.ImpulseY */],
244
+ floats[base + 14 /* PhysicsInputOffset.ImpulseZ */],
245
+ ]);
246
+ }
247
+ if (flags & 32 /* PhysicsCommandFlag.SetLinearVelocity */) {
248
+ engine.HP_Body_SetLinearVelocity(entry.body, [
249
+ floats[base + 15 /* PhysicsInputOffset.LinearVelocityX */],
250
+ floats[base + 16 /* PhysicsInputOffset.LinearVelocityY */],
251
+ floats[base + 17 /* PhysicsInputOffset.LinearVelocityZ */],
252
+ ]);
253
+ }
254
+ if (flags & 64 /* PhysicsCommandFlag.SetAngularVelocity */) {
255
+ engine.HP_Body_SetAngularVelocity(entry.body, [
256
+ floats[base + 18 /* PhysicsInputOffset.AngularVelocityX */],
257
+ floats[base + 19 /* PhysicsInputOffset.AngularVelocityY */],
258
+ floats[base + 20 /* PhysicsInputOffset.AngularVelocityZ */],
259
+ ]);
260
+ }
261
+ if (flags & 128 /* PhysicsCommandFlag.SetGravityFactor */) {
262
+ engine.HP_Body_SetGravityFactor(entry.body, floats[base + 21 /* PhysicsInputOffset.GravityFactor */]);
263
+ }
264
+ if (flags & 256 /* PhysicsCommandFlag.SetLinearDamping */) {
265
+ engine.HP_Body_SetLinearDamping(entry.body, floats[base + 22 /* PhysicsInputOffset.LinearDamping */]);
266
+ }
267
+ if (flags & 512 /* PhysicsCommandFlag.SetAngularDamping */) {
268
+ engine.HP_Body_SetAngularDamping(entry.body, floats[base + 23 /* PhysicsInputOffset.AngularDamping */]);
269
+ }
270
+ }
271
+ }
272
+ function writeQuaternionFromMatrix(heap, matrixBase, output, outputBase) {
273
+ const m11 = heap[matrixBase];
274
+ const m12 = heap[matrixBase + 4];
275
+ const m13 = heap[matrixBase + 8];
276
+ const m21 = heap[matrixBase + 1];
277
+ const m22 = heap[matrixBase + 5];
278
+ const m23 = heap[matrixBase + 9];
279
+ const m31 = heap[matrixBase + 2];
280
+ const m32 = heap[matrixBase + 6];
281
+ const m33 = heap[matrixBase + 10];
282
+ const trace = m11 + m22 + m33;
283
+ let x;
284
+ let y;
285
+ let z;
286
+ let w;
287
+ if (trace > 0) {
288
+ const scale = 0.5 / Math.sqrt(trace + 1);
289
+ w = 0.25 / scale;
290
+ x = (m32 - m23) * scale;
291
+ y = (m13 - m31) * scale;
292
+ z = (m21 - m12) * scale;
293
+ }
294
+ else if (m11 > m22 && m11 > m33) {
295
+ const scale = 2 * Math.sqrt(1 + m11 - m22 - m33);
296
+ w = (m32 - m23) / scale;
297
+ x = 0.25 * scale;
298
+ y = (m12 + m21) / scale;
299
+ z = (m13 + m31) / scale;
300
+ }
301
+ else if (m22 > m33) {
302
+ const scale = 2 * Math.sqrt(1 + m22 - m11 - m33);
303
+ w = (m13 - m31) / scale;
304
+ x = (m12 + m21) / scale;
305
+ y = 0.25 * scale;
306
+ z = (m23 + m32) / scale;
307
+ }
308
+ else {
309
+ const scale = 2 * Math.sqrt(1 + m33 - m11 - m22);
310
+ w = (m21 - m12) / scale;
311
+ x = (m13 + m31) / scale;
312
+ y = (m23 + m32) / scale;
313
+ z = 0.25 * scale;
314
+ }
315
+ output[outputBase + 4 /* PhysicsOutputOffset.QuaternionX */] = x;
316
+ output[outputBase + 5 /* PhysicsOutputOffset.QuaternionY */] = y;
317
+ output[outputBase + 6 /* PhysicsOutputOffset.QuaternionZ */] = z;
318
+ output[outputBase + 7 /* PhysicsOutputOffset.QuaternionW */] = w;
319
+ }
320
+ function writeResults(state, buffer) {
321
+ const [engine, world] = requireHavok(state);
322
+ const ints = new Int32Array(buffer);
323
+ const floats = new Float32Array(buffer);
324
+ const bodyBuffer = engine.HP_World_GetBodyBuffer(world)[1];
325
+ const maxResults = Math.floor((buffer.byteLength - PHYSICS_HEADER_BYTES) /
326
+ (PHYSICS_OUTPUT_RECORD_FLOATS * 4));
327
+ let resultCount = 0;
328
+ for (const [handle, entry] of state.bodies) {
329
+ if (entry.state === 'STATIC') {
330
+ continue;
331
+ }
332
+ if (resultCount === maxResults) {
333
+ ints[4 /* PhysicsHeaderIndex.Status */] |= 1 /* PhysicsExchangeStatus.ResultsTruncated */;
334
+ break;
335
+ }
336
+ const base = PHYSICS_HEADER_WORDS + resultCount * PHYSICS_OUTPUT_RECORD_FLOATS;
337
+ const matrixBase = (bodyBuffer + entry.transformOffset) >> 2;
338
+ const linearVelocity = engine.HP_Body_GetLinearVelocity(entry.body)[1];
339
+ const angularVelocity = engine.HP_Body_GetAngularVelocity(entry.body)[1];
340
+ const heap = getHeapFloatView(state, engine);
341
+ floats[base + 0 /* PhysicsOutputOffset.Handle */] = handle;
342
+ floats[base + 1 /* PhysicsOutputOffset.PositionX */] = heap[matrixBase + 12];
343
+ floats[base + 2 /* PhysicsOutputOffset.PositionY */] = heap[matrixBase + 13];
344
+ floats[base + 3 /* PhysicsOutputOffset.PositionZ */] = heap[matrixBase + 14];
345
+ writeQuaternionFromMatrix(heap, matrixBase, floats, base);
346
+ floats[base + 8 /* PhysicsOutputOffset.LinearVelocityX */] = linearVelocity[0];
347
+ floats[base + 9 /* PhysicsOutputOffset.LinearVelocityY */] = linearVelocity[1];
348
+ floats[base + 10 /* PhysicsOutputOffset.LinearVelocityZ */] = linearVelocity[2];
349
+ floats[base + 11 /* PhysicsOutputOffset.AngularVelocityX */] = angularVelocity[0];
350
+ floats[base + 12 /* PhysicsOutputOffset.AngularVelocityY */] = angularVelocity[1];
351
+ floats[base + 13 /* PhysicsOutputOffset.AngularVelocityZ */] = angularVelocity[2];
352
+ resultCount++;
353
+ }
354
+ ints[3 /* PhysicsHeaderIndex.ResultCount */] = resultCount;
355
+ }
356
+ /** Shared Havok runtime used by both main-thread and worker transports. */
357
+ class PhysicsRuntime {
358
+ constructor() {
359
+ this.state = {
360
+ bodies: new Map(),
361
+ destroyed: false,
362
+ };
363
+ }
364
+ initialize(gravity) {
365
+ return initialize(this.state, gravity);
366
+ }
367
+ setGravity(gravity) {
368
+ const [engine, world] = requireHavok(this.state);
369
+ engine.HP_World_SetGravity(world, gravity);
370
+ }
371
+ addBody(message) {
372
+ return addBody(this.state, message);
373
+ }
374
+ removeBody(handle) {
375
+ removeBody(this.state, handle);
376
+ }
377
+ step(buffer) {
378
+ const ints = new Int32Array(buffer);
379
+ try {
380
+ if (ints[0 /* PhysicsHeaderIndex.Version */] !== PHYSICS_PROTOCOL_VERSION) {
381
+ throw new Error('Physics exchange buffer protocol version mismatch');
382
+ }
383
+ const [engine, world] = requireHavok(this.state);
384
+ applyCommands(this.state, buffer);
385
+ const floats = new Float32Array(buffer);
386
+ const delta = floats[8 /* PhysicsHeaderIndex.Delta */];
387
+ const stepCount = Math.max(0, ints[5 /* PhysicsHeaderIndex.StepCount */]);
388
+ for (let index = 0; index < stepCount; index++) {
389
+ engine.HP_World_SetIdealStepTime(world, delta);
390
+ engine.HP_World_Step(world, delta);
391
+ }
392
+ writeResults(this.state, buffer);
393
+ return { buffer };
394
+ }
395
+ catch (error) {
396
+ ints[4 /* PhysicsHeaderIndex.Status */] |= 2 /* PhysicsExchangeStatus.StepFailed */;
397
+ ints[3 /* PhysicsHeaderIndex.ResultCount */] = 0;
398
+ return {
399
+ buffer,
400
+ error: error instanceof Error ? error.message : String(error),
401
+ };
402
+ }
403
+ }
404
+ destroy() {
405
+ if (this.state.destroyed) {
406
+ return;
407
+ }
408
+ this.state.destroyed = true;
409
+ for (const handle of [...this.state.bodies.keys()]) {
410
+ removeBody(this.state, handle);
411
+ }
412
+ if (this.state.havok && this.state.havokWorld) {
413
+ this.state.havok.HP_World_Release(this.state.havokWorld);
414
+ }
415
+ this.state.havok = undefined;
416
+ this.state.havokWorld = undefined;
417
+ this.state.heapFloatView = undefined;
418
+ this.state.initializePromise = undefined;
419
+ }
420
+ }
421
+
422
+ export { PhysicsRuntime };
423
+ //# sourceMappingURL=physics-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics-runtime.js","sources":["../../src/physics/physics-runtime.ts"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport HavokPhysics, {\n type HavokPhysicsWithBindings,\n type HP_BodyId,\n type HP_ShapeId,\n type HP_WorldId,\n type MassProperties,\n type MotionType,\n} from '@babylonjs/havok';\nimport {\n getCapsuleAxisEndpoints,\n PHYSICS_HEADER_BYTES,\n PHYSICS_HEADER_WORDS,\n PHYSICS_INPUT_RECORD_FLOATS,\n PHYSICS_OUTPUT_RECORD_FLOATS,\n PHYSICS_PROTOCOL_VERSION,\n PhysicsCommandFlag,\n PhysicsExchangeStatus,\n PhysicsHeaderIndex,\n PhysicsInputOffset,\n PhysicsOutputOffset,\n type PhysicsWorkerAddBodyMessage,\n type PhysicsWorkerBodyState,\n type PhysicsWorkerShapeDescriptor,\n} from './physics-worker-protocol.js';\nimport { reusableFloat32View } from './physics-worker-utils.js';\n\ninterface WorkerBody {\n body: HP_BodyId;\n shape: HP_ShapeId;\n transformOffset: number;\n state: PhysicsWorkerBodyState;\n}\n\ninterface PhysicsRuntimeState {\n havok?: HavokPhysicsWithBindings;\n havokWorld?: HP_WorldId;\n heapFloatView?: Float32Array;\n initializePromise?: Promise<void>;\n bodies: Map<number, WorkerBody>;\n destroyed: boolean;\n}\n\nasync function initialize(\n state: PhysicsRuntimeState,\n gravity: [number, number, number],\n): Promise<void> {\n if (state.destroyed) {\n throw new Error('Physics runtime has been destroyed');\n }\n if (!state.initializePromise) {\n state.initializePromise = (async () => {\n const engine = await HavokPhysics();\n if (state.destroyed) {\n throw new Error('Physics runtime was destroyed during initialization');\n }\n const world = engine.HP_World_Create()[1];\n try {\n engine.HP_World_SetGravity(world, gravity);\n } catch (error) {\n engine.HP_World_Release(world);\n throw error;\n }\n state.havok = engine;\n state.havokWorld = world;\n })();\n }\n await state.initializePromise;\n}\n\nfunction requireHavok(\n state: PhysicsRuntimeState,\n): [HavokPhysicsWithBindings, HP_WorldId] {\n if (!state.havok || !state.havokWorld) {\n throw new Error('Physics runtime received a message before initialization');\n }\n return [state.havok, state.havokWorld];\n}\n\nfunction getHeapFloatView(\n state: PhysicsRuntimeState,\n engine: HavokPhysicsWithBindings,\n): Float32Array {\n state.heapFloatView = reusableFloat32View(\n state.heapFloatView,\n engine.HEAPU8.buffer,\n );\n return state.heapFloatView;\n}\n\nfunction copyFloat32ToHeap(\n engine: HavokPhysicsWithBindings,\n source: Float32Array,\n): number {\n const offset = engine._malloc(source.byteLength);\n new Float32Array(engine.HEAPU8.buffer, offset, source.length).set(source);\n return offset;\n}\n\nfunction copyInt32ToHeap(\n engine: HavokPhysicsWithBindings,\n source: Uint32Array,\n): number {\n const offset = engine._malloc(source.byteLength);\n new Int32Array(engine.HEAPU8.buffer, offset, source.length).set(source);\n return offset;\n}\n\nfunction configureShapeMaterial(\n engine: HavokPhysicsWithBindings,\n shape: HP_ShapeId,\n descriptor: PhysicsWorkerShapeDescriptor,\n): HP_ShapeId {\n engine.HP_Shape_SetDensity(shape, descriptor.density);\n engine.HP_Shape_SetMaterial(shape, [\n descriptor.friction,\n descriptor.friction,\n descriptor.restitution,\n engine.MaterialCombine.MINIMUM,\n engine.MaterialCombine.MAXIMUM,\n ]);\n return shape;\n}\n\nfunction createShape(\n engine: HavokPhysicsWithBindings,\n descriptor: PhysicsWorkerShapeDescriptor,\n): HP_ShapeId {\n const dimensions = descriptor.dimensions;\n let shape: HP_ShapeId | undefined;\n\n try {\n switch (descriptor.type) {\n case 'Sphere':\n shape = engine.HP_Shape_CreateSphere([0, 0, 0], dimensions[0])[1];\n break;\n case 'Box':\n shape = engine.HP_Shape_CreateBox(\n [0, 0, 0],\n [0, 0, 0, 1],\n dimensions,\n )[1];\n break;\n case 'Cylinder':\n shape = engine.HP_Shape_CreateCylinder(\n [0, -dimensions[1] / 2, 0],\n [0, dimensions[1] / 2, 0],\n dimensions[0],\n )[1];\n break;\n case 'Capsules': {\n const endpoints = getCapsuleAxisEndpoints(dimensions[0], dimensions[1]);\n if (!endpoints) {\n throw new Error(\n 'Capsule dimensions require a positive radius and a total height greater than or equal to twice the radius',\n );\n }\n shape = engine.HP_Shape_CreateCapsule(\n endpoints[0],\n endpoints[1],\n dimensions[0],\n )[1];\n break;\n }\n case 'ConvexHull': {\n if (!descriptor.vertices) {\n throw new Error('Convex hull body is missing its vertex buffer');\n }\n const vertices = new Float32Array(descriptor.vertices);\n const vertexOffset = copyFloat32ToHeap(engine, vertices);\n try {\n shape = engine.HP_Shape_CreateConvexHull(\n vertexOffset,\n vertices.length / 3,\n )[1];\n } finally {\n engine._free(vertexOffset);\n }\n break;\n }\n case 'TriMesh': {\n if (!descriptor.vertices || !descriptor.indices) {\n throw new Error('Tri-mesh body is missing vertex or index data');\n }\n const vertices = new Float32Array(descriptor.vertices);\n const indices = new Uint32Array(descriptor.indices);\n const vertexOffset = copyFloat32ToHeap(engine, vertices);\n const indexOffset = copyInt32ToHeap(engine, indices);\n try {\n shape = engine.HP_Shape_CreateMesh(\n vertexOffset,\n vertices.length / 3,\n indexOffset,\n indices.length / 3,\n )[1];\n } finally {\n engine._free(vertexOffset);\n engine._free(indexOffset);\n }\n break;\n }\n }\n\n return configureShapeMaterial(engine, shape, descriptor);\n } catch (error) {\n if (shape) {\n engine.HP_Shape_Release(shape);\n }\n throw error;\n }\n}\n\nfunction motionTypeForState(\n engine: HavokPhysicsWithBindings,\n state: PhysicsWorkerBodyState,\n): MotionType {\n switch (state) {\n case 'STATIC':\n return engine.MotionType.STATIC;\n case 'KINEMATIC':\n return engine.MotionType.KINEMATIC;\n case 'DYNAMIC':\n default:\n return engine.MotionType.DYNAMIC;\n }\n}\n\nfunction removeBody(state: PhysicsRuntimeState, handle: number): void {\n const entry = state.bodies.get(handle);\n if (!entry) {\n return;\n }\n const [engine, world] = requireHavok(state);\n engine.HP_World_RemoveBody(world, entry.body);\n engine.HP_Body_Release(entry.body);\n engine.HP_Shape_Release(entry.shape);\n state.bodies.delete(handle);\n}\n\nfunction addBody(\n state: PhysicsRuntimeState,\n message: PhysicsWorkerAddBodyMessage,\n): [number, number, number] {\n const [engine, world] = requireHavok(state);\n removeBody(state, message.handle);\n\n const shape = createShape(engine, message.shape);\n let body: HP_BodyId | undefined;\n let addedToWorld = false;\n try {\n body = engine.HP_Body_Create()[1];\n engine.HP_Body_SetShape(body, shape);\n engine.HP_Body_SetQTransform(body, [message.position, message.quaternion]);\n engine.HP_Body_SetLinearDamping(body, message.linearDamping);\n engine.HP_Body_SetAngularDamping(body, message.angularDamping);\n engine.HP_Body_SetGravityFactor(body, message.gravityFactor);\n\n const shapeMass = engine.HP_Shape_BuildMassProperties(shape);\n const massProperties: MassProperties =\n shapeMass[0] === engine.Result.RESULT_OK\n ? shapeMass[1]\n : [[0, 0, 0], 1, [1, 1, 1], [0, 0, 0, 1]];\n\n if (message.centerOfMass.every((value) => value === Infinity)) {\n message.centerOfMass = [...massProperties[0]];\n } else {\n massProperties[0] = [...message.centerOfMass];\n }\n\n engine.HP_Body_SetMassProperties(body, massProperties);\n engine.HP_Body_SetMotionType(\n body,\n motionTypeForState(engine, message.state),\n );\n engine.HP_World_AddBody(world, body, false);\n addedToWorld = true;\n\n state.bodies.set(message.handle, {\n body,\n shape,\n state: message.state,\n transformOffset: engine.HP_Body_GetWorldTransformOffset(body)[1],\n });\n } catch (error) {\n if (body) {\n if (addedToWorld) {\n engine.HP_World_RemoveBody(world, body);\n }\n engine.HP_Body_Release(body);\n }\n engine.HP_Shape_Release(shape);\n throw error;\n }\n\n return message.centerOfMass;\n}\n\nfunction applyCommands(state: PhysicsRuntimeState, buffer: ArrayBuffer): void {\n const [engine] = requireHavok(state);\n const ints = new Int32Array(buffer);\n const floats = new Float32Array(buffer);\n const commandCount = ints[PhysicsHeaderIndex.CommandCount];\n\n for (let index = 0; index < commandCount; index++) {\n const base = PHYSICS_HEADER_WORDS + index * PHYSICS_INPUT_RECORD_FLOATS;\n const handle = floats[base + PhysicsInputOffset.Handle];\n const flags = floats[base + PhysicsInputOffset.Flags];\n const entry = state.bodies.get(handle);\n if (!entry) {\n continue;\n }\n\n if (\n flags &\n (PhysicsCommandFlag.SetTransform | PhysicsCommandFlag.SetTargetTransform)\n ) {\n const position: [number, number, number] = [\n floats[base + PhysicsInputOffset.PositionX],\n floats[base + PhysicsInputOffset.PositionY],\n floats[base + PhysicsInputOffset.PositionZ],\n ];\n const quaternion: [number, number, number, number] = [\n floats[base + PhysicsInputOffset.QuaternionX],\n floats[base + PhysicsInputOffset.QuaternionY],\n floats[base + PhysicsInputOffset.QuaternionZ],\n floats[base + PhysicsInputOffset.QuaternionW],\n ];\n if (flags & PhysicsCommandFlag.SetTransform) {\n engine.HP_Body_SetQTransform(entry.body, [position, quaternion]);\n }\n if (flags & PhysicsCommandFlag.SetTargetTransform) {\n engine.HP_Body_SetTargetQTransform(entry.body, [position, quaternion]);\n }\n }\n if (flags & PhysicsCommandFlag.ResetLinearVelocity) {\n engine.HP_Body_SetLinearVelocity(entry.body, [0, 0, 0]);\n }\n if (flags & PhysicsCommandFlag.ResetAngularVelocity) {\n engine.HP_Body_SetAngularVelocity(entry.body, [0, 0, 0]);\n }\n if (flags & PhysicsCommandFlag.ApplyImpulse) {\n engine.HP_Body_ApplyImpulse(\n entry.body,\n [\n floats[base + PhysicsInputOffset.ImpulsePointX],\n floats[base + PhysicsInputOffset.ImpulsePointY],\n floats[base + PhysicsInputOffset.ImpulsePointZ],\n ],\n [\n floats[base + PhysicsInputOffset.ImpulseX],\n floats[base + PhysicsInputOffset.ImpulseY],\n floats[base + PhysicsInputOffset.ImpulseZ],\n ],\n );\n }\n if (flags & PhysicsCommandFlag.SetLinearVelocity) {\n engine.HP_Body_SetLinearVelocity(entry.body, [\n floats[base + PhysicsInputOffset.LinearVelocityX],\n floats[base + PhysicsInputOffset.LinearVelocityY],\n floats[base + PhysicsInputOffset.LinearVelocityZ],\n ]);\n }\n if (flags & PhysicsCommandFlag.SetAngularVelocity) {\n engine.HP_Body_SetAngularVelocity(entry.body, [\n floats[base + PhysicsInputOffset.AngularVelocityX],\n floats[base + PhysicsInputOffset.AngularVelocityY],\n floats[base + PhysicsInputOffset.AngularVelocityZ],\n ]);\n }\n if (flags & PhysicsCommandFlag.SetGravityFactor) {\n engine.HP_Body_SetGravityFactor(\n entry.body,\n floats[base + PhysicsInputOffset.GravityFactor],\n );\n }\n if (flags & PhysicsCommandFlag.SetLinearDamping) {\n engine.HP_Body_SetLinearDamping(\n entry.body,\n floats[base + PhysicsInputOffset.LinearDamping],\n );\n }\n if (flags & PhysicsCommandFlag.SetAngularDamping) {\n engine.HP_Body_SetAngularDamping(\n entry.body,\n floats[base + PhysicsInputOffset.AngularDamping],\n );\n }\n }\n}\n\nfunction writeQuaternionFromMatrix(\n heap: Float32Array,\n matrixBase: number,\n output: Float32Array,\n outputBase: number,\n): void {\n const m11 = heap[matrixBase];\n const m12 = heap[matrixBase + 4];\n const m13 = heap[matrixBase + 8];\n const m21 = heap[matrixBase + 1];\n const m22 = heap[matrixBase + 5];\n const m23 = heap[matrixBase + 9];\n const m31 = heap[matrixBase + 2];\n const m32 = heap[matrixBase + 6];\n const m33 = heap[matrixBase + 10];\n const trace = m11 + m22 + m33;\n\n let x: number;\n let y: number;\n let z: number;\n let w: number;\n\n if (trace > 0) {\n const scale = 0.5 / Math.sqrt(trace + 1);\n w = 0.25 / scale;\n x = (m32 - m23) * scale;\n y = (m13 - m31) * scale;\n z = (m21 - m12) * scale;\n } else if (m11 > m22 && m11 > m33) {\n const scale = 2 * Math.sqrt(1 + m11 - m22 - m33);\n w = (m32 - m23) / scale;\n x = 0.25 * scale;\n y = (m12 + m21) / scale;\n z = (m13 + m31) / scale;\n } else if (m22 > m33) {\n const scale = 2 * Math.sqrt(1 + m22 - m11 - m33);\n w = (m13 - m31) / scale;\n x = (m12 + m21) / scale;\n y = 0.25 * scale;\n z = (m23 + m32) / scale;\n } else {\n const scale = 2 * Math.sqrt(1 + m33 - m11 - m22);\n w = (m21 - m12) / scale;\n x = (m13 + m31) / scale;\n y = (m23 + m32) / scale;\n z = 0.25 * scale;\n }\n\n output[outputBase + PhysicsOutputOffset.QuaternionX] = x;\n output[outputBase + PhysicsOutputOffset.QuaternionY] = y;\n output[outputBase + PhysicsOutputOffset.QuaternionZ] = z;\n output[outputBase + PhysicsOutputOffset.QuaternionW] = w;\n}\n\nfunction writeResults(state: PhysicsRuntimeState, buffer: ArrayBuffer): void {\n const [engine, world] = requireHavok(state);\n const ints = new Int32Array(buffer);\n const floats = new Float32Array(buffer);\n const bodyBuffer = engine.HP_World_GetBodyBuffer(world)[1];\n const maxResults = Math.floor(\n (buffer.byteLength - PHYSICS_HEADER_BYTES) /\n (PHYSICS_OUTPUT_RECORD_FLOATS * 4),\n );\n let resultCount = 0;\n\n for (const [handle, entry] of state.bodies) {\n if (entry.state === 'STATIC') {\n continue;\n }\n if (resultCount === maxResults) {\n ints[PhysicsHeaderIndex.Status] |= PhysicsExchangeStatus.ResultsTruncated;\n break;\n }\n\n const base =\n PHYSICS_HEADER_WORDS + resultCount * PHYSICS_OUTPUT_RECORD_FLOATS;\n const matrixBase = (bodyBuffer + entry.transformOffset) >> 2;\n const linearVelocity = engine.HP_Body_GetLinearVelocity(entry.body)[1];\n const angularVelocity = engine.HP_Body_GetAngularVelocity(entry.body)[1];\n const heap = getHeapFloatView(state, engine);\n\n floats[base + PhysicsOutputOffset.Handle] = handle;\n floats[base + PhysicsOutputOffset.PositionX] = heap[matrixBase + 12];\n floats[base + PhysicsOutputOffset.PositionY] = heap[matrixBase + 13];\n floats[base + PhysicsOutputOffset.PositionZ] = heap[matrixBase + 14];\n writeQuaternionFromMatrix(heap, matrixBase, floats, base);\n floats[base + PhysicsOutputOffset.LinearVelocityX] = linearVelocity[0];\n floats[base + PhysicsOutputOffset.LinearVelocityY] = linearVelocity[1];\n floats[base + PhysicsOutputOffset.LinearVelocityZ] = linearVelocity[2];\n floats[base + PhysicsOutputOffset.AngularVelocityX] = angularVelocity[0];\n floats[base + PhysicsOutputOffset.AngularVelocityY] = angularVelocity[1];\n floats[base + PhysicsOutputOffset.AngularVelocityZ] = angularVelocity[2];\n resultCount++;\n }\n\n ints[PhysicsHeaderIndex.ResultCount] = resultCount;\n}\n\nexport interface PhysicsRuntimeStepResult {\n buffer: ArrayBuffer;\n error?: string;\n}\n\n/** Shared Havok runtime used by both main-thread and worker transports. */\nexport class PhysicsRuntime {\n private readonly state: PhysicsRuntimeState = {\n bodies: new Map<number, WorkerBody>(),\n destroyed: false,\n };\n\n initialize(gravity: [number, number, number]): Promise<void> {\n return initialize(this.state, gravity);\n }\n\n setGravity(gravity: [number, number, number]): void {\n const [engine, world] = requireHavok(this.state);\n engine.HP_World_SetGravity(world, gravity);\n }\n\n addBody(message: PhysicsWorkerAddBodyMessage): [number, number, number] {\n return addBody(this.state, message);\n }\n\n removeBody(handle: number): void {\n removeBody(this.state, handle);\n }\n\n step(buffer: ArrayBuffer): PhysicsRuntimeStepResult {\n const ints = new Int32Array(buffer);\n try {\n if (ints[PhysicsHeaderIndex.Version] !== PHYSICS_PROTOCOL_VERSION) {\n throw new Error('Physics exchange buffer protocol version mismatch');\n }\n const [engine, world] = requireHavok(this.state);\n applyCommands(this.state, buffer);\n const floats = new Float32Array(buffer);\n const delta = floats[PhysicsHeaderIndex.Delta];\n const stepCount = Math.max(0, ints[PhysicsHeaderIndex.StepCount]);\n for (let index = 0; index < stepCount; index++) {\n engine.HP_World_SetIdealStepTime(world, delta);\n engine.HP_World_Step(world, delta);\n }\n writeResults(this.state, buffer);\n return { buffer };\n } catch (error) {\n ints[PhysicsHeaderIndex.Status] |= PhysicsExchangeStatus.StepFailed;\n ints[PhysicsHeaderIndex.ResultCount] = 0;\n return {\n buffer,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n destroy(): void {\n if (this.state.destroyed) {\n return;\n }\n this.state.destroyed = true;\n for (const handle of [...this.state.bodies.keys()]) {\n removeBody(this.state, handle);\n }\n if (this.state.havok && this.state.havokWorld) {\n this.state.havok.HP_World_Release(this.state.havokWorld);\n }\n this.state.havok = undefined;\n this.state.havokWorld = undefined;\n this.state.heapFloatView = undefined;\n this.state.initializePromise = undefined;\n }\n}\n"],"names":[],"mappings":"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"}