Files
rhinelab-ui/reference/decryption-check.html
T

38 lines
3.1 KiB
HTML

<!doctype html><html lang="zh-CN"><meta charset="utf-8"><title>解密与玻璃模式检查</title>
<style>body{background:#e8e5e1;font:14px system-ui;padding:20px}iframe{width:720px;height:405px;border:0}pre{white-space:pre-wrap}</style>
<h1>解密与玻璃模式检查</h1><pre id="result">正在检查…</pre><iframe id="app" src="/?scene=detail"></iframe>
<script type="module">
const app=document.querySelector('#app'),result=document.querySelector('#result'),checks=[];
const check=(name,value)=>{checks.push({name,passed:!!value});if(!value)throw Error(name)};
const wait=async test=>{const start=performance.now();while(!test()){if(performance.now()-start>45000)throw Error('等待超时');await new Promise(r=>setTimeout(r,30))}};
try{
await wait(()=>app.contentWindow.rhine?.stats().loaded);
const doc=app.contentDocument,api=app.contentWindow.rhine;
await wait(()=>api.stats().decryption.phase==='joining');
const path=doc.querySelector('#inspection-lines').getAttribute('d');
const n=path.match(/-?\d+(?:\.\d+)?(?:e[+-]?\d+)?/gi).map(Number);
const cross=(ax,ay,bx,by)=>ax*by-ay*bx;
check('投影后的两段线严格共线',n.length===8&&Math.abs(cross(n[2]-n[0],n[3]-n[1],n[6]-n[0],n[7]-n[1]))<.01);
await wait(()=>api.stats().decryption.phase==='clear');
check('详情解密结束后变清晰且线消失',api.stats().decryption.clarity===1&&doc.querySelector('#inspection-marks').style.opacity==='0');
check('长焦详情使用足够精度的近裁剪面',api.stats().cameraNear===5);
doc.querySelector('.viewer-open').click();const viewer=doc.querySelector('.model-viewer');
const stats=()=>JSON.parse(viewer.dataset.stats||'{}');await wait(()=>stats().ready);
const original=stats();viewer.querySelector('[data-viewer="frosted"]').click();
await wait(()=>stats().clarity>0&&stats().clarity<.9);check('磨砂有连续过渡',stats().targetClarity===0);
viewer.querySelector('[data-viewer="clear"]').click();await wait(()=>stats().clarity===1);
check('快速反向切换回清晰保留镜头',Math.abs(stats().distance-original.distance)<1e-8&&stats().spread===0);
viewer.querySelector('[data-viewer="explode"]').click();await wait(()=>stats().spread>.98);
viewer.querySelector('[data-viewer="frosted"]').click();await wait(()=>stats().clarity===0);
check('拆解后仍可切换玻璃模式',stats().spread>.98&&stats().targetClarity===0);
viewer.querySelector('[data-viewer="assemble"]').click();await wait(()=>stats().spread<.001);
viewer.querySelector('[data-viewer="close"]').click();await wait(()=>viewer.hidden);
check('退出查看器后原档案保持清晰',api.stats().decryption.clarity===1);
api.archive();await wait(()=>api.stats().decryption.clarity===0);api.detail();
await wait(()=>api.stats().decryption.phase==='joining');api.archive();
await wait(()=>doc.querySelector('#inspection-marks').style.opacity==='0');
check('解密中退出及时清除标记',api.stats().decryption.intervals.length===0);
result.textContent=JSON.stringify({passed:true,checks},null,2);
}catch(error){result.textContent=JSON.stringify({passed:false,error:String(error),checks},null,2)}
</script></html>