@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,205 @@
1
+ import { Engine, Scene, registerCoreBuiltins, deserializeScene, applyPostProcess } from '@certe/atmos-core';
2
+ import { initWebGPU, createRenderPipeline, createDefaultCamera, createDirectionalLight, RenderSystem, MeshRenderer, Camera, registerRendererBuiltins, resizeGPU, createMesh, SKINNED_VERTEX_STRIDE_FLOATS, } from '@certe/atmos-renderer';
3
+ import { Vec3 } from '@certe/atmos-math';
4
+ import { parseGltfModel } from '@certe/atmos-assets';
5
+ import { registerAnimationBuiltins } from '@certe/atmos-animation';
6
+ import { createGeometryCache } from './geometry-cache.js';
7
+ import { createDefaultDeserializeContext } from './default-factories.js';
8
+ import { discoverScripts } from '../script-discovery.js';
9
+ import { SimpleMaterialLoader } from '../simple-material-loader.js';
10
+ export async function startPlayer(config) {
11
+ const cleanups = [];
12
+ const assetBase = config.assetBase ?? '/';
13
+ // 1. Register builtins
14
+ registerCoreBuiltins();
15
+ registerRendererBuiltins();
16
+ registerAnimationBuiltins();
17
+ // 2. Discover user scripts
18
+ if (config.scriptModules) {
19
+ discoverScripts(config.scriptModules);
20
+ }
21
+ // 3. Canvas + WebGPU (prefer existing DOM element, then config, then create)
22
+ const canvas = config.canvas
23
+ ?? document.getElementById('atmos-canvas')
24
+ ?? createFullscreenCanvas();
25
+ const gpu = await initWebGPU(canvas);
26
+ const pipeline = createRenderPipeline(gpu.device, gpu.format);
27
+ const resizeObs = new ResizeObserver(() => resizeGPU(gpu));
28
+ resizeObs.observe(canvas);
29
+ cleanups.push(() => resizeObs.disconnect());
30
+ // 4. Geometry cache
31
+ const meshes = createGeometryCache(gpu.device);
32
+ // 5. Physics plugin init (optional)
33
+ if (config.physics) {
34
+ config.physics.init({
35
+ meshes,
36
+ getMesh(go) {
37
+ const mr = go.getComponent(MeshRenderer);
38
+ return mr?.mesh ?? null;
39
+ },
40
+ });
41
+ }
42
+ // 6. Scene + camera + light + render system
43
+ const scene = new Scene();
44
+ const camera = createDefaultCamera();
45
+ Vec3.set(camera.eye, 3, 4, 8);
46
+ Vec3.set(camera.target, 0, 1, 0);
47
+ const light = createDirectionalLight([-0.5, -1.0, -0.3], [1, 1, 1], 1.0);
48
+ const renderSystem = new RenderSystem(gpu, pipeline, scene, camera, light);
49
+ // 7. Physics stepper (optional)
50
+ let physicsSystem = null;
51
+ if (config.physics) {
52
+ physicsSystem = config.physics.createStepper(scene);
53
+ }
54
+ // 8. Material loader
55
+ const materialLoader = new SimpleMaterialLoader(gpu.device, assetBase);
56
+ // 9. Model loading helpers
57
+ const modelCache = new Map();
58
+ const loadModelAsset = async (filePath) => {
59
+ let asset = modelCache.get(filePath);
60
+ if (!asset) {
61
+ const res = await fetch(assetBase + filePath);
62
+ if (!res.ok)
63
+ return null;
64
+ asset = parseGltfModel(await res.arrayBuffer());
65
+ modelCache.set(filePath, asset);
66
+ }
67
+ return asset;
68
+ };
69
+ const parseModelSource = (source) => {
70
+ const rest = source.slice(6);
71
+ const lastColon = rest.lastIndexOf(':');
72
+ if (lastColon < 0)
73
+ return null;
74
+ return { path: rest.slice(0, lastColon), index: parseInt(rest.slice(lastColon + 1), 10) };
75
+ };
76
+ const loadModelMesh = async (source) => {
77
+ const parsed = parseModelSource(source);
78
+ if (!parsed)
79
+ return null;
80
+ const asset = await loadModelAsset(parsed.path);
81
+ if (!asset)
82
+ return null;
83
+ const meshData = asset.meshes[parsed.index];
84
+ if (!meshData)
85
+ return null;
86
+ const stride = meshData.skinned ? SKINNED_VERTEX_STRIDE_FLOATS : 8;
87
+ const mesh = createMesh(gpu.device, meshData.geometry.vertices, meshData.geometry.indices, stride);
88
+ mesh.bounds = meshData.geometry.bounds;
89
+ return { mesh, skinned: meshData.skinned, skinIndex: meshData.skinIndex };
90
+ };
91
+ const loadModelData = async (source) => {
92
+ const parsed = parseModelSource(source);
93
+ if (!parsed)
94
+ return null;
95
+ const asset = await loadModelAsset(parsed.path);
96
+ if (!asset)
97
+ return null;
98
+ const meshData = asset.meshes[parsed.index];
99
+ if (!meshData)
100
+ return null;
101
+ const stride = meshData.skinned ? SKINNED_VERTEX_STRIDE_FLOATS : 8;
102
+ const mesh = createMesh(gpu.device, meshData.geometry.vertices, meshData.geometry.indices, stride);
103
+ mesh.bounds = meshData.geometry.bounds;
104
+ return { mesh, asset, meshIndex: parsed.index };
105
+ };
106
+ // 10. Deserialize context (reuses default-factories)
107
+ const lazyMM = { current: materialLoader };
108
+ const factoryDeps = {
109
+ rendererCtx: renderSystem,
110
+ meshes,
111
+ physics: config.physics,
112
+ editorState: { current: null },
113
+ materialManager: lazyMM,
114
+ loadModelMesh,
115
+ loadModelData,
116
+ };
117
+ const deserializeCtx = createDefaultDeserializeContext(factoryDeps);
118
+ // 11. Fetch + deserialize scene
119
+ const sceneRes = await fetch(assetBase + config.scene);
120
+ if (!sceneRes.ok)
121
+ throw new Error(`Failed to fetch scene: ${config.scene}`);
122
+ const sceneData = JSON.parse(await sceneRes.text());
123
+ const loadedScene = deserializeScene(sceneData, deserializeCtx);
124
+ if (deserializeCtx.onComplete)
125
+ await deserializeCtx.onComplete();
126
+ // 12. Switch render system to loaded scene + activate camera
127
+ renderSystem.scene = loadedScene;
128
+ const mainCam = Camera.getMain(loadedScene);
129
+ if (mainCam) {
130
+ renderSystem.activeCamera = mainCam;
131
+ }
132
+ // 13. Apply post-process settings
133
+ if (sceneData.postProcess) {
134
+ applyPostProcess(renderSystem, sceneData.postProcess);
135
+ }
136
+ // 14. Engine setup
137
+ if (physicsSystem)
138
+ physicsSystem.scene = loadedScene;
139
+ const engine = new Engine();
140
+ engine.setRenderer(renderSystem);
141
+ if (physicsSystem)
142
+ engine.setPhysics(physicsSystem);
143
+ engine.input.attach(window);
144
+ cleanups.push(() => engine.input.detach());
145
+ // 15. Scene loader for runtime scene switching
146
+ Scene.setSceneLoader(async (name) => {
147
+ const scenePath = `scenes/${name}.scene.json`;
148
+ try {
149
+ const res = await fetch(assetBase + scenePath);
150
+ if (!res.ok)
151
+ throw new Error(`${res.status}`);
152
+ const data = JSON.parse(await res.text());
153
+ const newScene = deserializeScene(data, deserializeCtx);
154
+ if (deserializeCtx.onComplete)
155
+ await deserializeCtx.onComplete();
156
+ renderSystem.scene = newScene;
157
+ engine.scene = newScene;
158
+ if (physicsSystem)
159
+ physicsSystem.scene = newScene;
160
+ config.physics?.onSceneChanged(newScene);
161
+ if (data.postProcess) {
162
+ applyPostProcess(renderSystem, data.postProcess);
163
+ }
164
+ const cam = Camera.getMain(newScene);
165
+ if (cam)
166
+ renderSystem.activeCamera = cam;
167
+ newScene.awakeAll();
168
+ newScene.startAll();
169
+ }
170
+ catch (err) {
171
+ console.error(`[Player] Failed to load scene "${name}":`, err);
172
+ }
173
+ });
174
+ cleanups.push(() => Scene.setSceneLoader(null));
175
+ // 16. Start engine
176
+ engine.start(loadedScene);
177
+ return {
178
+ engine,
179
+ renderSystem,
180
+ scene: loadedScene,
181
+ dispose() {
182
+ engine.stop();
183
+ for (const fn of cleanups)
184
+ fn();
185
+ cleanups.length = 0;
186
+ },
187
+ };
188
+ }
189
+ function createFullscreenCanvas() {
190
+ const canvas = document.createElement('canvas');
191
+ canvas.id = 'atmos-player-canvas';
192
+ Object.assign(canvas.style, {
193
+ position: 'fixed',
194
+ top: '0',
195
+ left: '0',
196
+ width: '100%',
197
+ height: '100%',
198
+ display: 'block',
199
+ });
200
+ document.body.style.margin = '0';
201
+ document.body.style.overflow = 'hidden';
202
+ document.body.appendChild(canvas);
203
+ return canvas;
204
+ }
205
+ //# sourceMappingURL=start-player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-player.js","sourceRoot":"","sources":["../../src/bootstrap/start-player.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ import type { Component, Engine, Scene, GameObject, DeserializeContext, PhysicsStepper } from '@certe/atmos-core';
2
+ import type { GPUContext, PipelineResources, Mesh, RenderSystem } from '@certe/atmos-renderer';
3
+ import type { EditorState } from '../editor-state.js';
4
+ import type { GizmoState } from '../gizmo-state.js';
5
+ import type { OrbitCamera } from '../orbit-camera.js';
6
+ import type { ProjectFileSystem } from '../project-fs.js';
7
+ import type { MaterialManager } from '../material-manager.js';
8
+ import type { PrimitiveType } from '../editor-mount.js';
9
+ import type { ScriptAsset } from '../asset-types.js';
10
+ import type { PhysicsSettings } from '../project-settings.js';
11
+ /** Data for rendering joint axis gizmos. Positions/directions in world space. */
12
+ export interface JointGizmoData {
13
+ /** World-space anchor position on body 1. */
14
+ origin1: {
15
+ x: number;
16
+ y: number;
17
+ z: number;
18
+ };
19
+ /** World-space axis direction on body 1 (unit vector). */
20
+ dir1: {
21
+ x: number;
22
+ y: number;
23
+ z: number;
24
+ };
25
+ /** World-space anchor position on body 2. */
26
+ origin2: {
27
+ x: number;
28
+ y: number;
29
+ z: number;
30
+ };
31
+ /** World-space axis direction on body 2 (unit vector). */
32
+ dir2: {
33
+ x: number;
34
+ y: number;
35
+ z: number;
36
+ };
37
+ }
38
+ /** Data for rendering collider wireframe gizmos. Positions/rotations in world space. */
39
+ export interface ColliderGizmoData {
40
+ shapeType: 'box' | 'sphere' | 'capsule' | 'cylinder';
41
+ position: {
42
+ x: number;
43
+ y: number;
44
+ z: number;
45
+ };
46
+ rotation: {
47
+ x: number;
48
+ y: number;
49
+ z: number;
50
+ w: number;
51
+ };
52
+ halfExtents?: {
53
+ x: number;
54
+ y: number;
55
+ z: number;
56
+ };
57
+ radius?: number;
58
+ halfHeight?: number;
59
+ }
60
+ /** Minimal mesh interface for collider auto-sizing (avoids importing @certe/atmos-renderer in physics) */
61
+ export interface MeshLike {
62
+ vertices?: Float32Array;
63
+ vertexStride?: number;
64
+ }
65
+ /** Context provided to the physics plugin during initialization. */
66
+ export interface PhysicsInitContext {
67
+ /** Named primitive meshes — keys: cube, plane, sphere, cylinder */
68
+ meshes: Record<string, unknown>;
69
+ /** Read MeshRenderer.mesh from a GameObject without importing @certe/atmos-renderer */
70
+ getMesh(go: GameObject): MeshLike | null;
71
+ }
72
+ /** Physics plugin interface. @certe/atmos-physics provides createEditorPhysics() that returns this. */
73
+ export interface EditorPhysicsPlugin {
74
+ /** Initialize: map meshes to collider shapes. */
75
+ init(ctx: PhysicsInitContext): void;
76
+ /** Create a physics stepper for the given scene. */
77
+ createStepper(scene: Scene): PhysicsStepper & {
78
+ scene: Scene;
79
+ };
80
+ /** Check if a component can be added. Returns null if OK, or a reason string. */
81
+ canAddComponent(ctor: new () => Component, go: GameObject): string | null;
82
+ /** Try adding a physics component. Returns true if handled. */
83
+ handleAddComponent(ctor: new () => Component, go: GameObject): boolean;
84
+ /** Try removing a physics component. Returns true if handled. */
85
+ handleRemoveComponent(comp: Component, go: GameObject): boolean;
86
+ /** Try deserializing a physics component. Returns true if handled. */
87
+ handleDeserialize(go: GameObject, type: string, data: Record<string, unknown>, deferred: Array<() => void>): boolean;
88
+ /** Flush deferred operations (e.g. joint connectedObject). */
89
+ flushDeferred(ops: Array<() => void>): void;
90
+ /** Initialize physics components on a duplicated GameObject (copy) using the source as reference. */
91
+ handleDuplicate(copy: GameObject, source: GameObject): void;
92
+ /** Install reparent validator + callback for nested-RigidBody prevention. */
93
+ installReparentHooks(setValidator: (fn: ((child: GameObject, newParent: GameObject | null) => boolean) | null) => void, setCallback: (fn: ((child: GameObject) => void) | null) => void): void;
94
+ /** Sync physics system when scene changes. */
95
+ onSceneChanged(scene: Scene): void;
96
+ /** Returns true if the component belongs to the physics plugin (RigidBody, Collider, Joint). */
97
+ isPhysicsComponent(comp: Component): boolean;
98
+ /** Teleport RigidBodies after play-mode snapshot restore. */
99
+ onSceneRestored(scene: Scene): void;
100
+ /** Get joint axis gizmo data for a selected GameObject, or null if it has no hinge joints. */
101
+ getJointGizmoData(go: GameObject): JointGizmoData[] | null;
102
+ /** Get collider wireframe gizmo data for a selected GameObject, or null if it has no colliders. */
103
+ getColliderGizmoData(go: GameObject): ColliderGizmoData[] | null;
104
+ /** Recreate joints on/connected-to the given objects so auto-configured anchors/axes update. */
105
+ syncJointsForObjects?(objects: readonly GameObject[]): void;
106
+ /** Push transform changes (scale→collider, position→fixed body) while engine is paused. */
107
+ syncTransformsForObjects?(objects: readonly GameObject[]): void;
108
+ /** Recreate all auto-configured joints in the scene (e.g. before first physics step). */
109
+ syncAllJoints?(scene: Scene): void;
110
+ /** Apply project-wide physics settings to the physics world. */
111
+ applyPhysicsSettings?(settings: PhysicsSettings): void;
112
+ }
113
+ /** Context provided to the setupScene callback. */
114
+ export interface SceneSetupContext {
115
+ scene: Scene;
116
+ gpu: GPUContext;
117
+ pipeline: PipelineResources;
118
+ meshes: Record<Exclude<PrimitiveType, 'camera' | 'directionalLight' | 'pointLight' | 'spotLight'>, Mesh>;
119
+ }
120
+ export interface EditorConfig {
121
+ /** Canvas element to render into. Created automatically if omitted. */
122
+ canvas?: HTMLCanvasElement;
123
+ /** Container element for the React editor UI. Created automatically if omitted. */
124
+ container?: HTMLElement;
125
+ /** Optional physics plugin (from @certe/atmos-physics createEditorPhysics()). */
126
+ physics?: EditorPhysicsPlugin;
127
+ /** Optional callback to populate the initial scene. */
128
+ setupScene?: (ctx: SceneSetupContext) => void;
129
+ /** User script assets to register in the editor. */
130
+ scripts?: ScriptAsset[];
131
+ /** Raw eager-loaded modules from import.meta.glob(). Processed internally via discoverScripts(). */
132
+ scriptModules?: Record<string, Record<string, unknown>>;
133
+ /** Override the default primitive factory. */
134
+ primitiveFactory?: (type: PrimitiveType, name: string) => GameObject;
135
+ /** Override the default component factory. */
136
+ componentFactory?: (ctor: new () => Component, go: GameObject) => void;
137
+ /** Override the default deserialize context. */
138
+ deserializeContext?: DeserializeContext;
139
+ /** Show asset browser panel. Default: true. */
140
+ showAssetBrowser?: boolean;
141
+ /** Callback invoked when a script is attached to a GameObject. */
142
+ onAttachScript?: (script: ScriptAsset, go: GameObject) => void;
143
+ }
144
+ /** Return value of startEditor(). */
145
+ export interface EditorApp {
146
+ editorState: EditorState;
147
+ engine: Engine;
148
+ gizmoState: GizmoState | undefined;
149
+ orbitCamera: OrbitCamera | undefined;
150
+ renderSystem: RenderSystem;
151
+ scene: Scene;
152
+ gpu: GPUContext;
153
+ projectFs: ProjectFileSystem;
154
+ materialManager: MaterialManager | null;
155
+ /** Open a project directory (shows picker). After opening, seeds + creates MaterialManager. */
156
+ openProject(): Promise<boolean>;
157
+ /** Tear down everything and stop the engine. */
158
+ dispose(): void;
159
+ }
160
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bootstrap/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,OAAO,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,0DAA0D;IAC1D,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,6CAA6C;IAC7C,OAAO,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,0DAA0D;IAC1D,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,wFAAwF;AACxF,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;IACrD,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,WAAW,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,0GAA0G;AAC1G,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,oEAAoE;AACpE,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,uFAAuF;IACvF,OAAO,CAAC,EAAE,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC;CAC1C;AAED,uGAAuG;AACvG,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,IAAI,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACpC,oDAAoD;IACpD,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,cAAc,GAAG;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;IAC/D,iFAAiF;IACjF,eAAe,CAAC,IAAI,EAAE,UAAU,SAAS,EAAE,EAAE,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;IAC1E,+DAA+D;IAC/D,kBAAkB,CAAC,IAAI,EAAE,UAAU,SAAS,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC;IACvE,iEAAiE;IACjE,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC;IAChE,sEAAsE;IACtE,iBAAiB,CACf,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,QAAQ,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,GAC1B,OAAO,CAAC;IACX,8DAA8D;IAC9D,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C,qGAAqG;IACrG,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5D,6EAA6E;IAC7E,oBAAoB,CAClB,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,IAAI,KAAK,OAAO,CAAC,GAAG,IAAI,KAAK,IAAI,EACjG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,GAC9D,IAAI,CAAC;IACR,8CAA8C;IAC9C,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACnC,gGAAgG;IAChG,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC7C,6DAA6D;IAC7D,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpC,8FAA8F;IAC9F,iBAAiB,CAAC,EAAE,EAAE,UAAU,GAAG,cAAc,EAAE,GAAG,IAAI,CAAC;IAC3D,mGAAmG;IACnG,oBAAoB,CAAC,EAAE,EAAE,UAAU,GAAG,iBAAiB,EAAE,GAAG,IAAI,CAAC;IACjE,gGAAgG;IAChG,oBAAoB,CAAC,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAAC;IAC5D,2FAA2F;IAC3F,wBAAwB,CAAC,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAAC;IAChE,yFAAyF;IACzF,aAAa,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACnC,gEAAgE;IAChE,oBAAoB,CAAC,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;CACxD;AAID,mDAAmD;AACnD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,GAAG,kBAAkB,GAAG,YAAY,GAAG,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;CAC1G;AAED,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,mFAAmF;IACnF,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,iFAAiF;IACjF,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,uDAAuD;IACvD,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,oDAAoD;IACpD,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,oGAAoG;IACpG,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC;IACrE,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,SAAS,EAAE,EAAE,EAAE,UAAU,KAAK,IAAI,CAAC;IACvE,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kEAAkE;IAClE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,KAAK,IAAI,CAAC;CAChE;AAED,qCAAqC;AACrC,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,YAAY,EAAE,YAAY,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,UAAU,CAAC;IAChB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,+FAA+F;IAC/F,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,gDAAgD;IAChD,OAAO,IAAI,IAAI,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/bootstrap/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { Camera } from '@certe/atmos-renderer';
2
+ export declare class CameraFrustumRenderer {
3
+ private readonly _device;
4
+ private readonly _pipeline;
5
+ private readonly _vertexBuffer;
6
+ private readonly _indexBuffer;
7
+ private readonly _uniformBuffer;
8
+ private readonly _bindGroup;
9
+ private readonly _verts;
10
+ private readonly _mvp;
11
+ constructor(device: GPUDevice, format: GPUTextureFormat);
12
+ render(pass: GPURenderPassEncoder, vp: Float32Array, camera: Camera, aspect: number): void;
13
+ destroy(): void;
14
+ }
15
+ //# sourceMappingURL=camera-frustum-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera-frustum-renderer.d.ts","sourceRoot":"","sources":["../src/camera-frustum-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAuB,MAAM,uBAAuB,CAAC;AAkCpE,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAY;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAY;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoD;IAC3E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;gBAEpC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB;IA8BvD,MAAM,CACJ,IAAI,EAAE,oBAAoB,EAC1B,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,IAAI;IAyCP,OAAO,IAAI,IAAI;CAKhB"}
@@ -0,0 +1,110 @@
1
+ import { Mat4 } from '@certe/atmos-math';
2
+ import { createUnlitPipeline } from '@certe/atmos-renderer';
3
+ /** Fixed distance for the far-plane visualization (keeps the frustum compact). */
4
+ const FAR_VIZ = 5;
5
+ /** Frustum wireframe color (light cyan). */
6
+ const COLOR = [0.45, 0.7, 1.0];
7
+ /** 6 floats per vertex: position(3) + color(3). */
8
+ const FLOATS_PER_VERT = 6;
9
+ /**
10
+ * 8 corner vertices (4 near + 4 far).
11
+ * Index order per plane (looking from camera toward -Z):
12
+ * 0=TL 1=TR 2=BR 3=BL (near)
13
+ * 4=TL 5=TR 6=BR 7=BL (far)
14
+ */
15
+ const VERTEX_COUNT = 8;
16
+ const VERTEX_BUFFER_SIZE = VERTEX_COUNT * FLOATS_PER_VERT * 4; // bytes
17
+ /** 12 lines × 2 indices = 24 indices (line-list). */
18
+ // prettier-ignore
19
+ const INDICES = new Uint16Array([
20
+ // near rectangle
21
+ 0, 1, 1, 2, 2, 3, 3, 0,
22
+ // far rectangle
23
+ 4, 5, 5, 6, 6, 7, 7, 4,
24
+ // connecting edges
25
+ 0, 4, 1, 5, 2, 6, 3, 7,
26
+ ]);
27
+ const UNIFORM_SIZE = 64; // mat4x4
28
+ export class CameraFrustumRenderer {
29
+ _device;
30
+ _pipeline;
31
+ _vertexBuffer;
32
+ _indexBuffer;
33
+ _uniformBuffer;
34
+ _bindGroup;
35
+ _verts = new Float32Array(VERTEX_COUNT * FLOATS_PER_VERT);
36
+ _mvp = Mat4.create();
37
+ constructor(device, format) {
38
+ this._device = device;
39
+ this._pipeline = createUnlitPipeline(device, format, {
40
+ topology: 'line-list',
41
+ depthWrite: false,
42
+ depthCompare: 'always',
43
+ });
44
+ this._vertexBuffer = device.createBuffer({
45
+ size: VERTEX_BUFFER_SIZE,
46
+ usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
47
+ });
48
+ this._indexBuffer = device.createBuffer({
49
+ size: INDICES.byteLength,
50
+ usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,
51
+ });
52
+ device.queue.writeBuffer(this._indexBuffer, 0, INDICES);
53
+ this._uniformBuffer = device.createBuffer({
54
+ size: UNIFORM_SIZE,
55
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
56
+ });
57
+ this._bindGroup = device.createBindGroup({
58
+ layout: this._pipeline.bindGroupLayout,
59
+ entries: [{ binding: 0, resource: { buffer: this._uniformBuffer } }],
60
+ });
61
+ }
62
+ render(pass, vp, camera, aspect) {
63
+ const farViz = FAR_VIZ;
64
+ const halfFov = camera.fovY * 0.5;
65
+ const tanHalf = Math.tan(halfFov);
66
+ const hNear = camera.near * tanHalf;
67
+ const wNear = hNear * aspect;
68
+ const hFar = farViz * tanHalf;
69
+ const wFar = hFar * aspect;
70
+ const [r, g, b] = COLOR;
71
+ const v = this._verts;
72
+ let o = 0;
73
+ // Near plane corners (TL, TR, BR, BL) at z = -near
74
+ const nz = -camera.near;
75
+ o = writeVert(v, o, -wNear, hNear, nz, r, g, b);
76
+ o = writeVert(v, o, wNear, hNear, nz, r, g, b);
77
+ o = writeVert(v, o, wNear, -hNear, nz, r, g, b);
78
+ o = writeVert(v, o, -wNear, -hNear, nz, r, g, b);
79
+ // Far plane corners (TL, TR, BR, BL) at z = -farViz
80
+ const fz = -farViz;
81
+ o = writeVert(v, o, -wFar, hFar, fz, r, g, b);
82
+ o = writeVert(v, o, wFar, hFar, fz, r, g, b);
83
+ o = writeVert(v, o, wFar, -hFar, fz, r, g, b);
84
+ writeVert(v, o, -wFar, -hFar, fz, r, g, b);
85
+ this._device.queue.writeBuffer(this._vertexBuffer, 0, v);
86
+ // MVP = VP × cameraWorldMatrix (vertices are in camera-local space)
87
+ Mat4.multiply(this._mvp, vp, camera.gameObject.transform.worldMatrix);
88
+ this._device.queue.writeBuffer(this._uniformBuffer, 0, this._mvp);
89
+ pass.setPipeline(this._pipeline.pipeline);
90
+ pass.setBindGroup(0, this._bindGroup);
91
+ pass.setVertexBuffer(0, this._vertexBuffer);
92
+ pass.setIndexBuffer(this._indexBuffer, 'uint16');
93
+ pass.drawIndexed(INDICES.length);
94
+ }
95
+ destroy() {
96
+ this._vertexBuffer.destroy();
97
+ this._indexBuffer.destroy();
98
+ this._uniformBuffer.destroy();
99
+ }
100
+ }
101
+ function writeVert(buf, offset, x, y, z, r, g, b) {
102
+ buf[offset] = x;
103
+ buf[offset + 1] = y;
104
+ buf[offset + 2] = z;
105
+ buf[offset + 3] = r;
106
+ buf[offset + 4] = g;
107
+ buf[offset + 5] = b;
108
+ return offset + FLOATS_PER_VERT;
109
+ }
110
+ //# sourceMappingURL=camera-frustum-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera-frustum-renderer.js","sourceRoot":"","sources":["../src/camera-frustum-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { OrbitCamera } from './orbit-camera.js';
2
+ import type { CameraSettings } from '@certe/atmos-renderer';
3
+ export interface CameraPreset {
4
+ name: string;
5
+ azimuth: number;
6
+ elevation: number;
7
+ }
8
+ export declare const CAMERA_PRESETS: CameraPreset[];
9
+ export declare function applyCameraPreset(orbit: OrbitCamera, preset: CameraPreset, camera: CameraSettings): void;
10
+ //# sourceMappingURL=camera-presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera-presets.d.ts","sourceRoot":"","sources":["../src/camera-presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,eAAO,MAAM,cAAc,EAAE,YAAY,EAOxC,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,cAAc,GACrB,IAAI,CAIN"}
@@ -0,0 +1,15 @@
1
+ const DEG = Math.PI / 180;
2
+ export const CAMERA_PRESETS = [
3
+ { name: 'Front', azimuth: 0, elevation: 0 },
4
+ { name: 'Back', azimuth: 180 * DEG, elevation: 0 },
5
+ { name: 'Left', azimuth: -90 * DEG, elevation: 0 },
6
+ { name: 'Right', azimuth: 90 * DEG, elevation: 0 },
7
+ { name: 'Top', azimuth: 0, elevation: 89 * DEG },
8
+ { name: 'Bottom', azimuth: 0, elevation: -89 * DEG },
9
+ ];
10
+ export function applyCameraPreset(orbit, preset, camera) {
11
+ orbit.azimuth = preset.azimuth;
12
+ orbit.elevation = preset.elevation;
13
+ orbit.applyToCamera(camera);
14
+ }
15
+ //# sourceMappingURL=camera-presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera-presets.js","sourceRoot":"","sources":["../src/camera-presets.ts"],"names":[],"mappings":"AASA,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;AAE1B,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;IAC3C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE;IAClD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE;IAClD,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE;IAClD,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,GAAG,EAAE;IAChD,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE;CACrD,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAC/B,KAAkB,EAClB,MAAoB,EACpB,MAAsB;IAEtB,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ColliderGizmoData } from './bootstrap/types.js';
2
+ export declare class ColliderGizmoRenderer {
3
+ private readonly _device;
4
+ private readonly _pipeline;
5
+ private readonly _vertexBuffer;
6
+ private readonly _uniformBuffer;
7
+ private readonly _bindGroup;
8
+ private readonly _verts;
9
+ constructor(device: GPUDevice, format: GPUTextureFormat);
10
+ render(pass: GPURenderPassEncoder, vp: Float32Array, colliders: ColliderGizmoData[]): void;
11
+ destroy(): void;
12
+ }
13
+ //# sourceMappingURL=collider-gizmo-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collider-gizmo-renderer.d.ts","sourceRoot":"","sources":["../src/collider-gizmo-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAmL9D,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAY;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;gBAE5D,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB;IAwBvD,MAAM,CACJ,IAAI,EAAE,oBAAoB,EAC1B,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,iBAAiB,EAAE,GAC7B,IAAI;IAgCP,OAAO,IAAI,IAAI;CAIhB"}