/* * File: RigidCircle_Collision.js * Detects RigidCircle collisions */ /*jslint node: true, vars:true , white: true*/ /*global RigidShape, RigidCircle, vec2, LineRenderable */ /* find out more about jslint: http://www.jslint.com/help.html */ "use strict"; RigidCircle.prototype.containsPos = function(pos) { var dist = vec2.distance(this.getPosition(), pos); return (dist < this.getRadius()); }; RigidCircle.prototype.collidedCircCirc = function(c1, c2, collisionInfo) { var vFrom1to2 = [0, 0]; vec2.sub(vFrom1to2, c2.getPosition(), c1.getPosition()); var rSum = c1.getRadius() + c2.getRadius(); var sqLen = vec2.squaredLength(vFrom1to2); if (sqLen > (rSum * rSum)) { return false; } var dist = Math.sqrt(sqLen); if (dist !== 0) { // overlapping vec2.scale(vFrom1to2, vFrom1to2, 1/dist); collisionInfo.setNormal(vFrom1to2); collisionInfo.setDepth(rSum - dist); } else //same position { collisionInfo.setDepth(rSum / 10); collisionInfo.setNormal([0, 1]); } return true; }; RigidCircle.prototype.collided = function(otherShape, collisionInfo) { var status = false; var n; collisionInfo.setDepth(0); switch (otherShape.rigidType()) { case RigidShape.eRigidType.eRigidCircle: status = this.collidedCircCirc(this, otherShape, collisionInfo); break; case RigidShape.eRigidType.eRigidRectangle: status = this.collidedRectCirc(otherShape, this, collisionInfo); n = collisionInfo.getNormal(); n[0] = -n[0]; n[1] = -n[1]; break; } return status; };