dogancan commited on
Commit
fb4f352
·
verified ·
1 Parent(s): c5d9d05

Viewer: brighter exposure

Browse files
Files changed (1) hide show
  1. viewer.js +1 -1
viewer.js CHANGED
@@ -17,7 +17,7 @@ function applyOverlays(group){const o=group?.userData.overlay;if(!o)return;o.hul
17
  group.traverse(m=>{if(m.isMesh&&m.userData.visual){m.material.transparent=xray;m.material.opacity=xray?.28:1;m.material.depthWrite=!xray;m.material.needsUpdate=true}})}
18
  function makeModel(data){const group=new THREE.Group();for(const p of data.meshes){const g=new THREE.BufferGeometry();g.setAttribute('position',new THREE.Float32BufferAttribute(p.positions,3));g.setIndex(p.indices);g.computeVertexNormals();const color=new THREE.Color().setRGB(...p.color);const opts={color,roughness:.55,metalness:.05,side:THREE.DoubleSide};if(p.uvs&&p.texture!=null){g.setAttribute('uv',new THREE.Float32BufferAttribute(p.uvs,2));opts.map=texture(data.textureUrls[p.texture])}const vm=new THREE.Mesh(g,new THREE.MeshStandardMaterial(opts));vm.userData.visual=true;group.add(vm)}const box=new THREE.Box3().setFromObject(group),size=box.getSize(new THREE.Vector3()),center=box.getCenter(new THREE.Vector3());const scale=2/Math.max(size.x,size.y,size.z,.0001);group.position.set(-center.x*scale,-box.min.y*scale,-center.z*scale);group.scale.setScalar(scale);addOverlays(group,data,Math.max(size.x,size.y,size.z));return {group,height:size.y*scale}}
19
  function dispose(group){group?.traverse(m=>{m.geometry?.dispose();if(m.material){m.material.map=null;m.material.dispose()}})}
20
- const canvas=document.querySelector('#canvas'),host=document.querySelector('#viewport');const renderer=new THREE.WebGLRenderer({canvas,alpha:true,antialias:true});renderer.setPixelRatio(Math.min(devicePixelRatio,2));renderer.toneMapping=THREE.ACESFilmicToneMapping;const scene=makeScene(),camera=new THREE.PerspectiveCamera(38,1,.01,100),controls=new OrbitControls(camera,canvas);controls.enableDamping=true;controls.minDistance=.7;controls.maxDistance=10;controls.maxPolarAngle=Math.PI*.54;const grid=new THREE.GridHelper(10,50,0xc6cdd6,0xe1e5ea);grid.material.transparent=true;grid.material.opacity=.4;grid.position.y=-.005;scene.add(grid);let current=null,height=2,wire=false,request=0;
21
  function reset(){camera.position.set(2.8,2.2,3.4);controls.target.set(0,height*.45,0);controls.update()}function resize(){const w=host.clientWidth,h=host.clientHeight;if(w&&h){renderer.setSize(w,h,false);camera.aspect=w/h;camera.updateProjectionMatrix()}}new ResizeObserver(resize).observe(host);document.querySelector('#reset-view').onclick=reset;document.querySelector('#wireframe').onclick=()=>{wire=!wire;current?.traverse(m=>{if(m.isMesh&&m.userData.visual)m.material.wireframe=wire});document.querySelector('#wireframe').setAttribute('aria-pressed',String(wire));document.querySelector('#wireframe').classList.toggle('active',wire)};renderer.setAnimationLoop(()=>{if(current&&!document.hidden&&!document.querySelector('#gallery').hidden){controls.update();renderer.render(scene,camera)}});
22
  export function clear(){++request;if(current){scene.remove(current);dispose(current);current=null}renderer.clear()}
23
  export async function show(asset){clear();const req=request;const data=await loadGeometry(asset);if(req!==request)return;const m=makeModel(data);current=m.group;height=m.height;current.traverse(o=>{if(o.isMesh&&o.userData.visual)o.material.wireframe=wire});scene.add(current);reset();resize();renderer.render(scene,camera)}
 
17
  group.traverse(m=>{if(m.isMesh&&m.userData.visual){m.material.transparent=xray;m.material.opacity=xray?.28:1;m.material.depthWrite=!xray;m.material.needsUpdate=true}})}
18
  function makeModel(data){const group=new THREE.Group();for(const p of data.meshes){const g=new THREE.BufferGeometry();g.setAttribute('position',new THREE.Float32BufferAttribute(p.positions,3));g.setIndex(p.indices);g.computeVertexNormals();const color=new THREE.Color().setRGB(...p.color);const opts={color,roughness:.55,metalness:.05,side:THREE.DoubleSide};if(p.uvs&&p.texture!=null){g.setAttribute('uv',new THREE.Float32BufferAttribute(p.uvs,2));opts.map=texture(data.textureUrls[p.texture])}const vm=new THREE.Mesh(g,new THREE.MeshStandardMaterial(opts));vm.userData.visual=true;group.add(vm)}const box=new THREE.Box3().setFromObject(group),size=box.getSize(new THREE.Vector3()),center=box.getCenter(new THREE.Vector3());const scale=2/Math.max(size.x,size.y,size.z,.0001);group.position.set(-center.x*scale,-box.min.y*scale,-center.z*scale);group.scale.setScalar(scale);addOverlays(group,data,Math.max(size.x,size.y,size.z));return {group,height:size.y*scale}}
19
  function dispose(group){group?.traverse(m=>{m.geometry?.dispose();if(m.material){m.material.map=null;m.material.dispose()}})}
20
+ const canvas=document.querySelector('#canvas'),host=document.querySelector('#viewport');const renderer=new THREE.WebGLRenderer({canvas,alpha:true,antialias:true});renderer.setPixelRatio(Math.min(devicePixelRatio,2));renderer.toneMapping=THREE.ACESFilmicToneMapping;renderer.toneMappingExposure=2.2;const scene=makeScene(),camera=new THREE.PerspectiveCamera(38,1,.01,100),controls=new OrbitControls(camera,canvas);controls.enableDamping=true;controls.minDistance=.7;controls.maxDistance=10;controls.maxPolarAngle=Math.PI*.54;const grid=new THREE.GridHelper(10,50,0xc6cdd6,0xe1e5ea);grid.material.transparent=true;grid.material.opacity=.4;grid.position.y=-.005;scene.add(grid);let current=null,height=2,wire=false,request=0;
21
  function reset(){camera.position.set(2.8,2.2,3.4);controls.target.set(0,height*.45,0);controls.update()}function resize(){const w=host.clientWidth,h=host.clientHeight;if(w&&h){renderer.setSize(w,h,false);camera.aspect=w/h;camera.updateProjectionMatrix()}}new ResizeObserver(resize).observe(host);document.querySelector('#reset-view').onclick=reset;document.querySelector('#wireframe').onclick=()=>{wire=!wire;current?.traverse(m=>{if(m.isMesh&&m.userData.visual)m.material.wireframe=wire});document.querySelector('#wireframe').setAttribute('aria-pressed',String(wire));document.querySelector('#wireframe').classList.toggle('active',wire)};renderer.setAnimationLoop(()=>{if(current&&!document.hidden&&!document.querySelector('#gallery').hidden){controls.update();renderer.render(scene,camera)}});
22
  export function clear(){++request;if(current){scene.remove(current);dispose(current);current=null}renderer.clear()}
23
  export async function show(asset){clear();const req=request;const data=await loadGeometry(asset);if(req!==request)return;const m=makeModel(data);current=m.group;height=m.height;current.traverse(o=>{if(o.isMesh&&o.userData.visual)o.material.wireframe=wire});scene.add(current);reset();resize();renderer.render(scene,camera)}