@operato/scene-visualizer 10.0.0-beta.1 → 10.0.0-beta.11

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 (235) hide show
  1. package/dist/editors/index.d.ts +2 -0
  2. package/dist/editors/index.js +10 -0
  3. package/dist/editors/index.js.map +1 -1
  4. package/dist/editors/property-editor-gltf-fill-targets.d.ts +5 -2
  5. package/dist/editors/property-editor-gltf-fill-targets.js +179 -77
  6. package/dist/editors/property-editor-gltf-fill-targets.js.map +1 -1
  7. package/dist/editors/property-editor-gltf-info.d.ts +25 -3
  8. package/dist/editors/property-editor-gltf-info.js +324 -73
  9. package/dist/editors/property-editor-gltf-info.js.map +1 -1
  10. package/dist/editors/property-editor-gltf-play-targets.d.ts +25 -0
  11. package/dist/editors/property-editor-gltf-play-targets.js +388 -0
  12. package/dist/editors/property-editor-gltf-play-targets.js.map +1 -0
  13. package/dist/editors/property-editor-location-increase-pattern.js +0 -4
  14. package/dist/editors/property-editor-location-increase-pattern.js.map +1 -1
  15. package/dist/editors/property-editor-stocker-location.d.ts +13 -0
  16. package/dist/editors/property-editor-stocker-location.js +151 -0
  17. package/dist/editors/property-editor-stocker-location.js.map +1 -0
  18. package/dist/editors/property-editor-stocker-ports.d.ts +8 -0
  19. package/dist/editors/property-editor-stocker-ports.js +112 -0
  20. package/dist/editors/property-editor-stocker-ports.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.js +3 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/rack-table-3d.js +1 -0
  25. package/dist/rack-table-3d.js.map +1 -1
  26. package/dist/rack-table.js +13 -0
  27. package/dist/rack-table.js.map +1 -1
  28. package/dist/rack.d.ts +13 -0
  29. package/dist/rack.js +100 -11
  30. package/dist/rack.js.map +1 -1
  31. package/dist/stock-hub.d.ts +25 -0
  32. package/dist/stock-hub.js +147 -0
  33. package/dist/stock-hub.js.map +1 -0
  34. package/dist/stock.d.ts +32 -0
  35. package/dist/stock.js +170 -73
  36. package/dist/stock.js.map +1 -1
  37. package/dist/stocker-3d.d.ts +23 -0
  38. package/dist/stocker-3d.js +352 -0
  39. package/dist/stocker-3d.js.map +1 -0
  40. package/dist/stocker-port-3d.d.ts +14 -0
  41. package/dist/stocker-port-3d.js +80 -0
  42. package/dist/stocker-port-3d.js.map +1 -0
  43. package/dist/{banner.d.ts → stocker-port.d.ts} +35 -25
  44. package/dist/stocker-port.js +123 -0
  45. package/dist/stocker-port.js.map +1 -0
  46. package/dist/{camera.d.ts → stocker.d.ts} +121 -30
  47. package/dist/stocker.js +370 -0
  48. package/dist/stocker.js.map +1 -0
  49. package/dist/templates/floor-plate.d.ts +18 -0
  50. package/dist/templates/floor-plate.js +19 -0
  51. package/dist/templates/floor-plate.js.map +1 -0
  52. package/dist/templates/index.d.ts +37 -38
  53. package/dist/templates/index.js +9 -1
  54. package/dist/templates/index.js.map +1 -1
  55. package/dist/templates/rack-table.d.ts +2 -0
  56. package/dist/templates/rack-table.js +4 -2
  57. package/dist/templates/rack-table.js.map +1 -1
  58. package/dist/templates/stock-hub.d.ts +14 -0
  59. package/dist/templates/stock-hub.js +15 -0
  60. package/dist/templates/stock-hub.js.map +1 -0
  61. package/dist/templates/stocker-port.d.ts +17 -0
  62. package/dist/templates/stocker-port.js +17 -0
  63. package/dist/templates/stocker-port.js.map +1 -0
  64. package/dist/templates/stocker.d.ts +27 -0
  65. package/dist/templates/stocker.js +38 -0
  66. package/dist/templates/stocker.js.map +1 -0
  67. package/dist/templates/visualizer.js +1 -1
  68. package/dist/templates/visualizer.js.map +1 -1
  69. package/dist/visualizer.d.ts +2 -1
  70. package/dist/visualizer.js +63 -46
  71. package/dist/visualizer.js.map +1 -1
  72. package/icons/stock-hub.png +0 -0
  73. package/package.json +2 -2
  74. package/translations/en.json +6 -0
  75. package/translations/ja.json +5 -0
  76. package/translations/ko.json +6 -1
  77. package/translations/ms.json +5 -0
  78. package/translations/zh.json +5 -0
  79. package/dist/banner.js +0 -75
  80. package/dist/banner.js.map +0 -1
  81. package/dist/camera.js +0 -107
  82. package/dist/camera.js.map +0 -1
  83. package/dist/cube.d.ts +0 -241
  84. package/dist/cube.js +0 -37
  85. package/dist/cube.js.map +0 -1
  86. package/dist/cylinder.d.ts +0 -9
  87. package/dist/cylinder.js +0 -37
  88. package/dist/cylinder.js.map +0 -1
  89. package/dist/ellipse.d.ts +0 -5
  90. package/dist/ellipse.js +0 -20
  91. package/dist/ellipse.js.map +0 -1
  92. package/dist/gltf-object.d.ts +0 -249
  93. package/dist/gltf-object.js +0 -103
  94. package/dist/gltf-object.js.map +0 -1
  95. package/dist/html-overlay-element.d.ts +0 -1
  96. package/dist/html-overlay-element.js +0 -8
  97. package/dist/html-overlay-element.js.map +0 -1
  98. package/dist/light.d.ts +0 -14
  99. package/dist/light.js +0 -134
  100. package/dist/light.js.map +0 -1
  101. package/dist/polygon.d.ts +0 -17
  102. package/dist/polygon.js +0 -62
  103. package/dist/polygon.js.map +0 -1
  104. package/dist/rect.d.ts +0 -5
  105. package/dist/rect.js +0 -34
  106. package/dist/rect.js.map +0 -1
  107. package/dist/scene/component.d.ts +0 -1
  108. package/dist/scene/component.js +0 -29
  109. package/dist/scene/component.js.map +0 -1
  110. package/dist/sphere.d.ts +0 -9
  111. package/dist/sphere.js +0 -37
  112. package/dist/sphere.js.map +0 -1
  113. package/dist/sprite.d.ts +0 -238
  114. package/dist/sprite.js +0 -27
  115. package/dist/sprite.js.map +0 -1
  116. package/dist/text.d.ts +0 -1
  117. package/dist/text.js +0 -7
  118. package/dist/text.js.map +0 -1
  119. package/dist/three-container-editor.d.ts +0 -22
  120. package/dist/three-container-editor.js +0 -132
  121. package/dist/three-container-editor.js.map +0 -1
  122. package/dist/three-container.d.ts +0 -61
  123. package/dist/three-container.js +0 -371
  124. package/dist/three-container.js.map +0 -1
  125. package/dist/three-controls.d.ts +0 -111
  126. package/dist/three-controls.js +0 -414
  127. package/dist/three-controls.js.map +0 -1
  128. package/dist/three-layout.d.ts +0 -8
  129. package/dist/three-layout.js +0 -20
  130. package/dist/three-layout.js.map +0 -1
  131. package/dist/three-space.d.ts +0 -8
  132. package/dist/three-space.js +0 -58
  133. package/dist/three-space.js.map +0 -1
  134. package/dist/threed/common.d.ts +0 -22
  135. package/dist/threed/common.js +0 -19
  136. package/dist/threed/common.js.map +0 -1
  137. package/dist/threed/floor/floor.d.ts +0 -3
  138. package/dist/threed/floor/floor.js +0 -51
  139. package/dist/threed/floor/floor.js.map +0 -1
  140. package/dist/threed/html/elements.d.ts +0 -2
  141. package/dist/threed/html/elements.js +0 -21
  142. package/dist/threed/html/elements.js.map +0 -1
  143. package/dist/threed/index.d.ts +0 -16
  144. package/dist/threed/index.js +0 -17
  145. package/dist/threed/index.js.map +0 -1
  146. package/dist/threed/interfaces.d.ts +0 -15
  147. package/dist/threed/interfaces.js +0 -5
  148. package/dist/threed/interfaces.js.map +0 -1
  149. package/dist/threed/managers/camera-manager.d.ts +0 -14
  150. package/dist/threed/managers/camera-manager.js +0 -60
  151. package/dist/threed/managers/camera-manager.js.map +0 -1
  152. package/dist/threed/managers/controls-manager.d.ts +0 -50
  153. package/dist/threed/managers/controls-manager.js +0 -249
  154. package/dist/threed/managers/controls-manager.js.map +0 -1
  155. package/dist/threed/managers/event-manager3d.d.ts +0 -19
  156. package/dist/threed/managers/event-manager3d.js +0 -76
  157. package/dist/threed/managers/event-manager3d.js.map +0 -1
  158. package/dist/threed/managers/index.d.ts +0 -7
  159. package/dist/threed/managers/index.js +0 -7
  160. package/dist/threed/managers/index.js.map +0 -1
  161. package/dist/threed/managers/light-manager.d.ts +0 -7
  162. package/dist/threed/managers/light-manager.js +0 -37
  163. package/dist/threed/managers/light-manager.js.map +0 -1
  164. package/dist/threed/managers/renderer-manager.d.ts +0 -30
  165. package/dist/threed/managers/renderer-manager.js +0 -120
  166. package/dist/threed/managers/renderer-manager.js.map +0 -1
  167. package/dist/threed/managers/scene-manager.d.ts +0 -15
  168. package/dist/threed/managers/scene-manager.js +0 -48
  169. package/dist/threed/managers/scene-manager.js.map +0 -1
  170. package/dist/threed/managers/types.d.ts +0 -36
  171. package/dist/threed/managers/types.js +0 -2
  172. package/dist/threed/managers/types.js.map +0 -1
  173. package/dist/threed/real-object-camera-meshed.d.ts +0 -12
  174. package/dist/threed/real-object-camera-meshed.js +0 -49
  175. package/dist/threed/real-object-camera-meshed.js.map +0 -1
  176. package/dist/threed/real-object-camera.d.ts +0 -9
  177. package/dist/threed/real-object-camera.js +0 -31
  178. package/dist/threed/real-object-camera.js.map +0 -1
  179. package/dist/threed/real-object-dom-element.d.ts +0 -9
  180. package/dist/threed/real-object-dom-element.js +0 -48
  181. package/dist/threed/real-object-dom-element.js.map +0 -1
  182. package/dist/threed/real-object-dummy.d.ts +0 -6
  183. package/dist/threed/real-object-dummy.js +0 -11
  184. package/dist/threed/real-object-dummy.js.map +0 -1
  185. package/dist/threed/real-object-extrude.d.ts +0 -22
  186. package/dist/threed/real-object-extrude.js +0 -180
  187. package/dist/threed/real-object-extrude.js.map +0 -1
  188. package/dist/threed/real-object-gltf.d.ts +0 -16
  189. package/dist/threed/real-object-gltf.js +0 -105
  190. package/dist/threed/real-object-gltf.js.map +0 -1
  191. package/dist/threed/real-object-group.d.ts +0 -5
  192. package/dist/threed/real-object-group.js +0 -11
  193. package/dist/threed/real-object-group.js.map +0 -1
  194. package/dist/threed/real-object-mesh.d.ts +0 -13
  195. package/dist/threed/real-object-mesh.js +0 -73
  196. package/dist/threed/real-object-mesh.js.map +0 -1
  197. package/dist/threed/real-object-plane.d.ts +0 -5
  198. package/dist/threed/real-object-plane.js +0 -22
  199. package/dist/threed/real-object-plane.js.map +0 -1
  200. package/dist/threed/real-object-registry.d.ts +0 -7
  201. package/dist/threed/real-object-registry.js +0 -32
  202. package/dist/threed/real-object-registry.js.map +0 -1
  203. package/dist/threed/real-object-scene.d.ts +0 -21
  204. package/dist/threed/real-object-scene.js +0 -72
  205. package/dist/threed/real-object-scene.js.map +0 -1
  206. package/dist/threed/real-object-sprite-2d.d.ts +0 -14
  207. package/dist/threed/real-object-sprite-2d.js +0 -45
  208. package/dist/threed/real-object-sprite-2d.js.map +0 -1
  209. package/dist/threed/real-object-sprite.d.ts +0 -11
  210. package/dist/threed/real-object-sprite.js +0 -52
  211. package/dist/threed/real-object-sprite.js.map +0 -1
  212. package/dist/threed/real-object-text.d.ts +0 -15
  213. package/dist/threed/real-object-text.js +0 -66
  214. package/dist/threed/real-object-text.js.map +0 -1
  215. package/dist/threed/real-object.d.ts +0 -65
  216. package/dist/threed/real-object.js +0 -251
  217. package/dist/threed/real-object.js.map +0 -1
  218. package/dist/threed/texture/canvas-texture.d.ts +0 -4
  219. package/dist/threed/texture/canvas-texture.js +0 -49
  220. package/dist/threed/texture/canvas-texture.js.map +0 -1
  221. package/dist/threed/texture/text-texture.d.ts +0 -8
  222. package/dist/threed/texture/text-texture.js +0 -79
  223. package/dist/threed/texture/text-texture.js.map +0 -1
  224. package/dist/threed/three-dimensional-container.d.ts +0 -7
  225. package/dist/threed/three-dimensional-container.js +0 -2
  226. package/dist/threed/three-dimensional-container.js.map +0 -1
  227. package/dist/threed/utils/bound-uv-generator.d.ts +0 -16
  228. package/dist/threed/utils/bound-uv-generator.js +0 -42
  229. package/dist/threed/utils/bound-uv-generator.js.map +0 -1
  230. package/dist/threed/utils/dispose.d.ts +0 -2
  231. package/dist/threed/utils/dispose.js +0 -32
  232. package/dist/threed/utils/dispose.js.map +0 -1
  233. package/dist/wall.d.ts +0 -241
  234. package/dist/wall.js +0 -44
  235. package/dist/wall.js.map +0 -1
@@ -1,6 +1,8 @@
1
1
  import './property-editor-location-increase-pattern.js';
2
2
  import './property-editor-gltf-info.js';
3
3
  import './property-editor-gltf-fill-targets.js';
4
+ import './property-editor-gltf-play-targets.js';
5
+ import './property-editor-stocker-location.js';
4
6
  declare const _default: {
5
7
  type: string;
6
8
  element: string;
@@ -1,6 +1,8 @@
1
1
  import './property-editor-location-increase-pattern.js';
2
2
  import './property-editor-gltf-info.js';
3
3
  import './property-editor-gltf-fill-targets.js';
4
+ import './property-editor-gltf-play-targets.js';
5
+ import './property-editor-stocker-location.js';
4
6
  export default [
5
7
  {
6
8
  type: 'location-increase-pattern',
@@ -13,6 +15,14 @@ export default [
13
15
  {
14
16
  type: 'gltf-fill-targets',
15
17
  element: 'property-editor-gltf-fill-targets'
18
+ },
19
+ {
20
+ type: 'gltf-play-targets',
21
+ element: 'property-editor-gltf-play-targets'
22
+ },
23
+ {
24
+ type: 'stocker-location',
25
+ element: 'property-editor-stocker-location'
16
26
  }
17
27
  ];
18
28
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/editors/index.ts"],"names":[],"mappings":"AAAA,OAAO,gDAAgD,CAAA;AACvD,OAAO,gCAAgC,CAAA;AACvC,OAAO,wCAAwC,CAAA;AAE/C,eAAe;IACb;QACE,IAAI,EAAE,2BAA2B;QACjC,OAAO,EAAE,2CAA2C;KACrD;IACD;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,2BAA2B;KACrC;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,mCAAmC;KAC7C;CACF,CAAA","sourcesContent":["import './property-editor-location-increase-pattern.js'\nimport './property-editor-gltf-info.js'\nimport './property-editor-gltf-fill-targets.js'\n\nexport default [\n {\n type: 'location-increase-pattern',\n element: 'property-editor-location-increase-pattern'\n },\n {\n type: 'gltf-info',\n element: 'property-editor-gltf-info'\n },\n {\n type: 'gltf-fill-targets',\n element: 'property-editor-gltf-fill-targets'\n }\n]\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/editors/index.ts"],"names":[],"mappings":"AAAA,OAAO,gDAAgD,CAAA;AACvD,OAAO,gCAAgC,CAAA;AACvC,OAAO,wCAAwC,CAAA;AAC/C,OAAO,wCAAwC,CAAA;AAC/C,OAAO,uCAAuC,CAAA;AAE9C,eAAe;IACb;QACE,IAAI,EAAE,2BAA2B;QACjC,OAAO,EAAE,2CAA2C;KACrD;IACD;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,2BAA2B;KACrC;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,mCAAmC;KAC7C;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,mCAAmC;KAC7C;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,kCAAkC;KAC5C;CACF,CAAA","sourcesContent":["import './property-editor-location-increase-pattern.js'\nimport './property-editor-gltf-info.js'\nimport './property-editor-gltf-fill-targets.js'\nimport './property-editor-gltf-play-targets.js'\nimport './property-editor-stocker-location.js'\n\nexport default [\n {\n type: 'location-increase-pattern',\n element: 'property-editor-location-increase-pattern'\n },\n {\n type: 'gltf-info',\n element: 'property-editor-gltf-info'\n },\n {\n type: 'gltf-fill-targets',\n element: 'property-editor-gltf-fill-targets'\n },\n {\n type: 'gltf-play-targets',\n element: 'property-editor-gltf-play-targets'\n },\n {\n type: 'stocker-location',\n element: 'property-editor-stocker-location'\n }\n]\n"]}
@@ -3,14 +3,17 @@ import { PropertyValues, TemplateResult } from 'lit';
3
3
  import { OxPropertyEditor, PropertySpec } from '@operato/property-editor';
4
4
  export default class GLTFFillTargetsEditor extends OxPropertyEditor {
5
5
  static styles: import("lit").CSSResult[];
6
- src?: string;
6
+ src: string | undefined;
7
7
  private _meshNames;
8
+ private _mode;
8
9
  private _component;
10
+ private _lastExternalValue;
9
11
  updated(changes: PropertyValues<this>): void;
10
12
  private _refreshMeshNames;
11
13
  editorTemplate(value: any, _spec: PropertySpec): TemplateResult;
12
- private _setAll;
14
+ private _setMode;
13
15
  private _onToggle;
16
+ private _applyValue;
14
17
  private _highlightNode;
15
18
  private _clearHighlight;
16
19
  private _getRendererManager;
@@ -2,19 +2,68 @@
2
2
  * Copyright © HatioLab Inc. All rights reserved.
3
3
  *
4
4
  * GLTF fillStyle 타겟 노드 선택 에디터.
5
- * Specific 탭에서 GLTF 모델의 Mesh 노드 목록을 체크박스로 표시하고,
6
- * 선택된 노드 이름을 fillStyleTargets 배열로 저장한다.
7
- * 마우스 오버 시 해당 노드를 OutlinePass로 강조한다.
5
+ * All / None / Custom 모드로 명시적 설정.
6
+ * Custom 모드에서 개별 Mesh 체크박스 선택.
8
7
  */
9
8
  import { __decorate } from "tslib";
10
9
  import '@operato/i18n/ox-i18n.js';
11
- import { css, html } from 'lit';
10
+ import { css, html, nothing } from 'lit';
12
11
  import { customElement, property, state } from 'lit/decorators.js';
13
12
  import { OxPropertyEditor } from '@operato/property-editor';
13
+ import { ScrollbarStyles } from '@operato/styles/scrollbar-styles.js';
14
+ function getMode(value) {
15
+ if (value === '*')
16
+ return 'all';
17
+ if (value === 'none' || !value)
18
+ return 'none';
19
+ if (Array.isArray(value) && value.length > 0)
20
+ return 'custom';
21
+ // [] (빈 배열) = custom with nothing selected
22
+ if (Array.isArray(value))
23
+ return 'custom';
24
+ return 'none';
25
+ }
14
26
  let GLTFFillTargetsEditor = class GLTFFillTargetsEditor extends OxPropertyEditor {
15
27
  static styles = [
16
28
  ...OxPropertyEditor.styles,
29
+ ScrollbarStyles,
17
30
  css `
31
+ .mode-selector {
32
+ display: flex;
33
+ gap: 0;
34
+ margin-bottom: 6px;
35
+ border: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.15));
36
+ border-radius: 6px;
37
+ overflow: hidden;
38
+ }
39
+
40
+ .mode-btn {
41
+ flex: 1;
42
+ padding: 5px 0;
43
+ font-size: 11px;
44
+ font-weight: 500;
45
+ text-align: center;
46
+ cursor: pointer;
47
+ background: var(--md-sys-color-surface-container, #f3edf7);
48
+ color: var(--md-sys-color-on-surface, #1c1b1f);
49
+ border: none;
50
+ border-right: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.1));
51
+ transition: all 0.15s;
52
+ }
53
+
54
+ .mode-btn:last-child {
55
+ border-right: none;
56
+ }
57
+
58
+ .mode-btn:hover {
59
+ background: var(--md-sys-color-surface-container-highest, #e6e0e9);
60
+ }
61
+
62
+ .mode-btn[active] {
63
+ background: var(--md-sys-color-primary, #6750a4);
64
+ color: var(--md-sys-color-on-primary, #fff);
65
+ }
66
+
18
67
  .node-list {
19
68
  display: flex;
20
69
  flex-direction: column;
@@ -27,46 +76,57 @@ let GLTFFillTargetsEditor = class GLTFFillTargetsEditor extends OxPropertyEditor
27
76
  .node-item {
28
77
  display: flex;
29
78
  align-items: center;
30
- gap: 4px;
31
- padding: 2px 4px;
79
+ gap: 6px;
80
+ padding: 4px 8px;
32
81
  cursor: pointer;
33
- border-radius: 2px;
82
+ border-radius: 4px;
83
+ transition: background 0.1s;
34
84
  }
35
85
 
36
86
  .node-item:hover {
37
- background: rgba(242, 101, 34, 0.15);
87
+ background: var(--md-sys-color-primary-container, rgba(103, 80, 164, 0.12));
38
88
  }
39
89
 
40
- .toolbar {
41
- display: flex;
42
- gap: 2px;
43
- margin-bottom: 2px;
90
+ .node-item input[type='checkbox'] {
91
+ margin: 0;
92
+ accent-color: var(--md-sys-color-primary, #6750a4);
44
93
  }
45
94
 
46
- .toolbar button {
95
+ .node-item span {
96
+ font-size: 12px;
97
+ color: var(--md-sys-color-on-surface, #1c1b1f);
98
+ }
99
+
100
+ .mode-desc {
47
101
  font-size: 11px;
48
- padding: 1px 6px;
49
- border: 1px solid var(--md-sys-color-outline, #ccc);
50
- border-radius: 2px;
51
- background: transparent;
52
- color: var(--md-sys-color-on-surface, #333);
102
+ color: var(--md-sys-color-on-surface-variant, #666);
103
+ padding: 4px 0;
104
+ }
105
+
106
+ .mini-btn {
107
+ font-size: 10px;
108
+ padding: 2px 8px;
109
+ border: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.15));
110
+ border-radius: 4px;
111
+ background: var(--md-sys-color-surface-container, #f3edf7);
112
+ color: var(--md-sys-color-on-surface, #1c1b1f);
53
113
  cursor: pointer;
54
114
  }
55
115
 
56
- .toolbar button:hover {
57
- background: rgba(0, 0, 0, 0.06);
116
+ .mini-btn:hover {
117
+ background: var(--md-sys-color-surface-container-highest, #e6e0e9);
58
118
  }
59
119
 
60
120
  .empty {
61
- color: var(--md-sys-color-outline, #999);
121
+ color: var(--md-sys-color-on-surface-variant, #999);
62
122
  font-size: 11px;
63
- padding: 4px;
123
+ padding: 8px;
124
+ text-align: center;
64
125
  }
65
126
  `
66
127
  ];
67
- src;
68
- _meshNames = [];
69
128
  _component = null;
129
+ _lastExternalValue = undefined;
70
130
  updated(changes) {
71
131
  if (changes.has('src')) {
72
132
  this.dispatchEvent(new CustomEvent('i-need-selected', {
@@ -91,77 +151,118 @@ let GLTFFillTargetsEditor = class GLTFFillTargetsEditor extends OxPropertyEditor
91
151
  this._meshNames = [];
92
152
  return;
93
153
  }
94
- // Mesh 노드만 필터링 — 그룹/본 등은 fillStyle 적용 대상이 아님
95
154
  this._meshNames = (this._component.nodeNames ?? []).filter((name) => {
96
155
  const node = ro.getNode(name);
97
156
  return node?.isMesh;
98
157
  });
99
158
  }
100
159
  editorTemplate(value, _spec) {
101
- const targets = Array.isArray(value) ? value : [];
102
- // GLTF 로드 완료 후 nodeNames가 채워지므로, 비어있으면 재시도
103
- if (this._meshNames.length === 0) {
160
+ if (!this._meshNames?.length) {
104
161
  this._refreshMeshNames();
105
162
  }
163
+ // 외부 value가 변경되면 모드 동기화
164
+ if (value !== this._lastExternalValue) {
165
+ this._lastExternalValue = value;
166
+ this._mode = getMode(value);
167
+ }
168
+ const mode = this._mode;
169
+ const meshCount = this._meshNames?.length ?? 0;
170
+ const targets = Array.isArray(this.value) ? this.value : (Array.isArray(value) ? value : []);
106
171
  return html `
107
172
  <fieldset fullwidth>
108
- <legend><ox-i18n msgid="label.fill-targets">fillStyle Targets</ox-i18n></legend>
109
- ${this._meshNames.length > 0
110
- ? html `<div class="toolbar">
111
- <button type="button" @click=${() => this._setAll(true)}>All</button>
112
- <button type="button" @click=${() => this._setAll(false)}>None</button>
113
- </div>`
114
- : ''}
115
- <div class="node-list">
116
- ${this._meshNames.length === 0
117
- ? html `<div class="empty">
118
- <ox-i18n msgid="label.no-gltf-meshes">No meshes available</ox-i18n>
119
- </div>`
120
- : this._meshNames.map(name => html `
121
- <label
122
- class="node-item"
123
- @mouseenter=${() => this._highlightNode(name)}
124
- @mouseleave=${() => this._clearHighlight()}
125
- >
126
- <input
127
- type="checkbox"
128
- .checked=${targets.includes(name)}
129
- @change=${(e) => {
130
- e.stopPropagation();
131
- this._onToggle(name, e.target.checked);
132
- }}
133
- />
134
- <span>${name}</span>
135
- </label>
136
- `)}
137
- </div>
173
+ ${meshCount > 0
174
+ ? html `
175
+ <div class="mode-selector">
176
+ <div class="mode-btn" ?active=${mode === 'all'} @click=${() => this._setMode('all')}>All</div>
177
+ <div class="mode-btn" ?active=${mode === 'none'} @click=${() => this._setMode('none')}>None</div>
178
+ <div class="mode-btn" ?active=${mode === 'custom'} @click=${() => this._setMode('custom')}>Custom</div>
179
+ </div>
180
+
181
+ ${mode === 'all'
182
+ ? html `<div class="mode-desc">${meshCount} meshes — fillStyle applies to all</div>`
183
+ : nothing}
184
+ ${mode === 'none'
185
+ ? html `<div class="mode-desc">fillStyle not applied to any mesh</div>`
186
+ : nothing}
187
+ ${mode === 'custom'
188
+ ? html `
189
+ <div style="display:flex;align-items:center;gap:6px">
190
+ <div class="mode-desc" style="flex:1">${targets.length} / ${meshCount} selected</div>
191
+ <button class="mini-btn" @click=${() => this._applyValue([...(this._meshNames ?? [])])}>All</button>
192
+ <button class="mini-btn" @click=${() => this._applyValue([])}>Clear</button>
193
+ </div>
194
+ <div class="node-list">
195
+ ${(this._meshNames ?? []).map(name => html `
196
+ <label
197
+ class="node-item"
198
+ @mouseenter=${() => this._highlightNode(name)}
199
+ @mouseleave=${() => this._clearHighlight()}
200
+ >
201
+ <input
202
+ type="checkbox"
203
+ .checked=${targets.includes(name)}
204
+ @change=${(e) => {
205
+ e.stopPropagation();
206
+ this._onToggle(name, e.target.checked, targets);
207
+ }}
208
+ />
209
+ <span>${name}</span>
210
+ </label>
211
+ `)}
212
+ </div>
213
+ `
214
+ : nothing}
215
+ `
216
+ : html `<div class="empty">
217
+ <ox-i18n msgid="label.no-gltf-meshes">No meshes available</ox-i18n>
218
+ </div>`}
138
219
  </fieldset>
139
220
  `;
140
221
  }
141
- _setAll(select) {
142
- const newValue = select ? [...this._meshNames] : undefined;
143
- this.dispatchEvent(new CustomEvent('i-need-selected', {
144
- bubbles: true,
145
- composed: true,
146
- detail: {
147
- callback: (selected) => {
148
- selected[0].set('fillStyleTargets', newValue);
222
+ _setMode(mode) {
223
+ const prevMode = this._mode;
224
+ this._mode = mode;
225
+ let newValue;
226
+ switch (mode) {
227
+ case 'all':
228
+ newValue = '*';
229
+ break;
230
+ case 'none':
231
+ newValue = 'none';
232
+ break;
233
+ case 'custom':
234
+ // 이전 상태에 따라: All → 전체 선택, None → 전체 해제
235
+ if (prevMode === 'all') {
236
+ newValue = [...(this._meshNames ?? [])];
149
237
  }
150
- }
151
- }));
238
+ else if (prevMode === 'none') {
239
+ newValue = [];
240
+ }
241
+ else {
242
+ // 이미 custom이면 현재 값 유지
243
+ newValue = Array.isArray(this.value) ? this.value : [];
244
+ }
245
+ break;
246
+ }
247
+ this._applyValue(newValue);
152
248
  }
153
- _onToggle(name, checked) {
154
- const current = [...(Array.isArray(this.value) ? this.value : [])];
249
+ _onToggle(name, checked, current) {
250
+ const list = [...current];
155
251
  if (checked) {
156
- if (!current.includes(name))
157
- current.push(name);
252
+ if (!list.includes(name))
253
+ list.push(name);
158
254
  }
159
255
  else {
160
- const idx = current.indexOf(name);
256
+ const idx = list.indexOf(name);
161
257
  if (idx >= 0)
162
- current.splice(idx, 1);
258
+ list.splice(idx, 1);
163
259
  }
164
- const newValue = current.length > 0 ? current : undefined;
260
+ this._applyValue(list);
261
+ }
262
+ _applyValue(newValue) {
263
+ // 로컬 value 즉시 반영 (re-render)
264
+ this.value = newValue;
265
+ this.requestUpdate();
165
266
  this.dispatchEvent(new CustomEvent('i-need-selected', {
166
267
  bubbles: true,
167
268
  composed: true,
@@ -187,14 +288,12 @@ let GLTFFillTargetsEditor = class GLTFFillTargetsEditor extends OxPropertyEditor
187
288
  const ro = this._component?.realObject;
188
289
  if (!ro)
189
290
  return;
190
- // 선택 상태의 아웃라인 복원 (전체 GLTF 오브젝트)
191
291
  this._getRendererManager()?.setOutlineObjects(ro.object3d ? [ro.object3d] : []);
192
292
  this._component?.invalidate();
193
293
  }
194
294
  _getRendererManager() {
195
295
  const ro = this._component?.realObject;
196
296
  const container = ro?.threeContainer;
197
- // ThreeContainer._capability 또는 ModelLayer._threeCapability
198
297
  return container?._capability?.rendererManager ?? container?._threeCapability?.rendererManager ?? null;
199
298
  }
200
299
  };
@@ -204,6 +303,9 @@ __decorate([
204
303
  __decorate([
205
304
  state()
206
305
  ], GLTFFillTargetsEditor.prototype, "_meshNames", void 0);
306
+ __decorate([
307
+ state()
308
+ ], GLTFFillTargetsEditor.prototype, "_mode", void 0);
207
309
  GLTFFillTargetsEditor = __decorate([
208
310
  customElement('property-editor-gltf-fill-targets')
209
311
  ], GLTFFillTargetsEditor);
@@ -1 +1 @@
1
- {"version":3,"file":"property-editor-gltf-fill-targets.js","sourceRoot":"","sources":["../../src/editors/property-editor-gltf-fill-targets.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;;AAEH,OAAO,0BAA0B,CAAA;AAEjC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAkC,MAAM,KAAK,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,gBAAgB,EAAgB,MAAM,0BAA0B,CAAA;AAG1D,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,gBAAgB;IACjE,MAAM,CAAC,MAAM,GAAG;QACd,GAAG,gBAAgB,CAAC,MAAM;QAC1B,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAgDF;KACF,CAAA;IAE2B,GAAG,CAAS;IAEvB,UAAU,GAAa,EAAE,CAAA;IAElC,UAAU,GAAQ,IAAI,CAAA;IAE9B,OAAO,CAAC,OAA6B;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,iBAAiB,EAAE;gBACjC,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,QAAQ,EAAE,CAAC,QAAe,EAAE,EAAE;wBAC5B,IAAI,CAAC,UAAU,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;wBAC/B,IAAI,CAAC,iBAAiB,EAAE,CAAA;oBAC1B,CAAC;iBACF;aACF,CAAC,CACH,CAAA;QACH,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;YACpB,OAAM;QACR,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,UAAiB,CAAA;QAC5C,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;YACpB,OAAM;QACR,CAAC;QAED,6CAA6C;QAC7C,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;YAC1E,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC7B,OAAO,IAAI,EAAE,MAAM,CAAA;QACrB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,cAAc,CAAC,KAAU,EAAE,KAAmB;QAC5C,MAAM,OAAO,GAAa,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAE3D,2CAA2C;QAC3C,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAC1B,CAAC;QAED,OAAO,IAAI,CAAA;;;UAGL,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,IAAI,CAAA;+CAC6B,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;+CACxB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;qBACnD;YACT,CAAC,CAAC,EAAE;;YAEJ,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAA;;qBAEG;YACT,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CACjB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAA;;;kCAGM,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;kCAC/B,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE;;;;iCAI7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gCACvB,CAAC,CAAQ,EAAE,EAAE;gBACrB,CAAC,CAAC,eAAe,EAAE,CAAA;gBACnB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAG,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC,CAAA;YAC9D,CAAC;;4BAEK,IAAI;;iBAEf,CACF;;;KAGV,CAAA;IACH,CAAC;IAEO,OAAO,CAAC,MAAe;QAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAE1D,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,iBAAiB,EAAE;YACjC,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,QAAQ,EAAE,CAAC,QAAe,EAAE,EAAE;oBAC5B,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAA;gBAC/C,CAAC;aACF;SACF,CAAC,CACH,CAAA;IACH,CAAC;IAEO,SAAS,CAAC,IAAY,EAAE,OAAgB;QAC9C,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAClE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACjC,IAAI,GAAG,IAAI,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACtC,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;QAEzD,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,iBAAiB,EAAE;YACjC,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,QAAQ,EAAE,CAAC,QAAe,EAAE,EAAE;oBAC5B,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAA;gBAC/C,CAAC;aACF;SACF,CAAC,CACH,CAAA;IACH,CAAC;IAED,qBAAqB;IAEb,cAAc,CAAC,IAAY;QACjC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,UAAiB,CAAA;QAC7C,IAAI,CAAC,EAAE,EAAE,OAAO;YAAE,OAAM;QAExB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAM;QAEjB,IAAI,CAAC,mBAAmB,EAAE,EAAE,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QACrD,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,CAAA;IAC/B,CAAC;IAEO,eAAe;QACrB,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,UAAiB,CAAA;QAC7C,IAAI,CAAC,EAAE;YAAE,OAAM;QAEf,gCAAgC;QAChC,IAAI,CAAC,mBAAmB,EAAE,EAAE,iBAAiB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC/E,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,CAAA;IAC/B,CAAC;IAEO,mBAAmB;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,UAAiB,CAAA;QAC7C,MAAM,SAAS,GAAG,EAAE,EAAE,cAAqB,CAAA;QAC3C,4DAA4D;QAC5D,OAAO,SAAS,EAAE,WAAW,EAAE,eAAe,IAAI,SAAS,EAAE,gBAAgB,EAAE,eAAe,IAAI,IAAI,CAAA;IACxG,CAAC;;AA3J2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDAAa;AAEvB;IAAhB,KAAK,EAAE;yDAAkC;AAxDvB,qBAAqB;IADzC,aAAa,CAAC,mCAAmC,CAAC;GAC9B,qBAAqB,CAkNzC;eAlNoB,qBAAqB","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n *\n * GLTF fillStyle 타겟 노드 선택 에디터.\n * Specific 탭에서 GLTF 모델의 Mesh 노드 목록을 체크박스로 표시하고,\n * 선택된 노드 이름을 fillStyleTargets 배열로 저장한다.\n * 마우스 오버 시 해당 노드를 OutlinePass로 강조한다.\n */\n\nimport '@operato/i18n/ox-i18n.js'\n\nimport { css, html, PropertyValues, TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { OxPropertyEditor, PropertySpec } from '@operato/property-editor'\n\n@customElement('property-editor-gltf-fill-targets')\nexport default class GLTFFillTargetsEditor extends OxPropertyEditor {\n static styles = [\n ...OxPropertyEditor.styles,\n css`\n .node-list {\n display: flex;\n flex-direction: column;\n gap: 1px;\n max-height: 200px;\n overflow-y: auto;\n font-size: 12px;\n }\n\n .node-item {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 2px 4px;\n cursor: pointer;\n border-radius: 2px;\n }\n\n .node-item:hover {\n background: rgba(242, 101, 34, 0.15);\n }\n\n .toolbar {\n display: flex;\n gap: 2px;\n margin-bottom: 2px;\n }\n\n .toolbar button {\n font-size: 11px;\n padding: 1px 6px;\n border: 1px solid var(--md-sys-color-outline, #ccc);\n border-radius: 2px;\n background: transparent;\n color: var(--md-sys-color-on-surface, #333);\n cursor: pointer;\n }\n\n .toolbar button:hover {\n background: rgba(0, 0, 0, 0.06);\n }\n\n .empty {\n color: var(--md-sys-color-outline, #999);\n font-size: 11px;\n padding: 4px;\n }\n `\n ]\n\n @property({ type: String }) src?: string\n\n @state() private _meshNames: string[] = []\n\n private _component: any = null\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('src')) {\n this.dispatchEvent(\n new CustomEvent('i-need-selected', {\n bubbles: true,\n composed: true,\n detail: {\n callback: (selected: any[]) => {\n this._component = selected?.[0]\n this._refreshMeshNames()\n }\n }\n })\n )\n }\n }\n\n private _refreshMeshNames() {\n if (!this._component) {\n this._meshNames = []\n return\n }\n\n const ro = this._component.realObject as any\n if (!ro?.getNode) {\n this._meshNames = []\n return\n }\n\n // Mesh 노드만 필터링 — 그룹/본 등은 fillStyle 적용 대상이 아님\n this._meshNames = (this._component.nodeNames ?? []).filter((name: string) => {\n const node = ro.getNode(name)\n return node?.isMesh\n })\n }\n\n editorTemplate(value: any, _spec: PropertySpec): TemplateResult {\n const targets: string[] = Array.isArray(value) ? value : []\n\n // GLTF 로드 완료 후 nodeNames가 채워지므로, 비어있으면 재시도\n if (this._meshNames.length === 0) {\n this._refreshMeshNames()\n }\n\n return html`\n <fieldset fullwidth>\n <legend><ox-i18n msgid=\"label.fill-targets\">fillStyle Targets</ox-i18n></legend>\n ${this._meshNames.length > 0\n ? html`<div class=\"toolbar\">\n <button type=\"button\" @click=${() => this._setAll(true)}>All</button>\n <button type=\"button\" @click=${() => this._setAll(false)}>None</button>\n </div>`\n : ''}\n <div class=\"node-list\">\n ${this._meshNames.length === 0\n ? html`<div class=\"empty\">\n <ox-i18n msgid=\"label.no-gltf-meshes\">No meshes available</ox-i18n>\n </div>`\n : this._meshNames.map(\n name => html`\n <label\n class=\"node-item\"\n @mouseenter=${() => this._highlightNode(name)}\n @mouseleave=${() => this._clearHighlight()}\n >\n <input\n type=\"checkbox\"\n .checked=${targets.includes(name)}\n @change=${(e: Event) => {\n e.stopPropagation()\n this._onToggle(name, (e.target as HTMLInputElement).checked)\n }}\n />\n <span>${name}</span>\n </label>\n `\n )}\n </div>\n </fieldset>\n `\n }\n\n private _setAll(select: boolean) {\n const newValue = select ? [...this._meshNames] : undefined\n\n this.dispatchEvent(\n new CustomEvent('i-need-selected', {\n bubbles: true,\n composed: true,\n detail: {\n callback: (selected: any[]) => {\n selected[0].set('fillStyleTargets', newValue)\n }\n }\n })\n )\n }\n\n private _onToggle(name: string, checked: boolean) {\n const current = [...(Array.isArray(this.value) ? this.value : [])]\n if (checked) {\n if (!current.includes(name)) current.push(name)\n } else {\n const idx = current.indexOf(name)\n if (idx >= 0) current.splice(idx, 1)\n }\n\n const newValue = current.length > 0 ? current : undefined\n\n this.dispatchEvent(\n new CustomEvent('i-need-selected', {\n bubbles: true,\n composed: true,\n detail: {\n callback: (selected: any[]) => {\n selected[0].set('fillStyleTargets', newValue)\n }\n }\n })\n )\n }\n\n // --- Outline 강조 ---\n\n private _highlightNode(name: string) {\n const ro = this._component?.realObject as any\n if (!ro?.getNode) return\n\n const node = ro.getNode(name)\n if (!node) return\n\n this._getRendererManager()?.setOutlineObjects([node])\n this._component?.invalidate()\n }\n\n private _clearHighlight() {\n const ro = this._component?.realObject as any\n if (!ro) return\n\n // 선택 상태의 아웃라인 복원 (전체 GLTF 오브젝트)\n this._getRendererManager()?.setOutlineObjects(ro.object3d ? [ro.object3d] : [])\n this._component?.invalidate()\n }\n\n private _getRendererManager(): any {\n const ro = this._component?.realObject as any\n const container = ro?.threeContainer as any\n // ThreeContainer._capability 또는 ModelLayer._threeCapability\n return container?._capability?.rendererManager ?? container?._threeCapability?.rendererManager ?? null\n }\n}\n"]}
1
+ {"version":3,"file":"property-editor-gltf-fill-targets.js","sourceRoot":"","sources":["../../src/editors/property-editor-gltf-fill-targets.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n *\n * GLTF fillStyle 타겟 노드 선택 에디터.\n * All / None / Custom 모드로 명시적 설정.\n * Custom 모드에서 개별 Mesh 체크박스 선택.\n */\n\nimport '@operato/i18n/ox-i18n.js'\n\nimport { css, html, PropertyValues, TemplateResult, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { OxPropertyEditor, PropertySpec } from '@operato/property-editor'\nimport { ScrollbarStyles } from '@operato/styles/scrollbar-styles.js'\n\n// fillStyleTargets 값 규칙:\n// undefined 또는 미설정 → None (적용 안 함, 기본값)\n// '*' → All (전체 메시 적용)\n// ['mesh_0', ...] → Custom (선택 메시만 적용)\n\ntype FillMode = 'all' | 'none' | 'custom'\n\nfunction getMode(value: any): FillMode {\n if (value === '*') return 'all'\n if (value === 'none' || !value) return 'none'\n if (Array.isArray(value) && value.length > 0) return 'custom'\n // [] (빈 배열) = custom with nothing selected\n if (Array.isArray(value)) return 'custom'\n return 'none'\n}\n\n@customElement('property-editor-gltf-fill-targets')\nexport default class GLTFFillTargetsEditor extends OxPropertyEditor {\n static styles = [\n ...OxPropertyEditor.styles,\n ScrollbarStyles,\n css`\n .mode-selector {\n display: flex;\n gap: 0;\n margin-bottom: 6px;\n border: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.15));\n border-radius: 6px;\n overflow: hidden;\n }\n\n .mode-btn {\n flex: 1;\n padding: 5px 0;\n font-size: 11px;\n font-weight: 500;\n text-align: center;\n cursor: pointer;\n background: var(--md-sys-color-surface-container, #f3edf7);\n color: var(--md-sys-color-on-surface, #1c1b1f);\n border: none;\n border-right: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.1));\n transition: all 0.15s;\n }\n\n .mode-btn:last-child {\n border-right: none;\n }\n\n .mode-btn:hover {\n background: var(--md-sys-color-surface-container-highest, #e6e0e9);\n }\n\n .mode-btn[active] {\n background: var(--md-sys-color-primary, #6750a4);\n color: var(--md-sys-color-on-primary, #fff);\n }\n\n .node-list {\n display: flex;\n flex-direction: column;\n gap: 1px;\n max-height: 200px;\n overflow-y: auto;\n font-size: 12px;\n }\n\n .node-item {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.1s;\n }\n\n .node-item:hover {\n background: var(--md-sys-color-primary-container, rgba(103, 80, 164, 0.12));\n }\n\n .node-item input[type='checkbox'] {\n margin: 0;\n accent-color: var(--md-sys-color-primary, #6750a4);\n }\n\n .node-item span {\n font-size: 12px;\n color: var(--md-sys-color-on-surface, #1c1b1f);\n }\n\n .mode-desc {\n font-size: 11px;\n color: var(--md-sys-color-on-surface-variant, #666);\n padding: 4px 0;\n }\n\n .mini-btn {\n font-size: 10px;\n padding: 2px 8px;\n border: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.15));\n border-radius: 4px;\n background: var(--md-sys-color-surface-container, #f3edf7);\n color: var(--md-sys-color-on-surface, #1c1b1f);\n cursor: pointer;\n }\n\n .mini-btn:hover {\n background: var(--md-sys-color-surface-container-highest, #e6e0e9);\n }\n\n .empty {\n color: var(--md-sys-color-on-surface-variant, #999);\n font-size: 11px;\n padding: 8px;\n text-align: center;\n }\n `\n ]\n\n @property({ type: String }) declare src: string | undefined\n\n @state() declare private _meshNames: string[]\n @state() declare private _mode: FillMode\n\n private _component: any = null\n private _lastExternalValue: any = undefined\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('src')) {\n this.dispatchEvent(\n new CustomEvent('i-need-selected', {\n bubbles: true,\n composed: true,\n detail: {\n callback: (selected: any[]) => {\n this._component = selected?.[0]\n this._refreshMeshNames()\n }\n }\n })\n )\n }\n }\n\n private _refreshMeshNames() {\n if (!this._component) {\n this._meshNames = []\n return\n }\n\n const ro = this._component.realObject as any\n if (!ro?.getNode) {\n this._meshNames = []\n return\n }\n\n this._meshNames = ((this._component.nodeNames as string[]) ?? []).filter((name: string) => {\n const node = ro.getNode(name)\n return node?.isMesh\n })\n }\n\n editorTemplate(value: any, _spec: PropertySpec): TemplateResult {\n if (!this._meshNames?.length) {\n this._refreshMeshNames()\n }\n\n // 외부 value가 변경되면 모드 동기화\n if (value !== this._lastExternalValue) {\n this._lastExternalValue = value\n this._mode = getMode(value)\n }\n\n const mode = this._mode\n const meshCount = this._meshNames?.length ?? 0\n const targets: string[] = Array.isArray(this.value) ? this.value : (Array.isArray(value) ? value : [])\n\n return html`\n <fieldset fullwidth>\n ${meshCount > 0\n ? html`\n <div class=\"mode-selector\">\n <div class=\"mode-btn\" ?active=${mode === 'all'} @click=${() => this._setMode('all')}>All</div>\n <div class=\"mode-btn\" ?active=${mode === 'none'} @click=${() => this._setMode('none')}>None</div>\n <div class=\"mode-btn\" ?active=${mode === 'custom'} @click=${() => this._setMode('custom')}>Custom</div>\n </div>\n\n ${mode === 'all'\n ? html`<div class=\"mode-desc\">${meshCount} meshes — fillStyle applies to all</div>`\n : nothing}\n ${mode === 'none'\n ? html`<div class=\"mode-desc\">fillStyle not applied to any mesh</div>`\n : nothing}\n ${mode === 'custom'\n ? html`\n <div style=\"display:flex;align-items:center;gap:6px\">\n <div class=\"mode-desc\" style=\"flex:1\">${targets.length} / ${meshCount} selected</div>\n <button class=\"mini-btn\" @click=${() => this._applyValue([...(this._meshNames ?? [])])}>All</button>\n <button class=\"mini-btn\" @click=${() => this._applyValue([])}>Clear</button>\n </div>\n <div class=\"node-list\">\n ${(this._meshNames ?? []).map(\n name => html`\n <label\n class=\"node-item\"\n @mouseenter=${() => this._highlightNode(name)}\n @mouseleave=${() => this._clearHighlight()}\n >\n <input\n type=\"checkbox\"\n .checked=${targets.includes(name)}\n @change=${(e: Event) => {\n e.stopPropagation()\n this._onToggle(name, (e.target as HTMLInputElement).checked, targets)\n }}\n />\n <span>${name}</span>\n </label>\n `\n )}\n </div>\n `\n : nothing}\n `\n : html`<div class=\"empty\">\n <ox-i18n msgid=\"label.no-gltf-meshes\">No meshes available</ox-i18n>\n </div>`}\n </fieldset>\n `\n }\n\n private _setMode(mode: FillMode) {\n const prevMode = this._mode\n this._mode = mode\n\n let newValue: any\n switch (mode) {\n case 'all':\n newValue = '*'\n break\n case 'none':\n newValue = 'none'\n break\n case 'custom':\n // 이전 상태에 따라: All → 전체 선택, None → 전체 해제\n if (prevMode === 'all') {\n newValue = [...(this._meshNames ?? [])]\n } else if (prevMode === 'none') {\n newValue = []\n } else {\n // 이미 custom이면 현재 값 유지\n newValue = Array.isArray(this.value) ? this.value : []\n }\n break\n }\n\n this._applyValue(newValue)\n }\n\n private _onToggle(name: string, checked: boolean, current: string[]) {\n const list = [...current]\n if (checked) {\n if (!list.includes(name)) list.push(name)\n } else {\n const idx = list.indexOf(name)\n if (idx >= 0) list.splice(idx, 1)\n }\n\n this._applyValue(list)\n }\n\n private _applyValue(newValue: any) {\n // 로컬 value 즉시 반영 (re-render)\n this.value = newValue\n this.requestUpdate()\n\n this.dispatchEvent(\n new CustomEvent('i-need-selected', {\n bubbles: true,\n composed: true,\n detail: {\n callback: (selected: any[]) => {\n selected[0].set('fillStyleTargets', newValue)\n }\n }\n })\n )\n }\n\n // --- Outline 강조 ---\n\n private _highlightNode(name: string) {\n const ro = this._component?.realObject as any\n if (!ro?.getNode) return\n\n const node = ro.getNode(name)\n if (!node) return\n\n this._getRendererManager()?.setOutlineObjects([node])\n this._component?.invalidate()\n }\n\n private _clearHighlight() {\n const ro = this._component?.realObject as any\n if (!ro) return\n\n this._getRendererManager()?.setOutlineObjects(ro.object3d ? [ro.object3d] : [])\n this._component?.invalidate()\n }\n\n private _getRendererManager(): any {\n const ro = this._component?.realObject as any\n const container = ro?.threeContainer as any\n return container?._capability?.rendererManager ?? container?._threeCapability?.rendererManager ?? null\n }\n}\n"]}
@@ -1,16 +1,38 @@
1
1
  import '@material/web/icon/icon.js';
2
- import '@material/web/button/elevated-button.js';
3
2
  import '@operato/i18n/ox-i18n.js';
4
3
  import { PropertyValues, TemplateResult } from 'lit';
5
4
  import { OxPropertyEditor, PropertySpec } from '@operato/property-editor';
6
5
  import { Component } from '@hatiolab/things-scene';
7
6
  export default class GLTFInfoEditor extends OxPropertyEditor {
8
7
  static styles: import("lit").CSSResult[];
9
- src?: string;
8
+ src: string | undefined;
9
+ private _component;
10
10
  width: number;
11
11
  height: number;
12
12
  depth: number;
13
+ currentWidth: number;
14
+ currentHeight: number;
15
+ currentDepth: number;
16
+ meshCount: number;
17
+ vertexCount: number;
18
+ animationCount: number;
19
+ materialCount: number;
20
+ constructor();
13
21
  editorTemplate(value: any, spec: PropertySpec): TemplateResult;
22
+ private _formatNumber;
23
+ private _isProportional;
24
+ private _applyAction;
25
+ /**
26
+ * W, H 중 짧은 쪽을 기준으로 원래 모델의 비율에 맞게 치수를 조절한다.
27
+ * (contain 방식 — 모델이 컴포넌트 영역 안에 들어감)
28
+ */
29
+ private _applyProportional;
30
+ private _getRatioLock;
31
+ private _setRatioLock;
32
+ private _refreshCurrentSize;
14
33
  updated(changes: PropertyValues<this>): void;
15
- fetchSourceInfo(component: Component, src: string): Promise<unknown>;
34
+ private _pollTimer?;
35
+ fetchSourceInfo(component: Component, src: string): Promise<void>;
36
+ private _tryReadFromRealObject;
37
+ disconnectedCallback(): void;
16
38
  }