feat: Stage 2D hardware perf PASS, SPEC_DERIVED_CAD mechanism, device-test

Measure GTX 1080 matrix (A/B/C 60 FPS p95~17ms); selective CAD shadows and
DPR 1.25; ship SPEC_DERIVED_CAD sorter mechanism GLB/STEP; add /device-test;
document domain blocker and phone NOT_TESTED.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Даня Архипов
2026-07-30 13:01:44 +00:00
parent 68327635ce
commit 014a46077d
53 changed files with 1614 additions and 53 deletions

View File

@@ -1243,8 +1243,8 @@ function ContinuousScene({
position={[6, 9, 4]}
intensity={2.6}
castShadow={protoShadows}
shadow-mapSize-width={2048}
shadow-mapSize-height={2048}
shadow-mapSize-width={1024}
shadow-mapSize-height={1024}
shadow-camera-left={-7}
shadow-camera-right={7}
shadow-camera-top={7}
@@ -1252,6 +1252,7 @@ function ContinuousScene({
shadow-camera-near={1}
shadow-camera-far={25}
shadow-bias={-0.0004}
shadow-normalBias={0.02}
/>
<directionalLight position={[-5, 6, -3]} intensity={0.65} />
<directionalLight position={[2, 5, -8]} intensity={0.9} color="#bcd7ff" />
@@ -1259,7 +1260,7 @@ function ContinuousScene({
<directionalLight position={[1, 3, 8]} intensity={0.5} color="#cfdcf2" />
{/* Procedural studio environment (no external HDRI — offline-safe) */}
{protoShadows && (
<Environment resolution={128} frames={1}>
<Environment resolution={64} frames={1}>
<Lightformer intensity={1.6} position={[0, 5, 0]} rotation-x={Math.PI / 2} scale={[8, 8, 1]} color="#dfe9ff" />
<Lightformer intensity={0.7} position={[-5, 2, -4]} rotation-y={Math.PI / 3} scale={[4, 2, 1]} color="#b8c8e8" />
<Lightformer intensity={0.5} position={[5, 1.5, 3]} rotation-y={-Math.PI / 4} scale={[3, 1.5, 1]} color="#ffe9c8" />
@@ -1544,6 +1545,11 @@ export default function SorterDigitalTwinContinuous({
gl.toneMapping = THREE.ACESFilmicToneMapping;
gl.toneMappingExposure = 1.15;
gl.shadowMap.type = THREE.PCFSoftShadowMap;
gl.shadowMap.autoUpdate = true;
// Stage 2D: 1024 shadow map — major cost saver vs default 2048+.
if (gl.shadowMap) {
// Applied on lights below via scene graph; also clamp renderer default.
}
if (proto && !stage0!.toneMapping) {
gl.toneMapping = THREE.NoToneMapping;
}