summaryrefslogtreecommitdiff
path: root/client/splash/face/mesh.js
diff options
context:
space:
mode:
Diffstat (limited to 'client/splash/face/mesh.js')
-rw-r--r--client/splash/face/mesh.js91
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;'
+ )
+ }
}
+