@skenora/runtime 0.1.2

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 (270) hide show
  1. package/README.md +92 -0
  2. package/dist/core/built-in-runtime-capabilities.d.ts +21 -0
  3. package/dist/core/built-in-runtime-capabilities.d.ts.map +1 -0
  4. package/dist/core/built-in-runtime-capabilities.js +175 -0
  5. package/dist/core/built-in-runtime-capabilities.js.map +1 -0
  6. package/dist/core/runtime-capability-registry.d.ts +90 -0
  7. package/dist/core/runtime-capability-registry.d.ts.map +1 -0
  8. package/dist/core/runtime-capability-registry.js +42 -0
  9. package/dist/core/runtime-capability-registry.js.map +1 -0
  10. package/dist/core/runtime-document-coordinator.d.ts +28 -0
  11. package/dist/core/runtime-document-coordinator.d.ts.map +1 -0
  12. package/dist/core/runtime-document-coordinator.js +124 -0
  13. package/dist/core/runtime-document-coordinator.js.map +1 -0
  14. package/dist/core/runtime-events.d.ts +43 -0
  15. package/dist/core/runtime-events.d.ts.map +1 -0
  16. package/dist/core/runtime-events.js +2 -0
  17. package/dist/core/runtime-events.js.map +1 -0
  18. package/dist/core/runtime-session.d.ts +93 -0
  19. package/dist/core/runtime-session.d.ts.map +1 -0
  20. package/dist/core/runtime-session.js +1344 -0
  21. package/dist/core/runtime-session.js.map +1 -0
  22. package/dist/editor-tools/camera-path-editing-controller.d.ts +36 -0
  23. package/dist/editor-tools/camera-path-editing-controller.d.ts.map +1 -0
  24. package/dist/editor-tools/camera-path-editing-controller.js +212 -0
  25. package/dist/editor-tools/camera-path-editing-controller.js.map +1 -0
  26. package/dist/editor-tools/camera-path-visualizer.d.ts +28 -0
  27. package/dist/editor-tools/camera-path-visualizer.d.ts.map +1 -0
  28. package/dist/editor-tools/camera-path-visualizer.js +151 -0
  29. package/dist/editor-tools/camera-path-visualizer.js.map +1 -0
  30. package/dist/editor-tools/drop-preview-controller.d.ts +34 -0
  31. package/dist/editor-tools/drop-preview-controller.d.ts.map +1 -0
  32. package/dist/editor-tools/drop-preview-controller.js +209 -0
  33. package/dist/editor-tools/drop-preview-controller.js.map +1 -0
  34. package/dist/editor-tools/grid-helper.d.ts +18 -0
  35. package/dist/editor-tools/grid-helper.d.ts.map +1 -0
  36. package/dist/editor-tools/grid-helper.js +27 -0
  37. package/dist/editor-tools/grid-helper.js.map +1 -0
  38. package/dist/editor-tools/light-editing-controller.d.ts +25 -0
  39. package/dist/editor-tools/light-editing-controller.d.ts.map +1 -0
  40. package/dist/editor-tools/light-editing-controller.js +207 -0
  41. package/dist/editor-tools/light-editing-controller.js.map +1 -0
  42. package/dist/editor-tools/node-operations.d.ts +51 -0
  43. package/dist/editor-tools/node-operations.d.ts.map +1 -0
  44. package/dist/editor-tools/node-operations.js +182 -0
  45. package/dist/editor-tools/node-operations.js.map +1 -0
  46. package/dist/editor-tools/selection-controller.d.ts +44 -0
  47. package/dist/editor-tools/selection-controller.d.ts.map +1 -0
  48. package/dist/editor-tools/selection-controller.js +299 -0
  49. package/dist/editor-tools/selection-controller.js.map +1 -0
  50. package/dist/editor-tools/shape-drawing-controller.d.ts +45 -0
  51. package/dist/editor-tools/shape-drawing-controller.d.ts.map +1 -0
  52. package/dist/editor-tools/shape-drawing-controller.js +205 -0
  53. package/dist/editor-tools/shape-drawing-controller.js.map +1 -0
  54. package/dist/editor-tools/shape-editing-controller.d.ts +40 -0
  55. package/dist/editor-tools/shape-editing-controller.d.ts.map +1 -0
  56. package/dist/editor-tools/shape-editing-controller.js +340 -0
  57. package/dist/editor-tools/shape-editing-controller.js.map +1 -0
  58. package/dist/editor.d.ts +12 -0
  59. package/dist/editor.d.ts.map +1 -0
  60. package/dist/editor.js +12 -0
  61. package/dist/editor.js.map +1 -0
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +2 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/inspection/node-tools.d.ts +51 -0
  67. package/dist/inspection/node-tools.d.ts.map +1 -0
  68. package/dist/inspection/node-tools.js +282 -0
  69. package/dist/inspection/node-tools.js.map +1 -0
  70. package/dist/interaction/runtime-third-person-controller.d.ts +24 -0
  71. package/dist/interaction/runtime-third-person-controller.d.ts.map +1 -0
  72. package/dist/interaction/runtime-third-person-controller.js +71 -0
  73. package/dist/interaction/runtime-third-person-controller.js.map +1 -0
  74. package/dist/interaction/third-person-controller.d.ts +61 -0
  75. package/dist/interaction/third-person-controller.d.ts.map +1 -0
  76. package/dist/interaction/third-person-controller.js +400 -0
  77. package/dist/interaction/third-person-controller.js.map +1 -0
  78. package/dist/interaction.d.ts +3 -0
  79. package/dist/interaction.d.ts.map +1 -0
  80. package/dist/interaction.js +3 -0
  81. package/dist/interaction.js.map +1 -0
  82. package/dist/presentation/scene-renderer.d.ts +75 -0
  83. package/dist/presentation/scene-renderer.d.ts.map +1 -0
  84. package/dist/presentation/scene-renderer.js +324 -0
  85. package/dist/presentation/scene-renderer.js.map +1 -0
  86. package/dist/presentation/viewport-controller.d.ts +13 -0
  87. package/dist/presentation/viewport-controller.d.ts.map +1 -0
  88. package/dist/presentation/viewport-controller.js +186 -0
  89. package/dist/presentation/viewport-controller.js.map +1 -0
  90. package/dist/projection/annotation-projector.d.ts +28 -0
  91. package/dist/projection/annotation-projector.d.ts.map +1 -0
  92. package/dist/projection/annotation-projector.js +98 -0
  93. package/dist/projection/annotation-projector.js.map +1 -0
  94. package/dist/projection/built-in-entity-projectors.d.ts +7 -0
  95. package/dist/projection/built-in-entity-projectors.d.ts.map +1 -0
  96. package/dist/projection/built-in-entity-projectors.js +75 -0
  97. package/dist/projection/built-in-entity-projectors.js.map +1 -0
  98. package/dist/projection/camera-entity-factory.d.ts +9 -0
  99. package/dist/projection/camera-entity-factory.d.ts.map +1 -0
  100. package/dist/projection/camera-entity-factory.js +93 -0
  101. package/dist/projection/camera-entity-factory.js.map +1 -0
  102. package/dist/projection/document-applier.d.ts +38 -0
  103. package/dist/projection/document-applier.d.ts.map +1 -0
  104. package/dist/projection/document-applier.js +219 -0
  105. package/dist/projection/document-applier.js.map +1 -0
  106. package/dist/projection/entity-projection-registry.d.ts +56 -0
  107. package/dist/projection/entity-projection-registry.d.ts.map +1 -0
  108. package/dist/projection/entity-projection-registry.js +121 -0
  109. package/dist/projection/entity-projection-registry.js.map +1 -0
  110. package/dist/projection/model-importer.d.ts +41 -0
  111. package/dist/projection/model-importer.d.ts.map +1 -0
  112. package/dist/projection/model-importer.js +469 -0
  113. package/dist/projection/model-importer.js.map +1 -0
  114. package/dist/projection/particle-capability.d.ts +5 -0
  115. package/dist/projection/particle-capability.d.ts.map +1 -0
  116. package/dist/projection/particle-capability.js +2 -0
  117. package/dist/projection/particle-capability.js.map +1 -0
  118. package/dist/projection/particle-factory.d.ts +18 -0
  119. package/dist/projection/particle-factory.d.ts.map +1 -0
  120. package/dist/projection/particle-factory.js +313 -0
  121. package/dist/projection/particle-factory.js.map +1 -0
  122. package/dist/projection/primitive-factory.d.ts +5 -0
  123. package/dist/projection/primitive-factory.d.ts.map +1 -0
  124. package/dist/projection/primitive-factory.js +55 -0
  125. package/dist/projection/primitive-factory.js.map +1 -0
  126. package/dist/projection/procedural-factory.d.ts +6 -0
  127. package/dist/projection/procedural-factory.d.ts.map +1 -0
  128. package/dist/projection/procedural-factory.js +34 -0
  129. package/dist/projection/procedural-factory.js.map +1 -0
  130. package/dist/projection/runtime-projection-state.d.ts +19 -0
  131. package/dist/projection/runtime-projection-state.d.ts.map +1 -0
  132. package/dist/projection/runtime-projection-state.js +58 -0
  133. package/dist/projection/runtime-projection-state.js.map +1 -0
  134. package/dist/projection/shape-factory.d.ts +5 -0
  135. package/dist/projection/shape-factory.d.ts.map +1 -0
  136. package/dist/projection/shape-factory.js +101 -0
  137. package/dist/projection/shape-factory.js.map +1 -0
  138. package/dist/projection-entry.d.ts +10 -0
  139. package/dist/projection-entry.d.ts.map +1 -0
  140. package/dist/projection-entry.js +8 -0
  141. package/dist/projection-entry.js.map +1 -0
  142. package/dist/simulation/fixed-step-scheduler.d.ts +13 -0
  143. package/dist/simulation/fixed-step-scheduler.d.ts.map +1 -0
  144. package/dist/simulation/fixed-step-scheduler.js +45 -0
  145. package/dist/simulation/fixed-step-scheduler.js.map +1 -0
  146. package/dist/simulation/simulation-runtime-model.d.ts +24 -0
  147. package/dist/simulation/simulation-runtime-model.d.ts.map +1 -0
  148. package/dist/simulation/simulation-runtime-model.js +63 -0
  149. package/dist/simulation/simulation-runtime-model.js.map +1 -0
  150. package/dist/simulation/simulation-wgsl.d.ts +3 -0
  151. package/dist/simulation/simulation-wgsl.d.ts.map +1 -0
  152. package/dist/simulation/simulation-wgsl.js +294 -0
  153. package/dist/simulation/simulation-wgsl.js.map +1 -0
  154. package/dist/simulation/webgpu-simulation-renderer.d.ts +67 -0
  155. package/dist/simulation/webgpu-simulation-renderer.d.ts.map +1 -0
  156. package/dist/simulation/webgpu-simulation-renderer.js +504 -0
  157. package/dist/simulation/webgpu-simulation-renderer.js.map +1 -0
  158. package/dist/simulation/webgpu-types.d.ts +90 -0
  159. package/dist/simulation/webgpu-types.d.ts.map +1 -0
  160. package/dist/simulation/webgpu-types.js +10 -0
  161. package/dist/simulation/webgpu-types.js.map +1 -0
  162. package/dist/simulation.d.ts +4 -0
  163. package/dist/simulation.d.ts.map +1 -0
  164. package/dist/simulation.js +4 -0
  165. package/dist/simulation.js.map +1 -0
  166. package/dist/systems/animation-controller.d.ts +52 -0
  167. package/dist/systems/animation-controller.d.ts.map +1 -0
  168. package/dist/systems/animation-controller.js +146 -0
  169. package/dist/systems/animation-controller.js.map +1 -0
  170. package/dist/systems/camera-controller.d.ts +41 -0
  171. package/dist/systems/camera-controller.d.ts.map +1 -0
  172. package/dist/systems/camera-controller.js +207 -0
  173. package/dist/systems/camera-controller.js.map +1 -0
  174. package/dist/systems/camera-path-controller.d.ts +39 -0
  175. package/dist/systems/camera-path-controller.d.ts.map +1 -0
  176. package/dist/systems/camera-path-controller.js +287 -0
  177. package/dist/systems/camera-path-controller.js.map +1 -0
  178. package/dist/systems/environment-controller.d.ts +18 -0
  179. package/dist/systems/environment-controller.d.ts.map +1 -0
  180. package/dist/systems/environment-controller.js +251 -0
  181. package/dist/systems/environment-controller.js.map +1 -0
  182. package/dist/systems/environment-texture.d.ts +7 -0
  183. package/dist/systems/environment-texture.d.ts.map +1 -0
  184. package/dist/systems/environment-texture.js +57 -0
  185. package/dist/systems/environment-texture.js.map +1 -0
  186. package/dist/systems/fog-controller.d.ts +12 -0
  187. package/dist/systems/fog-controller.d.ts.map +1 -0
  188. package/dist/systems/fog-controller.js +60 -0
  189. package/dist/systems/fog-controller.js.map +1 -0
  190. package/dist/systems/generated-texture-cache.d.ts +33 -0
  191. package/dist/systems/generated-texture-cache.d.ts.map +1 -0
  192. package/dist/systems/generated-texture-cache.js +101 -0
  193. package/dist/systems/generated-texture-cache.js.map +1 -0
  194. package/dist/systems/glass-transmission-controller.d.ts +21 -0
  195. package/dist/systems/glass-transmission-controller.d.ts.map +1 -0
  196. package/dist/systems/glass-transmission-controller.js +119 -0
  197. package/dist/systems/glass-transmission-controller.js.map +1 -0
  198. package/dist/systems/gpu-program-cache.d.ts +19 -0
  199. package/dist/systems/gpu-program-cache.d.ts.map +1 -0
  200. package/dist/systems/gpu-program-cache.js +95 -0
  201. package/dist/systems/gpu-program-cache.js.map +1 -0
  202. package/dist/systems/ground-controller.d.ts +14 -0
  203. package/dist/systems/ground-controller.d.ts.map +1 -0
  204. package/dist/systems/ground-controller.js +121 -0
  205. package/dist/systems/ground-controller.js.map +1 -0
  206. package/dist/systems/lighting-controller.d.ts +23 -0
  207. package/dist/systems/lighting-controller.d.ts.map +1 -0
  208. package/dist/systems/lighting-controller.js +204 -0
  209. package/dist/systems/lighting-controller.js.map +1 -0
  210. package/dist/systems/material-animation-controller.d.ts +26 -0
  211. package/dist/systems/material-animation-controller.d.ts.map +1 -0
  212. package/dist/systems/material-animation-controller.js +221 -0
  213. package/dist/systems/material-animation-controller.js.map +1 -0
  214. package/dist/systems/material-binding-resolver.d.ts +16 -0
  215. package/dist/systems/material-binding-resolver.d.ts.map +1 -0
  216. package/dist/systems/material-binding-resolver.js +54 -0
  217. package/dist/systems/material-binding-resolver.js.map +1 -0
  218. package/dist/systems/material-controller.d.ts +29 -0
  219. package/dist/systems/material-controller.d.ts.map +1 -0
  220. package/dist/systems/material-controller.js +233 -0
  221. package/dist/systems/material-controller.js.map +1 -0
  222. package/dist/systems/material-preparation.d.ts +9 -0
  223. package/dist/systems/material-preparation.d.ts.map +1 -0
  224. package/dist/systems/material-preparation.js +51 -0
  225. package/dist/systems/material-preparation.js.map +1 -0
  226. package/dist/systems/material-slots.d.ts +18 -0
  227. package/dist/systems/material-slots.d.ts.map +1 -0
  228. package/dist/systems/material-slots.js +78 -0
  229. package/dist/systems/material-slots.js.map +1 -0
  230. package/dist/systems/owned-material-controller.d.ts +20 -0
  231. package/dist/systems/owned-material-controller.d.ts.map +1 -0
  232. package/dist/systems/owned-material-controller.js +611 -0
  233. package/dist/systems/owned-material-controller.js.map +1 -0
  234. package/dist/systems/pbr-material.d.ts +22 -0
  235. package/dist/systems/pbr-material.d.ts.map +1 -0
  236. package/dist/systems/pbr-material.js +358 -0
  237. package/dist/systems/pbr-material.js.map +1 -0
  238. package/dist/systems/post-process-controller.d.ts +17 -0
  239. package/dist/systems/post-process-controller.d.ts.map +1 -0
  240. package/dist/systems/post-process-controller.js +246 -0
  241. package/dist/systems/post-process-controller.js.map +1 -0
  242. package/dist/systems/runtime-clock.d.ts +9 -0
  243. package/dist/systems/runtime-clock.d.ts.map +1 -0
  244. package/dist/systems/runtime-clock.js +25 -0
  245. package/dist/systems/runtime-clock.js.map +1 -0
  246. package/dist/systems/skybox-controller.d.ts +15 -0
  247. package/dist/systems/skybox-controller.d.ts.map +1 -0
  248. package/dist/systems/skybox-controller.js +282 -0
  249. package/dist/systems/skybox-controller.js.map +1 -0
  250. package/dist/systems/sprite-sheet-controller.d.ts +52 -0
  251. package/dist/systems/sprite-sheet-controller.d.ts.map +1 -0
  252. package/dist/systems/sprite-sheet-controller.js +187 -0
  253. package/dist/systems/sprite-sheet-controller.js.map +1 -0
  254. package/dist/systems/surface-effect-plugin.d.ts +26 -0
  255. package/dist/systems/surface-effect-plugin.d.ts.map +1 -0
  256. package/dist/systems/surface-effect-plugin.js +204 -0
  257. package/dist/systems/surface-effect-plugin.js.map +1 -0
  258. package/dist/systems/surface-program-plugin.d.ts +29 -0
  259. package/dist/systems/surface-program-plugin.d.ts.map +1 -0
  260. package/dist/systems/surface-program-plugin.js +139 -0
  261. package/dist/systems/surface-program-plugin.js.map +1 -0
  262. package/dist/systems/texture-animation-controller.d.ts +18 -0
  263. package/dist/systems/texture-animation-controller.d.ts.map +1 -0
  264. package/dist/systems/texture-animation-controller.js +147 -0
  265. package/dist/systems/texture-animation-controller.js.map +1 -0
  266. package/dist/systems/weather-controller.d.ts +16 -0
  267. package/dist/systems/weather-controller.d.ts.map +1 -0
  268. package/dist/systems/weather-controller.js +205 -0
  269. package/dist/systems/weather-controller.js.map +1 -0
  270. package/package.json +63 -0
@@ -0,0 +1,205 @@
1
+ /** Editor-only pointer drawing controller. */
2
+ import { PointerEventTypes, } from "@babylonjs/core/Events/pointerEvents";
3
+ import { Color3 } from "@babylonjs/core/Maths/math.color";
4
+ import { Plane } from "@babylonjs/core/Maths/math.plane";
5
+ import { Matrix, Vector3 } from "@babylonjs/core/Maths/math.vector";
6
+ import { MeshBuilder } from "@babylonjs/core/Meshes/meshBuilder";
7
+ /** Pointer-driven polygon/polyline capture independent of React and editor state. */
8
+ export class ShapeDrawingController {
9
+ scene;
10
+ #options = null;
11
+ #points = [];
12
+ #cursor = null;
13
+ #preview = null;
14
+ #active = false;
15
+ #disposed = false;
16
+ constructor(scene) {
17
+ this.scene = scene;
18
+ }
19
+ get active() {
20
+ return this.#active;
21
+ }
22
+ get points() {
23
+ return this.#points.map(toValue);
24
+ }
25
+ begin(options = {}) {
26
+ this.#assertActive();
27
+ this.cancel(false);
28
+ this.#options = options;
29
+ this.#active = true;
30
+ this.scene.onPointerObservable.add(this.#onPointer);
31
+ }
32
+ addPoint(point) {
33
+ this.#assertDrawing();
34
+ const next = this.#constrainAndSnap(new Vector3(point.x, point.y, point.z));
35
+ if (this.#shouldClose(next)) {
36
+ this.complete();
37
+ return;
38
+ }
39
+ this.#points.push(next);
40
+ this.#cursor = next.clone();
41
+ this.#updatePreview();
42
+ }
43
+ setCursor(point) {
44
+ this.#assertDrawing();
45
+ this.#cursor = this.#constrainAndSnap(new Vector3(point.x, point.y, point.z));
46
+ this.#updatePreview();
47
+ }
48
+ undoPoint() {
49
+ this.#assertDrawing();
50
+ if (this.#points.length === 0)
51
+ return false;
52
+ this.#points.pop();
53
+ this.#updatePreview();
54
+ return true;
55
+ }
56
+ complete() {
57
+ this.#assertDrawing();
58
+ const closed = this.#options?.closed ?? true;
59
+ const minimum = closed ? 3 : 2;
60
+ if (this.#points.length < minimum)
61
+ return null;
62
+ const result = {
63
+ points: this.#points.map(toValue),
64
+ closed,
65
+ };
66
+ const callback = this.#options?.onComplete;
67
+ this.#stop();
68
+ callback?.(result);
69
+ return result;
70
+ }
71
+ cancel(notify = true) {
72
+ if (!this.#active)
73
+ return;
74
+ const callback = this.#options?.onCancel;
75
+ this.#stop();
76
+ if (notify)
77
+ callback?.();
78
+ }
79
+ dispose() {
80
+ if (this.#disposed)
81
+ return;
82
+ this.cancel(false);
83
+ this.#disposed = true;
84
+ }
85
+ #onPointer = (pointer) => {
86
+ if (!this.#active)
87
+ return;
88
+ if (pointer.type === PointerEventTypes.POINTERMOVE) {
89
+ const point = this.#pointFromPointer();
90
+ if (point)
91
+ this.setCursor(point);
92
+ return;
93
+ }
94
+ if (pointer.type !== PointerEventTypes.POINTERDOWN)
95
+ return;
96
+ const event = pointer.event;
97
+ if (event.button === 2) {
98
+ event.preventDefault();
99
+ this.complete();
100
+ return;
101
+ }
102
+ if (event.button !== 0)
103
+ return;
104
+ const point = this.#pointFromPointer();
105
+ if (!point)
106
+ return;
107
+ this.addPoint(point);
108
+ if (event.detail >= 2)
109
+ this.complete();
110
+ };
111
+ #pointFromPointer() {
112
+ const camera = this.scene.activeCamera;
113
+ if (!camera || !this.#options)
114
+ return null;
115
+ const ray = this.scene.createPickingRay(this.scene.pointerX, this.scene.pointerY, Matrix.Identity(), camera, false);
116
+ const plane = drawingPlane(this.#options.plane ?? "xz", this.#options.planeOffset ?? 0);
117
+ const distance = ray.intersectsPlane(plane);
118
+ return distance === null
119
+ ? null
120
+ : ray.origin.add(ray.direction.scale(distance));
121
+ }
122
+ #constrainAndSnap(point) {
123
+ const result = point.clone();
124
+ const last = this.#points.at(-1);
125
+ const constraint = this.#options?.axisConstraint ?? "none";
126
+ if (last && constraint !== "none") {
127
+ if (constraint !== "x")
128
+ result.x = last.x;
129
+ if (constraint !== "y")
130
+ result.y = last.y;
131
+ if (constraint !== "z")
132
+ result.z = last.z;
133
+ }
134
+ const snap = this.#options?.snap ?? 0;
135
+ if (snap > 0) {
136
+ result.x = Math.round(result.x / snap) * snap;
137
+ result.y = Math.round(result.y / snap) * snap;
138
+ result.z = Math.round(result.z / snap) * snap;
139
+ }
140
+ return result;
141
+ }
142
+ #shouldClose(point) {
143
+ if (!(this.#options?.closed ?? true) || this.#points.length < 3) {
144
+ return false;
145
+ }
146
+ const first = this.#points[0];
147
+ return Boolean(first &&
148
+ Vector3.Distance(first, point) <= (this.#options?.closeDistance ?? 0.15));
149
+ }
150
+ #updatePreview() {
151
+ if (!this.#options)
152
+ return;
153
+ const points = [...this.#points];
154
+ if (this.#cursor && points.length > 0)
155
+ points.push(this.#cursor);
156
+ if ((this.#options.closed ?? true) && points.length > 2 && points[0]) {
157
+ points.push(points[0]);
158
+ }
159
+ if (points.length === 1 && points[0])
160
+ points.push(points[0].clone());
161
+ if (points.length >= 2) {
162
+ this.#preview?.dispose();
163
+ this.#preview = MeshBuilder.CreateLines("skenora-shape-drawing-preview", {
164
+ points,
165
+ }, this.scene);
166
+ this.#preview.color =
167
+ this.#options.strokeColor ?? new Color3(0.2, 0.65, 1);
168
+ this.#preview.isPickable = false;
169
+ this.#preview.metadata = { skenora: { helper: "shape-preview" } };
170
+ }
171
+ this.#options.onPreview?.(this.#points.map(toValue));
172
+ }
173
+ #stop() {
174
+ this.scene.onPointerObservable.removeCallback(this.#onPointer);
175
+ this.#preview?.dispose();
176
+ this.#preview = null;
177
+ this.#points = [];
178
+ this.#cursor = null;
179
+ this.#options = null;
180
+ this.#active = false;
181
+ }
182
+ #assertDrawing() {
183
+ this.#assertActive();
184
+ if (!this.#active)
185
+ throw new Error("Shape drawing has not started");
186
+ }
187
+ #assertActive() {
188
+ if (this.#disposed) {
189
+ throw new Error("ShapeDrawingController has been disposed");
190
+ }
191
+ }
192
+ }
193
+ function drawingPlane(type, offset) {
194
+ if (type === "xy") {
195
+ return Plane.FromPositionAndNormal(new Vector3(0, 0, offset), Vector3.Forward());
196
+ }
197
+ if (type === "yz") {
198
+ return Plane.FromPositionAndNormal(new Vector3(offset, 0, 0), Vector3.Right());
199
+ }
200
+ return Plane.FromPositionAndNormal(new Vector3(0, offset, 0), Vector3.Up());
201
+ }
202
+ function toValue(value) {
203
+ return { x: value.x, y: value.y, z: value.z };
204
+ }
205
+ //# sourceMappingURL=shape-drawing-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-drawing-controller.js","sourceRoot":"","sources":["../../src/editor-tools/shape-drawing-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { Color3 } from "@babylonjs/core/Maths/math.color";
2
+ import type { TransformNode } from "@babylonjs/core/Meshes/transformNode";
3
+ import type { Scene } from "@babylonjs/core/scene";
4
+ import type { Vector3Value } from "@skenora/contracts";
5
+ import type { DrawingPlane } from "./shape-drawing-controller.js";
6
+ export type ShapeEditPhase = "preview" | "commit" | "cancel";
7
+ export interface ShapeEditingOptions {
8
+ plane?: DrawingPlane;
9
+ closed?: boolean;
10
+ snap?: number;
11
+ handleDiameter?: number;
12
+ handleColor?: Color3;
13
+ selectedColor?: Color3;
14
+ lineColor?: Color3;
15
+ onChange?: (points: readonly Vector3Value[], phase: ShapeEditPhase) => void;
16
+ onSelectionChange?: (index: number | null) => void;
17
+ }
18
+ /**
19
+ * Local-space control-point editor for polygon, polyline, wall and tube paths.
20
+ * The host decides how preview/commit events are persisted.
21
+ */
22
+ export declare class ShapeEditingController {
23
+ #private;
24
+ readonly scene: Scene;
25
+ constructor(scene: Scene);
26
+ get active(): boolean;
27
+ get points(): readonly Vector3Value[];
28
+ get selectedIndex(): number | null;
29
+ begin(target: TransformNode, points: readonly Vector3Value[], options?: ShapeEditingOptions): void;
30
+ setPoints(points: readonly Vector3Value[]): void;
31
+ movePoint(index: number, point: Vector3Value): void;
32
+ addPoint(point: Vector3Value, index?: number): number;
33
+ insertPointOnNearestEdge(point: Vector3Value): number;
34
+ removePoint(index: number): boolean;
35
+ selectPoint(index: number | null): boolean;
36
+ commit(): readonly Vector3Value[];
37
+ cancel(): void;
38
+ dispose(): void;
39
+ }
40
+ //# sourceMappingURL=shape-editing-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-editing-controller.d.ts","sourceRoot":"","sources":["../../src/editor-tools/shape-editing-controller.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAO1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC5E,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACpD;AAED;;;GAGG;AACH,qBAAa,sBAAsB;;IACjC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;gBAcV,KAAK,EAAE,KAAK;IAIxB,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,MAAM,IAAI,SAAS,YAAY,EAAE,CAEpC;IAED,IAAI,aAAa,IAAI,MAAM,GAAG,IAAI,CAEjC;IAED,KAAK,CACH,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,OAAO,GAAE,mBAAwB,GAChC,IAAI;IAgBP,SAAS,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI;IAchD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IASnD,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,SAAsB,GAAG,MAAM;IAUlE,wBAAwB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM;IAWrD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAYnC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAe1C,MAAM,IAAI,SAAS,YAAY,EAAE;IAQjC,MAAM,IAAI,IAAI;IAOd,OAAO,IAAI,IAAI;CAuLhB"}
@@ -0,0 +1,340 @@
1
+ /** Editor-only shape control-point controller. */
2
+ import { PointerEventTypes, } from "@babylonjs/core/Events/pointerEvents";
3
+ import { StandardMaterial } from "@babylonjs/core/Materials/standardMaterial";
4
+ import { Color3 } from "@babylonjs/core/Maths/math.color";
5
+ import { Plane } from "@babylonjs/core/Maths/math.plane";
6
+ import { Matrix, Vector3 } from "@babylonjs/core/Maths/math.vector";
7
+ import { Mesh } from "@babylonjs/core/Meshes/mesh";
8
+ import { MeshBuilder } from "@babylonjs/core/Meshes/meshBuilder";
9
+ /**
10
+ * Local-space control-point editor for polygon, polyline, wall and tube paths.
11
+ * The host decides how preview/commit events are persisted.
12
+ */
13
+ export class ShapeEditingController {
14
+ scene;
15
+ #handles = [];
16
+ #target = null;
17
+ #points = [];
18
+ #originalPoints = [];
19
+ #options = {};
20
+ #line = null;
21
+ #handleMaterial = null;
22
+ #selectedMaterial = null;
23
+ #selectedIndex = null;
24
+ #draggingIndex = null;
25
+ #active = false;
26
+ #disposed = false;
27
+ constructor(scene) {
28
+ this.scene = scene;
29
+ }
30
+ get active() {
31
+ return this.#active;
32
+ }
33
+ get points() {
34
+ return this.#points.map(toValue);
35
+ }
36
+ get selectedIndex() {
37
+ return this.#selectedIndex;
38
+ }
39
+ begin(target, points, options = {}) {
40
+ this.#assertUsable();
41
+ this.#stop();
42
+ if (points.length < (options.closed === false ? 2 : 3)) {
43
+ throw new Error("Shape does not have enough points to edit");
44
+ }
45
+ this.#target = target;
46
+ this.#points = points.map(toVector);
47
+ this.#originalPoints = points.map(toVector);
48
+ this.#options = options;
49
+ this.#createMaterials();
50
+ this.#active = true;
51
+ this.#rebuildHelpers();
52
+ this.scene.onPointerObservable.add(this.#onPointer);
53
+ }
54
+ setPoints(points) {
55
+ this.#assertEditing();
56
+ const minimum = this.#minimumPoints();
57
+ if (points.length < minimum) {
58
+ throw new Error(`Shape requires at least ${minimum} points`);
59
+ }
60
+ this.#points = points.map(toVector);
61
+ if (this.#selectedIndex !== null && !this.#points[this.#selectedIndex]) {
62
+ this.selectPoint(null);
63
+ }
64
+ this.#rebuildHelpers();
65
+ this.#emit("preview");
66
+ }
67
+ movePoint(index, point) {
68
+ this.#assertEditing();
69
+ if (!this.#points[index])
70
+ throw new Error(`Shape point not found: ${index}`);
71
+ this.#points[index] = this.#snap(toVector(point));
72
+ this.#syncHelpers();
73
+ this.#emit("preview");
74
+ }
75
+ addPoint(point, index = this.#points.length) {
76
+ this.#assertEditing();
77
+ const insertion = Math.max(0, Math.min(this.#points.length, index));
78
+ this.#points.splice(insertion, 0, this.#snap(toVector(point)));
79
+ this.#rebuildHelpers();
80
+ this.selectPoint(insertion);
81
+ this.#emit("preview");
82
+ return insertion;
83
+ }
84
+ insertPointOnNearestEdge(point) {
85
+ this.#assertEditing();
86
+ const candidate = this.#snap(toVector(point));
87
+ const edge = nearestEdge(this.#points, candidate, this.#options.closed ?? true);
88
+ return this.addPoint(toValue(edge.projection), edge.index + 1);
89
+ }
90
+ removePoint(index) {
91
+ this.#assertEditing();
92
+ if (!this.#points[index] || this.#points.length <= this.#minimumPoints()) {
93
+ return false;
94
+ }
95
+ this.#points.splice(index, 1);
96
+ this.#rebuildHelpers();
97
+ this.selectPoint(null);
98
+ this.#emit("preview");
99
+ return true;
100
+ }
101
+ selectPoint(index) {
102
+ this.#assertEditing();
103
+ if (index !== null && !this.#points[index])
104
+ return false;
105
+ this.#selectedIndex = index;
106
+ for (const [handleIndex, handle] of this.#handles.entries()) {
107
+ const selected = handleIndex === index;
108
+ handle.material = selected
109
+ ? this.#selectedMaterial
110
+ : this.#handleMaterial;
111
+ handle.scaling.setAll(selected ? 1.25 : 1);
112
+ }
113
+ this.#options.onSelectionChange?.(index);
114
+ return true;
115
+ }
116
+ commit() {
117
+ this.#assertEditing();
118
+ const result = this.points;
119
+ this.#options.onChange?.(result, "commit");
120
+ this.#stop();
121
+ return result;
122
+ }
123
+ cancel() {
124
+ if (!this.#active)
125
+ return;
126
+ const original = this.#originalPoints.map(toValue);
127
+ this.#options.onChange?.(original, "cancel");
128
+ this.#stop();
129
+ }
130
+ dispose() {
131
+ if (this.#disposed)
132
+ return;
133
+ this.#stop();
134
+ this.#disposed = true;
135
+ }
136
+ #onPointer = (pointer) => {
137
+ if (!this.#active)
138
+ return;
139
+ if (pointer.type === PointerEventTypes.POINTERDOWN) {
140
+ const index = readHandleIndex(pointer.pickInfo?.pickedMesh);
141
+ if (index === null)
142
+ return;
143
+ this.#draggingIndex = index;
144
+ this.selectPoint(index);
145
+ return;
146
+ }
147
+ if (pointer.type === PointerEventTypes.POINTERUP) {
148
+ if (this.#draggingIndex !== null)
149
+ this.#emit("commit");
150
+ this.#draggingIndex = null;
151
+ return;
152
+ }
153
+ if (pointer.type !== PointerEventTypes.POINTERMOVE ||
154
+ this.#draggingIndex === null) {
155
+ return;
156
+ }
157
+ const point = this.#localPointFromPointer();
158
+ if (!point)
159
+ return;
160
+ this.#points[this.#draggingIndex] = this.#snap(point);
161
+ this.#syncHelpers();
162
+ this.#emit("preview");
163
+ };
164
+ #localPointFromPointer() {
165
+ const target = this.#target;
166
+ const camera = this.scene.activeCamera;
167
+ if (!target || !camera)
168
+ return null;
169
+ const world = target.computeWorldMatrix(true);
170
+ const localNormal = planeNormal(this.#options.plane ?? "xz");
171
+ const worldOrigin = Vector3.TransformCoordinates(Vector3.Zero(), world);
172
+ const worldNormal = Vector3.TransformNormal(localNormal, world).normalize();
173
+ const plane = Plane.FromPositionAndNormal(worldOrigin, worldNormal);
174
+ const ray = this.scene.createPickingRay(this.scene.pointerX, this.scene.pointerY, Matrix.Identity(), camera, false);
175
+ const distance = ray.intersectsPlane(plane);
176
+ if (distance === null)
177
+ return null;
178
+ const worldPoint = ray.origin.add(ray.direction.scale(distance));
179
+ return Vector3.TransformCoordinates(worldPoint, Matrix.Invert(world));
180
+ }
181
+ #createMaterials() {
182
+ this.#handleMaterial = new StandardMaterial("skenora-shape-control-material", this.scene);
183
+ this.#handleMaterial.disableLighting = true;
184
+ this.#handleMaterial.emissiveColor =
185
+ this.#options.handleColor?.clone() ?? new Color3(0.2, 0.7, 1);
186
+ this.#selectedMaterial = new StandardMaterial("skenora-shape-control-selected-material", this.scene);
187
+ this.#selectedMaterial.disableLighting = true;
188
+ this.#selectedMaterial.emissiveColor =
189
+ this.#options.selectedColor?.clone() ?? new Color3(1, 0.55, 0.05);
190
+ }
191
+ #rebuildHelpers() {
192
+ this.#clearGeometry();
193
+ const target = this.#target;
194
+ if (!target)
195
+ return;
196
+ for (const [index, point] of this.#points.entries()) {
197
+ const handle = MeshBuilder.CreateSphere(`skenora-shape-control-${index}`, {
198
+ diameter: this.#options.handleDiameter ?? 0.16,
199
+ segments: 12,
200
+ }, this.scene);
201
+ handle.parent = target;
202
+ handle.position.copyFrom(point);
203
+ handle.material =
204
+ index === this.#selectedIndex
205
+ ? this.#selectedMaterial
206
+ : this.#handleMaterial;
207
+ handle.isPickable = true;
208
+ handle.renderingGroupId = 2;
209
+ handle.metadata = {
210
+ skenora: { helper: "shape-control", pointIndex: index },
211
+ };
212
+ this.#handles.push(handle);
213
+ }
214
+ this.#rebuildLine();
215
+ }
216
+ #syncHelpers() {
217
+ for (const [index, handle] of this.#handles.entries()) {
218
+ const point = this.#points[index];
219
+ if (point)
220
+ handle.position.copyFrom(point);
221
+ }
222
+ this.#rebuildLine();
223
+ }
224
+ #rebuildLine() {
225
+ this.#line?.dispose();
226
+ this.#line = null;
227
+ const target = this.#target;
228
+ if (!target || this.#points.length < 2)
229
+ return;
230
+ const points = this.#points.map((point) => point.clone());
231
+ if ((this.#options.closed ?? true) && points[0]) {
232
+ points.push(points[0].clone());
233
+ }
234
+ this.#line = MeshBuilder.CreateLines("skenora-shape-edit-line", { points }, this.scene);
235
+ this.#line.parent = target;
236
+ this.#line.color =
237
+ this.#options.lineColor?.clone() ?? new Color3(0.95, 0.95, 1);
238
+ this.#line.isPickable = false;
239
+ this.#line.renderingGroupId = 2;
240
+ this.#line.metadata = { skenora: { helper: "shape-edit-line" } };
241
+ }
242
+ #snap(point) {
243
+ const snap = this.#options.snap ?? 0;
244
+ if (snap <= 0)
245
+ return point;
246
+ point.x = Math.round(point.x / snap) * snap;
247
+ point.y = Math.round(point.y / snap) * snap;
248
+ point.z = Math.round(point.z / snap) * snap;
249
+ return point;
250
+ }
251
+ #minimumPoints() {
252
+ return this.#options.closed === false ? 2 : 3;
253
+ }
254
+ #emit(phase) {
255
+ this.#options.onChange?.(this.points, phase);
256
+ }
257
+ #clearGeometry() {
258
+ for (const handle of this.#handles)
259
+ handle.dispose();
260
+ this.#handles.length = 0;
261
+ this.#line?.dispose();
262
+ this.#line = null;
263
+ }
264
+ #stop() {
265
+ if (this.#active) {
266
+ this.scene.onPointerObservable.removeCallback(this.#onPointer);
267
+ }
268
+ this.#clearGeometry();
269
+ this.#handleMaterial?.dispose();
270
+ this.#selectedMaterial?.dispose();
271
+ this.#handleMaterial = null;
272
+ this.#selectedMaterial = null;
273
+ this.#target = null;
274
+ this.#points = [];
275
+ this.#originalPoints = [];
276
+ this.#options = {};
277
+ this.#selectedIndex = null;
278
+ this.#draggingIndex = null;
279
+ this.#active = false;
280
+ }
281
+ #assertEditing() {
282
+ this.#assertUsable();
283
+ if (!this.#active)
284
+ throw new Error("Shape editing has not started");
285
+ }
286
+ #assertUsable() {
287
+ if (this.#disposed) {
288
+ throw new Error("ShapeEditingController has been disposed");
289
+ }
290
+ }
291
+ }
292
+ function nearestEdge(points, candidate, closed) {
293
+ let nearest = null;
294
+ let nearestDistance = Number.POSITIVE_INFINITY;
295
+ const edgeCount = closed ? points.length : points.length - 1;
296
+ for (let index = 0; index < edgeCount; index += 1) {
297
+ const start = points[index];
298
+ const end = points[(index + 1) % points.length];
299
+ if (!start || !end)
300
+ continue;
301
+ const projection = projectToSegment(candidate, start, end);
302
+ const distance = Vector3.DistanceSquared(candidate, projection);
303
+ if (distance >= nearestDistance)
304
+ continue;
305
+ nearestDistance = distance;
306
+ nearest = { index, projection };
307
+ }
308
+ if (!nearest)
309
+ throw new Error("Shape has no editable edge");
310
+ return nearest;
311
+ }
312
+ function projectToSegment(point, start, end) {
313
+ const segment = end.subtract(start);
314
+ const lengthSquared = segment.lengthSquared();
315
+ if (lengthSquared === 0)
316
+ return start.clone();
317
+ const amount = Math.max(0, Math.min(1, Vector3.Dot(point.subtract(start), segment) / lengthSquared));
318
+ return start.add(segment.scale(amount));
319
+ }
320
+ function readHandleIndex(mesh) {
321
+ const value = mesh?.metadata?.skenora;
322
+ return value?.helper === "shape-control" &&
323
+ typeof value.pointIndex === "number"
324
+ ? value.pointIndex
325
+ : null;
326
+ }
327
+ function planeNormal(plane) {
328
+ if (plane === "xy")
329
+ return Vector3.Forward();
330
+ if (plane === "yz")
331
+ return Vector3.Right();
332
+ return Vector3.Up();
333
+ }
334
+ function toVector(value) {
335
+ return new Vector3(value.x, value.y, value.z);
336
+ }
337
+ function toValue(value) {
338
+ return { x: value.x, y: value.y, z: value.z };
339
+ }
340
+ //# sourceMappingURL=shape-editing-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-editing-controller.js","sourceRoot":"","sources":["../../src/editor-tools/shape-editing-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export * from "./editor-tools/camera-path-editing-controller.js";
2
+ export * from "./editor-tools/camera-path-visualizer.js";
3
+ export * from "./editor-tools/drop-preview-controller.js";
4
+ export * from "./editor-tools/grid-helper.js";
5
+ export * from "./editor-tools/light-editing-controller.js";
6
+ export * from "./editor-tools/node-operations.js";
7
+ export * from "./editor-tools/selection-controller.js";
8
+ export * from "./editor-tools/shape-drawing-controller.js";
9
+ export * from "./editor-tools/shape-editing-controller.js";
10
+ export * from "./inspection/node-tools.js";
11
+ export { isTransformNode } from "./projection/model-importer.js";
12
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAAA,cAAc,+CAA+C,CAAC;AAC9D,cAAc,uCAAuC,CAAC;AACtD,cAAc,wCAAwC,CAAC;AACvD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yCAAyC,CAAC;AACxD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AACxD,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC"}
package/dist/editor.js ADDED
@@ -0,0 +1,12 @@
1
+ export * from "./editor-tools/camera-path-editing-controller.js";
2
+ export * from "./editor-tools/camera-path-visualizer.js";
3
+ export * from "./editor-tools/drop-preview-controller.js";
4
+ export * from "./editor-tools/grid-helper.js";
5
+ export * from "./editor-tools/light-editing-controller.js";
6
+ export * from "./editor-tools/node-operations.js";
7
+ export * from "./editor-tools/selection-controller.js";
8
+ export * from "./editor-tools/shape-drawing-controller.js";
9
+ export * from "./editor-tools/shape-editing-controller.js";
10
+ export * from "./inspection/node-tools.js";
11
+ export { isTransformNode } from "./projection/model-importer.js";
12
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAAA,cAAc,+CAA+C,CAAC;AAC9D,cAAc,uCAAuC,CAAC;AACtD,cAAc,wCAAwC,CAAC;AACvD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yCAAyC,CAAC;AACxD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AACxD,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./presentation/scene-renderer.js";
2
+ //# sourceMappingURL=index.d.ts.map