summaryrefslogtreecommitdiff
path: root/core/src/main/java/coffee/liz/ecs
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/java/coffee/liz/ecs')
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/components/physics/BoundingBox.java34
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/components/physics/Collidable.java6
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/components/physics/Force.java12
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/components/physics/Forces.java20
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/components/physics/Gravity.java11
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/components/physics/Jump.java14
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/components/physics/Mass.java11
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/components/physics/TopCollidable.java6
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/components/physics/Velocity.java14
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionGrid.java65
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionSystem.java107
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/systems/physics/ForceReductionSystem.java55
-rw-r--r--core/src/main/java/coffee/liz/ecs/common/systems/physics/IntegrationSystem.java25
-rw-r--r--core/src/main/java/coffee/liz/ecs/model/Entity.java13
14 files changed, 13 insertions, 380 deletions
diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/BoundingBox.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/BoundingBox.java
deleted file mode 100644
index 7a31cae..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/components/physics/BoundingBox.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package coffee.liz.ecs.common.components.physics;
-
-import coffee.liz.ecs.math.Vec2;
-import coffee.liz.ecs.model.Component;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.Setter;
-
-@AllArgsConstructor
-@Getter
-@Setter
-public class BoundingBox implements Component {
- private Vec2<Float> position;
- private Vec2<Float> size;
-
- public float getTop() {
- return position.getY() + size.getY();
- }
-
- public float getRight() {
- return position.getX() + size.getX();
- }
-
- public boolean isCollidingWith(final BoundingBox other) {
- return getRight() > other.getPosition().getX()
- && position.getX() < other.getRight()
- && getTop() > other.getPosition().getY()
- && position.getY() < other.getTop();
- }
-
- public boolean isAbove(final BoundingBox other) {
- return position.getY() >= other.getTop();
- }
-}
diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Collidable.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Collidable.java
deleted file mode 100644
index 166428a..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Collidable.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package coffee.liz.ecs.common.components.physics;
-
-import coffee.liz.ecs.model.Component;
-
-public class Collidable implements Component {
-}
diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Force.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Force.java
deleted file mode 100644
index 7d5dab1..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Force.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package coffee.liz.ecs.common.components.physics;
-
-import coffee.liz.ecs.math.Vec2;
-import coffee.liz.ecs.model.Component;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor
-@Getter
-public class Force implements Component {
- private final Vec2<Float> force;
-}
diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Forces.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Forces.java
deleted file mode 100644
index f6c9ee8..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Forces.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package coffee.liz.ecs.common.components.physics;
-
-import coffee.liz.ecs.model.Component;
-import lombok.Getter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Getter
-public class Forces implements Component {
- private final List<Force> forces = new ArrayList<>();
-
- public void add(final Force force) {
- forces.add(force);
- }
-
- public void clear() {
- forces.clear();
- }
-}
diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Gravity.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Gravity.java
deleted file mode 100644
index 44d5caf..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Gravity.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package coffee.liz.ecs.common.components.physics;
-
-import coffee.liz.ecs.model.Component;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor
-@Getter
-public class Gravity implements Component {
- private final float terminalVelocity;
-}
diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Jump.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Jump.java
deleted file mode 100644
index 5224b32..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Jump.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package coffee.liz.ecs.common.components.physics;
-
-import coffee.liz.ecs.model.Component;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.Setter;
-
-@AllArgsConstructor
-@Getter
-@Setter
-public class Jump implements Component {
- private boolean canJump;
- private long jumpStartMs;
-}
diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Mass.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Mass.java
deleted file mode 100644
index f38ccc0..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Mass.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package coffee.liz.ecs.common.components.physics;
-
-import coffee.liz.ecs.model.Component;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor
-@Getter
-public class Mass implements Component {
- private final float mass;
-}
diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/TopCollidable.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/TopCollidable.java
deleted file mode 100644
index 76185bd..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/components/physics/TopCollidable.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package coffee.liz.ecs.common.components.physics;
-
-import coffee.liz.ecs.model.Component;
-
-public class TopCollidable implements Component {
-}
diff --git a/core/src/main/java/coffee/liz/ecs/common/components/physics/Velocity.java b/core/src/main/java/coffee/liz/ecs/common/components/physics/Velocity.java
deleted file mode 100644
index 9b6a36b..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/components/physics/Velocity.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package coffee.liz.ecs.common.components.physics;
-
-import coffee.liz.ecs.math.Vec2;
-import coffee.liz.ecs.model.Component;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.Setter;
-
-@AllArgsConstructor
-@Getter
-@Setter
-public class Velocity implements Component {
- private Vec2<Float> velocity;
-}
diff --git a/core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionGrid.java b/core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionGrid.java
deleted file mode 100644
index 94202b4..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionGrid.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package coffee.liz.ecs.common.systems.physics;
-
-import coffee.liz.ecs.common.components.physics.BoundingBox;
-import coffee.liz.ecs.math.Vec2;
-import coffee.liz.ecs.math.Vec2i;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-public class CollisionGrid {
- private final Map<Vec2i, Set<Integer>> cells = new HashMap<>();
- private Vec2<Float> origin;
- private Vec2<Float> cellSize;
-
- public void setOrigin(final Vec2<Float> origin) {
- this.origin = origin;
- }
-
- public void setCellSize(final Vec2<Float> cellSize) {
- this.cellSize = cellSize;
- }
-
- public void clear() {
- cells.clear();
- }
-
- public void insert(final int entityId, final BoundingBox bb) {
- final int minCx = cellX(bb.getPosition().getX());
- final int minCy = cellY(bb.getPosition().getY());
- final int maxCx = cellX(bb.getRight());
- final int maxCy = cellY(bb.getTop());
- for (int cx = minCx; cx <= maxCx; cx++) {
- for (int cy = minCy; cy <= maxCy; cy++) {
- cells.computeIfAbsent(new Vec2i(cx, cy), _ -> new HashSet<>()).add(entityId);
- }
- }
- }
-
- public Set<Integer> getNeighborIds(final BoundingBox bb) {
- final Set<Integer> neighbors = new HashSet<>();
- final int minCx = cellX(bb.getPosition().getX());
- final int minCy = cellY(bb.getPosition().getY());
- final int maxCx = cellX(bb.getRight());
- final int maxCy = cellY(bb.getTop());
- for (int cx = minCx; cx <= maxCx; cx++) {
- for (int cy = minCy; cy <= maxCy; cy++) {
- final Set<Integer> cell = cells.get(new Vec2i(cx, cy));
- if (cell != null) {
- neighbors.addAll(cell);
- }
- }
- }
- return neighbors;
- }
-
- private int cellX(final float x) {
- return (int) Math.floor((x - origin.getX()) / cellSize.getX());
- }
-
- private int cellY(final float y) {
- return (int) Math.floor((y - origin.getY()) / cellSize.getY());
- }
-}
diff --git a/core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionSystem.java b/core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionSystem.java
deleted file mode 100644
index 14f0a2b..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/systems/physics/CollisionSystem.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package coffee.liz.ecs.common.systems.physics;
-
-import coffee.liz.ecs.common.components.physics.BoundingBox;
-import coffee.liz.ecs.common.components.physics.Collidable;
-import coffee.liz.ecs.common.components.physics.Force;
-import coffee.liz.ecs.common.components.physics.Forces;
-import coffee.liz.ecs.common.components.physics.Gravity;
-import coffee.liz.ecs.common.components.physics.Jump;
-import coffee.liz.ecs.common.components.physics.Mass;
-import coffee.liz.ecs.common.components.physics.TopCollidable;
-import coffee.liz.ecs.common.components.physics.Velocity;
-import coffee.liz.ecs.math.Vec2f;
-import coffee.liz.ecs.math.Vec2i;
-import coffee.liz.ecs.model.Entity;
-import coffee.liz.ecs.model.System;
-import coffee.liz.ecs.model.World;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.RequiredArgsConstructor;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-@RequiredArgsConstructor
-@AllArgsConstructor
-public class CollisionSystem implements System {
- private final float gravity;
- private float cellSize = 64f;
- private final CollisionGrid grid = new CollisionGrid();
-
- @Override
- public Collection<Class<? extends System>> getDependencies() {
- return Set.of(IntegrationSystem.class);
- }
-
- @Override
- public void update(final World world, final float deltaSeconds) {
- final Set<Entity> collidableEntities = world.queryable().allOf(BoundingBox.class, Collidable.class);
- final Set<Entity> surfaceEntities = world.queryable().allOf(BoundingBox.class, TopCollidable.class);
-
- if (collidableEntities.isEmpty() || surfaceEntities.isEmpty()) {
- return;
- }
-
- final Map<Integer, Entity> entityMap = new HashMap<>();
- collidableEntities.forEach(e -> entityMap.put(e.getId(), e));
- surfaceEntities.forEach(e -> entityMap.put(e.getId(), e));
-
- float minX = Float.MAX_VALUE, minY = Float.MAX_VALUE;
- for (final Entity e : entityMap.values()) {
- final BoundingBox bb = e.get(BoundingBox.class);
- minX = Math.min(minX, bb.getPosition().getX());
- minY = Math.min(minY, bb.getPosition().getY());
- }
-
- grid.clear();
- grid.setOrigin(new Vec2f(minX, minY));
- grid.setCellSize(new Vec2f(cellSize, cellSize));
- entityMap.forEach((id, e) -> grid.insert(id, e.get(BoundingBox.class)));
-
- final Set<Vec2i> checkedPairs = new HashSet<>();
-
- for (final Entity entityA : collidableEntities) {
- if (!entityA.has(Velocity.class)) {
- continue;
- }
- final BoundingBox bbA = entityA.get(BoundingBox.class);
- final Velocity velocity = entityA.get(Velocity.class);
-
- for (final int idB : grid.getNeighborIds(bbA)) {
- final int idA = entityA.getId();
- if (idB == idA) {
- continue;
- }
- if (!checkedPairs.add(new Vec2i(Math.min(idA, idB), Math.max(idA, idB)))) {
- continue;
- }
-
- final Entity entityB = entityMap.get(idB);
- if (entityB == null || !entityB.has(TopCollidable.class)) {
- continue;
- }
-
- final BoundingBox bbB = entityB.get(BoundingBox.class);
- if (!bbA.isCollidingWith(bbB)) {
- continue;
- }
- if (velocity.getVelocity().getY() > 0 || bbA.isAbove(bbB)) {
- continue;
- }
-
- bbA.setPosition(new Vec2f(bbA.getPosition().getX(), bbB.getTop()));
- velocity.setVelocity(new Vec2f(velocity.getVelocity().getX(), 0f));
-
- if (entityA.has(Jump.class)) {
- entityA.get(Jump.class).setCanJump(true);
- }
- if (entityA.has(Gravity.class) && entityA.has(Forces.class) && entityA.has(Mass.class)) {
- entityA.get(Forces.class).add(new Force(new Vec2f(0f, entityA.get(Mass.class).getMass() * gravity)));
- }
- }
- }
- }
-}
diff --git a/core/src/main/java/coffee/liz/ecs/common/systems/physics/ForceReductionSystem.java b/core/src/main/java/coffee/liz/ecs/common/systems/physics/ForceReductionSystem.java
deleted file mode 100644
index 4a51ba8..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/systems/physics/ForceReductionSystem.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package coffee.liz.ecs.common.systems.physics;
-
-import coffee.liz.ecs.common.components.physics.Force;
-import coffee.liz.ecs.common.components.physics.Forces;
-import coffee.liz.ecs.common.components.physics.Gravity;
-import coffee.liz.ecs.common.components.physics.Jump;
-import coffee.liz.ecs.common.components.physics.Mass;
-import coffee.liz.ecs.common.components.physics.Velocity;
-import coffee.liz.ecs.math.Vec2;
-import coffee.liz.ecs.math.Vec2f;
-import coffee.liz.ecs.model.System;
-import coffee.liz.ecs.model.World;
-import lombok.RequiredArgsConstructor;
-
-import java.util.Collection;
-import java.util.Set;
-
-@RequiredArgsConstructor
-public class ForceReductionSystem implements System {
- private final float gravity;
-
- @Override
- public Collection<Class<? extends System>> getDependencies() {
- return Set.of();
- }
-
- @Override
- public void update(final World world, final float deltaSeconds) {
- world.queryable().allOf(Forces.class, Mass.class, Velocity.class).forEach(entity -> {
- final Forces forces = entity.get(Forces.class);
- final Mass mass = entity.get(Mass.class);
- final Velocity velocity = entity.get(Velocity.class);
-
- if (entity.has(Gravity.class)) {
- final Gravity gravityComponent = entity.get(Gravity.class);
- if (velocity.getVelocity().getY() > -gravityComponent.getTerminalVelocity()) {
- forces.add(new Force(new Vec2f(0f, -mass.getMass() * gravity)));
- }
- }
-
- Vec2<Float> netForce = Vec2f.ZERO;
- for (final Force f : forces.getForces()) {
- netForce = netForce.plus(f.getForce());
- }
- forces.clear();
-
- final Vec2<Float> acceleration = netForce.scale(1f / mass.getMass(), 1f / mass.getMass());
- velocity.setVelocity(velocity.getVelocity().plus(acceleration.scale(deltaSeconds, deltaSeconds)));
-
- if (entity.has(Jump.class) && acceleration.getY() < 0) {
- entity.get(Jump.class).setCanJump(false);
- }
- });
- }
-}
diff --git a/core/src/main/java/coffee/liz/ecs/common/systems/physics/IntegrationSystem.java b/core/src/main/java/coffee/liz/ecs/common/systems/physics/IntegrationSystem.java
deleted file mode 100644
index ba38b70..0000000
--- a/core/src/main/java/coffee/liz/ecs/common/systems/physics/IntegrationSystem.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package coffee.liz.ecs.common.systems.physics;
-
-import coffee.liz.ecs.common.components.physics.BoundingBox;
-import coffee.liz.ecs.common.components.physics.Velocity;
-import coffee.liz.ecs.model.System;
-import coffee.liz.ecs.model.World;
-
-import java.util.Collection;
-import java.util.Set;
-
-public class IntegrationSystem implements System {
- @Override
- public Collection<Class<? extends System>> getDependencies() {
- return Set.of(ForceReductionSystem.class);
- }
-
- @Override
- public void update(final World world, final float deltaSeconds) {
- world.queryable().allOf(Velocity.class, BoundingBox.class).forEach(entity -> {
- final BoundingBox bb = entity.get(BoundingBox.class);
- final Velocity velocity = entity.get(Velocity.class);
- bb.setPosition(bb.getPosition().plus(velocity.getVelocity().scale(deltaSeconds, deltaSeconds)));
- });
- }
-}
diff --git a/core/src/main/java/coffee/liz/ecs/model/Entity.java b/core/src/main/java/coffee/liz/ecs/model/Entity.java
index bbd417e..16aa37b 100644
--- a/core/src/main/java/coffee/liz/ecs/model/Entity.java
+++ b/core/src/main/java/coffee/liz/ecs/model/Entity.java
@@ -108,4 +108,17 @@ public class Entity extends EventBus<EntityEvent> {
public Set<Class<? extends Component>> componentTypes() {
return componentMap.keySet();
}
+
+ @Override
+ public boolean equals(final Object other) {
+ if (other instanceof Entity) {
+ return ((Entity) other).getId() == getId();
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Integer.hashCode(getId());
+ }
}