UNPKG

polygonjs-engine

Version:

node-based webgl 3D engine https://polygonjs.com

62 lines (49 loc) 2.15 kB
import {Color} from 'three/src/math/Color'; import {OctahedronBufferGeometry} from 'three/src/geometries/OctahedronBufferGeometry'; import {BufferAttribute} from 'three/src/core/BufferAttribute'; import {HemisphereLightObjNode} from '../../HemisphereLight'; import {Quaternion} from 'three/src/math/Quaternion'; import {Vector3} from 'three/src/math/Vector3'; import {BaseLightHelper} from './_BaseLightHelper'; import {HemisphereLight} from 'three/src/lights/HemisphereLight'; import {Mesh} from 'three/src/objects/Mesh'; export class HemisphereLightHelper extends BaseLightHelper<Mesh, HemisphereLight, HemisphereLightObjNode> { createObject() { return new Mesh(); } private _geometry = new OctahedronBufferGeometry(1); protected buildHelper() { this._geometry.rotateZ(Math.PI * 0.5); this._material.vertexColors = true; const position = this._geometry.getAttribute('position'); const colors = new Float32Array(position.count * 3); this._geometry.setAttribute('color', new BufferAttribute(colors, 3)); this._object.geometry = this._geometry; this._object.material = this._material; this._object.matrixAutoUpdate = false; } // private _inverse_position = new Vector3(); private _quat = new Quaternion(); private _default_position = new Vector3(0, 1, 0); private _color1 = new Color(); private _color2 = new Color(); update() { if (!this.node.pv.position) { return; } // this._inverse_position.copy(this.node.pv.position).multiplyScalar(-1) this._object.position.copy(this.node.pv.position).multiplyScalar(-1); this._quat.setFromUnitVectors(this._default_position, this.node.pv.position); this._object.setRotationFromQuaternion(this._quat); this._object.scale.setScalar(this.node.pv.helperSize); this._object.updateMatrix(); const colors = this._geometry.getAttribute('color') as BufferAttribute; this._color1.copy(this.node.light.color); this._color2.copy(this.node.light.groundColor); for (let i = 0, l = colors.count; i < l; i++) { const color = i < l / 2 ? this._color1 : this._color2; colors.setXYZ(i, color.r, color.g, color.b); } colors.needsUpdate = true; } }