package away3d.exporters { import flash.system.*; import flash.display.BitmapData; import flash.utils.Dictionary; import away3d.core.base.Vertex; import away3d.core.base.UV; import away3d.core.base.Mesh; import away3d.core.base.Geometry; import away3d.core.base.Object3D; import away3d.containers.ObjectContainer3D; import away3d.core.base.Face; import away3d.core.base.Frame; import away3d.core.math.Number3D; import away3d.arcane; import away3d.primitives.*; import away3d.materials.BitmapMaterial; import away3d.materials.WireframeMaterial; use namespace arcane; public class AS3Exporter { private var useMesh:Boolean; private var isAnim:Boolean; private var asString:String; private var containerString:String = ""; private var gcount:int = 0; private var objcount:int = 0; private var indV:int = 0; private var indVt:int = 0; private var indF:int = 0; private var MaV:Array = []; private var MaVt:Array = []; private var p1:RegExp = new RegExp("/0.0000/","g"); private var aTypes:Array = [Plane, Sphere, Cube, Cone, Cylinder, RegularPolygon, Torus, GeodesicSphere, Skybox, Skybox6, LineSegment, GridPlane, WireTorus, WireCircle, WireCone, WireCube, WireCylinder, WirePlane, WireSphere]; private function write(object3d:Object3D, isInContainer:Boolean):void { var mat:String = "null"; var nameinsert:String = (object3d.name == null)? "" : "name:\""+object3d.name+"\", "; var bothsidesinsert:String = ((object3d as Mesh).bothsides)? "bothsides:true, " : ""; var type:String = ""; for( var i:int = 0; i9){ var linemat:WireframeMaterial = ((object3d as Mesh).material as WireframeMaterial); var wirematinsert:String = " material: new WireframeMaterial(0x"+linemat.color.toString(16).toUpperCase()+", {width:"+linemat.width+"*_scale})"; } break; } } var xpos:String = (object3d.x == 0)? "0" : object3d.x+"*_scale"; var ypos:String = (object3d.y == 0)? "0" : object3d.y+"*_scale"; var zpos:String = (object3d.z == 0)? "0" : object3d.z+"*_scale"; if(type != ""){ var objname:String = ""+type.toLowerCase()+objcount; var constructinsert:String = "\n\t\t\tvar "+objname+":"+type+" = new "+type+"("; switch(type){ case "Sphere": asString += constructinsert+"{"+nameinsert+bothsidesinsert+"material:"+mat+", segmentsH:"+(object3d as aTypes[i]).segmentsH+", segmentsW:"+(object3d as aTypes[i]).segmentsW+", radius:"+(object3d as aTypes[i]).radius+"*_scale, yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "Plane": asString += constructinsert+"{"+nameinsert+bothsidesinsert+"material:"+mat+", segmentsH:"+(object3d as aTypes[i]).segmentsH+", segmentsW:"+(object3d as aTypes[i]).segmentsW+", width:"+(object3d as aTypes[i]).width+"*_scale, height:"+(object3d as aTypes[i]).height+"*_scale, yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "Cone": asString += constructinsert+"{"+nameinsert+bothsidesinsert+"material:"+mat+", segmentsH:"+(object3d as aTypes[i]).segmentsH+", segmentsW:"+(object3d as aTypes[i]).segmentsW+", radius:"+(object3d as aTypes[i]).radius+"*_scale, height:"+(object3d as aTypes[i]).height+", openEnded:"+(object3d as aTypes[i]).openEnded+", yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "Cube": asString += constructinsert+"{"+nameinsert+bothsidesinsert+"material:"+mat+", height:"+(object3d as aTypes[i]).height+"*_scale, depth:"+(object3d as aTypes[i]).depth+"*_scale, width:"+(object3d as aTypes[i]).width+"*_scale, yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "Cylinder": asString += constructinsert+"{"+nameinsert+bothsidesinsert+"material:"+mat+", segmentsH:"+(object3d as aTypes[i]).segmentsH+", segmentsW:"+(object3d as aTypes[i]).segmentsW+", radius:"+(object3d as aTypes[i]).radius+"*_scale, height:"+(object3d as aTypes[i]).height+"*_scale, openEnded:"+(object3d as aTypes[i]).openEnded+", yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "RegularPolygon": asString += constructinsert+"{"+nameinsert+bothsidesinsert+"material:"+mat+", radius:"+(object3d as aTypes[i]).radius+"*_scale, sides:"+(object3d as aTypes[i]).sides+", yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "Torus": asString += constructinsert+"{"+nameinsert+bothsidesinsert+"material:"+mat+", segmentsR:"+(object3d as aTypes[i]).segmentsR+", segmentsT:"+(object3d as aTypes[i]).segmentsT+", radius:"+(object3d as aTypes[i]).radius+"*_scale, tube:"+(object3d as aTypes[i]).tube+"*_scale, yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "LineSegment": var v0:Vertex = (object3d as aTypes[i]).start; var v1:Vertex = (object3d as aTypes[i]).end; asString += constructinsert+"{"+nameinsert+wirematinsert+"});\n\t\t\t"+objname+".start = new Vertex("+v0.x+"*_scale,"+v0.y+"*_scale,"+v0.z+"*_scale);\n\t\t\t"+objname+".end = new Vertex("+v1.x+"*_scale,"+v1.y+"*_scale,"+v1.z+"*_scale);"; break; case "WireTorus": asString += constructinsert+"{"+nameinsert+wirematinsert+", radius:"+(object3d as aTypes[i]).radius+"*_scale, tube:"+(object3d as aTypes[i]).tube+", segmentsR:"+(object3d as aTypes[i]).segmentsR+", segmentsT:"+(object3d as aTypes[i]).segmentsT+", yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "WireCircle": asString += constructinsert+"{"+nameinsert+wirematinsert+", radius:"+(object3d as aTypes[i]).radius+"*_scale, sides:"+(object3d as aTypes[i]).sides+", yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "WireCone": asString += constructinsert+"{"+nameinsert+wirematinsert+", radius:"+(object3d as aTypes[i]).radius+"*_scale, height:"+(object3d as aTypes[i]).height+"*_scale, segmentsW:"+(object3d as aTypes[i]).segmentsW+", segmentsH:"+(object3d as aTypes[i]).segmentsH+", yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "WireCube": asString += constructinsert+"{"+nameinsert+wirematinsert+", width:"+(object3d as aTypes[i]).width+"*_scale, height:"+(object3d as aTypes[i]).height+"*_scale, depth:"+(object3d as aTypes[i]).depth+"*_scale});"; break; case "WireCylinder": asString += constructinsert+"{"+nameinsert+wirematinsert+", radius:"+(object3d as aTypes[i]).radius+"*_scale, height:"+(object3d as aTypes[i]).height+"*_scale, segmentsW:"+(object3d as aTypes[i]).segmentsW+", segmentsH:"+(object3d as aTypes[i]).segmentsH+", yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "WirePlane": asString += constructinsert+"{"+nameinsert+wirematinsert+", width:"+(object3d as aTypes[i]).width+"*_scale, height:"+(object3d as aTypes[i]).height+"*_scale, segmentsW:"+(object3d as aTypes[i]).segmentsW+", segmentsH:"+(object3d as aTypes[i]).segmentsH+", yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "WireSphere": asString += constructinsert+"{"+nameinsert+wirematinsert+", radius:"+(object3d as aTypes[i]).radius+"*_scale, segmentsW:"+(object3d as aTypes[i]).segmentsW+", segmentsH:"+(object3d as aTypes[i]).segmentsH+", yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "GeodesicSphere": asString += constructinsert+"{"+nameinsert+bothsidesinsert+"material:"+mat+", radius:"+(object3d as aTypes[i]).radius+"*_scale, fractures:"+(object3d as aTypes[i]).fractures+"});"; break; case "GridPlane": asString += constructinsert+"{"+nameinsert+wirematinsert+", width:"+(object3d as aTypes[i]).width+"*_scale, height:"+(object3d as aTypes[i]).height+", segmentsW:"+(object3d as aTypes[i]).segmentsW+", segmentsH:"+(object3d as aTypes[i]).segmentsH+", yUp:"+(object3d as aTypes[i]).yUp+"});"; break; case "Skybox": asString += constructinsert+"null,null,null,null,null,null);"; break; case "Skybox6": asString += constructinsert+"null);"; break; } if((object3d as aTypes[i]).rotationX != 0) asString += "\n\t\t\t"+objname+".rotationX="+(object3d as aTypes[i]).rotationX+";"; if((object3d as aTypes[i]).rotationY != 0) asString += "\n\t\t\t"+objname+".rotationY="+(object3d as aTypes[i]).rotationY+";"; if((object3d as aTypes[i]).rotationZ != 0) asString += "\n\t\t\t"+objname+".rotationZ="+(object3d as aTypes[i]).rotationZ+";"; if((object3d as Mesh).pushfront) asString += "\n\t\t\t("+objname+" as Mesh).pushfront = true;"; if((object3d as Mesh).pushback) asString += "\n\t\t\t("+objname+" as Mesh).pushback = true;"; if((object3d as Mesh).ownCanvas) asString += "\n\t\t\t("+objname+" as Mesh).ownCanvas = true;"; asString += "\n\t\t\t"+objname+".position= new Number3D("+xpos+","+ypos+","+zpos+");"; asString += "\n\t\t\toList.push("+objname+");"; if(isInContainer){ asString += "\n\t\t\taC["+(gcount-1)+"].addChild("+objname+");\n"; } else{ asString += "\n\t\t\t_scene.addChild("+objname+");\n"; } } else { useMesh = true; var aV:Array = []; var aVt:Array = []; var aF:Array = []; asString +="\n\t\t\tobjs.obj"+objcount+" = {"+nameinsert+" rotations:new Number3D("+object3d.rotationX+","+object3d.rotationY+","+object3d.rotationZ+"), position:new Number3D("+xpos+","+ypos+","+zpos+"), container:"+((isInContainer)? gcount: "null")+", bothsides:"+(object3d as Mesh).bothsides+", material:"+mat+", ownCanvas:"+(object3d as Mesh).ownCanvas+", pushfront:"+(object3d as Mesh).pushfront+", pushback:"+(object3d as Mesh).pushback+"};"; var aFaces:Array = (object3d as Mesh).faces; var geometry:Geometry = (object3d as Mesh).geometry; var va:int; var vb:int; var vc:int; var vta:int; var vtb:int; var vtc:int; var nPos:Number3D = object3d.scenePosition; var tmp:Number3D = new Number3D(); var j:int; var aRef:Array = [vc, vb, va]; var animated:Boolean = (object3d as Mesh).geometry.frames != null; var face:Face; for(i = 0; i=48 && str.charCodeAt(i)<= 57 && str.charCodeAt(i)!= 48 ){ start = i; chunk = ""; while(str.charCodeAt(i)>=48 && str.charCodeAt(i)<= 57 && i<=charcount){ i++; } chunk = Number(str.substring(start, i)).toString(16); encstr+= chunk; i--; } else{ encstr+= str.substring(i, i+1); } } return encstr.replace(p1,"/0/"); } private function readVertexAnimation(obj:Mesh, id:String):void { isAnim = true; asString +="\n\t\t\tobjs.obj"+objcount+".meshanimated=true;\n"; var tmpnames:Array = []; var i:int = 0; var j:int = 0; var fr:Frame; var avp:Array; var afn:Array = []; //reset names in logical sequence for (var framename:String in obj.geometry.framenames){ tmpnames.push(framename); } tmpnames.sort(); var myPattern:RegExp = new RegExp(" ","g"); for (i = 0;i-1;--j){ ox = face["v"+j].x; oy = face["v"+j].y; oz = face["v"+j].z; ind = 0; face["v"+j].x = tmpval; face["v"+j].y = tmpval; face["v"+j].z = tmpval; for(k= 0;k