diff --git a/fktry/public/assets/models/mosh-reactor.glb b/fktry/public/assets/models/mosh-reactor.glb index f1b33cf..733e0d7 100644 Binary files a/fktry/public/assets/models/mosh-reactor.glb and b/fktry/public/assets/models/mosh-reactor.glb differ diff --git a/fktry/src/render/registry.ts b/fktry/src/render/registry.ts index 21dcca4..f851079 100644 --- a/fktry/src/render/registry.ts +++ b/fktry/src/render/registry.ts @@ -15,6 +15,7 @@ */ import * as THREE from 'three'; import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; +import { MeshoptDecoder } from 'three/examples/jsm/libs/meshopt_decoder.module.js'; import { RoundedBoxGeometry } from 'three/examples/jsm/geometries/RoundedBoxGeometry.js'; import { clone as cloneSkinned } from 'three/examples/jsm/utils/SkeletonUtils.js'; import { mergeGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js'; @@ -400,7 +401,13 @@ export class AssetRegistry { * GLBs so a real asset gets the same one impossible element the placeholder had. */ private accents = new Map(); private eras = new Map(); - private loader = new GLTFLoader(); + /** Orchestrator integration fix (round-7 pilot): the farm's PBR meshes are shipped + * through `gltf-transform optimize --compress meshopt --texture-compress webp`, which + * cuts a Hunyuan3D asset from 7.6 MB to ~420 KB — smaller than the albedo-only sf3d + * assets it replaces, WITH metallic-roughness maps. That needs three extensions: + * EXT_texture_webp and KHR_mesh_quantization are native to GLTFLoader; meshopt needs + * its decoder handed over. Uncompressed GLBs keep loading unchanged. */ + private loader = new GLTFLoader().setMeshoptDecoder(MeshoptDecoder); private timer: number | null = null; /** Which era a machine is skinned as (derived from tech unlocks; stream by default). */