topical media & game development
student-ar-org-papervision3d-core-proto-GeometryObject3D.ax
student-ar-org-papervision3d-core-proto-GeometryObject3D.ax
[swf]
[flash]
flex
package org.papervision3d.core.proto
{
import flash.events.EventDispatcher;
import flash.utils.Dictionary;
import org.papervision3d.core.geom.renderables.Triangle3D;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.core.math.AxisAlignedBoundingBox;
import org.papervision3d.core.math.BoundingSphere;
import org.papervision3d.core.math.Matrix3D;
import org.papervision3d.objects.DisplayObject3D;
The @ax-student-ar-org-papervision3d-core-proto-GeometryObject3D class contains the mesh definition of an object.
public class @ax-student-ar-org-papervision3d-core-proto-GeometryObject3D extends EventDispatcher
{
protected var _boundingSphere:BoundingSphere;
protected var _boundingSphereDirty :Boolean = true;
protected var _aabb:AxisAlignedBoundingBox;
protected var _aabbDirty:Boolean = true;
private var _numInstances:uint = 0; // TODO - pretty sure this is never used... obsolete?
public var dirty:Boolean;
An array of Face3D objects for the faces of the mesh.
public var faces:Array;
An array of vertices.
public var vertices :Array;
public var _ready:Boolean = false;
public function @ax-student-ar-org-papervision3d-core-proto-GeometryObject3D( ):void
{
dirty = true;
}
public function transformVertices(transformation:Matrix3D ):void
{
var m11 :Number = transformation.n11,
m12 :Number = transformation.n12,
m13 :Number = transformation.n13,
m21 :Number = transformation.n21,
m22 :Number = transformation.n22,
m23 :Number = transformation.n23,
m31 :Number = transformation.n31,
m32 :Number = transformation.n32,
m33 :Number = transformation.n33,
m14 :Number = transformation.n14,
m24 :Number = transformation.n24,
m34 :Number = transformation.n34,
i :int = vertices.length,
vertex :org.papervision3d.core.geom.renderables.Vertex3D;
while( vertex = vertices[--i] )
{
// Center position
var vx :Number = vertex.x;
var vy :Number = vertex.y;
var vz :Number = vertex.z;
var tx :Number = vx * m11 + vy * m12 + vz * m13 + m14;
var ty :Number = vx * m21 + vy * m22 + vz * m23 + m24;
var tz :Number = vx * m31 + vy * m32 + vz * m33 + m34;
vertex.x = tx;
vertex.y = ty;
vertex.z = tz;
}
}
public function transformUV( material:MaterialObject3D ):void
{
if( material.bitmap )
for( var i:String in this.faces )
faces[i].transformUV( material );
}
private function createVertexNormals():void
{
var tempVertices:Dictionary = new Dictionary(true);
var face:Triangle3D;
var vertex3D:Vertex3D;
for each(face in faces){
face.v0.connectedFaces[face] = face;
face.v1.connectedFaces[face] = face;
face.v2.connectedFaces[face] = face;
tempVertices[face.v0] = face.v0;
tempVertices[face.v1] = face.v1;
tempVertices[face.v2] = face.v2;
}
for each (vertex3D in tempVertices){
vertex3D.calculateNormal();
}
}
public function set ready(b:Boolean):void
{
if(b){
createVertexNormals();
this.dirty = false;
}
_ready = b;
}
public function get ready():Boolean
{
return _ready;
}
Radius square of the mesh bounding sphere
public function get boundingSphere():BoundingSphere
{
if( _boundingSphereDirty ){
_boundingSphere = BoundingSphere.getFromVertices(vertices);
_boundingSphereDirty = false;
}
return _boundingSphere;
}
Returns an axis aligned bounding box, not world oriented.
@Author Ralph Hauwert - Added as an initial test.
public function get aabb():AxisAlignedBoundingBox
{
if(_aabbDirty){
_aabb = AxisAlignedBoundingBox.createFromVertices(vertices);
_aabbDirty = false;
}
return _aabb;
}
Clones this object.
@param parent
@return The cloned @ax-student-ar-org-papervision3d-core-proto-GeometryObject3D.
public function clone(parent:DisplayObject3D = null):@ax-student-ar-org-papervision3d-core-proto-GeometryObject3D
{
var materials:Dictionary = new Dictionary(true);
var verts:Dictionary = new Dictionary(true);
var geom:@ax-student-ar-org-papervision3d-core-proto-GeometryObject3D = new @ax-student-ar-org-papervision3d-core-proto-GeometryObject3D();
var i:int;
geom.vertices = new Array();
geom.faces = new Array();
// clone vertices
for(i = 0; i < this.vertices.length; i++)
{
var v:Vertex3D = this.vertices[i];
verts[ v ] = v.clone();
geom.vertices.push(verts[v]);
}
// clone triangles
for(i = 0; i < this.faces.length; i++)
{
var f:Triangle3D = this.faces[i];
var v0:Vertex3D = verts[ f.v0 ];
var v1:Vertex3D = verts[ f.v1 ];
var v2:Vertex3D = verts[ f.v2 ];
geom.faces.push(new Triangle3D(parent, [v0, v1, v2], f.material, f.uv));
materials[ f.material ] = f.material;
}
for each(var material:MaterialObject3D in materials)
material.registerObject(parent);
return geom;
}
Flips the winding of faces.
public function flipFaces():void
{
for each(var f:Triangle3D in this.faces)
{
var tmp:Vertex3D = f.v0;
f.v0 = f.v2;
f.v2 = tmp;
f.uv = [f.uv2, f.uv1, f.uv0];
f.createNormal();
}
this.ready = true;
}
}
}
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.