/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

  1. package 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. import flash.utils.ByteArray;
  19. public class Geometry implements IResource
  20. {
  21. use namespace minko_collada;
  22. private static const NS : Namespace = new Namespace("http://www.collada.org/2005/11/COLLADASchema");
  23. private var _document : ColladaDocument;
  24. private var _id : String;
  25. private var _name : String;
  26. private var _verticesDataSemantics : Vector.<String>;
  27. private var _verticesDataSources : Object;
  28. private var _triangleStores : Vector.<Triangles>;
  29. private var _meshTemplates : Vector.<MeshTemplate>;
  30. public function get id() : String
  31. {
  32. return _id;
  33. }
  34. minko_collada function get verticesDataSemantics() : Vector.<String>
  35. {
  36. return _verticesDataSemantics;
  37. }
  38. minko_collada function get verticesDataSources() : Object
  39. {
  40. return _verticesDataSources;
  41. }
  42. minko_collada function get triangleStores() : Vector.<Triangles>
  43. {
  44. return _triangleStores;
  45. }
  46. public function get meshTemplates() : Vector.<MeshTemplate>
  47. {
  48. return _meshTemplates;
  49. }
  50. public static function fillStoreFromXML(xmlDocument : XML,
  51. document : ColladaDocument,
  52. store : Object) : void
  53. {
  54. var xmlGeometryLibrary : XML = xmlDocument..NS::library_geometries[0];
  55. if (xmlGeometryLibrary == null)
  56. return;
  57. var xmlGeometries : XMLList = xmlGeometryLibrary.NS::geometry;
  58. for each (var xmlGeometry : XML in xmlGeometries)
  59. {
  60. var geometry : Geometry = Geometry.createFromXML(xmlGeometry, document);
  61. if (geometry)
  62. store[geometry.id] = geometry;
  63. }
  64. }
  65. public static function createFromXML(xmlGeometry : XML, document : ColladaDocument) : Geometry
  66. {
  67. var newGeometry : Geometry = new Geometry();
  68. newGeometry._document = document;
  69. newGeometry._id = xmlGeometry.@id;
  70. newGeometry._name = xmlGeometry.@name;
  71. newGeometry._verticesDataSemantics = new <String>[];
  72. newGeometry._verticesDataSources = new Object();
  73. newGeometry._triangleStores = new <Triangles>[];
  74. var xmlMesh : XML = xmlGeometry.NS::mesh[0];
  75. if (!xmlMesh)
  76. {
  77. Minko.log(0, 'Unsupported geometry: \'' + newGeometry._name + '\'.');
  78. return null;
  79. }
  80. var xmlVertices : XML = xmlMesh.NS::vertices[0];
  81. for each (var input : XML in xmlVertices.NS::input)
  82. {
  83. var semantic : String = String(input.@semantic);
  84. var sourceId : String = String(input.@source).substr(1);
  85. var xmlSource : XML = xmlMesh..NS::source.(@id == sourceId)[0];
  86. var source : Source = Source.createFromXML(xmlSource);
  87. newGeometry._verticesDataSemantics.push(semantic);
  88. newGeometry._verticesDataSources[semantic] = source;
  89. }
  90. for each (var child : XML in xmlMesh.children())
  91. switch (child.localName())
  92. {
  93. case 'lines':
  94. case 'linestrips':
  95. case 'polygons':
  96. case 'polylist':
  97. case 'triangles':
  98. case 'trifans':
  99. case 'tristrips':
  100. newGeometry._triangleStores.push(new Triangles(child, xmlMesh));
  101. break;
  102. }
  103. return newGeometry;
  104. }
  105. public function createInstance() : IInstance
  106. {
  107. return new InstanceGeometry(_document, _id);
  108. }
  109. /**
  110. * Generates a vector of MeshTemplate. One instance per triangle store under
  111. * this geometry.
  112. *
  113. * @param options
  114. */
  115. public function computeMeshTemplates(options : ParserOptions, fast : Boolean = false) : void
  116. {
  117. if (_meshTemplates != null)
  118. return;
  119. _meshTemplates = new <MeshTemplate>[];
  120. for each (var triangleStore : Triangles in _triangleStores)
  121. {
  122. var materialName : String = triangleStore.material;
  123. var indexData : Vector.<uint>;
  124. var vertexStream : VertexStream;
  125. if (fast)
  126. {
  127. indexData = triangleStore.fastComputeIndexStream(_verticesDataSemantics, _verticesDataSources);
  128. vertexStream = triangleStore.fastComputeVertexStream(_verticesDataSemantics, _verticesDataSources);
  129. }
  130. else
  131. {
  132. indexData = triangleStore.computeIndexStream();
  133. vertexStream = triangleStore.computeVertexStream(_verticesDataSemantics, _verticesDataSources);
  134. }
  135. var vertexData : ByteArray = vertexStream.minko_stream::_data;
  136. var dwordsPerVertex : uint = vertexStream.format.numBytesPerVertex;
  137. var meshTemplate : MeshTemplate = new MeshTemplate(
  138. _name,
  139. vertexData,
  140. indexData,
  141. materialName,
  142. vertexStream.format
  143. );
  144. _meshTemplates.push(meshTemplate);
  145. }
  146. }
  147. }
  148. }