@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,506 @@
1
+ import { Engine, Scene, registerCoreBuiltins, deserializeScene, applyPostProcess } from '@certe/atmos-core';
2
+ import { initWebGPU, createRenderPipeline, createDefaultCamera, createDirectionalLight, RenderSystem, MeshRenderer, SkinnedMeshRenderer, Camera, DirectionalLight, PointLight, SpotLight, registerRendererBuiltins, resizeGPU, createMesh, SKINNED_VERTEX_STRIDE_FLOATS, } from '@certe/atmos-renderer';
3
+ import { Vec3 } from '@certe/atmos-math';
4
+ import { parseGltfModel, instantiateModel } from '@certe/atmos-assets';
5
+ import { AnimationMixer, AnimationHandler, registerAnimationBuiltins } from '@certe/atmos-animation';
6
+ import { mountEditor } from '../editor-mount.js';
7
+ import { ProjectFileSystem } from '../project-fs.js';
8
+ import { MaterialManager } from '../material-manager.js';
9
+ import { seedProject } from '../project-seed.js';
10
+ import { ProjectSettingsManager } from '../project-settings.js';
11
+ import { AssetBrowserClient } from '../asset-browser-client.js';
12
+ import { createGeometryCache } from './geometry-cache.js';
13
+ import { createDefaultPrimitiveFactory, createDefaultComponentFactory, createDefaultComponentFilter, createDefaultComponentRemover, createDefaultDeserializeContext, } from './default-factories.js';
14
+ import { installKeyboardShortcuts } from './keyboard-shortcuts.js';
15
+ import { setReparentValidator, setOnReparent, setOnDuplicate } from '../scene-operations.js';
16
+ import { discoverScripts, autoDiscoverScripts } from '../script-discovery.js';
17
+ import { importModelAssets } from './model-import.js';
18
+ export async function startEditor(config = {}) {
19
+ const cleanups = [];
20
+ // 1. Register component builtins
21
+ registerCoreBuiltins();
22
+ registerRendererBuiltins();
23
+ registerAnimationBuiltins();
24
+ // 2. DOM setup + WebGPU
25
+ injectBaseStyles();
26
+ const container = config.container ?? getOrCreateElement('div', 'editor-root');
27
+ const canvas = config.canvas ?? getOrCreateElement('canvas', 'atmos-canvas');
28
+ if (!canvas.parentElement)
29
+ document.body.appendChild(canvas);
30
+ if (!container.parentElement)
31
+ document.body.appendChild(container);
32
+ canvas.width = 800;
33
+ canvas.height = 600;
34
+ canvas.tabIndex = -1; // Focusable by click/script but not Tab key
35
+ const gpu = await initWebGPU(canvas);
36
+ const pipeline = createRenderPipeline(gpu.device, gpu.format);
37
+ const resizeObs = new ResizeObserver(() => resizeGPU(gpu));
38
+ resizeObs.observe(canvas);
39
+ cleanups.push(() => resizeObs.disconnect());
40
+ // 3. Geometry cache (shared primitive meshes)
41
+ const meshes = createGeometryCache(gpu.device);
42
+ // 4. Physics plugin init (optional)
43
+ if (config.physics) {
44
+ config.physics.init({
45
+ meshes,
46
+ getMesh(go) {
47
+ const mr = go.getComponent(MeshRenderer);
48
+ return mr?.mesh ?? null;
49
+ },
50
+ });
51
+ }
52
+ // 5. Scene + camera + light + render system
53
+ const scene = new Scene();
54
+ const camera = createDefaultCamera();
55
+ Vec3.set(camera.eye, 3, 4, 8);
56
+ Vec3.set(camera.target, 0, 1, 0);
57
+ const light = createDirectionalLight([-0.5, -1.0, -0.3], [1, 1, 1], 1.0);
58
+ const renderSystem = new RenderSystem(gpu, pipeline, scene, camera, light);
59
+ // 6. Physics stepper (optional)
60
+ let physicsSystem = null;
61
+ if (config.physics) {
62
+ physicsSystem = config.physics.createStepper(scene);
63
+ }
64
+ // 7. ProjectFileSystem + MaterialManager (lazy — set after project opens)
65
+ const projectFs = new ProjectFileSystem();
66
+ const lazyState = { current: null };
67
+ const lazyMM = { current: null };
68
+ const lazySM = { current: null };
69
+ // Model mesh cache for deserialize (model:path.glb:index)
70
+ const modelCache = new Map();
71
+ const loadModelAsset = async (filePath) => {
72
+ let asset = modelCache.get(filePath);
73
+ if (!asset) {
74
+ const res = await fetch('/' + filePath);
75
+ if (!res.ok)
76
+ return null;
77
+ asset = parseGltfModel(await res.arrayBuffer());
78
+ modelCache.set(filePath, asset);
79
+ }
80
+ return asset;
81
+ };
82
+ const parseModelSource = (source) => {
83
+ const rest = source.slice(6); // strip "model:"
84
+ const lastColon = rest.lastIndexOf(':');
85
+ if (lastColon < 0)
86
+ return null;
87
+ return { path: rest.slice(0, lastColon), index: parseInt(rest.slice(lastColon + 1), 10) };
88
+ };
89
+ const loadModelMesh = async (source) => {
90
+ const parsed = parseModelSource(source);
91
+ if (!parsed)
92
+ return null;
93
+ const asset = await loadModelAsset(parsed.path);
94
+ if (!asset)
95
+ return null;
96
+ const meshData = asset.meshes[parsed.index];
97
+ if (!meshData)
98
+ return null;
99
+ const stride = meshData.skinned ? SKINNED_VERTEX_STRIDE_FLOATS : 8;
100
+ const mesh = createMesh(gpu.device, meshData.geometry.vertices, meshData.geometry.indices, stride);
101
+ mesh.bounds = meshData.geometry.bounds;
102
+ return { mesh, skinned: meshData.skinned, skinIndex: meshData.skinIndex };
103
+ };
104
+ const loadModelData = async (source) => {
105
+ const parsed = parseModelSource(source);
106
+ if (!parsed)
107
+ return null;
108
+ const asset = await loadModelAsset(parsed.path);
109
+ if (!asset)
110
+ return null;
111
+ const meshData = asset.meshes[parsed.index];
112
+ if (!meshData)
113
+ return null;
114
+ const stride = meshData.skinned ? SKINNED_VERTEX_STRIDE_FLOATS : 8;
115
+ const mesh = createMesh(gpu.device, meshData.geometry.vertices, meshData.geometry.indices, stride);
116
+ mesh.bounds = meshData.geometry.bounds;
117
+ return { mesh, asset, meshIndex: parsed.index };
118
+ };
119
+ const factoryDeps = {
120
+ rendererCtx: renderSystem, meshes,
121
+ physics: config.physics,
122
+ editorState: lazyState,
123
+ materialManager: lazyMM,
124
+ loadModelMesh,
125
+ loadModelData,
126
+ };
127
+ const primitiveFactory = config.primitiveFactory ?? createDefaultPrimitiveFactory(factoryDeps);
128
+ const componentFactory = config.componentFactory ?? createDefaultComponentFactory(factoryDeps);
129
+ const componentFilter = createDefaultComponentFilter(factoryDeps);
130
+ const componentRemover = createDefaultComponentRemover(factoryDeps);
131
+ const deserializeCtx = config.deserializeContext ?? createDefaultDeserializeContext(factoryDeps);
132
+ const onAttachScript = config.onAttachScript ?? ((script, go) => {
133
+ go.addComponent(script.ctor);
134
+ });
135
+ // Helper: load a .glb and return the instantiated root GameObject
136
+ const loadModel = async (path) => {
137
+ try {
138
+ const res = await fetch(`/${path}`);
139
+ if (!res.ok)
140
+ throw new Error(`Failed to fetch ${path}: ${res.status}`);
141
+ const buffer = await res.arrayBuffer();
142
+ const name = path.split('/').pop()?.replace(/\.\w+$/, '') ?? 'Model';
143
+ const asset = parseGltfModel(buffer, name);
144
+ // Save textures + create .mat.json files if project is open
145
+ let materialMap = null;
146
+ const mm = lazyMM.current;
147
+ if (mm && projectFs.isOpen) {
148
+ materialMap = await importModelAssets(asset, name, projectFs, mm);
149
+ }
150
+ const root = await instantiateModel(asset, { renderSystem });
151
+ // Tag MeshRenderers/SkinnedMeshRenderers with meshSource + assign material assets
152
+ const tagMeshRenderers = async (go, modelPath, idx) => {
153
+ const mr = go.getComponent(MeshRenderer);
154
+ const smr = go.getComponent(SkinnedMeshRenderer);
155
+ const renderer = mr ?? smr;
156
+ if (renderer) {
157
+ renderer.meshSource = `model:${modelPath}:${idx.n}`;
158
+ if (materialMap && mm) {
159
+ const matIdx = asset.meshes[idx.n]?.materialIndex ?? 0;
160
+ const matPath = materialMap.get(matIdx);
161
+ if (matPath) {
162
+ renderer.materialSource = matPath;
163
+ const mat = await mm.getMaterial(matPath);
164
+ renderer.material = mat;
165
+ renderer.materialBindGroup = null;
166
+ }
167
+ }
168
+ idx.n++;
169
+ }
170
+ for (const child of go.children)
171
+ await tagMeshRenderers(child, modelPath, idx);
172
+ };
173
+ await tagMeshRenderers(root, path, { n: 0 });
174
+ return root;
175
+ }
176
+ catch (err) {
177
+ console.error('[Editor] Failed to load model:', err);
178
+ return null;
179
+ }
180
+ };
181
+ // Model loading callback for asset browser context menu / double-click
182
+ const onLoadModel = async (entry) => {
183
+ const root = await loadModel(entry.path);
184
+ if (!root)
185
+ return;
186
+ const edState = lazyState.current;
187
+ if (edState) {
188
+ edState.scene.add(root);
189
+ edState.select(root);
190
+ }
191
+ };
192
+ // Drag-and-drop model callback (hierarchy or inspector)
193
+ const onDropModel = async (path, target) => {
194
+ const edState = lazyState.current;
195
+ if (!edState)
196
+ return;
197
+ const root = await loadModel(path);
198
+ if (!root)
199
+ return;
200
+ if (target) {
201
+ // Inspector drop: if target has MeshRenderer, replace its mesh with first mesh from model
202
+ const targetMr = target.getComponent(MeshRenderer);
203
+ const sourceMr = root.getComponent(MeshRenderer);
204
+ if (targetMr && sourceMr && sourceMr.mesh) {
205
+ targetMr.mesh = sourceMr.mesh;
206
+ targetMr.material = sourceMr.material;
207
+ targetMr.materialBindGroup = null; // force re-creation with new texture
208
+ targetMr.meshSource = sourceMr.meshSource;
209
+ edState.notifyInspectorChanged();
210
+ }
211
+ else {
212
+ // No MeshRenderer on target — add model as child
213
+ root.setParent(target);
214
+ edState.scene.add(root);
215
+ edState.select(root);
216
+ }
217
+ }
218
+ else {
219
+ // Hierarchy drop with no parent — add to scene root
220
+ edState.scene.add(root);
221
+ edState.select(root);
222
+ }
223
+ };
224
+ // 8b. ProjectFS lifecycle
225
+ const initProject = async () => {
226
+ await seedProject(projectFs);
227
+ const mm = new MaterialManager(projectFs, gpu.device);
228
+ lazyMM.current = mm;
229
+ const sm = new ProjectSettingsManager(projectFs);
230
+ await sm.load();
231
+ lazySM.current = sm;
232
+ config.physics?.applyPhysicsSettings?.(sm.settings.physics);
233
+ sm.onChange(() => {
234
+ config.physics?.applyPhysicsSettings?.(sm.settings.physics);
235
+ });
236
+ // setProjectFs triggers 'projectChanged' → EditorShell re-renders with gate gone
237
+ lazyState.current?.setProjectFs(projectFs, mm);
238
+ lazyState.current?.setSettingsManager(sm);
239
+ };
240
+ // Pre-init project before mount (so ProjectGate doesn't flash)
241
+ // Priority: 1) Vite dev server 2) Restored FS handle 3) Show gate
242
+ const devConnected = await projectFs.tryConnectDevServer();
243
+ let preInited = false;
244
+ const preInitProject = async () => {
245
+ await seedProject(projectFs);
246
+ const mm = new MaterialManager(projectFs, gpu.device);
247
+ lazyMM.current = mm;
248
+ const sm = new ProjectSettingsManager(projectFs);
249
+ await sm.load();
250
+ lazySM.current = sm;
251
+ config.physics?.applyPhysicsSettings?.(sm.settings.physics);
252
+ sm.onChange(() => {
253
+ config.physics?.applyPhysicsSettings?.(sm.settings.physics);
254
+ });
255
+ };
256
+ if (devConnected) {
257
+ await preInitProject();
258
+ preInited = true;
259
+ }
260
+ else {
261
+ const restored = await projectFs.tryRestore();
262
+ if (restored) {
263
+ await preInitProject();
264
+ preInited = true;
265
+ }
266
+ }
267
+ // 8c. Mount editor UI
268
+ const { editorState, gizmoState, orbitCamera, unmount } = mountEditor(container, scene, {
269
+ canvas, camera, renderSystem,
270
+ deserializeContext: deserializeCtx,
271
+ projectFs,
272
+ onOpenProject: async () => {
273
+ const ok = await projectFs.open();
274
+ if (!ok)
275
+ return;
276
+ await initProject();
277
+ },
278
+ showAssetBrowser: config.showAssetBrowser ?? true,
279
+ onAttachScript,
280
+ onLoadModel,
281
+ onLoadScene: async (entry) => {
282
+ const edState = lazyState.current;
283
+ if (!edState || !projectFs.isOpen)
284
+ return;
285
+ try {
286
+ const json = await projectFs.readTextFile(entry.path);
287
+ const data = JSON.parse(json);
288
+ const scene = deserializeScene(data, deserializeCtx);
289
+ if (deserializeCtx.onComplete)
290
+ await deserializeCtx.onComplete();
291
+ const name = entry.name.replace(/\.scene\.json$/, '');
292
+ edState.sceneName = name;
293
+ edState.setScene(scene);
294
+ if (data.postProcess && renderSystem)
295
+ applyPostProcess(renderSystem, data.postProcess);
296
+ }
297
+ catch (err) {
298
+ console.error('[Editor] Failed to load scene:', err);
299
+ }
300
+ },
301
+ onDropModel,
302
+ primitiveFactory,
303
+ componentFactory,
304
+ componentFilter,
305
+ componentRemover,
306
+ physics: config.physics,
307
+ });
308
+ cleanups.push(unmount);
309
+ lazyState.current = editorState;
310
+ editorState.paused = true;
311
+ // If pre-initialized before mount, set projectFs on editorState now
312
+ if (preInited) {
313
+ editorState.setProjectFs(projectFs, lazyMM.current);
314
+ if (lazySM.current)
315
+ editorState.setSettingsManager(lazySM.current);
316
+ }
317
+ // 9. Physics reparent + duplicate hooks
318
+ config.physics?.installReparentHooks(setReparentValidator, setOnReparent);
319
+ if (config.physics) {
320
+ setOnDuplicate((copy, source) => config.physics.handleDuplicate(copy, source));
321
+ }
322
+ // 10. Asset browser + script discovery
323
+ const assetClient = new AssetBrowserClient();
324
+ await assetClient.init();
325
+ // If project is open via dev server, show full project tree instead of just src/
326
+ const loadProjectTree = async () => {
327
+ if (projectFs.isServerMode) {
328
+ try {
329
+ const res = await fetch('/__atmos_fs/tree');
330
+ if (res.ok) {
331
+ const tree = await res.json();
332
+ editorState.setAssetEntries(tree);
333
+ return;
334
+ }
335
+ }
336
+ catch { /* fall through */ }
337
+ }
338
+ editorState.setAssetEntries(assetClient.entries);
339
+ };
340
+ await loadProjectTree();
341
+ assetClient.onChange(() => loadProjectTree());
342
+ cleanups.push(() => assetClient.dispose());
343
+ // Poll for external file changes every 2s
344
+ const pollInterval = setInterval(() => loadProjectTree(), 2000);
345
+ cleanups.push(() => clearInterval(pollInterval));
346
+ // Refresh asset browser when project files change (write/delete via ProjectFileSystem)
347
+ projectFs.onFileChanged = () => loadProjectTree();
348
+ cleanups.push(() => { projectFs.onFileChanged = null; });
349
+ // Also listen for project-change HMR events (materials, scenes, textures)
350
+ const hmrMeta = import.meta;
351
+ if (hmrMeta.hot) {
352
+ hmrMeta.hot.on('atmos:project-change', () => {
353
+ loadProjectTree();
354
+ });
355
+ }
356
+ const scripts = config.scripts
357
+ ?? (config.scriptModules ? discoverScripts(config.scriptModules) : null)
358
+ ?? await autoDiscoverScripts(assetClient.entries);
359
+ if (scripts.length > 0)
360
+ editorState.setScriptAssets(scripts);
361
+ // 11. Engine
362
+ const engine = new Engine();
363
+ engine.setRenderer(renderSystem);
364
+ if (physicsSystem)
365
+ engine.setPhysics(physicsSystem);
366
+ engine.input.attach(window);
367
+ // 12. Keyboard shortcuts
368
+ cleanups.push(installKeyboardShortcuts(editorState, gizmoState));
369
+ // 13. Event wiring
370
+ const unsubScene = editorState.on('sceneChanged', () => {
371
+ const s = editorState.scene;
372
+ renderSystem.scene = s;
373
+ engine.scene = s;
374
+ if (physicsSystem)
375
+ physicsSystem.scene = s;
376
+ config.physics?.onSceneChanged(s);
377
+ if (!editorState.paused) {
378
+ s.awakeAll();
379
+ s.startAll();
380
+ }
381
+ });
382
+ cleanups.push(unsubScene);
383
+ engine.paused = true;
384
+ // Skip GPU-owning and physics components when cycling play/pause lifecycle
385
+ const isEngineComponent = (c) => c instanceof MeshRenderer || c instanceof SkinnedMeshRenderer
386
+ || c instanceof Camera || c instanceof DirectionalLight
387
+ || c instanceof PointLight || c instanceof SpotLight
388
+ || c instanceof AnimationMixer
389
+ || c instanceof AnimationHandler
390
+ || (config.physics?.isPhysicsComponent(c) ?? false);
391
+ cleanups.push(editorState.on('pauseChanged', () => {
392
+ engine.paused = editorState.paused;
393
+ if (!editorState.paused) {
394
+ // Entering play mode — teleport bodies + sync joints before first step
395
+ config.physics?.onSceneRestored(editorState.scene);
396
+ config.physics?.syncAllJoints?.(editorState.scene);
397
+ // Awake + start all components
398
+ editorState.scene.awakeAll();
399
+ editorState.scene.startAll();
400
+ // Focus canvas so keyboard events work even if UI elements had focus
401
+ canvas.focus();
402
+ }
403
+ }));
404
+ cleanups.push(editorState.on('sceneRestored', () => {
405
+ // Destroy user script components (not GPU-owning ones) so they reset state
406
+ editorState.scene.destroyAllComponents((c) => !isEngineComponent(c));
407
+ // Reset all skinned meshes to rest pose
408
+ for (const obj of editorState.scene.getAllObjects()) {
409
+ const mixer = obj.getComponent(AnimationMixer);
410
+ if (mixer)
411
+ mixer.resetToRestPose();
412
+ }
413
+ config.physics?.onSceneRestored(editorState.scene);
414
+ }));
415
+ // 14. Setup scene (optional user callback)
416
+ if (config.setupScene) {
417
+ config.setupScene({ scene, gpu, pipeline, meshes });
418
+ }
419
+ // 15. Start engine (paused)
420
+ engine.start(scene);
421
+ // 16. Auto-load last active scene from session (after all wiring is in place)
422
+ if (preInited) {
423
+ const savedName = editorState.sceneName;
424
+ const scenePath = `scenes/${savedName}.scene.json`;
425
+ if (await projectFs.exists(scenePath)) {
426
+ try {
427
+ const json = await projectFs.readTextFile(scenePath);
428
+ const data = JSON.parse(json);
429
+ const loadedScene = deserializeScene(data, deserializeCtx);
430
+ if (deserializeCtx.onComplete)
431
+ await deserializeCtx.onComplete();
432
+ editorState.setScene(loadedScene);
433
+ if (data.postProcess)
434
+ applyPostProcess(renderSystem, data.postProcess);
435
+ }
436
+ catch (err) {
437
+ console.warn('[Editor] Failed to auto-load scene:', err);
438
+ }
439
+ }
440
+ }
441
+ // 17. Scene loader — allows scripts to call Scene.loadScene('name')
442
+ Scene.setSceneLoader(async (name) => {
443
+ const edState = lazyState.current;
444
+ if (!edState || !projectFs.isOpen)
445
+ return;
446
+ const scenePath = `scenes/${name}.scene.json`;
447
+ try {
448
+ const json = await projectFs.readTextFile(scenePath);
449
+ const data = JSON.parse(json);
450
+ const loaded = deserializeScene(data, deserializeCtx);
451
+ if (deserializeCtx.onComplete)
452
+ await deserializeCtx.onComplete();
453
+ edState.sceneName = name;
454
+ edState.setScene(loaded);
455
+ if (data.postProcess)
456
+ applyPostProcess(renderSystem, data.postProcess);
457
+ }
458
+ catch (err) {
459
+ console.error(`[Scene] Failed to load scene "${name}":`, err);
460
+ }
461
+ });
462
+ cleanups.push(() => Scene.setSceneLoader(null));
463
+ return {
464
+ editorState,
465
+ engine,
466
+ gizmoState,
467
+ orbitCamera,
468
+ renderSystem,
469
+ scene,
470
+ gpu,
471
+ projectFs,
472
+ get materialManager() { return lazyMM.current; },
473
+ async openProject() {
474
+ const ok = await projectFs.open();
475
+ if (!ok)
476
+ return false;
477
+ await initProject();
478
+ return true;
479
+ },
480
+ dispose() {
481
+ engine.stop();
482
+ for (const fn of cleanups)
483
+ fn();
484
+ cleanups.length = 0;
485
+ },
486
+ };
487
+ }
488
+ // ---- DOM helpers ---- //
489
+ const BASE_STYLES = `*{margin:0;padding:0;box-sizing:border-box}html,body{height:100%;background:#111;overflow:hidden}#editor-root{width:100%;height:100vh}#atmos-canvas{position:absolute;visibility:hidden}`;
490
+ function injectBaseStyles() {
491
+ if (document.getElementById('atmos-base-styles'))
492
+ return;
493
+ const style = document.createElement('style');
494
+ style.id = 'atmos-base-styles';
495
+ style.textContent = BASE_STYLES;
496
+ document.head.appendChild(style);
497
+ }
498
+ function getOrCreateElement(tag, id) {
499
+ const existing = document.getElementById(id);
500
+ if (existing)
501
+ return existing;
502
+ const el = document.createElement(tag);
503
+ el.id = id;
504
+ return el;
505
+ }
506
+ //# sourceMappingURL=start-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-editor.js","sourceRoot":"","sources":["../../src/bootstrap/start-editor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { Engine, Scene } from '@certe/atmos-core';
2
+ import { RenderSystem } from '@certe/atmos-renderer';
3
+ import type { EditorPhysicsPlugin } from './types.js';
4
+ export interface PlayerConfig {
5
+ /** Path to .scene.json (fetched via HTTP). */
6
+ scene: string;
7
+ /** Canvas element (auto-created fullscreen if omitted). */
8
+ canvas?: HTMLCanvasElement;
9
+ /** Physics plugin (from createEditorPhysics()). */
10
+ physics?: EditorPhysicsPlugin;
11
+ /** User script modules from import.meta.glob('./scripts/*.ts', { eager: true }). */
12
+ scriptModules?: Record<string, Record<string, unknown>>;
13
+ /** Base URL prefix for asset fetches (default: '/'). */
14
+ assetBase?: string;
15
+ }
16
+ export interface PlayerApp {
17
+ engine: Engine;
18
+ renderSystem: RenderSystem;
19
+ scene: Scene;
20
+ dispose(): void;
21
+ }
22
+ export declare function startPlayer(config: PlayerConfig): Promise<PlayerApp>;
23
+ //# sourceMappingURL=start-player.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-player.d.ts","sourceRoot":"","sources":["../../src/bootstrap/start-player.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAA4D,MAAM,mBAAmB,CAAC;AAE5G,OAAO,EAKL,YAAY,EAOb,MAAM,uBAAuB,CAAC;AAU/B,OAAO,KAAK,EAAE,mBAAmB,EAAY,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,mDAAmD;IACnD,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CA0L1E"}