@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.
- package/bin/cli.js +69 -0
- package/package.json +13 -7
- package/src/asset_debugger/axis-indicator/axis-indicator.css +6 -0
- package/src/asset_debugger/axis-indicator/axis-indicator.html +20 -0
- package/src/asset_debugger/axis-indicator/axis-indicator.js +822 -0
- package/src/asset_debugger/debugger-scene/debugger-scene.css +142 -0
- package/src/asset_debugger/debugger-scene/debugger-scene.html +80 -0
- package/src/asset_debugger/debugger-scene/debugger-scene.js +791 -0
- package/src/asset_debugger/header/header.css +73 -0
- package/src/asset_debugger/header/header.html +24 -0
- package/src/asset_debugger/header/header.js +224 -0
- package/src/asset_debugger/index.html +76 -0
- package/src/asset_debugger/landing-page/landing-page.css +396 -0
- package/src/asset_debugger/landing-page/landing-page.html +81 -0
- package/src/asset_debugger/landing-page/landing-page.js +611 -0
- package/src/asset_debugger/loading-splash/loading-splash.css +195 -0
- package/src/asset_debugger/loading-splash/loading-splash.html +22 -0
- package/src/asset_debugger/loading-splash/loading-splash.js +59 -0
- package/src/asset_debugger/loading-splash/preview-loading-splash.js +66 -0
- package/src/asset_debugger/main.css +14 -0
- package/src/asset_debugger/modals/examples-modal/examples-modal.css +41 -0
- package/src/asset_debugger/modals/examples-modal/examples-modal.html +18 -0
- package/src/asset_debugger/modals/examples-modal/examples-modal.js +111 -0
- package/src/asset_debugger/modals/examples-modal/examples.js +125 -0
- package/src/asset_debugger/modals/html-editor-modal/html-editor-modal.css +452 -0
- package/src/asset_debugger/modals/html-editor-modal/html-editor-modal.html +87 -0
- package/src/asset_debugger/modals/html-editor-modal/html-editor-modal.js +675 -0
- package/src/asset_debugger/modals/mesh-info-modal/mesh-info-modal.css +219 -0
- package/src/asset_debugger/modals/mesh-info-modal/mesh-info-modal.html +20 -0
- package/src/asset_debugger/modals/mesh-info-modal/mesh-info-modal.js +548 -0
- package/src/asset_debugger/modals/settings-modal/settings-modal.css +103 -0
- package/src/asset_debugger/modals/settings-modal/settings-modal.html +158 -0
- package/src/asset_debugger/modals/settings-modal/settings-modal.js +475 -0
- package/src/asset_debugger/panels/asset-panel/asset-panel.css +263 -0
- package/src/asset_debugger/panels/asset-panel/asset-panel.html +123 -0
- package/src/asset_debugger/panels/asset-panel/asset-panel.js +136 -0
- package/src/asset_debugger/panels/asset-panel/atlas-heading/atlas-heading.css +94 -0
- package/src/asset_debugger/panels/asset-panel/atlas-heading/atlas-heading.js +312 -0
- package/src/asset_debugger/panels/asset-panel/mesh-heading/mesh-heading.css +129 -0
- package/src/asset_debugger/panels/asset-panel/mesh-heading/mesh-heading.js +486 -0
- package/src/asset_debugger/panels/asset-panel/rig-heading/rig-heading.css +545 -0
- package/src/asset_debugger/panels/asset-panel/rig-heading/rig-heading.js +538 -0
- package/src/asset_debugger/panels/asset-panel/uv-heading/uv-heading.css +70 -0
- package/src/asset_debugger/panels/asset-panel/uv-heading/uv-heading.js +586 -0
- package/src/asset_debugger/panels/world-panel/world-panel.css +364 -0
- package/src/asset_debugger/panels/world-panel/world-panel.html +173 -0
- package/src/asset_debugger/panels/world-panel/world-panel.js +1891 -0
- package/src/asset_debugger/router.js +190 -0
- package/src/asset_debugger/util/animation/playback/animation-playback-controller.js +150 -0
- package/src/asset_debugger/util/animation/playback/animation-preview-controller.js +316 -0
- package/src/asset_debugger/util/animation/playback/css3d-bounce-controller.js +400 -0
- package/src/asset_debugger/util/animation/playback/css3d-reversal-controller.js +821 -0
- package/src/asset_debugger/util/animation/render/css3d-prerender-controller.js +696 -0
- package/src/asset_debugger/util/animation/render/debug-texture-factory.js +0 -0
- package/src/asset_debugger/util/animation/render/iframe2texture-render-controller.js +199 -0
- package/src/asset_debugger/util/animation/render/image2texture-prerender-controller.js +461 -0
- package/src/asset_debugger/util/animation/render/pbr-material-factory.js +82 -0
- package/src/asset_debugger/util/common.css +280 -0
- package/src/asset_debugger/util/data/animation-classifier.js +323 -0
- package/src/asset_debugger/util/data/duplicate-handler.js +20 -0
- package/src/asset_debugger/util/data/glb-buffer-manager.js +407 -0
- package/src/asset_debugger/util/data/glb-classifier.js +290 -0
- package/src/asset_debugger/util/data/html-formatter.js +76 -0
- package/src/asset_debugger/util/data/html-linter.js +276 -0
- package/src/asset_debugger/util/data/localstorage-manager.js +265 -0
- package/src/asset_debugger/util/data/mesh-html-manager.js +295 -0
- package/src/asset_debugger/util/data/string-serder.js +303 -0
- package/src/asset_debugger/util/data/texture-classifier.js +663 -0
- package/src/asset_debugger/util/data/upload/background-file-handler.js +292 -0
- package/src/asset_debugger/util/data/upload/dropzone-preview-controller.js +396 -0
- package/src/asset_debugger/util/data/upload/file-upload-manager.js +495 -0
- package/src/asset_debugger/util/data/upload/glb-file-handler.js +36 -0
- package/src/asset_debugger/util/data/upload/glb-preview-controller.js +317 -0
- package/src/asset_debugger/util/data/upload/lighting-file-handler.js +194 -0
- package/src/asset_debugger/util/data/upload/model-file-manager.js +104 -0
- package/src/asset_debugger/util/data/upload/texture-file-handler.js +166 -0
- package/src/asset_debugger/util/data/upload/zip-handler.js +686 -0
- package/src/asset_debugger/util/loaders/html2canvas-loader.js +107 -0
- package/src/asset_debugger/util/rig/bone-kinematics.js +403 -0
- package/src/asset_debugger/util/rig/rig-constraint-manager.js +618 -0
- package/src/asset_debugger/util/rig/rig-controller.js +612 -0
- package/src/asset_debugger/util/rig/rig-factory.js +628 -0
- package/src/asset_debugger/util/rig/rig-handle-factory.js +46 -0
- package/src/asset_debugger/util/rig/rig-label-factory.js +441 -0
- package/src/asset_debugger/util/rig/rig-mouse-handler.js +377 -0
- package/src/asset_debugger/util/rig/rig-state-manager.js +175 -0
- package/src/asset_debugger/util/rig/rig-tooltip-manager.js +267 -0
- package/src/asset_debugger/util/rig/rig-ui-factory.js +700 -0
- package/src/asset_debugger/util/scene/background-manager.js +284 -0
- package/src/asset_debugger/util/scene/camera-controller.js +243 -0
- package/src/asset_debugger/util/scene/css3d-debug-controller.js +406 -0
- package/src/asset_debugger/util/scene/css3d-frame-factory.js +113 -0
- package/src/asset_debugger/util/scene/css3d-scene-manager.js +529 -0
- package/src/asset_debugger/util/scene/glb-controller.js +208 -0
- package/src/asset_debugger/util/scene/lighting-manager.js +690 -0
- package/src/asset_debugger/util/scene/threejs-model-manager.js +437 -0
- package/src/asset_debugger/util/scene/threejs-preview-manager.js +207 -0
- package/src/asset_debugger/util/scene/threejs-preview-setup.js +478 -0
- package/src/asset_debugger/util/scene/threejs-scene-controller.js +286 -0
- package/src/asset_debugger/util/scene/ui-manager.js +107 -0
- package/src/asset_debugger/util/state/animation-state.js +128 -0
- package/src/asset_debugger/util/state/css3d-state.js +83 -0
- package/src/asset_debugger/util/state/glb-preview-state.js +31 -0
- package/src/asset_debugger/util/state/log-util.js +197 -0
- package/src/asset_debugger/util/state/scene-state.js +452 -0
- package/src/asset_debugger/util/state/threejs-state.js +54 -0
- package/src/asset_debugger/util/workers/lighting-worker.js +61 -0
- package/src/asset_debugger/util/workers/model-worker.js +109 -0
- package/src/asset_debugger/util/workers/texture-worker.js +54 -0
- package/src/asset_debugger/util/workers/worker-manager.js +212 -0
- package/src/asset_debugger/widgets/mesh-info-widget.js +280 -0
- package/src/index.html +261 -0
- package/src/index.js +8 -0
- 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
|
+
};
|