diff options
Diffstat (limited to 'client/splash/face/mesh.js')
| -rw-r--r-- | client/splash/face/mesh.js | 91 |
1 files changed, 71 insertions, 20 deletions
diff --git a/client/splash/face/mesh.js b/client/splash/face/mesh.js index 69a40900..92aff020 100644 --- a/client/splash/face/mesh.js +++ b/client/splash/face/mesh.js @@ -1,4 +1,4 @@ -import { Points, Mesh, MeshBasicMaterial, VertexColors, TrianglesDrawMode } from 'three' +import { Points, Mesh, MeshBasicMaterial, MeshStandardMaterial, VertexColors, TrianglesDrawMode, DoubleSide } from 'three' import { scene } from '../renderer' @@ -18,34 +18,65 @@ export function load(name) { dracoLoader.setVerbosity(1) dracoLoader.setDrawMode(TrianglesDrawMode) dracoLoader.setSkipDequantization('position', true) - dracoLoader.load('/assets/data/faces/' + name + '.drc', dracoDidLoad) + return new Promise((resolve, reject) => { + dracoLoader.load('/assets/data/faces/' + name + '.drc', (geometry) => { + resolve(createFaceMeshes(geometry)) + }) + }) } 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 createFaceMeshes(geometry) { + return { + blank: createBlankFace(geometry), + wireframe: createWireframeFace(geometry), + solid: createSolidFace(geometry), } } +export function remove() { + removeMesh('blank') + removeMesh('wireframe') + removeMesh('solid') +} -function dracoDidLoad(bufferGeometry) { +export function removeMesh(name) { + const selectedObject = scene.getObjectByName(name) + scene.remove(selectedObject) +} + +function createBlankFace(geometry) { + const material = new MeshStandardMaterial({ + color: 0xFFFFFF, + metalness: 0.2, + roughness: 0.5, + }) + material.wireframe = false + material.transparent = true + material.opacity = 0 + material.side = DoubleSide + return appendFace('blank', geometry, material) +} + +function createWireframeFace(geometry) { const material = new MeshBasicMaterial({ vertexColors: VertexColors }) material.wireframe = true + material.transparent = true + material.opacity = 0 + return appendFace('wireframe', geometry, material) +} + +function createSolidFace(geometry) { + const material = new MeshBasicMaterial({ vertexColors: VertexColors }) + material.transparent = true + material.opacity = 0 + material.side = DoubleSide + return appendFace('solid', geometry, material) +} + +function appendFace(name, bufferGeometry, material) { // If the position attribute is quantized, modify the material to perform // dequantization on the GPU. if (bufferGeometry.attributes.position.isQuantized) { @@ -77,8 +108,28 @@ function dracoDidLoad(bufferGeometry) { // geometry.castShadow = true // geometry.receiveShadow = true - const selectedObject = scene.getObjectByName("my_mesh") + const selectedObject = scene.getObjectByName(name) scene.remove(selectedObject) - geometry.name = "my_mesh" + geometry.name = name scene.add(geometry) + return geometry +} + +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;' + ) + } } + |
