/*
* The MIT License (MIT)
*
* FXGL - JavaFX Game Library
*
* Copyright (c) 2015-2017 AlmasB (almaslvl@gmail.com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package org.jbox2d.worlds;
import com.almasb.fxgl.core.math.Vec2;
import org.jbox2d.collision.shapes.CircleShape;
import org.jbox2d.collision.shapes.PolygonShape;
import org.jbox2d.common.JBoxUtils;
import org.jbox2d.dynamics.*;
import org.jbox2d.dynamics.joints.PrismaticJoint;
import org.jbox2d.dynamics.joints.PrismaticJointDef;
import org.jbox2d.dynamics.joints.RevoluteJoint;
import org.jbox2d.dynamics.joints.RevoluteJointDef;
public class PistonWorld implements PerformanceTestWorld {
public float timeStep = 1f / 60;
public int velIters = 8;
public int posIters = 3;
public RevoluteJoint m_joint1;
public PrismaticJoint m_joint2;
public World world;
@Override
public void setupWorld(World world) {
this.world = world;
Body ground = null;
{
BodyDef bd = new BodyDef();
ground = world.createBody(bd);
PolygonShape shape = new PolygonShape();
shape.setAsBox(5.0f, 100.0f);
bd = new BodyDef();
bd.setType(BodyType.STATIC);
FixtureDef sides = new FixtureDef();
sides.setShape(shape);
sides.setDensity(0);
sides.setFriction(0);
sides.setRestitution(0.8f);
sides.getFilter().categoryBits = 4;
sides.getFilter().maskBits = 2;
bd.getPosition().set(-10.01f, 50.0f);
Body bod = world.createBody(bd);
bod.createFixture(sides);
bd.getPosition().set(10.01f, 50.0f);
bod = world.createBody(bd);
bod.createFixture(sides);
}
// turney
{
CircleShape cd;
FixtureDef fd = new FixtureDef();
BodyDef bd = new BodyDef();
bd.setType(BodyType.DYNAMIC);
int numPieces = 5;
float radius = 4f;
bd.setPosition(new Vec2(0.0f, 25.0f));
Body body = world.createBody(bd);
for (int i = 0; i < numPieces; i++) {
cd = new CircleShape();
cd.setRadius(.5f);
fd.setShape(cd);
fd.setDensity(25);
fd.setFriction(0.1f);
fd.setRestitution(0.9f);
float xPos = radius * (float) Math.cos(2f * Math.PI * (i / (float) (numPieces)));
float yPos = radius * (float) Math.sin(2f * Math.PI * (i / (float) (numPieces)));
cd.m_p.set(xPos, yPos);
body.createFixture(fd);
}
RevoluteJointDef rjd = new RevoluteJointDef();
rjd.initialize(body, ground, body.getPosition());
rjd.motorSpeed = JBoxUtils.PI;
rjd.maxMotorTorque = 1000000.0f;
rjd.enableMotor = true;
world.createJoint(rjd);
}
{
Body prevBody = ground;
// Define crank.
{
PolygonShape shape = new PolygonShape();
shape.setAsBox(0.5f, 2.0f);
BodyDef bd = new BodyDef();
bd.setType(BodyType.DYNAMIC);
bd.getPosition().set(0.0f, 7.0f);
Body body = world.createBody(bd);
body.createFixture(shape, 2.0f);
RevoluteJointDef rjd = new RevoluteJointDef();
rjd.initialize(prevBody, body, new Vec2(0.0f, 5.0f));
rjd.motorSpeed = 1.0f * JBoxUtils.PI;
rjd.maxMotorTorque = 20000;
rjd.enableMotor = true;
m_joint1 = (RevoluteJoint) world.createJoint(rjd);
prevBody = body;
}
// Define follower.
{
PolygonShape shape = new PolygonShape();
shape.setAsBox(0.5f, 4.0f);
BodyDef bd = new BodyDef();
bd.setType(BodyType.DYNAMIC);
bd.getPosition().set(0.0f, 13.0f);
Body body = world.createBody(bd);
body.createFixture(shape, 2.0f);
RevoluteJointDef rjd = new RevoluteJointDef();
rjd.initialize(prevBody, body, new Vec2(0.0f, 9.0f));
rjd.enableMotor = false;
world.createJoint(rjd);
prevBody = body;
}
// Define piston
{
PolygonShape shape = new PolygonShape();
shape.setAsBox(7f, 2f);
BodyDef bd = new BodyDef();
bd.setType(BodyType.DYNAMIC);
bd.getPosition().set(0.0f, 17.0f);
Body body = world.createBody(bd);
FixtureDef piston = new FixtureDef();
piston.setShape(shape);
piston.setDensity(2);
piston.getFilter().categoryBits = 1;
piston.getFilter().maskBits = 2;
body.createFixture(piston);
RevoluteJointDef rjd = new RevoluteJointDef();
rjd.initialize(prevBody, body, new Vec2(0.0f, 17.0f));
world.createJoint(rjd);
PrismaticJointDef pjd = new PrismaticJointDef();
pjd.initialize(ground, body, new Vec2(0.0f, 17.0f), new Vec2(0.0f, 1.0f));
pjd.maxMotorForce = 1000.0f;
pjd.enableMotor = true;
m_joint2 = (PrismaticJoint) world.createJoint(pjd);
}
// Create a payload
{
PolygonShape sd = new PolygonShape();
BodyDef bd = new BodyDef();
bd.setType(BodyType.DYNAMIC);
FixtureDef fixture = new FixtureDef();
Body body;
for (int i = 0; i < 100; ++i) {
sd.setAsBox(0.4f, 0.3f);
bd.getPosition().set(-1.0f, 23.0f + i);
bd.setBullet(false);
body = world.createBody(bd);
fixture.setShape(sd);
fixture.setDensity(0.1f);
fixture.getFilter().categoryBits = 2;
fixture.getFilter().maskBits = 1 | 4 | 2;
body.createFixture(fixture);
}
CircleShape cd = new CircleShape();
cd.setRadius(0.36f);
for (int i = 0; i < 100; ++i) {
bd.getPosition().set(1.0f, 23.0f + i);
bd.setBullet(false);
fixture.setShape(cd);
fixture.setDensity(2);
fixture.getFilter().categoryBits = 2;
fixture.getFilter().maskBits = 1 | 4 | 2;
body = world.createBody(bd);
body.createFixture(fixture);
}
float angle = 0.0f;
float delta = JBoxUtils.PI / 3.0f;
Vec2 vertices[] = new Vec2[6];
for (int i = 0; i < 6; ++i) {
vertices[i] = new Vec2(0.3f * JBoxUtils.cos(angle), 0.3f * JBoxUtils.sin(angle));
angle += delta;
}
PolygonShape shape = new PolygonShape();
shape.set(vertices, 6);
for (int i = 0; i < 100; ++i) {
bd.getPosition().set(0f, 23.0f + i);
bd.setType(BodyType.DYNAMIC);
bd.setFixedRotation(true);
bd.setBullet(false);
fixture.setShape(shape);
fixture.setDensity(1);
fixture.getFilter().categoryBits = 2;
fixture.getFilter().maskBits = 1 | 4 | 2;
body = world.createBody(bd);
body.createFixture(fixture);
}
}
}
}
@Override
public void step() {
world.step(timeStep, posIters, velIters);
}
}