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

📄 exportcollada.as

📁 Papervision3d的源码
💻 AS
📖 第 1 页 / 共 2 页
字号:
package org.papervision3d.core.io.exporters{	import flash.utils.Dictionary;		import org.papervision3d.core.geom.TriangleMesh3D;	import org.papervision3d.core.geom.renderables.Triangle3D;	import org.papervision3d.core.geom.renderables.Vertex3D;	import org.papervision3d.core.math.Matrix3D;	import org.papervision3d.core.proto.MaterialObject3D;	import org.papervision3d.materials.BitmapFileMaterial;	import org.papervision3d.materials.WireframeMaterial;	import org.papervision3d.materials.utils.MaterialsList;	import org.papervision3d.objects.DisplayObject3D;		/**	 * This class lets you export a DisplayObject3D to the Collada file format (*.dae).	 * <p></p>	 * 	 * @author Tim Knip	 */ 	public class ExportCollada	{		public static var DEFAULT_TEXTURE_DIR:String = ".";				/** Default visuals scene id and name. */		public static var VISUAL_SCENE_NAME:String = "PapervisionScene";				/** Number of fraction digits to use for floats. */		public static var FRACTION_DIGITS:int = 5;				/** Boolean indicatin whether to flip faces. */		public static var REVERSE_WINDING:Boolean = true;				/**		 * 		 */ 		public static function export(object:DisplayObject3D):String		{			_hasImages = false;			_numImages = 0;			_materialToImageId = new Dictionary(true);			_numInstances = 0;			_numMaterials = 0;			_materialTargets = new Dictionary(true);						prepareMaterials(object);						var xml:String = printLine('<?xml version="1.0" encoding="utf-8"?>');			xml += printLine('<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">');						// export main asset element			xml += printLine('<asset>', 1);			xml += printLine('<contributor>', 2);			xml += printLine('<author>Tim Knip</author>', 3);			xml += printLine('<authoring_tool>Papervision3D - ColladaExport</authoring_tool>', 3);			xml += printLine('<comments></comments>', 3);			xml += printLine('<source_data></source_data>', 3);			xml += printLine('</contributor>', 2);			xml += printLine('<created>2008-05-07T00:05:39Z</created>', 2);			xml += printLine('<modified>2008-05-07T00:05:39Z</modified>', 2);			xml += printLine('<unit meter="0.01" name="centimeter"/>', 2);			xml += printLine('<up_axis>Y_UP</up_axis>', 2);			xml += printLine('</asset>', 1);						// export textures if needed			if(_hasImages)			{				xml += printLine('<library_images>', 1);				xml += exportImages(object, 2);				xml += printLine('</library_images>', 1);				}						// export materials			xml += printLine('<library_materials>', 1);			xml += exportMaterials(object, 2);			xml += printLine('</library_materials>', 1);						// export effects			xml += printLine('<library_effects>', 1);			xml += exportEffects(object, 2);			xml += printLine('</library_effects>', 1);						// export geometries			xml += printLine('<library_geometries>', 1);			xml += exportGeometries(object, 2);			xml += printLine('</library_geometries>', 1);						// export scenegraph			xml += printLine('<library_visual_scenes>', 1);			xml += printLine('<visual_scene id="'+VISUAL_SCENE_NAME+'" name="'+VISUAL_SCENE_NAME+'">', 2);			xml += exportVisualScene(object, 3);			xml += printLine('</visual_scene>', 2);			xml += printLine('</library_visual_scenes>', 1);						// export a default collada-scene			xml += printLine('<scene>', 1);			xml += printLine('<instance_visual_scene url="#'+VISUAL_SCENE_NAME+'" />', 2);			xml += printLine('</scene>', 1);						xml += printLine('</COLLADA>');			return xml;		}				/**		 * Exports the <color> element.		 * 		 * @param material		 * @param indent		 * 		 * @return XML string 		 */ 		private static function exportColor(material:MaterialObject3D=null, indent:int=0):String 		{			var rgba:Array = new Array();						if(material)			{				var color:uint = material is WireframeMaterial ? material.lineColor : material.fillColor;								var r:Number = ((color >> 16) & 0xff) / 0xff;				var g:Number = ((color >> 8) & 0xff) / 0xff;				var b:Number = (color & 0xff) / 0xff;								rgba.push(r.toFixed(FRACTION_DIGITS), g.toFixed(FRACTION_DIGITS), b.toFixed(FRACTION_DIGITS), 1.0);			}			else			{				rgba.push(0.0, 0.0, 0.0, 1.0);			}			return printLine('<color>' + rgba.join(" ") + '</color>', indent);		}				/**		 * Exports the <effect> elements.		 * 		 * @param object		 * @param indent		 * 		 * @return XML string 		 */ 		private static function exportEffects(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 ];								var textureId:String = _materialToImageId[material];								xml += printLine('<effect id="'+tgt+'-fx">', indent);				xml += printLine('<profile_COMMON>', indent+1);								if(textureId)				{					xml += printLine('<newparam sid="'+textureId+'-surface">', indent+2);        			xml += printLine('<surface type="2D">', indent+3);	        			xml += printLine('<init_from>'+textureId+'</init_from>', indent+4);	        			xml += printLine('<format>A8R8G8B8</format>', indent+4);	        			xml += printLine('</surface>', indent+3);	        			xml += printLine('</newparam>', indent+2);	        			        			xml += printLine('<newparam sid="'+textureId+'-sampler">', indent+2);        			xml += printLine('<sampler2D>', indent+3);	        			xml += printLine('<source>'+textureId+'-surface</source>', indent+4);	        			xml += printLine('<minfilter>LINEAR_MIPMAP_LINEAR</minfilter>', indent+4);        			xml += printLine('<magfilter>LINEAR</magfilter>', indent+4);        			xml += printLine('</sampler2D>', indent+3);        			xml += printLine('</newparam>', indent+2);					}								xml += printLine('<technique sid="common">', indent+2);				xml += printLine('<phong>', indent+3);								xml += printLine('<emission>', indent+4);				xml += exportColor(null, indent + 5);				xml += printLine('</emission>', indent+4);								xml += printLine('<ambient>', indent+4);				xml += exportColor(null, indent + 5);				xml += printLine('</ambient>', indent+4);								xml += printLine('<diffuse>', indent+4);				if(textureId)				{					xml += printLine('<texture texture="'+textureId+'-sampler" texcoord="TEX0">', indent+5);					xml += printLine('</texture>', indent+5);				}				else					xml += exportColor(material, indent + 5);				xml += printLine('</diffuse>', indent+4);								xml += printLine('<specular>', indent+4);				xml += exportColor(null, indent + 5);				xml += printLine('</specular>', indent+4);								xml += printLine('<shininess>', indent+4);				xml += printLine('<float>20.0</float>', indent+5);				xml += printLine('</shininess>', indent+4);								xml += printLine('<reflectivity>', indent+4);				xml += printLine('<float>20.0</float>', indent+5);				xml += printLine('</reflectivity>', indent+4);								xml += printLine('<transparent>', indent+4);				xml += printLine('<color>1 1 1 1</color>', indent+5);				xml += printLine('</transparent>', indent+4);								xml += printLine('<transparency>', indent+4);				xml += printLine('<float>1.0</float>', indent+5);				xml += printLine('</transparency>', indent+4);								xml += printLine('</phong>', indent+3);				xml += printLine('</technique>', indent+2);				xml += printLine('</profile_COMMON>', indent+1);				xml += printLine('</effect>', indent);			}						for each(var child:DisplayObject3D in object.children)				xml += exportEffects(child, indent);							return xml;		}				/**		 * Exports a <source> element with float data.		 * 		 * @param id		 * @param values		 * @param params		 * @param indent		 * 		 * @return XML String		 */ 		private static function exportFloatSource(id:String, values:Array, params:Array, indent:int = 0):String		{			var xml:String = printLine('<source id="' + id + '">', indent);						var fid:String = id + "-array";			var cnt:int = values.length;			var data:String = values.join(" ");			var i:int;						var line:String = '<float_array id="'+fid+'" count="'+cnt+'">' + data + '</float_array>';			xml += printLine(line, indent + 1);						xml += printLine('<technique_common>', indent + 1);						var stride:int = params.length;			cnt = cnt / stride;						xml += printLine('<accessor source="#'+fid+'" count="'+cnt+'" stride="'+stride+'">', indent + 2);						for(i = 0; i < params.length; i++)				xml += printLine('<param name="'+params[i]+'" type="float" />', indent + 3);						xml += printLine('</accessor>', indent + 2);			xml += printLine('</technique_common>', indent + 1);			xml += printLine('</source>', indent);			return xml;		}				/**		 * Export all geometries and child-geometries for a specific DisplayObject3D		 * 		 * @param instance		 * @param indent		 * 		 * @return XML string 		 */ 		private static function exportGeometries(instance:DisplayObject3D, indent:int=0):String		{			var xml:String = "";			if(instance is TriangleMesh3D)				xml += exportGeometry(instance as TriangleMesh3D, getInstanceName(instance)+"-geometry", indent);							for each(var child:DisplayObject3D in instance.children)				xml += exportGeometries(child, indent);							return xml;			}				/**		 * Exports a mesh's geometry as a Collada <geometry> element.		 * 		 * @param mesh		 * @param id		 * @param indent		 * 		 * @return XML string		 */ 		private static function exportGeometry(mesh:TriangleMesh3D, id:String, indent:int=0):String 		{			var xml:String = printLine('<geometry id="' + id + '" name="'+ id + '">', indent);			var tri:Triangle3D;

⌨️ 快捷键说明

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