|
@@ -14163,8 +14163,6 @@ THREE.ShaderChunk = {
|
|
|
"vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );",
|
|
|
"vec3 lVector = lPosition.xyz - mvPosition.xyz;",
|
|
|
|
|
|
- "lVector = normalize( lVector );",
|
|
|
-
|
|
|
"float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - mPosition.xyz ) );",
|
|
|
|
|
|
"if ( spotEffect > spotLightAngle[ i ] ) {",
|
|
@@ -14175,6 +14173,8 @@ THREE.ShaderChunk = {
|
|
|
"if ( spotLightDistance[ i ] > 0.0 )",
|
|
|
"lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );",
|
|
|
|
|
|
+ "lVector = normalize( lVector );",
|
|
|
+
|
|
|
"float dotProduct = dot( transformedNormal, lVector );",
|
|
|
"vec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );",
|
|
|
|
|
@@ -32643,9 +32643,11 @@ THREE.DirectionalLightHelper = function ( light, sphereSize, arrowLength ) {
|
|
|
|
|
|
this.color = light.color.clone();
|
|
|
|
|
|
- this.color.r *= light.intensity;
|
|
|
- this.color.g *= light.intensity;
|
|
|
- this.color.b *= light.intensity;
|
|
|
+ var intensity = THREE.Math.clamp( light.intensity, 0, 1 );
|
|
|
+
|
|
|
+ this.color.r *= intensity;
|
|
|
+ this.color.g *= intensity;
|
|
|
+ this.color.b *= intensity;
|
|
|
|
|
|
var hexColor = this.color.getHex();
|
|
|
|
|
@@ -32762,9 +32764,11 @@ THREE.PointLightHelper = function ( light, sphereSize ) {
|
|
|
|
|
|
this.color = light.color.clone();
|
|
|
|
|
|
- this.color.r *= light.intensity;
|
|
|
- this.color.g *= light.intensity;
|
|
|
- this.color.b *= light.intensity;
|
|
|
+ var intensity = THREE.Math.clamp( light.intensity, 0, 1 );
|
|
|
+
|
|
|
+ this.color.r *= intensity;
|
|
|
+ this.color.g *= intensity;
|
|
|
+ this.color.b *= intensity;
|
|
|
|
|
|
var hexColor = this.color.getHex();
|
|
|
|
|
@@ -32844,6 +32848,160 @@ THREE.PointLightHelper.prototype.update = function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * @author alteredq / http://alteredqualia.com/
|
|
|
+ *
|
|
|
+ * - shows spot light color, intensity, position, orientation, light cone and target
|
|
|
+ */
|
|
|
+
|
|
|
+THREE.SpotLightHelper = function ( light, sphereSize, arrowLength ) {
|
|
|
+
|
|
|
+ THREE.Object3D.call( this );
|
|
|
+
|
|
|
+ this.light = light;
|
|
|
+
|
|
|
+ // position
|
|
|
+
|
|
|
+ this.position = light.position;
|
|
|
+
|
|
|
+ // direction
|
|
|
+
|
|
|
+ this.direction = new THREE.Vector3();
|
|
|
+ this.direction.sub( light.target.position, light.position );
|
|
|
+
|
|
|
+ // color
|
|
|
+
|
|
|
+ this.color = light.color.clone();
|
|
|
+
|
|
|
+ var intensity = THREE.Math.clamp( light.intensity, 0, 1 );
|
|
|
+
|
|
|
+ this.color.r *= intensity;
|
|
|
+ this.color.g *= intensity;
|
|
|
+ this.color.b *= intensity;
|
|
|
+
|
|
|
+ var hexColor = this.color.getHex();
|
|
|
+
|
|
|
+ // light helper
|
|
|
+
|
|
|
+ var bulbGeometry = new THREE.SphereGeometry( sphereSize, 16, 8 );
|
|
|
+ var raysGeometry = new THREE.AsteriskGeometry( sphereSize * 1.25, sphereSize * 2.25 );
|
|
|
+ var coneGeometry = new THREE.CylinderGeometry( 0.0001, 1, 1, 32, 1, true );
|
|
|
+
|
|
|
+ var coneMatrix = new THREE.Matrix4();
|
|
|
+ coneMatrix.rotateX( -Math.PI/2 );
|
|
|
+ coneMatrix.translate( new THREE.Vector3( 0, -0.5, 0 ) );
|
|
|
+ coneGeometry.applyMatrix( coneMatrix );
|
|
|
+
|
|
|
+ var bulbMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false } );
|
|
|
+ var raysMaterial = new THREE.LineBasicMaterial( { color: hexColor, fog: false } );
|
|
|
+ var coneMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.3, transparent: true } );
|
|
|
+
|
|
|
+ this.lightArrow = new THREE.ArrowHelper( this.direction, null, arrowLength, hexColor );
|
|
|
+ this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );
|
|
|
+ this.lightCone = new THREE.Mesh( coneGeometry, coneMaterial );
|
|
|
+
|
|
|
+ var coneLength = light.distance ? light.distance : 10000;
|
|
|
+ var coneWidth = coneLength * Math.tan( light.angle * 0.5 ) * 2;
|
|
|
+ this.lightCone.scale.set( coneWidth, coneWidth, coneLength );
|
|
|
+
|
|
|
+ this.lightArrow.cone.material.fog = false;
|
|
|
+ this.lightArrow.line.material.fog = false;
|
|
|
+
|
|
|
+ this.lightRays = new THREE.Line( raysGeometry, raysMaterial, THREE.LinePieces );
|
|
|
+
|
|
|
+ this.gyroscope = new THREE.Gyroscope();
|
|
|
+
|
|
|
+ this.gyroscope.add( this.lightArrow );
|
|
|
+ this.gyroscope.add( this.lightSphere );
|
|
|
+ this.gyroscope.add( this.lightRays );
|
|
|
+
|
|
|
+ this.add( this.gyroscope );
|
|
|
+ this.add( this.lightCone );
|
|
|
+
|
|
|
+ this.lookAt( light.target.position );
|
|
|
+
|
|
|
+ this.lightSphere.properties.isGizmo = true;
|
|
|
+ this.lightSphere.properties.gizmoSubject = light;
|
|
|
+ this.lightSphere.properties.gizmoRoot = this;
|
|
|
+
|
|
|
+ // light target helper
|
|
|
+
|
|
|
+ this.targetSphere = null;
|
|
|
+
|
|
|
+ if ( light.target.properties.targetInverse ) {
|
|
|
+
|
|
|
+ var targetGeo = new THREE.SphereGeometry( sphereSize, 8, 4 );
|
|
|
+ var targetMaterial = new THREE.MeshBasicMaterial( { color: hexColor, wireframe: true, fog: false } );
|
|
|
+
|
|
|
+ this.targetSphere = new THREE.Mesh( targetGeo, targetMaterial );
|
|
|
+ this.targetSphere.position = light.target.position;
|
|
|
+
|
|
|
+ this.targetSphere.properties.isGizmo = true;
|
|
|
+ this.targetSphere.properties.gizmoSubject = light.target;
|
|
|
+ this.targetSphere.properties.gizmoRoot = this.targetSphere;
|
|
|
+
|
|
|
+ var lineMaterial = new THREE.LineDashedMaterial( { color: hexColor, dashSize: 4, gapSize: 4, opacity: 0.75, transparent: true, fog: false } );
|
|
|
+ var lineGeometry = new THREE.Geometry();
|
|
|
+ lineGeometry.vertices.push( this.position.clone() );
|
|
|
+ lineGeometry.vertices.push( this.targetSphere.position.clone() );
|
|
|
+ lineGeometry.computeLineDistances();
|
|
|
+
|
|
|
+ this.targetLine = new THREE.Line( lineGeometry, lineMaterial );
|
|
|
+ this.targetLine.properties.isGizmo = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ this.properties.isGizmo = true;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+THREE.SpotLightHelper.prototype = Object.create( THREE.Object3D.prototype );
|
|
|
+
|
|
|
+THREE.SpotLightHelper.prototype.update = function () {
|
|
|
+
|
|
|
+ // update arrow orientation
|
|
|
+ // pointing from light to target
|
|
|
+
|
|
|
+ this.direction.sub( this.light.target.position, this.light.position );
|
|
|
+ this.lightArrow.setDirection( this.direction );
|
|
|
+
|
|
|
+ // update light cone orientation and size
|
|
|
+
|
|
|
+ this.lookAt( this.light.target.position );
|
|
|
+
|
|
|
+ var coneLength = this.light.distance ? this.light.distance : 10000;
|
|
|
+ var coneWidth = coneLength * Math.tan( this.light.angle * 0.5 ) * 2;
|
|
|
+ this.lightCone.scale.set( coneWidth, coneWidth, coneLength );
|
|
|
+
|
|
|
+ // update arrow, spheres, rays and line colors to light color * light intensity
|
|
|
+
|
|
|
+ this.color.copy( this.light.color );
|
|
|
+
|
|
|
+ var intensity = THREE.Math.clamp( this.light.intensity, 0, 1 );
|
|
|
+ this.color.r *= intensity;
|
|
|
+ this.color.g *= intensity;
|
|
|
+ this.color.b *= intensity;
|
|
|
+
|
|
|
+ this.lightArrow.setColor( this.color.getHex() );
|
|
|
+ this.lightSphere.material.color.copy( this.color );
|
|
|
+ this.lightRays.material.color.copy( this.color );
|
|
|
+ this.lightCone.material.color.copy( this.color );
|
|
|
+
|
|
|
+ this.targetSphere.material.color.copy( this.color );
|
|
|
+ this.targetLine.material.color.copy( this.color );
|
|
|
+
|
|
|
+ // update target line vertices
|
|
|
+
|
|
|
+ this.targetLine.geometry.vertices[ 0 ].copy( this.light.position );
|
|
|
+ this.targetLine.geometry.vertices[ 1 ].copy( this.light.target.position );
|
|
|
+
|
|
|
+ this.targetLine.geometry.computeLineDistances();
|
|
|
+ this.targetLine.geometry.verticesNeedUpdate = true;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* @author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog
|
|
|
*
|