diff --git a/packages/viewer/src/modules/SceneObjectManager.js b/packages/viewer/src/modules/SceneObjectManager.js index e5ebb41a1..d800330d7 100644 --- a/packages/viewer/src/modules/SceneObjectManager.js +++ b/packages/viewer/src/modules/SceneObjectManager.js @@ -7,6 +7,7 @@ import { Matrix4, Vector2, Vector3 } from 'three' import { Geometry } from './converter/Geometry' import SpeckleStandardMaterial from './materials/SpeckleStandardMaterial' import SpeckleLineMaterial from './materials/SpeckleLineMaterial' +import SpeckleLineBasicMaterial from './materials/SpeckleLineBasicMaterial' /** * Manages objects and provides some convenience methods to focus on the entire scene, or one specific object. */ @@ -383,7 +384,7 @@ export default class SceneObjectManager { clippingPlanes: this.viewer.sectionBox.planes }) } else { - lineMaterial = new THREE.LineBasicMaterial({ + lineMaterial = new SpeckleLineBasicMaterial({ color: 0x7f7f7f, clippingPlanes: this.viewer.sectionBox.planes }) diff --git a/packages/viewer/src/modules/materials/SpeckleLineBasicMaterial.ts b/packages/viewer/src/modules/materials/SpeckleLineBasicMaterial.ts new file mode 100644 index 000000000..a614e49fa --- /dev/null +++ b/packages/viewer/src/modules/materials/SpeckleLineBasicMaterial.ts @@ -0,0 +1,88 @@ +import { speckle_line_basic_vert } from './shaders/speckle-line-basic-vert' +import { speckle_line_basic_frag } from './shaders/speckle-line-basic-frag' +import { UniformsUtils, ShaderLib, Vector3, LineBasicMaterial } from 'three' +import { Matrix4 } from 'three' +import { Geometry } from '../converter/Geometry' + +class SpeckleLineBasicMaterial extends LineBasicMaterial { + private static readonly matBuff: Matrix4 = new Matrix4() + + constructor(parameters, defines = []) { + super(parameters) + + this.userData.uViewer_high = { + value: new Vector3() + } + this.userData.uViewer_low = { + value: new Vector3() + } + ;(this as any).vertProgram = speckle_line_basic_vert + ;(this as any).fragProgram = speckle_line_basic_frag + ;(this as any).uniforms = UniformsUtils.merge([ + ShaderLib.line.uniforms, + { + uViewer_high: { + value: this.userData.uViewer_high.value + }, + uViewer_low: { + value: this.userData.uViewer_low.value + } + } + ]) + + this.onBeforeCompile = function (shader) { + shader.uniforms.uViewer_high = this.userData.uViewer_high + shader.uniforms.uViewer_low = this.userData.uViewer_low + shader.vertexShader = this.vertProgram + shader.fragmentShader = this.fragProgram + } + + for (var k = 0; k < defines.length; k++) { + this.defines[defines[k]] = '' + } + + if (Geometry.USE_RTE) { + this.defines = {} + this.defines['USE_RTE'] = ' ' + } + } + + copy(source) { + super.copy(source) + this.userData = {} + this.userData.uViewer_high = { + value: new Vector3() + } + this.userData.uViewer_low = { + value: new Vector3() + } + + return this + } + + onBeforeRender(_this, scene, camera, geometry, object, group) { + if (Geometry.USE_RTE) { + SpeckleLineBasicMaterial.matBuff.copy(camera.matrixWorldInverse) + SpeckleLineBasicMaterial.matBuff.elements[12] = 0 + SpeckleLineBasicMaterial.matBuff.elements[13] = 0 + SpeckleLineBasicMaterial.matBuff.elements[14] = 0 + SpeckleLineBasicMaterial.matBuff.multiply(object.matrixWorld) + object.modelViewMatrix.copy(SpeckleLineBasicMaterial.matBuff) + + let uViewer_low = new Vector3() + let uViewer_high = new Vector3() + let uViewer = new Vector3( + camera.matrixWorld.elements[12], + camera.matrixWorld.elements[13], + camera.matrixWorld.elements[14] + ) + + Geometry.DoubleToHighLowVector(uViewer, uViewer_low, uViewer_high) + this.userData.uViewer_high.value.copy(uViewer_high) + this.userData.uViewer_low.value.copy(uViewer_low) + this.needsUpdate = true + } + } +} + +export default SpeckleLineBasicMaterial diff --git a/packages/viewer/src/modules/materials/shaders/speckle-line-basic-frag.ts b/packages/viewer/src/modules/materials/shaders/speckle-line-basic-frag.ts new file mode 100644 index 000000000..c5e9ce589 --- /dev/null +++ b/packages/viewer/src/modules/materials/shaders/speckle-line-basic-frag.ts @@ -0,0 +1,53 @@ +export const speckle_line_basic_frag = /* glsl */ ` +uniform vec3 diffuse; +uniform float opacity; +#ifndef FLAT_SHADED + varying vec3 vNormal; +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void main() { + #include + vec4 diffuseColor = vec4( diffuse, opacity ); + #include + #include + #include + #include + #include + #include + ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) ); + // accumulation (baked indirect lighting only) + #ifdef USE_LIGHTMAP + vec4 lightMapTexel = texture2D( lightMap, vUv2 ); + reflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI; + #else + reflectedLight.indirectDiffuse += vec3( 1.0 ); + #endif + // modulation + #include + reflectedLight.indirectDiffuse *= diffuseColor.rgb; + vec3 outgoingLight = reflectedLight.indirectDiffuse; + #include + #include + #include + #include + #include + #include + #include +} +` diff --git a/packages/viewer/src/modules/materials/shaders/speckle-line-basic-vert.ts b/packages/viewer/src/modules/materials/shaders/speckle-line-basic-vert.ts new file mode 100644 index 000000000..dce8928f3 --- /dev/null +++ b/packages/viewer/src/modules/materials/shaders/speckle-line-basic-vert.ts @@ -0,0 +1,51 @@ +export const speckle_line_basic_vert = /* glsl */ ` +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef USE_RTE + attribute vec3 position_high; + attribute vec3 position_low; + uniform vec3 uViewer_high; + uniform vec3 uViewer_low; +#endif +void main() { + #include + #include + #include + #if defined ( USE_ENVMAP ) || defined ( USE_SKINNING ) + #include + #include + #include + #include + #include + #endif + #include + #include + #include + // #include COMMENTED CHUNK + #ifdef USE_RTE + vec3 highDifference = vec3(position_high.xyz - uViewer_high); + vec3 lowDifference = vec3(position_low.xyz - uViewer_low); + vec4 mvPosition = vec4(highDifference.xyz + lowDifference.xyz , 1.); + #else + vec4 mvPosition = vec4( transformed, 1.0 ); + #endif + #ifdef USE_INSTANCING + mvPosition = instanceMatrix * mvPosition; + #endif + mvPosition = modelViewMatrix * mvPosition; + gl_Position = projectionMatrix * mvPosition; + #include + #include + #include + #include + #include +} +`