This commit is contained in:
Edouard DUPIN 2022-02-21 18:17:57 +01:00
parent e1987bfd1f
commit 764fd5eec0
25 changed files with 1936 additions and 4 deletions

View File

@ -0,0 +1,81 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisionshapes;
import net.frameworkgl.gameobjects.GameObject;
import net.frameworkgl.math.Vector3f;
import org.atriasoft.ephysics.body.RigidBody;
import org.atriasoft.ephysics.collision.shapes.CollisionShape;
import org.atriasoft.ephysics.engine.DynamicsWorld;
import org.atriasoft.ephysics.mathematics.Matrix3x3;
import org.atriasoft.etk.math.Quaternion;
import org.atriasoft.ephysics.mathematics.Transform;
import org.atriasoft.ephysics.mathematics.Vector3;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public abstract class AbstractGameObjectShape extends GameObject {
private CollisionShape collisionShape;
private RigidBody rigidBody;
protected void createRigidBody(CollisionShape collisionShape, Vector3f position, float mass, DynamicsWorld dynamicsWorld) {
this.collisionShape = collisionShape;
Matrix3x3 inertiaTensor = collisionShape.computeLocalInertiaTensor(mass);
Quaternion initOrientation = new Quaternion().identity();
Vector3 initPosition = new Vector3(position.getX(), position.getY(), position.getZ());
Transform transform = new Transform(initPosition, initOrientation);
rigidBody = dynamicsWorld.createRigidBody(transform, mass, inertiaTensor, collisionShape);
}
public CollisionShape getCollisionShape() {
return collisionShape;
}
public RigidBody getRigidBody() {
return rigidBody;
}
public void updateTransform() {
// Get the interpolated transform of the rigid body
Transform transform = rigidBody.getInterpolatedTransform(new Transform());
// Compute the transform used for rendering the box
float[] glMatrix = new float[16];
transform.getOpenGLMatrix(glMatrix);
// Apply the scaling matrix to have the correct box dimensions
getWorldTransform().fromOpenGLArray(glMatrix);
getWorldTransform().multiply(getScalingTransform());
}
}

View File

@ -0,0 +1,73 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisionshapes;
import java.io.IOException;
import net.frameworkgl.Fw;
import net.frameworkgl.math.Transform4f;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.mesh.Mesh;
import net.frameworkgl.opengl.renderable.AbstractRenderable;
import org.atriasoft.ephysics.collision.shapes.BoxShape;
import org.atriasoft.ephysics.engine.DynamicsWorld;
import org.atriasoft.ephysics.mathematics.Vector3;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Box extends AbstractGameObjectShape {
public Box(Vector3f position, Vector3f size, float mass, DynamicsWorld dynamicsWorld) {
// Scaling
Vector3f halfSize = new Vector3f(size).multiply(0.5f);
Transform4f scaling = new Transform4f();
scaling.getRotation().setDiagonal(halfSize);
setScalingTransform(scaling); // Attach to game object
Vector3 extent = new Vector3(size.getX(), size.getY(), size.getZ()).multiply(0.5f);
BoxShape collisionShape = new BoxShape(extent, 0.02f);
createRigidBody(collisionShape, position, mass, dynamicsWorld);
try {
// Mesh
Mesh mesh = GL.meshFactory.createMesh();
setMesh(mesh); // Attach mesh to game object
Fw.graphics.loadMesh("primitives/cube.obj", mesh);
mesh.setAllColors(0.3f, 0.3f, 0.3f, 1.0f);
mesh.updateHasBooleansFromSegment();
// Renderable
AbstractRenderable renderable = Fw.graphics.createInterleavedRenderable();
renderable.create(mesh);
setRenderable(renderable); // Attach to game object
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}

View File

@ -0,0 +1,71 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisionshapes;
import java.io.IOException;
import net.frameworkgl.Fw;
import net.frameworkgl.math.Transform4f;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.mesh.Mesh;
import net.frameworkgl.opengl.renderable.AbstractRenderable;
import org.atriasoft.ephysics.collision.shapes.CapsuleShape;
import org.atriasoft.ephysics.engine.DynamicsWorld;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Capsule extends AbstractGameObjectShape {
public Capsule(Vector3f position, float height, float radius, float mass, DynamicsWorld dynamicsWorld) {
// Scaling
Vector3f size = new Vector3f(radius, (height + 2.0f * radius) / 3.0f, radius);
Transform4f scaling = new Transform4f();
scaling.getRotation().setDiagonal(size);
setScalingTransform(scaling); // Attach to game object
CapsuleShape collisionShape = new CapsuleShape(radius, height, 0.02f);
createRigidBody(collisionShape, position, mass, dynamicsWorld);
try {
// Mesh
Mesh mesh = GL.meshFactory.createMesh();
setMesh(mesh); // Attach mesh to game object
Fw.graphics.loadMesh("primitives/capsule.obj", mesh);
mesh.setAllColors(0.8f, 0.8f, 0.8f, 1.0f);
mesh.updateHasBooleansFromSegment();
// Renderable
AbstractRenderable renderable = Fw.graphics.createInterleavedRenderable();
renderable.create(mesh);
setRenderable(renderable); // Attach to game object
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}

View File

@ -0,0 +1,408 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisionshapes;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import java.util.List;
import net.frameworkgl.Fw;
import net.frameworkgl.gameobjects.GameObject;
import net.frameworkgl.Screen;
import net.frameworkgl.helpers.Keyboard;
import net.frameworkgl.math.MathHelper;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.camera.LegacyCamera;
import net.frameworkgl.opengl.camera.LegacyCameraController;
import net.frameworkgl.opengl.constants.GetString;
import net.frameworkgl.opengl.constants.Light;
import net.frameworkgl.utils.FpsTimer;
import net.frameworkgl.utils.MemoryUsage;
import org.atriasoft.ephysics.body.RigidBody;
import org.atriasoft.ephysics.constraint.ContactPoint;
import org.atriasoft.ephysics.engine.ContactManifold;
import org.atriasoft.ephysics.engine.DynamicsWorld;
import org.atriasoft.ephysics.engine.Material;
import org.atriasoft.ephysics.mathematics.Vector3;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class CollisionShapes extends Screen {
private final static Logger log = LoggerFactory.getLogger(CollisionShapes.class);
private static final float BOX_MASS = 1.0f;
private static final float CAPSULE_HEIGHT = 1.0f;
private static final float CAPSULE_MASS = 1.0f;
private static final float CAPSULE_RADIUS = 1.0f;
private static final float CONE_HEIGHT = 3.0f;
private static final float CONE_MASS = 1.0f;
private static final float CONE_RADIUS = 2.0f;
private static final float CYLINDER_HEIGHT = 5.0f;
private static final float CYLINDER_MASS = 1.0f;
private static final float CYLINDER_RADIUS = 1.0f;
private static final float FLOOR_MASS = 100.0f;
private static final float SPHERE_MASS = 1.5f;
private static final float SPHERE_RADIUS = 1.0f;
private static final int MAX_BOXES = 5;
private static final int MAX_CAPSULES = 5;
private static final int MAX_CONES = 5;
private static final int MAX_CYLINDERS = 5;
private static final int MAX_SPHERES = 5;
private static final Vector3f BOX_SIZE = new Vector3f(2.0f, 2.0f, 2.0f);
private static final Vector3f FLOOR_SIZE = new Vector3f(50.0f, 0.5f, 50.0f);
private DynamicsWorld dynamicsWorld;
private FloatBuffer lightFloatBuffer;
private FpsTimer fpsTimer;
private LegacyCamera camera;
private LegacyCameraController cameraController;
private final List<AbstractGameObjectShape> gameObjectShapes;
private final List<VisualContactPoint> visualContactPoints;
private MemoryUsage memoryUsage;
public CollisionShapes(String[] args) {
gameObjectShapes = new ArrayList<>();
visualContactPoints = new ArrayList<>();
}
private void createBoxes() {
// Create all the boxes of the scene
for (int i = 0; i < MAX_BOXES; i++) {
// Position
float angle = i * 30.0f;
float radius = 3.0f;
Vector3f position = new Vector3f(
radius * MathHelper.Cos(angle),
60.0f + i * (BOX_SIZE.getY() + 0.8f),
radius * MathHelper.Sin(angle));
// Create a box and a corresponding rigid body in the dynamics world
Box box = new Box(position, BOX_SIZE, BOX_MASS, dynamicsWorld);
// The box is a moving rigid body
RigidBody rigidBody = (RigidBody) box.getRigidBody();
rigidBody.setIsMotionEnabled(true);
// Change the material properties of the rigid body
Material material = rigidBody.getMaterial();
material.setBounciness(0.2f);
// Add the box to the list of game objects in the scene
gameObjectShapes.add(box);
}
}
private void createCapsule() {
// Create all the capsules of the scene
for (int i = 0; i < MAX_CAPSULES; i++) {
// Position
float angle = i * 45.0f;
float radius = 3.0f;
Vector3f position = new Vector3f(
radius * MathHelper.Cos(angle),
15.0f + i * (CAPSULE_HEIGHT + 0.5f),
radius * MathHelper.Sin(angle));
// Create a capsule and a corresponding rigid body in the dynamics world
Capsule capsule = new Capsule(position, CAPSULE_HEIGHT, CAPSULE_RADIUS, CAPSULE_MASS, dynamicsWorld);
// The cylinder is a moving rigid body
RigidBody rigidBody = (RigidBody) capsule.getRigidBody();
rigidBody.setIsMotionEnabled(true);
// Change the material properties of the rigid body
Material material = rigidBody.getMaterial();
material.setBounciness(0.2f);
// Add the capsule to the list of game objects in the scene
gameObjectShapes.add(capsule);
}
}
private void createCones() {
// Create all the cones of the scene
for (int i = 0; i < MAX_CONES; i++) {
// Position
float angle = i * 50.0f;
float radius = 3.0f;
Vector3f position = new Vector3f(
radius * MathHelper.Cos(angle),
35.0f + i * (CONE_HEIGHT + 0.3f),
radius * MathHelper.Sin(angle));
// Create a cone and a corresponding rigid body in the dynamics world
Cone cone = new Cone(position, CONE_HEIGHT, CONE_RADIUS, CONE_MASS, dynamicsWorld);
// The cone is a moving rigid body
RigidBody rigidBody = (RigidBody) cone.getRigidBody();
rigidBody.setIsMotionEnabled(true);
// Change the material properties of the rigid body
Material material = rigidBody.getMaterial();
material.setBounciness(0.2f);
// Add the cone to the list of game objects in the scene
gameObjectShapes.add(cone);
}
}
private void createCylinder() {
// Create all the cylinders of the scene
for (int i = 0; i < MAX_CYLINDERS; i++) {
// Position
float angle = i * 35.0f;
float radius = 3.0f;
Vector3f position = new Vector3f(
radius * MathHelper.Cos(angle),
25.0f + i * (CYLINDER_HEIGHT + 0.3f),
radius * MathHelper.Sin(angle));
// Create a cylinder and a corresponding rigid body in the dynamics world
Cylinder cylinder = new Cylinder(position, CYLINDER_HEIGHT, CYLINDER_RADIUS, CYLINDER_MASS, dynamicsWorld);
// The cylinder is a moving rigid body
RigidBody rigidBody = (RigidBody) cylinder.getRigidBody();
rigidBody.setIsMotionEnabled(true);
// Change the material properties of the rigid body
Material material = rigidBody.getMaterial();
material.setBounciness(0.2f);
// Add the cylinder to the list of game objects in the scene
gameObjectShapes.add(cylinder);
}
}
private void createFloor() {
// Create the floor
Vector3f floorPosition = new Vector3f();
Box floor = new Box(floorPosition, FLOOR_SIZE, FLOOR_MASS, dynamicsWorld);
// The floor must be a non-moving rigid body
RigidBody rigidBody = (RigidBody) floor.getRigidBody();
rigidBody.setIsMotionEnabled(false);
// Change the material properties of the rigid body
Material material = rigidBody.getMaterial();
material.setBounciness(0.2f);
// Add the floor to the list of game objects in the scene
gameObjectShapes.add(floor);
}
private void createSpheres() {
// Create all the spheres of the scene
for (int i = 0; i < MAX_SPHERES; i++) {
// Position
float angle = i * 35.0f;
float radius = 3.0f;
Vector3f position = new Vector3f(
radius * MathHelper.Cos(angle),
50.0f + i * (SPHERE_RADIUS + 0.8f),
radius * MathHelper.Sin(angle));
// Create a sphere and a corresponding rigid body in the dynamics world
Sphere sphere = new Sphere(position, SPHERE_RADIUS, SPHERE_MASS, dynamicsWorld);
// The sphere is a moving rigid body
RigidBody rigidBody = (RigidBody) sphere.getRigidBody();
rigidBody.setIsMotionEnabled(true);
// Change the material properties of the rigid body
Material material = rigidBody.getMaterial();
material.setBounciness(0.2f);
// Add the sphere to the list of game objects in the scene
gameObjectShapes.add(sphere);
}
}
private void generateContactPoints() {
visualContactPoints.clear();
List<ContactManifold> contactManifolds = dynamicsWorld.getContactManifolds();
for (ContactManifold contactManifold : contactManifolds) {
for (int i = 0; i < contactManifold.getNumContactPoints(); i++) {
ContactPoint point = contactManifold.getContactPoint(i);
Vector3 pos = point.getWorldPointOnBody1();
Vector3f position = new Vector3f(pos.getX(), pos.getY(), pos.getZ());
VisualContactPoint visualPoint = new VisualContactPoint(position);
visualContactPoints.add(visualPoint);
}
}
}
private void handleInput() {
if (Fw.input.isKeyDown(Keyboard.ESCAPE) == true) {
Fw.app.stopRunning();
}
cameraController.update();
}
@Override
public void destroy() {
for (GameObject gameObjectShape : gameObjectShapes) {
gameObjectShape.destroy();
}
VisualContactPoint.Destroy();
Fw.input.removeInputProcessor(cameraController);
Fw.input.releaseMouseCursor();
}
@Override
public void init() {
// Create timer
fpsTimer = new FpsTimer();
// Setup camera and controller
camera = GL.cameraFactory.createLegacyCamera();
camera.setPosition(0.0f, 6.0f, 25.0f);
cameraController = GL.cameraFactory.createLegacyCameraController();
cameraController.setCamera(camera);
// Time step and gravity for the physics simulation
float timeStep = 1.0f / 60.0f;
Vector3 gravity = new Vector3(0, -9.81f, 0);
// Create dynamics world
dynamicsWorld = new DynamicsWorld(gravity, timeStep);
dynamicsWorld.start();
// Float buffer for light and matrices
lightFloatBuffer = GL.bufferHelper.createFloatBuffer(4);
// Memory usage
memoryUsage = new MemoryUsage();
// Create game objects
createBoxes();
createCapsule();
createCones();
createCylinder();
createFloor();
createSpheres();
GL.o1.enableCulling();
GL.o1.cullBackFaces();
GL.o1.enableDepthTest();
GL.o1.setDepthFuncLess();
GL.o1.enableDepthMask();
GL.o1.setClearDepth(1.0f);
GL.o1.enableColorMaterial();
GL.o1.enableLight0();
GL.o1.enableLighting();
GL.o1.setSmoothLighting(true);
GL.o1.enableNormalize();
GL.o1.clear();
GL.o1.setProjectionPerspective(
70.0f,
(float) Fw.config.getCurrentWidth() / (float) Fw.config.getCurrentHeight(),
0.05f, 512.0f);
GL.o1.setModelViewIdentity();
// Light position
lightFloatBuffer.put(0.0f);
lightFloatBuffer.put(15.0f);
lightFloatBuffer.put(0.0f);
lightFloatBuffer.put(1.0f);
lightFloatBuffer.flip();
log.info("OpenGL version: " + GL.o1.getString(GetString.VERSION));
Fw.input.addInputProcessor(cameraController);
Fw.input.grabMouseCursor();
}
@Override
public void pause() {
}
@Override
public void render() {
fpsTimer.update();
memoryUsage.update();
if (Fw.timer.isGameTick()) {
// Do nothing
}
if (Fw.timer.isRenderTick()) {
handleInput();
// Take a simulation step
dynamicsWorld.update();
// Generate the new visual contact points
generateContactPoints();
// Clear screen and reset modelview matrix
GL.o1.clear();
GL.o1.setModelViewIdentity();
camera.updateOpenGL();
GL.o1.light(Light.LIGHT0, Light.POSITION, lightFloatBuffer);
// Render directly
for (AbstractGameObjectShape gameObjectShape : gameObjectShapes) {
gameObjectShape.updateTransform();
Fw.graphics.render(gameObjectShape);
}
// Render contact points
GL.o1.disableDepthTest();
for (GameObject visualContactPoint : visualContactPoints) {
Fw.graphics.render(visualContactPoint);
}
GL.o1.enableDepthTest();
}
}
@Override
public void resize(int width, int height) {
GL.o1.setViewport(0, 0, width, height);
}
@Override
public void resume() {
}
}

View File

@ -0,0 +1,71 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisionshapes;
import java.io.IOException;
import net.frameworkgl.Fw;
import net.frameworkgl.math.Transform4f;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.mesh.Mesh;
import net.frameworkgl.opengl.renderable.AbstractRenderable;
import org.atriasoft.ephysics.collision.shapes.ConeShape;
import org.atriasoft.ephysics.engine.DynamicsWorld;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Cone extends AbstractGameObjectShape {
public Cone(Vector3f position, float height, float radius, float mass, DynamicsWorld dynamicsWorld) {
// Scaling
Vector3f size = new Vector3f(radius, height, radius);
Transform4f scaling = new Transform4f();
scaling.getRotation().setDiagonal(size);
setScalingTransform(scaling); // Attach to game object
ConeShape collisionShape = new ConeShape(radius, height, 0.02f);
createRigidBody(collisionShape, position, mass, dynamicsWorld);
try {
// Mesh
Mesh mesh = GL.meshFactory.createMesh();
setMesh(mesh); // Attach mesh to game object
Fw.graphics.loadMesh("primitives/cone.obj", mesh);
mesh.setAllColors(0.8f, 0.8f, 0.8f, 1.0f);
mesh.updateHasBooleansFromSegment();
// Renderable
AbstractRenderable renderable = Fw.graphics.createInterleavedRenderable();
renderable.create(mesh);
setRenderable(renderable); // Attach to game object
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}

View File

@ -0,0 +1,39 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisionshapes;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Configuration extends net.frameworkgl.Configuration {
public Configuration(String[] args) {
super(args);
withOpenGL33ProfileCompatibility();
setWindowTitle("Collision Shapes");
}
}

View File

@ -0,0 +1,71 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisionshapes;
import java.io.IOException;
import net.frameworkgl.Fw;
import net.frameworkgl.math.Transform4f;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.mesh.Mesh;
import net.frameworkgl.opengl.renderable.AbstractRenderable;
import org.atriasoft.ephysics.collision.shapes.CylinderShape;
import org.atriasoft.ephysics.engine.DynamicsWorld;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Cylinder extends AbstractGameObjectShape {
public Cylinder(Vector3f position, float height, float radius, float mass, DynamicsWorld dynamicsWorld) {
// Scaling
Vector3f size = new Vector3f(radius, height, radius);
Transform4f scaling = new Transform4f();
scaling.getRotation().setDiagonal(size);
setScalingTransform(scaling); // Attach to game object
CylinderShape collisionShape = new CylinderShape(radius, height, 0.02f);
createRigidBody(collisionShape, position, mass, dynamicsWorld);
try {
// Mesh
Mesh mesh = GL.meshFactory.createMesh();
setMesh(mesh); // Attach mesh to game object
Fw.graphics.loadMesh("primitives/cylinder.obj", mesh);
mesh.setAllColors(0.8f, 0.8f, 0.8f, 1.0f);
mesh.updateHasBooleansFromSegment();
// Renderable
AbstractRenderable renderable = Fw.graphics.createInterleavedRenderable();
renderable.create(mesh);
setRenderable(renderable); // Attach to game object
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}

View File

@ -0,0 +1,43 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisionshapes;
import net.frameworkgl.Bootstrap;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Demo {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Bootstrap boot = new Bootstrap();
boot.start(Configuration.class, CollisionShapes.class, args);
}
}

View File

@ -0,0 +1,71 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisionshapes;
import java.io.IOException;
import net.frameworkgl.Fw;
import net.frameworkgl.math.Transform4f;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.mesh.Mesh;
import net.frameworkgl.opengl.renderable.AbstractRenderable;
import org.atriasoft.ephysics.collision.shapes.SphereShape;
import org.atriasoft.ephysics.engine.DynamicsWorld;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Sphere extends AbstractGameObjectShape {
public Sphere(Vector3f position, float radius, float mass, DynamicsWorld dynamicsWorld) {
// Scaling
Vector3f size = new Vector3f(radius, radius, radius);
Transform4f scaling = new Transform4f();
scaling.getRotation().setDiagonal(size);
setScalingTransform(scaling); // Attach to game object
SphereShape collisionShape = new SphereShape(radius, 0.02f);
createRigidBody(collisionShape, position, mass, dynamicsWorld);
try {
// Mesh
Mesh mesh = GL.meshFactory.createMesh();
setMesh(mesh); // Attach mesh to game object
Fw.graphics.loadMesh("primitives/uvsphere.obj", mesh);
mesh.setAllColors(0.8f, 0.8f, 0.8f, 1.0f);
mesh.updateHasBooleansFromSegment();
// Renderable
AbstractRenderable renderable = Fw.graphics.createInterleavedRenderable();
renderable.create(mesh);
setRenderable(renderable); // Attach to game object
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}

View File

@ -0,0 +1,96 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisionshapes;
import java.io.IOException;
import net.frameworkgl.Fw;
import net.frameworkgl.gameobjects.GameObject;
import net.frameworkgl.math.Transform4f;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.mesh.Mesh;
import net.frameworkgl.opengl.renderable.AbstractRenderable;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class VisualContactPoint extends GameObject {
private static final float VISUAL_CONTACT_POINT_RADIUS = 0.1f;
private static boolean initialized;
private static Mesh staticMesh;
private static AbstractRenderable staticRenderable;
public VisualContactPoint(Vector3f position) {
// Scaling
Vector3f size = new Vector3f(VISUAL_CONTACT_POINT_RADIUS, VISUAL_CONTACT_POINT_RADIUS, VISUAL_CONTACT_POINT_RADIUS);
Transform4f scaling = new Transform4f();
scaling.getRotation().setDiagonal(size);
setScalingTransform(scaling); // Attach to game object
getWorldTransform().getPosition().set(position);
getWorldTransform().multiply(getScalingTransform());
CreateStaticData();
setMesh(staticMesh); // Attach mesh to game object
setRenderable(staticRenderable); // Attach to game object
}
public static void CreateStaticData() {
if (initialized) {
return;
}
try {
// Mesh
staticMesh = GL.meshFactory.createMesh();
Fw.graphics.loadMesh("primitives/cone.obj", staticMesh);
staticMesh.setAllColors(1.0f, 1.0f, 0.0f, 1.0f);
staticMesh.updateHasBooleansFromSegment();
// Renderable
staticRenderable = Fw.graphics.createInterleavedRenderable();
staticRenderable.create(staticMesh);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
// Only do this once
initialized = true;
}
public static void Destroy() {
if (!initialized) {
return;
}
staticRenderable.destroy();
staticRenderable = null;
initialized = false;
}
}

View File

@ -0,0 +1,82 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisiontest;
import net.frameworkgl.gameobjects.GameObject;
import net.frameworkgl.math.Vector3f;
import org.atriasoft.ephysics.body.RigidBody;
import org.atriasoft.ephysics.collision.shapes.CollisionShape;
import org.atriasoft.ephysics.engine.DynamicsWorld;
import org.atriasoft.ephysics.mathematics.Matrix3x3;
import org.atriasoft.etk.math.Quaternion;
import org.atriasoft.ephysics.mathematics.Transform;
import org.atriasoft.ephysics.mathematics.Vector3;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public abstract class AbstractGameObjectShape extends GameObject {
private CollisionShape collisionShape;
private RigidBody rigidBody;
protected void createRigidBody(
CollisionShape collisionShape, Vector3f position, float mass, DynamicsWorld dynamicsWorld) {
this.collisionShape = collisionShape;
Matrix3x3 inertiaTensor = collisionShape.computeLocalInertiaTensor(mass);
Quaternion initOrientation = new Quaternion().identity();
Vector3 initPosition = new Vector3(position.getX(), position.getY(), position.getZ());
Transform transform = new Transform(initPosition, initOrientation);
rigidBody = dynamicsWorld.createRigidBody(transform, mass, inertiaTensor, collisionShape);
}
public CollisionShape getCollisionShape() {
return collisionShape;
}
public RigidBody getRigidBody() {
return rigidBody;
}
public void updateTransform() {
// Get the interpolated transform of the rigid body
Transform transform = rigidBody.getInterpolatedTransform(new Transform());
// Compute the transform used for rendering the box
float[] glMatrix = new float[16];
transform.getOpenGLMatrix(glMatrix);
// Apply the scaling matrix to have the correct box dimensions
getWorldTransform().fromOpenGLArray(glMatrix);
getWorldTransform().multiply(getScalingTransform());
}
}

View File

@ -0,0 +1,73 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisiontest;
import java.io.IOException;
import net.frameworkgl.Fw;
import net.frameworkgl.math.Transform4f;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.mesh.Mesh;
import net.frameworkgl.opengl.renderable.AbstractRenderable;
import org.atriasoft.ephysics.collision.shapes.BoxShape;
import org.atriasoft.ephysics.engine.DynamicsWorld;
import org.atriasoft.ephysics.mathematics.Vector3;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Box extends AbstractGameObjectShape {
public Box(Vector3f position, Vector3f size, float mass, DynamicsWorld dynamicsWorld) {
// Scaling
Vector3f halfSize = new Vector3f(size).multiply(0.5f);
Transform4f scaling = new Transform4f();
scaling.getRotation().setDiagonal(halfSize);
setScalingTransform(scaling); // Attach to game object
Vector3 extent = new Vector3(size.getX(), size.getY(), size.getZ()).multiply(0.5f);
BoxShape collisionShape = new BoxShape(extent, 0.02f);
createRigidBody(collisionShape, position, mass, dynamicsWorld);
try {
// Mesh
Mesh mesh = GL.meshFactory.createMesh();
setMesh(mesh); // Attach mesh to game object
Fw.graphics.loadMesh("primitives/cube.obj", mesh);
mesh.setAllColors(0.3f, 0.3f, 0.3f, 1.0f);
mesh.updateHasBooleansFromSegment();
// Renderable
AbstractRenderable renderable = Fw.graphics.createInterleavedRenderable();
renderable.create(mesh);
setRenderable(renderable); // Attach to game object
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}

View File

@ -0,0 +1,71 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisiontest;
import java.io.IOException;
import net.frameworkgl.Fw;
import net.frameworkgl.math.Transform4f;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.mesh.Mesh;
import net.frameworkgl.opengl.renderable.AbstractRenderable;
import org.atriasoft.ephysics.collision.shapes.CapsuleShape;
import org.atriasoft.ephysics.engine.DynamicsWorld;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Capsule extends AbstractGameObjectShape {
public Capsule(Vector3f position, float height, float radius, float mass, DynamicsWorld dynamicsWorld) {
// Scaling
Vector3f size = new Vector3f(radius, (height + 2.0f * radius) / 3.0f, radius);
Transform4f scaling = new Transform4f();
scaling.getRotation().setDiagonal(size);
setScalingTransform(scaling); // Attach to game object
CapsuleShape collisionShape = new CapsuleShape(radius, height, 0.02f);
createRigidBody(collisionShape, position, mass, dynamicsWorld);
try {
// Mesh
Mesh mesh = GL.meshFactory.createMesh();
setMesh(mesh); // Attach mesh to game object
Fw.graphics.loadMesh("primitives/capsule.obj", mesh);
mesh.setAllColors(0.8f, 0.8f, 0.8f, 1.0f);
mesh.updateHasBooleansFromSegment();
// Renderable
AbstractRenderable renderable = Fw.graphics.createInterleavedRenderable();
renderable.create(mesh);
setRenderable(renderable); // Attach to game object
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}

View File

@ -0,0 +1,280 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisiontest;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import java.util.List;
import net.frameworkgl.Fw;
import net.frameworkgl.gameobjects.GameObject;
import net.frameworkgl.Screen;
import net.frameworkgl.helpers.Keyboard;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.camera.LegacyCamera;
import net.frameworkgl.opengl.camera.LegacyCameraController;
import net.frameworkgl.opengl.constants.GetString;
import net.frameworkgl.opengl.constants.Light;
import net.frameworkgl.utils.FpsTimer;
import net.frameworkgl.utils.MemoryUsage;
import org.atriasoft.ephysics.body.RigidBody;
import org.atriasoft.ephysics.constraint.ContactPoint;
import org.atriasoft.ephysics.engine.ContactManifold;
import org.atriasoft.ephysics.engine.DynamicsWorld;
import org.atriasoft.ephysics.engine.Material;
import org.atriasoft.ephysics.mathematics.Vector3;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class CollisionTest extends Screen {
private final static Logger log = LoggerFactory.getLogger(CollisionTest.class);
private static final float BOX_MASS = 1.0f;
private static final float CAPSULE_HEIGHT = 1.0f;
private static final float CAPSULE_MASS = 1.0f;
private static final float CAPSULE_RADIUS = 1.0f;
private static final float CONE_HEIGHT = 3.0f;
private static final float CONE_MASS = 1.0f;
private static final float CONE_RADIUS = 2.0f;
private static final float CYLINDER_HEIGHT = 5.0f;
private static final float CYLINDER_MASS = 1.0f;
private static final float CYLINDER_RADIUS = 1.0f;
private static final float FLOOR_MASS = 100.0f;
private static final float SPHERE_MASS = 1.5f;
private static final float SPHERE_RADIUS = 1.0f;
private static final Vector3f BOX_SIZE = new Vector3f(2.0f, 2.0f, 2.0f);
private DynamicsWorld dynamicsWorld;
private FloatBuffer lightFloatBuffer;
private FpsTimer fpsTimer;
private LegacyCamera camera;
private LegacyCameraController cameraController;
private final List<AbstractGameObjectShape> gameObjectShapes;
private final List<VisualContactPoint> visualContactPoints;
private MemoryUsage memoryUsage;
public CollisionTest(String[] args) {
gameObjectShapes = new ArrayList<>();
visualContactPoints = new ArrayList<>();
}
private void generateContactPoints() {
visualContactPoints.clear();
List<ContactManifold> contactManifolds = dynamicsWorld.getContactManifolds();
for (ContactManifold contactManifold : contactManifolds) {
for (int i = 0; i < contactManifold.getNumContactPoints(); i++) {
ContactPoint point = contactManifold.getContactPoint(i);
Vector3 pos = point.getWorldPointOnBody1();
Vector3f position = new Vector3f(pos.getX(), pos.getY(), pos.getZ());
VisualContactPoint visualPoint = new VisualContactPoint(position);
visualContactPoints.add(visualPoint);
}
}
}
private void handleInput() {
if (Fw.input.isKeyDown(Keyboard.ESCAPE) == true) {
Fw.app.stopRunning();
}
Vector3f direction = new Vector3f();
if (Fw.input.isKeyDown(Keyboard.NUM0) == true) {
direction.setY(1.0f);
}
if (Fw.input.isKeyDown(Keyboard.NUM2) == true) {
direction.setY(-1.0f);
}
if (Fw.input.isKeyDown(Keyboard.NUM4) == true) {
direction.setX(-1.0f);
}
if (Fw.input.isKeyDown(Keyboard.NUM6) == true) {
direction.setX(1.0f);
}
if (Fw.input.isKeyDown(Keyboard.NUM7) == true) {
direction.setZ(-1.0f);
}
if (Fw.input.isKeyDown(Keyboard.NUM9) == true) {
direction.setZ(1.0f);
}
RigidBody rigidBody = (RigidBody) cylinderMoveable.getRigidBody();
if (Fw.input.isKeyDown(Keyboard.NUM1) == true) {
rigidBody.applyTorque(new Vector3(0.5f, 0.0f, 0.0f));
}
if (Fw.input.isKeyDown(Keyboard.NUM3) == true) {
rigidBody.applyTorque(new Vector3(-0.5f, 0.0f, 0.0f));
}
if (direction.magnitudeSquared() > 0) {
direction.normalize();
rigidBody.applyForceToCenter(new Vector3(direction.getX(), direction.getY(), direction.getZ()));
}
cameraController.update();
}
@Override
public void destroy() {
for (GameObject gameObjectShape : gameObjectShapes) {
gameObjectShape.destroy();
}
VisualContactPoint.Destroy();
Fw.input.removeInputProcessor(cameraController);
Fw.input.releaseMouseCursor();
}
private Cylinder cylinderMoveable;
@Override
public void init() {
// Create timer
fpsTimer = new FpsTimer();
// Setup camera and controller
camera = GL.cameraFactory.createLegacyCamera();
camera.setPosition(0.0f, 1.0f, 5.0f);
cameraController = GL.cameraFactory.createLegacyCameraController();
cameraController.setCamera(camera);
// Time step and gravity for the physics simulation
float timeStep = 1.0f / 60.0f;
Vector3 gravity = new Vector3(0, -9.81f, 0);
// Create dynamics world
dynamicsWorld = new DynamicsWorld(gravity, timeStep);
dynamicsWorld.setIsGratityEnabled(false);
dynamicsWorld.start();
// Float buffer for light and matrices
lightFloatBuffer = GL.bufferHelper.createFloatBuffer(4);
// Memory usage
memoryUsage = new MemoryUsage();
// Add spheres
Material material;
RigidBody rigidBody;
Box floor;
floor = new Box(new Vector3f(), new Vector3f(40.0f, 0.5f, 40.0f), FLOOR_MASS, dynamicsWorld);
rigidBody = (RigidBody) floor.getRigidBody();
rigidBody.setIsMotionEnabled(false);
material = rigidBody.getMaterial();
material.setBounciness(0.2f);
gameObjectShapes.add(floor);
cylinderMoveable = new Cylinder(new Vector3f(0.0f, 3.0f, 0.0f), CYLINDER_HEIGHT, CYLINDER_RADIUS, CYLINDER_MASS, dynamicsWorld);
rigidBody = (RigidBody) cylinderMoveable.getRigidBody();
rigidBody.setIsMotionEnabled(true);
material = rigidBody.getMaterial();
material.setBounciness(0.2f);
gameObjectShapes.add(cylinderMoveable);
GL.o1.enableCulling();
GL.o1.cullBackFaces();
GL.o1.enableDepthTest();
GL.o1.setDepthFuncLess();
GL.o1.enableDepthMask();
GL.o1.setClearDepth(1.0f);
GL.o1.enableColorMaterial();
GL.o1.enableLight0();
GL.o1.enableLighting();
GL.o1.setSmoothLighting(true);
GL.o1.enableNormalize();
GL.o1.clear();
GL.o1.setProjectionPerspective(
70.0f,
(float) Fw.config.getCurrentWidth() / (float) Fw.config.getCurrentHeight(),
0.05f, 512.0f);
GL.o1.setModelViewIdentity();
// Light position
lightFloatBuffer.put(0.0f);
lightFloatBuffer.put(15.0f);
lightFloatBuffer.put(0.0f);
lightFloatBuffer.put(1.0f);
lightFloatBuffer.flip();
log.info("OpenGL version: " + GL.o1.getString(GetString.VERSION));
Fw.input.addInputProcessor(cameraController);
Fw.input.grabMouseCursor();
}
@Override
public void pause() {
}
@Override
public void render() {
fpsTimer.update();
memoryUsage.update();
if (Fw.timer.isGameTick()) {
// Do nothing
}
if (Fw.timer.isRenderTick()) {
handleInput();
// Take a simulation step
dynamicsWorld.update();
// Generate the new visual contact points
generateContactPoints();
// Clear screen and reset modelview matrix
GL.o1.clear();
GL.o1.setModelViewIdentity();
camera.updateOpenGL();
GL.o1.light(Light.LIGHT0, Light.POSITION, lightFloatBuffer);
// Render directly
for (AbstractGameObjectShape gameObjectShape : gameObjectShapes) {
gameObjectShape.updateTransform();
Fw.graphics.render(gameObjectShape);
}
// Render contact points
GL.o1.disableDepthTest();
for (GameObject visualContactPoint : visualContactPoints) {
Fw.graphics.render(visualContactPoint);
}
GL.o1.enableDepthTest();
}
}
@Override
public void resize(int width, int height) {
GL.o1.setViewport(0, 0, width, height);
}
@Override
public void resume() {
}
}

View File

@ -0,0 +1,71 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisiontest;
import java.io.IOException;
import net.frameworkgl.Fw;
import net.frameworkgl.math.Transform4f;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.mesh.Mesh;
import net.frameworkgl.opengl.renderable.AbstractRenderable;
import org.atriasoft.ephysics.collision.shapes.ConeShape;
import org.atriasoft.ephysics.engine.DynamicsWorld;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Cone extends AbstractGameObjectShape {
public Cone(Vector3f position, float height, float radius, float mass, DynamicsWorld dynamicsWorld) {
// Scaling
Vector3f size = new Vector3f(radius, height, radius);
Transform4f scaling = new Transform4f();
scaling.getRotation().setDiagonal(size);
setScalingTransform(scaling); // Attach to game object
ConeShape collisionShape = new ConeShape(radius, height, 0.02f);
createRigidBody(collisionShape, position, mass, dynamicsWorld);
try {
// Mesh
Mesh mesh = GL.meshFactory.createMesh();
setMesh(mesh); // Attach mesh to game object
Fw.graphics.loadMesh("primitives/cone.obj", mesh);
mesh.setAllColors(0.8f, 0.8f, 0.8f, 1.0f);
mesh.updateHasBooleansFromSegment();
// Renderable
AbstractRenderable renderable = Fw.graphics.createInterleavedRenderable();
renderable.create(mesh);
setRenderable(renderable); // Attach to game object
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}

View File

@ -0,0 +1,39 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisiontest;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Configuration extends net.frameworkgl.Configuration {
public Configuration(String[] args) {
super(args);
withOpenGL33ProfileCompatibility();
setWindowTitle("Collision Test");
}
}

View File

@ -0,0 +1,71 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisiontest;
import java.io.IOException;
import net.frameworkgl.Fw;
import net.frameworkgl.math.Transform4f;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.mesh.Mesh;
import net.frameworkgl.opengl.renderable.AbstractRenderable;
import org.atriasoft.ephysics.collision.shapes.CylinderShape;
import org.atriasoft.ephysics.engine.DynamicsWorld;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Cylinder extends AbstractGameObjectShape {
public Cylinder(Vector3f position, float height, float radius, float mass, DynamicsWorld dynamicsWorld) {
// Scaling
Vector3f size = new Vector3f(radius, height, radius);
Transform4f scaling = new Transform4f();
scaling.getRotation().setDiagonal(size);
setScalingTransform(scaling); // Attach to game object
CylinderShape collisionShape = new CylinderShape(radius, height, 0.02f);
createRigidBody(collisionShape, position, mass, dynamicsWorld);
try {
// Mesh
Mesh mesh = GL.meshFactory.createMesh();
setMesh(mesh); // Attach mesh to game object
Fw.graphics.loadMesh("primitives/cylinder.obj", mesh);
mesh.setAllColors(0.8f, 0.8f, 0.8f, 1.0f);
mesh.updateHasBooleansFromSegment();
// Renderable
AbstractRenderable renderable = Fw.graphics.createInterleavedRenderable();
renderable.create(mesh);
setRenderable(renderable); // Attach to game object
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}

View File

@ -0,0 +1,43 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisiontest;
import net.frameworkgl.Bootstrap;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Demo {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Bootstrap boot = new Bootstrap();
boot.start(Configuration.class, CollisionTest.class, args);
}
}

View File

@ -0,0 +1,71 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisiontest;
import java.io.IOException;
import net.frameworkgl.Fw;
import net.frameworkgl.math.Transform4f;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.mesh.Mesh;
import net.frameworkgl.opengl.renderable.AbstractRenderable;
import org.atriasoft.ephysics.collision.shapes.SphereShape;
import org.atriasoft.ephysics.engine.DynamicsWorld;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class Sphere extends AbstractGameObjectShape {
public Sphere(Vector3f position, float radius, float mass, DynamicsWorld dynamicsWorld) {
// Scaling
Vector3f size = new Vector3f(radius, radius, radius);
Transform4f scaling = new Transform4f();
scaling.getRotation().setDiagonal(size);
setScalingTransform(scaling); // Attach to game object
SphereShape collisionShape = new SphereShape(radius, 0.02f);
createRigidBody(collisionShape, position, mass, dynamicsWorld);
try {
// Mesh
Mesh mesh = GL.meshFactory.createMesh();
setMesh(mesh); // Attach mesh to game object
Fw.graphics.loadMesh("primitives/uvsphere.obj", mesh);
mesh.setAllColors(0.8f, 0.8f, 0.8f, 1.0f);
mesh.updateHasBooleansFromSegment();
// Renderable
AbstractRenderable renderable = Fw.graphics.createInterleavedRenderable();
renderable.create(mesh);
setRenderable(renderable); // Attach to game object
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}

View File

@ -0,0 +1,96 @@
/*
* ReactPhysics3D physics library, http://code.google.com/p/reactphysics3d/
* Copyright (c) 2010-2013 Daniel Chappuis
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the
* use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim
* that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* This file has been modified during the port to Java and differ from the source versions.
*/
package org.atriasoft.ephysics.examples.collisiontest;
import java.io.IOException;
import net.frameworkgl.Fw;
import net.frameworkgl.gameobjects.GameObject;
import net.frameworkgl.math.Transform4f;
import net.frameworkgl.math.Vector3f;
import net.frameworkgl.opengl.GL;
import net.frameworkgl.opengl.mesh.Mesh;
import net.frameworkgl.opengl.renderable.AbstractRenderable;
/**
*
* @author Jason Sorensen <sorensenj@smert.net>
*/
public class VisualContactPoint extends GameObject {
private static final float VISUAL_CONTACT_POINT_RADIUS = 0.1f;
private static boolean initialized;
private static Mesh staticMesh;
private static AbstractRenderable staticRenderable;
public VisualContactPoint(Vector3f position) {
// Scaling
Vector3f size = new Vector3f(VISUAL_CONTACT_POINT_RADIUS, VISUAL_CONTACT_POINT_RADIUS, VISUAL_CONTACT_POINT_RADIUS);
Transform4f scaling = new Transform4f();
scaling.getRotation().setDiagonal(size);
setScalingTransform(scaling); // Attach to game object
getWorldTransform().getPosition().set(position);
getWorldTransform().multiply(getScalingTransform());
CreateStaticData();
setMesh(staticMesh); // Attach mesh to game object
setRenderable(staticRenderable); // Attach to game object
}
public static void CreateStaticData() {
if (initialized) {
return;
}
try {
// Mesh
staticMesh = GL.meshFactory.createMesh();
Fw.graphics.loadMesh("primitives/cone.obj", staticMesh);
staticMesh.setAllColors(1.0f, 1.0f, 0.0f, 1.0f);
staticMesh.updateHasBooleansFromSegment();
// Renderable
staticRenderable = Fw.graphics.createInterleavedRenderable();
staticRenderable.create(staticMesh);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
// Only do this once
initialized = true;
}
public static void Destroy() {
if (!initialized) {
return;
}
staticRenderable.destroy();
staticRenderable = null;
initialized = false;
}
}

View File

@ -5,8 +5,20 @@ import org.atriasoft.etk.math.Vector3f;
public class Triangle {
public final Vector3f[] value = new Vector3f[3];
public Triangle() {}
public Triangle(Vector3f data1, Vector3f data2, Vector3f data3) {
this.value[0] = data1;
this.value[1] = data2;
this.value[2] = data3;
}
public Vector3f get(final int id) {
return this.value[id];
}
public void set(final int id, Vector3f data) {
this.value[id] = data;
}
}

View File

@ -2,7 +2,6 @@ package org.atriasoft.ephysics.collision.broadphase;
import java.util.Set;
@SuppressWarnings("preview")
public record PairDTree(
DTree first,
DTree second) {

View File

@ -85,7 +85,7 @@ public class BoxShape extends ConvexShape {
@Override
public boolean raycast(final Ray ray, final RaycastInfo raycastInfo, final ProxyShape proxyShape) {
final Vector3f rayDirection = ray.point2.less(ray.point1);
float tMin = Float.MIN_VALUE;
float tMin = -Float.MAX_VALUE;
float tMax = Float.MAX_VALUE;
Vector3f normalDirection = Vector3f.ZERO;
Vector3f currentNormal = Vector3f.ZERO;

View File

@ -210,7 +210,7 @@ public class ConvexMeshShape extends ConvexShape {
// If the edges information is used to speed up the collision detection
if (!this.isEdgesInformationUsed) {
// If the edges information is not used
double maxDotProduct = Float.MIN_VALUE;
double maxDotProduct = -Float.MAX_VALUE;
int indexMaxDotProduct = 0;
// For each vertex of the mesh
for (int i = 0; i < this.numberVertices; i++) {

View File

@ -30,7 +30,7 @@ public class Defaults {
// Maximum decimal value
public static final float DECIMAL_LARGEST = Float.MAX_VALUE;
// Smallest decimal value (negative)
public static final float DECIMAL_SMALLEST = Float.MIN_VALUE;
public static final float DECIMAL_SMALLEST = -Float.MAX_VALUE;
// Default bounciness factor for a rigid body
public static final float DEFAULT_BOUNCINESS = 0.5f;