diff options
| author | adamhrv <adam@ahprojects.com> | 2019-01-28 18:11:52 +0100 |
|---|---|---|
| committer | adamhrv <adam@ahprojects.com> | 2019-01-28 18:11:52 +0100 |
| commit | f8b279b2f0be793c5f877cac6373332954c6a5de (patch) | |
| tree | 60be7caeb0e8c96c59718300c68d5b1cdecde6f4 /client/splash/face/mesh.js | |
| parent | dd2c36288aa1e8af14588f9258f6785879b8638c (diff) | |
| parent | b0eb2d9672044a1b64a2a1f21540f9ef1bd7b571 (diff) | |
Merge branch 'master' of github.com:adamhrv/megapixels_dev
Diffstat (limited to 'client/splash/face/mesh.js')
| -rw-r--r-- | client/splash/face/mesh.js | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/client/splash/face/mesh.js b/client/splash/face/mesh.js new file mode 100644 index 00000000..69a40900 --- /dev/null +++ b/client/splash/face/mesh.js @@ -0,0 +1,84 @@ +import { Points, Mesh, MeshBasicMaterial, VertexColors, TrianglesDrawMode } from 'three' + +import { scene } from '../renderer' + +import DRACOLoader from '../../util/vendor/DRACOLoader' +import GeometryHelper from '../../util/vendor/geometryHelper' + +import { getBboxScaleAndCentroid } from './util' + +import { FACE_SCALE } from '../constants' + +DRACOLoader.setDecoderPath('/assets/js/vendor/draco/') + +const dracoLoader = new DRACOLoader() +DRACOLoader.getDecoderModule() + +export function load(name) { + dracoLoader.setVerbosity(1) + dracoLoader.setDrawMode(TrianglesDrawMode) + dracoLoader.setSkipDequantization('position', true) + dracoLoader.load('/assets/data/faces/' + name + '.drc', dracoDidLoad) +} + +export function update(name) { + load(name) +} + +function setDequantizationForMaterial(material, bufferGeometry) { + material.onBeforeCompile = (shader) => { + // Add uniform variables needed for dequantization. + const posAttribute = bufferGeometry.attributes.position + shader.uniforms.normConstant = { value: posAttribute.maxRange / (1 << posAttribute.numQuantizationBits) } + shader.uniforms.minPos = { value: posAttribute.minValues } + + shader.vertexShader = 'uniform float maxRange;\n' + + 'uniform float normConstant;\n' + + 'uniform vec3 minPos;\n' + + shader.vertexShader + shader.vertexShader = shader.vertexShader.replace( + '#include <begin_vertex>', + 'vec3 transformed = minPos + position * normConstant;' + ) + } +} + +function dracoDidLoad(bufferGeometry) { + const material = new MeshBasicMaterial({ vertexColors: VertexColors }) + material.wireframe = true + // If the position attribute is quantized, modify the material to perform + // dequantization on the GPU. + if (bufferGeometry.attributes.position.isQuantized) { + setDequantizationForMaterial(material, bufferGeometry) + } + + let geometry + // Point cloud does not have face indices. + if (bufferGeometry.index === null) { + geometry = new Points(bufferGeometry, material) + } else { + if (bufferGeometry.attributes.normal === undefined) { + const geometryHelper = new GeometryHelper() + geometryHelper.computeVertexNormals(bufferGeometry) + } + geometry = new Mesh(bufferGeometry, material) + geometry.drawMode = dracoLoader.drawMode + } + + // Compute range of the geometry coordinates for proper rendering. + bufferGeometry.computeBoundingBox() + const bbox = bufferGeometry.boundingBox + const { scale, midX, midY, midZ } = getBboxScaleAndCentroid(bbox, bufferGeometry.attributes.position) + geometry.scale.multiplyScalar(scale * FACE_SCALE) + geometry.position.x = -midX * scale + geometry.position.y = -midY * scale + geometry.position.z = -midZ * scale + geometry.frustumCulled = false + // geometry.castShadow = true + // geometry.receiveShadow = true + + const selectedObject = scene.getObjectByName("my_mesh") + scene.remove(selectedObject) + geometry.name = "my_mesh" + scene.add(geometry) +} |
