refactor(viewer): app.js 按职责切成 8 个普通脚本(纯切片,零语义改动)
state / harness / camera / pick / ui / sheets / render / urlparams。 经典脚本的顶层 const/let 落在同一个全局词法作用域,所以切片本身不改变任何行为—— 这一步先让"文件边界"与"模块语义"两件事分离:翻 ESM 时若出问题,责任清楚在 import/export,而不是切片切错了行。 切片踩到并修掉的:urlparams.js 被切掉了 IIFE 的收尾 })();(我按 len-2 收边界), node --check 当场报 Unexpected end of input。 截图基线分级也在这一步收敛:工程图/装配向导视图带 feGaussianBlur 发光滤镜, 同一构建两轮就有 ±1 抖动(先前扫描那两轮碰巧逐字节相同,才漏进"稳定"清单, 于是随机假 FAIL)。把 8 张工程图/向导视图连同 3 张线束 x-ray、boss_p07、 p03_mount_loose 一起转像素容差(存参考像素,阈值 mean<=0.02、单像素<=32, 约实测 20x 余量),其余 92 张仍要求逐字节相同。 关卡:92 张逐字节一致 + 13 张在噪声阈内;数据哈希与 IK exact 段一致。
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
/* 尺寸自适应与按需渲染循环 */
|
||||
/* ---- loop & on-demand rendering ---- */
|
||||
let curW = 0, curH = 0;
|
||||
function resize() {
|
||||
if (cv.style.display === 'none') return;
|
||||
const w = stage.clientWidth, h = stage.clientHeight;
|
||||
if (!w || !h) return;
|
||||
if (w !== curW || h !== curH) {
|
||||
curW = w; curH = h;
|
||||
rend.setSize(w, h, false);
|
||||
cam.aspect = w / h;
|
||||
cam.updateProjectionMatrix();
|
||||
requestRender();
|
||||
}
|
||||
}
|
||||
if (window.ResizeObserver) {
|
||||
new ResizeObserver(() => resize()).observe(stage);
|
||||
} else {
|
||||
window.addEventListener('resize', resize);
|
||||
}
|
||||
|
||||
document.getElementById('ttl').textContent = NMOT + ' 电机人形机器人手臂';
|
||||
document.getElementById('ver').textContent = DATA.layout.ver + ' · 迭代 ' + DATA.layout.it +
|
||||
' · 上臂' + DATA.layout.L1 + ' 前臂' + DATA.layout.L2 + ' mm';
|
||||
function updStat() {
|
||||
const el = document.getElementById('stat');
|
||||
const tri = (typeof meshes !== 'undefined' && meshes) ? meshes.reduce((a, m) => a + (m.userData.triCount || 0), 0) : 0;
|
||||
const nScr = (typeof meshes !== 'undefined' && meshes) ? meshes.filter(m => m.userData.screw).length : 0;
|
||||
const nTot = (typeof meshes !== 'undefined' && meshes) ? meshes.length : 0;
|
||||
if (el) el.textContent = '零件 ' + (nTot - nScr) + (nScr ? ' + 螺钉 ' + nScr : '') +
|
||||
' · 三角面 ' + (tri/1000).toFixed(0) + 'k · ' + '爆炸 ' + Math.round(expl*100) + '%';
|
||||
}
|
||||
updStat();
|
||||
|
||||
/* 按需渲染:needRender 由 requestRender() 置位(所有交互与状态变化都已调用它;
|
||||
旧版置位后全文件无读取点,等于恒以显示器刷新率空转满帧渲染)。
|
||||
装配图页画布隐藏时【不清标志】,切回三维页由 tab 处理器 resize()+requestRender() 补渲染。
|
||||
preserveDrawingBuffer 必须保持 true:不重绘时靠它保住最后一帧画面。 */
|
||||
function loop() {
|
||||
if (needRender && cv.style.display !== 'none') {
|
||||
needRender = false;
|
||||
resize();
|
||||
updCam();
|
||||
rend.render(scene, cam);
|
||||
}
|
||||
requestAnimationFrame(loop);
|
||||
}
|
||||
requestAnimationFrame(loop);
|
||||
Reference in New Issue
Block a user