Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com>
This commit is contained in:
gpt-engineer-app[bot]
2026-05-12 11:27:30 +00:00
parent ceb9b8c1a1
commit ed286aa99a
+80
View File
@@ -0,0 +1,80 @@
/**
* DEVKIT — global mutable snapshot of scene + XR session diagnostics.
*
* Written every frame by SceneStatsProbe (inside Canvas), read by DevPanel
* (HTML overlay) and XRDevHud (in-world). Plain object to avoid re-renders.
*/
import * as THREE from 'three';
export interface SceneStats {
fps: number;
meshCount: number;
triCount: number;
modelBboxSize: [number, number, number];
modelGroupPos: [number, number, number];
modelGroupRotDeg: [number, number, number];
modelGroupScale: number;
xrMode: string | null;
xrPlanesCount: number;
xrHitTestActive: boolean;
xrInputCount: number;
lastUpdate: number;
}
export const sceneStats: SceneStats = {
fps: 0,
meshCount: 0,
triCount: 0,
modelBboxSize: [0, 0, 0],
modelGroupPos: [0, 0, 0],
modelGroupRotDeg: [0, 0, 0],
modelGroupScale: 1,
xrMode: null,
xrPlanesCount: 0,
xrHitTestActive: false,
xrInputCount: 0,
lastUpdate: 0,
};
export function snapshotStats(): SceneStats {
return { ...sceneStats };
}
const _v = new THREE.Vector3();
const _q = new THREE.Quaternion();
const _e = new THREE.Euler();
const _box = new THREE.Box3();
export function updateModelStats(group: THREE.Object3D | null) {
if (!group) return;
group.updateWorldMatrix(true, true);
group.getWorldPosition(_v);
sceneStats.modelGroupPos = [_v.x, _v.y, _v.z];
group.getWorldQuaternion(_q);
_e.setFromQuaternion(_q);
sceneStats.modelGroupRotDeg = [
THREE.MathUtils.radToDeg(_e.x),
THREE.MathUtils.radToDeg(_e.y),
THREE.MathUtils.radToDeg(_e.z),
];
group.getWorldScale(_v);
sceneStats.modelGroupScale = _v.x;
let meshes = 0;
let tris = 0;
group.traverse((o) => {
if (o instanceof THREE.Mesh && o.geometry) {
meshes++;
const idx = o.geometry.index;
const pos = o.geometry.attributes.position;
if (idx) tris += idx.count / 3;
else if (pos) tris += pos.count / 3;
}
});
sceneStats.meshCount = meshes;
sceneStats.triCount = Math.round(tris);
_box.setFromObject(group);
_box.getSize(_v);
sceneStats.modelBboxSize = [_v.x, _v.y, _v.z];
}