@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.
- package/LICENCE +674 -0
- package/README.md +206 -0
- package/dist/asset-browser-client.d.ts +24 -0
- package/dist/asset-browser-client.d.ts.map +1 -0
- package/dist/asset-browser-client.js +60 -0
- package/dist/asset-browser-client.js.map +1 -0
- package/dist/asset-types.d.ts +33 -0
- package/dist/asset-types.d.ts.map +1 -0
- package/dist/asset-types.js +2 -0
- package/dist/asset-types.js.map +1 -0
- package/dist/bootstrap/default-factories.d.ts +38 -0
- package/dist/bootstrap/default-factories.d.ts.map +1 -0
- package/dist/bootstrap/default-factories.js +268 -0
- package/dist/bootstrap/default-factories.js.map +1 -0
- package/dist/bootstrap/editor-physics.d.ts +81 -0
- package/dist/bootstrap/editor-physics.d.ts.map +1 -0
- package/dist/bootstrap/editor-physics.js +512 -0
- package/dist/bootstrap/editor-physics.js.map +1 -0
- package/dist/bootstrap/geometry-cache.d.ts +5 -0
- package/dist/bootstrap/geometry-cache.d.ts.map +1 -0
- package/dist/bootstrap/geometry-cache.js +18 -0
- package/dist/bootstrap/geometry-cache.js.map +1 -0
- package/dist/bootstrap/keyboard-shortcuts.d.ts +4 -0
- package/dist/bootstrap/keyboard-shortcuts.d.ts.map +1 -0
- package/dist/bootstrap/keyboard-shortcuts.js +43 -0
- package/dist/bootstrap/keyboard-shortcuts.js.map +1 -0
- package/dist/bootstrap/model-import.d.ts +9 -0
- package/dist/bootstrap/model-import.d.ts.map +1 -0
- package/dist/bootstrap/model-import.js +55 -0
- package/dist/bootstrap/model-import.js.map +1 -0
- package/dist/bootstrap/start-editor.d.ts +3 -0
- package/dist/bootstrap/start-editor.d.ts.map +1 -0
- package/dist/bootstrap/start-editor.js +506 -0
- package/dist/bootstrap/start-editor.js.map +1 -0
- package/dist/bootstrap/start-player.d.ts +23 -0
- package/dist/bootstrap/start-player.d.ts.map +1 -0
- package/dist/bootstrap/start-player.js +205 -0
- package/dist/bootstrap/start-player.js.map +1 -0
- package/dist/bootstrap/types.d.ts +160 -0
- package/dist/bootstrap/types.d.ts.map +1 -0
- package/dist/bootstrap/types.js +2 -0
- package/dist/bootstrap/types.js.map +1 -0
- package/dist/camera-frustum-renderer.d.ts +15 -0
- package/dist/camera-frustum-renderer.d.ts.map +1 -0
- package/dist/camera-frustum-renderer.js +110 -0
- package/dist/camera-frustum-renderer.js.map +1 -0
- package/dist/camera-presets.d.ts +10 -0
- package/dist/camera-presets.d.ts.map +1 -0
- package/dist/camera-presets.js +15 -0
- package/dist/camera-presets.js.map +1 -0
- package/dist/collider-gizmo-renderer.d.ts +13 -0
- package/dist/collider-gizmo-renderer.d.ts.map +1 -0
- package/dist/collider-gizmo-renderer.js +217 -0
- package/dist/collider-gizmo-renderer.js.map +1 -0
- package/dist/color-utils.d.ts +5 -0
- package/dist/color-utils.d.ts.map +1 -0
- package/dist/color-utils.js +13 -0
- package/dist/color-utils.js.map +1 -0
- package/dist/components/asset-browser-panel.d.ts +14 -0
- package/dist/components/asset-browser-panel.d.ts.map +1 -0
- package/dist/components/asset-browser-panel.js +247 -0
- package/dist/components/asset-browser-panel.js.map +1 -0
- package/dist/components/context-menu.d.ts +14 -0
- package/dist/components/context-menu.d.ts.map +1 -0
- package/dist/components/context-menu.js +48 -0
- package/dist/components/context-menu.js.map +1 -0
- package/dist/components/editor-shell.d.ts +27 -0
- package/dist/components/editor-shell.d.ts.map +1 -0
- package/dist/components/editor-shell.js +327 -0
- package/dist/components/editor-shell.js.map +1 -0
- package/dist/components/fields/boolean-field.d.ts +8 -0
- package/dist/components/fields/boolean-field.d.ts.map +1 -0
- package/dist/components/fields/boolean-field.js +11 -0
- package/dist/components/fields/boolean-field.js.map +1 -0
- package/dist/components/fields/color-field.d.ts +8 -0
- package/dist/components/fields/color-field.d.ts.map +1 -0
- package/dist/components/fields/color-field.js +34 -0
- package/dist/components/fields/color-field.js.map +1 -0
- package/dist/components/fields/decimal-input.d.ts +13 -0
- package/dist/components/fields/decimal-input.d.ts.map +1 -0
- package/dist/components/fields/decimal-input.js +49 -0
- package/dist/components/fields/decimal-input.js.map +1 -0
- package/dist/components/fields/enum-field.d.ts +12 -0
- package/dist/components/fields/enum-field.d.ts.map +1 -0
- package/dist/components/fields/enum-field.js +20 -0
- package/dist/components/fields/enum-field.js.map +1 -0
- package/dist/components/fields/game-object-ref-field.d.ts +11 -0
- package/dist/components/fields/game-object-ref-field.d.ts.map +1 -0
- package/dist/components/fields/game-object-ref-field.js +73 -0
- package/dist/components/fields/game-object-ref-field.js.map +1 -0
- package/dist/components/fields/material-asset-field.d.ts +10 -0
- package/dist/components/fields/material-asset-field.d.ts.map +1 -0
- package/dist/components/fields/material-asset-field.js +114 -0
- package/dist/components/fields/material-asset-field.js.map +1 -0
- package/dist/components/fields/number-field.d.ts +10 -0
- package/dist/components/fields/number-field.d.ts.map +1 -0
- package/dist/components/fields/number-field.js +21 -0
- package/dist/components/fields/number-field.js.map +1 -0
- package/dist/components/fields/quat-field.d.ts +8 -0
- package/dist/components/fields/quat-field.d.ts.map +1 -0
- package/dist/components/fields/quat-field.js +43 -0
- package/dist/components/fields/quat-field.js.map +1 -0
- package/dist/components/fields/string-field.d.ts +7 -0
- package/dist/components/fields/string-field.d.ts.map +1 -0
- package/dist/components/fields/string-field.js +20 -0
- package/dist/components/fields/string-field.js.map +1 -0
- package/dist/components/fields/vec3-field.d.ts +8 -0
- package/dist/components/fields/vec3-field.d.ts.map +1 -0
- package/dist/components/fields/vec3-field.js +30 -0
- package/dist/components/fields/vec3-field.js.map +1 -0
- package/dist/components/hierarchy-node.d.ts +18 -0
- package/dist/components/hierarchy-node.d.ts.map +1 -0
- package/dist/components/hierarchy-node.js +77 -0
- package/dist/components/hierarchy-node.js.map +1 -0
- package/dist/components/hierarchy-panel.d.ts +14 -0
- package/dist/components/hierarchy-panel.d.ts.map +1 -0
- package/dist/components/hierarchy-panel.js +228 -0
- package/dist/components/hierarchy-panel.js.map +1 -0
- package/dist/components/inspector-panel.d.ts +14 -0
- package/dist/components/inspector-panel.d.ts.map +1 -0
- package/dist/components/inspector-panel.js +288 -0
- package/dist/components/inspector-panel.js.map +1 -0
- package/dist/components/material-inspector.d.ts +10 -0
- package/dist/components/material-inspector.d.ts.map +1 -0
- package/dist/components/material-inspector.js +130 -0
- package/dist/components/material-inspector.js.map +1 -0
- package/dist/components/post-process-panel.d.ts +9 -0
- package/dist/components/post-process-panel.d.ts.map +1 -0
- package/dist/components/post-process-panel.js +70 -0
- package/dist/components/post-process-panel.js.map +1 -0
- package/dist/components/project-gate.d.ts +8 -0
- package/dist/components/project-gate.d.ts.map +1 -0
- package/dist/components/project-gate.js +87 -0
- package/dist/components/project-gate.js.map +1 -0
- package/dist/components/settings-panel.d.ts +8 -0
- package/dist/components/settings-panel.d.ts.map +1 -0
- package/dist/components/settings-panel.js +108 -0
- package/dist/components/settings-panel.js.map +1 -0
- package/dist/components/use-splitter.d.ts +4 -0
- package/dist/components/use-splitter.d.ts.map +1 -0
- package/dist/components/use-splitter.js +22 -0
- package/dist/components/use-splitter.js.map +1 -0
- package/dist/editor-mount.d.ts +36 -0
- package/dist/editor-mount.d.ts.map +1 -0
- package/dist/editor-mount.js +161 -0
- package/dist/editor-mount.js.map +1 -0
- package/dist/editor-state.d.ts +55 -0
- package/dist/editor-state.d.ts.map +1 -0
- package/dist/editor-state.js +181 -0
- package/dist/editor-state.js.map +1 -0
- package/dist/gizmo-meshes.d.ts +9 -0
- package/dist/gizmo-meshes.d.ts.map +1 -0
- package/dist/gizmo-meshes.js +229 -0
- package/dist/gizmo-meshes.js.map +1 -0
- package/dist/gizmo-renderer.d.ts +16 -0
- package/dist/gizmo-renderer.d.ts.map +1 -0
- package/dist/gizmo-renderer.js +77 -0
- package/dist/gizmo-renderer.js.map +1 -0
- package/dist/gizmo-state.d.ts +25 -0
- package/dist/gizmo-state.d.ts.map +1 -0
- package/dist/gizmo-state.js +269 -0
- package/dist/gizmo-state.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/joint-gizmo-renderer.d.ts +13 -0
- package/dist/joint-gizmo-renderer.d.ts.map +1 -0
- package/dist/joint-gizmo-renderer.js +133 -0
- package/dist/joint-gizmo-renderer.js.map +1 -0
- package/dist/material-manager.d.ts +22 -0
- package/dist/material-manager.d.ts.map +1 -0
- package/dist/material-manager.js +156 -0
- package/dist/material-manager.js.map +1 -0
- package/dist/object-picker.d.ts +11 -0
- package/dist/object-picker.d.ts.map +1 -0
- package/dist/object-picker.js +104 -0
- package/dist/object-picker.js.map +1 -0
- package/dist/orbit-camera.d.ts +38 -0
- package/dist/orbit-camera.d.ts.map +1 -0
- package/dist/orbit-camera.js +180 -0
- package/dist/orbit-camera.js.map +1 -0
- package/dist/overlay-renderer.d.ts +23 -0
- package/dist/overlay-renderer.d.ts.map +1 -0
- package/dist/overlay-renderer.js +95 -0
- package/dist/overlay-renderer.js.map +1 -0
- package/dist/player-entry.d.ts +6 -0
- package/dist/player-entry.d.ts.map +1 -0
- package/dist/player-entry.js +4 -0
- package/dist/player-entry.js.map +1 -0
- package/dist/project-fs.d.ts +28 -0
- package/dist/project-fs.d.ts.map +1 -0
- package/dist/project-fs.js +258 -0
- package/dist/project-fs.js.map +1 -0
- package/dist/project-seed.d.ts +3 -0
- package/dist/project-seed.d.ts.map +1 -0
- package/dist/project-seed.js +35 -0
- package/dist/project-seed.js.map +1 -0
- package/dist/project-settings.d.ts +29 -0
- package/dist/project-settings.d.ts.map +1 -0
- package/dist/project-settings.js +69 -0
- package/dist/project-settings.js.map +1 -0
- package/dist/property-setters.d.ts +4 -0
- package/dist/property-setters.d.ts.map +1 -0
- package/dist/property-setters.js +58 -0
- package/dist/property-setters.js.map +1 -0
- package/dist/scene-operations.d.ts +14 -0
- package/dist/scene-operations.d.ts.map +1 -0
- package/dist/scene-operations.js +195 -0
- package/dist/scene-operations.js.map +1 -0
- package/dist/scene-snapshot.d.ts +28 -0
- package/dist/scene-snapshot.d.ts.map +1 -0
- package/dist/scene-snapshot.js +97 -0
- package/dist/scene-snapshot.js.map +1 -0
- package/dist/script-discovery.d.ts +12 -0
- package/dist/script-discovery.d.ts.map +1 -0
- package/dist/script-discovery.js +81 -0
- package/dist/script-discovery.js.map +1 -0
- package/dist/selection-utils.d.ts +4 -0
- package/dist/selection-utils.d.ts.map +1 -0
- package/dist/selection-utils.js +19 -0
- package/dist/selection-utils.js.map +1 -0
- package/dist/simple-material-loader.d.ts +17 -0
- package/dist/simple-material-loader.d.ts.map +1 -0
- package/dist/simple-material-loader.js +85 -0
- package/dist/simple-material-loader.js.map +1 -0
- package/dist/wireframe-renderer.d.ts +18 -0
- package/dist/wireframe-renderer.d.ts.map +1 -0
- package/dist/wireframe-renderer.js +106 -0
- package/dist/wireframe-renderer.js.map +1 -0
- package/package.json +65 -0
- package/src/index.ts +48 -0
- package/vite-plugin.d.ts +15 -0
- package/vite-plugin.mjs +395 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { createUnlitPipeline } from '@certe/atmos-renderer';
|
|
2
|
+
/** Bright green wireframe color. */
|
|
3
|
+
const COLOR = [0.2, 1.0, 0.3];
|
|
4
|
+
const FLOATS_PER_VERT = 6; // position(3) + color(3)
|
|
5
|
+
const CIRCLE_SEGS = 32;
|
|
6
|
+
const ARC_SEGS = 16;
|
|
7
|
+
// Max verts: 8 colliders × 264 verts (capsule worst case)
|
|
8
|
+
const MAX_VERTS = 8 * 264;
|
|
9
|
+
const VERTEX_BUF_SIZE = MAX_VERTS * FLOATS_PER_VERT * 4;
|
|
10
|
+
const UNIFORM_SIZE = 64; // mat4
|
|
11
|
+
// Scratch rotation matrix (3×3 from quaternion)
|
|
12
|
+
const _r = new Float32Array(9);
|
|
13
|
+
function quatToMat3(q) {
|
|
14
|
+
const x2 = q.x + q.x, y2 = q.y + q.y, z2 = q.z + q.z;
|
|
15
|
+
const xx = q.x * x2, xy = q.x * y2, xz = q.x * z2;
|
|
16
|
+
const yy = q.y * y2, yz = q.y * z2, zz = q.z * z2;
|
|
17
|
+
const wx = q.w * x2, wy = q.w * y2, wz = q.w * z2;
|
|
18
|
+
_r[0] = 1 - (yy + zz);
|
|
19
|
+
_r[1] = xy + wz;
|
|
20
|
+
_r[2] = xz - wy;
|
|
21
|
+
_r[3] = xy - wz;
|
|
22
|
+
_r[4] = 1 - (xx + zz);
|
|
23
|
+
_r[5] = yz + wx;
|
|
24
|
+
_r[6] = xz + wy;
|
|
25
|
+
_r[7] = yz - wx;
|
|
26
|
+
_r[8] = 1 - (xx + yy);
|
|
27
|
+
}
|
|
28
|
+
/** Transform a local point by rotation matrix _r + translation. */
|
|
29
|
+
function transformPoint(lx, ly, lz, pos) {
|
|
30
|
+
return [
|
|
31
|
+
_r[0] * lx + _r[3] * ly + _r[6] * lz + pos.x,
|
|
32
|
+
_r[1] * lx + _r[4] * ly + _r[7] * lz + pos.y,
|
|
33
|
+
_r[2] * lx + _r[5] * ly + _r[8] * lz + pos.z,
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
function writeVert(buf, o, x, y, z) {
|
|
37
|
+
buf[o] = x;
|
|
38
|
+
buf[o + 1] = y;
|
|
39
|
+
buf[o + 2] = z;
|
|
40
|
+
buf[o + 3] = COLOR[0];
|
|
41
|
+
buf[o + 4] = COLOR[1];
|
|
42
|
+
buf[o + 5] = COLOR[2];
|
|
43
|
+
return o + FLOATS_PER_VERT;
|
|
44
|
+
}
|
|
45
|
+
function writeCircle(buf, o, segs, pos, radius, axisA, axisB, offset, offsetAxis) {
|
|
46
|
+
const local = [0, 0, 0];
|
|
47
|
+
local[offsetAxis] = offset;
|
|
48
|
+
for (let i = 0; i < segs; i++) {
|
|
49
|
+
const a0 = (i / segs) * Math.PI * 2;
|
|
50
|
+
const a1 = ((i + 1) / segs) * Math.PI * 2;
|
|
51
|
+
local[axisA] = Math.cos(a0) * radius;
|
|
52
|
+
local[axisB] = Math.sin(a0) * radius;
|
|
53
|
+
const p0 = transformPoint(local[0], local[1], local[2], pos);
|
|
54
|
+
local[axisA] = Math.cos(a1) * radius;
|
|
55
|
+
local[axisB] = Math.sin(a1) * radius;
|
|
56
|
+
const p1 = transformPoint(local[0], local[1], local[2], pos);
|
|
57
|
+
o = writeVert(buf, o, p0[0], p0[1], p0[2]);
|
|
58
|
+
o = writeVert(buf, o, p1[0], p1[1], p1[2]);
|
|
59
|
+
}
|
|
60
|
+
return o;
|
|
61
|
+
}
|
|
62
|
+
function writeBox(buf, o, d) {
|
|
63
|
+
const h = d.halfExtents;
|
|
64
|
+
// 8 corners
|
|
65
|
+
const corners = [];
|
|
66
|
+
for (let sx = -1; sx <= 1; sx += 2) {
|
|
67
|
+
for (let sy = -1; sy <= 1; sy += 2) {
|
|
68
|
+
for (let sz = -1; sz <= 1; sz += 2) {
|
|
69
|
+
corners.push(transformPoint(sx * h.x, sy * h.y, sz * h.z, d.position));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// 12 edges: connect corners that differ in exactly 1 axis
|
|
74
|
+
// Corner indexing: bit0=x, bit1=y, bit2=z
|
|
75
|
+
const edges = [
|
|
76
|
+
[0, 1], [2, 3], [4, 5], [6, 7], // x edges
|
|
77
|
+
[0, 2], [1, 3], [4, 6], [5, 7], // y edges
|
|
78
|
+
[0, 4], [1, 5], [2, 6], [3, 7], // z edges
|
|
79
|
+
];
|
|
80
|
+
for (const edge of edges) {
|
|
81
|
+
const ca = corners[edge[0]];
|
|
82
|
+
const cb = corners[edge[1]];
|
|
83
|
+
o = writeVert(buf, o, ca[0], ca[1], ca[2]);
|
|
84
|
+
o = writeVert(buf, o, cb[0], cb[1], cb[2]);
|
|
85
|
+
}
|
|
86
|
+
return o;
|
|
87
|
+
}
|
|
88
|
+
function writeSphere(buf, o, d) {
|
|
89
|
+
const r = d.radius;
|
|
90
|
+
// 3 great circles: XY, XZ, YZ
|
|
91
|
+
o = writeCircle(buf, o, CIRCLE_SEGS, d.position, r, 0, 1, 0, 2); // XY
|
|
92
|
+
o = writeCircle(buf, o, CIRCLE_SEGS, d.position, r, 0, 2, 0, 1); // XZ
|
|
93
|
+
o = writeCircle(buf, o, CIRCLE_SEGS, d.position, r, 1, 2, 0, 0); // YZ
|
|
94
|
+
return o;
|
|
95
|
+
}
|
|
96
|
+
function writeCylinder(buf, o, d) {
|
|
97
|
+
const r = d.radius;
|
|
98
|
+
const hh = d.halfHeight;
|
|
99
|
+
// Top and bottom circles (XZ plane at ±halfHeight on Y)
|
|
100
|
+
o = writeCircle(buf, o, CIRCLE_SEGS, d.position, r, 0, 2, hh, 1);
|
|
101
|
+
o = writeCircle(buf, o, CIRCLE_SEGS, d.position, r, 0, 2, -hh, 1);
|
|
102
|
+
// 4 vertical lines
|
|
103
|
+
for (let i = 0; i < 4; i++) {
|
|
104
|
+
const angle = (i / 4) * Math.PI * 2;
|
|
105
|
+
const lx = Math.cos(angle) * r;
|
|
106
|
+
const lz = Math.sin(angle) * r;
|
|
107
|
+
const top = transformPoint(lx, hh, lz, d.position);
|
|
108
|
+
const bot = transformPoint(lx, -hh, lz, d.position);
|
|
109
|
+
o = writeVert(buf, o, top[0], top[1], top[2]);
|
|
110
|
+
o = writeVert(buf, o, bot[0], bot[1], bot[2]);
|
|
111
|
+
}
|
|
112
|
+
return o;
|
|
113
|
+
}
|
|
114
|
+
function writeCapsule(buf, o, d) {
|
|
115
|
+
const r = d.radius;
|
|
116
|
+
const hh = d.halfHeight;
|
|
117
|
+
// Cylinder body: top and bottom circles
|
|
118
|
+
o = writeCircle(buf, o, CIRCLE_SEGS, d.position, r, 0, 2, hh, 1);
|
|
119
|
+
o = writeCircle(buf, o, CIRCLE_SEGS, d.position, r, 0, 2, -hh, 1);
|
|
120
|
+
// 4 vertical lines
|
|
121
|
+
for (let i = 0; i < 4; i++) {
|
|
122
|
+
const angle = (i / 4) * Math.PI * 2;
|
|
123
|
+
const lx = Math.cos(angle) * r;
|
|
124
|
+
const lz = Math.sin(angle) * r;
|
|
125
|
+
const top = transformPoint(lx, hh, lz, d.position);
|
|
126
|
+
const bot = transformPoint(lx, -hh, lz, d.position);
|
|
127
|
+
o = writeVert(buf, o, top[0], top[1], top[2]);
|
|
128
|
+
o = writeVert(buf, o, bot[0], bot[1], bot[2]);
|
|
129
|
+
}
|
|
130
|
+
// 4 hemisphere arcs (2 on top in XY and ZY planes, 2 on bottom)
|
|
131
|
+
const writeArc = (centerY, startAngle, endAngle, axisH) => {
|
|
132
|
+
for (let i = 0; i < ARC_SEGS; i++) {
|
|
133
|
+
const a0 = startAngle + (i / ARC_SEGS) * (endAngle - startAngle);
|
|
134
|
+
const a1 = startAngle + ((i + 1) / ARC_SEGS) * (endAngle - startAngle);
|
|
135
|
+
const local0 = [0, 0, 0];
|
|
136
|
+
const local1 = [0, 0, 0];
|
|
137
|
+
local0[axisH] = Math.cos(a0) * r;
|
|
138
|
+
local0[1] = centerY + Math.sin(a0) * r;
|
|
139
|
+
local1[axisH] = Math.cos(a1) * r;
|
|
140
|
+
local1[1] = centerY + Math.sin(a1) * r;
|
|
141
|
+
const p0 = transformPoint(local0[0], local0[1], local0[2], d.position);
|
|
142
|
+
const p1 = transformPoint(local1[0], local1[1], local1[2], d.position);
|
|
143
|
+
o = writeVert(buf, o, p0[0], p0[1], p0[2]);
|
|
144
|
+
o = writeVert(buf, o, p1[0], p1[1], p1[2]);
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
// Top hemisphere arcs (0 to PI)
|
|
148
|
+
writeArc(hh, 0, Math.PI, 0); // XY plane
|
|
149
|
+
writeArc(hh, 0, Math.PI, 2); // ZY plane
|
|
150
|
+
// Bottom hemisphere arcs (PI to 2PI)
|
|
151
|
+
writeArc(-hh, Math.PI, Math.PI * 2, 0); // XY plane
|
|
152
|
+
writeArc(-hh, Math.PI, Math.PI * 2, 2); // ZY plane
|
|
153
|
+
return o;
|
|
154
|
+
}
|
|
155
|
+
export class ColliderGizmoRenderer {
|
|
156
|
+
_device;
|
|
157
|
+
_pipeline;
|
|
158
|
+
_vertexBuffer;
|
|
159
|
+
_uniformBuffer;
|
|
160
|
+
_bindGroup;
|
|
161
|
+
_verts = new Float32Array(MAX_VERTS * FLOATS_PER_VERT);
|
|
162
|
+
constructor(device, format) {
|
|
163
|
+
this._device = device;
|
|
164
|
+
this._pipeline = createUnlitPipeline(device, format, {
|
|
165
|
+
topology: 'line-list',
|
|
166
|
+
depthWrite: false,
|
|
167
|
+
depthCompare: 'always',
|
|
168
|
+
});
|
|
169
|
+
this._vertexBuffer = device.createBuffer({
|
|
170
|
+
size: VERTEX_BUF_SIZE,
|
|
171
|
+
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
|
|
172
|
+
});
|
|
173
|
+
this._uniformBuffer = device.createBuffer({
|
|
174
|
+
size: UNIFORM_SIZE,
|
|
175
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
176
|
+
});
|
|
177
|
+
this._bindGroup = device.createBindGroup({
|
|
178
|
+
layout: this._pipeline.bindGroupLayout,
|
|
179
|
+
entries: [{ binding: 0, resource: { buffer: this._uniformBuffer } }],
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
render(pass, vp, colliders) {
|
|
183
|
+
const v = this._verts;
|
|
184
|
+
let o = 0;
|
|
185
|
+
for (const d of colliders) {
|
|
186
|
+
quatToMat3(d.rotation);
|
|
187
|
+
switch (d.shapeType) {
|
|
188
|
+
case 'box':
|
|
189
|
+
o = writeBox(v, o, d);
|
|
190
|
+
break;
|
|
191
|
+
case 'sphere':
|
|
192
|
+
o = writeSphere(v, o, d);
|
|
193
|
+
break;
|
|
194
|
+
case 'cylinder':
|
|
195
|
+
o = writeCylinder(v, o, d);
|
|
196
|
+
break;
|
|
197
|
+
case 'capsule':
|
|
198
|
+
o = writeCapsule(v, o, d);
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const vertCount = o / FLOATS_PER_VERT;
|
|
203
|
+
if (vertCount === 0)
|
|
204
|
+
return;
|
|
205
|
+
this._device.queue.writeBuffer(this._vertexBuffer, 0, v.buffer, v.byteOffset, vertCount * FLOATS_PER_VERT * 4);
|
|
206
|
+
this._device.queue.writeBuffer(this._uniformBuffer, 0, vp.buffer, vp.byteOffset, vp.byteLength);
|
|
207
|
+
pass.setPipeline(this._pipeline.pipeline);
|
|
208
|
+
pass.setBindGroup(0, this._bindGroup);
|
|
209
|
+
pass.setVertexBuffer(0, this._vertexBuffer);
|
|
210
|
+
pass.draw(vertCount);
|
|
211
|
+
}
|
|
212
|
+
destroy() {
|
|
213
|
+
this._vertexBuffer.destroy();
|
|
214
|
+
this._uniformBuffer.destroy();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=collider-gizmo-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collider-gizmo-renderer.js","sourceRoot":"","sources":["../src/collider-gizmo-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Convert [r, g, b] (0–1 each) to a CSS hex color string. */
|
|
2
|
+
export declare function rgbToHex(r: number, g: number, b: number): string;
|
|
3
|
+
/** Parse a CSS hex color string to [r, g, b] (0–1 each). */
|
|
4
|
+
export declare function hexToRgb(hex: string): [number, number, number];
|
|
5
|
+
//# sourceMappingURL=color-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-utils.d.ts","sourceRoot":"","sources":["../src/color-utils.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,4DAA4D;AAC5D,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAK9D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Convert [r, g, b] (0–1 each) to a CSS hex color string. */
|
|
2
|
+
export function rgbToHex(r, g, b) {
|
|
3
|
+
const clamp = (v) => Math.round(Math.max(0, Math.min(1, v)) * 255);
|
|
4
|
+
return `#${clamp(r).toString(16).padStart(2, '0')}${clamp(g).toString(16).padStart(2, '0')}${clamp(b).toString(16).padStart(2, '0')}`;
|
|
5
|
+
}
|
|
6
|
+
/** Parse a CSS hex color string to [r, g, b] (0–1 each). */
|
|
7
|
+
export function hexToRgb(hex) {
|
|
8
|
+
const r = parseInt(hex.slice(1, 3), 16) / 255;
|
|
9
|
+
const g = parseInt(hex.slice(3, 5), 16) / 255;
|
|
10
|
+
const b = parseInt(hex.slice(5, 7), 16) / 255;
|
|
11
|
+
return [r, g, b];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=color-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-utils.js","sourceRoot":"","sources":["../src/color-utils.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IACtD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAC3E,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACxI,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAC9C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAC9C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAC9C,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { EditorState } from '../editor-state.js';
|
|
3
|
+
import type { AssetEntry, ScriptAsset } from '../asset-types.js';
|
|
4
|
+
import type { GameObject } from '@certe/atmos-core';
|
|
5
|
+
interface AssetBrowserPanelProps {
|
|
6
|
+
editorState: EditorState;
|
|
7
|
+
onAttachScript?: (script: ScriptAsset, go: GameObject) => void;
|
|
8
|
+
onLoadModel?: (entry: AssetEntry) => void;
|
|
9
|
+
onLoadScene?: (entry: AssetEntry) => void;
|
|
10
|
+
style?: React.CSSProperties;
|
|
11
|
+
}
|
|
12
|
+
export declare function AssetBrowserPanel({ editorState, onAttachScript, onLoadModel, onLoadScene, style }: AssetBrowserPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=asset-browser-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-browser-panel.d.ts","sourceRoot":"","sources":["../../src/components/asset-browser-panel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,UAAU,sBAAsB;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,KAAK,IAAI,CAAC;IAC/D,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAmJD,wBAAgB,iBAAiB,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,sBAAsB,2CAqOzH"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState, useEffect, useMemo, useCallback } from 'react';
|
|
3
|
+
/* ── Styles ─────────────────────────────────────────── */
|
|
4
|
+
const panelStyle = {
|
|
5
|
+
background: '#1c1c1c',
|
|
6
|
+
borderTop: '1px solid #2a2a2a',
|
|
7
|
+
display: 'flex',
|
|
8
|
+
flexDirection: 'column',
|
|
9
|
+
overflow: 'hidden',
|
|
10
|
+
};
|
|
11
|
+
const headerStyle = {
|
|
12
|
+
display: 'flex',
|
|
13
|
+
alignItems: 'center',
|
|
14
|
+
gap: '8px',
|
|
15
|
+
padding: '5px 10px',
|
|
16
|
+
fontSize: '11px',
|
|
17
|
+
fontWeight: 600,
|
|
18
|
+
color: '#888',
|
|
19
|
+
letterSpacing: '0.5px',
|
|
20
|
+
borderBottom: '1px solid #2a2a2a',
|
|
21
|
+
background: '#1c1c1c',
|
|
22
|
+
flexShrink: 0,
|
|
23
|
+
};
|
|
24
|
+
const breadcrumbStyle = {
|
|
25
|
+
fontSize: '11px',
|
|
26
|
+
color: '#666',
|
|
27
|
+
fontWeight: 400,
|
|
28
|
+
letterSpacing: 0,
|
|
29
|
+
};
|
|
30
|
+
const breadcrumbLinkStyle = {
|
|
31
|
+
color: '#6ab0d6',
|
|
32
|
+
cursor: 'pointer',
|
|
33
|
+
background: 'none',
|
|
34
|
+
border: 'none',
|
|
35
|
+
fontSize: '11px',
|
|
36
|
+
fontFamily: 'inherit',
|
|
37
|
+
padding: 0,
|
|
38
|
+
};
|
|
39
|
+
const searchStyle = {
|
|
40
|
+
marginLeft: 'auto',
|
|
41
|
+
background: '#252525',
|
|
42
|
+
border: '1px solid #3a3a3a',
|
|
43
|
+
borderRadius: '3px',
|
|
44
|
+
color: '#b8b8b8',
|
|
45
|
+
fontSize: '10px',
|
|
46
|
+
padding: '2px 6px',
|
|
47
|
+
width: '120px',
|
|
48
|
+
fontFamily: 'inherit',
|
|
49
|
+
outline: 'none',
|
|
50
|
+
};
|
|
51
|
+
const listStyle = {
|
|
52
|
+
flex: 1,
|
|
53
|
+
overflow: 'auto',
|
|
54
|
+
padding: '2px 0',
|
|
55
|
+
};
|
|
56
|
+
const rowStyle = {
|
|
57
|
+
display: 'flex',
|
|
58
|
+
alignItems: 'center',
|
|
59
|
+
gap: '6px',
|
|
60
|
+
padding: '3px 10px',
|
|
61
|
+
fontSize: '11px',
|
|
62
|
+
color: '#b8b8b8',
|
|
63
|
+
cursor: 'pointer',
|
|
64
|
+
userSelect: 'none',
|
|
65
|
+
};
|
|
66
|
+
const rowHoverBg = '#2a2a3a';
|
|
67
|
+
const rowSelectedBg = '#1a4a7a';
|
|
68
|
+
const badgeBase = {
|
|
69
|
+
fontSize: '9px',
|
|
70
|
+
fontWeight: 700,
|
|
71
|
+
padding: '1px 4px',
|
|
72
|
+
borderRadius: '2px',
|
|
73
|
+
letterSpacing: '0.3px',
|
|
74
|
+
flexShrink: 0,
|
|
75
|
+
minWidth: '24px',
|
|
76
|
+
textAlign: 'center',
|
|
77
|
+
};
|
|
78
|
+
const BADGE_COLORS = {
|
|
79
|
+
ts: { bg: '#1a4a7a', color: '#7ab8e8' },
|
|
80
|
+
tsx: { bg: '#1a4a7a', color: '#7ab8e8' },
|
|
81
|
+
js: { bg: '#4a4a1a', color: '#d8d87a' },
|
|
82
|
+
json: { bg: '#3a3a3a', color: '#999' },
|
|
83
|
+
html: { bg: '#6a2a2a', color: '#e88' },
|
|
84
|
+
css: { bg: '#2a4a2a', color: '#8c8' },
|
|
85
|
+
wgsl: { bg: '#4a2a5a', color: '#b88ae8' },
|
|
86
|
+
glb: { bg: '#5a3a1a', color: '#e8a848' },
|
|
87
|
+
gltf: { bg: '#5a3a1a', color: '#e8a848' },
|
|
88
|
+
dir: { bg: '#3a3a2a', color: '#c8b888' },
|
|
89
|
+
};
|
|
90
|
+
const MODEL_EXTENSIONS = new Set(['glb', 'gltf']);
|
|
91
|
+
const MATERIAL_EXTENSION = '.mat.json';
|
|
92
|
+
const SCENE_EXTENSION = '.scene.json';
|
|
93
|
+
const TEXTURE_EXTENSIONS = new Set(['png', 'jpg', 'jpeg', 'webp']);
|
|
94
|
+
const contextMenuStyle = {
|
|
95
|
+
position: 'fixed',
|
|
96
|
+
background: '#252525',
|
|
97
|
+
border: '1px solid #3a3a3a',
|
|
98
|
+
borderRadius: '4px',
|
|
99
|
+
padding: '4px 0',
|
|
100
|
+
zIndex: 2000,
|
|
101
|
+
minWidth: '160px',
|
|
102
|
+
boxShadow: '0 6px 16px rgba(0,0,0,0.6)',
|
|
103
|
+
};
|
|
104
|
+
const contextItemStyle = {
|
|
105
|
+
padding: '5px 12px',
|
|
106
|
+
fontSize: '11px',
|
|
107
|
+
cursor: 'pointer',
|
|
108
|
+
color: '#b8b8b8',
|
|
109
|
+
};
|
|
110
|
+
/* ── Helpers ────────────────────────────────────────── */
|
|
111
|
+
function findEntryAtPath(entries, pathParts) {
|
|
112
|
+
let current = entries;
|
|
113
|
+
for (const part of pathParts) {
|
|
114
|
+
const dir = current.find((e) => e.name === part && e.kind === 'directory');
|
|
115
|
+
if (!dir?.children)
|
|
116
|
+
return [];
|
|
117
|
+
current = dir.children;
|
|
118
|
+
}
|
|
119
|
+
return current;
|
|
120
|
+
}
|
|
121
|
+
function badgeFor(entry) {
|
|
122
|
+
if (entry.kind === 'directory') {
|
|
123
|
+
const c = BADGE_COLORS['dir'];
|
|
124
|
+
return { label: 'DIR', ...c };
|
|
125
|
+
}
|
|
126
|
+
const ext = entry.extension.toLowerCase();
|
|
127
|
+
const c = BADGE_COLORS[ext] ?? { bg: '#333', color: '#888' };
|
|
128
|
+
return { label: ext.toUpperCase() || '---', ...c };
|
|
129
|
+
}
|
|
130
|
+
/* ── Component ──────────────────────────────────────── */
|
|
131
|
+
export function AssetBrowserPanel({ editorState, onAttachScript, onLoadModel, onLoadScene, style }) {
|
|
132
|
+
const [, setTick] = useState(0);
|
|
133
|
+
const [currentPath, setCurrentPath] = useState([]);
|
|
134
|
+
const [search, setSearch] = useState('');
|
|
135
|
+
const [selectedPath, setSelectedPath] = useState(null);
|
|
136
|
+
const [contextMenu, setContextMenu] = useState(null);
|
|
137
|
+
useEffect(() => {
|
|
138
|
+
const refresh = () => setTick((t) => t + 1);
|
|
139
|
+
const unsub1 = editorState.on('assetsChanged', refresh);
|
|
140
|
+
const unsub2 = editorState.on('scriptsChanged', refresh);
|
|
141
|
+
return () => { unsub1(); unsub2(); };
|
|
142
|
+
}, [editorState]);
|
|
143
|
+
// Close context menu on any click
|
|
144
|
+
useEffect(() => {
|
|
145
|
+
if (!contextMenu)
|
|
146
|
+
return;
|
|
147
|
+
const close = () => setContextMenu(null);
|
|
148
|
+
window.addEventListener('click', close);
|
|
149
|
+
return () => window.removeEventListener('click', close);
|
|
150
|
+
}, [contextMenu]);
|
|
151
|
+
const entries = editorState.assetEntries;
|
|
152
|
+
const scriptSet = useMemo(() => new Set(editorState.scriptAssets.map((s) => s.path)), [editorState.scriptAssets]);
|
|
153
|
+
const visibleEntries = useMemo(() => {
|
|
154
|
+
const items = findEntryAtPath(entries, currentPath);
|
|
155
|
+
if (!search)
|
|
156
|
+
return items;
|
|
157
|
+
const lower = search.toLowerCase();
|
|
158
|
+
return items.filter((e) => e.name.toLowerCase().includes(lower));
|
|
159
|
+
}, [entries, currentPath, search]);
|
|
160
|
+
const navigateInto = useCallback((entry) => {
|
|
161
|
+
if (entry.kind === 'directory') {
|
|
162
|
+
setCurrentPath((p) => [...p, entry.name]);
|
|
163
|
+
setSearch('');
|
|
164
|
+
setSelectedPath(null);
|
|
165
|
+
}
|
|
166
|
+
}, []);
|
|
167
|
+
const navigateTo = useCallback((index) => {
|
|
168
|
+
setCurrentPath((p) => p.slice(0, index));
|
|
169
|
+
setSearch('');
|
|
170
|
+
setSelectedPath(null);
|
|
171
|
+
}, []);
|
|
172
|
+
const findScript = useCallback((entry) => editorState.scriptAssets.find((s) => s.path === entry.path), [editorState.scriptAssets]);
|
|
173
|
+
const handleAttach = useCallback((entry) => {
|
|
174
|
+
const script = findScript(entry);
|
|
175
|
+
if (!script || !editorState.selected || !onAttachScript)
|
|
176
|
+
return;
|
|
177
|
+
onAttachScript(script, editorState.selected);
|
|
178
|
+
}, [findScript, editorState, onAttachScript]);
|
|
179
|
+
const handleContextMenu = useCallback((e, entry) => {
|
|
180
|
+
e.preventDefault();
|
|
181
|
+
setContextMenu({ x: e.clientX, y: e.clientY, entry });
|
|
182
|
+
}, []);
|
|
183
|
+
// Breadcrumb parts
|
|
184
|
+
const breadcrumbs = ['Project', ...currentPath];
|
|
185
|
+
return (_jsxs("div", { style: { ...panelStyle, ...style }, children: [_jsxs("div", { style: headerStyle, children: [_jsx("span", { style: { textTransform: 'uppercase' }, children: "Project" }), _jsx("span", { style: breadcrumbStyle, children: breadcrumbs.map((part, i) => (_jsxs(React.Fragment, { children: [i > 0 && _jsx("span", { style: { margin: '0 3px', color: '#555' }, children: "/" }), i < breadcrumbs.length - 1 ? (_jsx("button", { style: breadcrumbLinkStyle, onClick: () => navigateTo(i), children: part })) : (_jsx("span", { style: { color: '#999' }, children: part }))] }, i))) }), _jsx("input", { style: searchStyle, placeholder: "Filter...", value: search, onChange: (e) => setSearch(e.target.value) })] }), _jsxs("div", { style: listStyle, children: [visibleEntries.length === 0 && (_jsx("div", { style: { padding: '12px', color: '#555', fontSize: '11px' }, children: entries.length === 0 ? 'No assets available' : 'No matching files' })), visibleEntries.map((entry) => {
|
|
186
|
+
const badge = badgeFor(entry);
|
|
187
|
+
const isScript = scriptSet.has(entry.path);
|
|
188
|
+
const isModel = MODEL_EXTENSIONS.has(entry.extension.toLowerCase());
|
|
189
|
+
const isMaterial = entry.name.endsWith(MATERIAL_EXTENSION);
|
|
190
|
+
const isScene = entry.name.endsWith(SCENE_EXTENSION);
|
|
191
|
+
const isTexture = TEXTURE_EXTENSIONS.has(entry.extension.toLowerCase());
|
|
192
|
+
const isSelected = selectedPath === entry.path;
|
|
193
|
+
return (_jsxs("div", { draggable: isScript || isModel || isMaterial || isTexture, style: {
|
|
194
|
+
...rowStyle,
|
|
195
|
+
background: isSelected ? rowSelectedBg : 'transparent',
|
|
196
|
+
}, onClick: () => {
|
|
197
|
+
setSelectedPath(entry.path);
|
|
198
|
+
if (entry.name.endsWith(MATERIAL_EXTENSION)) {
|
|
199
|
+
editorState.selectMaterial(entry.path);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// Deselect material when clicking non-material files
|
|
203
|
+
if (editorState.selectedMaterialPath)
|
|
204
|
+
editorState.selectMaterial(null);
|
|
205
|
+
}
|
|
206
|
+
}, onDoubleClick: () => {
|
|
207
|
+
if (entry.kind === 'directory')
|
|
208
|
+
navigateInto(entry);
|
|
209
|
+
else if (isScene && onLoadScene) {
|
|
210
|
+
const name = entry.name.replace(/\.scene\.json$/, '');
|
|
211
|
+
if (confirm(`Load scene "${name}"?`))
|
|
212
|
+
onLoadScene(entry);
|
|
213
|
+
}
|
|
214
|
+
else if (isScript)
|
|
215
|
+
handleAttach(entry);
|
|
216
|
+
else if (isModel && onLoadModel)
|
|
217
|
+
onLoadModel(entry);
|
|
218
|
+
}, onContextMenu: (e) => handleContextMenu(e, entry), onDragStart: (e) => {
|
|
219
|
+
if (isScript) {
|
|
220
|
+
e.dataTransfer.setData('application/x-atmos-script', entry.path);
|
|
221
|
+
e.dataTransfer.effectAllowed = 'copy';
|
|
222
|
+
}
|
|
223
|
+
else if (isModel) {
|
|
224
|
+
e.dataTransfer.setData('application/x-atmos-model', entry.path);
|
|
225
|
+
e.dataTransfer.effectAllowed = 'copy';
|
|
226
|
+
}
|
|
227
|
+
else if (isMaterial) {
|
|
228
|
+
e.dataTransfer.setData('application/x-atmos-material', entry.path);
|
|
229
|
+
e.dataTransfer.effectAllowed = 'copy';
|
|
230
|
+
}
|
|
231
|
+
else if (isTexture) {
|
|
232
|
+
e.dataTransfer.setData('application/x-atmos-texture', entry.path);
|
|
233
|
+
e.dataTransfer.effectAllowed = 'copy';
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
e.preventDefault();
|
|
237
|
+
}
|
|
238
|
+
}, onMouseEnter: (e) => {
|
|
239
|
+
if (!isSelected)
|
|
240
|
+
e.currentTarget.style.background = rowHoverBg;
|
|
241
|
+
}, onMouseLeave: (e) => {
|
|
242
|
+
if (!isSelected)
|
|
243
|
+
e.currentTarget.style.background = 'transparent';
|
|
244
|
+
}, children: [_jsx("span", { style: { ...badgeBase, background: badge.bg, color: badge.color }, children: badge.label }), _jsx("span", { style: isScript ? { color: '#8cd68c' } : isModel ? { color: '#e8a848' } : isMaterial ? { color: '#b888e8' } : undefined, children: entry.name }), isScript && (_jsx("span", { style: { fontSize: '9px', color: '#5a8a5a', marginLeft: '4px' }, children: "Script" })), isModel && (_jsx("span", { style: { fontSize: '9px', color: '#8a6a2a', marginLeft: '4px' }, children: "Model" })), isMaterial && (_jsx("span", { style: { fontSize: '9px', color: '#6a4a8a', marginLeft: '4px' }, children: "Material" })), isScene && (_jsx("span", { style: { fontSize: '9px', color: '#5a8a8a', marginLeft: '4px' }, children: "Scene" }))] }, entry.path));
|
|
245
|
+
})] }), contextMenu && (_jsxs("div", { style: { ...contextMenuStyle, left: contextMenu.x, top: contextMenu.y }, children: [scriptSet.has(contextMenu.entry.path) && editorState.selected && onAttachScript && (_jsxs("div", { style: contextItemStyle, onMouseEnter: (e) => { e.currentTarget.style.background = '#3a5a8a'; }, onMouseLeave: (e) => { e.currentTarget.style.background = 'transparent'; }, onClick: () => handleAttach(contextMenu.entry), children: ["Add to ", editorState.selected.name] })), MODEL_EXTENSIONS.has(contextMenu.entry.extension.toLowerCase()) && onLoadModel && (_jsx("div", { style: contextItemStyle, onMouseEnter: (e) => { e.currentTarget.style.background = '#3a5a8a'; }, onMouseLeave: (e) => { e.currentTarget.style.background = 'transparent'; }, onClick: () => onLoadModel(contextMenu.entry), children: "Add to Scene" })), _jsx("div", { style: { ...contextItemStyle, color: '#666' }, children: contextMenu.entry.path })] }))] }));
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=asset-browser-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-browser-panel.js","sourceRoot":"","sources":["../../src/components/asset-browser-panel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface MenuItem {
|
|
2
|
+
label: string;
|
|
3
|
+
action: () => void;
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
}
|
|
6
|
+
interface ContextMenuProps {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
items: MenuItem[];
|
|
10
|
+
onClose: () => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function ContextMenu({ x, y, items, onClose }: ContextMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=context-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-menu.d.ts","sourceRoot":"","sources":["../../src/components/context-menu.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,gBAAgB;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA2BD,wBAAgB,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,gBAAgB,2CAqCrE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef } from 'react';
|
|
3
|
+
const menuStyle = {
|
|
4
|
+
position: 'fixed',
|
|
5
|
+
background: '#252525',
|
|
6
|
+
border: '1px solid #3a3a3a',
|
|
7
|
+
borderRadius: '5px',
|
|
8
|
+
padding: '4px 0',
|
|
9
|
+
minWidth: '160px',
|
|
10
|
+
zIndex: 1000,
|
|
11
|
+
boxShadow: '0 6px 16px rgba(0,0,0,0.6)',
|
|
12
|
+
};
|
|
13
|
+
const itemStyle = {
|
|
14
|
+
padding: '5px 14px',
|
|
15
|
+
fontSize: '11px',
|
|
16
|
+
cursor: 'pointer',
|
|
17
|
+
color: '#b8b8b8',
|
|
18
|
+
userSelect: 'none',
|
|
19
|
+
};
|
|
20
|
+
const disabledItemStyle = {
|
|
21
|
+
...itemStyle,
|
|
22
|
+
color: '#555',
|
|
23
|
+
cursor: 'default',
|
|
24
|
+
};
|
|
25
|
+
export function ContextMenu({ x, y, items, onClose }) {
|
|
26
|
+
const ref = useRef(null);
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
const handleClickOutside = (e) => {
|
|
29
|
+
if (ref.current && !ref.current.contains(e.target)) {
|
|
30
|
+
onClose();
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
34
|
+
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
35
|
+
}, [onClose]);
|
|
36
|
+
return (_jsx("div", { ref: ref, style: { ...menuStyle, left: x, top: y }, children: items.map((item, i) => (_jsx("div", { style: item.disabled ? disabledItemStyle : itemStyle, onMouseEnter: (e) => {
|
|
37
|
+
if (!item.disabled)
|
|
38
|
+
e.currentTarget.style.background = '#3a5a8a';
|
|
39
|
+
}, onMouseLeave: (e) => {
|
|
40
|
+
e.currentTarget.style.background = 'transparent';
|
|
41
|
+
}, onClick: () => {
|
|
42
|
+
if (!item.disabled) {
|
|
43
|
+
item.action();
|
|
44
|
+
onClose();
|
|
45
|
+
}
|
|
46
|
+
}, children: item.label }, i))) }));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=context-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-menu.js","sourceRoot":"","sources":["../../src/components/context-menu.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAejD,MAAM,SAAS,GAAwB;IACrC,QAAQ,EAAE,OAAO;IACjB,UAAU,EAAE,SAAS;IACrB,MAAM,EAAE,mBAAmB;IAC3B,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,4BAA4B;CACxC,CAAC;AAEF,MAAM,SAAS,GAAwB;IACrC,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE,MAAM;CACnB,CAAC;AAEF,MAAM,iBAAiB,GAAwB;IAC7C,GAAG,SAAS;IACZ,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAoB;IACpE,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEzC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,kBAAkB,GAAG,CAAC,CAAa,EAAE,EAAE;YAC3C,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC,EAAE,CAAC;gBAC3D,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAC7E,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,CACL,cAAK,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,YACpD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,cAEE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,EACpD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;gBAClB,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAG,CAAC,CAAC,aAA6B,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;YACpF,CAAC,EACD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;gBACjB,CAAC,CAAC,aAA6B,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC;YACpE,CAAC,EACD,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACnB,IAAI,CAAC,MAAM,EAAE,CAAC;oBACd,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,YAEA,IAAI,CAAC,KAAK,IAfN,CAAC,CAgBF,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|