@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,267 @@
|
|
|
1
|
+
// Tooltip related variables
|
|
2
|
+
let tooltipElement = null;
|
|
3
|
+
let tooltipTimers = new Map();
|
|
4
|
+
const TOOLTIP_DELAY = 1500; // 1.5 seconds delay
|
|
5
|
+
// Track the currently hovered element
|
|
6
|
+
let hoveredElement = null;
|
|
7
|
+
|
|
8
|
+
// Initialize tooltip when the module loads
|
|
9
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
10
|
+
initTooltip();
|
|
11
|
+
|
|
12
|
+
// Add document click handler to hide tooltips when clicking elsewhere
|
|
13
|
+
document.addEventListener('click', (event) => {
|
|
14
|
+
// If clicked element is not the hovered element or the tooltip
|
|
15
|
+
if (hoveredElement && event.target !== hoveredElement &&
|
|
16
|
+
event.target !== tooltipElement &&
|
|
17
|
+
!hoveredElement.contains(event.target) &&
|
|
18
|
+
!tooltipElement.contains(event.target)) {
|
|
19
|
+
|
|
20
|
+
// Hide tooltip and clear hover state
|
|
21
|
+
hideTooltip();
|
|
22
|
+
hoveredElement = null;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Initialize tooltip element
|
|
29
|
+
*/
|
|
30
|
+
function initTooltip() {
|
|
31
|
+
// Create tooltip if it doesn't exist
|
|
32
|
+
if (!tooltipElement) {
|
|
33
|
+
tooltipElement = document.createElement('div');
|
|
34
|
+
tooltipElement.className = 'text-tooltip';
|
|
35
|
+
document.body.appendChild(tooltipElement);
|
|
36
|
+
|
|
37
|
+
// Add mouse events to the tooltip itself
|
|
38
|
+
tooltipElement.addEventListener('mouseenter', () => {
|
|
39
|
+
tooltipElement.classList.add('mouse-over');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
tooltipElement.addEventListener('mouseleave', (event) => {
|
|
43
|
+
tooltipElement.classList.remove('mouse-over');
|
|
44
|
+
|
|
45
|
+
// Get the element the mouse is moving to
|
|
46
|
+
const relatedTarget = event.relatedTarget;
|
|
47
|
+
|
|
48
|
+
// Only keep tooltip visible if moving directly back to the original element
|
|
49
|
+
if (hoveredElement && relatedTarget === hoveredElement) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Otherwise, hide the tooltip and clear reference
|
|
54
|
+
hideTooltip();
|
|
55
|
+
hoveredElement = null;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Process all elements in a container that might have truncated text
|
|
62
|
+
* @param {HTMLElement} container - Container to search for truncatable elements
|
|
63
|
+
*/
|
|
64
|
+
export function setupTruncationTooltips(container) {
|
|
65
|
+
if (!container) return;
|
|
66
|
+
|
|
67
|
+
// Find all elements that might have truncated text
|
|
68
|
+
const truncatableElements = container.querySelectorAll('.rig-item-name, .rig-parent-bone, .rig-child-bone, .rig-associated-bone, .rig-connected-bone');
|
|
69
|
+
truncatableElements.forEach(setupTruncationTooltip);
|
|
70
|
+
|
|
71
|
+
// Log summary of truncated elements for debugging
|
|
72
|
+
const truncatedCount = container.querySelectorAll('.is-truncated').length;
|
|
73
|
+
if (truncatedCount > 0) {
|
|
74
|
+
console.log(`Found ${truncatedCount} truncated elements with tooltips enabled`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Hide tooltip
|
|
80
|
+
*/
|
|
81
|
+
export function hideTooltip() {
|
|
82
|
+
if (tooltipElement) {
|
|
83
|
+
tooltipElement.classList.remove('visible');
|
|
84
|
+
tooltipElement.classList.remove('mouse-over');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Setup tooltip behavior for an element that might have truncated text
|
|
90
|
+
* @param {HTMLElement} element - Element to add tooltip functionality to
|
|
91
|
+
*/
|
|
92
|
+
function setupTruncationTooltip(element) {
|
|
93
|
+
// Skip if already processed
|
|
94
|
+
if (element.dataset.tooltipProcessed) return;
|
|
95
|
+
|
|
96
|
+
// Set flag to avoid reprocessing
|
|
97
|
+
element.dataset.tooltipProcessed = 'true';
|
|
98
|
+
|
|
99
|
+
// Check if text is actually truncated
|
|
100
|
+
if (isTextTruncated(element)) {
|
|
101
|
+
element.classList.add('is-truncated');
|
|
102
|
+
|
|
103
|
+
// Add mouse events
|
|
104
|
+
element.addEventListener('mouseenter', handleMouseEnter);
|
|
105
|
+
element.addEventListener('mouseleave', handleMouseLeave);
|
|
106
|
+
// Remove mousemove event - we don't want tooltip to follow cursor
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Handle mouse enter event
|
|
112
|
+
* @param {MouseEvent} event - Mouse enter event
|
|
113
|
+
*/
|
|
114
|
+
function handleMouseEnter(event) {
|
|
115
|
+
const element = event.target;
|
|
116
|
+
const elementId = element.dataset.tooltipId || element.id || Math.random().toString(36).substring(2, 9);
|
|
117
|
+
|
|
118
|
+
// Store reference to currently hovered element
|
|
119
|
+
hoveredElement = element;
|
|
120
|
+
|
|
121
|
+
// Store ID for future reference
|
|
122
|
+
element.dataset.tooltipId = elementId;
|
|
123
|
+
|
|
124
|
+
// Clear any existing timer for this element
|
|
125
|
+
if (tooltipTimers.has(elementId)) {
|
|
126
|
+
clearTimeout(tooltipTimers.get(elementId));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Start new timer
|
|
130
|
+
const timer = setTimeout(() => {
|
|
131
|
+
showTooltip(element);
|
|
132
|
+
}, TOOLTIP_DELAY);
|
|
133
|
+
|
|
134
|
+
tooltipTimers.set(elementId, timer);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Handle mouse leave event
|
|
139
|
+
* @param {MouseEvent} event - Mouse leave event
|
|
140
|
+
*/
|
|
141
|
+
function handleMouseLeave(event) {
|
|
142
|
+
const element = event.target;
|
|
143
|
+
const elementId = element.dataset.tooltipId;
|
|
144
|
+
|
|
145
|
+
// Get the element the mouse is moving to
|
|
146
|
+
const relatedTarget = event.relatedTarget;
|
|
147
|
+
|
|
148
|
+
// Don't hide if moving to the tooltip
|
|
149
|
+
if (relatedTarget === tooltipElement) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Clear reference to hovered element if not moving to tooltip
|
|
154
|
+
hoveredElement = null;
|
|
155
|
+
|
|
156
|
+
// Clear timer
|
|
157
|
+
if (elementId && tooltipTimers.has(elementId)) {
|
|
158
|
+
clearTimeout(tooltipTimers.get(elementId));
|
|
159
|
+
tooltipTimers.delete(elementId);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Hide tooltip unless mouse is over it
|
|
163
|
+
if (!tooltipElement || !tooltipElement.classList.contains('mouse-over')) {
|
|
164
|
+
hideTooltip();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Show tooltip for element
|
|
170
|
+
* @param {HTMLElement} element - Element to show tooltip for
|
|
171
|
+
*/
|
|
172
|
+
function showTooltip(element) {
|
|
173
|
+
initTooltip();
|
|
174
|
+
|
|
175
|
+
// Use the raw name from data attribute if available, otherwise use the full text
|
|
176
|
+
const tooltipContent = element.dataset.rawName || element.textContent;
|
|
177
|
+
|
|
178
|
+
// Set tooltip content
|
|
179
|
+
tooltipElement.textContent = tooltipContent;
|
|
180
|
+
|
|
181
|
+
// Make tooltip visible
|
|
182
|
+
tooltipElement.classList.add('visible');
|
|
183
|
+
|
|
184
|
+
// Position tooltip directly above the element with overlap
|
|
185
|
+
positionTooltipWithOverlap(element);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Position tooltip with slight overlap to prevent gaps
|
|
190
|
+
* @param {HTMLElement} element - Element to position tooltip relative to
|
|
191
|
+
*/
|
|
192
|
+
function positionTooltipWithOverlap(element) {
|
|
193
|
+
const elementRect = element.getBoundingClientRect();
|
|
194
|
+
const margin = 5; // smaller margin
|
|
195
|
+
|
|
196
|
+
// Reset any previous positioning to get proper dimensions
|
|
197
|
+
tooltipElement.style.left = '0px';
|
|
198
|
+
tooltipElement.style.top = '0px';
|
|
199
|
+
tooltipElement.style.maxWidth = '300px';
|
|
200
|
+
|
|
201
|
+
// Get tooltip dimensions after setting content
|
|
202
|
+
const tooltipRect = tooltipElement.getBoundingClientRect();
|
|
203
|
+
|
|
204
|
+
// Calculate position above the element with slight overlap
|
|
205
|
+
let tooltipX = elementRect.left;
|
|
206
|
+
let tooltipY = elementRect.top - tooltipRect.height + 2; // 2px overlap
|
|
207
|
+
|
|
208
|
+
// If tooltip would be above viewport, position it below element instead
|
|
209
|
+
if (tooltipY < margin) {
|
|
210
|
+
tooltipY = elementRect.bottom - 2; // 2px overlap at bottom
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// If tooltip is wider than element, center it
|
|
214
|
+
if (tooltipRect.width > elementRect.width) {
|
|
215
|
+
tooltipX = elementRect.left - ((tooltipRect.width - elementRect.width) / 2);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Keep tooltip within viewport
|
|
219
|
+
if (tooltipX < margin) tooltipX = margin;
|
|
220
|
+
if (tooltipX + tooltipRect.width > window.innerWidth - margin) {
|
|
221
|
+
// Align right edge with viewport or constrain width
|
|
222
|
+
if (tooltipRect.width > window.innerWidth - (margin * 2)) {
|
|
223
|
+
// If tooltip is too wide, constrain it
|
|
224
|
+
tooltipElement.style.maxWidth = (window.innerWidth - (margin * 2)) + 'px';
|
|
225
|
+
tooltipX = margin;
|
|
226
|
+
} else {
|
|
227
|
+
tooltipX = window.innerWidth - tooltipRect.width - margin;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
tooltipElement.style.left = `${tooltipX}px`;
|
|
232
|
+
tooltipElement.style.top = `${tooltipY}px`;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Check if element's text is truncated (ellipsis applied)
|
|
237
|
+
* @param {HTMLElement} element - Element to check for truncation
|
|
238
|
+
* @returns {boolean} - True if text is truncated
|
|
239
|
+
*/
|
|
240
|
+
function isTextTruncated(element) {
|
|
241
|
+
// Basic truncation check - scrollWidth > clientWidth
|
|
242
|
+
const basicTruncation = element.scrollWidth > element.clientWidth;
|
|
243
|
+
|
|
244
|
+
// If we're dealing with a rig-item-name, perform additional checks
|
|
245
|
+
if (element.classList.contains('rig-item-name')) {
|
|
246
|
+
const item = element.closest('.rig-item');
|
|
247
|
+
if (item) {
|
|
248
|
+
// Check if we have a count element
|
|
249
|
+
const countElement = item.querySelector('.rig-item-count');
|
|
250
|
+
if (countElement) {
|
|
251
|
+
// Get positions
|
|
252
|
+
const nameRect = element.getBoundingClientRect();
|
|
253
|
+
const countRect = countElement.getBoundingClientRect();
|
|
254
|
+
|
|
255
|
+
// Check if natural text width would overlap with count
|
|
256
|
+
// We'll consider it potentially truncated if the name without truncation
|
|
257
|
+
// would extend into the count element's space
|
|
258
|
+
const textWidth = element.scrollWidth;
|
|
259
|
+
const availableWidth = countRect.left - nameRect.left - 5; // 5px buffer
|
|
260
|
+
|
|
261
|
+
return textWidth > availableWidth;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
return basicTruncation;
|
|
267
|
+
}
|