@hatiolab/things-scene 10.0.0-beta.9 → 10.0.0-beta.90

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 (274) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/dist-types/animation/animate.d.ts.map +1 -1
  3. package/dist-types/animation/animations/animation.d.ts.map +1 -1
  4. package/dist-types/animation/animations/heartbeat.d.ts +0 -7
  5. package/dist-types/animation/animations/heartbeat.d.ts.map +1 -1
  6. package/dist-types/animation/animations/waypoint.d.ts +45 -4
  7. package/dist-types/animation/animations/waypoint.d.ts.map +1 -1
  8. package/dist-types/animation/interfaces.d.ts +1 -1
  9. package/dist-types/animation/interfaces.d.ts.map +1 -1
  10. package/dist-types/command/command-migrate.d.ts.map +1 -1
  11. package/dist-types/command/snapshot-commander.d.ts.map +1 -1
  12. package/dist-types/components/audio.d.ts.map +1 -1
  13. package/dist-types/components/component-data.d.ts +24 -0
  14. package/dist-types/components/component-data.d.ts.map +1 -1
  15. package/dist-types/components/component.d.ts +5 -0
  16. package/dist-types/components/component.d.ts.map +1 -1
  17. package/dist-types/components/container-abstract.d.ts +34 -1
  18. package/dist-types/components/container-abstract.d.ts.map +1 -1
  19. package/dist-types/components/container.d.ts +1 -1
  20. package/dist-types/components/container.d.ts.map +1 -1
  21. package/dist-types/components/data/data.d.ts.map +1 -1
  22. package/dist-types/components/drawer/fill.d.ts.map +1 -1
  23. package/dist-types/components/drawer/stroke.d.ts.map +1 -1
  24. package/dist-types/components/generic-placeholders.d.ts +287 -0
  25. package/dist-types/components/generic-placeholders.d.ts.map +1 -0
  26. package/dist-types/components/geometry/snap-guide.d.ts +45 -0
  27. package/dist-types/components/geometry/snap-guide.d.ts.map +1 -0
  28. package/dist-types/components/geometry/transcoord.d.ts.map +1 -1
  29. package/dist-types/components/global-ref.d.ts.map +1 -1
  30. package/dist-types/components/group.d.ts +1 -0
  31. package/dist-types/components/group.d.ts.map +1 -1
  32. package/dist-types/components/html/shadow.d.ts +33 -1
  33. package/dist-types/components/html/shadow.d.ts.map +1 -1
  34. package/dist-types/components/html-overlay-container.d.ts +1 -1
  35. package/dist-types/components/html-overlay-container.d.ts.map +1 -1
  36. package/dist-types/components/html-overlay-element.d.ts.map +1 -1
  37. package/dist-types/components/image-view.d.ts.map +1 -1
  38. package/dist-types/components/index.d.ts +6 -0
  39. package/dist-types/components/index.d.ts.map +1 -1
  40. package/dist-types/components/line.d.ts +2 -1
  41. package/dist-types/components/line.d.ts.map +1 -1
  42. package/dist-types/components/mixins/gltf-component.d.ts +276 -0
  43. package/dist-types/components/mixins/gltf-component.d.ts.map +1 -0
  44. package/dist-types/components/mixins/html-element.d.ts.map +1 -1
  45. package/dist-types/components/mixins/move-handle.d.ts.map +1 -1
  46. package/dist-types/components/mixins/three-d-only.d.ts +243 -0
  47. package/dist-types/components/mixins/three-d-only.d.ts.map +1 -0
  48. package/dist-types/components/mixins/value-holder.d.ts.map +1 -1
  49. package/dist-types/components/mutater/path.d.ts.map +1 -1
  50. package/dist-types/components/popup-container.d.ts +25 -0
  51. package/dist-types/components/popup-container.d.ts.map +1 -0
  52. package/dist-types/components/popup.d.ts +30 -0
  53. package/dist-types/components/popup.d.ts.map +1 -1
  54. package/dist-types/components/position/popup-position.d.ts +11 -0
  55. package/dist-types/components/position/popup-position.d.ts.map +1 -1
  56. package/dist-types/components/root-container.d.ts +11 -4
  57. package/dist-types/components/root-container.d.ts.map +1 -1
  58. package/dist-types/components/service-component.d.ts +264 -0
  59. package/dist-types/components/service-component.d.ts.map +1 -0
  60. package/dist-types/decorator/decorator-registry.d.ts +4 -0
  61. package/dist-types/decorator/decorator-registry.d.ts.map +1 -1
  62. package/dist-types/decorator/decorators/animated-icon-decorator.d.ts.map +1 -1
  63. package/dist-types/decorator/decorators/data-spread-decorator.d.ts +16 -0
  64. package/dist-types/decorator/decorators/data-spread-decorator.d.ts.map +1 -1
  65. package/dist-types/diagnostics/data-lag-tracker.d.ts +44 -0
  66. package/dist-types/diagnostics/data-lag-tracker.d.ts.map +1 -0
  67. package/dist-types/diagnostics/inspector.d.ts +14 -4
  68. package/dist-types/diagnostics/inspector.d.ts.map +1 -1
  69. package/dist-types/diagnostics/load-tracker.d.ts +82 -0
  70. package/dist-types/diagnostics/load-tracker.d.ts.map +1 -0
  71. package/dist-types/diagnostics/loading-overlay.d.ts +41 -0
  72. package/dist-types/diagnostics/loading-overlay.d.ts.map +1 -0
  73. package/dist-types/effect/shadow.d.ts +3 -1
  74. package/dist-types/effect/shadow.d.ts.map +1 -1
  75. package/dist-types/event-map/index.d.ts +1 -0
  76. package/dist-types/event-map/index.d.ts.map +1 -1
  77. package/dist-types/event-map/transition-handler.d.ts +2 -0
  78. package/dist-types/event-map/transition-handler.d.ts.map +1 -0
  79. package/dist-types/interfaces/providers.d.ts +20 -3
  80. package/dist-types/interfaces/providers.d.ts.map +1 -1
  81. package/dist-types/interfaces/rendering.d.ts +86 -14
  82. package/dist-types/interfaces/rendering.d.ts.map +1 -1
  83. package/dist-types/layer/action/popup.d.ts +13 -0
  84. package/dist-types/layer/action/popup.d.ts.map +1 -1
  85. package/dist-types/layer/dual-canvas-layer.d.ts.map +1 -1
  86. package/dist-types/layer/index.d.ts +1 -0
  87. package/dist-types/layer/index.d.ts.map +1 -1
  88. package/dist-types/layer/layer.d.ts +1 -0
  89. package/dist-types/layer/layer.d.ts.map +1 -1
  90. package/dist-types/layer/model-layer.d.ts +53 -7
  91. package/dist-types/layer/model-layer.d.ts.map +1 -1
  92. package/dist-types/layer/modeler/path-handler.d.ts.map +1 -1
  93. package/dist-types/layer/modeling-layer.d.ts.map +1 -1
  94. package/dist-types/layer/selection/selected-finder.d.ts +1 -1
  95. package/dist-types/layer/selection/selected-finder.d.ts.map +1 -1
  96. package/dist-types/layer/selection-layer.d.ts.map +1 -1
  97. package/dist-types/layer/snap-guide-layer.d.ts +23 -0
  98. package/dist-types/layer/snap-guide-layer.d.ts.map +1 -0
  99. package/dist-types/search/index.d.ts +3 -0
  100. package/dist-types/search/index.d.ts.map +1 -0
  101. package/dist-types/search/scene-search-engine.d.ts +65 -0
  102. package/dist-types/search/scene-search-engine.d.ts.map +1 -0
  103. package/dist-types/search/search-overlay.d.ts +69 -0
  104. package/dist-types/search/search-overlay.d.ts.map +1 -0
  105. package/dist-types/things-scene/api/align.d.ts.map +1 -1
  106. package/dist-types/things-scene/api/distribute.d.ts.map +1 -1
  107. package/dist-types/things-scene/api/place.d.ts.map +1 -1
  108. package/dist-types/things-scene/application-context.d.ts +43 -0
  109. package/dist-types/things-scene/application-context.d.ts.map +1 -1
  110. package/dist-types/things-scene/create.d.ts +38 -3
  111. package/dist-types/things-scene/create.d.ts.map +1 -1
  112. package/dist-types/things-scene/index.d.ts +10 -0
  113. package/dist-types/things-scene/index.d.ts.map +1 -1
  114. package/dist-types/things-scene/scene.d.ts +64 -1
  115. package/dist-types/things-scene/scene.d.ts.map +1 -1
  116. package/dist-types/threed/arrow-3d.d.ts +13 -4
  117. package/dist-types/threed/arrow-3d.d.ts.map +1 -1
  118. package/dist-types/threed/environments/base-environment.d.ts +9 -0
  119. package/dist-types/threed/environments/base-environment.d.ts.map +1 -0
  120. package/dist-types/threed/environments/cloudy-environment.d.ts +10 -0
  121. package/dist-types/threed/environments/cloudy-environment.d.ts.map +1 -0
  122. package/dist-types/threed/environments/factory-environment.d.ts +2 -3
  123. package/dist-types/threed/environments/factory-environment.d.ts.map +1 -1
  124. package/dist-types/threed/environments/home-environment.d.ts +2 -3
  125. package/dist-types/threed/environments/home-environment.d.ts.map +1 -1
  126. package/dist-types/threed/environments/office-environment.d.ts +2 -3
  127. package/dist-types/threed/environments/office-environment.d.ts.map +1 -1
  128. package/dist-types/threed/environments/rainy-environment.d.ts +10 -0
  129. package/dist-types/threed/environments/rainy-environment.d.ts.map +1 -0
  130. package/dist-types/threed/environments/studio-environment.d.ts +2 -3
  131. package/dist-types/threed/environments/studio-environment.d.ts.map +1 -1
  132. package/dist-types/threed/environments/sunny-environment.d.ts +10 -0
  133. package/dist-types/threed/environments/sunny-environment.d.ts.map +1 -0
  134. package/dist-types/threed/environments/warehouse-environment.d.ts +2 -3
  135. package/dist-types/threed/environments/warehouse-environment.d.ts.map +1 -1
  136. package/dist-types/threed/factories/backdrop.d.ts +525 -0
  137. package/dist-types/threed/factories/backdrop.d.ts.map +1 -0
  138. package/dist-types/threed/factories/banner.d.ts +35 -34
  139. package/dist-types/threed/factories/banner.d.ts.map +1 -1
  140. package/dist-types/threed/factories/camera.d.ts +34 -33
  141. package/dist-types/threed/factories/camera.d.ts.map +1 -1
  142. package/dist-types/threed/factories/cube.d.ts +34 -33
  143. package/dist-types/threed/factories/cube.d.ts.map +1 -1
  144. package/dist-types/threed/factories/cylinder.d.ts +1 -0
  145. package/dist-types/threed/factories/cylinder.d.ts.map +1 -1
  146. package/dist-types/threed/factories/decal.d.ts +502 -0
  147. package/dist-types/threed/factories/decal.d.ts.map +1 -0
  148. package/dist-types/threed/factories/floor-plate.d.ts +10 -0
  149. package/dist-types/threed/factories/floor-plate.d.ts.map +1 -0
  150. package/dist-types/threed/factories/gltf-object.d.ts +286 -68
  151. package/dist-types/threed/factories/gltf-object.d.ts.map +1 -1
  152. package/dist-types/threed/factories/group.d.ts +2 -0
  153. package/dist-types/threed/factories/group.d.ts.map +1 -0
  154. package/dist-types/threed/factories/light.d.ts +1 -0
  155. package/dist-types/threed/factories/light.d.ts.map +1 -1
  156. package/dist-types/threed/factories/line.d.ts +10 -0
  157. package/dist-types/threed/factories/line.d.ts.map +1 -0
  158. package/dist-types/threed/factories/ortholine.d.ts +10 -0
  159. package/dist-types/threed/factories/ortholine.d.ts.map +1 -0
  160. package/dist-types/threed/factories/polygon.d.ts.map +1 -1
  161. package/dist-types/threed/factories/polyline.d.ts +10 -0
  162. package/dist-types/threed/factories/polyline.d.ts.map +1 -0
  163. package/dist-types/threed/factories/rect.d.ts.map +1 -1
  164. package/dist-types/threed/factories/sphere.d.ts +6 -0
  165. package/dist-types/threed/factories/sphere.d.ts.map +1 -1
  166. package/dist-types/threed/factories/sprite.d.ts +34 -33
  167. package/dist-types/threed/factories/sprite.d.ts.map +1 -1
  168. package/dist-types/threed/factories/triangle.d.ts.map +1 -1
  169. package/dist-types/threed/factories/wall.d.ts +34 -33
  170. package/dist-types/threed/factories/wall.d.ts.map +1 -1
  171. package/dist-types/threed/floor/floor.d.ts.map +1 -1
  172. package/dist-types/threed/handle-3d.d.ts +21 -0
  173. package/dist-types/threed/handle-3d.d.ts.map +1 -0
  174. package/dist-types/threed/html/elements.d.ts.map +1 -1
  175. package/dist-types/threed/index.d.ts +20 -0
  176. package/dist-types/threed/index.d.ts.map +1 -1
  177. package/dist-types/threed/managers/box-selection-manager.d.ts +26 -0
  178. package/dist-types/threed/managers/box-selection-manager.d.ts.map +1 -0
  179. package/dist-types/threed/managers/camera-bookmark-manager.d.ts +127 -0
  180. package/dist-types/threed/managers/camera-bookmark-manager.d.ts.map +1 -0
  181. package/dist-types/threed/managers/camera-manager.d.ts +9 -3
  182. package/dist-types/threed/managers/camera-manager.d.ts.map +1 -1
  183. package/dist-types/threed/managers/controls-manager.d.ts +25 -4
  184. package/dist-types/threed/managers/controls-manager.d.ts.map +1 -1
  185. package/dist-types/threed/managers/event-manager3d.d.ts +8 -0
  186. package/dist-types/threed/managers/event-manager3d.d.ts.map +1 -1
  187. package/dist-types/threed/managers/gizmo-manager.d.ts +6 -0
  188. package/dist-types/threed/managers/gizmo-manager.d.ts.map +1 -1
  189. package/dist-types/threed/managers/gizmo-operation-manager.d.ts +55 -1
  190. package/dist-types/threed/managers/gizmo-operation-manager.d.ts.map +1 -1
  191. package/dist-types/threed/managers/index.d.ts +3 -0
  192. package/dist-types/threed/managers/index.d.ts.map +1 -1
  193. package/dist-types/threed/managers/interaction-manager.d.ts +17 -0
  194. package/dist-types/threed/managers/interaction-manager.d.ts.map +1 -1
  195. package/dist-types/threed/managers/light-manager.d.ts +15 -0
  196. package/dist-types/threed/managers/light-manager.d.ts.map +1 -1
  197. package/dist-types/threed/managers/renderer-manager.d.ts +37 -0
  198. package/dist-types/threed/managers/renderer-manager.d.ts.map +1 -1
  199. package/dist-types/threed/managers/scene-manager.d.ts +6 -2
  200. package/dist-types/threed/managers/scene-manager.d.ts.map +1 -1
  201. package/dist-types/threed/managers/types.d.ts +5 -2
  202. package/dist-types/threed/managers/types.d.ts.map +1 -1
  203. package/dist-types/threed/managers/vertex-gizmo-manager.d.ts +109 -0
  204. package/dist-types/threed/managers/vertex-gizmo-manager.d.ts.map +1 -0
  205. package/dist-types/threed/material-3d.d.ts +5 -2
  206. package/dist-types/threed/material-3d.d.ts.map +1 -1
  207. package/dist-types/threed/ratio-lock-utils.d.ts +9 -0
  208. package/dist-types/threed/ratio-lock-utils.d.ts.map +1 -0
  209. package/dist-types/threed/real-object-dom-element.d.ts +1 -0
  210. package/dist-types/threed/real-object-dom-element.d.ts.map +1 -1
  211. package/dist-types/threed/real-object-dom-texture.d.ts +9 -0
  212. package/dist-types/threed/real-object-dom-texture.d.ts.map +1 -1
  213. package/dist-types/threed/real-object-external-model.d.ts +24 -0
  214. package/dist-types/threed/real-object-external-model.d.ts.map +1 -0
  215. package/dist-types/threed/real-object-extrude.d.ts +6 -0
  216. package/dist-types/threed/real-object-extrude.d.ts.map +1 -1
  217. package/dist-types/threed/real-object-gltf.d.ts +42 -12
  218. package/dist-types/threed/real-object-gltf.d.ts.map +1 -1
  219. package/dist-types/threed/real-object-group.d.ts +2 -0
  220. package/dist-types/threed/real-object-group.d.ts.map +1 -1
  221. package/dist-types/threed/real-object-line.d.ts +83 -0
  222. package/dist-types/threed/real-object-line.d.ts.map +1 -0
  223. package/dist-types/threed/real-object-mesh.d.ts.map +1 -1
  224. package/dist-types/threed/real-object-plane-2d.d.ts +23 -0
  225. package/dist-types/threed/real-object-plane-2d.d.ts.map +1 -1
  226. package/dist-types/threed/real-object-service.d.ts +14 -0
  227. package/dist-types/threed/real-object-service.d.ts.map +1 -0
  228. package/dist-types/threed/real-object-sprite.d.ts +7 -1
  229. package/dist-types/threed/real-object-sprite.d.ts.map +1 -1
  230. package/dist-types/threed/real-object-text.d.ts +3 -0
  231. package/dist-types/threed/real-object-text.d.ts.map +1 -1
  232. package/dist-types/threed/real-object.d.ts +131 -6
  233. package/dist-types/threed/real-object.d.ts.map +1 -1
  234. package/dist-types/threed/text-editor-3d.d.ts +11 -0
  235. package/dist-types/threed/text-editor-3d.d.ts.map +1 -0
  236. package/dist-types/threed/texture/canvas-texture.d.ts +7 -0
  237. package/dist-types/threed/texture/canvas-texture.d.ts.map +1 -1
  238. package/dist-types/threed/texture/fillstyle-texture.d.ts +46 -0
  239. package/dist-types/threed/texture/fillstyle-texture.d.ts.map +1 -0
  240. package/dist-types/threed/texture/text-texture.d.ts +15 -0
  241. package/dist-types/threed/texture/text-texture.d.ts.map +1 -1
  242. package/dist-types/threed/three-capability.d.ts +142 -6
  243. package/dist-types/threed/three-capability.d.ts.map +1 -1
  244. package/dist-types/threed/three-container.d.ts +0 -1
  245. package/dist-types/threed/three-container.d.ts.map +1 -1
  246. package/dist-types/threed/three-dimensional-container.d.ts +0 -1
  247. package/dist-types/threed/three-dimensional-container.d.ts.map +1 -1
  248. package/dist-types/threed/utils/anchor.d.ts +33 -0
  249. package/dist-types/threed/utils/anchor.d.ts.map +1 -0
  250. package/dist-types/threed/utils/dispose.d.ts.map +1 -1
  251. package/dist-types/threed/utils/tether.d.ts +46 -0
  252. package/dist-types/threed/utils/tether.d.ts.map +1 -0
  253. package/dist-types/transfer/centering-slot-strategy.d.ts +8 -0
  254. package/dist-types/transfer/centering-slot-strategy.d.ts.map +1 -0
  255. package/dist-types/transfer/container-capacity.d.ts +42 -0
  256. package/dist-types/transfer/container-capacity.d.ts.map +1 -0
  257. package/dist-types/transfer/fixed-slot-strategy.d.ts +8 -0
  258. package/dist-types/transfer/fixed-slot-strategy.d.ts.map +1 -0
  259. package/dist-types/transfer/index.d.ts +7 -0
  260. package/dist-types/transfer/index.d.ts.map +1 -0
  261. package/dist-types/transfer/simulation-clock.d.ts +45 -0
  262. package/dist-types/transfer/simulation-clock.d.ts.map +1 -0
  263. package/dist-types/transfer/types.d.ts +285 -0
  264. package/dist-types/transfer/types.d.ts.map +1 -0
  265. package/dist-types/transition/transition-effect.d.ts +91 -0
  266. package/dist-types/transition/transition-effect.d.ts.map +1 -0
  267. package/dist-types/types/bounding.d.ts +1 -1
  268. package/dist-types/types/bounding.d.ts.map +1 -1
  269. package/package.json +12 -1
  270. package/things-scene-min.js +12 -13
  271. package/things-scene-min.js.map +1 -1
  272. package/things-scene-transfer.mjs +1 -0
  273. package/things-scene.mjs +8 -9
  274. package/things-scene.mjs.map +1 -1
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 3축의 변화율 중 가장 큰 것을 기준으로 균일 비율을 반환한다.
3
+ * 모든 변화가 threshold 미만이면 null 반환 (변경 없음).
4
+ *
5
+ * @param ratios - [x, y, z] 각 축의 변화 비율 (1.0 = 변화 없음)
6
+ * @returns 균일 비율 또는 null
7
+ */
8
+ export declare function getUniformRatio(ratios: [number, number, number]): number | null;
9
+ //# sourceMappingURL=ratio-lock-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ratio-lock-utils.d.ts","sourceRoot":"","sources":["../../src/threed/ratio-lock-utils.ts"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAW/E"}
@@ -3,6 +3,7 @@ import { RealObject } from './real-object.js';
3
3
  export declare class RealObjectDomElement extends RealObject<CSS3DObject> {
4
4
  /** 평면 오브젝트: 바닥 위로 올려 z-fighting 방지 */
5
5
  protected get syncZPosOffset(): number;
6
+ get geometricOffsetY(): number;
6
7
  protected getObject3dInstance(): CSS3DObject;
7
8
  /**
8
9
  * CSS3DObject는 geometry가 없으므로 Euler rotation으로 바닥에 눕힘.
@@ -1 +1 @@
1
- {"version":3,"file":"real-object-dom-element.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-dom-element.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAA;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,qBAAa,oBAAqB,SAAQ,UAAU,CAAC,WAAW,CAAC;IAC/D,sCAAsC;IACtC,SAAS,KAAK,cAAc,WAE3B;IAED,SAAS,CAAC,mBAAmB;IAI7B;;;OAGG;IACH,IAAI,QAAQ;;;;MAQX;IAED;;OAEG;IACH,gBAAgB;IAiChB,KAAK;IAeL,eAAe;IAWf,WAAW;CAUZ"}
1
+ {"version":3,"file":"real-object-dom-element.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-dom-element.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAA;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,qBAAa,oBAAqB,SAAQ,UAAU,CAAC,WAAW,CAAC;IAC/D,sCAAsC;IACtC,SAAS,KAAK,cAAc,WAE3B;IAED,IAAa,gBAAgB,WAE5B;IAED,SAAS,CAAC,mBAAmB;IAI7B;;;OAGG;IACH,IAAI,QAAQ;;;;MAQX;IAED;;OAEG;IACH,gBAAgB;IAqChB,KAAK;IAsBL,eAAe;IAsBf,WAAW;CAUZ"}
@@ -3,7 +3,10 @@ import { RealObject } from './real-object.js';
3
3
  export declare class RealObjectDomTexture extends RealObject<THREE.Mesh> {
4
4
  /** 평면 오브젝트: 바닥 위로 올려 z-fighting 방지 */
5
5
  protected get syncZPosOffset(): number;
6
+ get geometricOffsetY(): number;
6
7
  private _debounceTimer?;
8
+ private _origInvalidate?;
9
+ constructor(component: any);
7
10
  protected getObject3dInstance(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
8
11
  build(): void;
9
12
  updateDimension(): void;
@@ -11,9 +14,15 @@ export declare class RealObjectDomTexture extends RealObject<THREE.Mesh> {
11
14
  updateHidden(): void;
12
15
  private _debouncedRebuild;
13
16
  private _rebuildTexture;
17
+ /**
18
+ * 기존 캔버스/텍스처를 유지한 채 그림만 다시 그린다. 애니메이션 프레임용 경량 경로.
19
+ * 캔버스는 세팅된 상태에서만 호출되므로 canvas/texture가 아직 없으면 no-op.
20
+ */
21
+ private _refreshTextureNow;
14
22
  updateFillStyle(): void;
15
23
  updateStrokeStyle(): void;
16
24
  updateText(): void;
25
+ onchange(after: Record<string, any>, before: Record<string, any>): void;
17
26
  updateMaterial3d(): void;
18
27
  clear(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
19
28
  dispose(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"real-object-dom-texture.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-dom-texture.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAO7C,qBAAa,oBAAqB,SAAQ,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;IAC9D,sCAAsC;IACtC,SAAS,KAAK,cAAc,WAE3B;IAED,OAAO,CAAC,cAAc,CAAC,CAA+B;IAEtD,SAAS,CAAC,mBAAmB;IAI7B,KAAK;IA4BL,eAAe;IAOf,WAAW;IAKX,YAAY;IAIZ,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,eAAe;IAQvB,eAAe;IAIf,iBAAiB;IAIjB,UAAU;IAIV,gBAAgB;IAahB,KAAK;IASL,OAAO;CAOR"}
1
+ {"version":3,"file":"real-object-dom-texture.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-dom-texture.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAe7C,qBAAa,oBAAqB,SAAQ,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;IAC9D,sCAAsC;IACtC,SAAS,KAAK,cAAc,WAE3B;IAED,IAAa,gBAAgB,WAE5B;IAED,OAAO,CAAC,cAAc,CAAC,CAA+B;IACtD,OAAO,CAAC,eAAe,CAAC,CAAY;gBAExB,SAAS,EAAE,GAAG;IAiB1B,SAAS,CAAC,mBAAmB;IAI7B,KAAK;IA4BL,eAAe;IAMf,WAAW;IAKX,YAAY;IAIZ,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,eAAe;IAQvB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAW1B,eAAe;IAIf,iBAAiB;IAIjB,UAAU;IAIV,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAYhE,gBAAgB;IAahB,KAAK;IASL,OAAO;CAWR"}
@@ -0,0 +1,24 @@
1
+ import * as THREE from 'three';
2
+ import { RealObject } from './real-object.js';
3
+ export declare abstract class RealObjectExternalModel<TData = unknown> extends RealObject {
4
+ /**
5
+ * 로드 세대 카운터. build() 호출마다 증가한다.
6
+ * 비동기 load 콜백은 gen 비교로 stale 여부를 판단해야 한다.
7
+ */
8
+ protected _loadGen: number;
9
+ /** 모델 subtree의 직접 부모. clear() 시 통째로 disposeObject3D된다. */
10
+ protected pivot?: THREE.Object3D;
11
+ protected _objectSize?: THREE.Vector3;
12
+ get objectSize(): THREE.Vector3 | undefined;
13
+ build(): void;
14
+ updateSource(): void;
15
+ protected abstract _loadExternal(url: string): Promise<TData>;
16
+ protected abstract _onLoaded(data: TData): void;
17
+ protected abstract get _formatLabel(): string;
18
+ /** 빈 상태 placeholder의 색상. 포맷별로 식별 색 override 가능. */
19
+ protected get _placeholderColor(): number;
20
+ protected _showEmptyPlaceholder(): void;
21
+ protected _showErrorPlaceholder(): void;
22
+ clear(): THREE.Object3D<THREE.Object3DEventMap>;
23
+ }
24
+ //# sourceMappingURL=real-object-external-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"real-object-external-model.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-external-model.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,8BAAsB,uBAAuB,CAAC,KAAK,GAAG,OAAO,CAAE,SAAQ,UAAU;IAC/E;;;OAGG;IACH,SAAS,CAAC,QAAQ,SAAI;IAEtB,0DAA0D;IAC1D,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAA;IAEhC,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,OAAO,CAAsB;IAE3D,IAAI,UAAU,IAAI,KAAK,CAAC,OAAO,GAAG,SAAS,CAE1C;IAED,KAAK;IAqCL,YAAY;IAMZ,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7D,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI;IAC/C,SAAS,CAAC,QAAQ,KAAK,YAAY,IAAI,MAAM,CAAA;IAI7C,mDAAmD;IACnD,SAAS,KAAK,iBAAiB,IAAI,MAAM,CAExC;IAED,SAAS,CAAC,qBAAqB;IA8B/B,SAAS,CAAC,qBAAqB;IAa/B,KAAK;CASN"}
@@ -27,6 +27,12 @@ export declare class RealObjectExtrude extends RealObject {
27
27
  updateAlpha(): void;
28
28
  updateStrokeStyle(): void;
29
29
  updateFillStyle(): void;
30
+ updateText(): void;
31
+ /**
32
+ * cap 면(앞/뒤)에 fillStyle + 텍스트를 합성한 텍스처를 적용한다.
33
+ * 텍스트가 없으면 fillStyle만 적용한다.
34
+ */
35
+ private _applyCapTexture;
30
36
  updateDimension(): void;
31
37
  }
32
38
  //# sourceMappingURL=real-object-extrude.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"real-object-extrude.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-extrude.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAMhE;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,iBAAiB,CAAC,EAAE,gBAAgB,CAAA;IACpC,OAAO,CAAC,KAAK,CAAC,CAAY;IAE1B,KAAK;IAKL,IAAI,KAAK,IAAI,GAAG,CAEf;IAED,IAAI,gBAAgB,qBAInB;IAED,KAAK;IAoCL,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc;IAoBxD,eAAe,IAAI,KAAK,CAAC,QAAQ,EAAE;IAuBnC,aAAa;IAoCb,OAAO,CAAC,YAAY;IAMpB,gBAAgB;IAqBhB,WAAW;IAUX,iBAAiB;IAQjB,eAAe;IAiBf,eAAe;CAKhB"}
1
+ {"version":3,"file":"real-object-extrude.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-extrude.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAOhE;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,iBAAiB,CAAC,EAAE,gBAAgB,CAAA;IACpC,OAAO,CAAC,KAAK,CAAC,CAAY;IAE1B,KAAK;IAKL,IAAI,KAAK,IAAI,GAAG,CAEf;IAED,IAAI,gBAAgB,qBAInB;IAED,KAAK;IAoCL,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc;IAoBxD,eAAe,IAAI,KAAK,CAAC,QAAQ,EAAE;IAcnC,aAAa;IAqBb,OAAO,CAAC,YAAY;IAMpB,gBAAgB;IAYhB,WAAW;IAUX,iBAAiB;IAQjB,eAAe;IAIf,UAAU;IAIV;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA+DxB,eAAe;CAMhB"}
@@ -1,7 +1,7 @@
1
1
  import * as THREE from 'three';
2
2
  import type { Properties } from '../interfaces/types.js';
3
- import { RealObject } from './real-object.js';
4
- import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
3
+ import { RealObjectExternalModel } from './real-object-external-model.js';
4
+ import { GLTF, GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
5
5
  export interface GLTFNodeState {
6
6
  color?: string;
7
7
  visible?: boolean;
@@ -16,25 +16,41 @@ export interface GLTFAnimationState {
16
16
  weight?: number;
17
17
  loop?: 'once' | 'repeat' | 'pingpong';
18
18
  }
19
- export declare class RealObjectGLTF extends RealObject {
19
+ export declare class RealObjectGLTF extends RealObjectExternalModel<GLTF> {
20
+ protected get _formatLabel(): string;
20
21
  private static _topViewCache;
22
+ private static _gltfCache;
21
23
  private static _sharedLoader;
24
+ private static _sharedSnapshotRenderer?;
25
+ /**
26
+ * 탑뷰 스냅샷 전용 공유 renderer. 헤드리스 환경 등 미지원 시 undefined 반환.
27
+ * 컨텍스트 lost 감지 시 정리 후 재생성.
28
+ */
29
+ private static getSharedSnapshotRenderer;
22
30
  /**
23
31
  * DRACO/KTX2/Meshopt/SpecGloss가 모두 설정된 공유 GLTFLoader를 반환한다.
24
32
  * renderer를 전달하면 KTX2 detectSupport를 갱신한다.
25
33
  * 2D 스냅샷 등 renderer 없이도 호출 가능하다.
26
34
  */
27
35
  static getSharedLoader(renderer?: THREE.WebGLRenderer): GLTFLoader;
28
- private pivot?;
29
- private objectSize?;
36
+ /**
37
+ * URL로 GLTF를 로드한다. 동일 URL은 캐시하여 1회만 파싱한다.
38
+ * 로드 실패 시 캐시에서 제거하여 재시도 가능.
39
+ */
40
+ static loadGLTF(url: string, renderer?: THREE.WebGLRenderer): Promise<GLTF>;
30
41
  private _nodeIndex;
31
42
  private _originals;
32
- private _animationActions;
43
+ _animationActions: Map<string, THREE.AnimationAction>;
33
44
  private _fillStyleOriginals;
34
- private _loadGen;
35
- build(): void;
36
- private gltfLoaded;
37
- private _renderTopViewSnapshot;
45
+ private _clonedMaterials;
46
+ /**
47
+ * mesh의 material이 아직 복제되지 않았으면 복제하여 독립 인스턴스로 만든다.
48
+ * GLTF 캐시로 인해 동일 소스의 오브젝트들이 material을 공유하므로,
49
+ * material을 변경하기 전에 반드시 호출해야 한다.
50
+ */
51
+ private _ensureOwnMaterial;
52
+ protected _loadExternal(url: string): Promise<GLTF>;
53
+ protected _onLoaded(gltf: GLTF): void;
38
54
  /**
39
55
  * 오프스크린 렌더러로 Object3D의 탑뷰(Y축 위→아래) 스냅샷을 생성한다.
40
56
  * GLTFObject에서 2D 모드 독립 로딩 시에도 사용한다.
@@ -44,6 +60,16 @@ export declare class RealObjectGLTF extends RealObject {
44
60
  static getTopViewCache(source: string): HTMLCanvasElement | undefined;
45
61
  /** 캐시에 스냅샷을 저장한다 */
46
62
  static setTopViewCache(source: string, canvas: HTMLCanvasElement): void;
63
+ /**
64
+ * GLTF 파싱 캐시와 탑뷰 스냅샷 캐시를 모두 비운다.
65
+ * Scene(보드) 전환 시 호출하여 메모리를 회수한다.
66
+ * clone()은 geometry/texture를 공유 참조하므로,
67
+ * 모든 컴포넌트가 dispose된 후에만 호출해야 한다.
68
+ *
69
+ * 공유 snapshot renderer 도 함께 dispose — 보드 전환 시 GPU 메모리 회수.
70
+ * 다음 보드에서 GLB 컴포넌트가 ready 되면 lazy 하게 재생성된다.
71
+ */
72
+ static flushCache(): void;
47
73
  private _buildNodeIndex;
48
74
  getNode(name: string): THREE.Object3D | undefined;
49
75
  get nodeNames(): string[];
@@ -57,14 +83,18 @@ export declare class RealObjectGLTF extends RealObject {
57
83
  */
58
84
  private _resetAllNodes;
59
85
  private _setupAnimations;
86
+ /**
87
+ * playTargets에 따라 해당 애니메이션만 재생.
88
+ * '*' → 전체, undefined/'none'/[] → 없음, [...] → 선택된 것만
89
+ * (fillStyleTargets와 동일한 규칙)
90
+ */
91
+ _playTargetAnimations(): void;
60
92
  private _applyAnimationStates;
61
93
  get animationNames(): string[];
62
- private _showErrorPlaceholder;
63
94
  updateFillStyle(): void;
64
95
  private _restoreFillStyleTargets;
65
96
  clear(): THREE.Object3D<THREE.Object3DEventMap>;
66
97
  updateDimension(): void;
67
- updateSource(): void;
68
98
  onchange(after: Properties, before: Properties): void;
69
99
  }
70
100
  //# sourceMappingURL=real-object-gltf.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"real-object-gltf.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-gltf.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,OAAO,EAAQ,UAAU,EAAE,MAAM,0CAA0C,CAAA;AAO3E,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAA;CACtC;AAQD,qBAAa,cAAe,SAAQ,UAAU;IAE5C,OAAO,CAAC,MAAM,CAAC,aAAa,CAAuC;IAGnE,OAAO,CAAC,MAAM,CAAC,aAAa,CAA0B;IAEtD;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,UAAU;IA2BlE,OAAO,CAAC,KAAK,CAAC,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAC,CAAqC;IAGxD,OAAO,CAAC,UAAU,CAAoC;IAGtD,OAAO,CAAC,UAAU,CASd;IAGJ,OAAO,CAAC,iBAAiB,CAA2C;IAGpE,OAAO,CAAC,mBAAmB,CAKvB;IAGJ,OAAO,CAAC,QAAQ,CAAI;IAEpB,KAAK;IAiCL,OAAO,CAAC,UAAU;IAmElB,OAAO,CAAC,sBAAsB;IAO9B;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,GAAG,iBAAiB;IAwD/D,qBAAqB;IACrB,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIrE,oBAAoB;IACpB,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB;IAMhE,OAAO,CAAC,eAAe;IA6BvB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,SAAS;IAIjD,IAAI,SAAS,IAAI,MAAM,EAAE,CAExB;IAID,OAAO,CAAC,gBAAgB;IAuCxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAoBlB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,qBAAqB;IA8B7B,IAAI,cAAc,IAAI,MAAM,EAAE,CAE7B;IAED,OAAO,CAAC,qBAAqB;IAU7B,eAAe;IA2Cf,OAAO,CAAC,wBAAwB;IA2BhC,KAAK;IAiBL,eAAe;IAUf,YAAY;IAIZ,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU;CA0C/C"}
1
+ {"version":3,"file":"real-object-gltf.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-gltf.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAEzE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAA;AAoC3E,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAA;CACtC;AAQD,qBAAa,cAAe,SAAQ,uBAAuB,CAAC,IAAI,CAAC;IAC/D,SAAS,KAAK,YAAY,WAAoB;IAE9C,OAAO,CAAC,MAAM,CAAC,aAAa,CAAuC;IAGnE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAmC;IAG5D,OAAO,CAAC,MAAM,CAAC,aAAa,CAA0B;IAMtD,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAqB;IAE5D;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAyBxC;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,UAAU;IA2BlE;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3E,OAAO,CAAC,UAAU,CAAoC;IAGtD,OAAO,CAAC,UAAU,CASd;IAGJ,iBAAiB,qCAA2C;IAG5D,OAAO,CAAC,mBAAmB,CAKvB;IAIJ,OAAO,CAAC,gBAAgB,CAAgC;IAExD;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAU1B,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI;IAiH9B;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,GAAG,iBAAiB;IAwE/D,qBAAqB;IACrB,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIrE,oBAAoB;IACpB,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB;IAIhE;;;;;;;;OAQG;IACH,MAAM,CAAC,UAAU;IAajB,OAAO,CAAC,eAAe;IA6BvB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,SAAS;IAIjD,IAAI,SAAS,IAAI,MAAM,EAAE,CAExB;IAID,OAAO,CAAC,gBAAgB;IA0CxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAoBlB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,gBAAgB;IAqBxB;;;;OAIG;IACH,qBAAqB;IAarB,OAAO,CAAC,qBAAqB;IA8B7B,IAAI,cAAc,IAAI,MAAM,EAAE,CAE7B;IAID,eAAe;IA2Df,OAAO,CAAC,wBAAwB;IA2BhC,KAAK;IAWL,eAAe;IAUf,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU;CA8C/C"}
@@ -2,5 +2,7 @@ import * as THREE from 'three';
2
2
  import { RealObject } from './real-object.js';
3
3
  export declare class RealObjectGroup extends RealObject<THREE.Group> {
4
4
  protected getObject3dInstance(): THREE.Group<THREE.Object3DEventMap>;
5
+ /** Group은 translate만 허용 (rotate/scale은 ungroup 시 정확한 분해가 어려움) */
6
+ get allowedGizmoModes(): string[] | null;
5
7
  }
6
8
  //# sourceMappingURL=real-object-group.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"real-object-group.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-group.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,qBAAa,eAAgB,SAAQ,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1D,SAAS,CAAC,mBAAmB;CAG9B"}
1
+ {"version":3,"file":"real-object-group.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-group.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,qBAAa,eAAgB,SAAQ,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1D,SAAS,CAAC,mBAAmB;IAI7B,iEAAiE;IACjE,IAAI,iBAAiB,IAAI,MAAM,EAAE,GAAG,IAAI,CAEvC;CACF"}
@@ -0,0 +1,83 @@
1
+ import * as THREE from 'three';
2
+ import { Line2 } from 'three/examples/jsm/lines/Line2.js';
3
+ import { RealObject } from './real-object.js';
4
+ import type { Properties } from '../interfaces/types.js';
5
+ /**
6
+ * 선형 컴포넌트(line, polyline, path 등)를 3D에서 Line2(fat line)로 렌더링하는 베이스 클래스.
7
+ *
8
+ * RealObjectMesh, RealObjectExtrude와 동급의 추상 클래스.
9
+ * 서브클래스는 worldPath를 구현하여 컴포넌트별 좌표 변환 로직을 제공한다.
10
+ */
11
+ export declare abstract class RealObjectLine extends RealObject<THREE.Group> {
12
+ protected _line2?: Line2;
13
+ /** 서브클래스가 오버라이드: 컴포넌트 path → 3D 로컬 좌표 배열 반환 */
14
+ abstract get worldPath(): THREE.Vector3[];
15
+ protected getObject3dInstance(): THREE.Group<THREE.Object3DEventMap>;
16
+ /** 선형 컴포넌트도 기즈모 변환 가능 — 결과를 path 좌표에 베이킹 */
17
+ get gizmoTransformable(): boolean;
18
+ /** 선형 컴포넌트는 볼륨이 없으므로 바닥면에 위치 */
19
+ protected get syncZPosOffset(): number;
20
+ /** Line의 object3d origin은 볼륨 바닥(실제로 볼륨 없음) */
21
+ get geometricOffsetY(): number;
22
+ /**
23
+ * 기즈모 드래그 중에는 컴포넌트 상태를 변경하지 않는다.
24
+ * object3d가 움직이면서 Line2가 함께 이동하므로 시각적으로는 정상.
25
+ * 드래그 종료 시 onGizmoDragEnd에서 일괄 베이킹한다.
26
+ */
27
+ syncFromObject3D(): void;
28
+ /**
29
+ * scale 기즈모 드래그 중에도 dimension 변경을 방지한다.
30
+ */
31
+ applyDimensionFromGizmo(_props: Record<string, number>): void;
32
+ build(): void;
33
+ /**
34
+ * round 속성을 적용하여 worldPath를 보간한 최종 positions을 반환한다.
35
+ */
36
+ protected get smoothedPath(): THREE.Vector3[];
37
+ protected _buildLine(): void;
38
+ /**
39
+ * 팁 오브젝트를 위치/회전/색상 설정하여 object3d에 추가한다.
40
+ */
41
+ private _placeTip;
42
+ private _getResolution;
43
+ /**
44
+ * 기즈모 드래그 종료 시 호출.
45
+ * object3d의 현재 transform(translate/rotate/scale)을
46
+ * path vertex 좌표에 베이킹하고, object3d transform을 리셋한다.
47
+ *
48
+ * 핵심: line/path 컴포넌트는 position/rotation/scale 속성을 갖지 않는다.
49
+ * 오직 vertex 좌표만으로 형태를 결정한다.
50
+ */
51
+ onGizmoDragEnd(_mode: string): void;
52
+ /**
53
+ * object3d의 transform matrix를 path vertex에 적용한 새 parent 좌표를 계산한다.
54
+ * 순수 함수로 추출하여 단위 테스트 가능.
55
+ *
56
+ * @param path - 컴포넌트 path (local coords, rotation=0이므로 parent coords와 동일)
57
+ * @param center - component.center (parent coords)
58
+ * @param parentSize - 부모 컨테이너의 bounds { width, height }
59
+ * @param object3d - 기즈모에 의해 변환된 Object3D
60
+ * @returns 새 path (parent coords)
61
+ */
62
+ static computeBakedPath(path: Array<{
63
+ x: number;
64
+ y: number;
65
+ z?: number;
66
+ }>, center: {
67
+ x: number;
68
+ y: number;
69
+ }, parentSize: {
70
+ width: number;
71
+ height: number;
72
+ }, object3d: THREE.Object3D): Array<{
73
+ x: number;
74
+ y: number;
75
+ z?: number;
76
+ }>;
77
+ updateStrokeStyle(): void;
78
+ updateAlpha(): void;
79
+ updateDimension(): void;
80
+ onchange(after: Properties, before: Properties): void;
81
+ clear(): THREE.Group<THREE.Object3DEventMap>;
82
+ }
83
+ //# sourceMappingURL=real-object-line.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"real-object-line.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-line.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAA;AAKzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAyDxD;;;;;GAKG;AACH,8BAAsB,cAAe,SAAQ,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;IAClE,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,CAAA;IAExB,+CAA+C;IAC/C,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAA;IAEzC,SAAS,CAAC,mBAAmB;IAI7B,4CAA4C;IAC5C,IAAa,kBAAkB,IAAI,OAAO,CAEzC;IAED,gCAAgC;IAChC,SAAS,KAAK,cAAc,IAAI,MAAM,CAErC;IAED,8CAA8C;IAC9C,IAAa,gBAAgB,IAAI,MAAM,CAEtC;IAED;;;;OAIG;IACM,gBAAgB,IAAI,IAAI;IAIjC;;OAEG;IACM,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAItE,KAAK;IAKL;;OAEG;IACH,SAAS,KAAK,YAAY,IAAI,KAAK,CAAC,OAAO,EAAE,CAqD5C;IAED,SAAS,CAAC,UAAU;IA0FpB;;OAEG;IACH,OAAO,CAAC,SAAS;IAwCjB,OAAO,CAAC,cAAc;IAStB;;;;;;;OAOG;IACM,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAuC5C;;;;;;;;;OASG;IACH,MAAM,CAAC,gBAAgB,CACrB,IAAI,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EACjD,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAChC,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAC7C,QAAQ,EAAE,KAAK,CAAC,QAAQ,GACvB,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiC9C,iBAAiB;IAKjB,WAAW;IAIX,eAAe;IAKf,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU;IAgB9C,KAAK;CAYN"}
@@ -1 +1 @@
1
- {"version":3,"file":"real-object-mesh.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-mesh.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,8BAAsB,cAAe,SAAQ,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;IACjE,SAAS,CAAC,mBAAmB;IAI7B,KAAK;IASL,WAAW;IAMX,YAAY;IAIZ,eAAe;IAsBf,iBAAiB;IAuBjB,eAAe,IAAI,IAAI;IAqBvB,SAAS,CAAC,QAAQ,CAAC,aAAa,IAAI,IAAI;IAExC,aAAa,IAAI,IAAI;IAerB,gBAAgB;IAiBhB,KAAK;CAKN"}
1
+ {"version":3,"file":"real-object-mesh.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-mesh.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,8BAAsB,cAAe,SAAQ,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;IACjE,SAAS,CAAC,mBAAmB;IAI7B,KAAK;IASL,WAAW;IAMX,YAAY;IAIZ,eAAe;IAsBf,iBAAiB;IAuBjB,eAAe,IAAI,IAAI;IAqBvB,SAAS,CAAC,QAAQ,CAAC,aAAa,IAAI,IAAI;IAExC,aAAa,IAAI,IAAI;IAOrB,gBAAgB;IAShB,KAAK;CAKN"}
@@ -3,16 +3,39 @@ import { RealObject } from './real-object.js';
3
3
  export declare class RealObjectPlane2D extends RealObject<THREE.Mesh> {
4
4
  /** 평면 오브젝트: 바닥 위로 올려 z-fighting 방지 */
5
5
  protected get syncZPosOffset(): number;
6
+ /** object3d origin이 볼륨 상단 위치(실제로는 얇은 plane) */
7
+ get geometricOffsetY(): number;
8
+ private _debounceTimer?;
9
+ private _origInvalidate?;
10
+ constructor(component: any);
6
11
  protected getObject3dInstance(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
7
12
  build(): void;
8
13
  updateAlpha(): void;
9
14
  updateHidden(): void;
15
+ get dimension(): {
16
+ width: number;
17
+ height: number;
18
+ depth: number;
19
+ };
20
+ get scale(): {
21
+ x: number;
22
+ y: any;
23
+ z: number;
24
+ };
10
25
  updateDimension(): void;
26
+ private _debouncedRebuild;
27
+ /**
28
+ * 기존 캔버스/텍스처를 그대로 두고 그림만 다시 그린다. 애니메이션 프레임용 경량 경로.
29
+ * 캔버스는 세팅된 상태에서만 호출되므로 canvas/texture가 아직 없으면 no-op.
30
+ */
31
+ private _refreshTextureNow;
11
32
  update(): void;
33
+ onchange(after: Record<string, any>, before: Record<string, any>): void;
12
34
  updateFillStyle(): void;
13
35
  updateStrokeStyle(): void;
14
36
  updateText(): void;
15
37
  updateMaterial3d(): void;
16
38
  clear(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
39
+ dispose(): void;
17
40
  }
18
41
  //# sourceMappingURL=real-object-plane-2d.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"real-object-plane-2d.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-plane-2d.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAO7C,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;IAC3D,sCAAsC;IACtC,SAAS,KAAK,cAAc,WAE3B;IAED,SAAS,CAAC,mBAAmB;IAI7B,KAAK;IA2BL,WAAW;IAKX,YAAY;IAIZ,eAAe;IAOf,MAAM;IAQN,eAAe;IAIf,iBAAiB;IAIjB,UAAU;IAIV,gBAAgB;IAahB,KAAK;CAIN"}
1
+ {"version":3,"file":"real-object-plane-2d.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-plane-2d.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAc7C,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;IAC3D,sCAAsC;IACtC,SAAS,KAAK,cAAc,WAE3B;IAED,+CAA+C;IAC/C,IAAa,gBAAgB,WAE5B;IAED,OAAO,CAAC,cAAc,CAAC,CAA+B;IACtD,OAAO,CAAC,eAAe,CAAC,CAAY;gBAExB,SAAS,EAAE,GAAG;IAkB1B,SAAS,CAAC,mBAAmB;IAI7B,KAAK;IA4BL,WAAW;IAKX,YAAY;IAIZ,IAAI,SAAS;;;;MAGZ;IAED,IAAI,KAAK;;;;MAIR;IAED,eAAe;IAIf,OAAO,CAAC,iBAAiB;IAUzB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAW1B,MAAM;IAQN,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAWhE,eAAe;IAIf,iBAAiB;IAIjB,UAAU;IAIV,gBAAgB;IAahB,KAAK;IASL,OAAO;CAWR"}
@@ -0,0 +1,14 @@
1
+ import * as THREE from 'three';
2
+ import { RealObject } from './real-object.js';
3
+ export declare class RealObjectService extends RealObject<THREE.Mesh> {
4
+ protected getObject3dInstance(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
5
+ build(): void;
6
+ updateAlpha(): void;
7
+ updateHidden(): void;
8
+ updateDimension(): void;
9
+ updateFillStyle(): void;
10
+ updateStrokeStyle(): void;
11
+ updateText(): void;
12
+ clear(): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
13
+ }
14
+ //# sourceMappingURL=real-object-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"real-object-service.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-service.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAM7C,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;IAC3D,SAAS,CAAC,mBAAmB;IAI7B,KAAK;IAyBL,WAAW;IAOX,YAAY;IAIZ,eAAe;IAef,eAAe;IACf,iBAAiB;IACjB,UAAU;IAEV,KAAK;CAIN"}
@@ -4,7 +4,13 @@ export declare abstract class RealObjectSprite extends RealObject<THREE.Sprite>
4
4
  protected getObject3dInstance(): THREE.Sprite<THREE.Object3DEventMap>;
5
5
  build(): void;
6
6
  abstract buildMaterial(): void;
7
- get cz(): any;
7
+ get cz(): number;
8
+ /**
9
+ * Sprite는 2D bounds.height를 3D Y 크기로 사용 (billboard).
10
+ * object3d는 zPos + height/2(볼륨 중심)에 위치 → geometricOffsetY = height/2.
11
+ * 이 값이 자식 컴포넌트의 parent offset 보정에 사용된다.
12
+ */
13
+ get geometricOffsetY(): number;
8
14
  updateAlpha(): void;
9
15
  updateHidden(): void;
10
16
  updateFillStyle(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"real-object-sprite.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-sprite.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,8BAAsB,gBAAiB,SAAQ,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;IACrE,SAAS,CAAC,mBAAmB;IAI7B,KAAK;IAML,QAAQ,CAAC,aAAa,IAAI,IAAI;IAI9B,IAAI,EAAE,QAML;IAED,WAAW;IAMX,YAAY;IAIZ,eAAe;CAqBhB"}
1
+ {"version":3,"file":"real-object-sprite.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-sprite.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,8BAAsB,gBAAiB,SAAQ,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;IACrE,SAAS,CAAC,mBAAmB;IAI7B,KAAK;IAML,QAAQ,CAAC,aAAa,IAAI,IAAI;IAI9B,IAAI,EAAE,WAWL;IAED;;;;OAIG;IACH,IAAa,gBAAgB,IAAI,MAAM,CAGtC;IAED,WAAW;IAMX,YAAY;IAIZ,eAAe;CAqBhB"}
@@ -5,7 +5,10 @@ import { RealObjectMesh } from './real-object-mesh.js';
5
5
  export declare class RealObjectText extends RealObjectMesh {
6
6
  /** 평면 오브젝트: 바닥(Y=0.5) 위로 올려 z-fighting 방지 */
7
7
  protected get syncZPosOffset(): number;
8
+ get geometricOffsetY(): number;
8
9
  buildGeometry(): void;
10
+ updateStrokeStyle(): void;
11
+ updateFillStyle(): void;
9
12
  updateDimension(): void;
10
13
  updateText(): void;
11
14
  updateAlpha(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"real-object-text.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-text.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAGtD;;GAEG;AACH,qBAAa,cAAe,SAAQ,cAAc;IAChD,6CAA6C;IAC7C,SAAS,KAAK,cAAc,WAE3B;IAED,aAAa;IAEb,eAAe;IAiBf,UAAU;IA4CV,WAAW;CAOZ"}
1
+ {"version":3,"file":"real-object-text.d.ts","sourceRoot":"","sources":["../../src/threed/real-object-text.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAGtD;;GAEG;AACH,qBAAa,cAAe,SAAQ,cAAc;IAChD,6CAA6C;IAC7C,SAAS,KAAK,cAAc,WAE3B;IAED,IAAa,gBAAgB,WAE5B;IAED,aAAa;IAKb,iBAAiB;IAEjB,eAAe;IAKf,eAAe;IAiBf,UAAU;IAyDV,WAAW;CASZ"}
@@ -8,28 +8,34 @@ export declare abstract class RealObject<T extends THREE.Object3D = THREE.Object
8
8
  protected _focused: boolean;
9
9
  protected _focusedAt?: number;
10
10
  protected _suppressOnchange: boolean;
11
+ private _lastText?;
11
12
  object3d: T;
12
13
  private _onchangeWrapper;
13
- static buildFillStyleTexture(component: Component): THREE.CanvasTexture<HTMLCanvasElement> | THREE.Texture<HTMLImageElement> | undefined;
14
- private static buildGradientTexture;
14
+ static buildFillStyleTexture(component: Component, fillStyleOverride?: unknown): THREE.Texture<unknown> | undefined;
15
15
  constructor(component: Component);
16
16
  update(): void;
17
17
  protected getObject3dInstance(): T;
18
18
  build(): void;
19
19
  updateMaterial3d(): void;
20
+ private _applyShadow;
21
+ /** 기즈모(translate/rotate/scale)를 통한 변환이 가능한지 여부. 기본 true. */
22
+ get gizmoTransformable(): boolean;
23
+ /** 허용되는 기즈모 모드. null이면 모든 모드 허용. */
24
+ get allowedGizmoModes(): string[] | null;
20
25
  get component(): Component;
21
26
  get threeContainer(): ThreeDimensionalContainer | undefined;
22
27
  get focused(): boolean;
23
28
  set focused(focused: boolean);
24
29
  dispose(): void;
25
30
  clear(): T;
31
+ suppressTransform: boolean;
26
32
  /**
27
33
  * Component의 상태값의 변화를 Object3D에 반영 - translate, rotation, scale
28
34
  */
29
35
  updateTransform(): void;
30
36
  get position(): {
31
37
  x: number;
32
- y: any;
38
+ y: number;
33
39
  z: number;
34
40
  };
35
41
  get rotation(): {
@@ -44,11 +50,79 @@ export declare abstract class RealObject<T extends THREE.Object3D = THREE.Object
44
50
  };
45
51
  get cx(): number;
46
52
  get cy(): number;
47
- get cz(): any;
53
+ get cz(): number;
54
+ /**
55
+ * 이 컨테이너가 아이템을 받는 표면의 Y (자신의 object3d local space 기준).
56
+ * 서브클래스에서 오버라이드하면 ContainerCapacity.receive()가 수용된 아이템의
57
+ * zPos를 0으로 설정하고, cz 계산 시 이 값만큼 자동으로 보정된다.
58
+ * 결과: 수용된 아이템의 zPos=0 이 "이 표면 위에 놓임"을 의미하게 됨.
59
+ *
60
+ * 반환값: object3d local Y에서 표면의 위치. 0 = 표면 없음(기본값).
61
+ */
62
+ get receivingSurfaceY(): number;
63
+ /**
64
+ * 실제 사용되는 zPos 값. depth의 effectiveDepth와 짝을 이루는 NaN-safe getter.
65
+ *
66
+ * Resolution chain:
67
+ * 1. `state.zPos` — 명시 값 (단, finite number 만 인정 — `0` 도 valid)
68
+ * 2. `component.effectiveZPos` — Placeable 의 archetype-derived zPos
69
+ * (placement + align + parent context 고려)
70
+ * 3. `0` — 최후 fallback. 바닥에 놓는 의미.
71
+ *
72
+ * NaN/Infinity 가 명시적 값으로 들어오면 1단계에서 거부되어 2~3단계로
73
+ * 흘러간다. property panel 의 빈 input 이 NaN 으로 commit 되어도 이 게터를
74
+ * 통하면 위치가 무한대로 튀지 않는다.
75
+ *
76
+ * Note: depth 와 달리 `0` 은 valid 한 zPos 값(바닥). Number.isFinite 만
77
+ * 체크하고 양수 검사는 하지 않는다 — 음수 zPos 도 매달린 컴포넌트에서
78
+ * 정상 사용 사례.
79
+ */
80
+ get effectiveZPos(): number;
81
+ /**
82
+ * object3d.position과 볼륨 바닥면 사이의 Y 거리. (= syncZPosOffset 중 "기하" 부분)
83
+ *
84
+ * scene root의 `state.placement`에 따라 origin 관점이 달라진다:
85
+ * - 'floor'(기본): `+depth/2` — zPos는 바닥 높이, 볼륨은 zPos 위로
86
+ * - 'space': `0` — zPos는 볼륨 중심 Y, 바닥 개념 없음
87
+ * - 'inverted': `-depth/2` — zPos는 천장, 볼륨이 아래로 매달림 (beta)
88
+ *
89
+ * 중첩된 3D 자식이 parent의 geometric shift를 상쇄하는 데 사용된다.
90
+ * syncZPosOffset이 placement(매달림/얹힘 등)와 geometric을 모두 포함하는 경우,
91
+ * subclass는 이 getter를 override해 geometric 부분만 반환해야 한다.
92
+ */
93
+ get geometricOffsetY(): number;
94
+ /**
95
+ * scene의 placement 모드. 씬 전체에 일관 적용.
96
+ * 'floor' | 'space' | 'inverted'. 기본 'floor'.
97
+ *
98
+ * 저장 위치: rootModel (= ModelLayer) — property editor가 이곳에 기록.
99
+ * `component.root`(= RootContainer, 최상위)가 아닌 `component.rootModel`(= 3D 모델의 루트)을 읽어야 한다.
100
+ */
101
+ protected get scenePlacement(): 'floor' | 'space' | 'inverted';
102
+ private _components3D?;
103
+ /**
104
+ * 팩토리가 bottom-up 좌표계(y=0이 바닥, +Y 방향으로 쌓음)로 자체 mesh를 추가할 group.
105
+ * object3d에 `-geometricOffsetY`만큼 미리 shift된 상태로 관리되므로, 팩토리는
106
+ * center-origin과 bottom-up을 잇는 -d/2 shift를 신경쓸 필요 없음.
107
+ *
108
+ * 사용: `this.components3D.add(mesh)` (팩토리는 자신의 mesh 로컬 y를 바닥 기준으로 설정)
109
+ * 주의: things-scene 기본 컴포넌트 중 `geometry.center()`로 center-local 기하를
110
+ * 쓰는 것들은 기존처럼 `this.object3d.add(...)`를 계속 사용.
111
+ *
112
+ * clear()가 호출되면 자동 재생성됨 (object3d 자식 전체가 clear되므로).
113
+ */
114
+ get components3D(): THREE.Group;
48
115
  get center(): {
49
116
  x: number;
50
117
  y: number;
51
- z: any;
118
+ z: number;
119
+ };
120
+ freezeDimension(): void;
121
+ unfreezeDimension(): void;
122
+ _frozenDimension?: {
123
+ width: number;
124
+ height: number;
125
+ depth: number;
52
126
  };
53
127
  get dimension(): {
54
128
  width: number;
@@ -58,6 +132,18 @@ export declare abstract class RealObject<T extends THREE.Object3D = THREE.Object
58
132
  /**
59
133
  * 실제 사용되는 depth 값. 서브클래스가 auto-compute depth를 사용하면 오버라이드한다.
60
134
  * (예: conveyor의 effectiveDepth = depth || Math.min(width, height) * 1.5)
135
+ *
136
+ * Resolution chain (each layer used only if the previous yielded a valid
137
+ * positive finite number):
138
+ * 1. `state.depth` — explicit user value
139
+ * 2. `component.effectiveDepth` — Placeable's resolution (uses the
140
+ * class's `static defaultDepth` against current Heights config).
141
+ * Undefined if the component isn't Placeable or has no defaultDepth.
142
+ * 3. `1` — last-resort sentinel that keeps geometry from collapsing.
143
+ *
144
+ * NaN explicitly handled in step 1: a property-panel input that produces
145
+ * NaN (e.g. parseFloat of an empty string) won't poison every downstream
146
+ * Math.* call. Falls through to the placement default instead.
61
147
  */
62
148
  get effectiveDepth(): number;
63
149
  updatePosition(): void;
@@ -75,20 +161,59 @@ export declare abstract class RealObject<T extends THREE.Object3D = THREE.Object
75
161
  updateStrokeStyle(): void;
76
162
  updateFillStyle(): void;
77
163
  updateText(): void;
164
+ /**
165
+ * Raycast opt-out for atmospheric / decoration / environment components.
166
+ *
167
+ * Some components (Decal, Backdrop, future Camera/Light volumes) are
168
+ * physically large but conceptually "container-less wrappers" — they
169
+ * shouldn't catch clicks on their main geometry because doing so would
170
+ * block selection of the contents placed within or on top of them.
171
+ *
172
+ * Resolution order (each layer overrides the previous):
173
+ * 1. class.raycastTargetDefault — sticky default per component class
174
+ * (ThreeDOnly mixin sets this to false; normal components leave true)
175
+ * 2. state.raycastTarget — per-instance override from the
176
+ * component's state. Lets the user opt back in or out.
177
+ *
178
+ * When the resolved value is false, every descendant has `raycast` replaced
179
+ * with a no-op — EXCEPT children marked `userData.alwaysRaycast = true`
180
+ * (e.g. selection handles created by `createSelectionHandle3D`). That
181
+ * preserves a small, intentional click target while the bulk of the
182
+ * geometry stays click-through.
183
+ */
184
+ protected _applyRaycastTarget(): void;
78
185
  /**
79
186
  * 기즈모 드래그 결과를 컴포넌트 상태에 역변환하여 반영한다.
80
187
  * Object3D → Component 방향의 동기화.
81
188
  */
82
189
  /**
83
190
  * cz 계산 및 역변환에 사용되는 Y축 오프셋.
84
- * 볼륨체(extrude): depth/2 (기하 중심), 평면(plane/text): depth (윗면 위치).
191
+ * `state.zPos` `object3d.position.y` 변환 더해지는 값.
192
+ *
193
+ * scene placement 모드별 zPos 기준점:
194
+ * - 'floor'(기본): zPos=볼륨 바닥 → syncZPosOffset=+d/2 (object3d는 볼륨 중심)
195
+ * - 'space': zPos=볼륨 중심 → syncZPosOffset=0 (object3d는 zPos 그대로)
196
+ * - 'inverted': zPos=볼륨 상단 → syncZPosOffset=-d/2 (object3d는 zPos 아래)
197
+ *
198
+ * subclass가 고유 origin 컨벤션을 쓰는 경우(Plane/Text/Line/Sprite/MCS) 이 getter를
199
+ * override하여 placement와 무관한 고정값 반환 가능.
85
200
  */
86
201
  protected get syncZPosOffset(): number;
202
+ /**
203
+ * object3d 중심에서 텍스트 표면(상단)까지의 로컬 Y 오프셋.
204
+ * 볼륨체(extrude): depth/2, 평면(plane/text): 0.
205
+ */
206
+ get textSurfaceYOffset(): number;
87
207
  /**
88
208
  * 기즈모 드래그 결과를 컴포넌트 상태에 역변환하여 반영한다 (translate/rotate 모드 전용).
89
209
  * Object3D → Component 방향의 동기화. scale은 dimension으로 처리하므로 여기서는 제외.
90
210
  */
91
211
  syncFromObject3D(): void;
212
+ /**
213
+ * 기즈모 드래그 종료 시 호출. 서브클래스가 오버라이드하여
214
+ * 기즈모 결과를 컴포넌트 데이터에 베이킹할 수 있다.
215
+ */
216
+ onGizmoDragEnd(_mode: string): void;
92
217
  /**
93
218
  * scale 기즈모 드래그 결과를 dimension으로 역산하여 컴포넌트에 적용한다.
94
219
  * _suppressOnchange로 피드백 루프를 방지한다.