// forked from XELF's Polygon Mesh from XML // Polygon Mesh Drawing from XM File (subset) by XELF 2009 // XM : (XELF's Original 3D Model XML Format) package { import flash.events.Event; import flash.display.Sprite; import flash.display.BitmapData; import flash.filters.DisplacementMapFilter; import flash.geom.Point; import flash.text.*; [SWF(width="465", height="465", backgroundColor="0x8080FF", frameRate="30")] public class Polygon extends Sprite { private var perlinBmp:BitmapData; private var mesh:Mesh; private var model:Model; private var text:TextField; public function Polygon() { addEventListener(Event.ENTER_FRAME, draw); text = new TextField(); text.autoSize = TextFieldAutoSize.LEFT; addChild(text); //text.text = model.Faces[0].Vertices[1].Index.toString(); try { model = Model.CreateFromDocument(TestDocument.Document.Meshes.Mesh[0]); mesh = Mesh.CreateFromModel(model); } catch(e:Error) { text.text = e.toString(); } perlinBmp = new BitmapData(256, 256); perlinBmp.perlinNoise(256, 256, 10, Math.round(Math.random() * 100000), false, true, 1, false); var displacementMap:DisplacementMapFilter = new DisplacementMapFilter(perlinBmp, new Point(0, 0), 1, 1, 100, 100, "color", 1); } private function draw(e:Event) : void { mesh.Draw(graphics, perlinBmp); } } } import flash.display.*; class Vector2 { public var X:Number; public var Y:Number; public static function Parse(value:String):Vector2 { var elements:Array = value.split(','); var result:Vector2 = new Vector2(); result.X = parseFloat(elements[0]); result.Y = parseFloat(elements[1]); return result; } } class Vector3 { public var X:Number; public var Y:Number; public var Z:Number; public static function Parse(value:String):Vector3 { var elements:Array = value.split(','); var result:Vector3 = new Vector3(); result.X = parseFloat(elements[0]); result.Y = parseFloat(elements[1]); result.Z = parseFloat(elements[2]); return result; } } class FaceVertex { public var Index:int; public var TexCoord:Vector2; public static function Parse(xml:XML):FaceVertex { var result:FaceVertex = new FaceVertex(); result.Index = parseInt(xml.@Vertex); result.TexCoord = Vector2.Parse(xml.@TexCoord); return result; } } class Face { public var Vertices:Vector.<FaceVertex>; public static function Parse(xml:XML):Face { var result:Face = new Face(); result.Vertices = new Vector.<FaceVertex>(xml.FaceVertex.length()); for (var i:int = 0; i < result.Vertices.length; i++) { result.Vertices[i] = FaceVertex.Parse(xml.FaceVertex[i]); } return result; } } class Model { public var Vertices:Vector.<Vector3>; public var Faces:Vector.<Face>; public static function CreateFromDocument(document:XML):Model { var result:Model = new Model(); result.Vertices = new Vector.<Vector3>(document.Vertices.Vertex.length()); for (var i:int = 0; i < result.Vertices.length; i++) { result.Vertices[i] = Vector3.Parse(document.Vertices.Vertex[i].@Position); } result.Faces = new Vector.<Face>(document.Faces.Face.length()); for (i = 0; i < result.Faces.length; i++) { result.Faces[i] = Face.Parse(document.Faces.Face[i]); } return result; } } class Vertex { public var Position:Vector3; public var TexCoord:Vector2; } class Mesh { public var Vertices:Vector.<Vertex>; public var Indices:Vector.<int>; protected var v:Vector.<Number>; protected var t:Vector.<Number>; public static function CreateFromModel(model:Model):Mesh { var result:Mesh = new Mesh(); result.Indices = new Vector.<int>(); result.Vertices = new Vector.<Vertex>(); var vn:int = 0; for each (var face:Face in model.Faces) { var n:int = face.Vertices.length; if (n >= 3) { var a:int = face.Vertices[0].Index; for (var i:int = 2; i < n; i++) { var b:int = face.Vertices[i - 1].Index; var c:int = face.Vertices[i ].Index; result.Indices.push(vn, vn + 1, vn + 2); var va:Vertex = new Vertex(); var vb:Vertex = new Vertex(); var vc:Vertex = new Vertex(); va.Position = model.Vertices[a]; vb.Position = model.Vertices[b]; vc.Position = model.Vertices[c]; va.TexCoord = face.Vertices[a].TexCoord; vb.TexCoord = face.Vertices[b].TexCoord; vc.TexCoord = face.Vertices[c].TexCoord; result.Vertices.push(va, vb, vc); vn += 3; } } } result.v = new Vector.<Number>(result.Vertices.length * 2); result.t = new Vector.<Number>(result.Vertices.length * 3); return result; } public function Draw(graphics:Graphics, texture:BitmapData):void { v.length = 0; t.length = 0; for (var i:int = 0; i < Vertices.length; i++) { v.push(Vertices[i].Position.X, Vertices[i].Position.Y); t.push(Vertices[i].TexCoord.X, Vertices[i].TexCoord.Y, Vertices[i].Position.Z); } graphics.clear(); graphics.beginBitmapFill(texture); graphics.drawTriangles(v, Indices, t); graphics.endFill(); } } class TestDocument { public static var Document:XML = <Model> <Materials><Material/></Materials> <Meshes> <Mesh Name=""> <Vertices> <Vertex Position="100,200,300"/> <Vertex Position="300,400,200"/> <Vertex Position="200,100,250"/> <Vertex Position="350,250,150"/> </Vertices> <Faces> <Face Material="0"> <FaceVertex Vertex="0" TexCoord="0,0"/> <FaceVertex Vertex="1" TexCoord="1,0"/> <FaceVertex Vertex="3" TexCoord="0,1"/> <FaceVertex Vertex="2" TexCoord="1,1"/> </Face> </Faces> </Mesh> </Meshes> </Model>; } forked from: Polygon Mesh from XML