@mindexec/cli 0.2.432 → 0.2.433
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/package.json +1 -1
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +1 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-renderer.js +71 -151
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-render-plan.js +863 -21
- package/wwwroot/_content/MindExecution.Shared/js/renderers/CSS3DRenderer.js +3 -3
- package/wwwroot/_framework/{MindExecution.Plugins.Concept.slcp5au0e8.dll → MindExecution.Plugins.Concept.gmo0tv41kt.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.nk8wgsetbw.dll → MindExecution.Plugins.PlanMaster.ts9iffoyt9.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.YouTube.rrrfswr6up.dll → MindExecution.Plugins.YouTube.m4ag6l6urx.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Shared.23xj2d2olw.dll → MindExecution.Shared.u07hdbavl1.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Web.4a5lf7nem7.dll → MindExecution.Web.m9h5r0uvry.dll} +0 -0
- package/wwwroot/_framework/blazor.boot.json +11 -11
- package/wwwroot/index.html +1 -1
- package/wwwroot/service-worker-assets.js +17 -17
- package/wwwroot/service-worker.js +1 -1
|
@@ -1,19 +1,72 @@
|
|
|
1
1
|
(function () {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
const BUILD_ID = '20260712-
|
|
4
|
+
const BUILD_ID = '20260712-boundary-transition-cache-v37';
|
|
5
5
|
const FRAME_SAMPLE_LIMIT = 240;
|
|
6
6
|
const INITIAL_LINE_TEXTURE_ROWS = 1024;
|
|
7
7
|
const GPU_WARM_RETRY_DELAY_MS = 120;
|
|
8
8
|
const IMAGE_ATLAS_TILE_SIZE = 128;
|
|
9
9
|
const frameSampleStates = new WeakMap();
|
|
10
10
|
const residentLinePrewarmStates = new WeakMap();
|
|
11
|
+
const residentTransitionStates = new WeakMap();
|
|
12
|
+
const RESIDENT_CSS_CACHE_TEXT_TYPES = new Set(['text', 'note', 'memo', 'markdown', 'code', 'csv-table']);
|
|
11
13
|
const VIEW_SYNC_SECTION_KEYS = [
|
|
12
14
|
'fullResSetup', 'fullResImages', 'fullResCssQueue', 'fullResHandoff', 'fullResOther',
|
|
13
|
-
'lodCleanup', 'lodNodeScan', 'lodResidentApply', 'lodImageInstances',
|
|
15
|
+
'lodCleanup', 'lodNodeScan', 'lodResidentApply', 'lodLinePatch', 'lodImageInstances',
|
|
14
16
|
'lodPositionPatch', 'lodFallbacks', 'lodOther'
|
|
15
17
|
];
|
|
16
18
|
|
|
19
|
+
function configureImageAtlasTexture(texture, THREE) {
|
|
20
|
+
if (!texture || !THREE) return texture;
|
|
21
|
+
if ('colorSpace' in texture && THREE.SRGBColorSpace) texture.colorSpace = THREE.SRGBColorSpace;
|
|
22
|
+
else if ('encoding' in texture && THREE.sRGBEncoding) texture.encoding = THREE.sRGBEncoding;
|
|
23
|
+
texture.minFilter = THREE.LinearFilter;
|
|
24
|
+
texture.magFilter = THREE.LinearFilter;
|
|
25
|
+
texture.wrapS = THREE.ClampToEdgeWrapping;
|
|
26
|
+
texture.wrapT = THREE.ClampToEdgeWrapping;
|
|
27
|
+
texture.flipY = false;
|
|
28
|
+
texture.generateMipmaps = false;
|
|
29
|
+
texture.needsUpdate = true;
|
|
30
|
+
return texture;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function getImageAtlasOutputColorChunk(THREE) {
|
|
34
|
+
const chunk = THREE?.ShaderChunk?.colorspace_fragment
|
|
35
|
+
? '#include <colorspace_fragment>'
|
|
36
|
+
: (THREE?.ShaderChunk?.encodings_fragment ? '#include <encodings_fragment>' : '');
|
|
37
|
+
globalThis.MindCanvasDevGuards?.assert?.(chunk.length > 0,
|
|
38
|
+
'resident-image-output-color-chunk-missing', { threeRevision: String(THREE?.REVISION || 'unknown') });
|
|
39
|
+
return chunk;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function syncCommittedResidentTextCount(renderer, hasResidentInstances, forceResident) {
|
|
43
|
+
if (forceResident !== true || !hasResidentInstances || renderer?._lodUsesVisibleSubset === true ||
|
|
44
|
+
renderer?._instancesDirty === true || renderer?._isNodeArrayDirty === true) return -1;
|
|
45
|
+
const count = Number(renderer?.instanceData?.nodeIds?.length || 0);
|
|
46
|
+
renderer._cachedEligibleTextLikeCount = count;
|
|
47
|
+
renderer._lastNodeCount = count;
|
|
48
|
+
return count;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function clearFullResImageVisuals(renderer, nodeObjectsById) {
|
|
52
|
+
const tracked = renderer?._fullResImageVisualIds;
|
|
53
|
+
if (!tracked) return;
|
|
54
|
+
for (const nodeId of tracked) {
|
|
55
|
+
const entry = nodeObjectsById?.get?.(nodeId) || null;
|
|
56
|
+
if (entry) renderer._hideImageLodFullVisual?.(entry);
|
|
57
|
+
}
|
|
58
|
+
if (renderer.isInLODMode === true) {
|
|
59
|
+
const residentIds = renderer.imageInstanceData?.nodeIds || [];
|
|
60
|
+
for (let i = 0; i < residentIds.length; i++) {
|
|
61
|
+
const nodeId = residentIds[i];
|
|
62
|
+
if (!nodeId || tracked.has(nodeId)) continue;
|
|
63
|
+
const entry = nodeObjectsById?.get?.(nodeId) || null;
|
|
64
|
+
if (entry) renderer._hideImageLodFullVisual?.(entry);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
tracked.clear();
|
|
68
|
+
}
|
|
69
|
+
|
|
17
70
|
function isFullResMotionOptimizationActive(module) {
|
|
18
71
|
return (module?._viewSyncMotionActive === true ||
|
|
19
72
|
module?.isPanning === true ||
|
|
@@ -191,8 +244,32 @@
|
|
|
191
244
|
context.fillStyle = '#eef2f7';
|
|
192
245
|
context.fillRect(0, 0, size, size);
|
|
193
246
|
}
|
|
194
|
-
|
|
247
|
+
const THREE = globalThis.THREE;
|
|
248
|
+
const previousTexture = renderer.imageAtlasTexture || null;
|
|
249
|
+
if (THREE?.CanvasTexture) {
|
|
250
|
+
const nextTexture = new THREE.CanvasTexture(renderer.imageAtlasCanvas);
|
|
251
|
+
nextTexture.minFilter = previousTexture?.minFilter ?? THREE.LinearFilter;
|
|
252
|
+
nextTexture.magFilter = previousTexture?.magFilter ?? THREE.LinearFilter;
|
|
253
|
+
nextTexture.wrapS = previousTexture?.wrapS ?? THREE.ClampToEdgeWrapping;
|
|
254
|
+
nextTexture.wrapT = previousTexture?.wrapT ?? THREE.ClampToEdgeWrapping;
|
|
255
|
+
nextTexture.flipY = previousTexture?.flipY ?? false;
|
|
256
|
+
nextTexture.generateMipmaps = previousTexture?.generateMipmaps ?? false;
|
|
257
|
+
if ('colorSpace' in nextTexture && previousTexture?.colorSpace) {
|
|
258
|
+
nextTexture.colorSpace = previousTexture.colorSpace;
|
|
259
|
+
} else if ('encoding' in nextTexture && previousTexture?.encoding != null) {
|
|
260
|
+
nextTexture.encoding = previousTexture.encoding;
|
|
261
|
+
}
|
|
262
|
+
nextTexture.needsUpdate = true;
|
|
263
|
+
renderer.imageAtlasTexture = nextTexture;
|
|
264
|
+
const atlasUniform = renderer.instancedImageMesh?.material?.uniforms?.uImageAtlas || null;
|
|
265
|
+
if (atlasUniform) atlasUniform.value = nextTexture;
|
|
266
|
+
previousTexture?.dispose?.();
|
|
267
|
+
} else if (previousTexture) {
|
|
268
|
+
previousTexture.needsUpdate = true;
|
|
269
|
+
}
|
|
195
270
|
renderer._residentGpuWarmKey = '';
|
|
271
|
+
renderer._residentGpuWarmOffscreenComplete = false;
|
|
272
|
+
renderer._residentImageAtlasWarmVersion = -1;
|
|
196
273
|
return true;
|
|
197
274
|
}
|
|
198
275
|
|
|
@@ -207,6 +284,442 @@
|
|
|
207
284
|
return batch;
|
|
208
285
|
}
|
|
209
286
|
|
|
287
|
+
function reuseActiveCssMediaFallback(renderer, entry, module) {
|
|
288
|
+
const cssObject = entry?.cssObject || null;
|
|
289
|
+
const element = cssObject?.element || null;
|
|
290
|
+
const nodeId = String(entry?.model?.id || entry?.model?.Id || entry?.glObject?.userData?.nodeId || '').trim();
|
|
291
|
+
const cssScene = module?.cssScene || module?.scene || null;
|
|
292
|
+
if (!nodeId || !element || entry?.isCssDirty === true || cssObject.visible !== true ||
|
|
293
|
+
!renderer?._lodImageCssFallbackNodeIds?.has?.(nodeId) ||
|
|
294
|
+
(cssScene && cssObject.parent !== cssScene) || element.style?.display === 'none' ||
|
|
295
|
+
element.style?.visibility === 'hidden' || element.style?.opacity === '0') return false;
|
|
296
|
+
if (String(module?.selectedNodeIdJs || module?.selectedNodeId || '') === nodeId ||
|
|
297
|
+
module?.multiSelectedNodeIds?.has?.(nodeId) === true || module?.draggedNodeId === nodeId ||
|
|
298
|
+
renderer?._getCurrentHoveredNodeId?.(module) === nodeId) return false;
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function hasAnimatedGifCssFallbackCandidates(renderer, module, isAnimatedGifModel) {
|
|
303
|
+
const nodeObjectsById = module?.nodeObjectsById || renderer?._module?.nodeObjectsById || null;
|
|
304
|
+
if (!nodeObjectsById || typeof isAnimatedGifModel !== 'function') return false;
|
|
305
|
+
const isGifId = (value) => {
|
|
306
|
+
const nodeId = String(value || '').trim();
|
|
307
|
+
return !!nodeId && isAnimatedGifModel(nodeObjectsById.get(nodeId)?.model) === true;
|
|
308
|
+
};
|
|
309
|
+
const scan = (ids) => {
|
|
310
|
+
if (!ids) return false;
|
|
311
|
+
for (const nodeId of ids) if (isGifId(nodeId)) return true;
|
|
312
|
+
return false;
|
|
313
|
+
};
|
|
314
|
+
const visibleIds = module?._visibleIds || null;
|
|
315
|
+
if (scan(visibleIds)) return true;
|
|
316
|
+
if (module?._prevVisibleIds !== visibleIds && scan(module?._prevVisibleIds)) return true;
|
|
317
|
+
if (isGifId(module?.selectedNodeIdJs) || scan(module?.multiSelectedNodeIds)) return true;
|
|
318
|
+
return scan(renderer?._lodImageCssFallbackNodeIds);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function hasResidentDirtyWork(renderer, camera, module, resolveLodBand, buildSelectionKey, isAnimatedGifModel) {
|
|
322
|
+
if (!renderer) return false;
|
|
323
|
+
const lodBand = camera && typeof resolveLodBand === 'function'
|
|
324
|
+
? resolveLodBand(Number(camera.position?.z || 0))
|
|
325
|
+
: renderer._currentLodBand;
|
|
326
|
+
if (renderer._instancesDirty === true || renderer._imageInstancesDirty === true ||
|
|
327
|
+
renderer._positionsOnlyDirty === true || renderer._isNodeArrayDirty === true ||
|
|
328
|
+
Number(renderer._dirtyPositionIds?.size || 0) > 0 || Number(renderer._pendingSelectionRefreshIds?.size || 0) > 0 ||
|
|
329
|
+
renderer._imageAtlasRebuildPending === true || Number(renderer._imageAtlasQueuedIds?.size || 0) > 0 ||
|
|
330
|
+
Number(renderer._imageAtlasLoadingIds?.size || 0) > 0 || Number(renderer._imageAtlasBatchReadyIds?.size || 0) > 0 ||
|
|
331
|
+
renderer._imageAtlasBatchActive === true || renderer._lodCleanupPending === true ||
|
|
332
|
+
renderer._deferLineRestorePending === true || renderer._hasPendingLineDetailRestore?.(lodBand) === true ||
|
|
333
|
+
Number(renderer._pendingLodVisibilityVersion ?? -1) >= 0 || renderer._fullResHandoffActive === true ||
|
|
334
|
+
renderer.isLoading === true || module?.isLoading === true || renderer._hasResidentLodInstances?.() !== true) return true;
|
|
335
|
+
const selectionKey = typeof buildSelectionKey === 'function'
|
|
336
|
+
? buildSelectionKey(module?.multiSelectedNodeIds || null, module?.selectedNodeIdJs || null)
|
|
337
|
+
: '';
|
|
338
|
+
if (renderer._lastAppliedLodSelectionKey !== selectionKey) return true;
|
|
339
|
+
const usesCssImageFallbacks = renderer._shouldUseCssImageFallbackInResidentLod?.(module, lodBand) === true;
|
|
340
|
+
const usesAnimatedGifFallbacks = hasAnimatedGifCssFallbackCandidates(renderer, module, isAnimatedGifModel);
|
|
341
|
+
const fallbackCount = Number(renderer._lodImageCssFallbackNodeIds?.size || 0);
|
|
342
|
+
if (!usesAnimatedGifFallbacks && fallbackCount <= 0) return false;
|
|
343
|
+
const activeFallbackCount = Number(renderer._getActiveCssMediaLodFallbackCount?.(module) || 0);
|
|
344
|
+
return (usesAnimatedGifFallbacks && activeFallbackCount <= 0) ||
|
|
345
|
+
(fallbackCount > 0 && (!(usesCssImageFallbacks || usesAnimatedGifFallbacks) || activeFallbackCount <= 0));
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
function hasPendingNearCssWarmup(renderer, module, buildSelectionKey, isCss3dEnabled, supportsCss3dModel) {
|
|
349
|
+
if (!renderer || renderer.isInLODMode !== false) return false;
|
|
350
|
+
if (renderer._css3dProcessing === true || Number(renderer._css3dQueuedMap?.size || 0) > 0 ||
|
|
351
|
+
renderer._hasCss3dQueueItems?.() === true || Number(renderer._nearEntryBoostFrames || 0) > 0) return true;
|
|
352
|
+
const moduleRef = module || renderer._module || null;
|
|
353
|
+
const visibleIds = renderer._getNearVisibleIds?.(moduleRef) || null;
|
|
354
|
+
const nodeObjectsById = moduleRef?.nodeObjectsById || null;
|
|
355
|
+
if (!visibleIds || !nodeObjectsById || visibleIds.size === 0) return false;
|
|
356
|
+
const selectionKey = buildSelectionKey?.(moduleRef?.multiSelectedNodeIds || null, moduleRef?.selectedNodeIdJs || null) || '';
|
|
357
|
+
const stableKey = buildFullResKey(renderer._currentLodBand, moduleRef?._visibilityVersion || 0, selectionKey,
|
|
358
|
+
nodeObjectsById.size, visibleIds.size, renderer._nearCssVisibleIds?.size || 0,
|
|
359
|
+
renderer._activeFullResCssNodeIds?.size || 0, isCss3dEnabled?.(moduleRef) !== false, moduleRef, renderer);
|
|
360
|
+
if (stableKey && renderer._lastNearCssNoWorkKey === stableKey) return false;
|
|
361
|
+
for (const nodeId of visibleIds) {
|
|
362
|
+
if (renderer._nearCssVisibleIds?.has?.(nodeId)) continue;
|
|
363
|
+
const entry = nodeObjectsById.get(nodeId);
|
|
364
|
+
if (entry?.glObject && supportsCss3dModel?.(entry.model) === true) return true;
|
|
365
|
+
}
|
|
366
|
+
return false;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
function resetPreparedLayoutRecord(record) {
|
|
370
|
+
if (!record?.layoutPrepared) return;
|
|
371
|
+
const cssObject = record.cssObject;
|
|
372
|
+
const element = record.element;
|
|
373
|
+
if (cssObject?.userData) cssObject.userData._residentTransitionPrepared = false;
|
|
374
|
+
record.layoutPrepared = false;
|
|
375
|
+
if (cssObject?.visible !== true && element?.style) {
|
|
376
|
+
element.style.setProperty?.('display', 'none', 'important');
|
|
377
|
+
element.style.setProperty?.('visibility', 'visible', 'important');
|
|
378
|
+
element.style.setProperty?.('opacity', '1', 'important');
|
|
379
|
+
element.style.setProperty?.('pointer-events', record.pointerEvents || 'auto', 'important');
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
function clearTransitionRecords(state) {
|
|
384
|
+
if (!state) return;
|
|
385
|
+
state.layoutEpoch = Number(state.layoutEpoch || 0) + 1;
|
|
386
|
+
if (state.layoutRetryTimer) clearTimeout(state.layoutRetryTimer);
|
|
387
|
+
for (const record of state.parked?.values?.() || []) resetPreparedLayoutRecord(record);
|
|
388
|
+
state.parked?.clear?.();
|
|
389
|
+
state.layoutQueue = null;
|
|
390
|
+
state.layoutCursor = 0;
|
|
391
|
+
state.layoutScheduled = false;
|
|
392
|
+
state.layoutFrameScheduled = false;
|
|
393
|
+
state.layoutRetryTimer = null;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
function getTransitionState(renderer, module, nodeObjectsById) {
|
|
397
|
+
let state = residentTransitionStates.get(renderer);
|
|
398
|
+
if (!state || state.module !== module || state.nodeObjectsById !== nodeObjectsById) {
|
|
399
|
+
clearTransitionRecords(state);
|
|
400
|
+
state = {
|
|
401
|
+
renderer, module, nodeObjectsById, active: false, selectionKey: '', parked: new Map(),
|
|
402
|
+
layoutQueue: null, layoutCursor: 0, layoutScheduled: false, layoutFrameScheduled: false,
|
|
403
|
+
layoutRetryTimer: null, layoutEpoch: 0
|
|
404
|
+
};
|
|
405
|
+
residentTransitionStates.set(renderer, state);
|
|
406
|
+
}
|
|
407
|
+
return state;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
function getResidentCssCacheKind(entry) {
|
|
411
|
+
const model = entry?.model || null;
|
|
412
|
+
const contentType = String(model?.contentType ?? model?.ContentType ?? '').trim().toLowerCase();
|
|
413
|
+
if (contentType === 'image') return 'image';
|
|
414
|
+
if (contentType === 'video' || contentType === 'embed' || contentType === 'templatelauncher') return contentType;
|
|
415
|
+
if (RESIDENT_CSS_CACHE_TEXT_TYPES.has(contentType)) return 'text';
|
|
416
|
+
const metadata = model?.metadata || model?.Metadata || null;
|
|
417
|
+
const nodeType = String(model?.nodeType ?? model?.NodeType ?? '').toLowerCase();
|
|
418
|
+
const semanticType = String(metadata?.SemanticType ?? metadata?.semanticType ?? '');
|
|
419
|
+
const agentId = metadata?.agentId ?? metadata?.AgentId;
|
|
420
|
+
return nodeType.startsWith('agent_') || semanticType === 'MindCanvasAgent' || semanticType === 'AgentCommand' ||
|
|
421
|
+
semanticType === 'BusinessAutomationNode' || (agentId != null && String(agentId).trim() !== '') ? 'text' : null;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
function cacheResidentCssEntry(state, entry, nodeId, kind) {
|
|
425
|
+
const cssObject = entry?.cssObject || null;
|
|
426
|
+
if (!state?.active || !kind || entry?.isCssDirty === true || !cssObject?.element) return false;
|
|
427
|
+
const cssScene = state.module?.cssScene || state.module?.scene || null;
|
|
428
|
+
if (!cssScene || (cssObject.parent != null && cssObject.parent !== cssScene)) return false;
|
|
429
|
+
const id = String(nodeId || '');
|
|
430
|
+
const previous = state.parked.get(id) || null;
|
|
431
|
+
if (previous?.layoutPrepared === true &&
|
|
432
|
+
(previous.cssObject !== cssObject || previous.element !== cssObject.element)) resetPreparedLayoutRecord(previous);
|
|
433
|
+
state.parked.set(id, {
|
|
434
|
+
nodeId: id,
|
|
435
|
+
entry, cssObject, element: cssObject.element, parent: cssObject.parent, kind,
|
|
436
|
+
pointerEvents: previous?.pointerEvents ?? cssObject.element.style?.pointerEvents ?? '',
|
|
437
|
+
layoutEligible: previous?.layoutEligible === true,
|
|
438
|
+
layoutPrepared: previous?.layoutPrepared === true && previous.cssObject === cssObject && previous.element === cssObject.element,
|
|
439
|
+
selectionKey: state.selectionKey,
|
|
440
|
+
...getEntryContentState(entry)
|
|
441
|
+
});
|
|
442
|
+
state.layoutQueue = null;
|
|
443
|
+
return true;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
function cachePreparedResidentCss(renderer, entry, module, nodeObjectsById) {
|
|
447
|
+
const state = residentTransitionStates.get(renderer);
|
|
448
|
+
if (!state || state.module !== module || state.nodeObjectsById !== nodeObjectsById) return false;
|
|
449
|
+
const nodeId = entry?.model?.id || entry?.model?.Id || entry?.glObject?.userData?.nodeId || '';
|
|
450
|
+
const cached = cacheResidentCssEntry(state, entry, nodeId, getResidentCssCacheKind(entry));
|
|
451
|
+
if (cached) {
|
|
452
|
+
const record = state.parked.get(String(nodeId || ''));
|
|
453
|
+
if (record) record.layoutEligible = true;
|
|
454
|
+
scheduleResidentCssLayoutWarm(renderer, module, nodeObjectsById);
|
|
455
|
+
}
|
|
456
|
+
return cached;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
function beginResidentCssTransition(renderer, module, nodeObjectsById, previousBand, nextBand, selectionKey) {
|
|
460
|
+
if (!renderer || !module || !nodeObjectsById) return false;
|
|
461
|
+
const state = getTransitionState(renderer, module, nodeObjectsById);
|
|
462
|
+
const enteringResident = previousBand === 'NORMAL' && nextBand === 'MID';
|
|
463
|
+
const returningFullRes = (previousBand === 'MID' || previousBand === 'FAR') && nextBand === 'NORMAL';
|
|
464
|
+
if (enteringResident) {
|
|
465
|
+
clearTransitionRecords(state);
|
|
466
|
+
state.active = true;
|
|
467
|
+
state.selectionKey = String(selectionKey || '');
|
|
468
|
+
for (const [nodeId, entry] of nodeObjectsById) {
|
|
469
|
+
cacheResidentCssEntry(state, entry, nodeId, getResidentCssCacheKind(entry));
|
|
470
|
+
}
|
|
471
|
+
} else if (!returningFullRes) {
|
|
472
|
+
clearTransitionRecords(state);
|
|
473
|
+
state.active = false;
|
|
474
|
+
state.selectionKey = '';
|
|
475
|
+
}
|
|
476
|
+
return enteringResident || (returningFullRes && state.active);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
function getEntryContentState(entry) {
|
|
480
|
+
const model = entry?.model || null;
|
|
481
|
+
return {
|
|
482
|
+
model,
|
|
483
|
+
source: model?._visibleContent ?? model?.response ?? model?.Response ?? model?.content ?? model?.Content ?? '',
|
|
484
|
+
prompt: model?.prompt ?? model?.Prompt ?? '',
|
|
485
|
+
width: Number(model?.width || model?.Width || 0),
|
|
486
|
+
height: Number(model?.height || model?.Height || 0),
|
|
487
|
+
media: model?.thumbnailUrl ?? model?.ThumbnailUrl ?? model?.displayUrl ?? model?.DisplayUrl ?? ''
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
function parkFullResCss(renderer, entry, module, nodeObjectsById, selectionKey, kind = 'text') {
|
|
492
|
+
const cssObject = entry?.cssObject || null;
|
|
493
|
+
const element = cssObject?.element || null;
|
|
494
|
+
const nodeId = String(entry?.model?.id || entry?.model?.Id || entry?.glObject?.userData?.nodeId || '').trim();
|
|
495
|
+
if (!renderer || !cssObject || !element || !nodeId) return false;
|
|
496
|
+
const state = getTransitionState(renderer, module, nodeObjectsById);
|
|
497
|
+
let cached = false;
|
|
498
|
+
if (state.active && state.selectionKey === String(selectionKey || '') && entry.isCssDirty !== true) {
|
|
499
|
+
cached = cacheResidentCssEntry(state, entry, nodeId, kind);
|
|
500
|
+
if (cached) {
|
|
501
|
+
const record = state.parked.get(nodeId);
|
|
502
|
+
if (record) record.layoutEligible = true;
|
|
503
|
+
renderer._residentCssParkCount = Number(renderer._residentCssParkCount || 0) + 1;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
cssObject.visible = false;
|
|
507
|
+
entry.currentType = 'GL';
|
|
508
|
+
if (element.style?.display !== 'none') {
|
|
509
|
+
element.style?.setProperty?.('display', 'none', 'important');
|
|
510
|
+
}
|
|
511
|
+
if (cached && !state.layoutRetryTimer) {
|
|
512
|
+
const epoch = state.layoutEpoch;
|
|
513
|
+
state.layoutRetryTimer = setTimeout(() => {
|
|
514
|
+
state.layoutRetryTimer = null;
|
|
515
|
+
if (residentTransitionStates.get(renderer) === state && state.layoutEpoch === epoch) {
|
|
516
|
+
scheduleResidentCssLayoutWarm(renderer, module, nodeObjectsById);
|
|
517
|
+
}
|
|
518
|
+
}, 0);
|
|
519
|
+
}
|
|
520
|
+
return true;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
function scheduleResidentCssLayoutWarm(renderer, module, nodeObjectsById) {
|
|
524
|
+
const state = residentTransitionStates.get(renderer);
|
|
525
|
+
if (!state?.active || state.module !== module || state.nodeObjectsById !== nodeObjectsById ||
|
|
526
|
+
renderer?._disposed === true || renderer?.isInLODMode !== true || module?.isLoading === true) return false;
|
|
527
|
+
const visibleIds = module?._visibleIds || module?._prevVisibleIds || renderer?._visibleIds || null;
|
|
528
|
+
if (visibleIds?.size > 0) {
|
|
529
|
+
for (const nodeId of visibleIds) {
|
|
530
|
+
const record = state.parked.get(String(nodeId || ''));
|
|
531
|
+
if (record) record.layoutEligible = true;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
if (isPrewarmInteractionActive(module)) {
|
|
535
|
+
if (!state.layoutRetryTimer) {
|
|
536
|
+
const epoch = state.layoutEpoch;
|
|
537
|
+
state.layoutRetryTimer = setTimeout(() => {
|
|
538
|
+
state.layoutRetryTimer = null;
|
|
539
|
+
if (residentTransitionStates.get(renderer) === state && state.layoutEpoch === epoch) {
|
|
540
|
+
scheduleResidentCssLayoutWarm(renderer, module, nodeObjectsById);
|
|
541
|
+
}
|
|
542
|
+
}, 80);
|
|
543
|
+
}
|
|
544
|
+
return false;
|
|
545
|
+
}
|
|
546
|
+
if (state.layoutScheduled || state.layoutFrameScheduled) return false;
|
|
547
|
+
if (!state.layoutQueue) {
|
|
548
|
+
state.layoutQueue = [];
|
|
549
|
+
state.layoutCursor = 0;
|
|
550
|
+
for (const record of state.parked.values()) {
|
|
551
|
+
if (record.layoutEligible === true && record.layoutPrepared !== true) state.layoutQueue.push(record);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
if (state.layoutCursor >= state.layoutQueue.length) {
|
|
555
|
+
state.layoutQueue = null;
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
const epoch = state.layoutEpoch;
|
|
560
|
+
state.layoutScheduled = true;
|
|
561
|
+
const run = () => {
|
|
562
|
+
state.layoutScheduled = false;
|
|
563
|
+
if (residentTransitionStates.get(renderer) !== state || state.layoutEpoch !== epoch || !state.active ||
|
|
564
|
+
renderer?._disposed === true || renderer?.isInLODMode !== true || renderer?._module !== module ||
|
|
565
|
+
module?.nodeObjectsById !== nodeObjectsById || module?.isLoading === true) return;
|
|
566
|
+
if (isPrewarmInteractionActive(module)) {
|
|
567
|
+
state.layoutQueue = null;
|
|
568
|
+
scheduleResidentCssLayoutWarm(renderer, module, nodeObjectsById);
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// Visibility can expand while the wheel is still settling after
|
|
573
|
+
// NORMAL -> MID. Refresh from the latest set during idle so those
|
|
574
|
+
// CSS owners are not created synchronously on MID -> NORMAL.
|
|
575
|
+
const latestVisibleIds = module?._visibleIds || module?._prevVisibleIds || renderer?._visibleIds || null;
|
|
576
|
+
const latestPriority = latestVisibleIds?.size > 0
|
|
577
|
+
? renderer?._getNearVisiblePriority?.(latestVisibleIds, nodeObjectsById, module?.camera)
|
|
578
|
+
: null;
|
|
579
|
+
if (Array.isArray(latestPriority) && latestPriority.length > 0) {
|
|
580
|
+
renderer?._queueCss3dPrewarm?.(latestPriority, nodeObjectsById, module, 'MID');
|
|
581
|
+
}
|
|
582
|
+
if (residentTransitionStates.get(renderer) !== state || state.layoutEpoch !== epoch ||
|
|
583
|
+
!Array.isArray(state.layoutQueue)) return;
|
|
584
|
+
const layoutQueue = state.layoutQueue;
|
|
585
|
+
|
|
586
|
+
const startedAt = performance.now();
|
|
587
|
+
let prepared = 0;
|
|
588
|
+
while (state.layoutCursor < layoutQueue.length && prepared < 4 &&
|
|
589
|
+
(prepared === 0 || performance.now() - startedAt < 2)) {
|
|
590
|
+
const record = layoutQueue[state.layoutCursor++];
|
|
591
|
+
if (state.parked.get(record.nodeId) !== record || record.entry?.isCssDirty === true ||
|
|
592
|
+
record.cssObject?.visible === true || !record.element?.style) continue;
|
|
593
|
+
record.cssObject.userData = record.cssObject.userData || {};
|
|
594
|
+
record.cssObject.userData._residentTransitionPrepared = true;
|
|
595
|
+
record.element.style.setProperty?.('visibility', 'visible', 'important');
|
|
596
|
+
record.element.style.setProperty?.('opacity', '0', 'important');
|
|
597
|
+
record.element.style.setProperty?.('pointer-events', 'none', 'important');
|
|
598
|
+
record.element.style.setProperty?.('display', 'block', 'important');
|
|
599
|
+
record.layoutPrepared = true;
|
|
600
|
+
prepared++;
|
|
601
|
+
}
|
|
602
|
+
if (prepared > 0) {
|
|
603
|
+
renderer._residentCssLayoutWarmCount = Number(renderer._residentCssLayoutWarmCount || 0) + prepared;
|
|
604
|
+
module._css3dVisualChangedThisFrame = true;
|
|
605
|
+
module._css3dVisualChangedSinceLastRender = true;
|
|
606
|
+
}
|
|
607
|
+
if (state.layoutQueue !== layoutQueue) return;
|
|
608
|
+
if (state.layoutCursor < layoutQueue.length) {
|
|
609
|
+
state.layoutFrameScheduled = true;
|
|
610
|
+
const continueWarm = () => {
|
|
611
|
+
state.layoutFrameScheduled = false;
|
|
612
|
+
if (residentTransitionStates.get(renderer) === state && state.layoutEpoch === epoch) {
|
|
613
|
+
scheduleResidentCssLayoutWarm(renderer, module, nodeObjectsById);
|
|
614
|
+
}
|
|
615
|
+
};
|
|
616
|
+
if (typeof globalThis.requestAnimationFrame === 'function') globalThis.requestAnimationFrame(continueWarm);
|
|
617
|
+
else setTimeout(continueWarm, 16);
|
|
618
|
+
} else {
|
|
619
|
+
state.layoutQueue = null;
|
|
620
|
+
}
|
|
621
|
+
};
|
|
622
|
+
if (typeof globalThis.requestIdleCallback === 'function') globalThis.requestIdleCallback(run, { timeout: 120 });
|
|
623
|
+
else setTimeout(run, 16);
|
|
624
|
+
return true;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
function parkReadyResidentImage(renderer, entry, module, nodeObjectsById, selectionKey, nodeId, animatedGif, selected, interactiveOwner) {
|
|
628
|
+
if (animatedGif === true || selected === true || interactiveOwner === true ||
|
|
629
|
+
renderer?._hasActiveImageLodInstance?.(nodeId) !== true) return false;
|
|
630
|
+
parkFullResCss(renderer, entry, module, nodeObjectsById, selectionKey, 'image');
|
|
631
|
+
renderer._hideImageLodFullVisual?.(entry);
|
|
632
|
+
renderer._setGlowVisibility?.(entry, false);
|
|
633
|
+
return true;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
function restoreParkedFullResCss(renderer, entry, module, nodeObjectsById, selectionKey, lodBand, nodeIdValue) {
|
|
637
|
+
if (!renderer || lodBand !== 'NORMAL') return false;
|
|
638
|
+
const state = residentTransitionStates.get(renderer);
|
|
639
|
+
const nodeId = String(nodeIdValue || entry?.model?.id || entry?.model?.Id || '').trim();
|
|
640
|
+
const record = state?.parked?.get?.(nodeId) || null;
|
|
641
|
+
const current = getEntryContentState(entry);
|
|
642
|
+
const cssScene = module?.cssScene || module?.scene || null;
|
|
643
|
+
const valid = !!record && state.module === module && state.nodeObjectsById === nodeObjectsById &&
|
|
644
|
+
record.entry === entry && record.model === current.model && record.cssObject === entry?.cssObject &&
|
|
645
|
+
record.element === entry?.cssObject?.element && cssScene &&
|
|
646
|
+
(record.parent == null || record.parent === cssScene) &&
|
|
647
|
+
(entry.cssObject.parent == null || entry.cssObject.parent === cssScene) && entry.isCssDirty !== true &&
|
|
648
|
+
record.selectionKey === String(selectionKey || '') && record.source === current.source &&
|
|
649
|
+
record.prompt === current.prompt && record.width === current.width && record.height === current.height &&
|
|
650
|
+
record.media === current.media;
|
|
651
|
+
if (!valid) {
|
|
652
|
+
if (record) {
|
|
653
|
+
resetPreparedLayoutRecord(record);
|
|
654
|
+
state.parked.delete(nodeId);
|
|
655
|
+
}
|
|
656
|
+
if (state?.active) renderer._residentCssRestoreMissCount = Number(renderer._residentCssRestoreMissCount || 0) + 1;
|
|
657
|
+
return false;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
const cssObject = record.cssObject;
|
|
661
|
+
const element = record.element;
|
|
662
|
+
const layoutPrepared = record.layoutPrepared === true && cssObject.userData?._residentTransitionPrepared === true;
|
|
663
|
+
if (cssObject.userData) cssObject.userData._residentTransitionPrepared = false;
|
|
664
|
+
if (cssObject.parent !== cssScene) cssScene.add?.(cssObject);
|
|
665
|
+
if (entry.glObject) {
|
|
666
|
+
entry.glObject.updateWorldMatrix?.(true, false);
|
|
667
|
+
entry.glObject.matrixWorld?.decompose?.(renderer._tmpWorldPos, renderer._tmpWorldQuat, renderer._tmpWorldScale);
|
|
668
|
+
if (renderer._tmpWorldPos) cssObject.position?.copy?.(renderer._tmpWorldPos);
|
|
669
|
+
if (renderer._tmpWorldQuat) cssObject.quaternion?.copy?.(renderer._tmpWorldQuat);
|
|
670
|
+
entry.glObject.visible = true;
|
|
671
|
+
if (entry.bodyMesh) entry.bodyMesh.visible = false;
|
|
672
|
+
if (entry.tailMesh) entry.tailMesh.visible = false;
|
|
673
|
+
}
|
|
674
|
+
cssObject.visible = true;
|
|
675
|
+
if (!layoutPrepared && element.style?.display !== 'block') element.style?.setProperty?.('display', 'block', 'important');
|
|
676
|
+
if (element.style?.visibility !== 'visible') element.style?.setProperty?.('visibility', 'visible', 'important');
|
|
677
|
+
if (element.style?.opacity !== '1') element.style?.setProperty?.('opacity', '1', 'important');
|
|
678
|
+
if (layoutPrepared) element.style?.setProperty?.('pointer-events', record.pointerEvents || 'auto', 'important');
|
|
679
|
+
if (element.style?.transition !== 'none') element.style?.setProperty?.('transition', 'none', 'important');
|
|
680
|
+
const rootStyle = element.firstElementChild?.style || null;
|
|
681
|
+
if (rootStyle && rootStyle.getPropertyValue?.('content-visibility') !== 'visible') {
|
|
682
|
+
rootStyle.setProperty?.('content-visibility', 'visible', 'important');
|
|
683
|
+
rootStyle.setProperty?.('contain-intrinsic-size', 'auto', 'important');
|
|
684
|
+
}
|
|
685
|
+
cssObject.updateMatrixWorld?.(true);
|
|
686
|
+
entry.currentType = 'CSS';
|
|
687
|
+
renderer._setCss3dLodClass?.(entry, renderer._shouldUseHighCss3dDetail?.(entry, module) !== false);
|
|
688
|
+
renderer._nearCssVisibleIds?.add?.(nodeId);
|
|
689
|
+
if (record.kind === 'image') renderer._syncCssImageBodyBridge?.(entry, module);
|
|
690
|
+
if (record.kind === 'video') globalThis.MindMapCss3DManager?.syncVideoNodeVisibilityPlayback?.(entry.model, cssObject, true);
|
|
691
|
+
renderer._lodImageCssFallbackNodeIds?.delete?.(nodeId);
|
|
692
|
+
state.parked.delete(nodeId);
|
|
693
|
+
renderer._residentCssRestoreCount = Number(renderer._residentCssRestoreCount || 0) + 1;
|
|
694
|
+
module._css3dVisualChangedThisFrame = true;
|
|
695
|
+
module._css3dVisualChangedSinceLastRender = true;
|
|
696
|
+
return true;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
function completeFullResTransition(renderer, allowedCssCount) {
|
|
700
|
+
if (!renderer || Number(renderer._nearCssVisibleIds?.size || 0) < Number(allowedCssCount || 0) ||
|
|
701
|
+
renderer._hasCss3dQueueItems?.() === true || Number(renderer._css3dQueuedMap?.size || 0) > 0) return false;
|
|
702
|
+
if (renderer._nearEntryBoostFrames > 0) renderer._residentBoostClearCount = Number(renderer._residentBoostClearCount || 0) + 1;
|
|
703
|
+
renderer._nearEntryBoostFrames = 0;
|
|
704
|
+
const state = residentTransitionStates.get(renderer);
|
|
705
|
+
if (state) {
|
|
706
|
+
clearTransitionRecords(state);
|
|
707
|
+
state.active = false;
|
|
708
|
+
}
|
|
709
|
+
return true;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
function ensureResidentLineDetails(renderer, lodBand) {
|
|
713
|
+
if (!renderer || lodBand !== 'MID') return false;
|
|
714
|
+
if (renderer.lineDataDirty === true || renderer._lineDetailsPatchPending === true) {
|
|
715
|
+
renderer._markLineDetailsDirty?.();
|
|
716
|
+
return false;
|
|
717
|
+
}
|
|
718
|
+
renderer._residentStableLineReuseCount = Number(renderer._residentStableLineReuseCount || 0) + 1;
|
|
719
|
+
if (renderer.instancedLineMesh) renderer.instancedLineMesh.visible = renderer._shouldShowInstancedLineMesh?.(lodBand) === true;
|
|
720
|
+
return true;
|
|
721
|
+
}
|
|
722
|
+
|
|
210
723
|
function reusePreparedImageInstances(renderer, state) {
|
|
211
724
|
if (renderer?.isInLODMode !== false || renderer?._imageInstancesDirtyReason !== 'image-slot-invalidated' ||
|
|
212
725
|
state?.imageCandidateIds?.size !== state?.imagePreparedIds?.size) return false;
|
|
@@ -221,17 +734,169 @@
|
|
|
221
734
|
return true;
|
|
222
735
|
}
|
|
223
736
|
|
|
737
|
+
function prepareIdleResidentImageInstances(state) {
|
|
738
|
+
const renderer = state?.renderer;
|
|
739
|
+
const module = state?.module;
|
|
740
|
+
const nodeObjectsById = state?.nodeObjectsById;
|
|
741
|
+
if (!renderer || !module || !nodeObjectsById || renderer._disposed === true ||
|
|
742
|
+
renderer._module !== module || module.nodeObjectsById !== nodeObjectsById ||
|
|
743
|
+
renderer.isInLODMode !== false || module.isLoading === true ||
|
|
744
|
+
isPrewarmInteractionActive(module) || renderer._hasPendingImageAtlasWork?.() === true ||
|
|
745
|
+
state.imageCandidateIds?.size !== state.imagePreparedIds?.size ||
|
|
746
|
+
typeof renderer._updateImageInstanceData !== 'function' ||
|
|
747
|
+
typeof renderer._applyImageInstanceData !== 'function') return false;
|
|
748
|
+
|
|
749
|
+
const committedIds = Array.isArray(renderer.imageInstanceData?.nodeIds)
|
|
750
|
+
? renderer.imageInstanceData.nodeIds
|
|
751
|
+
: [];
|
|
752
|
+
const committedSet = new Set(committedIds);
|
|
753
|
+
let missingPreparedImage = false;
|
|
754
|
+
for (const nodeId of state.imagePreparedIds) {
|
|
755
|
+
if (!committedSet.has(nodeId)) {
|
|
756
|
+
missingPreparedImage = true;
|
|
757
|
+
break;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
if (!missingPreparedImage && renderer._imageInstancesDirty !== true) return false;
|
|
761
|
+
|
|
762
|
+
renderer._updateImageInstanceData(nodeObjectsById, true);
|
|
763
|
+
renderer._applyImageInstanceData();
|
|
764
|
+
renderer._lastAppliedImageAtlasSignature =
|
|
765
|
+
renderer._pendingImageAtlasPatchSignature ||
|
|
766
|
+
renderer._buildImageAtlasPatchSignature?.() || '';
|
|
767
|
+
renderer._pendingImageAtlasPatchSignature = '';
|
|
768
|
+
renderer._imageAtlasRebuildPending = false;
|
|
769
|
+
renderer._imageAtlasRebuildDeferredUntil = 0;
|
|
770
|
+
renderer._clearImageInstancesDirty?.();
|
|
771
|
+
renderer._syncResidentCountsAfterDelta?.();
|
|
772
|
+
if (renderer.instancedImageMesh) renderer.instancedImageMesh.visible = false;
|
|
773
|
+
renderer._residentGpuWarmKey = '';
|
|
774
|
+
renderer._residentGpuWarmOffscreenComplete = false;
|
|
775
|
+
renderer._residentImageIdlePatchCount = Number(renderer._residentImageIdlePatchCount || 0) + 1;
|
|
776
|
+
return true;
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
function stagePreparedResidentLineRow(state, entry, lineData) {
|
|
780
|
+
const renderer = state?.renderer;
|
|
781
|
+
const model = entry?.model || null;
|
|
782
|
+
const nodeId = String(model?.id || model?.Id || '');
|
|
783
|
+
const nodeIds = renderer?.instanceData?.nodeIds;
|
|
784
|
+
const geometry = renderer?.instancedMesh?.geometry || null;
|
|
785
|
+
const lineCountAttr = geometry?.getAttribute?.('instanceLineCount') || null;
|
|
786
|
+
const lineHeightAttr = geometry?.getAttribute?.('instanceLineHeightPx') || null;
|
|
787
|
+
const linePaddingAttr = geometry?.getAttribute?.('instanceLinePaddingPx') || null;
|
|
788
|
+
const lineDataArray = renderer?.lineDataArray || null;
|
|
789
|
+
const rowCount = Number(renderer?.lineTextureRows || 0);
|
|
790
|
+
if (!nodeId || !Array.isArray(nodeIds) || !lineData || !lineCountAttr || !lineHeightAttr ||
|
|
791
|
+
!linePaddingAttr || !lineDataArray || rowCount <= 0) return false;
|
|
792
|
+
if (state.lineNodeIds !== nodeIds) {
|
|
793
|
+
state.lineNodeIds = nodeIds;
|
|
794
|
+
state.lineIndexById = new Map();
|
|
795
|
+
for (let i = 0; i < nodeIds.length; i++) state.lineIndexById.set(String(nodeIds[i] || ''), i);
|
|
796
|
+
}
|
|
797
|
+
const index = state.lineIndexById.get(nodeId);
|
|
798
|
+
const rowWidth = Math.floor(lineDataArray.length / rowCount);
|
|
799
|
+
if (!Number.isInteger(index) || index < 0 || index >= lineCountAttr.count || rowWidth <= 0) return false;
|
|
800
|
+
const lineCounts = renderer.instanceData.lineCounts || (renderer.instanceData.lineCounts = []);
|
|
801
|
+
const lineLengths = renderer.instanceData.lineLengths || (renderer.instanceData.lineLengths = []);
|
|
802
|
+
const lineHeights = renderer.instanceData.lineHeights || (renderer.instanceData.lineHeights = []);
|
|
803
|
+
const linePaddings = renderer.instanceData.linePaddings || (renderer.instanceData.linePaddings = []);
|
|
804
|
+
const lineCount = Number(lineData.lineCount || 0);
|
|
805
|
+
const lineHeight = Number(lineData.lineHeightPx || 24);
|
|
806
|
+
const paddingX = Number(lineData.paddingX || 0);
|
|
807
|
+
const paddingY = Number(lineData.paddingY || 0);
|
|
808
|
+
lineCounts[index] = lineCount;
|
|
809
|
+
lineHeights[index] = lineHeight;
|
|
810
|
+
linePaddings[index * 2] = paddingX;
|
|
811
|
+
linePaddings[index * 2 + 1] = paddingY;
|
|
812
|
+
lineCountAttr.setX(index, lineCount);
|
|
813
|
+
lineHeightAttr.setX(index, lineHeight);
|
|
814
|
+
linePaddingAttr.setXY(index, paddingX, paddingY);
|
|
815
|
+
const base = index * rowWidth;
|
|
816
|
+
for (let j = 0; j < rowWidth; j++) {
|
|
817
|
+
const value = Number(lineData.lineLengths?.[j] || 0);
|
|
818
|
+
lineLengths[base + j] = value;
|
|
819
|
+
lineDataArray[base + j] = Math.max(0, Math.min(255, Math.round(value * 255)));
|
|
820
|
+
}
|
|
821
|
+
state.lineRowsStaged = true;
|
|
822
|
+
state.preparedLineRowCount = Number(state.preparedLineRowCount || 0) + 1;
|
|
823
|
+
return true;
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
function commitPreparedResidentLineRows(state) {
|
|
827
|
+
if (!state?.lineRowsStaged) return false;
|
|
828
|
+
const renderer = state.renderer;
|
|
829
|
+
const geometry = renderer?.instancedMesh?.geometry || null;
|
|
830
|
+
const lineCountAttr = geometry?.getAttribute?.('instanceLineCount') || null;
|
|
831
|
+
const lineHeightAttr = geometry?.getAttribute?.('instanceLineHeightPx') || null;
|
|
832
|
+
const linePaddingAttr = geometry?.getAttribute?.('instanceLinePaddingPx') || null;
|
|
833
|
+
if (!lineCountAttr || !lineHeightAttr || !linePaddingAttr || !renderer?.lineDataTexture) return false;
|
|
834
|
+
lineCountAttr.needsUpdate = true;
|
|
835
|
+
lineHeightAttr.needsUpdate = true;
|
|
836
|
+
linePaddingAttr.needsUpdate = true;
|
|
837
|
+
renderer.lineDataTexture.needsUpdate = true;
|
|
838
|
+
renderer.lineDataDirty = false;
|
|
839
|
+
renderer._lineDetailsPatchPending = false;
|
|
840
|
+
renderer._lastInstanceCount = Number(renderer.instanceData?.nodeIds?.length || 0);
|
|
841
|
+
renderer._residentGpuWarmKey = '';
|
|
842
|
+
renderer._residentLineBufferPrewarmCount = Number(state.preparedLineRowCount || 0);
|
|
843
|
+
state.lineRowsStaged = false;
|
|
844
|
+
return true;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
function prepareIdleResidentBuffers(state) {
|
|
848
|
+
const renderer = state?.renderer;
|
|
849
|
+
const module = state?.module;
|
|
850
|
+
const nodeObjectsById = state?.nodeObjectsById;
|
|
851
|
+
if (!renderer || !module || !nodeObjectsById || renderer._disposed === true ||
|
|
852
|
+
renderer._module !== module || module.nodeObjectsById !== nodeObjectsById ||
|
|
853
|
+
renderer.isInLODMode !== false || renderer._hasResidentLodInstances?.() === true ||
|
|
854
|
+
module.isLoading === true || isPrewarmInteractionActive(module) ||
|
|
855
|
+
typeof renderer._updateInstanceData !== 'function' || typeof renderer._applyInstanceData !== 'function') return false;
|
|
856
|
+
renderer._residentBuildPhase = 'initial-build';
|
|
857
|
+
renderer._updateInstanceData(nodeObjectsById);
|
|
858
|
+
renderer._applyInstanceData();
|
|
859
|
+
renderer._syncResidentCountsAfterDelta?.();
|
|
860
|
+
renderer._lineDetailsPatchPending = renderer._residentLineFallbackUsed === true;
|
|
861
|
+
renderer._clearInstancesDirty?.();
|
|
862
|
+
renderer._clearImageInstancesDirty?.();
|
|
863
|
+
renderer._positionsOnlyDirty = false;
|
|
864
|
+
renderer._dirtyPositionIds?.clear?.();
|
|
865
|
+
renderer._residentRebuildPending = false;
|
|
866
|
+
renderer._residentRebuildDeferredUntil = 0;
|
|
867
|
+
renderer._noteResidentFullBuild?.('initial-build', 'MID');
|
|
868
|
+
renderer._residentIdleBuildCount = Number(renderer._residentIdleBuildCount || 0) + 1;
|
|
869
|
+
renderer._residentLineBufferPrewarmCount = Number(renderer.instanceData?.nodeIds?.length || 0);
|
|
870
|
+
renderer._residentGpuWarmKey = '';
|
|
871
|
+
[renderer.instancedMesh, renderer.instancedBorderLineMesh, renderer.instancedLineMesh,
|
|
872
|
+
renderer.instancedHaloMesh, renderer.instancedConsoleMesh, renderer.instancedImageMesh]
|
|
873
|
+
.filter(Boolean).forEach(mesh => { mesh.visible = false; });
|
|
874
|
+
renderer._setInstancedAgentBadgeVisibility?.(false);
|
|
875
|
+
renderer._setInstancedFarInsetBorderVisibility?.(false);
|
|
876
|
+
return renderer._hasResidentLodInstances?.() === true;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
function retryResidentPreparation(state, delay = 80) {
|
|
880
|
+
if (!state || state.retryTimer) return;
|
|
881
|
+
state.retryTimer = setTimeout(() => {
|
|
882
|
+
state.retryTimer = null;
|
|
883
|
+
if (residentLinePrewarmStates.get(state.renderer) !== state || state.renderer?._disposed === true ||
|
|
884
|
+
state.renderer?._module !== state.module || state.module?.nodeObjectsById !== state.nodeObjectsById) return;
|
|
885
|
+
scheduleResidentLinePrewarm(state.renderer, state.module, state.nodeObjectsById);
|
|
886
|
+
}, delay);
|
|
887
|
+
}
|
|
888
|
+
|
|
224
889
|
function queueResidentLinePrewarm(state) {
|
|
225
890
|
if (!state || state.scheduled || state.complete) return;
|
|
226
891
|
state.scheduled = true;
|
|
227
892
|
const run = deadline => {
|
|
228
893
|
state.scheduled = false;
|
|
229
894
|
if (residentLinePrewarmStates.get(state.renderer) !== state || state.renderer?._disposed === true ||
|
|
230
|
-
state.renderer?._module !== state.module ||
|
|
231
|
-
|
|
232
|
-
state.module?.isLoading === true ||
|
|
895
|
+
state.renderer?._module !== state.module || state.module?.nodeObjectsById !== state.nodeObjectsById) return;
|
|
896
|
+
if (state.module?.isLoading === true ||
|
|
233
897
|
state.key !== `${Number(state.renderer?._instancesDirtySerial || 0)}:${Number(state.nodeObjectsById.size || 0)}` ||
|
|
234
898
|
isPrewarmInteractionActive(state.module)) {
|
|
899
|
+
retryResidentPreparation(state);
|
|
235
900
|
return;
|
|
236
901
|
}
|
|
237
902
|
if (!state.entries) state.entries = Array.from(state.nodeObjectsById.values());
|
|
@@ -249,6 +914,8 @@
|
|
|
249
914
|
rememberPreparedLine(state.renderer, entry, width, height,
|
|
250
915
|
state.renderer._getLineDataForNode?.(model, entry.lodSeed, width, height, entry));
|
|
251
916
|
}
|
|
917
|
+
stagePreparedResidentLineRow(state, entry,
|
|
918
|
+
getPreparedLineData(state.renderer, entry, width, height));
|
|
252
919
|
state.prepared++;
|
|
253
920
|
} else if (model && contentType === 'image') {
|
|
254
921
|
const nodeId = String(model.id || model.Id || '');
|
|
@@ -266,6 +933,7 @@
|
|
|
266
933
|
if (state.cursor >= state.entries.length) {
|
|
267
934
|
if (state.pendingImageEntries.length > 0 && state.imagePass < 20) {
|
|
268
935
|
const isFirstImagePass = state.imagePass === 0;
|
|
936
|
+
if (isFirstImagePass) commitPreparedResidentLineRows(state);
|
|
269
937
|
if (isFirstImagePass) prepareImageAtlasCapacity(state.renderer, state.imageCandidateIds.size);
|
|
270
938
|
state.entries = Array.from(new Set(state.pendingImageEntries));
|
|
271
939
|
state.pendingImageEntries.length = 0;
|
|
@@ -280,6 +948,8 @@
|
|
|
280
948
|
}
|
|
281
949
|
return;
|
|
282
950
|
}
|
|
951
|
+
prepareIdleResidentBuffers(state);
|
|
952
|
+
commitPreparedResidentLineRows(state);
|
|
283
953
|
state.complete = true;
|
|
284
954
|
state.renderer._residentLinePrewarmCount = state.prepared;
|
|
285
955
|
state.renderer._residentImagePrewarmCount = state.imagePreparedIds.size;
|
|
@@ -288,6 +958,7 @@
|
|
|
288
958
|
if (state.renderer.isInLODMode === true && state.renderer._lineDetailsPatchPending === true) {
|
|
289
959
|
state.renderer._markLineDetailsDirty?.();
|
|
290
960
|
}
|
|
961
|
+
prepareIdleResidentImageInstances(state);
|
|
291
962
|
queueResidentGpuWarm(state);
|
|
292
963
|
return;
|
|
293
964
|
}
|
|
@@ -301,7 +972,76 @@
|
|
|
301
972
|
}
|
|
302
973
|
|
|
303
974
|
function getResidentGpuKey(renderer) {
|
|
304
|
-
|
|
975
|
+
const geometryKey = [renderer?.instancedMesh, renderer?.instancedBorderLineMesh, renderer?.instancedLineMesh,
|
|
976
|
+
renderer?.instancedHaloMesh, renderer?.instancedConsoleMesh, renderer?.instancedImageMesh]
|
|
977
|
+
.map(mesh => String(mesh?.geometry?.uuid || '-')).join(',');
|
|
978
|
+
return `${Number(renderer?._residentGpuContextGeneration || 0)}:` +
|
|
979
|
+
`${String(renderer?.lineDataTexture?.uuid || '-')}/${Number(renderer?.lineDataTexture?.version || 0)}:` +
|
|
980
|
+
`${String(renderer?.imageAtlasTexture?.uuid || '-')}/${Number(renderer?.imageAtlasTexture?.version || 0)}:` +
|
|
981
|
+
`${Number(renderer?.lineTextureRows || 0)}:${geometryKey}`;
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
function invalidateResidentGpuWarm(renderer) {
|
|
985
|
+
if (!renderer) return;
|
|
986
|
+
renderer._residentGpuContextGeneration = Number(renderer._residentGpuContextGeneration || 0) + 1;
|
|
987
|
+
renderer._residentGpuWarmKey = '';
|
|
988
|
+
renderer._residentGpuWarmComplete = false;
|
|
989
|
+
renderer._residentGpuWarmOffscreenComplete = false;
|
|
990
|
+
renderer._residentImageAtlasWarmVersion = -1;
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
function ensureResidentGpuContextTracking(renderer) {
|
|
994
|
+
const canvas = renderer?.renderer?.domElement || null;
|
|
995
|
+
if (!canvas?.addEventListener || renderer._residentGpuContextCanvas === canvas) return;
|
|
996
|
+
const previousCanvas = renderer._residentGpuContextCanvas;
|
|
997
|
+
if (previousCanvas?.removeEventListener) {
|
|
998
|
+
previousCanvas.removeEventListener('webglcontextlost', renderer._residentGpuContextLostHandler);
|
|
999
|
+
previousCanvas.removeEventListener('webglcontextrestored', renderer._residentGpuContextRestoredHandler);
|
|
1000
|
+
}
|
|
1001
|
+
const lost = () => {
|
|
1002
|
+
renderer._residentGpuContextLost = true;
|
|
1003
|
+
invalidateResidentGpuWarm(renderer);
|
|
1004
|
+
};
|
|
1005
|
+
const restored = () => {
|
|
1006
|
+
renderer._residentGpuContextLost = false;
|
|
1007
|
+
invalidateResidentGpuWarm(renderer);
|
|
1008
|
+
setTimeout(() => {
|
|
1009
|
+
const state = residentLinePrewarmStates.get(renderer);
|
|
1010
|
+
if (state && renderer?._disposed !== true) queueResidentGpuWarm(state);
|
|
1011
|
+
}, 0);
|
|
1012
|
+
};
|
|
1013
|
+
canvas.addEventListener('webglcontextlost', lost);
|
|
1014
|
+
canvas.addEventListener('webglcontextrestored', restored);
|
|
1015
|
+
renderer._residentGpuContextCanvas = canvas;
|
|
1016
|
+
renderer._residentGpuContextLostHandler = lost;
|
|
1017
|
+
renderer._residentGpuContextRestoredHandler = restored;
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
function renderResidentWarmScene(webglRenderer, THREE, warmScene, warmCamera) {
|
|
1021
|
+
const gl = webglRenderer?.getContext?.();
|
|
1022
|
+
if (!gl || gl.isContextLost?.() === true) return false;
|
|
1023
|
+
if (typeof webglRenderer.getRenderTarget !== 'function' || typeof webglRenderer.setRenderTarget !== 'function' ||
|
|
1024
|
+
typeof webglRenderer.render !== 'function' || !THREE?.WebGLRenderTarget) return null;
|
|
1025
|
+
const previousTarget = webglRenderer.getRenderTarget();
|
|
1026
|
+
const previousFace = webglRenderer.getActiveCubeFace?.() ?? 0;
|
|
1027
|
+
const previousMip = webglRenderer.getActiveMipmapLevel?.() ?? 0;
|
|
1028
|
+
const warmTarget = new THREE.WebGLRenderTarget(1, 1, { depthBuffer: false, stencilBuffer: false });
|
|
1029
|
+
if (warmTarget.texture) {
|
|
1030
|
+
warmTarget.texture.generateMipmaps = false;
|
|
1031
|
+
const encoding = previousTarget?.texture?.encoding ?? webglRenderer.outputEncoding;
|
|
1032
|
+
if (encoding != null) warmTarget.texture.encoding = encoding;
|
|
1033
|
+
}
|
|
1034
|
+
try {
|
|
1035
|
+
webglRenderer.setRenderTarget(warmTarget);
|
|
1036
|
+
webglRenderer.render(warmScene, warmCamera);
|
|
1037
|
+
return gl.isContextLost?.() !== true;
|
|
1038
|
+
} finally {
|
|
1039
|
+
try {
|
|
1040
|
+
webglRenderer.setRenderTarget(previousTarget, previousFace, previousMip);
|
|
1041
|
+
} finally {
|
|
1042
|
+
warmTarget.dispose?.();
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
305
1045
|
}
|
|
306
1046
|
|
|
307
1047
|
function retryResidentGpuWarm(state) {
|
|
@@ -324,6 +1064,9 @@
|
|
|
324
1064
|
return;
|
|
325
1065
|
}
|
|
326
1066
|
const webglRenderer = renderer?.renderer || null;
|
|
1067
|
+
ensureResidentGpuContextTracking(renderer);
|
|
1068
|
+
const gl = webglRenderer?.getContext?.();
|
|
1069
|
+
if (renderer?._residentGpuContextLost === true || gl?.isContextLost?.() === true) return;
|
|
327
1070
|
const gpuKey = getResidentGpuKey(renderer);
|
|
328
1071
|
if (!webglRenderer || renderer._residentGpuWarmKey === gpuKey) return;
|
|
329
1072
|
if (renderer._hasPendingImageAtlasWork?.() === true) {
|
|
@@ -340,6 +1083,7 @@
|
|
|
340
1083
|
retryResidentGpuWarm(state);
|
|
341
1084
|
return;
|
|
342
1085
|
}
|
|
1086
|
+
if (renderer?._residentGpuContextLost === true || webglRenderer?.getContext?.()?.isContextLost?.() === true) return;
|
|
343
1087
|
try {
|
|
344
1088
|
if (renderer.lineDataTexture) webglRenderer.initTexture?.(renderer.lineDataTexture);
|
|
345
1089
|
if (renderer.imageAtlasTexture && Number(renderer.imageAtlasSlots?.size || 0) > 0) {
|
|
@@ -349,18 +1093,25 @@
|
|
|
349
1093
|
const THREE = globalThis.THREE;
|
|
350
1094
|
if (THREE?.Scene && typeof webglRenderer.compile === 'function' && state.module?.camera) {
|
|
351
1095
|
const warmScene = new THREE.Scene();
|
|
352
|
-
|
|
353
|
-
renderer.
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
1096
|
+
try {
|
|
1097
|
+
[renderer.instancedMesh, renderer.instancedBorderLineMesh, renderer.instancedLineMesh,
|
|
1098
|
+
renderer.instancedHaloMesh, renderer.instancedConsoleMesh, renderer.instancedImageMesh]
|
|
1099
|
+
.filter(Boolean)
|
|
1100
|
+
.forEach(mesh => {
|
|
1101
|
+
const clone = mesh.clone?.();
|
|
1102
|
+
if (!clone) return;
|
|
1103
|
+
clone.visible = true;
|
|
1104
|
+
clone.frustumCulled = false;
|
|
1105
|
+
warmScene.add(clone);
|
|
1106
|
+
});
|
|
1107
|
+
const warmCamera = state.module.camera.clone?.() || state.module.camera;
|
|
1108
|
+
webglRenderer.compile(warmScene, warmCamera);
|
|
1109
|
+
const offscreenResult = renderResidentWarmScene(webglRenderer, THREE, warmScene, warmCamera);
|
|
1110
|
+
if (offscreenResult === false) return;
|
|
1111
|
+
renderer._residentGpuWarmOffscreenComplete = offscreenResult === true;
|
|
1112
|
+
} finally {
|
|
1113
|
+
warmScene.clear?.();
|
|
1114
|
+
}
|
|
364
1115
|
}
|
|
365
1116
|
renderer._residentGpuWarmKey = getResidentGpuKey(renderer);
|
|
366
1117
|
renderer._residentGpuWarmComplete = true;
|
|
@@ -381,6 +1132,7 @@
|
|
|
381
1132
|
|
|
382
1133
|
function scheduleResidentLinePrewarm(renderer, module, nodeObjectsById) {
|
|
383
1134
|
if (!renderer || !module || !nodeObjectsById?.values || module.isLoading === true) return;
|
|
1135
|
+
scheduleResidentCssLayoutWarm(renderer, module, nodeObjectsById);
|
|
384
1136
|
const key = `${Number(renderer._instancesDirtySerial || 0)}:${Number(nodeObjectsById.size || 0)}`;
|
|
385
1137
|
let state = residentLinePrewarmStates.get(renderer);
|
|
386
1138
|
if (!state || state.key !== key || state.nodeObjectsById !== nodeObjectsById) {
|
|
@@ -395,7 +1147,7 @@
|
|
|
395
1147
|
prepareImageAtlasCapacity(renderer, imageCandidateIds.size);
|
|
396
1148
|
state = {
|
|
397
1149
|
renderer, module, nodeObjectsById, key, entries, cursor: 0, prepared: 0,
|
|
398
|
-
scheduled: false, complete: false, gpuScheduled: false, gpuRetryTimer: null, gpuFailureCount: 0,
|
|
1150
|
+
scheduled: false, retryTimer: null, complete: false, gpuScheduled: false, gpuRetryTimer: null, gpuFailureCount: 0,
|
|
399
1151
|
imagePass: 0, imageCandidateIds, imagePreparedIds: new Set(), pendingImageEntries: []
|
|
400
1152
|
};
|
|
401
1153
|
residentLinePrewarmStates.set(renderer, state);
|
|
@@ -420,7 +1172,10 @@
|
|
|
420
1172
|
}
|
|
421
1173
|
}
|
|
422
1174
|
queueResidentLinePrewarm(state);
|
|
423
|
-
if (state.complete)
|
|
1175
|
+
if (state.complete) {
|
|
1176
|
+
prepareIdleResidentImageInstances(state);
|
|
1177
|
+
queueResidentGpuWarm(state);
|
|
1178
|
+
}
|
|
424
1179
|
}
|
|
425
1180
|
|
|
426
1181
|
function areResidentLinesPrepared(renderer, nodeObjectsById, nodeIds) {
|
|
@@ -511,6 +1266,46 @@
|
|
|
511
1266
|
return Number(values[Math.max(0, Math.ceil(values.length * ratio) - 1)].toFixed(2));
|
|
512
1267
|
}
|
|
513
1268
|
|
|
1269
|
+
function getImageAtlasProbe(renderer) {
|
|
1270
|
+
const canvas = renderer?.imageAtlasCanvas || null;
|
|
1271
|
+
const readyEntry = Array.from(renderer?.imageAtlasSlots?.entries?.() || [])
|
|
1272
|
+
.find(([, slot]) => slot?.ready === true) || null;
|
|
1273
|
+
if (!canvas || !readyEntry) return '-';
|
|
1274
|
+
try {
|
|
1275
|
+
const slot = readyEntry[1];
|
|
1276
|
+
const columns = Number(renderer.imageAtlasColumns || 1);
|
|
1277
|
+
const tile = Math.max(1, Math.floor(Number(canvas.width || 1) / columns));
|
|
1278
|
+
const col = Number(slot.slotIndex || 0) % columns;
|
|
1279
|
+
const row = Math.floor(Number(slot.slotIndex || 0) / columns);
|
|
1280
|
+
const context = canvas.getContext?.('2d', { alpha: false }) || null;
|
|
1281
|
+
const pixel = context?.getImageData?.(
|
|
1282
|
+
Math.min(canvas.width - 1, Math.floor(col * tile + tile * 0.5)),
|
|
1283
|
+
Math.min(canvas.height - 1, Math.floor(row * tile + tile * 0.5)), 1, 1)?.data;
|
|
1284
|
+
let colored = 0;
|
|
1285
|
+
let sampled = 0;
|
|
1286
|
+
for (const [, candidate] of Array.from(renderer.imageAtlasSlots.entries()).slice(0, 24)) {
|
|
1287
|
+
if (candidate?.ready !== true) continue;
|
|
1288
|
+
const candidateCol = Number(candidate.slotIndex || 0) % columns;
|
|
1289
|
+
const candidateRow = Math.floor(Number(candidate.slotIndex || 0) / columns);
|
|
1290
|
+
const sample = context?.getImageData?.(
|
|
1291
|
+
Math.min(canvas.width - 1, Math.floor(candidateCol * tile + tile * 0.5)),
|
|
1292
|
+
Math.min(canvas.height - 1, Math.floor(candidateRow * tile + tile * 0.5)), 1, 1)?.data;
|
|
1293
|
+
if (sample) {
|
|
1294
|
+
sampled++;
|
|
1295
|
+
if (Math.abs(sample[0] - 238) + Math.abs(sample[1] - 242) + Math.abs(sample[2] - 247) > 12) colored++;
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
const cpuUv = Array.from(renderer?.imageInstanceData?.uvRects || []).slice(0, 4)
|
|
1299
|
+
.map(value => Number(value || 0).toFixed(4)).join(',');
|
|
1300
|
+
const uvAttr = renderer?.instancedImageMesh?.geometry?.getAttribute?.('instanceUvRect') || null;
|
|
1301
|
+
const gpuUv = uvAttr && uvAttr.count > 0
|
|
1302
|
+
? [uvAttr.getX(0), uvAttr.getY(0), uvAttr.getZ(0), uvAttr.getW(0)]
|
|
1303
|
+
.map(value => Number(value || 0).toFixed(4)).join(',')
|
|
1304
|
+
: '-';
|
|
1305
|
+
return pixel ? `${pixel[0]},${pixel[1]},${pixel[2]} · color ${colored}/${sampled} · uv ${cpuUv}/${gpuUv}` : '-';
|
|
1306
|
+
} catch { return 'blocked'; }
|
|
1307
|
+
}
|
|
1308
|
+
|
|
514
1309
|
function getDiagnostics(renderer) {
|
|
515
1310
|
const state = renderer ? frameSampleStates.get(renderer) : null;
|
|
516
1311
|
let stableFullResSampleCount = 0;
|
|
@@ -529,13 +1324,39 @@
|
|
|
529
1324
|
viewSyncP95Ms: percentile(state, 'viewSyncMs', 0.95),
|
|
530
1325
|
css3dRenderP95Ms: percentile(state, 'css3dRenderMs', 0.95),
|
|
531
1326
|
residentLinePrewarmCount: Number(renderer?._residentLinePrewarmCount || 0),
|
|
1327
|
+
residentLineBufferPrewarmCount: Number(renderer?._residentLineBufferPrewarmCount || 0),
|
|
1328
|
+
residentIdleBuildCount: Number(renderer?._residentIdleBuildCount || 0),
|
|
532
1329
|
residentImagePrewarmCount: Number(renderer?._residentImagePrewarmCount || 0),
|
|
533
1330
|
residentImagePrewarmCandidateCount: Number(renderer?._residentImagePrewarmCandidateCount || 0),
|
|
534
1331
|
residentImageBufferReuseCount: Number(renderer?._residentImageBufferReuseCount || 0),
|
|
1332
|
+
residentImageIdlePatchCount: Number(renderer?._residentImageIdlePatchCount || 0),
|
|
1333
|
+
residentImageInstanceCount: Number(renderer?.instancedImageMesh?.geometry?.instanceCount || 0),
|
|
1334
|
+
residentImageMeshVisible: renderer?.instancedImageMesh?.visible === true,
|
|
1335
|
+
residentImageAtlasReadyCount: Array.from(renderer?.imageAtlasSlots?.values?.() || [])
|
|
1336
|
+
.filter(slot => slot?.ready === true).length,
|
|
1337
|
+
residentImageAtlasProbe: getImageAtlasProbe(renderer),
|
|
1338
|
+
residentBuildPhase: String(renderer?._residentBuildPhase || ''),
|
|
1339
|
+
residentFullBuildCount: Number(renderer?._residentFullBuildCount || 0),
|
|
1340
|
+
residentLastFullBuildReason: String(renderer?._lastResidentFullBuildReason || ''),
|
|
1341
|
+
residentInstancesDirtyReason: renderer?._instancesDirty === true
|
|
1342
|
+
? String(renderer?._instancesDirtyReason || 'unknown')
|
|
1343
|
+
: '',
|
|
1344
|
+
residentInstancesDirtySerial: Number(renderer?._instancesDirtySerial || 0),
|
|
1345
|
+
residentLastNodeCount: Number(renderer?._lastNodeCount || 0),
|
|
1346
|
+
residentEligibleTextLikeCount: Number(renderer?._cachedEligibleTextLikeCount || 0),
|
|
1347
|
+
residentBufferNodeCount: Number(renderer?.instanceData?.nodeIds?.length || 0),
|
|
1348
|
+
residentCssParkCount: Number(renderer?._residentCssParkCount || 0),
|
|
1349
|
+
residentCssRestoreCount: Number(renderer?._residentCssRestoreCount || 0),
|
|
1350
|
+
residentCssRestoreMissCount: Number(renderer?._residentCssRestoreMissCount || 0),
|
|
1351
|
+
residentCssLayoutWarmCount: Number(renderer?._residentCssLayoutWarmCount || 0),
|
|
1352
|
+
residentStableLineReuseCount: Number(renderer?._residentStableLineReuseCount || 0),
|
|
1353
|
+
residentBoostClearCount: Number(renderer?._residentBoostClearCount || 0),
|
|
535
1354
|
lineTextureRows: Number(renderer?.lineTextureRows || 0),
|
|
536
1355
|
residentGpuWarmComplete: !!renderer &&
|
|
537
1356
|
renderer._hasPendingImageAtlasWork?.() !== true &&
|
|
538
1357
|
renderer._residentGpuWarmKey === getResidentGpuKey(renderer),
|
|
1358
|
+
residentGpuBufferWarmComplete: !!renderer && renderer._residentGpuWarmOffscreenComplete === true &&
|
|
1359
|
+
renderer._residentGpuWarmKey === getResidentGpuKey(renderer),
|
|
539
1360
|
residentAtlasWarmComplete: !!renderer && Number(renderer.imageAtlasSlots?.size || 0) > 0 &&
|
|
540
1361
|
renderer._hasPendingImageAtlasWork?.() !== true &&
|
|
541
1362
|
Number(renderer._residentImageAtlasWarmVersion ?? -1) === Number(renderer.imageAtlasTexture?.version || 0)
|
|
@@ -550,6 +1371,10 @@
|
|
|
550
1371
|
}
|
|
551
1372
|
|
|
552
1373
|
window.MindMapRenderPlan = Object.freeze({
|
|
1374
|
+
configureImageAtlasTexture,
|
|
1375
|
+
getImageAtlasOutputColorChunk,
|
|
1376
|
+
syncCommittedResidentTextCount,
|
|
1377
|
+
clearFullResImageVisuals,
|
|
553
1378
|
buildFullResKey,
|
|
554
1379
|
shouldSkipStableFullRes,
|
|
555
1380
|
commitStableFullRes,
|
|
@@ -559,9 +1384,26 @@
|
|
|
559
1384
|
areResidentLinesPrepared,
|
|
560
1385
|
initialLineTextureRows,
|
|
561
1386
|
ensureLineTextureCapacity,
|
|
1387
|
+
renderResidentWarmScene,
|
|
562
1388
|
prepareImageAtlasCapacity,
|
|
563
1389
|
fallbackBatch,
|
|
1390
|
+
reuseActiveCssMediaFallback,
|
|
1391
|
+
hasAnimatedGifCssFallbackCandidates,
|
|
1392
|
+
hasResidentDirtyWork,
|
|
1393
|
+
hasPendingNearCssWarmup,
|
|
564
1394
|
reusePreparedImageInstances,
|
|
1395
|
+
prepareIdleResidentImageInstances,
|
|
1396
|
+
stagePreparedResidentLineRow,
|
|
1397
|
+
commitPreparedResidentLineRows,
|
|
1398
|
+
prepareIdleResidentBuffers,
|
|
1399
|
+
beginResidentCssTransition,
|
|
1400
|
+
cachePreparedResidentCss,
|
|
1401
|
+
scheduleResidentCssLayoutWarm,
|
|
1402
|
+
parkFullResCss,
|
|
1403
|
+
parkReadyResidentImage,
|
|
1404
|
+
restoreParkedFullResCss,
|
|
1405
|
+
completeFullResTransition,
|
|
1406
|
+
ensureResidentLineDetails,
|
|
565
1407
|
beginFrame,
|
|
566
1408
|
recordFrame,
|
|
567
1409
|
getDiagnostics,
|