PageRenderTime 40ms CodeModel.GetById 25ms app.highlight 13ms RepoModel.GetById 0ms app.codeStats 0ms

/src/aerys/minko/type/parser/collada/resource/Geometry.as

https://bitbucket.org/HopeSky/mars_nd2d
ActionScript | 183 lines | 142 code | 35 blank | 6 comment | 13 complexity | 414a4f7e08fe70b223ee9e7a76e4f48a MD5 | raw file
  1package aerys.minko.type.parser.collada.resource
  2{
  3	import aerys.minko.Minko;
  4	import aerys.minko.ns.minko_collada;
  5	import aerys.minko.ns.minko_stream;
  6	import aerys.minko.render.geometry.GeometrySanitizer;
  7	import aerys.minko.render.geometry.stream.IndexStream;
  8	import aerys.minko.render.geometry.stream.VertexStream;
  9	import aerys.minko.render.geometry.stream.iterator.VertexIterator;
 10	import aerys.minko.render.geometry.stream.iterator.VertexReference;
 11	import aerys.minko.type.loader.parser.ParserOptions;
 12	import aerys.minko.type.parser.collada.ColladaDocument;
 13	import aerys.minko.type.parser.collada.helper.MeshTemplate;
 14	import aerys.minko.type.parser.collada.helper.Source;
 15	import aerys.minko.type.parser.collada.helper.Triangles;
 16	import aerys.minko.type.parser.collada.instance.IInstance;
 17	import aerys.minko.type.parser.collada.instance.InstanceGeometry;
 18	
 19	import flash.utils.ByteArray;
 20	
 21	public class Geometry implements IResource
 22	{
 23		use namespace minko_collada;
 24		
 25		private static const NS : Namespace = new Namespace("http://www.collada.org/2005/11/COLLADASchema");
 26		
 27		private var _document				: ColladaDocument;
 28		
 29		private var _id						: String;
 30		private var _name					: String;
 31		private var _verticesDataSemantics	: Vector.<String>;
 32		private var _verticesDataSources	: Object;
 33		private var _triangleStores			: Vector.<Triangles>;
 34		
 35		private var _meshTemplates			: Vector.<MeshTemplate>;
 36		
 37		public function get id() : String
 38		{
 39			return _id;
 40		}
 41		
 42		minko_collada function get verticesDataSemantics() : Vector.<String>
 43		{
 44			return _verticesDataSemantics;
 45		}
 46		
 47		minko_collada function get verticesDataSources() : Object
 48		{ 
 49			return _verticesDataSources; 
 50		}
 51		
 52		minko_collada function get triangleStores() : Vector.<Triangles>
 53		{
 54			return _triangleStores; 
 55		}
 56		
 57		public function get meshTemplates() : Vector.<MeshTemplate>
 58		{
 59			return _meshTemplates;
 60		}
 61		
 62		public static function fillStoreFromXML(xmlDocument	: XML,
 63												document	: ColladaDocument, 
 64												store		: Object) : void
 65		{
 66			var xmlGeometryLibrary	: XML		= xmlDocument..NS::library_geometries[0];
 67			
 68			if (xmlGeometryLibrary == null)
 69				return;
 70			
 71			var xmlGeometries		: XMLList	= xmlGeometryLibrary.NS::geometry;
 72			
 73			for each (var xmlGeometry : XML in xmlGeometries)
 74			{
 75				var geometry : Geometry = Geometry.createFromXML(xmlGeometry, document);
 76				
 77				if (geometry)
 78					store[geometry.id] = geometry;
 79			}
 80		}
 81		
 82		public static function createFromXML(xmlGeometry : XML, document : ColladaDocument) : Geometry
 83		{
 84			var newGeometry : Geometry = new Geometry();
 85			
 86			newGeometry._document				= document;
 87			newGeometry._id						= xmlGeometry.@id;
 88			newGeometry._name					= xmlGeometry.@name;
 89			
 90			newGeometry._verticesDataSemantics	= new <String>[];
 91			newGeometry._verticesDataSources	= new Object();
 92			newGeometry._triangleStores			= new <Triangles>[];
 93			
 94			var xmlMesh		: XML = xmlGeometry.NS::mesh[0];
 95			
 96			if (!xmlMesh)
 97			{
 98				Minko.log(0, 'Unsupported geometry: \'' + newGeometry._name + '\'.');
 99				
100				return null;
101			}
102			
103			var xmlVertices	: XML = xmlMesh.NS::vertices[0];
104			
105			for each (var input : XML in xmlVertices.NS::input)
106			{
107				var semantic	: String	= String(input.@semantic);
108				var sourceId	: String	= String(input.@source).substr(1);
109				var xmlSource	: XML		= xmlMesh..NS::source.(@id == sourceId)[0];
110				var source		: Source	= Source.createFromXML(xmlSource);
111				
112				newGeometry._verticesDataSemantics.push(semantic);
113				newGeometry._verticesDataSources[semantic] = source;
114			}
115			
116			for each (var child : XML in xmlMesh.children())
117				switch (child.localName())
118				{
119					case 'lines':
120					case 'linestrips':
121					case 'polygons':
122					case 'polylist':
123					case 'triangles':
124					case 'trifans':
125					case 'tristrips':
126						newGeometry._triangleStores.push(new Triangles(child, xmlMesh));
127						break;
128				}
129			
130			return newGeometry;
131		}
132		
133		public function createInstance() : IInstance
134		{
135			return new InstanceGeometry(_document, _id); 
136		}
137		
138		/**
139		 * Generates a vector of MeshTemplate. One instance per triangle store under
140		 * this geometry.
141		 * 
142		 * @param options
143		 */
144		public function computeMeshTemplates(options : ParserOptions, fast : Boolean = false) : void
145		{
146			if (_meshTemplates != null)
147				return;
148			
149			_meshTemplates = new <MeshTemplate>[];
150			
151			for each (var triangleStore : Triangles in _triangleStores)
152			{
153				var materialName	: String = triangleStore.material;
154				var indexData		: Vector.<uint>;
155				var vertexStream	: VertexStream;
156				
157				if (fast)
158				{
159					indexData		= triangleStore.fastComputeIndexStream(_verticesDataSemantics, _verticesDataSources);
160					vertexStream	= triangleStore.fastComputeVertexStream(_verticesDataSemantics, _verticesDataSources);
161				}
162				else
163				{
164					indexData		= triangleStore.computeIndexStream();
165					vertexStream	= triangleStore.computeVertexStream(_verticesDataSemantics, _verticesDataSources);
166				}
167				
168				var vertexData		: ByteArray	= vertexStream.minko_stream::_data;
169				var dwordsPerVertex	: uint		= vertexStream.format.numBytesPerVertex;
170				
171				var meshTemplate	: MeshTemplate	= new MeshTemplate(
172					_name, 
173					vertexData,
174					indexData,
175					materialName,
176					vertexStream.format
177				);
178				
179				_meshTemplates.push(meshTemplate);
180			}
181		}
182	}
183}