⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exportcollada.as

📁 Papervision3d的源码
💻 AS
📖 第 1 页 / 共 2 页
字号:
			var v:Vertex3D;			var trianglesByMaterial:Object = new Object();			var uvs:Array = new Array();			var vData:Array = new Array();			var uvData:Array = new Array();			var materialName:String;			var i:int;			var vindices:Dictionary = new Dictionary(true);			var uvindices:Dictionary = new Dictionary(true);						xml += printLine('<mesh>', indent + 1);						for(i = 0; i < mesh.geometry.vertices.length; i++)			{				v = mesh.geometry.vertices[i];				vindices[v] = i;				vData.push(v.x.toFixed(FRACTION_DIGITS));				vData.push(v.y.toFixed(FRACTION_DIGITS));				vData.push(v.z.toFixed(FRACTION_DIGITS));			}						for(i = 0; i < mesh.geometry.faces.length; i++)			{				tri = mesh.geometry.faces[i];									materialName = findMaterialName(tri.material, mesh.materials);									if(!(trianglesByMaterial[materialName] is Array))					trianglesByMaterial[materialName] = new Array();				trianglesByMaterial[materialName].push(i);									var idx:int = uvs.length;								uvindices[ tri ] = [idx, idx+1, idx+2];								uvs.push(tri.uv0, tri.uv1, tri.uv2);			}							// build uv source-data			for(i = 0; i < uvs.length; i++)				uvData.push(uvs[i].u.toFixed(FRACTION_DIGITS), uvs[i].v.toFixed(FRACTION_DIGITS));						// export <source> elements for vertices and uvs			xml += exportFloatSource(id+"-positions", vData, ["X", "Y", "Z"], indent + 2);			xml += exportFloatSource(id+"-texcoords", uvData, ["S", "T"], indent + 2);						// export <vertices> element			xml += printLine('<vertices id="'+id+'-vertices">', indent + 2);			xml += printLine('<input semantic="POSITION" source="#'+id+'-positions" />', indent + 3);			xml += printLine('</vertices>', indent + 2);						// export a <triangles> element for each material used by the geometry			for(materialName in trianglesByMaterial)			{				var tris:Array = trianglesByMaterial[materialName];				var p:Array = new Array();								for(i = 0; i < tris.length; i++)				{					tri = mesh.geometry.faces[ tris[i] ];										var uva:Array = uvindices[ tri ];										if(REVERSE_WINDING)					{						p.push(vindices[tri.v2], uva[2]); 						p.push(vindices[tri.v1], uva[1]); 						p.push(vindices[tri.v0], uva[0]); 					}					else					{						p.push(vindices[tri.v0], uva[0]);						p.push(vindices[tri.v1], uva[1]);						p.push(vindices[tri.v2], uva[2]); 					}				}								xml += printLine('<triangles material="'+materialName+'" count="'+tris.length+'">', indent + 2);				xml += printLine('<input semantic="VERTEX" source="#'+id+'-vertices" offset="0" />', indent + 3);				xml += printLine('<input semantic="TEXCOORD" source="#'+id+'-texcoords" offset="1" set="0" />', indent + 3);				xml += printLine('<p>'+p.join(" ")+'</p>', indent + 3);				xml += printLine('</triangles>', indent + 2);			}						// all done			xml += printLine('</mesh>', indent + 1);			xml += printLine('</geometry>', indent);			return xml;		}				/**		 * Exports the <image> elements.		 * 		 * @param object		 * @param indent		 * 		 * @return XML string 		 */ 		private static function exportImages(object:DisplayObject3D, indent:int=0):String 		{			var xml:String = "";						for(var name:String in object.materials.materialsByName)			{				var material:MaterialObject3D = object.materials.materialsByName[name];								if(material is BitmapFileMaterial)				{					var id:String = "psdFileTex" + (_numImages++);					var url:String = BitmapFileMaterial(material).url;					url = url.split("\\").join("/");					if(url.indexOf("/") != -1)					{						var parts:Array = url.split("/");						url = String(parts.pop());					}										url = DEFAULT_TEXTURE_DIR + "/" + url;					url = url.replace(/\/\//, "/");										xml += printLine('<image id="'+id+'" name="'+id+'">', indent);					xml += printLine('<init_from>'+url+'</init_from>', indent+1);					xml += printLine('</image>', indent);										_materialToImageId[ material ] = id;				}			}						for each(var child:DisplayObject3D in object.children)				 xml += exportImages(child, indent);							return xml;		}				/**		 * Exports the <material> elements.		 * 		 * @param object		 * @param indent		 * 		 * @return XML string 		 */ 		private static function exportMaterials(object:DisplayObject3D, indent:int=0):String 		{			var xml:String = "";						for(var name:String in object.materials.materialsByName)			{				var material:MaterialObject3D = object.materials.materialsByName[name];				var tgt:String = _materialTargets[ material ];				 				xml += printLine('<material id="'+tgt+'" name="'+tgt+'">', indent);				xml += printLine('<instance_effect url="#'+tgt+'-fx" />', indent + 1);				xml += printLine('</material>', indent);			}						for each(var child:DisplayObject3D in object.children)				xml += exportMaterials(child, indent);							return xml;		}				/**		 * Exports a <matrix> element.		 * 		 * @param matrix		 * @param indent		 * 		 * @return XML string 		 */ 		private static function exportMatrix(matrix:Matrix3D, indent:int=0):String 		{			var data:Array = [				matrix.n11, matrix.n12, matrix.n13, matrix.n14,				matrix.n21, matrix.n22, matrix.n23, matrix.n24,				matrix.n31, matrix.n32, matrix.n33, matrix.n34,				matrix.n41, matrix.n42, matrix.n43, matrix.n44			];			return printLine('<matrix>' + data.join(" ") + '</matrix>', indent);			}				/**		 * Exports a <visual_scene> element.		 * 		 * @param object		 * @param indent		 * 		 * @return XML string 		 */ 		private static function exportVisualScene(object:DisplayObject3D, indent:int=0):String		{							var id:String = getInstanceName(object);			var xml:String = printLine('<node id="'+id+'" name="'+id+'">', indent);							xml += exportMatrix(object.transform, indent + 1);						if(object is TriangleMesh3D)			{				xml += printLine('<instance_geometry url="#'+id+'-geometry">', indent + 1);				xml += printLine('<bind_material>', indent + 2);				xml += printLine('<technique_common>', indent + 3);								for(var materialName:String in object.materials.materialsByName)				{					var material:MaterialObject3D = object.materials.materialsByName[materialName];					var tgt:String = _materialTargets[material];					xml += printLine('<instance_material symbol="'+materialName+'" target="#'+tgt+'" />', indent + 4);				}								xml += printLine('</technique_common>', indent + 3);				xml += printLine('</bind_material>', indent + 2);				xml += printLine('</instance_geometry>', indent + 1);			}						for each(var child:DisplayObject3D in object.children)				xml += exportVisualScene(child, indent + 1);						xml += printLine('</node>', indent);				return xml;		}				/**		 * 		 */ 		private static function getInstanceName(instance:DisplayObject3D):String 		{			if(instance.name && instance.name.length > 2)				return instance.name;			instance.name = "Node" + (_numInstances++);			return instance.name;		}				/**		 * 		 */ 		private static function prepareMaterials(object:DisplayObject3D):void		{			object.materials = object.materials || new MaterialsList();							if(object.geometry && object.geometry.faces)			{				for each(var triangle:Triangle3D in object.geometry.faces)				{					var name:String = findMaterialName(triangle.material, object.materials);					if(!name)					{						name = "Material" + _numMaterials;						object.materials.addMaterial(triangle.material, name);						_numMaterials++;					}				}			}						for(var materialName:String in object.materials.materialsByName)			{				var material:MaterialObject3D = object.materials.materialsByName[ materialName ];								if(material is BitmapFileMaterial)					_hasImages = true;					_materialTargets[material] = materialName.toLowerCase() + "-target";				}						for each(var child:DisplayObject3D in object.children)				prepareMaterials(child);		}				/**		 * 		 */ 		private static function findMaterialName(find:MaterialObject3D, list:MaterialsList):String		{			for(var name:String in list.materialsByName)			{				if(list.materialsByName[name] === find)					return name;			}			return null;		}				private static function printLine(str:String, indent:int = 0):String		{			var s:String = "";			for(var i:int = 0; i < indent; i++)				s += "\t";			return s + str + "\n";		}				private static var _numInstances		: int = 0;		private static var _numMaterials		: int = 0;		private static var _materialTargets		: Dictionary;		private static var _hasImages			: Boolean;		private static var _numImages			: int = 0;		private static var _materialToImageId	: Dictionary;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -