Переглянути джерело

Editor: Added Sprite support.

Mr.doob 11 роки тому
батько
коміт
600c22929c

+ 2 - 0
editor/js/Editor.js

@@ -349,6 +349,7 @@ Editor.prototype = {
 			'PointLight': THREE.PointLight,
 			'SpotLight': THREE.SpotLight,
 			'Mesh': THREE.Mesh,
+			'Sprite': THREE.Sprite,
 			'Object3D': THREE.Object3D
 
 		};
@@ -410,6 +411,7 @@ Editor.prototype = {
 			'ParticleSystemMaterial': THREE.ParticleSystemMaterial,
 			'ShaderMaterial': THREE.ShaderMaterial,
 			'SpriteCanvasMaterial': THREE.SpriteCanvasMaterial,
+			'SpriteMaterial': THREE.SpriteMaterial,
 			'Material': THREE.Material
 
 		};

+ 20 - 0
editor/js/Menubar.Add.js

@@ -206,6 +206,26 @@ Menubar.Add = function ( editor ) {
 
 	options.add( new UI.HorizontalRule() );
 
+	// add sprite
+
+	var option = new UI.Panel();
+	option.setClass( 'option' );
+	option.setTextContent( 'Sprite' );
+	option.onClick( function () {
+
+		var sprite = new THREE.Sprite( new THREE.SpriteMaterial() );
+		sprite.name = 'Sprite ' + ( ++ meshCount );
+
+		editor.addObject( sprite );
+		editor.select( sprite );
+
+	} );
+	options.add( option );
+
+	// divider
+
+	options.add( new UI.HorizontalRule() );
+
 	// add point light
 
 	var option = new UI.Panel();

+ 13 - 17
editor/js/Sidebar.Material.js

@@ -14,6 +14,7 @@ Sidebar.Material = function ( editor ) {
 		'MeshPhongMaterial': THREE.MeshPhongMaterial,
 		'ParticleSystemMaterial': THREE.ParticleSystemMaterial,
 		'ShaderMaterial': THREE.ShaderMaterial,
+		'SpriteMaterial': THREE.SpriteMaterial,
 		'SpriteCanvasMaterial': THREE.SpriteCanvasMaterial,
 		'Material': THREE.Material
 
@@ -69,7 +70,8 @@ Sidebar.Material = function ( editor ) {
 		'MeshFaceMaterial': 'MeshFaceMaterial',
 		'MeshLambertMaterial': 'MeshLambertMaterial',
 		'MeshNormalMaterial': 'MeshNormalMaterial',
-		'MeshPhongMaterial': 'MeshPhongMaterial'
+		'MeshPhongMaterial': 'MeshPhongMaterial',
+		'SpriteMaterial': 'SpriteMaterial'
 
 	} ).setWidth( '150px' ).setColor( '#444' ).setFontSize( '12px' ).onChange( update );
 
@@ -309,6 +311,7 @@ Sidebar.Material = function ( editor ) {
 		var textureWarning = false;
 		var objectHasUvs = false;
 
+		if ( object instanceof THREE.Sprite ) objectHasUvs = true;
 		if ( geometry instanceof THREE.Geometry && geometry.faceVertexUvs[ 0 ].length > 0 ) objectHasUvs = true;
 		if ( geometry instanceof THREE.BufferGeometry && geometry.attributes.uv !== undefined ) objectHasUvs = true;
 
@@ -373,8 +376,12 @@ Sidebar.Material = function ( editor ) {
 
 				if ( objectHasUvs )  {
 
-					geometry.buffersNeedUpdate = true;
-					geometry.uvsNeedUpdate = true;
+					if ( geometry !== undefined ) {
+
+						geometry.buffersNeedUpdate = true;
+						geometry.uvsNeedUpdate = true;
+
+					}
 
 					material.map = mapEnabled ? materialMap.getValue() : null;
 					material.needsUpdate = true;
@@ -562,29 +569,18 @@ Sidebar.Material = function ( editor ) {
 			'opacity': materialOpacityRow,
 			'transparent': materialTransparentRow,
 			'wireframe': materialWireframeRow
-
 		};
 
-		var object = editor.selected;
+		var material = editor.selected.material;
 
 		for ( var property in properties ) {
 
-			properties[ property ].setDisplay( object.material[ property ] !== undefined ? '' : 'none' );
+			properties[ property ].setDisplay( material[ property ] !== undefined ? '' : 'none' );
 
 		}
 
 	};
 
-	function getMaterialInstanceName( material ) {
-
-		for ( var key in materialClasses ) {
-
-			if ( material instanceof materialClasses[ key ] ) return key;
-
-		}
-
-	}
-
 	// events
 
 	signals.objectSelected.add( function ( object ) {
@@ -607,7 +603,7 @@ Sidebar.Material = function ( editor ) {
 
 			}
 
-			materialClass.setValue( getMaterialInstanceName( material ) );
+			materialClass.setValue( editor.getMaterialType( material ) );
 
 			if ( material.color !== undefined ) {
 

+ 1 - 25
editor/js/Sidebar.Object3D.js

@@ -416,30 +416,6 @@ Sidebar.Object3D = function ( editor ) {
 
 	}
 
-	function getObjectInstanceName( object ) {
-
-		var objects = {
-
-			'Scene': THREE.Scene,
-			'PerspectiveCamera': THREE.PerspectiveCamera,
-			'AmbientLight': THREE.AmbientLight,
-			'DirectionalLight': THREE.DirectionalLight,
-			'HemisphereLight': THREE.HemisphereLight,
-			'PointLight': THREE.PointLight,
-			'SpotLight': THREE.SpotLight,
-			'Mesh': THREE.Mesh,
-			'Object3D': THREE.Object3D
-
-		};
-
-		for ( var key in objects ) {
-
-			if ( object instanceof objects[ key ] ) return key;
-
-		}
-
-	}
-
 	// events
 
 	signals.objectSelected.add( function ( object ) {
@@ -492,7 +468,7 @@ Sidebar.Object3D = function ( editor ) {
 
 			container.setDisplay( 'block' );
 
-			objectType.setValue( getObjectInstanceName( object ) );
+			objectType.setValue( editor.getObjectType( object ) );
 
 			objectUUID.setValue( object.uuid );
 			objectName.setValue( object.name );

+ 7 - 0
examples/js/exporters/MaterialExporter.js

@@ -90,6 +90,13 @@ THREE.MaterialExporter.prototype = {
 
 			}
 
+		} else if ( material instanceof THREE.SpriteMaterial ) {
+
+			output.type = 'SpriteMaterial';
+			output.color = material.color.getHex();
+			output.opacity = material.opacity;
+			output.transparent = material.transparent;
+
 		}
 
 		return output;

+ 5 - 0
examples/js/exporters/ObjectExporter.js

@@ -241,6 +241,11 @@ THREE.ObjectExporter.prototype = {
 				data.geometry = parseGeometry( object.geometry );
 				data.material = parseMaterial( object.material );
 
+			} else if ( object instanceof THREE.Sprite ) {
+
+				data.type = 'Sprite';
+				data.material = parseMaterial( object.material );
+
 			} else {
 
 				data.type = 'Object3D';

+ 14 - 0
src/loaders/ObjectLoader.js

@@ -287,6 +287,20 @@ THREE.ObjectLoader.prototype = {
 
 					break;
 
+				case 'Sprite':
+
+					var material = materials[ data.material ];
+
+					if ( material === undefined ) {
+
+						console.error( 'THREE.ObjectLoader: Undefined material ' + data.material );
+
+					}
+
+					object = new THREE.Sprite( material );
+
+					break;
+
 				default:
 
 					object = new THREE.Object3D();

+ 1 - 1
src/materials/SpriteMaterial.js

@@ -24,7 +24,7 @@ THREE.SpriteMaterial = function ( parameters ) {
 	// defaults
 
 	this.color = new THREE.Color( 0xffffff );
-	this.map = new THREE.Texture();
+	this.map = null;
 
 	this.depthTest = true;
 	this.sizeAttenuation = true;

+ 1 - 1
src/renderers/CanvasRenderer.js

@@ -466,7 +466,7 @@ THREE.CanvasRenderer = function ( parameters ) {
 		if ( material instanceof THREE.SpriteMaterial ||
 			 material instanceof THREE.ParticleSystemMaterial ) { // Backwards compatibility
 
-			if ( material.map.image !== undefined ) {
+			if ( material.map !== null ) {
 
 				var bitmap = material.map.image;