@certe/atmos-editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/LICENCE +674 -0
  2. package/README.md +206 -0
  3. package/dist/asset-browser-client.d.ts +24 -0
  4. package/dist/asset-browser-client.d.ts.map +1 -0
  5. package/dist/asset-browser-client.js +60 -0
  6. package/dist/asset-browser-client.js.map +1 -0
  7. package/dist/asset-types.d.ts +33 -0
  8. package/dist/asset-types.d.ts.map +1 -0
  9. package/dist/asset-types.js +2 -0
  10. package/dist/asset-types.js.map +1 -0
  11. package/dist/bootstrap/default-factories.d.ts +38 -0
  12. package/dist/bootstrap/default-factories.d.ts.map +1 -0
  13. package/dist/bootstrap/default-factories.js +268 -0
  14. package/dist/bootstrap/default-factories.js.map +1 -0
  15. package/dist/bootstrap/editor-physics.d.ts +81 -0
  16. package/dist/bootstrap/editor-physics.d.ts.map +1 -0
  17. package/dist/bootstrap/editor-physics.js +512 -0
  18. package/dist/bootstrap/editor-physics.js.map +1 -0
  19. package/dist/bootstrap/geometry-cache.d.ts +5 -0
  20. package/dist/bootstrap/geometry-cache.d.ts.map +1 -0
  21. package/dist/bootstrap/geometry-cache.js +18 -0
  22. package/dist/bootstrap/geometry-cache.js.map +1 -0
  23. package/dist/bootstrap/keyboard-shortcuts.d.ts +4 -0
  24. package/dist/bootstrap/keyboard-shortcuts.d.ts.map +1 -0
  25. package/dist/bootstrap/keyboard-shortcuts.js +43 -0
  26. package/dist/bootstrap/keyboard-shortcuts.js.map +1 -0
  27. package/dist/bootstrap/model-import.d.ts +9 -0
  28. package/dist/bootstrap/model-import.d.ts.map +1 -0
  29. package/dist/bootstrap/model-import.js +55 -0
  30. package/dist/bootstrap/model-import.js.map +1 -0
  31. package/dist/bootstrap/start-editor.d.ts +3 -0
  32. package/dist/bootstrap/start-editor.d.ts.map +1 -0
  33. package/dist/bootstrap/start-editor.js +506 -0
  34. package/dist/bootstrap/start-editor.js.map +1 -0
  35. package/dist/bootstrap/start-player.d.ts +23 -0
  36. package/dist/bootstrap/start-player.d.ts.map +1 -0
  37. package/dist/bootstrap/start-player.js +205 -0
  38. package/dist/bootstrap/start-player.js.map +1 -0
  39. package/dist/bootstrap/types.d.ts +160 -0
  40. package/dist/bootstrap/types.d.ts.map +1 -0
  41. package/dist/bootstrap/types.js +2 -0
  42. package/dist/bootstrap/types.js.map +1 -0
  43. package/dist/camera-frustum-renderer.d.ts +15 -0
  44. package/dist/camera-frustum-renderer.d.ts.map +1 -0
  45. package/dist/camera-frustum-renderer.js +110 -0
  46. package/dist/camera-frustum-renderer.js.map +1 -0
  47. package/dist/camera-presets.d.ts +10 -0
  48. package/dist/camera-presets.d.ts.map +1 -0
  49. package/dist/camera-presets.js +15 -0
  50. package/dist/camera-presets.js.map +1 -0
  51. package/dist/collider-gizmo-renderer.d.ts +13 -0
  52. package/dist/collider-gizmo-renderer.d.ts.map +1 -0
  53. package/dist/collider-gizmo-renderer.js +217 -0
  54. package/dist/collider-gizmo-renderer.js.map +1 -0
  55. package/dist/color-utils.d.ts +5 -0
  56. package/dist/color-utils.d.ts.map +1 -0
  57. package/dist/color-utils.js +13 -0
  58. package/dist/color-utils.js.map +1 -0
  59. package/dist/components/asset-browser-panel.d.ts +14 -0
  60. package/dist/components/asset-browser-panel.d.ts.map +1 -0
  61. package/dist/components/asset-browser-panel.js +247 -0
  62. package/dist/components/asset-browser-panel.js.map +1 -0
  63. package/dist/components/context-menu.d.ts +14 -0
  64. package/dist/components/context-menu.d.ts.map +1 -0
  65. package/dist/components/context-menu.js +48 -0
  66. package/dist/components/context-menu.js.map +1 -0
  67. package/dist/components/editor-shell.d.ts +27 -0
  68. package/dist/components/editor-shell.d.ts.map +1 -0
  69. package/dist/components/editor-shell.js +327 -0
  70. package/dist/components/editor-shell.js.map +1 -0
  71. package/dist/components/fields/boolean-field.d.ts +8 -0
  72. package/dist/components/fields/boolean-field.d.ts.map +1 -0
  73. package/dist/components/fields/boolean-field.js +11 -0
  74. package/dist/components/fields/boolean-field.js.map +1 -0
  75. package/dist/components/fields/color-field.d.ts +8 -0
  76. package/dist/components/fields/color-field.d.ts.map +1 -0
  77. package/dist/components/fields/color-field.js +34 -0
  78. package/dist/components/fields/color-field.js.map +1 -0
  79. package/dist/components/fields/decimal-input.d.ts +13 -0
  80. package/dist/components/fields/decimal-input.d.ts.map +1 -0
  81. package/dist/components/fields/decimal-input.js +49 -0
  82. package/dist/components/fields/decimal-input.js.map +1 -0
  83. package/dist/components/fields/enum-field.d.ts +12 -0
  84. package/dist/components/fields/enum-field.d.ts.map +1 -0
  85. package/dist/components/fields/enum-field.js +20 -0
  86. package/dist/components/fields/enum-field.js.map +1 -0
  87. package/dist/components/fields/game-object-ref-field.d.ts +11 -0
  88. package/dist/components/fields/game-object-ref-field.d.ts.map +1 -0
  89. package/dist/components/fields/game-object-ref-field.js +73 -0
  90. package/dist/components/fields/game-object-ref-field.js.map +1 -0
  91. package/dist/components/fields/material-asset-field.d.ts +10 -0
  92. package/dist/components/fields/material-asset-field.d.ts.map +1 -0
  93. package/dist/components/fields/material-asset-field.js +114 -0
  94. package/dist/components/fields/material-asset-field.js.map +1 -0
  95. package/dist/components/fields/number-field.d.ts +10 -0
  96. package/dist/components/fields/number-field.d.ts.map +1 -0
  97. package/dist/components/fields/number-field.js +21 -0
  98. package/dist/components/fields/number-field.js.map +1 -0
  99. package/dist/components/fields/quat-field.d.ts +8 -0
  100. package/dist/components/fields/quat-field.d.ts.map +1 -0
  101. package/dist/components/fields/quat-field.js +43 -0
  102. package/dist/components/fields/quat-field.js.map +1 -0
  103. package/dist/components/fields/string-field.d.ts +7 -0
  104. package/dist/components/fields/string-field.d.ts.map +1 -0
  105. package/dist/components/fields/string-field.js +20 -0
  106. package/dist/components/fields/string-field.js.map +1 -0
  107. package/dist/components/fields/vec3-field.d.ts +8 -0
  108. package/dist/components/fields/vec3-field.d.ts.map +1 -0
  109. package/dist/components/fields/vec3-field.js +30 -0
  110. package/dist/components/fields/vec3-field.js.map +1 -0
  111. package/dist/components/hierarchy-node.d.ts +18 -0
  112. package/dist/components/hierarchy-node.d.ts.map +1 -0
  113. package/dist/components/hierarchy-node.js +77 -0
  114. package/dist/components/hierarchy-node.js.map +1 -0
  115. package/dist/components/hierarchy-panel.d.ts +14 -0
  116. package/dist/components/hierarchy-panel.d.ts.map +1 -0
  117. package/dist/components/hierarchy-panel.js +228 -0
  118. package/dist/components/hierarchy-panel.js.map +1 -0
  119. package/dist/components/inspector-panel.d.ts +14 -0
  120. package/dist/components/inspector-panel.d.ts.map +1 -0
  121. package/dist/components/inspector-panel.js +288 -0
  122. package/dist/components/inspector-panel.js.map +1 -0
  123. package/dist/components/material-inspector.d.ts +10 -0
  124. package/dist/components/material-inspector.d.ts.map +1 -0
  125. package/dist/components/material-inspector.js +130 -0
  126. package/dist/components/material-inspector.js.map +1 -0
  127. package/dist/components/post-process-panel.d.ts +9 -0
  128. package/dist/components/post-process-panel.d.ts.map +1 -0
  129. package/dist/components/post-process-panel.js +70 -0
  130. package/dist/components/post-process-panel.js.map +1 -0
  131. package/dist/components/project-gate.d.ts +8 -0
  132. package/dist/components/project-gate.d.ts.map +1 -0
  133. package/dist/components/project-gate.js +87 -0
  134. package/dist/components/project-gate.js.map +1 -0
  135. package/dist/components/settings-panel.d.ts +8 -0
  136. package/dist/components/settings-panel.d.ts.map +1 -0
  137. package/dist/components/settings-panel.js +108 -0
  138. package/dist/components/settings-panel.js.map +1 -0
  139. package/dist/components/use-splitter.d.ts +4 -0
  140. package/dist/components/use-splitter.d.ts.map +1 -0
  141. package/dist/components/use-splitter.js +22 -0
  142. package/dist/components/use-splitter.js.map +1 -0
  143. package/dist/editor-mount.d.ts +36 -0
  144. package/dist/editor-mount.d.ts.map +1 -0
  145. package/dist/editor-mount.js +161 -0
  146. package/dist/editor-mount.js.map +1 -0
  147. package/dist/editor-state.d.ts +55 -0
  148. package/dist/editor-state.d.ts.map +1 -0
  149. package/dist/editor-state.js +181 -0
  150. package/dist/editor-state.js.map +1 -0
  151. package/dist/gizmo-meshes.d.ts +9 -0
  152. package/dist/gizmo-meshes.d.ts.map +1 -0
  153. package/dist/gizmo-meshes.js +229 -0
  154. package/dist/gizmo-meshes.js.map +1 -0
  155. package/dist/gizmo-renderer.d.ts +16 -0
  156. package/dist/gizmo-renderer.d.ts.map +1 -0
  157. package/dist/gizmo-renderer.js +77 -0
  158. package/dist/gizmo-renderer.js.map +1 -0
  159. package/dist/gizmo-state.d.ts +25 -0
  160. package/dist/gizmo-state.d.ts.map +1 -0
  161. package/dist/gizmo-state.js +269 -0
  162. package/dist/gizmo-state.js.map +1 -0
  163. package/dist/index.d.ts +33 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +22 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/joint-gizmo-renderer.d.ts +13 -0
  168. package/dist/joint-gizmo-renderer.d.ts.map +1 -0
  169. package/dist/joint-gizmo-renderer.js +133 -0
  170. package/dist/joint-gizmo-renderer.js.map +1 -0
  171. package/dist/material-manager.d.ts +22 -0
  172. package/dist/material-manager.d.ts.map +1 -0
  173. package/dist/material-manager.js +156 -0
  174. package/dist/material-manager.js.map +1 -0
  175. package/dist/object-picker.d.ts +11 -0
  176. package/dist/object-picker.d.ts.map +1 -0
  177. package/dist/object-picker.js +104 -0
  178. package/dist/object-picker.js.map +1 -0
  179. package/dist/orbit-camera.d.ts +38 -0
  180. package/dist/orbit-camera.d.ts.map +1 -0
  181. package/dist/orbit-camera.js +180 -0
  182. package/dist/orbit-camera.js.map +1 -0
  183. package/dist/overlay-renderer.d.ts +23 -0
  184. package/dist/overlay-renderer.d.ts.map +1 -0
  185. package/dist/overlay-renderer.js +95 -0
  186. package/dist/overlay-renderer.js.map +1 -0
  187. package/dist/player-entry.d.ts +6 -0
  188. package/dist/player-entry.d.ts.map +1 -0
  189. package/dist/player-entry.js +4 -0
  190. package/dist/player-entry.js.map +1 -0
  191. package/dist/project-fs.d.ts +28 -0
  192. package/dist/project-fs.d.ts.map +1 -0
  193. package/dist/project-fs.js +258 -0
  194. package/dist/project-fs.js.map +1 -0
  195. package/dist/project-seed.d.ts +3 -0
  196. package/dist/project-seed.d.ts.map +1 -0
  197. package/dist/project-seed.js +35 -0
  198. package/dist/project-seed.js.map +1 -0
  199. package/dist/project-settings.d.ts +29 -0
  200. package/dist/project-settings.d.ts.map +1 -0
  201. package/dist/project-settings.js +69 -0
  202. package/dist/project-settings.js.map +1 -0
  203. package/dist/property-setters.d.ts +4 -0
  204. package/dist/property-setters.d.ts.map +1 -0
  205. package/dist/property-setters.js +58 -0
  206. package/dist/property-setters.js.map +1 -0
  207. package/dist/scene-operations.d.ts +14 -0
  208. package/dist/scene-operations.d.ts.map +1 -0
  209. package/dist/scene-operations.js +195 -0
  210. package/dist/scene-operations.js.map +1 -0
  211. package/dist/scene-snapshot.d.ts +28 -0
  212. package/dist/scene-snapshot.d.ts.map +1 -0
  213. package/dist/scene-snapshot.js +97 -0
  214. package/dist/scene-snapshot.js.map +1 -0
  215. package/dist/script-discovery.d.ts +12 -0
  216. package/dist/script-discovery.d.ts.map +1 -0
  217. package/dist/script-discovery.js +81 -0
  218. package/dist/script-discovery.js.map +1 -0
  219. package/dist/selection-utils.d.ts +4 -0
  220. package/dist/selection-utils.d.ts.map +1 -0
  221. package/dist/selection-utils.js +19 -0
  222. package/dist/selection-utils.js.map +1 -0
  223. package/dist/simple-material-loader.d.ts +17 -0
  224. package/dist/simple-material-loader.d.ts.map +1 -0
  225. package/dist/simple-material-loader.js +85 -0
  226. package/dist/simple-material-loader.js.map +1 -0
  227. package/dist/wireframe-renderer.d.ts +18 -0
  228. package/dist/wireframe-renderer.d.ts.map +1 -0
  229. package/dist/wireframe-renderer.js +106 -0
  230. package/dist/wireframe-renderer.js.map +1 -0
  231. package/package.json +65 -0
  232. package/src/index.ts +48 -0
  233. package/vite-plugin.d.ts +15 -0
  234. package/vite-plugin.mjs +395 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-factories.js","sourceRoot":"","sources":["../../src/bootstrap/default-factories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { Component, GameObject, Scene, PhysicsStepper } from '@certe/atmos-core';
2
+ /** Minimal mesh interface for collider auto-sizing (structurally matches @certe/atmos-editor MeshLike) */
3
+ interface MeshLike {
4
+ vertices?: Float32Array;
5
+ vertexStride?: number;
6
+ }
7
+ /** Matches @certe/atmos-editor PhysicsInitContext structurally */
8
+ interface InitContext {
9
+ meshes: Record<string, unknown>;
10
+ getMesh(go: GameObject): MeshLike | null;
11
+ }
12
+ export declare function createEditorPhysics(): Promise<{
13
+ init(ctx: InitContext): void;
14
+ createStepper(scene: Scene): PhysicsStepper & {
15
+ scene: Scene;
16
+ };
17
+ canAddComponent(ctor: new () => Component, go: GameObject): string | null;
18
+ handleAddComponent(ctor: new () => Component, go: GameObject): boolean;
19
+ handleDuplicate(copy: GameObject, source: GameObject): void;
20
+ handleRemoveComponent(comp: Component, go: GameObject): boolean;
21
+ handleDeserialize(go: GameObject, type: string, data: Record<string, unknown>, deferred: Array<() => void>): boolean;
22
+ flushDeferred(ops: Array<() => void>): void;
23
+ installReparentHooks(setValidator: (fn: ((child: GameObject, newParent: GameObject | null) => boolean) | null) => void, setCallback: (fn: ((child: GameObject) => void) | null) => void): void;
24
+ onSceneChanged(scene: Scene): void;
25
+ isPhysicsComponent(comp: Component): boolean;
26
+ onSceneRestored(scene: Scene): void;
27
+ syncTransformsForObjects(objects: readonly GameObject[]): void;
28
+ syncJointsForObjects(objects: readonly GameObject[]): void;
29
+ syncAllJoints(scene: Scene): void;
30
+ getColliderGizmoData(go: GameObject): {
31
+ shapeType: "box" | "sphere" | "capsule" | "cylinder";
32
+ position: {
33
+ x: number;
34
+ y: number;
35
+ z: number;
36
+ };
37
+ rotation: {
38
+ x: number;
39
+ y: number;
40
+ z: number;
41
+ w: number;
42
+ };
43
+ halfExtents?: {
44
+ x: number;
45
+ y: number;
46
+ z: number;
47
+ };
48
+ radius?: number;
49
+ halfHeight?: number;
50
+ }[] | null;
51
+ applyPhysicsSettings(settings: {
52
+ gravity: [number, number, number];
53
+ fixedTimestep: number;
54
+ solverIterations: number;
55
+ substeps: number;
56
+ }): void;
57
+ getJointGizmoData(go: GameObject): {
58
+ origin1: {
59
+ x: number;
60
+ y: number;
61
+ z: number;
62
+ };
63
+ dir1: {
64
+ x: number;
65
+ y: number;
66
+ z: number;
67
+ };
68
+ origin2: {
69
+ x: number;
70
+ y: number;
71
+ z: number;
72
+ };
73
+ dir2: {
74
+ x: number;
75
+ y: number;
76
+ z: number;
77
+ };
78
+ }[] | null;
79
+ }>;
80
+ export {};
81
+ //# sourceMappingURL=editor-physics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-physics.d.ts","sourceRoot":"","sources":["../../src/bootstrap/editor-physics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAiBtF,0GAA0G;AAC1G,UAAU,QAAQ;IAChB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,kEAAkE;AAClE,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC;CAC1C;AA0DD,wBAAsB,mBAAmB;cAe3B,WAAW;yBASA,KAAK,GAAG,cAAc,GAAG;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE;0BAKxC,UAAU,SAAS,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI;6BAQhD,UAAU,SAAS,MAAM,UAAU,GAAG,OAAO;0BA0ChD,UAAU,UAAU,UAAU,GAAG,IAAI;gCA4C/B,SAAS,MAAM,UAAU,GAAG,OAAO;0BA0BzD,UAAU,QAAQ,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YACjD,KAAK,CAAC,MAAM,IAAI,CAAC,GAC1B,OAAO;uBA2CS,KAAK,CAAC,MAAM,IAAI,CAAC;uCAMpB,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,IAAI,KAAK,OAAO,CAAC,GAAG,IAAI,KAAK,IAAI,eACpF,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI;0BAqB3C,KAAK;6BAIF,SAAS,GAAG,OAAO;2BAIrB,KAAK;sCAQM,SAAS,UAAU,EAAE;kCAiBzB,SAAS,UAAU,EAAE;yBAiB9B,KAAK;6BAQD,UAAU;mBAEpB,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU;kBAC1C;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE;kBACnC;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE;sBAC1C;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE;iBACxC,MAAM;qBACF,MAAM;;mCAmGQ;QAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;0BAOjH,UAAU;iBAEnB;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE;cACtC;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE;iBAChC;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE;cACtC;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE;;GAwFhD"}
@@ -0,0 +1,512 @@
1
+ import { applyComponentData, getAllRegisteredComponents } from '@certe/atmos-core';
2
+ import { initRapier, PhysicsWorld, PhysicsSystem, RigidBody, Collider, Joint, HingeJoint, registerPhysicsBuiltins, findAncestorComponent, hasAncestorComponent, hasDescendantComponent, } from '@certe/atmos-physics';
3
+ // Well-known collider shapes for built-in primitives
4
+ const PRIMITIVE_SHAPES = {
5
+ cube: { type: 'box', halfExtents: { x: 0.5, y: 0.5, z: 0.5 } },
6
+ plane: { type: 'box', halfExtents: { x: 10, y: 0.01, z: 10 }, center: { x: 0, y: -0.01, z: 0 } },
7
+ sphere: { type: 'sphere', radius: 0.5 },
8
+ cylinder: { type: 'cylinder', halfHeight: 0.5, radius: 0.5 },
9
+ };
10
+ function extractPositions(verts, stride) {
11
+ const count = Math.floor(verts.length / stride);
12
+ const positions = new Float32Array(count * 3);
13
+ for (let i = 0; i < count; i++) {
14
+ const src = i * stride;
15
+ const dst = i * 3;
16
+ positions[dst] = verts[src];
17
+ positions[dst + 1] = verts[src + 1];
18
+ positions[dst + 2] = verts[src + 2];
19
+ }
20
+ return positions;
21
+ }
22
+ function colliderShapeForMesh(mesh, knownShapes) {
23
+ const known = knownShapes.get(mesh);
24
+ if (known)
25
+ return known;
26
+ const verts = mesh.vertices;
27
+ const stride = mesh.vertexStride ?? 8;
28
+ if (!verts)
29
+ return { type: 'box', halfExtents: { x: 0.5, y: 0.5, z: 0.5 } };
30
+ return { type: 'convexHull', vertices: extractPositions(verts, stride) };
31
+ }
32
+ /**
33
+ * Walk descendants and re-attach any Collider that sits on its own standalone body
34
+ * (i.e. auto-created when no ancestor RB existed). Removes the standalone RB first.
35
+ */
36
+ function adoptDescendantColliders(go, world) {
37
+ for (const child of go.children) {
38
+ const rb = child.getComponent(RigidBody);
39
+ const col = child.getComponent(Collider);
40
+ if (rb && col && !col.isChildCollider) {
41
+ // Child has standalone RB + Collider — remove RB and re-attach as compound
42
+ child.removeComponent(rb);
43
+ col.reattach(world);
44
+ // Continue into subtree since this RB was removed
45
+ adoptDescendantColliders(child, world);
46
+ }
47
+ else if (!rb) {
48
+ // No RB on this child — check deeper
49
+ adoptDescendantColliders(child, world);
50
+ }
51
+ // If child has its own RB with a different compound setup, don't recurse past it
52
+ }
53
+ }
54
+ export async function createEditorPhysics() {
55
+ await initRapier();
56
+ registerPhysicsBuiltins();
57
+ const world = new PhysicsWorld({ fixedTimestep: 1 / 60, solverIterations: 8 });
58
+ let meshShapes = new Map();
59
+ let getMesh = () => null;
60
+ let system = null;
61
+ function getShape(go) {
62
+ const m = getMesh(go);
63
+ return m ? colliderShapeForMesh(m, meshShapes) : { type: 'box', halfExtents: { x: 0.5, y: 0.5, z: 0.5 } };
64
+ }
65
+ return {
66
+ init(ctx) {
67
+ getMesh = ctx.getMesh;
68
+ meshShapes = new Map();
69
+ for (const [name, mesh] of Object.entries(ctx.meshes)) {
70
+ const shape = PRIMITIVE_SHAPES[name];
71
+ if (shape)
72
+ meshShapes.set(mesh, shape);
73
+ }
74
+ },
75
+ createStepper(scene) {
76
+ system = new PhysicsSystem(world, scene);
77
+ return system;
78
+ },
79
+ canAddComponent(ctor, go) {
80
+ if (ctor === RigidBody) {
81
+ if (go.getComponent(RigidBody))
82
+ return 'Already has a RigidBody';
83
+ if (hasAncestorComponent(go, RigidBody))
84
+ return 'Ancestor already has a RigidBody';
85
+ }
86
+ return null;
87
+ },
88
+ handleAddComponent(ctor, go) {
89
+ if (ctor === RigidBody) {
90
+ if (hasAncestorComponent(go, RigidBody)) {
91
+ console.warn('Cannot add RigidBody: ancestor already has one.');
92
+ return true;
93
+ }
94
+ const rb = go.addComponent(RigidBody);
95
+ rb.init(world, { type: 'dynamic' });
96
+ if (!go.getComponent(Collider)) {
97
+ const col = go.addComponent(Collider);
98
+ col.init(world, { shape: getShape(go), friction: 0.3, restitution: 0.3 });
99
+ }
100
+ // Adopt descendant colliders that are on standalone auto-created bodies
101
+ adoptDescendantColliders(go, world);
102
+ return true;
103
+ }
104
+ if (ctor === Collider) {
105
+ if (!findAncestorComponent(go, RigidBody)) {
106
+ const rb = go.addComponent(RigidBody);
107
+ rb.init(world, { type: 'fixed' });
108
+ }
109
+ const col = go.addComponent(Collider);
110
+ col.init(world, { shape: getShape(go), friction: 0.3, restitution: 0.3 });
111
+ return true;
112
+ }
113
+ if (ctor.prototype instanceof Joint) {
114
+ let rb = go.getComponent(RigidBody);
115
+ if (!rb) {
116
+ rb = go.addComponent(RigidBody);
117
+ rb.init(world, { type: 'dynamic' });
118
+ }
119
+ if (!go.getComponent(Collider)) {
120
+ const col = go.addComponent(Collider);
121
+ col.init(world, { shape: getShape(go), friction: 0.3, restitution: 0.3 });
122
+ }
123
+ const joint = go.addComponent(ctor);
124
+ joint.init(world);
125
+ return true;
126
+ }
127
+ return false;
128
+ },
129
+ handleDuplicate(copy, source) {
130
+ const srcRb = source.getComponent(RigidBody);
131
+ const srcCol = source.getComponent(Collider);
132
+ // Initialize RigidBody first (Collider depends on it)
133
+ if (srcRb) {
134
+ const rb = copy.getComponent(RigidBody);
135
+ if (rb && !rb.body) {
136
+ rb.init(world, {
137
+ type: rb.bodyType || srcRb.bodyType,
138
+ linearDamping: srcRb.linearDamping,
139
+ angularDamping: srcRb.angularDamping,
140
+ gravityScale: srcRb.gravityScale,
141
+ });
142
+ }
143
+ }
144
+ // Initialize Collider
145
+ if (srcCol && srcCol.shape) {
146
+ const col = copy.getComponent(Collider);
147
+ if (col && !col.collider) {
148
+ // Ensure ancestor RigidBody exists (may be on parent)
149
+ if (!findAncestorComponent(copy, RigidBody)) {
150
+ const rb = copy.addComponent(RigidBody);
151
+ rb.init(world, { type: 'fixed' });
152
+ }
153
+ col.init(world, {
154
+ shape: srcCol.shape,
155
+ friction: srcCol.friction,
156
+ restitution: srcCol.restitution,
157
+ density: srcCol.density,
158
+ isSensor: srcCol.isSensor,
159
+ });
160
+ }
161
+ }
162
+ // Initialize Joints
163
+ for (const comp of copy.getComponents()) {
164
+ if (comp instanceof Joint && !comp.joint) {
165
+ comp.init(world);
166
+ }
167
+ }
168
+ },
169
+ handleRemoveComponent(comp, go) {
170
+ if (comp instanceof RigidBody) {
171
+ // Collect colliders attached to this body before destroying it
172
+ const rb = comp;
173
+ const orphans = [];
174
+ const collect = (obj) => {
175
+ const col = obj.getComponent(Collider);
176
+ if (col && col.attachedBody === rb)
177
+ orphans.push(col);
178
+ for (const child of obj.children)
179
+ collect(child);
180
+ };
181
+ collect(go);
182
+ go.removeComponent(rb);
183
+ // Re-attach orphaned colliders to an ancestor body if available
184
+ for (const col of orphans) {
185
+ if (findAncestorComponent(col.gameObject, RigidBody)) {
186
+ col.reattach(world);
187
+ }
188
+ }
189
+ return true;
190
+ }
191
+ return false;
192
+ },
193
+ handleDeserialize(go, type, data, deferred) {
194
+ if (type === 'RigidBody') {
195
+ const rb = go.addComponent(RigidBody);
196
+ rb.init(world, { type: data['bodyType'] ?? 'dynamic' });
197
+ applyComponentData(rb, data);
198
+ return true;
199
+ }
200
+ if (type === 'Collider') {
201
+ if (!go.getComponent(RigidBody)) {
202
+ const rb = go.addComponent(RigidBody);
203
+ rb.init(world, { type: 'fixed' });
204
+ }
205
+ const col = go.addComponent(Collider);
206
+ col.init(world, { shape: getShape(go), friction: 0.3, restitution: 0.3 });
207
+ applyComponentData(col, data);
208
+ return true;
209
+ }
210
+ // Check for Joint subclasses
211
+ const allComps = getAllRegisteredComponents();
212
+ for (const [ctor, def] of allComps) {
213
+ if (def.name === type && ctor.prototype instanceof Joint) {
214
+ if (!go.getComponent(RigidBody)) {
215
+ const rb = go.addComponent(RigidBody);
216
+ rb.init(world, { type: 'dynamic' });
217
+ }
218
+ if (!go.getComponent(Collider)) {
219
+ const col = go.addComponent(Collider);
220
+ col.init(world, { shape: getShape(go), friction: 0.3, restitution: 0.3 });
221
+ }
222
+ const joint = go.addComponent(ctor);
223
+ joint.init(world);
224
+ const connObj = data['connectedObject'];
225
+ delete data['connectedObject'];
226
+ applyComponentData(joint, data);
227
+ if (connObj) {
228
+ deferred.push(() => { joint.connectedObject = connObj; });
229
+ }
230
+ return true;
231
+ }
232
+ }
233
+ return false;
234
+ },
235
+ flushDeferred(ops) {
236
+ for (const fn of ops)
237
+ fn();
238
+ ops.length = 0;
239
+ },
240
+ installReparentHooks(setValidator, setCallback) {
241
+ setValidator((child, newParent) => {
242
+ if (!newParent)
243
+ return true;
244
+ const childHasRb = !!child.getComponent(RigidBody);
245
+ const parentHasRb = !!newParent.getComponent(RigidBody) || hasAncestorComponent(newParent, RigidBody);
246
+ if (childHasRb && parentHasRb)
247
+ return false;
248
+ if (parentHasRb && hasDescendantComponent(child, RigidBody))
249
+ return false;
250
+ return true;
251
+ });
252
+ setCallback((child) => {
253
+ const reattachSubtree = (go) => {
254
+ const col = go.getComponent(Collider);
255
+ if (col && col.collider)
256
+ col.reattach(world);
257
+ for (const c of go.children)
258
+ reattachSubtree(c);
259
+ };
260
+ reattachSubtree(child);
261
+ });
262
+ },
263
+ onSceneChanged(scene) {
264
+ if (system)
265
+ system.scene = scene;
266
+ },
267
+ isPhysicsComponent(comp) {
268
+ return comp instanceof RigidBody || comp instanceof Collider || comp instanceof Joint;
269
+ },
270
+ onSceneRestored(scene) {
271
+ world.resetAccumulator();
272
+ for (const go of scene.getAllObjects()) {
273
+ const rb = go.getComponent(RigidBody);
274
+ if (rb)
275
+ rb.teleportToTransform();
276
+ }
277
+ },
278
+ syncTransformsForObjects(objects) {
279
+ for (const go of objects) {
280
+ const rb = go.getComponent(RigidBody);
281
+ if (!rb || !rb.body)
282
+ continue;
283
+ // Sync collider scale
284
+ const col = go.getComponent(Collider);
285
+ if (col) {
286
+ const scale = go.transform.scale;
287
+ col.applyScale(scale[0], scale[1], scale[2]);
288
+ }
289
+ // Sync fixed body position
290
+ if (rb.bodyType === 'fixed') {
291
+ rb.teleportToTransform();
292
+ }
293
+ }
294
+ },
295
+ syncJointsForObjects(objects) {
296
+ const scene = system?.scene;
297
+ if (!scene)
298
+ return;
299
+ // Collect all joints that reference any of the moved objects (as owner or connectedObject)
300
+ const moved = new Set(objects);
301
+ for (const go of scene.getAllObjects()) {
302
+ for (const comp of go.getComponents()) {
303
+ if (!(comp instanceof Joint))
304
+ continue;
305
+ if (moved.has(go) || (comp.connectedObject && moved.has(comp.connectedObject))) {
306
+ comp.refreshAutoConfig();
307
+ }
308
+ }
309
+ }
310
+ },
311
+ syncAllJoints(scene) {
312
+ for (const go of scene.getAllObjects()) {
313
+ for (const comp of go.getComponents()) {
314
+ if (comp instanceof Joint)
315
+ comp.syncAutoConfig();
316
+ }
317
+ }
318
+ },
319
+ getColliderGizmoData(go) {
320
+ const results = [];
321
+ const collectCollider = (obj) => {
322
+ const col = obj.getComponent(Collider);
323
+ if (!col || !col.collider || !col.shape)
324
+ return;
325
+ const shape = col.shape;
326
+ if (shape.type === 'convexHull')
327
+ return; // skip complex shapes
328
+ // Use the GameObject's transform (authoritative after snapshot restore)
329
+ // instead of Rapier collider position which lags until next physics step.
330
+ obj.transform.updateWorldMatrix();
331
+ const m = obj.transform.worldMatrix;
332
+ const pos = { x: m[12], y: m[13], z: m[14] };
333
+ // Extract rotation quaternion from world matrix (ignoring scale)
334
+ const sx = Math.sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]) || 1;
335
+ const sy = Math.sqrt(m[4] * m[4] + m[5] * m[5] + m[6] * m[6]) || 1;
336
+ const sz = Math.sqrt(m[8] * m[8] + m[9] * m[9] + m[10] * m[10]) || 1;
337
+ // Normalized rotation matrix columns
338
+ const r00 = m[0] / sx, r01 = m[4] / sy, r02 = m[8] / sz;
339
+ const r10 = m[1] / sx, r11 = m[5] / sy, r12 = m[9] / sz;
340
+ const r20 = m[2] / sx, r21 = m[6] / sy, r22 = m[10] / sz;
341
+ // Matrix to quaternion
342
+ const trace = r00 + r11 + r22;
343
+ let qx, qy, qz, qw;
344
+ if (trace > 0) {
345
+ const s = 0.5 / Math.sqrt(trace + 1);
346
+ qw = 0.25 / s;
347
+ qx = (r21 - r12) * s;
348
+ qy = (r02 - r20) * s;
349
+ qz = (r10 - r01) * s;
350
+ }
351
+ else if (r00 > r11 && r00 > r22) {
352
+ const s = 2 * Math.sqrt(1 + r00 - r11 - r22);
353
+ qw = (r21 - r12) / s;
354
+ qx = 0.25 * s;
355
+ qy = (r01 + r10) / s;
356
+ qz = (r02 + r20) / s;
357
+ }
358
+ else if (r11 > r22) {
359
+ const s = 2 * Math.sqrt(1 + r11 - r00 - r22);
360
+ qw = (r02 - r20) / s;
361
+ qx = (r01 + r10) / s;
362
+ qy = 0.25 * s;
363
+ qz = (r12 + r21) / s;
364
+ }
365
+ else {
366
+ const s = 2 * Math.sqrt(1 + r22 - r00 - r11);
367
+ qw = (r10 - r01) / s;
368
+ qx = (r02 + r20) / s;
369
+ qy = (r12 + r21) / s;
370
+ qz = 0.25 * s;
371
+ }
372
+ const rot = { x: qx, y: qy, z: qz, w: qw };
373
+ // Apply center offset (e.g. plane collider shifted so top = visual surface)
374
+ if (shape.type === 'box' && shape.center) {
375
+ const c = shape.center;
376
+ // Rotate center offset into world space using extracted rotation columns
377
+ pos.x += r00 * (c.x * sx) + r01 * (c.y * sy) + r02 * (c.z * sz);
378
+ pos.y += r10 * (c.x * sx) + r11 * (c.y * sy) + r12 * (c.z * sz);
379
+ pos.z += r20 * (c.x * sx) + r21 * (c.y * sy) + r22 * (c.z * sz);
380
+ }
381
+ // Read scaled dimensions from live Rapier collider
382
+ const entry = {
383
+ shapeType: shape.type,
384
+ position: pos,
385
+ rotation: rot,
386
+ };
387
+ switch (shape.type) {
388
+ case 'box':
389
+ entry.halfExtents = {
390
+ x: col.collider.halfExtents().x,
391
+ y: col.collider.halfExtents().y,
392
+ z: col.collider.halfExtents().z,
393
+ };
394
+ break;
395
+ case 'sphere':
396
+ entry.radius = col.collider.radius();
397
+ break;
398
+ case 'cylinder':
399
+ entry.radius = col.collider.radius();
400
+ entry.halfHeight = col.collider.halfHeight();
401
+ break;
402
+ case 'capsule':
403
+ entry.radius = col.collider.radius();
404
+ entry.halfHeight = col.collider.halfHeight();
405
+ break;
406
+ }
407
+ results.push(entry);
408
+ };
409
+ // Collect from the object itself
410
+ collectCollider(go);
411
+ // Collect child colliders attached to this object's RigidBody
412
+ const rb = go.getComponent(RigidBody);
413
+ if (rb) {
414
+ const collectChildren = (obj) => {
415
+ for (const child of obj.children) {
416
+ collectCollider(child);
417
+ if (!child.getComponent(RigidBody))
418
+ collectChildren(child);
419
+ }
420
+ };
421
+ collectChildren(go);
422
+ }
423
+ return results.length > 0 ? results : null;
424
+ },
425
+ applyPhysicsSettings(settings) {
426
+ world.setGravity(settings.gravity[0], settings.gravity[1], settings.gravity[2]);
427
+ world.fixedTimestep = settings.fixedTimestep;
428
+ world.setSolverIterations(settings.solverIterations);
429
+ world.substeps = settings.substeps;
430
+ },
431
+ getJointGizmoData(go) {
432
+ const results = [];
433
+ // Collect hinges: on the selected object, plus reverse refs from other objects
434
+ const hinges = [];
435
+ for (const comp of go.getComponents()) {
436
+ if (comp instanceof HingeJoint)
437
+ hinges.push(comp);
438
+ }
439
+ const scene = system?.scene;
440
+ if (scene) {
441
+ for (const other of scene.getAllObjects()) {
442
+ if (other === go)
443
+ continue;
444
+ for (const comp of other.getComponents()) {
445
+ if (comp instanceof HingeJoint && comp.connectedObject === go) {
446
+ hinges.push(comp);
447
+ }
448
+ }
449
+ }
450
+ }
451
+ for (const hinge of hinges) {
452
+ // Ensure auto-configured anchor/axis are fresh before computing gizmo data
453
+ hinge.refreshAutoConfig();
454
+ const owner = hinge.gameObject;
455
+ const connected = hinge.connectedObject;
456
+ // Body 1 transform
457
+ const t1 = owner.transform;
458
+ t1.updateWorldMatrix();
459
+ const m = t1.worldMatrix;
460
+ // Extract scale-free rotation columns from body 1
461
+ const s1x = Math.sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]) || 1;
462
+ const s1y = Math.sqrt(m[4] * m[4] + m[5] * m[5] + m[6] * m[6]) || 1;
463
+ const s1z = Math.sqrt(m[8] * m[8] + m[9] * m[9] + m[10] * m[10]) || 1;
464
+ // Anchor → world
465
+ const a = hinge.anchor;
466
+ const o1x = m[12] + (m[0] / s1x) * a[0] + (m[4] / s1y) * a[1] + (m[8] / s1z) * a[2];
467
+ const o1y = m[13] + (m[1] / s1x) * a[0] + (m[5] / s1y) * a[1] + (m[9] / s1z) * a[2];
468
+ const o1z = m[14] + (m[2] / s1x) * a[0] + (m[6] / s1y) * a[1] + (m[10] / s1z) * a[2];
469
+ // Axis → world direction (rotation only)
470
+ const ax = hinge.axis;
471
+ let d1x = (m[0] / s1x) * ax[0] + (m[4] / s1y) * ax[1] + (m[8] / s1z) * ax[2];
472
+ let d1y = (m[1] / s1x) * ax[0] + (m[5] / s1y) * ax[1] + (m[9] / s1z) * ax[2];
473
+ let d1z = (m[2] / s1x) * ax[0] + (m[6] / s1y) * ax[1] + (m[10] / s1z) * ax[2];
474
+ const len1 = Math.sqrt(d1x * d1x + d1y * d1y + d1z * d1z) || 1;
475
+ d1x /= len1;
476
+ d1y /= len1;
477
+ d1z /= len1;
478
+ // Body 2 (connected object)
479
+ let o2x = o1x, o2y = o1y, o2z = o1z;
480
+ let d2x = d1x, d2y = d1y, d2z = d1z;
481
+ if (connected) {
482
+ const t2 = connected.transform;
483
+ t2.updateWorldMatrix();
484
+ const n = t2.worldMatrix;
485
+ const s2x = Math.sqrt(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]) || 1;
486
+ const s2y = Math.sqrt(n[4] * n[4] + n[5] * n[5] + n[6] * n[6]) || 1;
487
+ const s2z = Math.sqrt(n[8] * n[8] + n[9] * n[9] + n[10] * n[10]) || 1;
488
+ const ca = hinge.connectedAnchor;
489
+ o2x = n[12] + (n[0] / s2x) * ca[0] + (n[4] / s2y) * ca[1] + (n[8] / s2z) * ca[2];
490
+ o2y = n[13] + (n[1] / s2x) * ca[0] + (n[5] / s2y) * ca[1] + (n[9] / s2z) * ca[2];
491
+ o2z = n[14] + (n[2] / s2x) * ca[0] + (n[6] / s2y) * ca[1] + (n[10] / s2z) * ca[2];
492
+ const cax = hinge.connectedAxis;
493
+ d2x = (n[0] / s2x) * cax[0] + (n[4] / s2y) * cax[1] + (n[8] / s2z) * cax[2];
494
+ d2y = (n[1] / s2x) * cax[0] + (n[5] / s2y) * cax[1] + (n[9] / s2z) * cax[2];
495
+ d2z = (n[2] / s2x) * cax[0] + (n[6] / s2y) * cax[1] + (n[10] / s2z) * cax[2];
496
+ const len2 = Math.sqrt(d2x * d2x + d2y * d2y + d2z * d2z) || 1;
497
+ d2x /= len2;
498
+ d2y /= len2;
499
+ d2z /= len2;
500
+ }
501
+ results.push({
502
+ origin1: { x: o1x, y: o1y, z: o1z },
503
+ dir1: { x: d1x, y: d1y, z: d1z },
504
+ origin2: { x: o2x, y: o2y, z: o2z },
505
+ dir2: { x: d2x, y: d2y, z: d2z },
506
+ });
507
+ }
508
+ return results.length > 0 ? results : null;
509
+ },
510
+ };
511
+ }
512
+ //# sourceMappingURL=editor-physics.js.map