@littlecarlito/blorktools 0.50.4 → 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,61 @@
1
+ /**
2
+ * Lighting Worker
3
+ *
4
+ * A web worker for processing lighting files (HDR/EXR) asynchronously.
5
+ */
6
+
7
+ // Listen for messages from the main thread
8
+ self.onmessage = async function(e) {
9
+ try {
10
+ const { file, id } = e.data;
11
+ console.log(`[Lighting Worker] Processing lighting file: ${file.name}`);
12
+
13
+ // For HDR/EXR files, we can't directly parse them in a worker
14
+ // without additional libraries, so we'll pass the array buffer back
15
+ // to the main thread for processing with Three.js
16
+
17
+ // Read file as array buffer
18
+ const arrayBuffer = await readFileAsArrayBuffer(file);
19
+
20
+ // Extract file extension to determine type
21
+ const fileExtension = file.name.split('.').pop().toLowerCase();
22
+
23
+ self.postMessage({
24
+ status: 'success',
25
+ id,
26
+ fileName: file.name,
27
+ fileSize: file.size,
28
+ fileType: fileExtension,
29
+ // We need to transfer the arrayBuffer to avoid copying
30
+ // This makes it unusable in the worker after transfer
31
+ arrayBuffer: arrayBuffer
32
+ }, [arrayBuffer]);
33
+ } catch (error) {
34
+ console.error('[Lighting Worker] Error:', error);
35
+ self.postMessage({
36
+ status: 'error',
37
+ error: error.message || 'Unknown error processing lighting file'
38
+ });
39
+ }
40
+ };
41
+
42
+ /**
43
+ * Read a file as an ArrayBuffer
44
+ * @param {File} file - The file to read
45
+ * @returns {Promise<ArrayBuffer>} A promise that resolves to the ArrayBuffer
46
+ */
47
+ function readFileAsArrayBuffer(file) {
48
+ return new Promise((resolve, reject) => {
49
+ const reader = new FileReader();
50
+
51
+ reader.onload = function(e) {
52
+ resolve(e.target.result);
53
+ };
54
+
55
+ reader.onerror = function() {
56
+ reject(new Error('Failed to read lighting file'));
57
+ };
58
+
59
+ reader.readAsArrayBuffer(file);
60
+ });
61
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Model Worker
3
+ *
4
+ * This worker processes GLB model files.
5
+ * It performs initial validation and processing of GLB files in a separate thread.
6
+ */
7
+
8
+ /**
9
+ * Process a GLB model file
10
+ * @param {File} file - The GLB file to process
11
+ * @returns {Object} An object containing processing results
12
+ */
13
+ async function consumeGLBFile(file) {
14
+ try {
15
+ // Basic file validation
16
+ if (!file || !file.name.toLowerCase().endsWith('.glb')) {
17
+ return {
18
+ status: 'error',
19
+ error: 'Invalid GLB file'
20
+ };
21
+ }
22
+
23
+ // Convert file to ArrayBuffer for processing
24
+ const arrayBuffer = await file.arrayBuffer();
25
+
26
+ // Validate GLB format
27
+ if (arrayBuffer.byteLength < 12) {
28
+ return {
29
+ status: 'error',
30
+ error: 'Invalid GLB format: File too small'
31
+ };
32
+ }
33
+
34
+ // Check GLB magic bytes
35
+ const headerView = new Uint8Array(arrayBuffer, 0, 4);
36
+ const magicString = String.fromCharCode.apply(null, headerView);
37
+
38
+ if (magicString !== 'glTF') {
39
+ return {
40
+ status: 'error',
41
+ error: 'Invalid GLB format: Missing glTF magic bytes'
42
+ };
43
+ }
44
+
45
+ // Get GLB version
46
+ const dataView = new DataView(arrayBuffer);
47
+ const version = dataView.getUint32(4, true);
48
+ if (version !== 2) {
49
+ return {
50
+ status: 'error',
51
+ error: `Unsupported GLB version: ${version}`
52
+ };
53
+ }
54
+
55
+ // Check for JSON chunk
56
+ const jsonChunkType = dataView.getUint32(16, true);
57
+ if (jsonChunkType !== 0x4E4F534A) { // 'JSON' in ASCII
58
+ return {
59
+ status: 'error',
60
+ error: 'Invalid GLB: First chunk is not JSON'
61
+ };
62
+ }
63
+
64
+ // Successfully validated the GLB file
65
+ return {
66
+ status: 'success',
67
+ fileName: file.name,
68
+ fileSize: file.size,
69
+ fileType: 'glb',
70
+ version: version,
71
+ // We don't need to send the full arrayBuffer back to the main thread
72
+ // Just send validation results
73
+ message: 'GLB file validated successfully'
74
+ };
75
+
76
+ } catch (error) {
77
+ console.error('Error in model worker:', error);
78
+ return {
79
+ status: 'error',
80
+ error: `Error processing GLB file: ${error.message || 'Unknown error'}`
81
+ };
82
+ }
83
+ }
84
+
85
+ // Set up message handler to process GLB files
86
+ self.onmessage = async (e) => {
87
+ try {
88
+ const { file, id } = e.data;
89
+
90
+ // Process the file
91
+ const result = await consumeGLBFile(file);
92
+
93
+ // Add the worker ID to the result
94
+ result.id = id;
95
+
96
+ // Send the result back to the main thread
97
+ self.postMessage(result);
98
+ } catch (error) {
99
+ // Send error result back to main thread
100
+ self.postMessage({
101
+ status: 'error',
102
+ id: e.data.id,
103
+ error: error.message || 'Unknown error in model worker'
104
+ });
105
+ }
106
+ };
107
+
108
+ // Log that the worker has started
109
+ console.log('Model worker started');
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Texture Worker
3
+ *
4
+ * A web worker for processing texture files asynchronously.
5
+ */
6
+
7
+ // Listen for messages from the main thread
8
+ self.onmessage = async function(e) {
9
+ try {
10
+ const { file, textureType, id } = e.data;
11
+ console.log(`[Texture Worker] Processing ${textureType} texture: ${file.name}`);
12
+
13
+ // Generate a preview data URL
14
+ const previewDataUrl = await createPreviewDataUrl(file);
15
+
16
+ // Process the texture (in a real implementation, this would do the heavy processing)
17
+ // Here we just post the preview data URL back
18
+ self.postMessage({
19
+ status: 'success',
20
+ id,
21
+ textureType,
22
+ previewDataUrl,
23
+ fileName: file.name,
24
+ fileSize: file.size
25
+ });
26
+ } catch (error) {
27
+ console.error('[Texture Worker] Error:', error);
28
+ self.postMessage({
29
+ status: 'error',
30
+ error: error.message || 'Unknown error processing texture'
31
+ });
32
+ }
33
+ };
34
+
35
+ /**
36
+ * Create a preview data URL from a file
37
+ * @param {File} file - The file to create a preview for
38
+ * @returns {Promise<string>} A promise that resolves to the data URL
39
+ */
40
+ function createPreviewDataUrl(file) {
41
+ return new Promise((resolve, reject) => {
42
+ const reader = new FileReader();
43
+
44
+ reader.onload = function(e) {
45
+ resolve(e.target.result);
46
+ };
47
+
48
+ reader.onerror = function(e) {
49
+ reject(new Error('Failed to read texture file'));
50
+ };
51
+
52
+ reader.readAsDataURL(file);
53
+ });
54
+ }
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Worker Manager
3
+ *
4
+ * This module manages the creation and communication with web workers for file processing.
5
+ */
6
+
7
+ // Track active workers by ID
8
+ const activeWorkers = new Map();
9
+
10
+ // Counter for generating unique worker IDs
11
+ let workerIdCounter = 0;
12
+
13
+ /**
14
+ * Get a unique ID for a worker
15
+ * @returns {string} A unique worker ID
16
+ */
17
+ function getWorkerId() {
18
+ return `worker_${Date.now()}_${workerIdCounter++}`;
19
+ }
20
+
21
+ /**
22
+ * Process a texture file using a web worker
23
+ * @param {File} file - The texture file to process
24
+ * @param {string} textureType - The type of texture (baseColor, orm, normal)
25
+ * @returns {Promise<Object>} A promise that resolves with the worker result
26
+ */
27
+ export function processTextureFile(file, textureType) {
28
+ return new Promise((resolve, reject) => {
29
+ try {
30
+ const workerId = getWorkerId();
31
+
32
+ // Create a new worker
33
+ const worker = new Worker(new URL('./texture-worker.js', import.meta.url), { type: 'module' });
34
+
35
+ // Set up message handler for receiving results
36
+ worker.onmessage = (e) => {
37
+ const result = e.data;
38
+
39
+ if (result.status === 'success') {
40
+ resolve(result);
41
+ } else {
42
+ reject(new Error(result.error || 'Unknown error in texture worker'));
43
+ }
44
+
45
+ // Clean up
46
+ cleanupWorker(workerId);
47
+ };
48
+
49
+ // Set up error handler
50
+ worker.onerror = (error) => {
51
+ console.error('Texture worker error:', error);
52
+ reject(new Error('Worker error: ' + (error.message || 'Unknown error')));
53
+ cleanupWorker(workerId);
54
+ };
55
+
56
+ // Store the worker in the map
57
+ activeWorkers.set(workerId, worker);
58
+
59
+ // Send the file to the worker
60
+ worker.postMessage({
61
+ file,
62
+ textureType,
63
+ id: workerId
64
+ });
65
+
66
+ } catch (error) {
67
+ console.error('Error starting texture worker:', error);
68
+ reject(error);
69
+ }
70
+ });
71
+ }
72
+
73
+ /**
74
+ * Process a model file using a web worker
75
+ * @param {File} file - The model file to process
76
+ * @returns {Promise<Object>} A promise that resolves with the worker result
77
+ */
78
+ export function processModelFile(file) {
79
+ return new Promise((resolve, reject) => {
80
+ try {
81
+ const workerId = getWorkerId();
82
+
83
+ // Create a new worker
84
+ const worker = new Worker(new URL('./model-worker.js', import.meta.url), { type: 'module' });
85
+
86
+ // Set up message handler for receiving results
87
+ worker.onmessage = (e) => {
88
+ const result = e.data;
89
+
90
+ if (result.status === 'success') {
91
+ resolve(result);
92
+ } else {
93
+ reject(new Error(result.error || 'Unknown error in model worker'));
94
+ }
95
+
96
+ // Clean up
97
+ cleanupWorker(workerId);
98
+ };
99
+
100
+ // Set up error handler
101
+ worker.onerror = (error) => {
102
+ console.error('Model worker error:', error);
103
+ reject(new Error('Worker error: ' + (error.message || 'Unknown error')));
104
+ cleanupWorker(workerId);
105
+ };
106
+
107
+ // Store the worker in the map
108
+ activeWorkers.set(workerId, worker);
109
+
110
+ // Send the file to the worker
111
+ worker.postMessage({
112
+ file,
113
+ id: workerId
114
+ });
115
+
116
+ } catch (error) {
117
+ console.error('Error starting model worker:', error);
118
+ reject(error);
119
+ }
120
+ });
121
+ }
122
+
123
+ /**
124
+ * Process a lighting file using a web worker
125
+ * @param {File} file - The lighting file to process
126
+ * @returns {Promise<Object>} A promise that resolves with the worker result
127
+ */
128
+ export function processLightingFile(file) {
129
+ return new Promise((resolve, reject) => {
130
+ try {
131
+ const workerId = getWorkerId();
132
+
133
+ // Create a new worker
134
+ const worker = new Worker(new URL('./lighting-worker.js', import.meta.url), { type: 'module' });
135
+
136
+ // Set up message handler for receiving results
137
+ worker.onmessage = (e) => {
138
+ const result = e.data;
139
+
140
+ if (result.status === 'success') {
141
+ resolve(result);
142
+ } else {
143
+ reject(new Error(result.error || 'Unknown error in lighting worker'));
144
+ }
145
+
146
+ // Clean up
147
+ cleanupWorker(workerId);
148
+ };
149
+
150
+ // Set up error handler
151
+ worker.onerror = (error) => {
152
+ console.error('Lighting worker error:', error);
153
+ reject(new Error('Worker error: ' + (error.message || 'Unknown error')));
154
+ cleanupWorker(workerId);
155
+ };
156
+
157
+ // Store the worker in the map
158
+ activeWorkers.set(workerId, worker);
159
+
160
+ // Send the file to the worker
161
+ worker.postMessage({
162
+ file,
163
+ id: workerId
164
+ });
165
+
166
+ } catch (error) {
167
+ console.error('Error starting lighting worker:', error);
168
+ reject(error);
169
+ }
170
+ });
171
+ }
172
+
173
+ /**
174
+ * Clean up a worker by ID
175
+ * @param {string} workerId - The ID of the worker to clean up
176
+ */
177
+ function cleanupWorker(workerId) {
178
+ if (activeWorkers.has(workerId)) {
179
+ const worker = activeWorkers.get(workerId);
180
+ worker.terminate();
181
+ activeWorkers.delete(workerId);
182
+ console.log(`Worker ${workerId} terminated and cleaned up`);
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Check if there are any active workers
188
+ * @returns {boolean} True if there are active workers, false otherwise
189
+ */
190
+ export function hasActiveWorkers() {
191
+ return activeWorkers.size > 0;
192
+ }
193
+
194
+ /**
195
+ * Terminate all active workers
196
+ */
197
+ export function terminateAllWorkers() {
198
+ for (const [id, worker] of activeWorkers.entries()) {
199
+ worker.terminate();
200
+ console.log(`Worker ${id} terminated`);
201
+ }
202
+ activeWorkers.clear();
203
+ console.log('All workers terminated');
204
+ }
205
+
206
+ export default {
207
+ processTextureFile,
208
+ processModelFile,
209
+ processLightingFile,
210
+ hasActiveWorkers,
211
+ terminateAllWorkers
212
+ };