UNPKG

p2s

Version:

A JavaScript 2D physics engine.

308 lines (230 loc) 10.4 kB
var Narrowphase = require(__dirname + '/../../src/collision/Narrowphase') , Convex = require(__dirname + "/../../src/shapes/Convex") , Circle = require(__dirname + "/../../src/shapes/Circle") , Body = require(__dirname + "/../../src/objects/Body") , Box = require(__dirname + "/../../src/shapes/Box") , Capsule = require(__dirname + "/../../src/shapes/Capsule") , Plane = require(__dirname + "/../../src/shapes/Plane") , Particle = require(__dirname + "/../../src/shapes/Particle") , Line = require(__dirname + "/../../src/shapes/Line") , ContactEquation = require(__dirname + "/../../src/equations/ContactEquation") , FrictionEquation = require(__dirname + "/../../src/equations/FrictionEquation") , ContactMaterial = require(__dirname + "/../../src/material/ContactMaterial") , Material = require(__dirname + "/../../src/material/Material") , vec2 = require(__dirname + "/../../src/math/vec2"); var rect, circle, convex, capsule, plane, line, particle, narrowphase, bodyA, bodyB, position=[0,0], angle=0, eps = 0.01; exports.setUp = function(callback){ // Rect rect = new Box(); // Circle var verts = []; var N = 50; for(var i=0; i<N; i++){ verts.push(vec2.fromValues( Math.cos(2*Math.PI / N * i), Math.sin(2*Math.PI / N * i) )); } circle = new Circle({ radius: 1 }); convex = new Convex({ vertices: verts }); capsule = new Capsule({ length: 1, radius: 1 }); plane = new Plane(); particle = new Particle(); line = new Line(); narrowphase = new Narrowphase(); narrowphase.currentContactMaterial = new ContactMaterial(new Material(), new Material()); bodyA = new Body(); bodyB = new Body(); callback(); }; exports.construct = function(test){ var narrowphase = new Narrowphase(); test.done(); }; exports.capsuleCapsule = function(test){ var result = narrowphase.capsuleCapsule(bodyA, capsule, position, angle, bodyB, capsule, position, angle); test.equal(typeof result, 'number'); result = narrowphase.capsuleCapsule(bodyA, capsule, position, angle, bodyB, capsule, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.planeCapsule = function(test){ var result = narrowphase.planeCapsule(bodyA, plane, position, angle, bodyB, capsule, position, angle); test.equal(typeof result, 'number'); result = narrowphase.planeCapsule(bodyA, plane, position, angle, bodyB, capsule, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.circleCapsule = function(test){ var result = narrowphase.circleCapsule(bodyA, circle, position, angle, bodyB, capsule, position, angle); test.equal(typeof result, 'number'); result = narrowphase.circleCapsule(bodyA, circle, position, angle, bodyB, capsule, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.circleCircle = function(test){ var result = narrowphase.circleCircle(bodyA, circle, position, angle, bodyB, circle, position, angle); test.equal(typeof result, 'number'); result = narrowphase.circleCircle(bodyA, circle, position, angle, bodyB, circle, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.circleConvex = function(test){ var result = narrowphase.circleConvex(bodyA, circle, position, angle, bodyB, convex, position, angle); test.equal(typeof result, 'number'); result = narrowphase.circleConvex(bodyA, circle, position, angle, bodyB, convex, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.circleLine = function(test){ var result = narrowphase.circleLine(bodyA, circle, position, angle, bodyB, line, position, angle); test.equal(typeof result, 'number'); var result = narrowphase.circleLine(bodyA, circle, position, angle, bodyB, line, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.circleParticle = function(test){ var result = narrowphase.circleParticle(bodyA, circle, position, angle, bodyB, particle, position, angle); test.equal(typeof result, 'number'); result = narrowphase.circleParticle(bodyA, circle, position, angle, bodyB, particle, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.circlePlane = function(test){ var result = narrowphase.circlePlane(bodyA, circle, position, angle, bodyB, plane, position, angle); test.equal(typeof result, 'number'); result = narrowphase.circlePlane(bodyA, circle, position, angle, bodyB, plane, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.collidedLastStep = function(test){ test.equal(typeof narrowphase.collidedLastStep(bodyA, bodyB), 'boolean'); test.done(); }; exports.convexCapsule = function(test){ var result = narrowphase.convexCapsule(bodyA, convex, position, angle, bodyB, capsule, position, angle); test.equal(typeof result, 'number'); result = narrowphase.convexCapsule(bodyA, convex, position, angle, bodyB, capsule, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.convexConvex = function(test){ var result = narrowphase.convexConvex(bodyA, convex, position, angle, bodyB, convex, position, angle); test.equal(typeof result, 'number'); result = narrowphase.convexConvex(bodyA, convex, position, angle, bodyB, convex, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.convexLine = function(test){ var result = narrowphase.convexLine(bodyA, convex, position, angle, bodyB, line, position, angle); test.equal(typeof result, 'number'); result = narrowphase.convexLine(bodyA, convex, position, angle, bodyB, line, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.planeConvex = function(test){ var result = narrowphase.planeConvex(bodyA, plane, position, angle, bodyB, convex, position, angle); test.equal(typeof result, 'number'); result = narrowphase.planeConvex(bodyA, plane, position, angle, bodyB, convex, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.createContactEquation = function(test){ var contact = narrowphase.createContactEquation(bodyA, bodyB, plane, rect); test.ok(contact instanceof ContactEquation); test.done(); }; exports.createFrictionEquation = function(test){ var eq = narrowphase.createFrictionEquation(bodyA, bodyB, plane, rect); test.ok(eq instanceof FrictionEquation); test.done(); }; exports.createFrictionFromContact = function(test){ // STUB test.done(); }; exports.lineCapsule = function(test){ var result = narrowphase.lineCapsule(bodyA, line, position, angle, bodyB, capsule, position, angle); test.equal(typeof result, 'number'); result = narrowphase.lineCapsule(bodyA, line, position, angle, bodyB, capsule, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.lineLine = function(test){ var result = narrowphase.lineLine(bodyA, line, position, angle, bodyB, line, position, angle); test.equal(typeof result, 'number'); result = narrowphase.lineLine(bodyA, line, position, angle, bodyB, line, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.lineBox = function(test){ var result = narrowphase.lineBox(bodyA, line, position, angle, bodyB, rect, position, angle); test.equal(typeof result, 'number'); result = narrowphase.lineBox(bodyA, line, position, angle, bodyB, rect, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.particleConvex = function(test){ var result = narrowphase.particleConvex(bodyA, particle, position, angle, bodyB, convex, position, angle); test.equal(typeof result, 'number'); result = narrowphase.particleConvex(bodyA, particle, position, angle, bodyB, convex, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.particlePlane = function(test){ var result = narrowphase.particlePlane(bodyA, particle, position, angle, bodyB, plane, position, angle); test.equal(typeof result, 'number'); result = narrowphase.particlePlane(bodyA, particle, position, angle, bodyB, plane, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.planeLine = function(test){ var result = narrowphase.planeLine(bodyA, plane, position, angle, bodyB, line, position, angle); test.equal(typeof result, 'number'); result = narrowphase.planeLine(bodyA, plane, position, angle, bodyB, line, position, angle, true); test.equal(typeof result, 'number'); test.done(); }; exports.reset = function(test){ var contact = narrowphase.createContactEquation(bodyA, bodyB, plane, rect); narrowphase.contactEquations.push(contact); narrowphase.reset(); test.equal(narrowphase.contactEquations.length, 0); test.equal(narrowphase.frictionEquations.length, 0); test.done(); }; exports.bodiesOverlap = { simple: function(test){ bodyA.addShape(new Circle({ radius: 1 })); bodyB.addShape(new Circle({ radius: 1 })); test.ok(narrowphase.bodiesOverlap(bodyA, bodyB)); bodyB.position[0] = 10; test.ok(!narrowphase.bodiesOverlap(bodyA, bodyB)); test.done(); }, withMask: function(test){ bodyA.addShape(new Circle({ radius: 1, collisionGroup: 1, collisionMask: 1 })); bodyB.addShape(new Circle({ radius: 1, collisionGroup: 2, collisionMask: 2 })); test.ok(!narrowphase.bodiesOverlap(bodyA, bodyB, true)); bodyB.shapes[0].collisionGroup = bodyB.shapes[0].collisionMask = 1; test.ok(narrowphase.bodiesOverlap(bodyA, bodyB, true)); test.done(); }, differentOrder: function(test){ bodyA.addShape(new Box({ width: 1, height: 1 })); bodyB.addShape(new Circle({ radius: 1 })); test.ok(narrowphase.bodiesOverlap(bodyA, bodyB, true)); test.ok(narrowphase.bodiesOverlap(bodyB, bodyA, true)); test.done(); } };