@littlecarlito/blorktools 0.50.3 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/bin/cli.js +69 -0
  2. package/package.json +13 -7
  3. package/src/asset_debugger/axis-indicator/axis-indicator.css +6 -0
  4. package/src/asset_debugger/axis-indicator/axis-indicator.html +20 -0
  5. package/src/asset_debugger/axis-indicator/axis-indicator.js +822 -0
  6. package/src/asset_debugger/debugger-scene/debugger-scene.css +142 -0
  7. package/src/asset_debugger/debugger-scene/debugger-scene.html +80 -0
  8. package/src/asset_debugger/debugger-scene/debugger-scene.js +791 -0
  9. package/src/asset_debugger/header/header.css +73 -0
  10. package/src/asset_debugger/header/header.html +24 -0
  11. package/src/asset_debugger/header/header.js +224 -0
  12. package/src/asset_debugger/index.html +76 -0
  13. package/src/asset_debugger/landing-page/landing-page.css +396 -0
  14. package/src/asset_debugger/landing-page/landing-page.html +81 -0
  15. package/src/asset_debugger/landing-page/landing-page.js +611 -0
  16. package/src/asset_debugger/loading-splash/loading-splash.css +195 -0
  17. package/src/asset_debugger/loading-splash/loading-splash.html +22 -0
  18. package/src/asset_debugger/loading-splash/loading-splash.js +59 -0
  19. package/src/asset_debugger/loading-splash/preview-loading-splash.js +66 -0
  20. package/src/asset_debugger/main.css +14 -0
  21. package/src/asset_debugger/modals/examples-modal/examples-modal.css +41 -0
  22. package/src/asset_debugger/modals/examples-modal/examples-modal.html +18 -0
  23. package/src/asset_debugger/modals/examples-modal/examples-modal.js +111 -0
  24. package/src/asset_debugger/modals/examples-modal/examples.js +125 -0
  25. package/src/asset_debugger/modals/html-editor-modal/html-editor-modal.css +452 -0
  26. package/src/asset_debugger/modals/html-editor-modal/html-editor-modal.html +87 -0
  27. package/src/asset_debugger/modals/html-editor-modal/html-editor-modal.js +675 -0
  28. package/src/asset_debugger/modals/mesh-info-modal/mesh-info-modal.css +219 -0
  29. package/src/asset_debugger/modals/mesh-info-modal/mesh-info-modal.html +20 -0
  30. package/src/asset_debugger/modals/mesh-info-modal/mesh-info-modal.js +548 -0
  31. package/src/asset_debugger/modals/settings-modal/settings-modal.css +103 -0
  32. package/src/asset_debugger/modals/settings-modal/settings-modal.html +158 -0
  33. package/src/asset_debugger/modals/settings-modal/settings-modal.js +475 -0
  34. package/src/asset_debugger/panels/asset-panel/asset-panel.css +263 -0
  35. package/src/asset_debugger/panels/asset-panel/asset-panel.html +123 -0
  36. package/src/asset_debugger/panels/asset-panel/asset-panel.js +136 -0
  37. package/src/asset_debugger/panels/asset-panel/atlas-heading/atlas-heading.css +94 -0
  38. package/src/asset_debugger/panels/asset-panel/atlas-heading/atlas-heading.js +312 -0
  39. package/src/asset_debugger/panels/asset-panel/mesh-heading/mesh-heading.css +129 -0
  40. package/src/asset_debugger/panels/asset-panel/mesh-heading/mesh-heading.js +486 -0
  41. package/src/asset_debugger/panels/asset-panel/rig-heading/rig-heading.css +545 -0
  42. package/src/asset_debugger/panels/asset-panel/rig-heading/rig-heading.js +538 -0
  43. package/src/asset_debugger/panels/asset-panel/uv-heading/uv-heading.css +70 -0
  44. package/src/asset_debugger/panels/asset-panel/uv-heading/uv-heading.js +586 -0
  45. package/src/asset_debugger/panels/world-panel/world-panel.css +364 -0
  46. package/src/asset_debugger/panels/world-panel/world-panel.html +173 -0
  47. package/src/asset_debugger/panels/world-panel/world-panel.js +1891 -0
  48. package/src/asset_debugger/router.js +190 -0
  49. package/src/asset_debugger/util/animation/playback/animation-playback-controller.js +150 -0
  50. package/src/asset_debugger/util/animation/playback/animation-preview-controller.js +316 -0
  51. package/src/asset_debugger/util/animation/playback/css3d-bounce-controller.js +400 -0
  52. package/src/asset_debugger/util/animation/playback/css3d-reversal-controller.js +821 -0
  53. package/src/asset_debugger/util/animation/render/css3d-prerender-controller.js +696 -0
  54. package/src/asset_debugger/util/animation/render/debug-texture-factory.js +0 -0
  55. package/src/asset_debugger/util/animation/render/iframe2texture-render-controller.js +199 -0
  56. package/src/asset_debugger/util/animation/render/image2texture-prerender-controller.js +461 -0
  57. package/src/asset_debugger/util/animation/render/pbr-material-factory.js +82 -0
  58. package/src/asset_debugger/util/common.css +280 -0
  59. package/src/asset_debugger/util/data/animation-classifier.js +323 -0
  60. package/src/asset_debugger/util/data/duplicate-handler.js +20 -0
  61. package/src/asset_debugger/util/data/glb-buffer-manager.js +407 -0
  62. package/src/asset_debugger/util/data/glb-classifier.js +290 -0
  63. package/src/asset_debugger/util/data/html-formatter.js +76 -0
  64. package/src/asset_debugger/util/data/html-linter.js +276 -0
  65. package/src/asset_debugger/util/data/localstorage-manager.js +265 -0
  66. package/src/asset_debugger/util/data/mesh-html-manager.js +295 -0
  67. package/src/asset_debugger/util/data/string-serder.js +303 -0
  68. package/src/asset_debugger/util/data/texture-classifier.js +663 -0
  69. package/src/asset_debugger/util/data/upload/background-file-handler.js +292 -0
  70. package/src/asset_debugger/util/data/upload/dropzone-preview-controller.js +396 -0
  71. package/src/asset_debugger/util/data/upload/file-upload-manager.js +495 -0
  72. package/src/asset_debugger/util/data/upload/glb-file-handler.js +36 -0
  73. package/src/asset_debugger/util/data/upload/glb-preview-controller.js +317 -0
  74. package/src/asset_debugger/util/data/upload/lighting-file-handler.js +194 -0
  75. package/src/asset_debugger/util/data/upload/model-file-manager.js +104 -0
  76. package/src/asset_debugger/util/data/upload/texture-file-handler.js +166 -0
  77. package/src/asset_debugger/util/data/upload/zip-handler.js +686 -0
  78. package/src/asset_debugger/util/loaders/html2canvas-loader.js +107 -0
  79. package/src/asset_debugger/util/rig/bone-kinematics.js +403 -0
  80. package/src/asset_debugger/util/rig/rig-constraint-manager.js +618 -0
  81. package/src/asset_debugger/util/rig/rig-controller.js +612 -0
  82. package/src/asset_debugger/util/rig/rig-factory.js +628 -0
  83. package/src/asset_debugger/util/rig/rig-handle-factory.js +46 -0
  84. package/src/asset_debugger/util/rig/rig-label-factory.js +441 -0
  85. package/src/asset_debugger/util/rig/rig-mouse-handler.js +377 -0
  86. package/src/asset_debugger/util/rig/rig-state-manager.js +175 -0
  87. package/src/asset_debugger/util/rig/rig-tooltip-manager.js +267 -0
  88. package/src/asset_debugger/util/rig/rig-ui-factory.js +700 -0
  89. package/src/asset_debugger/util/scene/background-manager.js +284 -0
  90. package/src/asset_debugger/util/scene/camera-controller.js +243 -0
  91. package/src/asset_debugger/util/scene/css3d-debug-controller.js +406 -0
  92. package/src/asset_debugger/util/scene/css3d-frame-factory.js +113 -0
  93. package/src/asset_debugger/util/scene/css3d-scene-manager.js +529 -0
  94. package/src/asset_debugger/util/scene/glb-controller.js +208 -0
  95. package/src/asset_debugger/util/scene/lighting-manager.js +690 -0
  96. package/src/asset_debugger/util/scene/threejs-model-manager.js +437 -0
  97. package/src/asset_debugger/util/scene/threejs-preview-manager.js +207 -0
  98. package/src/asset_debugger/util/scene/threejs-preview-setup.js +478 -0
  99. package/src/asset_debugger/util/scene/threejs-scene-controller.js +286 -0
  100. package/src/asset_debugger/util/scene/ui-manager.js +107 -0
  101. package/src/asset_debugger/util/state/animation-state.js +128 -0
  102. package/src/asset_debugger/util/state/css3d-state.js +83 -0
  103. package/src/asset_debugger/util/state/glb-preview-state.js +31 -0
  104. package/src/asset_debugger/util/state/log-util.js +197 -0
  105. package/src/asset_debugger/util/state/scene-state.js +452 -0
  106. package/src/asset_debugger/util/state/threejs-state.js +54 -0
  107. package/src/asset_debugger/util/workers/lighting-worker.js +61 -0
  108. package/src/asset_debugger/util/workers/model-worker.js +109 -0
  109. package/src/asset_debugger/util/workers/texture-worker.js +54 -0
  110. package/src/asset_debugger/util/workers/worker-manager.js +212 -0
  111. package/src/asset_debugger/widgets/mesh-info-widget.js +280 -0
  112. package/src/index.html +261 -0
  113. package/src/index.js +8 -0
  114. package/vite.config.js +66 -0
@@ -0,0 +1,263 @@
1
+ /* Asset Panel Styles */
2
+
3
+ .asset-section {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: 10px;
7
+ width: 100%;
8
+ max-width: 100%;
9
+ box-sizing: border-box;
10
+ }
11
+
12
+ /* All content containers should be visible without scrollbars */
13
+ .sample-status,
14
+ .sample-data-info,
15
+ .metadata-content {
16
+ overflow: visible !important;
17
+ }
18
+
19
+ /* Section header styles */
20
+ .section-header {
21
+ padding: 4px 0;
22
+ margin-bottom: 6px;
23
+ }
24
+
25
+ /* Main section headers (Sample sections) */
26
+ .asset-section > .section-header h3.metadata-header {
27
+ margin: 0;
28
+ font-size: 1.1em;
29
+ color: #4CAF50; /* Terminal green from theme */
30
+ font-weight: 500;
31
+ text-shadow: 0 0 5px rgba(76, 175, 80, 0.3);
32
+ }
33
+
34
+ /* Main section collapse indicators */
35
+ .asset-section > .section-header .collapse-indicator {
36
+ color: #4CAF50; /* Match header color */
37
+ font-weight: 500;
38
+ }
39
+
40
+ /* Subheaders remain gray for contrast */
41
+ .section-content .metadata-header {
42
+ color: #aaa;
43
+ }
44
+
45
+ .section-content {
46
+ padding: 0 2px;
47
+ }
48
+
49
+ /* Section divider styles - reduce margins to fix spacing */
50
+ .section-divider {
51
+ height: 1px;
52
+ background-color: #333;
53
+ margin: 4px 0; /* Reduced from 8px */
54
+ width: 100%;
55
+ }
56
+
57
+ /* Remove any underlines that might be appearing */
58
+ .asset-section .section-header,
59
+ .asset-section .metadata-header,
60
+ .asset-section h3 {
61
+ border-bottom: none;
62
+ text-decoration: none;
63
+ box-shadow: none;
64
+ }
65
+
66
+ .sample-data-info {
67
+ margin-top: 8px;
68
+ width: 100%;
69
+ box-sizing: border-box;
70
+ }
71
+
72
+ .metadata-header {
73
+ font-size: 1em;
74
+ color: #aaa;
75
+ margin: 0;
76
+ font-weight: normal;
77
+ cursor: pointer; /* Add pointer cursor to make it clear it's clickable */
78
+ }
79
+
80
+ .asset-metadata {
81
+ width: 100%;
82
+ font-size: 0.9em;
83
+ color: #aaa;
84
+ table-layout: fixed;
85
+ }
86
+
87
+ .asset-metadata td {
88
+ padding: 3px 0;
89
+ }
90
+
91
+ .asset-metadata td:first-child {
92
+ width: 110px;
93
+ color: #777;
94
+ }
95
+
96
+ /* Atlas Panel Styles */
97
+ .panel-container {
98
+ width: 100%;
99
+ margin-bottom: 12px;
100
+ }
101
+
102
+ .atlas-view-container {
103
+ width: 100%;
104
+ margin-bottom: 10px;
105
+ border: 1px solid #444;
106
+ padding: 4px;
107
+ box-sizing: border-box;
108
+ border-radius: 3px;
109
+ display: flex;
110
+ flex-direction: column;
111
+ align-items: center;
112
+ background-color: rgba(0,0,0,0.2);
113
+ }
114
+
115
+ /* UV Panel Styles */
116
+ .uv-info-container {
117
+ background-color: rgba(0,0,0,0.2);
118
+ padding: 10px;
119
+ border-radius: 4px;
120
+ margin-bottom: 12px;
121
+ font-size: 0.9em;
122
+ color: #bbb;
123
+ }
124
+
125
+ .uv-manual-controls {
126
+ margin-top: 15px;
127
+ background-color: rgba(0,0,0,0.2);
128
+ padding: 10px;
129
+ border-radius: 4px;
130
+ }
131
+
132
+ .control-title {
133
+ margin: 0 0 10px 0;
134
+ font-size: 0.95em;
135
+ color: #4CAF50;
136
+ font-weight: normal;
137
+ }
138
+
139
+ /* Rig Panel Styles */
140
+ .rig-controls-section {
141
+ display: flex;
142
+ flex-direction: column;
143
+ margin-bottom: 15px;
144
+ background-color: rgba(0,0,0,0.2);
145
+ padding: 10px;
146
+ border-radius: 4px;
147
+ }
148
+
149
+ .rig-constraint-container,
150
+ .rig-lock-container {
151
+ display: flex;
152
+ align-items: center;
153
+ margin-top: 8px;
154
+ gap: 10px;
155
+ }
156
+
157
+ /* Download Asset Section - Always visible at bottom */
158
+ .asset-download-section {
159
+ margin-top: 20px;
160
+ padding: 15px 0;
161
+ border-top: 1px solid #333;
162
+ text-align: center;
163
+ }
164
+
165
+ .download-asset-button {
166
+ background-color: transparent;
167
+ color: #4CAF50;
168
+ border: 1px solid #4CAF50;
169
+ padding: 8px 16px;
170
+ font-size: 14px;
171
+ font-weight: normal;
172
+ font-family: inherit;
173
+ border-radius: 0;
174
+ cursor: pointer;
175
+ transition: background-color 0.3s ease;
176
+ min-width: 160px;
177
+ }
178
+
179
+ .download-asset-button:hover {
180
+ background-color: rgba(76, 175, 80, 0.2);
181
+ }
182
+
183
+ .download-asset-button:disabled {
184
+ background-color: transparent;
185
+ color: #666;
186
+ border-color: #666;
187
+ cursor: not-allowed;
188
+ }
189
+
190
+ .download-asset-button:disabled:hover {
191
+ background-color: transparent;
192
+ }
193
+
194
+ /* Mesh Settings Modal Styles */
195
+ .settings-section {
196
+ margin-bottom: 20px;
197
+ }
198
+
199
+ .settings-section h4 {
200
+ color: #4CAF50;
201
+ margin: 0 0 15px 0;
202
+ font-weight: 500;
203
+ }
204
+
205
+ .position-controls {
206
+ display: flex;
207
+ flex-wrap: wrap;
208
+ gap: 10px;
209
+ margin-top: 5px;
210
+ }
211
+
212
+ .control-row {
213
+ display: flex;
214
+ align-items: center;
215
+ gap: 5px;
216
+ }
217
+
218
+ .control-row label {
219
+ width: 20px;
220
+ margin-bottom: 0;
221
+ color: #aaa;
222
+ }
223
+
224
+ .number-input {
225
+ width: 60px;
226
+ padding: 4px 6px;
227
+ background: #333;
228
+ border: 1px solid #555;
229
+ color: white;
230
+ border-radius: 3px;
231
+ }
232
+
233
+ .settings-status {
234
+ margin-top: 15px;
235
+ padding: 5px 10px;
236
+ border-radius: 3px;
237
+ min-height: 20px;
238
+ }
239
+
240
+ .settings-status.success {
241
+ background-color: rgba(76, 175, 80, 0.2);
242
+ color: #4CAF50;
243
+ }
244
+
245
+ .settings-status.error {
246
+ background-color: rgba(244, 67, 54, 0.2);
247
+ color: #F44336;
248
+ }
249
+
250
+ .settings-status.info {
251
+ background-color: rgba(33, 150, 243, 0.2);
252
+ color: #2196F3;
253
+ }
254
+
255
+ .coords-container {
256
+ font-size: 12px;
257
+ margin-bottom: 10px;
258
+ font-family: monospace;
259
+ padding: 5px;
260
+ background-color: rgba(0, 0, 0, 0.2);
261
+ border: 1px solid var(--panel-border);
262
+ color: var(--text-color);
263
+ }
@@ -0,0 +1,123 @@
1
+ <!-- Asset Panel Component -->
2
+ <link rel="stylesheet" href="/asset_debugger/panels/asset-panel/asset-panel.css">
3
+ <div id="asset-tab" class="tab-content">
4
+ <div class="asset-section">
5
+ <div class="collapsible-header section-header">
6
+ <h3 class="metadata-header">Mesh</h3>
7
+ <span class="collapse-indicator">[+]</span>
8
+ </div>
9
+ <div class="metadata-content section-content" style="display: none;">
10
+ <!-- Mesh Visibility Panel -->
11
+ <div id="mesh-visibility-container">
12
+ <h4 class="subsection-header">Mesh Visibility</h4>
13
+ <div id="mesh-groups" class="mesh-groups-container"></div>
14
+ </div>
15
+ </div>
16
+ </div>
17
+
18
+ <div class="section-divider"></div>
19
+
20
+ <div class="asset-section">
21
+ <div class="collapsible-header section-header">
22
+ <h3 class="metadata-header">Atlas</h3>
23
+ <span class="collapse-indicator">[+]</span>
24
+ </div>
25
+ <div class="metadata-content section-content" style="display: none;">
26
+ <!-- Atlas Heading -->
27
+ <div id="atlas-heading-container" class="panel-container">
28
+ <div class="texture-type-selector">
29
+ <button data-texture-type="baseColor" class="texture-type-button active">Base Color</button>
30
+ <button data-texture-type="orm" class="texture-type-button">ORM</button>
31
+ <button data-texture-type="normal" class="texture-type-button">Normal</button>
32
+ </div>
33
+ <div class="atlas-view-container">
34
+ <canvas id="atlas-canvas" width="256" height="256"></canvas>
35
+ <div id="coords-text" class="coords-container">No texture loaded</div>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ </div>
40
+
41
+ <div class="section-divider"></div>
42
+
43
+ <div class="asset-section">
44
+ <div class="collapsible-header section-header">
45
+ <h3 class="metadata-header">UV</h3>
46
+ <span class="collapse-indicator">[+]</span>
47
+ </div>
48
+ <div class="metadata-content section-content" style="display: none;">
49
+ <!-- UV Heading -->
50
+ <div id="uv-heading-container" class="panel-container">
51
+ <div id="uv-info-container" class="uv-info-container">
52
+ <p>No UV data loaded yet.</p>
53
+ </div>
54
+
55
+ <div id="uv-manual-controls" class="uv-manual-controls" style="display: none;">
56
+ <h4 class="control-title">UV Mapping Controls</h4>
57
+
58
+ <div class="uv-control-group">
59
+ <div class="uv-control-row">
60
+ <label for="uv-offset-x">Offset X:</label>
61
+ <input type="number" id="uv-offset-x" min="0" max="1" step="0.05" value="0">
62
+ <label for="uv-offset-y">Offset Y:</label>
63
+ <input type="number" id="uv-offset-y" min="0" max="1" step="0.05" value="0">
64
+ </div>
65
+ <div class="uv-control-row">
66
+ <label for="uv-scale-w">Scale W:</label>
67
+ <input type="number" id="uv-scale-w" min="0.1" max="1" step="0.05" value="1">
68
+ <label for="uv-scale-h">Scale H:</label>
69
+ <input type="number" id="uv-scale-h" min="0.1" max="1" step="0.05" value="1">
70
+ </div>
71
+ </div>
72
+
73
+ <div class="uv-control-group">
74
+ <label for="uv-predefined-segments">Predefined Atlas Segments:</label>
75
+ <select id="uv-predefined-segments">
76
+ <option value="0">Full texture (1×1)</option>
77
+ </select>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ </div>
82
+ </div>
83
+
84
+ <div class="section-divider"></div>
85
+
86
+ <div class="asset-section">
87
+ <div class="collapsible-header section-header">
88
+ <h3 class="metadata-header">Rig</h3>
89
+ <span class="collapse-indicator">[+]</span>
90
+ </div>
91
+ <div class="metadata-content section-content" style="display: none;">
92
+ <!-- Rig Heading -->
93
+ <div id="rig-heading-container" class="panel-container">
94
+ <div id="rig-content" class="rig-container">
95
+ <p>No rig data loaded yet.</p>
96
+ </div>
97
+
98
+ <div id="rig-controls" class="rig-controls-section" style="display: none;">
99
+ <h4 class="control-title">Rig Controls</h4>
100
+
101
+ <div class="rig-checkbox-wrapper">
102
+ <div class="rig-checkbox-container">
103
+ <label for="rig-show-joints" class="rig-checkbox-label">Show Joints</label>
104
+ <input type="checkbox" id="rig-show-joints" class="rig-checkbox">
105
+ </div>
106
+
107
+ <div class="rig-checkbox-container">
108
+ <label for="rig-show-bones" class="rig-checkbox-label">Show Bones</label>
109
+ <input type="checkbox" id="rig-show-bones" class="rig-checkbox">
110
+ </div>
111
+ </div>
112
+
113
+ <button id="rig-reset-button" class="rig-reset-button">Reset Rig Position</button>
114
+ </div>
115
+ </div>
116
+ </div>
117
+ </div>
118
+
119
+ <!-- Download Asset Button - Always visible at bottom -->
120
+ <div class="asset-download-section">
121
+ <button id="download-asset-btn" class="download-asset-button">Download Asset</button>
122
+ </div>
123
+ </div>
@@ -0,0 +1,136 @@
1
+ import { getState } from '../../util/state/scene-state';
2
+ import { createMeshVisibilityPanel } from './mesh-heading/mesh-heading';
3
+ import { initAtlasPanel, updateAtlasVisualization } from './atlas-heading/atlas-heading';
4
+ import { initUvPanel, updateUvPanel } from './uv-heading/uv-heading.js';
5
+ import { updateRigPanel } from './rig-heading/rig-heading';
6
+ import { downloadUpdatedGlb, onGlbBufferUpdate } from '../../util/scene/glb-controller.js';
7
+
8
+ let controlsInitialized = false;
9
+ let atlasInitialized = false;
10
+ let uvInitialized = false;
11
+ let rigInitialized = false;
12
+ let downloadButtonInitialized = false;
13
+
14
+ export function initAssetPanel() {
15
+ if (controlsInitialized) {
16
+ console.log('Asset Panel already initialized, skipping');
17
+ return;
18
+ }
19
+
20
+ console.debug('Initializing Asset Panel...');
21
+
22
+ const assetPanel = document.getElementById('asset-tab') || document.getElementById('asset-tab-container');
23
+
24
+ if (!assetPanel) {
25
+ console.error('Asset panel elements not found. Panel may not be loaded in DOM yet.');
26
+ return;
27
+ }
28
+
29
+ console.debug('Asset panel found, initializing...');
30
+
31
+ const collapsibleHeaders = document.querySelectorAll('.asset-section .collapsible-header');
32
+ if (collapsibleHeaders) {
33
+ collapsibleHeaders.forEach(header => {
34
+ header.addEventListener('click', function() {
35
+ const content = this.nextElementSibling;
36
+ const indicator = this.querySelector('.collapse-indicator');
37
+
38
+ if (content.style.display === 'none') {
39
+ content.style.display = 'block';
40
+ indicator.textContent = '[-]';
41
+
42
+ const headerText = this.querySelector('.metadata-header').textContent;
43
+
44
+ if (headerText === 'Mesh') {
45
+ createMeshVisibilityPanel();
46
+ }
47
+ else if (headerText === 'Atlas') {
48
+ if (!atlasInitialized) {
49
+ initAtlasPanel();
50
+ atlasInitialized = true;
51
+ } else {
52
+ updateAtlasVisualization();
53
+ }
54
+ }
55
+ else if (headerText === 'UV') {
56
+ if (!uvInitialized) {
57
+ initUvPanel();
58
+ uvInitialized = true;
59
+ } else {
60
+ updateUvPanel();
61
+ }
62
+ }
63
+ else if (headerText === 'Rig') {
64
+ if (!rigInitialized) {
65
+ updateRigPanel();
66
+ rigInitialized = true;
67
+ } else {
68
+ updateRigPanel();
69
+ }
70
+ }
71
+ } else {
72
+ content.style.display = 'none';
73
+ indicator.textContent = '[+]';
74
+ }
75
+ });
76
+ });
77
+ }
78
+
79
+ initDownloadButton();
80
+ setupBufferListener();
81
+ updateDownloadButtonVisibility();
82
+
83
+ controlsInitialized = true;
84
+ }
85
+
86
+ function initDownloadButton() {
87
+ const downloadBtn = document.getElementById('download-asset-btn');
88
+ if (!downloadBtn) {
89
+ console.error('Download button not found');
90
+ return;
91
+ }
92
+
93
+ if (downloadButtonInitialized) {
94
+ console.log('Download button already initialized, skipping');
95
+ return;
96
+ }
97
+
98
+ downloadBtn.addEventListener('click', async () => {
99
+ try {
100
+ await downloadUpdatedGlb();
101
+ } catch (error) {
102
+ console.error('Error downloading GLB:', error);
103
+ alert('Error downloading GLB: ' + error.message);
104
+ }
105
+ });
106
+
107
+ downloadButtonInitialized = true;
108
+ console.log('Download button event listener initialized successfully');
109
+ }
110
+
111
+ function setupBufferListener() {
112
+ onGlbBufferUpdate(() => {
113
+ updateDownloadButtonVisibility();
114
+ });
115
+
116
+ window.addEventListener('glb-buffer-changed', () => {
117
+ updateDownloadButtonVisibility();
118
+ });
119
+ }
120
+
121
+ function updateDownloadButtonVisibility() {
122
+ const downloadSection = document.querySelector('.asset-download-section');
123
+ const state = getState();
124
+
125
+ if (!downloadSection) return;
126
+
127
+ const hasModel = state.modelFile !== null;
128
+
129
+ downloadSection.style.display = hasModel ? 'block' : 'none';
130
+
131
+ console.log(`Download button ${hasModel ? 'shown' : 'hidden'} - hasModel: ${hasModel}`);
132
+ }
133
+
134
+ export function refreshDownloadButtonVisibility() {
135
+ updateDownloadButtonVisibility();
136
+ }
@@ -0,0 +1,94 @@
1
+ /* Shared atlas canvas*/
2
+ #atlas-canvas {
3
+ max-width: 100%;
4
+ height: auto;
5
+ display: block;
6
+ background-color: #222;
7
+ }
8
+
9
+ .texture-label {
10
+ position: absolute;
11
+ right: 10px;
12
+ bottom: 10px;
13
+ background-color: rgba(0, 0, 0, 0.6);
14
+ color: #aaa;
15
+ padding: 5px 10px;
16
+ font-size: 12px;
17
+ border-radius: 4px;
18
+ z-index: 2;
19
+ margin-top: 5px;
20
+ display: inline-block;
21
+ }
22
+
23
+ .texture-preview {
24
+ position: relative;
25
+ width: 100%;
26
+ aspect-ratio: 1/1; /* Make it a perfect square */
27
+ margin-bottom: 20px;
28
+ display: flex;
29
+ justify-content: center;
30
+ align-items: center;
31
+ background-color: rgba(0,0,0,0.2);
32
+ border: 1px solid var(--panel-border);
33
+ overflow: hidden;
34
+ }
35
+
36
+ .texture-preview img,
37
+ .texture-preview canvas {
38
+ max-width: 100%;
39
+ max-height: 100%;
40
+ object-fit: contain; /* Ensure content fits without distortion */
41
+ }
42
+
43
+ .atlas-display {
44
+ width: 100%;
45
+ height: auto;
46
+ border: none;
47
+ margin: 0;
48
+ background-color: #000;
49
+ max-width: 100%;
50
+ max-height: 100%;
51
+ object-fit: contain;
52
+ display: block;
53
+ }
54
+
55
+ .segment-info {
56
+ font-size: 12px;
57
+ padding: 5px;
58
+ background-color: rgba(0, 0, 0, 0.2);
59
+ border: 1px solid var(--panel-border);
60
+ margin-bottom: 10px;
61
+ color: var(--text-color);
62
+ }
63
+
64
+ /* Shared texture selector */
65
+ .texture-type-selector {
66
+ display: flex;
67
+ justify-content: space-between;
68
+ gap: 8px;
69
+ margin-bottom: 15px;
70
+ flex-wrap: wrap;
71
+ }
72
+
73
+ .texture-type-button {
74
+ flex: 1;
75
+ background-color: #333;
76
+ border: 1px solid #555;
77
+ color: #ddd;
78
+ padding: 5px 8px;
79
+ font-size: 12px;
80
+ cursor: pointer;
81
+ border-radius: 3px;
82
+ transition: all 0.3s ease;
83
+ font-family: monospace;
84
+ }
85
+
86
+ .texture-type-button:hover {
87
+ background-color: rgba(0, 0, 0, 0.2);
88
+ }
89
+
90
+ .texture-type-button.active {
91
+ background-color: #4CAF50;
92
+ color: white;
93
+ border-color: #4CAF50;
94
+ }