Explorar o código

CanvasRenderer: Added Points support. Fixes #5372.

Mr.doob %!s(int64=8) %!d(string=hai) anos
pai
achega
a9e99af053
Modificáronse 2 ficheiros con 57 adicións e 19 borrados
  1. 11 0
      examples/js/renderers/CanvasRenderer.js
  2. 46 19
      examples/js/renderers/Projector.js

+ 11 - 0
examples/js/renderers/CanvasRenderer.js

@@ -591,6 +591,17 @@ THREE.CanvasRenderer = function ( parameters ) {
 
 			_context.restore();
 
+		} else if ( material.isPointsMaterial ) {
+
+			setFillStyle( material.color.getStyle() );
+
+			_context.save();
+			_context.translate( v1.x, v1.y );
+			if ( material.rotation !== 0 ) _context.rotate( material.rotation );
+			_context.scale( scaleX * material.size, - scaleY * material.size );
+			_context.fillRect( - 0.5, - 0.5, 1, 1 );
+			_context.restore();
+
 		}
 
 		/* DEBUG

+ 46 - 19
examples/js/renderers/Projector.js

@@ -757,36 +757,34 @@ THREE.Projector = function () {
 
 				}
 
-			} else if ( object instanceof THREE.Sprite ) {
-
-				_vector4.set( _modelMatrix.elements[ 12 ], _modelMatrix.elements[ 13 ], _modelMatrix.elements[ 14 ], 1 );
-				_vector4.applyMatrix4( _viewProjectionMatrix );
+			} else if ( object instanceof THREE.Points ) {
 
-				var invW = 1 / _vector4.w;
+				_modelViewProjectionMatrix.multiplyMatrices( _viewProjectionMatrix, _modelMatrix );
 
-				_vector4.z *= invW;
+				if ( geometry instanceof THREE.Geometry ) {
 
-				if ( _vector4.z >= - 1 && _vector4.z <= 1 ) {
+					var vertices = object.geometry.vertices;
 
-					_sprite = getNextSpriteInPool();
-					_sprite.id = object.id;
-					_sprite.x = _vector4.x * invW;
-					_sprite.y = _vector4.y * invW;
-					_sprite.z = _vector4.z;
-					_sprite.renderOrder = object.renderOrder;
-					_sprite.object = object;
+					for ( var v = 0, vl = vertices.length; v < vl; v ++ ) {
 
-					_sprite.rotation = object.rotation;
+						var vertex = vertices[ v ];
 
-					_sprite.scale.x = object.scale.x * Math.abs( _sprite.x - ( _vector4.x + camera.projectionMatrix.elements[ 0 ] ) / ( _vector4.w + camera.projectionMatrix.elements[ 12 ] ) );
-					_sprite.scale.y = object.scale.y * Math.abs( _sprite.y - ( _vector4.y + camera.projectionMatrix.elements[ 5 ] ) / ( _vector4.w + camera.projectionMatrix.elements[ 13 ] ) );
+						_vector4.set( vertex.x, vertex.y, vertex.z, 1 );
+						_vector4.applyMatrix4( _modelViewProjectionMatrix );
 
-					_sprite.material = object.material;
+						pushPoint( _vector4, object, camera );
 
-					_renderData.elements.push( _sprite );
+					}
 
 				}
 
+			} else if ( object instanceof THREE.Sprite ) {
+
+				_vector4.set( _modelMatrix.elements[ 12 ], _modelMatrix.elements[ 13 ], _modelMatrix.elements[ 14 ], 1 );
+				_vector4.applyMatrix4( _viewProjectionMatrix );
+
+				pushPoint( _vector4, object, camera );
+
 			}
 
 		}
@@ -801,6 +799,35 @@ THREE.Projector = function () {
 
 	};
 
+	function pushPoint( _vector4, object, camera ) {
+
+		var invW = 1 / _vector4.w;
+
+		_vector4.z *= invW;
+
+		if ( _vector4.z >= - 1 && _vector4.z <= 1 ) {
+
+			_sprite = getNextSpriteInPool();
+			_sprite.id = object.id;
+			_sprite.x = _vector4.x * invW;
+			_sprite.y = _vector4.y * invW;
+			_sprite.z = _vector4.z;
+			_sprite.renderOrder = object.renderOrder;
+			_sprite.object = object;
+
+			_sprite.rotation = object.rotation;
+
+			_sprite.scale.x = object.scale.x * Math.abs( _sprite.x - ( _vector4.x + camera.projectionMatrix.elements[ 0 ] ) / ( _vector4.w + camera.projectionMatrix.elements[ 12 ] ) );
+			_sprite.scale.y = object.scale.y * Math.abs( _sprite.y - ( _vector4.y + camera.projectionMatrix.elements[ 5 ] ) / ( _vector4.w + camera.projectionMatrix.elements[ 13 ] ) );
+
+			_sprite.material = object.material;
+
+			_renderData.elements.push( _sprite );
+
+		}
+
+	}
+
 	// Pools
 
 	function getNextObjectInPool() {