home *** CD-ROM | disk | FTP | other *** search
- package org.cove.ape
- {
- internal final class CollisionDetector
- {
-
-
- public function CollisionDetector()
- {
- super();
- }
-
- private static function testOBBvsCircle(param1:RectangleParticle, param2:CircleParticle) : Boolean
- {
- var _loc3_:Vector = null;
- var _loc4_:Number = NaN;
- var _loc5_:Array = null;
- var _loc6_:int = 0;
- var _loc7_:Number = NaN;
- var _loc8_:Vector = null;
- var _loc9_:Number = NaN;
- var _loc10_:Vector = null;
- var _loc11_:Number = NaN;
- _loc4_ = Number.POSITIVE_INFINITY;
- _loc5_ = new Array(2);
- _loc6_ = 0;
- while(_loc6_ < 2)
- {
- _loc8_ = param1.axes[_loc6_];
- if((_loc9_ = testIntervals(param1.getProjection(_loc8_),param2.getProjection(_loc8_))) == 0)
- {
- return false;
- }
- if(Math.abs(_loc9_) < Math.abs(_loc4_))
- {
- _loc3_ = _loc8_;
- _loc4_ = _loc9_;
- }
- _loc5_[_loc6_] = _loc9_;
- _loc6_++;
- }
- _loc7_ = param2.radius;
- if(Math.abs(_loc5_[0]) < _loc7_ && Math.abs(_loc5_[1]) < _loc7_)
- {
- _loc3_ = (_loc10_ = closestVertexOnOBB(param2.samp,param1)).minus(param2.samp);
- _loc11_ = _loc3_.magnitude();
- if((_loc4_ = _loc7_ - _loc11_) <= 0)
- {
- return false;
- }
- _loc3_.divEquals(_loc11_);
- }
- CollisionResolver.resolveParticleParticle(param1,param2,_loc3_,_loc4_);
- return true;
- }
-
- internal static function test(param1:AbstractParticle, param2:AbstractParticle) : void
- {
- if(param1.fixed && param2.fixed)
- {
- return;
- }
- if(param1.multisample == 0 && param2.multisample == 0)
- {
- normVsNorm(param1,param2);
- }
- else if(param1.multisample > 0 && param2.multisample == 0)
- {
- sampVsNorm(param1,param2);
- }
- else if(param2.multisample > 0 && param1.multisample == 0)
- {
- sampVsNorm(param2,param1);
- }
- else if(param1.multisample == param2.multisample)
- {
- sampVsSamp(param1,param2);
- }
- else
- {
- normVsNorm(param1,param2);
- }
- }
-
- private static function testIntervals(param1:Interval, param2:Interval) : Number
- {
- var _loc3_:Number = NaN;
- var _loc4_:Number = NaN;
- if(param1.max < param2.min)
- {
- return 0;
- }
- if(param2.max < param1.min)
- {
- return 0;
- }
- _loc3_ = param2.max - param1.min;
- _loc4_ = param2.min - param1.max;
- return Math.abs(_loc3_) < Math.abs(_loc4_) ? _loc3_ : _loc4_;
- }
-
- private static function normVsNorm(param1:AbstractParticle, param2:AbstractParticle) : void
- {
- param1.samp.copy(param1.curr);
- param2.samp.copy(param2.curr);
- testTypes(param1,param2);
- }
-
- private static function testCirclevsCircle(param1:CircleParticle, param2:CircleParticle) : Boolean
- {
- var _loc3_:Number = NaN;
- var _loc4_:Number = NaN;
- var _loc5_:Vector = null;
- var _loc6_:Number = NaN;
- var _loc7_:Number = NaN;
- _loc3_ = testIntervals(param1.getIntervalX(),param2.getIntervalX());
- if(_loc3_ == 0)
- {
- return false;
- }
- if((_loc4_ = testIntervals(param1.getIntervalY(),param2.getIntervalY())) == 0)
- {
- return false;
- }
- _loc6_ = (_loc5_ = param1.samp.minus(param2.samp)).magnitude();
- if((_loc7_ = param1.radius + param2.radius - _loc6_) > 0)
- {
- _loc5_.divEquals(_loc6_);
- CollisionResolver.resolveParticleParticle(param1,param2,_loc5_,_loc7_);
- return true;
- }
- return false;
- }
-
- private static function testTypes(param1:AbstractParticle, param2:AbstractParticle) : Boolean
- {
- if(param1 is RectangleParticle && param2 is RectangleParticle)
- {
- return testOBBvsOBB(param1 as RectangleParticle,param2 as RectangleParticle);
- }
- if(param1 is CircleParticle && param2 is CircleParticle)
- {
- return testCirclevsCircle(param1 as CircleParticle,param2 as CircleParticle);
- }
- if(param1 is RectangleParticle && param2 is CircleParticle)
- {
- return testOBBvsCircle(param1 as RectangleParticle,param2 as CircleParticle);
- }
- if(param1 is CircleParticle && param2 is RectangleParticle)
- {
- return testOBBvsCircle(param2 as RectangleParticle,param1 as CircleParticle);
- }
- return false;
- }
-
- private static function sampVsNorm(param1:AbstractParticle, param2:AbstractParticle) : void
- {
- var _loc3_:Number = NaN;
- var _loc4_:Number = NaN;
- var _loc5_:int = 0;
- _loc3_ = 1 / (param1.multisample + 1);
- _loc4_ = _loc3_;
- param2.samp.copy(param2.curr);
- _loc5_ = 0;
- while(_loc5_ <= param1.multisample)
- {
- param1.samp.setTo(param1.prev.x + _loc4_ * (param1.curr.x - param1.prev.x),param1.prev.y + _loc4_ * (param1.curr.y - param1.prev.y));
- if(testTypes(param1,param2))
- {
- return;
- }
- _loc4_ += _loc3_;
- _loc5_++;
- }
- }
-
- private static function closestVertexOnOBB(param1:Vector, param2:RectangleParticle) : Vector
- {
- var _loc3_:Vector = null;
- var _loc4_:Vector = null;
- var _loc5_:int = 0;
- var _loc6_:Number = NaN;
- _loc3_ = param1.minus(param2.samp);
- _loc4_ = new Vector(param2.samp.x,param2.samp.y);
- _loc5_ = 0;
- while(_loc5_ < 2)
- {
- if((_loc6_ = _loc3_.dot(param2.axes[_loc5_])) >= 0)
- {
- _loc6_ = Number(param2.extents[_loc5_]);
- }
- else if(_loc6_ < 0)
- {
- _loc6_ = -param2.extents[_loc5_];
- }
- _loc4_.plusEquals(param2.axes[_loc5_].mult(_loc6_));
- _loc5_++;
- }
- return _loc4_;
- }
-
- private static function testOBBvsOBB(param1:RectangleParticle, param2:RectangleParticle) : Boolean
- {
- var _loc3_:Vector = null;
- var _loc4_:Number = NaN;
- var _loc5_:int = 0;
- var _loc6_:Vector = null;
- var _loc7_:Number = NaN;
- var _loc8_:Vector = null;
- var _loc9_:Number = NaN;
- var _loc10_:Number = NaN;
- var _loc11_:Number = NaN;
- var _loc12_:* = false;
- _loc4_ = Number.POSITIVE_INFINITY;
- _loc5_ = 0;
- while(_loc5_ < 2)
- {
- _loc6_ = param1.axes[_loc5_];
- if((_loc7_ = testIntervals(param1.getProjection(_loc6_),param2.getProjection(_loc6_))) == 0)
- {
- return false;
- }
- _loc8_ = param2.axes[_loc5_];
- if((_loc9_ = testIntervals(param1.getProjection(_loc8_),param2.getProjection(_loc8_))) == 0)
- {
- return false;
- }
- _loc10_ = Math.abs(_loc7_);
- _loc11_ = Math.abs(_loc9_);
- if(_loc10_ < Math.abs(_loc4_) || _loc11_ < Math.abs(_loc4_))
- {
- _loc3_ = (_loc12_ = _loc10_ < _loc11_) ? _loc6_ : _loc8_;
- _loc4_ = _loc12_ ? _loc7_ : _loc9_;
- }
- _loc5_++;
- }
- CollisionResolver.resolveParticleParticle(param1,param2,_loc3_,_loc4_);
- return true;
- }
-
- private static function sampVsSamp(param1:AbstractParticle, param2:AbstractParticle) : void
- {
- var _loc3_:Number = NaN;
- var _loc4_:Number = NaN;
- var _loc5_:int = 0;
- _loc3_ = 1 / (param1.multisample + 1);
- _loc4_ = _loc3_;
- _loc5_ = 0;
- while(_loc5_ <= param1.multisample)
- {
- param1.samp.setTo(param1.prev.x + _loc4_ * (param1.curr.x - param1.prev.x),param1.prev.y + _loc4_ * (param1.curr.y - param1.prev.y));
- param2.samp.setTo(param2.prev.x + _loc4_ * (param2.curr.x - param2.prev.x),param2.prev.y + _loc4_ * (param2.curr.y - param2.prev.y));
- if(testTypes(param1,param2))
- {
- return;
- }
- _loc4_ += _loc3_;
- _loc5_++;
- }
- }
- }
- }
-