package org.codecranachan.asteroidpush.base.simulation.jbox2d; import org.codecranachan.asteroidpush.base.simulation.DistanceJointData; import org.codecranachan.asteroidpush.base.simulation.DynamicJoint; import org.codecranachan.asteroidpush.base.simulation.DynamicJointFactory; import org.codecranachan.asteroidpush.base.simulation.PrismaticJointData; import org.codecranachan.asteroidpush.base.simulation.RigidBody; import org.jbox2d.common.Vec2; import org.jbox2d.dynamics.World; import org.jbox2d.dynamics.joints.DistanceJointDef; import org.jbox2d.dynamics.joints.PrismaticJointDef; public class Box2dJointFactory implements DynamicJointFactory { private World world; public Box2dJointFactory(World world) { assert (world != null); this.world = world; } public DynamicJoint createPrismaticJoint(RigidBody bodyA, RigidBody bodyB, PrismaticJointData data) { assert bodyA != null; assert bodyB != null; assert data != null; PrismaticJointDef def = new PrismaticJointDef(); def.bodyA = ((Box2dBody) bodyA).getBox2dBody(); def.bodyB = ((Box2dBody) bodyB).getBox2dBody(); def.localAnchorA.set(data.getAnchorA()); def.localAnchorB.set(data.getAnchorB()); Vec2 axis = data.getAnchorB().sub(data.getAnchorA()); float distance = axis.normalize(); def.localAxisA.set(axis); def.collideConnected = true; def.referenceAngle = 0.0f; def.enableLimit = true; def.lowerTranslation = data.getMinLength() - distance; def.upperTranslation = data.getMaxLength() - distance; def.enableMotor = false; def.motorSpeed = 0.0f; def.maxMotorForce = 0.0f; return new Box2dJoint(world, def); } public DynamicJoint createDistanceJoint(RigidBody bodyA, RigidBody bodyB, DistanceJointData data) { assert bodyA != null; assert bodyB != null; assert data != null; DistanceJointDef def = new DistanceJointDef(); def.bodyA = ((Box2dBody) bodyA).getBox2dBody(); def.bodyB = ((Box2dBody) bodyB).getBox2dBody(); def.localAnchorA.set(data.getAnchorA()); def.localAnchorB.set(data.getAnchorB()); def.collideConnected = true; def.dampingRatio = data.getDampingRatio(); def.frequencyHz = data.getFrequency(); def.length = data.getLength(); return new Box2dJoint(world, def); } }