package away3d.extrusions { import away3d.core.math.*; import away3d.containers.*; import away3d.core.base.*; import away3d.materials.*; import away3d.core.utils.*; import flash.geom.Point; public class Lathe extends Mesh { private var varr:Array = new Array(); private var varr2:Array = new Array(); private var uvarr:Array = new Array(); public function Lathe(aPoints:Array, init:Object = null) { if (init.material != null) { init.materials = {defaultmaterial:init.material}; } if (init.material == null && init.materials != null) { init.material = init.materials.defaultmaterial; } super(init); var axis:String = ini.getString("axis", "y"); var rotations:Number = ini.getNumber("rotations", 1, {min:0.01}); var subdivision:int = ini.getInt("subdivision", 2, {min:2}); var offsetradius:int = ini.getNumber("offsetradius", 0); var scaling:Number = ini.getNumber("scaling", 1); var omat:Object = ini.getObject("materials", null); var omit:String = ini.getString("omit", ""); var tweek:Object = ini.getObject("tweek", null); var thickness:Number = ini.getNumber("thickness", 0, {min:0}); var coverall:Boolean = ini.getBoolean("coverall", true); var recenter:Boolean = ini.getBoolean("recenter", false); var flip:Boolean = ini.getBoolean("flip", false); if (scaling != 1) { for (var i:int = 0; i < aPoints.length; i++) { aPoints[i].x *= scaling; aPoints[i].y *= scaling; aPoints[i].z *= scaling; } } if (aPoints.length > 1) { tweek = (tweek == null)? {x:0, y:0, z:0, radius:0, rotation:0} : tweek; if (thickness != 0) { var prop1:String; var prop2:String; var prop3:String; switch (axis) { case "x" : prop1 = "x"; prop2 = "z"; prop3 = "y"; break; case "y" : prop1 = "y"; prop2 = "x"; prop3 = "z"; break; case "z" : prop1 = "z"; prop2 = "y"; prop3 = "x"; } var Lines:Array = buildThicknessPoints(aPoints, thickness, prop1, prop2); generateWithThickness(aPoints, Lines, axis, prop1, prop2, prop3, offsetradius, rotations, subdivision, tweek, coverall, omat, omit, flip); } else { generate(aPoints, axis, offsetradius, rotations, subdivision, tweek, coverall, flip); } } else { trace("Lathe error: at least 2 number3D are required!"); } varr = null; varr2 = null; uvarr = null; if (recenter) { applyPosition( (this.minX+this.maxX)*.5, (this.minY+this.maxY)*.5, (this.minZ+this.maxZ)*.5); } else { x = aPoints[0].x; y = aPoints[0].y; z = aPoints[0].z; } type = "Lathe"; url = "Extrude"; } private function generateWithThickness(points:Array, Lines:Array, axis:String, prop1:String, prop2:String, prop3:String, offsetradius:Number, rotations:Number, subdivision:Number, tweek:Object, coverall:Boolean, oMat:Object = null, omit:String = "", flip:Boolean = false):void { var i:int; var j:int; var aListsides:Array = ["top","bottom", "right", "left", "front", "back"]; var oRenderside:Object = {}; for(i = 0;i0) { var uva:UV = uvarr[i + (index + 1)]; var uvb:UV = uvarr[i + index]; var uvc:UV = uvarr[i + index + aPoints.length]; var uvd:UV = uvarr[i + index + aPoints.length + 1]; var facea:Vertex = new Vertex(varr[i + (index + 1)].x,varr[i + (index + 1)].y,varr[i + (index + 1)].z); var faceb:Vertex = new Vertex(varr[i + index].x, varr[i + index].y, varr[i + index].z); var facec:Vertex = new Vertex(varr[i + index + aPoints.length].x, varr[i + index + aPoints.length].y, varr[i + index + aPoints.length].z); var faced:Vertex = new Vertex(varr[i + index + aPoints.length + 1].x, varr[i + index + aPoints.length + 1].y, varr[i + index + aPoints.length + 1].z); if (flip) { if (inside) { addFace( new Face(faceb, facea, facec, mat, new UV(1-uvb.u, uvb.v), new UV(1-uva.u, uva.v), new UV(1-uvc.u, uvc.v) ) ); addFace( new Face(facec, facea, faced, mat, new UV(1-uvc.u, uvc.v), new UV(1-uva.u, uva.v), new UV(1-uvd.u, uvd.v) ) ); } else { addFace( new Face(facea, faceb, facec, mat, uva, uvb, uvc ) ); addFace( new Face(facea, facec, faced, mat, uva, uvc, uvd ) ); } } else { if (inside) { addFace( new Face(facea, faceb, facec, mat, new UV(1-uva.u, uva.v), new UV(1-uvb.u, uvb.v), new UV(1-uvc.u, uvc.v) ) ); addFace( new Face(facea, facec, faced, mat, new UV(1-uva.u, uva.v), new UV(1-uvc.u, uvc.v), new UV(1-uvd.u, uvd.v) ) ); } else { addFace( new Face(faceb, facea, facec, mat, uvb, uva, uvc ) ); addFace( new Face(facec, facea, faced, mat, uvc, uva, uvd ) ); } } } index++; } } } } // private function buildThicknessPoints(aPoints:Array, thickness:Number, prop1:String, prop2:String):Array { var Anchors:Array = new Array(); var Lines:Array = new Array(); var i:int; for( i = 0;i1){ for(i = 0;i