summaryrefslogtreecommitdiff
path: root/client/splash/face/mesh.js
diff options
context:
space:
mode:
authoradamhrv <adam@ahprojects.com>2019-01-28 18:11:52 +0100
committeradamhrv <adam@ahprojects.com>2019-01-28 18:11:52 +0100
commitf8b279b2f0be793c5f877cac6373332954c6a5de (patch)
tree60be7caeb0e8c96c59718300c68d5b1cdecde6f4 /client/splash/face/mesh.js
parentdd2c36288aa1e8af14588f9258f6785879b8638c (diff)
parentb0eb2d9672044a1b64a2a1f21540f9ef1bd7b571 (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.js84
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)
+}