📄 exportcollada.as
字号:
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 + -