home *** CD-ROM | disk | FTP | other *** search
- package Box2D.Collision.Shapes
- {
- import Box2D.Collision.*;
- import Box2D.Common.*;
- import Box2D.Common.Math.*;
- import Box2D.Dynamics.*;
-
- public class b2PolyShape extends b2Shape
- {
-
- private static var tempVec:b2Vec2 = new b2Vec2();
-
- private static var tAbsR:b2Mat22 = new b2Mat22();
-
-
- public var m_vertexCount:int;
-
- private var syncMat:b2Mat22;
-
- public var m_vertices:Array;
-
- public var m_coreVertices:Array;
-
- public var m_localCentroid:b2Vec2;
-
- public var m_normals:Array;
-
- private var syncAABB:b2AABB;
-
- public var m_localOBB:b2OBB;
-
- public function b2PolyShape(param1:b2ShapeDef, param2:b2Body, param3:b2Vec2)
- {
- var _loc4_:int = 0;
- var _loc5_:Number = NaN;
- var _loc6_:Number = NaN;
- var _loc7_:b2Vec2 = null;
- var _loc8_:b2AABB = null;
- var _loc9_:b2Mat22 = null;
- var _loc14_:int = 0;
- var _loc15_:int = 0;
- var _loc19_:b2BoxDef = null;
- var _loc20_:Number = NaN;
- var _loc21_:Number = NaN;
- var _loc22_:b2PolyDef = null;
- var _loc23_:Number = NaN;
- var _loc24_:Number = NaN;
- var _loc25_:Number = NaN;
- var _loc26_:Number = NaN;
- var _loc27_:Number = NaN;
- var _loc28_:b2Vec2 = null;
- syncAABB = new b2AABB();
- syncMat = new b2Mat22();
- m_localCentroid = new b2Vec2();
- m_localOBB = new b2OBB();
- super(param1,param2);
- _loc8_ = new b2AABB();
- m_vertices = new Array(b2Settings.b2_maxPolyVertices);
- m_coreVertices = new Array(b2Settings.b2_maxPolyVertices);
- m_normals = new Array(b2Settings.b2_maxPolyVertices);
- m_type = b2Shape.e_polyShape;
- _loc9_ = new b2Mat22(param1.localRotation);
- if(param1.type == b2Shape.e_boxShape)
- {
- m_localCentroid.x = param1.localPosition.x - param3.x;
- m_localCentroid.y = param1.localPosition.y - param3.y;
- _loc19_ = param1 as b2BoxDef;
- m_vertexCount = 4;
- _loc5_ = _loc19_.extents.x;
- _loc6_ = _loc19_.extents.y;
- _loc20_ = Math.max(0,_loc5_ - 2 * b2Settings.b2_linearSlop);
- _loc21_ = Math.max(0,_loc6_ - 2 * b2Settings.b2_linearSlop);
- (_loc7_ = m_vertices[0] = new b2Vec2()).x = _loc9_.col1.x * _loc5_ + _loc9_.col2.x * _loc6_;
- _loc7_.y = _loc9_.col1.y * _loc5_ + _loc9_.col2.y * _loc6_;
- (_loc7_ = m_vertices[1] = new b2Vec2()).x = _loc9_.col1.x * -_loc5_ + _loc9_.col2.x * _loc6_;
- _loc7_.y = _loc9_.col1.y * -_loc5_ + _loc9_.col2.y * _loc6_;
- (_loc7_ = m_vertices[2] = new b2Vec2()).x = _loc9_.col1.x * -_loc5_ + _loc9_.col2.x * -_loc6_;
- _loc7_.y = _loc9_.col1.y * -_loc5_ + _loc9_.col2.y * -_loc6_;
- (_loc7_ = m_vertices[3] = new b2Vec2()).x = _loc9_.col1.x * _loc5_ + _loc9_.col2.x * -_loc6_;
- _loc7_.y = _loc9_.col1.y * _loc5_ + _loc9_.col2.y * -_loc6_;
- (_loc7_ = m_coreVertices[0] = new b2Vec2()).x = _loc9_.col1.x * _loc20_ + _loc9_.col2.x * _loc21_;
- _loc7_.y = _loc9_.col1.y * _loc20_ + _loc9_.col2.y * _loc21_;
- (_loc7_ = m_coreVertices[1] = new b2Vec2()).x = _loc9_.col1.x * -_loc20_ + _loc9_.col2.x * _loc21_;
- _loc7_.y = _loc9_.col1.y * -_loc20_ + _loc9_.col2.y * _loc21_;
- (_loc7_ = m_coreVertices[2] = new b2Vec2()).x = _loc9_.col1.x * -_loc20_ + _loc9_.col2.x * -_loc21_;
- _loc7_.y = _loc9_.col1.y * -_loc20_ + _loc9_.col2.y * -_loc21_;
- (_loc7_ = m_coreVertices[3] = new b2Vec2()).x = _loc9_.col1.x * _loc20_ + _loc9_.col2.x * -_loc21_;
- _loc7_.y = _loc9_.col1.y * _loc20_ + _loc9_.col2.y * -_loc21_;
- }
- else
- {
- _loc22_ = param1 as b2PolyDef;
- m_vertexCount = _loc22_.vertexCount;
- PolyCentroid(_loc22_.vertices,_loc22_.vertexCount,tempVec);
- _loc23_ = tempVec.x;
- _loc24_ = tempVec.y;
- m_localCentroid.x = param1.localPosition.x + (_loc9_.col1.x * _loc23_ + _loc9_.col2.x * _loc24_) - param3.x;
- m_localCentroid.y = param1.localPosition.y + (_loc9_.col1.y * _loc23_ + _loc9_.col2.y * _loc24_) - param3.y;
- _loc4_ = 0;
- while(_loc4_ < m_vertexCount)
- {
- m_vertices[_loc4_] = new b2Vec2();
- m_coreVertices[_loc4_] = new b2Vec2();
- _loc5_ = _loc22_.vertices[_loc4_].x - _loc23_;
- _loc6_ = _loc22_.vertices[_loc4_].y - _loc24_;
- m_vertices[_loc4_].x = _loc9_.col1.x * _loc5_ + _loc9_.col2.x * _loc6_;
- m_vertices[_loc4_].y = _loc9_.col1.y * _loc5_ + _loc9_.col2.y * _loc6_;
- _loc25_ = Number(m_vertices[_loc4_].x);
- _loc26_ = Number(m_vertices[_loc4_].y);
- if((_loc27_ = Math.sqrt(_loc25_ * _loc25_ + _loc26_ * _loc26_)) > Number.MIN_VALUE)
- {
- _loc25_ *= 1 / _loc27_;
- _loc26_ *= 1 / _loc27_;
- }
- m_coreVertices[_loc4_].x = m_vertices[_loc4_].x - 2 * b2Settings.b2_linearSlop * _loc25_;
- m_coreVertices[_loc4_].y = m_vertices[_loc4_].y - 2 * b2Settings.b2_linearSlop * _loc26_;
- _loc4_++;
- }
- }
- var _loc10_:Number = Number.MAX_VALUE;
- var _loc11_:Number = Number.MAX_VALUE;
- var _loc12_:Number = -Number.MAX_VALUE;
- var _loc13_:Number = -Number.MAX_VALUE;
- m_maxRadius = 0;
- _loc4_ = 0;
- while(_loc4_ < m_vertexCount)
- {
- _loc28_ = m_vertices[_loc4_];
- _loc10_ = Math.min(_loc10_,_loc28_.x);
- _loc11_ = Math.min(_loc11_,_loc28_.y);
- _loc12_ = Math.max(_loc12_,_loc28_.x);
- _loc13_ = Math.max(_loc13_,_loc28_.y);
- m_maxRadius = Math.max(m_maxRadius,_loc28_.Length());
- _loc4_++;
- }
- m_localOBB.R.SetIdentity();
- m_localOBB.center.Set((_loc10_ + _loc12_) * 0.5,(_loc11_ + _loc13_) * 0.5);
- m_localOBB.extents.Set((_loc12_ - _loc10_) * 0.5,(_loc13_ - _loc11_) * 0.5);
- _loc4_ = 0;
- while(_loc4_ < m_vertexCount)
- {
- m_normals[_loc4_] = new b2Vec2();
- _loc14_ = _loc4_;
- _loc15_ = _loc4_ + 1 < m_vertexCount ? _loc4_ + 1 : 0;
- m_normals[_loc4_].x = m_vertices[_loc15_].y - m_vertices[_loc14_].y;
- m_normals[_loc4_].y = -(m_vertices[_loc15_].x - m_vertices[_loc14_].x);
- m_normals[_loc4_].Normalize();
- _loc4_++;
- }
- _loc4_ = 0;
- while(_loc4_ < m_vertexCount)
- {
- _loc14_ = _loc4_;
- _loc15_ = _loc4_ + 1 < m_vertexCount ? _loc4_ + 1 : 0;
- _loc4_++;
- }
- m_R.SetM(m_body.m_R);
- m_position.x = m_body.m_position.x + (m_R.col1.x * m_localCentroid.x + m_R.col2.x * m_localCentroid.y);
- m_position.y = m_body.m_position.y + (m_R.col1.y * m_localCentroid.x + m_R.col2.y * m_localCentroid.y);
- tAbsR.col1.x = m_R.col1.x * m_localOBB.R.col1.x + m_R.col2.x * m_localOBB.R.col1.y;
- tAbsR.col1.y = m_R.col1.y * m_localOBB.R.col1.x + m_R.col2.y * m_localOBB.R.col1.y;
- tAbsR.col2.x = m_R.col1.x * m_localOBB.R.col2.x + m_R.col2.x * m_localOBB.R.col2.y;
- tAbsR.col2.y = m_R.col1.y * m_localOBB.R.col2.x + m_R.col2.y * m_localOBB.R.col2.y;
- tAbsR.Abs();
- _loc5_ = tAbsR.col1.x * m_localOBB.extents.x + tAbsR.col2.x * m_localOBB.extents.y;
- _loc6_ = tAbsR.col1.y * m_localOBB.extents.x + tAbsR.col2.y * m_localOBB.extents.y;
- var _loc16_:Number = m_position.x + (m_R.col1.x * m_localOBB.center.x + m_R.col2.x * m_localOBB.center.y);
- var _loc17_:Number = m_position.y + (m_R.col1.y * m_localOBB.center.x + m_R.col2.y * m_localOBB.center.y);
- _loc8_.minVertex.x = _loc16_ - _loc5_;
- _loc8_.minVertex.y = _loc17_ - _loc6_;
- _loc8_.maxVertex.x = _loc16_ + _loc5_;
- _loc8_.maxVertex.y = _loc17_ + _loc6_;
- var _loc18_:b2BroadPhase;
- if((_loc18_ = m_body.m_world.m_broadPhase).InRange(_loc8_))
- {
- m_proxyId = _loc18_.CreateProxy(_loc8_,this);
- }
- else
- {
- m_proxyId = b2Pair.b2_nullProxy;
- }
- if(m_proxyId == b2Pair.b2_nullProxy)
- {
- m_body.Freeze();
- }
- }
-
- override public function QuickSync(param1:b2Vec2, param2:b2Mat22) : void
- {
- m_R.SetM(param2);
- m_position.x = param1.x + (param2.col1.x * m_localCentroid.x + param2.col2.x * m_localCentroid.y);
- m_position.y = param1.y + (param2.col1.y * m_localCentroid.x + param2.col2.y * m_localCentroid.y);
- }
-
- override public function Support(param1:Number, param2:Number, param3:b2Vec2) : void
- {
- var _loc9_:Number = NaN;
- var _loc4_:Number = param1 * m_R.col1.x + param2 * m_R.col1.y;
- var _loc5_:Number = param1 * m_R.col2.x + param2 * m_R.col2.y;
- var _loc6_:int = 0;
- var _loc7_:Number = m_coreVertices[0].x * _loc4_ + m_coreVertices[0].y * _loc5_;
- var _loc8_:int = 1;
- while(_loc8_ < m_vertexCount)
- {
- if((_loc9_ = m_coreVertices[_loc8_].x * _loc4_ + m_coreVertices[_loc8_].y * _loc5_) > _loc7_)
- {
- _loc6_ = _loc8_;
- _loc7_ = _loc9_;
- }
- _loc8_++;
- }
- param3.Set(m_position.x + (m_R.col1.x * m_coreVertices[_loc6_].x + m_R.col2.x * m_coreVertices[_loc6_].y),m_position.y + (m_R.col1.y * m_coreVertices[_loc6_].x + m_R.col2.y * m_coreVertices[_loc6_].y));
- }
-
- override public function Synchronize(param1:b2Vec2, param2:b2Mat22, param3:b2Vec2, param4:b2Mat22) : void
- {
- var _loc5_:Number = NaN;
- var _loc6_:Number = NaN;
- m_R.SetM(param4);
- m_position.x = m_body.m_position.x + (param4.col1.x * m_localCentroid.x + param4.col2.x * m_localCentroid.y);
- m_position.y = m_body.m_position.y + (param4.col1.y * m_localCentroid.x + param4.col2.y * m_localCentroid.y);
- if(m_proxyId == b2Pair.b2_nullProxy)
- {
- return;
- }
- var _loc7_:b2Vec2 = param2.col1;
- var _loc8_:b2Vec2 = param2.col2;
- var _loc9_:b2Vec2 = m_localOBB.R.col1;
- var _loc10_:b2Vec2 = m_localOBB.R.col2;
- syncMat.col1.x = _loc7_.x * _loc9_.x + _loc8_.x * _loc9_.y;
- syncMat.col1.y = _loc7_.y * _loc9_.x + _loc8_.y * _loc9_.y;
- syncMat.col2.x = _loc7_.x * _loc10_.x + _loc8_.x * _loc10_.y;
- syncMat.col2.y = _loc7_.y * _loc10_.x + _loc8_.y * _loc10_.y;
- syncMat.Abs();
- _loc5_ = m_localCentroid.x + m_localOBB.center.x;
- _loc6_ = m_localCentroid.y + m_localOBB.center.y;
- var _loc11_:Number = param1.x + (param2.col1.x * _loc5_ + param2.col2.x * _loc6_);
- var _loc12_:Number = param1.y + (param2.col1.y * _loc5_ + param2.col2.y * _loc6_);
- _loc5_ = syncMat.col1.x * m_localOBB.extents.x + syncMat.col2.x * m_localOBB.extents.y;
- _loc6_ = syncMat.col1.y * m_localOBB.extents.x + syncMat.col2.y * m_localOBB.extents.y;
- syncAABB.minVertex.x = _loc11_ - _loc5_;
- syncAABB.minVertex.y = _loc12_ - _loc6_;
- syncAABB.maxVertex.x = _loc11_ + _loc5_;
- syncAABB.maxVertex.y = _loc12_ + _loc6_;
- _loc7_ = param4.col1;
- _loc8_ = param4.col2;
- _loc9_ = m_localOBB.R.col1;
- _loc10_ = m_localOBB.R.col2;
- syncMat.col1.x = _loc7_.x * _loc9_.x + _loc8_.x * _loc9_.y;
- syncMat.col1.y = _loc7_.y * _loc9_.x + _loc8_.y * _loc9_.y;
- syncMat.col2.x = _loc7_.x * _loc10_.x + _loc8_.x * _loc10_.y;
- syncMat.col2.y = _loc7_.y * _loc10_.x + _loc8_.y * _loc10_.y;
- syncMat.Abs();
- _loc5_ = m_localCentroid.x + m_localOBB.center.x;
- _loc6_ = m_localCentroid.y + m_localOBB.center.y;
- _loc11_ = param3.x + (param4.col1.x * _loc5_ + param4.col2.x * _loc6_);
- _loc12_ = param3.y + (param4.col1.y * _loc5_ + param4.col2.y * _loc6_);
- _loc5_ = syncMat.col1.x * m_localOBB.extents.x + syncMat.col2.x * m_localOBB.extents.y;
- _loc6_ = syncMat.col1.y * m_localOBB.extents.x + syncMat.col2.y * m_localOBB.extents.y;
- syncAABB.minVertex.x = Math.min(syncAABB.minVertex.x,_loc11_ - _loc5_);
- syncAABB.minVertex.y = Math.min(syncAABB.minVertex.y,_loc12_ - _loc6_);
- syncAABB.maxVertex.x = Math.max(syncAABB.maxVertex.x,_loc11_ + _loc5_);
- syncAABB.maxVertex.y = Math.max(syncAABB.maxVertex.y,_loc12_ + _loc6_);
- var _loc13_:b2BroadPhase;
- if((_loc13_ = m_body.m_world.m_broadPhase).InRange(syncAABB))
- {
- _loc13_.MoveProxy(m_proxyId,syncAABB);
- }
- else
- {
- m_body.Freeze();
- }
- }
-
- override public function TestPoint(param1:b2Vec2) : Boolean
- {
- var _loc4_:b2Vec2 = null;
- var _loc5_:Number = NaN;
- var _loc2_:b2Vec2 = new b2Vec2();
- _loc2_.SetV(param1);
- _loc2_.Subtract(m_position);
- _loc2_.MulTM(m_R);
- var _loc3_:int = 0;
- while(_loc3_ < m_vertexCount)
- {
- (_loc4_ = new b2Vec2()).SetV(_loc2_);
- _loc4_.Subtract(m_vertices[_loc3_]);
- if((_loc5_ = b2Math.b2Dot(m_normals[_loc3_],_loc4_)) > 0)
- {
- return false;
- }
- _loc3_++;
- }
- return true;
- }
-
- override public function ResetProxy(param1:b2BroadPhase) : void
- {
- if(m_proxyId == b2Pair.b2_nullProxy)
- {
- return;
- }
- var _loc2_:b2Proxy = param1.GetProxy(m_proxyId);
- param1.DestroyProxy(m_proxyId);
- _loc2_ = null;
- var _loc3_:b2Mat22 = b2Math.b2MulMM(m_R,m_localOBB.R);
- var _loc4_:b2Mat22 = b2Math.b2AbsM(_loc3_);
- var _loc5_:b2Vec2 = b2Math.b2MulMV(_loc4_,m_localOBB.extents);
- var _loc6_:b2Vec2;
- (_loc6_ = b2Math.b2MulMV(m_R,m_localOBB.center)).Add(m_position);
- var _loc7_:b2AABB;
- (_loc7_ = new b2AABB()).minVertex.SetV(_loc6_);
- _loc7_.minVertex.Subtract(_loc5_);
- _loc7_.maxVertex.SetV(_loc6_);
- _loc7_.maxVertex.Add(_loc5_);
- if(param1.InRange(_loc7_))
- {
- m_proxyId = param1.CreateProxy(_loc7_,this);
- }
- else
- {
- m_proxyId = b2Pair.b2_nullProxy;
- }
- if(m_proxyId == b2Pair.b2_nullProxy)
- {
- m_body.Freeze();
- }
- }
- }
- }
-