home *** CD-ROM | disk | FTP | other *** search
Wrap
package org.cove.ape { import flash.display.Sprite; internal class SpringConstraintParticle extends RectangleParticle { private var _fixedEndLimit:Number; private var _rectScale:Number; private var rca:Vector; private var rcb:Vector; private var s:Number; private var parent:SpringConstraint; private var scaleToLength:Boolean; private var p1:AbstractParticle; private var p2:AbstractParticle; private var lambda:Vector; private var avgVelocity:Vector; private var _rectHeight:Number; public function SpringConstraintParticle(param1:AbstractParticle, param2:AbstractParticle, param3:SpringConstraint, param4:Number, param5:Number, param6:Boolean) { super(0,0,0,0,0,false); this.p1 = param1; this.p2 = param2; lambda = new Vector(0,0); avgVelocity = new Vector(0,0); parent = param3; this.rectScale = param5; this.rectHeight = param4; this.scaleToLength = param6; fixedEndLimit = 0; rca = new Vector(); rcb = new Vector(); } private function setCorners(param1:RectangleParticle, param2:int) : void { var _loc3_:Number = NaN; var _loc4_:Number = NaN; var _loc5_:Array = null; var _loc6_:Array = null; var _loc7_:Number = NaN; var _loc8_:Number = NaN; var _loc9_:Number = NaN; var _loc10_:Number = NaN; var _loc11_:Number = NaN; var _loc12_:Number = NaN; var _loc13_:Number = NaN; var _loc14_:Number = NaN; _loc3_ = Number(param1.curr.x); _loc4_ = Number(param1.curr.y); _loc5_ = param1.axes; _loc6_ = param1.extents; _loc7_ = _loc5_[0].x * _loc6_[0]; _loc8_ = _loc5_[0].y * _loc6_[0]; _loc9_ = _loc5_[1].x * _loc6_[1]; _loc10_ = _loc5_[1].y * _loc6_[1]; _loc11_ = _loc7_ - _loc9_; _loc12_ = _loc8_ - _loc10_; _loc13_ = _loc7_ + _loc9_; _loc14_ = _loc8_ + _loc10_; if(param2 == 0) { rca.x = _loc3_ - _loc13_; rca.y = _loc4_ - _loc14_; rcb.x = _loc3_ + _loc11_; rcb.y = _loc4_ + _loc12_; } else if(param2 == 1) { rca.x = _loc3_ + _loc11_; rca.y = _loc4_ + _loc12_; rcb.x = _loc3_ + _loc13_; rcb.y = _loc4_ + _loc14_; } else if(param2 == 2) { rca.x = _loc3_ + _loc13_; rca.y = _loc4_ + _loc14_; rcb.x = _loc3_ - _loc11_; rcb.y = _loc4_ - _loc12_; } else if(param2 == 3) { rca.x = _loc3_ - _loc11_; rca.y = _loc4_ - _loc12_; rcb.x = _loc3_ - _loc13_; rcb.y = _loc4_ - _loc14_; } } override public function init() : void { var _loc1_:Sprite = null; var _loc2_:Number = NaN; var _loc3_:Number = NaN; if(displayObject != null) { initDisplay(); } else { _loc1_ = new Sprite(); parent.sprite.addChild(_loc1_); _loc1_.name = "inner"; _loc2_ = parent.currLength * rectScale; _loc3_ = rectHeight; _loc1_.graphics.clear(); _loc1_.graphics.lineStyle(parent.lineThickness,parent.lineColor,parent.lineAlpha); _loc1_.graphics.beginFill(parent.fillColor,parent.fillAlpha); _loc1_.graphics.drawRect(-_loc2_ / 2,-_loc3_ / 2,_loc2_,_loc3_); _loc1_.graphics.endFill(); } paint(); } internal function updatePosition() : void { var _loc1_:Vector = null; _loc1_ = parent.center; curr.setTo(_loc1_.x,_loc1_.y); width = scaleToLength ? parent.currLength * rectScale : parent.restLength * rectScale; height = rectHeight; radian = parent.radian; } private function closestPtSegmentSegment() : Number { var _loc1_:Vector = null; var _loc2_:Vector = null; var _loc3_:Vector = null; var _loc4_:Vector = null; var _loc5_:Vector = null; var _loc6_:Vector = null; var _loc7_:Vector = null; var _loc8_:Number = NaN; var _loc9_:Number = NaN; var _loc10_:Number = NaN; var _loc11_:Number = NaN; var _loc12_:Number = NaN; var _loc13_:Number = NaN; var _loc14_:Number = NaN; var _loc15_:Vector = null; var _loc16_:Vector = null; var _loc17_:Vector = null; _loc1_ = p1.curr; _loc2_ = p2.curr; _loc3_ = rca; _loc4_ = rcb; _loc5_ = _loc2_.minus(_loc1_); _loc6_ = _loc4_.minus(_loc3_); _loc7_ = _loc1_.minus(_loc3_); _loc9_ = _loc5_.dot(_loc5_); _loc10_ = _loc6_.dot(_loc6_); _loc11_ = _loc6_.dot(_loc7_); _loc12_ = _loc5_.dot(_loc7_); _loc13_ = _loc5_.dot(_loc6_); if((_loc14_ = _loc9_ * _loc10_ - _loc13_ * _loc13_) != 0) { s = MathUtil.clamp((_loc13_ * _loc11_ - _loc12_ * _loc10_) / _loc14_,0,1); } else { s = 0.5; } if((_loc8_ = (_loc13_ * s + _loc11_) / _loc10_) < 0) { _loc8_ = 0; s = MathUtil.clamp(-_loc12_ / _loc9_,0,1); } else if(_loc8_ > 0) { _loc8_ = 1; s = MathUtil.clamp((_loc13_ - _loc12_) / _loc9_,0,1); } _loc15_ = _loc1_.plus(_loc5_.mult(s)); _loc16_ = _loc3_.plus(_loc6_.mult(_loc8_)); _loc17_ = _loc15_.minus(_loc16_); return _loc17_.dot(_loc17_); } internal function get rectHeight() : Number { return _rectHeight; } internal function get fixedEndLimit() : Number { return _fixedEndLimit; } private function closestParamPoint(param1:Vector) : Number { var _loc2_:Vector = null; var _loc3_:Number = NaN; _loc2_ = p2.curr.minus(p1.curr); _loc3_ = _loc2_.dot(param1.minus(p1.curr)) / _loc2_.dot(_loc2_); return MathUtil.clamp(_loc3_,0,1); } internal function set rectHeight(param1:Number) : void { _rectHeight = param1; } override public function paint() : void { var _loc1_:Vector = null; var _loc2_:Sprite = null; _loc1_ = parent.center; _loc2_ = parent.sprite; if(scaleToLength) { _loc2_.getChildByName("inner").width = parent.currLength * rectScale; } else if(displayObject != null) { _loc2_.getChildByName("inner").width = parent.restLength * rectScale; } _loc2_.x = _loc1_.x; _loc2_.y = _loc1_.y; _loc2_.rotation = parent.angle; } private function getContactPointParam(param1:AbstractParticle) : Number { var _loc2_:Number = NaN; var _loc3_:Number = NaN; var _loc4_:Array = null; var _loc5_:Number = NaN; var _loc6_:int = 0; var _loc7_:Number = NaN; if(param1 is CircleParticle) { _loc2_ = closestParamPoint(param1.curr); } else if(param1 is RectangleParticle) { _loc4_ = new Array(4); _loc5_ = Number.POSITIVE_INFINITY; _loc6_ = 0; while(_loc6_ < 4) { setCorners(param1 as RectangleParticle,_loc6_); if((_loc7_ = closestPtSegmentSegment()) < _loc5_) { _loc5_ = _loc7_; _loc3_ = _loc6_; _loc4_[_loc6_] = s; } _loc6_++; } _loc2_ = Number(_loc4_[_loc3_]); } return _loc2_; } internal function set fixedEndLimit(param1:Number) : void { _fixedEndLimit = param1; } override internal function get invMass() : Number { if(p1.fixed && p2.fixed) { return 0; } return 1 / ((p1.mass + p2.mass) / 2); } override internal function initDisplay() : void { var _loc1_:Sprite = null; displayObject.x = displayObjectOffset.x; displayObject.y = displayObjectOffset.y; displayObject.rotation = displayObjectRotation; _loc1_ = new Sprite(); _loc1_.name = "inner"; _loc1_.addChild(displayObject); parent.sprite.addChild(_loc1_); } internal function set rectScale(param1:Number) : void { _rectScale = param1; } override internal function resolveCollision(param1:Vector, param2:Vector, param3:Vector, param4:Number, param5:int, param6:AbstractParticle) : void { var _loc7_:Number = NaN; var _loc8_:Number = NaN; var _loc9_:Number = NaN; var _loc10_:Number = NaN; var _loc11_:AbstractParticle = null; _loc7_ = getContactPointParam(param6); _loc8_ = 1 - _loc7_; _loc9_ = _loc7_; if(p1.fixed) { if(_loc9_ <= fixedEndLimit) { return; } lambda.setTo(param1.x / _loc9_,param1.y / _loc9_); p2.curr.plusEquals(lambda); p2.velocity = param2; } else if(p2.fixed) { if(_loc8_ <= fixedEndLimit) { return; } lambda.setTo(param1.x / _loc8_,param1.y / _loc8_); p1.curr.plusEquals(lambda); p1.velocity = param2; } else { if((_loc10_ = _loc8_ * _loc8_ + _loc9_ * _loc9_) == 0) { return; } lambda.setTo(param1.x / _loc10_,param1.y / _loc10_); p1.curr.plusEquals(lambda.mult(_loc8_)); p2.curr.plusEquals(lambda.mult(_loc9_)); if(_loc7_ == 0.5) { p1.velocity = param2; p2.velocity = param2; } else { (_loc11_ = _loc7_ < 0.5 ? p1 : p2).velocity = param2; } } } override public function get elasticity() : Number { return (p1.elasticity + p2.elasticity) / 2; } internal function get rectScale() : Number { return _rectScale; } override public function get velocity() : Vector { var _loc1_:Vector = null; var _loc2_:Vector = null; _loc1_ = p1.velocity; _loc2_ = p2.velocity; avgVelocity.setTo((_loc1_.x + _loc2_.x) / 2,(_loc1_.y + _loc2_.y) / 2); return avgVelocity; } override public function get friction() : Number { return (p1.friction + p2.friction) / 2; } override public function get mass() : Number { return (p1.mass + p2.mass) / 2; } } }