summaryrefslogtreecommitdiff
path: root/core/src/org/snoopdesigns/endless/physics
diff options
context:
space:
mode:
authorDmitri Morozov <snoopdesigns@gmail.com>2024-02-02 18:58:12 +0100
committerue86388 <dmitrii.morozov@sbb.ch>2024-02-02 18:58:12 +0100
commite3935fe4b6ecfbe161001fc95d295f53e8520c52 (patch)
tree0cb9525d8a616674be57aa5cc90444c081fadc03 /core/src/org/snoopdesigns/endless/physics
parente55b03a924ab9dc02e2baca77ce49deae27dda6d (diff)
Initial commit
Diffstat (limited to 'core/src/org/snoopdesigns/endless/physics')
-rw-r--r--core/src/org/snoopdesigns/endless/physics/Box2DDebugRenderer.java28
-rw-r--r--core/src/org/snoopdesigns/endless/physics/Box2DLocation.java46
-rw-r--r--core/src/org/snoopdesigns/endless/physics/Box2DRenderer.java22
-rw-r--r--core/src/org/snoopdesigns/endless/physics/PhysicalBody.java32
-rw-r--r--core/src/org/snoopdesigns/endless/physics/SteerablePhysicalBody.java115
-rw-r--r--core/src/org/snoopdesigns/endless/physics/WorldContext.java17
-rw-r--r--core/src/org/snoopdesigns/endless/physics/camera/CameraContext.java48
-rw-r--r--core/src/org/snoopdesigns/endless/physics/camera/CameraRenderer.java55
8 files changed, 363 insertions, 0 deletions
diff --git a/core/src/org/snoopdesigns/endless/physics/Box2DDebugRenderer.java b/core/src/org/snoopdesigns/endless/physics/Box2DDebugRenderer.java
new file mode 100644
index 0000000..15f930f
--- /dev/null
+++ b/core/src/org/snoopdesigns/endless/physics/Box2DDebugRenderer.java
@@ -0,0 +1,28 @@
+package org.snoopdesigns.endless.physics;
+
+import org.snoopdesigns.endless.context.Context;
+import org.snoopdesigns.endless.renderer.Renderer;
+
+public class Box2DDebugRenderer implements Renderer {
+
+ private com.badlogic.gdx.physics.box2d.Box2DDebugRenderer debugRenderer;
+
+ @Override
+ public void create() {
+ debugRenderer = new com.badlogic.gdx.physics.box2d.Box2DDebugRenderer();
+ debugRenderer.setDrawBodies(true);
+ debugRenderer.setDrawVelocities(true);
+ debugRenderer.setDrawAABBs(true);
+ }
+
+ @Override
+ public void render() {
+ debugRenderer.render(
+ Context.getInstance().getWorldContext().getWorld(),
+ Context.getInstance().getCameraContext().getCameraProjection());
+ }
+
+ @Override
+ public void dispose() {
+ }
+}
diff --git a/core/src/org/snoopdesigns/endless/physics/Box2DLocation.java b/core/src/org/snoopdesigns/endless/physics/Box2DLocation.java
new file mode 100644
index 0000000..338b595
--- /dev/null
+++ b/core/src/org/snoopdesigns/endless/physics/Box2DLocation.java
@@ -0,0 +1,46 @@
+package org.snoopdesigns.endless.physics;
+
+import com.badlogic.gdx.ai.utils.Location;
+import com.badlogic.gdx.math.Vector2;
+
+public class Box2DLocation implements Location<Vector2> {
+ Vector2 position;
+ float orientation;
+
+ public Box2DLocation () {
+ this.position = new Vector2();
+ this.orientation = 0;
+ }
+
+ @Override
+ public Vector2 getPosition () {
+ return position;
+ }
+
+ @Override
+ public float getOrientation () {
+ return orientation;
+ }
+
+ @Override
+ public void setOrientation (float orientation) {
+ this.orientation = orientation;
+ }
+
+ @Override
+ public Location<Vector2> newLocation () {
+ return new Box2DLocation();
+ }
+
+ @Override
+ public float vectorToAngle (Vector2 vector) {
+ return (float)Math.atan2(-vector.x, vector.y);
+ }
+
+ @Override
+ public Vector2 angleToVector (Vector2 outVector, float angle) {
+ outVector.x = -(float)Math.sin(angle);
+ outVector.y = (float)Math.cos(angle);
+ return outVector;
+ }
+}
diff --git a/core/src/org/snoopdesigns/endless/physics/Box2DRenderer.java b/core/src/org/snoopdesigns/endless/physics/Box2DRenderer.java
new file mode 100644
index 0000000..641e397
--- /dev/null
+++ b/core/src/org/snoopdesigns/endless/physics/Box2DRenderer.java
@@ -0,0 +1,22 @@
+package org.snoopdesigns.endless.physics;
+
+import com.badlogic.gdx.physics.box2d.Box2D;
+import org.snoopdesigns.endless.context.Context;
+import org.snoopdesigns.endless.renderer.Renderer;
+
+public class Box2DRenderer implements Renderer {
+
+ @Override
+ public void create() {
+ Box2D.init();
+ }
+
+ @Override
+ public void render() {
+ Context.getInstance().getWorldContext().getWorld().step(1/60f, 6, 2);
+ }
+
+ @Override
+ public void dispose() {
+ }
+}
diff --git a/core/src/org/snoopdesigns/endless/physics/PhysicalBody.java b/core/src/org/snoopdesigns/endless/physics/PhysicalBody.java
new file mode 100644
index 0000000..23ede8d
--- /dev/null
+++ b/core/src/org/snoopdesigns/endless/physics/PhysicalBody.java
@@ -0,0 +1,32 @@
+package org.snoopdesigns.endless.physics;
+
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.physics.box2d.Body;
+import com.badlogic.gdx.physics.box2d.BodyDef;
+import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
+import com.badlogic.gdx.physics.box2d.FixtureDef;
+import org.snoopdesigns.endless.context.Context;
+
+public abstract class PhysicalBody {
+
+ Body body;
+
+ public abstract BodyType getBodyType();
+ public abstract FixtureDef getFixture();
+
+ public Vector2 getInitialPosition() {
+ return new Vector2(0, 0);
+ }
+
+ public void initBody() {
+ final BodyDef bodyDef = new BodyDef();
+ bodyDef.type = getBodyType();
+ bodyDef.position.set(getInitialPosition());
+ body = Context.getInstance().getWorldContext().getWorld().createBody(bodyDef);
+ body.createFixture(getFixture());
+ }
+
+ public Body getBody() {
+ return body;
+ }
+}
diff --git a/core/src/org/snoopdesigns/endless/physics/SteerablePhysicalBody.java b/core/src/org/snoopdesigns/endless/physics/SteerablePhysicalBody.java
new file mode 100644
index 0000000..9e9a85c
--- /dev/null
+++ b/core/src/org/snoopdesigns/endless/physics/SteerablePhysicalBody.java
@@ -0,0 +1,115 @@
+package org.snoopdesigns.endless.physics;
+
+import com.badlogic.gdx.ai.steer.Steerable;
+import com.badlogic.gdx.ai.utils.Location;
+import com.badlogic.gdx.math.Vector2;
+
+public abstract class SteerablePhysicalBody extends PhysicalBody implements Steerable<Vector2> {
+
+ public abstract float getMaxSpeed();
+ public abstract float getMaxAcceleration();
+ public abstract float getMaxRotationSpeed();
+ public abstract float getMaxRotationAcceleration();
+
+ @Override
+ public Vector2 getLinearVelocity() {
+ return getBody().getLinearVelocity();
+ }
+
+ @Override
+ public float getAngularVelocity() {
+ return getBody().getAngularVelocity();
+ }
+
+ @Override
+ public float getBoundingRadius() {
+ return 0.001f;
+ }
+
+ @Override
+ public boolean isTagged() {
+ return false;
+ }
+
+ @Override
+ public void setTagged(boolean tagged) {
+ }
+
+ @Override
+ public float getZeroLinearSpeedThreshold() {
+ return 0.1f;
+ }
+
+ @Override
+ public void setZeroLinearSpeedThreshold(float value) {
+ }
+
+ @Override
+ public float getMaxLinearSpeed() {
+ return getMaxSpeed();
+ }
+
+ @Override
+ public void setMaxLinearSpeed(float maxLinearSpeed) {
+ }
+
+ @Override
+ public float getMaxLinearAcceleration() {
+ return getMaxAcceleration();
+ }
+
+ @Override
+ public void setMaxLinearAcceleration(float maxLinearAcceleration) {
+ }
+
+ @Override
+ public float getMaxAngularSpeed() {
+ return getMaxRotationSpeed();
+ }
+
+ @Override
+ public void setMaxAngularSpeed(float maxAngularSpeed) {
+ }
+
+ @Override
+ public float getMaxAngularAcceleration() {
+ return getMaxRotationAcceleration();
+ }
+
+ @Override
+ public void setMaxAngularAcceleration(float maxAngularAcceleration) {
+ }
+
+ @Override
+ public Vector2 getPosition() {
+ return getBody().getPosition();
+ }
+
+ @Override
+ public float getOrientation() {
+ return getBody().getAngle();
+ }
+
+ @Override
+ public void setOrientation(float orientation) {
+ getBody().setTransform(getPosition(), orientation);
+ }
+
+ @Override
+ public float vectorToAngle(Vector2 vector) {
+ return vector.angleRad();
+ }
+
+ @Override
+ public Vector2 angleToVector(Vector2 outVector, float angle) {
+ final var tmpVector = new Vector2(1, 0).rotateRad(angle);
+ outVector.x = tmpVector.x;
+ outVector.y = tmpVector.y;
+ return outVector;
+ }
+
+ @Override
+ public Location<Vector2> newLocation() {
+ return new Box2DLocation();
+ }
+}
diff --git a/core/src/org/snoopdesigns/endless/physics/WorldContext.java b/core/src/org/snoopdesigns/endless/physics/WorldContext.java
new file mode 100644
index 0000000..5f10ba8
--- /dev/null
+++ b/core/src/org/snoopdesigns/endless/physics/WorldContext.java
@@ -0,0 +1,17 @@
+package org.snoopdesigns.endless.physics;
+
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.physics.box2d.World;
+
+public class WorldContext {
+
+ private final World world;
+
+ public WorldContext() {
+ this.world = new World(new Vector2(0, 0), true);
+ }
+
+ public World getWorld() {
+ return world;
+ }
+}
diff --git a/core/src/org/snoopdesigns/endless/physics/camera/CameraContext.java b/core/src/org/snoopdesigns/endless/physics/camera/CameraContext.java
new file mode 100644
index 0000000..635813c
--- /dev/null
+++ b/core/src/org/snoopdesigns/endless/physics/camera/CameraContext.java
@@ -0,0 +1,48 @@
+package org.snoopdesigns.endless.physics.camera;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.math.Matrix4;
+import com.badlogic.gdx.math.Vector2;
+
+public final class CameraContext {
+
+ private static final float DEFAULT_WORLD_WIDTH = 300.0f;
+
+ private final Vector2 position;
+ private final Vector2 viewport;
+ private float zoom;
+ private Matrix4 cameraProjection;
+
+ public CameraContext() {
+ final float w = Gdx.graphics.getWidth();
+ final float h = Gdx.graphics.getHeight();
+
+ this.position = new Vector2(0, 0);
+ this.zoom = 1.0f;
+ this.viewport = new Vector2(DEFAULT_WORLD_WIDTH, DEFAULT_WORLD_WIDTH * (h / w));
+ }
+
+ public Matrix4 getCameraProjection() {
+ return cameraProjection;
+ }
+
+ public void setCameraProjection(Matrix4 cameraProjection) {
+ this.cameraProjection = cameraProjection;
+ }
+
+ public Vector2 getPosition() {
+ return position;
+ }
+
+ public float getZoom() {
+ return zoom;
+ }
+
+ public void setZoom(float zoom) {
+ this.zoom = zoom;
+ }
+
+ public Vector2 getViewport() {
+ return viewport;
+ }
+}
diff --git a/core/src/org/snoopdesigns/endless/physics/camera/CameraRenderer.java b/core/src/org/snoopdesigns/endless/physics/camera/CameraRenderer.java
new file mode 100644
index 0000000..165240a
--- /dev/null
+++ b/core/src/org/snoopdesigns/endless/physics/camera/CameraRenderer.java
@@ -0,0 +1,55 @@
+package org.snoopdesigns.endless.physics.camera;
+
+import com.badlogic.gdx.graphics.OrthographicCamera;
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.utils.viewport.ExtendViewport;
+import com.badlogic.gdx.utils.viewport.Viewport;
+import org.snoopdesigns.endless.context.Context;
+import org.snoopdesigns.endless.renderer.Renderer;
+
+public class CameraRenderer implements Renderer {
+
+ private static final float DEFAULT_WORLD_WIDTH = 300.0f;
+ private static final float DEFAULT_WORLD_HEIGHT = 300.0f;
+
+ private OrthographicCamera camera;
+ private Viewport viewport;
+
+ @Override
+ public void create() {
+ camera = new OrthographicCamera();
+ camera.zoom = Context.getInstance().getCameraContext().getZoom();
+ viewport = new ExtendViewport(
+ Context.getInstance().getCameraContext().getViewport().x,
+ Context.getInstance().getCameraContext().getViewport().y,
+ camera);
+ camera.update();
+ Context.getInstance().getCameraContext().setCameraProjection(camera.combined);
+ }
+
+ @Override
+ public void render() {
+ final Vector2 cameraPosition = Context.getInstance().getCameraContext().getPosition();
+ camera.position.set(cameraPosition.x, cameraPosition.y, 0);
+ camera.update();
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public void resize(int width, int height) {
+ viewport.update(width, height);
+ Context.getInstance().getCameraContext().getViewport().set(
+ camera.viewportWidth,
+ camera.viewportHeight);
+ }
+
+ @Override
+ public boolean scrolled(float amountX, float amountY) {
+ camera.zoom += amountY / 10f;
+ Context.getInstance().getCameraContext().setZoom(camera.zoom);
+ return true;
+ }
+}