@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,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
+ }