From 7379afbbc7ed99c95c1744fad3f1948fcbc9f4c3 Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 6 Jun 2021 01:59:51 -0400 Subject: [PATCH] Hitboxes! --- .../controls/ControlHandler.java | 2 +- .../entity/EntityDataStrings.java | 12 +++ .../entity/collision/CollisionEngine.java | 90 ++++++++++++++++++ .../entity/state/MovementTree.java | 24 +++-- .../{ => types/creature}/CreatureUtils.java | 14 ++- .../{ => creaturemap}/CreatureType.java | 15 ++- .../{ => creaturemap}/CreatureTypeList.java | 2 +- .../creature/creaturemap/HitboxData.java | 20 ++++ .../entity/types/hitbox/HitboxManager.java | 26 +++++ .../entity/types/hitbox/HitboxUtils.java | 60 ++++++++++++ .../game/state/LoadingThread.java | 70 +++++++++++++- .../java/electrosphere/game/world/World.java | 89 +++++++++++++++++ .../game/world/datacell/DataCell.java | 9 ++ src/main/java/electrosphere/main/Globals.java | 29 +++++- src/main/java/electrosphere/main/Main.java | 34 ++----- src/main/java/electrosphere/net/NetUtils.java | 2 +- .../net/client/ClientNetworking.java | 2 +- .../net/server/ServerConnectionHandler.java | 4 +- .../java/electrosphere/renderer/Actor.java | 26 +++++ .../renderer/Light/LightManager.java | 9 ++ .../java/electrosphere/renderer/Model.java | 6 ++ .../electrosphere/renderer/RenderUtils.java | 15 ++- src/main/resources/Data/entity_map.json | 10 +- src/main/resources/Models/SmallCube.fbx | Bin 0 -> 14828 bytes 24 files changed, 521 insertions(+), 49 deletions(-) create mode 100644 src/main/java/electrosphere/entity/collision/CollisionEngine.java rename src/main/java/electrosphere/entity/{ => types/creature}/CreatureUtils.java (87%) rename src/main/java/electrosphere/entity/types/creature/{ => creaturemap}/CreatureType.java (55%) rename src/main/java/electrosphere/entity/types/creature/{ => creaturemap}/CreatureTypeList.java (77%) create mode 100644 src/main/java/electrosphere/entity/types/creature/creaturemap/HitboxData.java create mode 100644 src/main/java/electrosphere/entity/types/hitbox/HitboxManager.java create mode 100644 src/main/java/electrosphere/entity/types/hitbox/HitboxUtils.java create mode 100644 src/main/java/electrosphere/game/world/World.java create mode 100644 src/main/java/electrosphere/game/world/datacell/DataCell.java create mode 100644 src/main/java/electrosphere/renderer/Light/LightManager.java create mode 100644 src/main/resources/Models/SmallCube.fbx diff --git a/src/main/java/electrosphere/controls/ControlHandler.java b/src/main/java/electrosphere/controls/ControlHandler.java index 5ad92657..4af5acae 100644 --- a/src/main/java/electrosphere/controls/ControlHandler.java +++ b/src/main/java/electrosphere/controls/ControlHandler.java @@ -1,7 +1,7 @@ package electrosphere.controls; import electrosphere.entity.CameraEntityUtils; -import electrosphere.entity.CreatureUtils; +import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.entity.EntityUtils; import electrosphere.entity.state.MovementTree; import electrosphere.entity.state.MovementTree.MovementTreeState; diff --git a/src/main/java/electrosphere/entity/EntityDataStrings.java b/src/main/java/electrosphere/entity/EntityDataStrings.java index 546296aa..32b000b7 100644 --- a/src/main/java/electrosphere/entity/EntityDataStrings.java +++ b/src/main/java/electrosphere/entity/EntityDataStrings.java @@ -68,5 +68,17 @@ public class EntityDataStrings { public static final String DATA_STRING_UI_ELEMENT = "uiEntity"; public static final String DATA_STRING_UI_ELEMENT_FONT = "uiFont"; + /* + Collision Entity + */ + public static final String DATA_STRING_COLLISION_ENTITY = "collisionEntity"; + public static final String DATA_STRING_COLLISION_ENTITY_TYPE_SPHERE = "collisionSphere"; + + public static final String COLLISION_ENTITY_DATA_TYPE = "collisionDataType"; + + public static final String COLLISION_ENTITY_DATA_PARENT = "collisionDataParent"; + + public static final String COLLISION_ENTITY_DATA_BONE = "collisionDataBone"; + } diff --git a/src/main/java/electrosphere/entity/collision/CollisionEngine.java b/src/main/java/electrosphere/entity/collision/CollisionEngine.java new file mode 100644 index 00000000..c05d59bc --- /dev/null +++ b/src/main/java/electrosphere/entity/collision/CollisionEngine.java @@ -0,0 +1,90 @@ +package electrosphere.entity.collision; + +import electrosphere.entity.Entity; +import electrosphere.game.world.World; +import java.util.ArrayList; +import java.util.List; +import org.joml.Vector3f; + +/** + * + * @author amaterasu + */ +public class CollisionEngine { + + List collisionEntities = new ArrayList(); + + public CollisionEngine(){ + + } + + + /** + * + * @param e the entity that wants to move + * @param positionToCheck the position that it wants to move to + * @return true if it can occupy that position, false otherwise + */ + public boolean checkCanOccupyPosition(World w, Entity e, Vector3f positionToCheck){ + boolean rVal = true; + // + // are we below the terrain? + // + if(w.getElevationAtPoint(positionToCheck) > positionToCheck.y){ + return false; + } + // + // check world bounds + // + if( + positionToCheck.x < w.getWorldBoundMin().x || + positionToCheck.z < w.getWorldBoundMin().z || + positionToCheck.x > w.getWorldBoundMax().x || + positionToCheck.z > w.getWorldBoundMax().z + ){ + return false; + } + return rVal; + } + + /** + * + * @param e the entity that's trying to move + * @param positionToCheck the position the entity wants to be at + * @return the position the engine recommends it move to instead (this is + * guaranteed to be a valid position) + */ + public Vector3f suggestMovementPosition(World w, Entity e, Vector3f positionToCheck){ + Vector3f suggestedPosition = new Vector3f(positionToCheck); + // + // adjust for minimum height (Terrain) + // + float heightMapBias = 0.00001f; + if(w.getElevationAtPoint(positionToCheck) > positionToCheck.y){ + suggestedPosition.y = w.getElevationAtPoint(positionToCheck) + heightMapBias; + } + // + // adjust for world bounds + // + if(suggestedPosition.x < w.getWorldBoundMin().x){ + suggestedPosition.x = w.getWorldBoundMin().x; + } + if(suggestedPosition.z < w.getWorldBoundMin().z){ + suggestedPosition.z = w.getWorldBoundMin().z; + } + if(suggestedPosition.x > w.getWorldBoundMax().x){ + suggestedPosition.x = w.getWorldBoundMax().x; + } + if(suggestedPosition.z > w.getWorldBoundMax().z){ + suggestedPosition.z = w.getWorldBoundMax().z; + } + return suggestedPosition; + } + + + public List getCollisionEntities(){ + return collisionEntities; + } + + +} diff --git a/src/main/java/electrosphere/entity/state/MovementTree.java b/src/main/java/electrosphere/entity/state/MovementTree.java index d4e788b0..43f8abcc 100644 --- a/src/main/java/electrosphere/entity/state/MovementTree.java +++ b/src/main/java/electrosphere/entity/state/MovementTree.java @@ -1,6 +1,6 @@ package electrosphere.entity.state; -import electrosphere.entity.CreatureUtils; +import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; import electrosphere.main.Globals; @@ -80,6 +80,7 @@ public class MovementTree { // Model entityModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(parent)); Vector3f position = EntityUtils.getEntityPosition(parent); Vector3f movementVector = CreatureUtils.getMovementVector(parent); + Vector3f newPosition; //parse attached network messages for(EntityMessage message : networkMessageQueue){ @@ -113,8 +114,11 @@ public class MovementTree { state = MovementTreeState.MOVE; } //move the entity - position.add(new Vector3f(movementVector).mul(velocity)); - position.y = Globals.drawCellManager.getElevationAtRealPoint(position.x, position.z); + newPosition = new Vector3f(position).add(new Vector3f(movementVector).mul(velocity)); + if(!Globals.collisionEngine.checkCanOccupyPosition(Globals.world, parent, newPosition)){ + newPosition = Globals.collisionEngine.suggestMovementPosition(Globals.world, parent, newPosition); + } + EntityUtils.getEntityPosition(parent).set(newPosition); EntityUtils.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector); break; case MOVE: @@ -128,8 +132,11 @@ public class MovementTree { } //check if can move forward (collision engine) //if can, move forward by entity movement stats - position.add(new Vector3f(movementVector).mul(velocity)); - position.y = Globals.drawCellManager.getElevationAtRealPoint(position.x, position.z); + newPosition = new Vector3f(position).add(new Vector3f(movementVector).mul(velocity)); + if(!Globals.collisionEngine.checkCanOccupyPosition(Globals.world, parent, newPosition)){ + newPosition = Globals.collisionEngine.suggestMovementPosition(Globals.world, parent, newPosition); + } + EntityUtils.getEntityPosition(parent).set(newPosition); EntityUtils.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector); break; case SLOWDOWN: @@ -148,8 +155,11 @@ public class MovementTree { state = MovementTreeState.IDLE; } //move the entity - position.add(new Vector3f(movementVector).mul(velocity)); - position.y = Globals.drawCellManager.getElevationAtRealPoint(position.x, position.z); + newPosition = new Vector3f(position).add(new Vector3f(movementVector).mul(velocity)); + if(!Globals.collisionEngine.checkCanOccupyPosition(Globals.world, parent, newPosition)){ + newPosition = Globals.collisionEngine.suggestMovementPosition(Globals.world, parent, newPosition); + } + EntityUtils.getEntityPosition(parent).set(newPosition); EntityUtils.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector); break; case IDLE: diff --git a/src/main/java/electrosphere/entity/CreatureUtils.java b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java similarity index 87% rename from src/main/java/electrosphere/entity/CreatureUtils.java rename to src/main/java/electrosphere/entity/types/creature/CreatureUtils.java index dab50a15..f06934f3 100644 --- a/src/main/java/electrosphere/entity/CreatureUtils.java +++ b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java @@ -1,6 +1,12 @@ -package electrosphere.entity; +package electrosphere.entity.types.creature; +import electrosphere.entity.Entity; +import electrosphere.entity.EntityDataStrings; +import electrosphere.entity.EntityUtils; import electrosphere.entity.state.MovementTree; +import electrosphere.entity.types.creature.creaturemap.CreatureType; +import electrosphere.entity.types.creature.creaturemap.HitboxData; +import electrosphere.entity.types.hitbox.HitboxUtils; import electrosphere.main.Globals; import electrosphere.main.Main; import electrosphere.net.message.EntityMessage; @@ -35,7 +41,11 @@ public class CreatureUtils { // } public static Entity spawnBasicCreature(int creatureId, float acceleration, float maxVelocity){ - Entity rVal = EntityUtils.spawnDrawableEntity(Globals.entityTypeMap.get(creatureId).getModelPath()); + CreatureType rawType = Globals.entityTypeMap.get(creatureId); + Entity rVal = EntityUtils.spawnDrawableEntity(rawType.getModelPath()); + for(HitboxData hitboxdata : rawType.getHitboxes()){ + Globals.hitboxManager.registerHitbox(HitboxUtils.spawnRegularHitbox(rVal, hitboxdata.getBone())); + } rVal.putData(EntityDataStrings.DATA_STRING_CREATURE_IS_CREATURE, true); rVal.putData(EntityDataStrings.DATA_STRING_CREATURE_TYPE, creatureId); rVal.putData(EntityDataStrings.DATA_STRING_MOVEMENT_BT, new MovementTree(rVal)); diff --git a/src/main/java/electrosphere/entity/types/creature/CreatureType.java b/src/main/java/electrosphere/entity/types/creature/creaturemap/CreatureType.java similarity index 55% rename from src/main/java/electrosphere/entity/types/creature/CreatureType.java rename to src/main/java/electrosphere/entity/types/creature/creaturemap/CreatureType.java index c0c79373..71a8ac94 100644 --- a/src/main/java/electrosphere/entity/types/creature/CreatureType.java +++ b/src/main/java/electrosphere/entity/types/creature/creaturemap/CreatureType.java @@ -1,4 +1,6 @@ -package electrosphere.entity.types.creature; +package electrosphere.entity.types.creature.creaturemap; + +import java.util.List; /** * @@ -7,6 +9,7 @@ package electrosphere.entity.types.creature; public class CreatureType { int id; String modelPath; + List hitboxes; public int getId() { return id; @@ -23,5 +26,15 @@ public class CreatureType { public void setModelPath(String modelPath) { this.modelPath = modelPath; } + + public List getHitboxes() { + return hitboxes; + } + + public void setHitboxes(List hitboxes) { + this.hitboxes = hitboxes; + } + + } diff --git a/src/main/java/electrosphere/entity/types/creature/CreatureTypeList.java b/src/main/java/electrosphere/entity/types/creature/creaturemap/CreatureTypeList.java similarity index 77% rename from src/main/java/electrosphere/entity/types/creature/CreatureTypeList.java rename to src/main/java/electrosphere/entity/types/creature/creaturemap/CreatureTypeList.java index 02702989..7c68edb4 100644 --- a/src/main/java/electrosphere/entity/types/creature/CreatureTypeList.java +++ b/src/main/java/electrosphere/entity/types/creature/creaturemap/CreatureTypeList.java @@ -1,4 +1,4 @@ -package electrosphere.entity.types.creature; +package electrosphere.entity.types.creature.creaturemap; import java.util.List; diff --git a/src/main/java/electrosphere/entity/types/creature/creaturemap/HitboxData.java b/src/main/java/electrosphere/entity/types/creature/creaturemap/HitboxData.java new file mode 100644 index 00000000..41a3c374 --- /dev/null +++ b/src/main/java/electrosphere/entity/types/creature/creaturemap/HitboxData.java @@ -0,0 +1,20 @@ +package electrosphere.entity.types.creature.creaturemap; + +/** + * + * @author amaterasu + */ +public class HitboxData { + String type; + String bone; + + public String getType() { + return type; + } + + public String getBone() { + return bone; + } + + +} diff --git a/src/main/java/electrosphere/entity/types/hitbox/HitboxManager.java b/src/main/java/electrosphere/entity/types/hitbox/HitboxManager.java new file mode 100644 index 00000000..1feb09b7 --- /dev/null +++ b/src/main/java/electrosphere/entity/types/hitbox/HitboxManager.java @@ -0,0 +1,26 @@ +package electrosphere.entity.types.hitbox; + +import electrosphere.entity.Entity; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author amaterasu + */ +public class HitboxManager { + + List hitboxes = new ArrayList(); + + public HitboxManager(){ + + } + + public void registerHitbox(Entity hitbox){ + hitboxes.add(hitbox); + } + + public List getAllHitboxes(){ + return hitboxes; + } +} diff --git a/src/main/java/electrosphere/entity/types/hitbox/HitboxUtils.java b/src/main/java/electrosphere/entity/types/hitbox/HitboxUtils.java new file mode 100644 index 00000000..63c586b8 --- /dev/null +++ b/src/main/java/electrosphere/entity/types/hitbox/HitboxUtils.java @@ -0,0 +1,60 @@ +package electrosphere.entity.types.hitbox; + +import electrosphere.entity.Entity; +import electrosphere.entity.EntityDataStrings; +import electrosphere.entity.EntityUtils; +import org.joml.Matrix4f; +import org.joml.Quaternionf; +import org.joml.Vector3f; +import org.joml.Vector4f; + +/** + * + * @author amaterasu + */ +public class HitboxUtils { + + + public static Entity spawnRegularHitbox(Entity parent, String bone){ + Entity rVal = new Entity(); + rVal.putData(EntityDataStrings.COLLISION_ENTITY_DATA_PARENT, parent); + rVal.putData(EntityDataStrings.COLLISION_ENTITY_DATA_BONE, bone); + rVal.putData(EntityDataStrings.DATA_STRING_POSITION, new Vector3f(0,0,0)); + return rVal; + } + + public static void updatePosition(Entity hitbox){ + Entity parent = ((Entity)hitbox.getData(EntityDataStrings.COLLISION_ENTITY_DATA_PARENT)); + String boneName = ((String)(hitbox.getData(EntityDataStrings.COLLISION_ENTITY_DATA_BONE))); + Quaternionf parentRotation = ((Quaternionf)EntityUtils.getEntityRotation(parent)); + Vector3f positionScale = ((Vector3f)EntityUtils.getEntityScale(parent)); + Vector3f worldPosition = new Vector3f(); + Vector3f bonePosition = EntityUtils.getEntityActor(parent).getBonePosition(boneName); + worldPosition.set(bonePosition.x,bonePosition.y,bonePosition.z); + Quaternionf rotation = new Quaternionf(parentRotation); +// rotation.w = -rotation.w; +// rotation.x = -rotation.x; +// rotation.y = -rotation.y; +// rotation.z = -rotation.z; + +// System.out.println(bonePosition); + + worldPosition = worldPosition.mul(positionScale); + + worldPosition = worldPosition.rotate(rotation); + + +// Matrix4f rotationMatrix = new Matrix4f().rotate(parentRotation); +// Vector4f rawRotatedOffset = rotationMatrix.transform(new Vector4f(worldPosition.x,worldPosition.y,worldPosition.z,1)); +// worldPosition = new Vector3f(rawRotatedOffset.x,rawRotatedOffset.y,rawRotatedOffset.z); + + worldPosition.add(EntityUtils.getEntityPosition(parent)); + + +// System.out.println(worldPosition); +// +// System.out.println("parent rotation: " + new Vector3f(0,0,1).rotate(rotation)); + + ((Vector3f)hitbox.getData(EntityDataStrings.DATA_STRING_POSITION)).set(worldPosition); + } +} diff --git a/src/main/java/electrosphere/game/state/LoadingThread.java b/src/main/java/electrosphere/game/state/LoadingThread.java index 65e69142..7f779ac1 100644 --- a/src/main/java/electrosphere/game/state/LoadingThread.java +++ b/src/main/java/electrosphere/game/state/LoadingThread.java @@ -4,9 +4,12 @@ import electrosphere.controls.ControlHandler; import electrosphere.entity.CameraEntityUtils; import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; +import electrosphere.entity.collision.CollisionEngine; +import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.game.cell.DrawCellManager; import electrosphere.game.state.SimulationState.SimulationStateMachine; import electrosphere.game.terrain.TerrainManager; +import electrosphere.game.world.World; import electrosphere.main.Globals; import static electrosphere.main.Globals.loadingBox; import electrosphere.menu.MenuUtils; @@ -16,6 +19,7 @@ import electrosphere.net.server.Server; import electrosphere.renderer.Model; import electrosphere.renderer.RenderUtils; import electrosphere.renderer.assetmanager.AssetDataStrings; +import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.logging.Level; @@ -82,6 +86,9 @@ public class LoadingThread extends Thread { //initialize the terrain manager (server only) initTerrainManager(); + //init the data of the world + initGameWorld(); + //initialize the server thread (server only) if(FLAG_INIT_SERVER){ initServerThread(); @@ -95,6 +102,9 @@ public class LoadingThread extends Thread { //initialize the cell manager (client) initDynamicCellManager(); + //collision engine + initCollisionEngine(); + //initialize the basic graphical entities of the world (skybox, camera) initWorldBaseGraphicalEntities(); @@ -123,7 +133,8 @@ public class LoadingThread extends Thread { case LOAD_ARENA: loadingBox.setDraw(true); - Globals.spawnPoint = new Vector3f(1,0,1); + //init the data of the world + initArenaWorld(); //initialize the server thread (server only) if(FLAG_INIT_SERVER){ @@ -138,9 +149,14 @@ public class LoadingThread extends Thread { //initialize the cell manager (client) initArenaCellManager(); + //collision engine + initCollisionEngine(); + //initialize the basic graphical entities of the world (skybox, camera) initWorldBaseGraphicalEntities(); + creatingRandomEntities(); + loadingBox.setDraw(false); Globals.RENDER_FLAG_RENDER_SHADOW_MAP = true; @@ -223,6 +239,19 @@ public class LoadingThread extends Thread { } + static void initArenaWorld(){ + Globals.world = World.createArenaWorld(); + Globals.spawnPoint = new Vector3f(0,0,0); + } + + static void initGameWorld(){ + Globals.world = World.createGameWorld(Globals.terrainManager); + } + + static void initCollisionEngine(){ + Globals.collisionEngine = new CollisionEngine(); + } + static void initServerThread(){ @@ -313,6 +342,45 @@ public class LoadingThread extends Thread { } + + + static void creatingRandomEntities(){ +// String unitCubeModelPath = Globals.assetManager.registerModel(ModelUtils.createUnitCube()); +// Entity unitCube = EntityUtils.spawnDrawableEntity(unitCubeModelPath); +// EntityUtils.getEntityPosition(unitCube).set(10,2,10); + +// String goundPlaneModelPath = "Models/groundplanemassiveuv.fbx"; +// Entity groundPlane = EntityUtils.spawnDrawableEntity(goundPlaneModelPath); +// EntityUtils.getEntityPosition(groundPlane).set(10f,2f,10f); +// EntityUtils.getEntityRotation(groundPlane).rotateAxis((float)Math.PI/2, new Vector3f(1,0,0)); +// EntityUtils.getEntityScale(groundPlane).set(5); + +// String unitsphereModelPath = "Models/unitsphere.fbx"; +// Entity unitsphere = EntityUtils.spawnDrawableEntity(unitsphereModelPath); +// EntityUtils.getEntityPosition(unitsphere).set(10f,2f,10f); +// EntityUtils.getEntityScale(unitsphere).set(1); + +// String smallCubePath = "Models/SmallCube.fbx"; +// Entity originCube = EntityUtils.spawnDrawableEntity(smallCubePath); +// EntityUtils.getEntityPosition(originCube).set(0, 0, 0); +// +// originCube = EntityUtils.spawnDrawableEntity(smallCubePath); +// EntityUtils.getEntityPosition(originCube).set(1, 0, 0); +// +// originCube = EntityUtils.spawnDrawableEntity(smallCubePath); +// EntityUtils.getEntityPosition(originCube).set(0, 0, 1); + +// Entity font = FontUtils.makeFont(7, 1); +// EntityUtils.getEntityPosition(font).set(new Vector3f(0.2f,0.2f,0.0f)); + +// for(int i = 0; i < 10; i++){ +// Random rand = new Random(); +// Entity creature = CreatureUtils.spawnBasicCreature(0, 0.01f, 0.01f); +// EntityUtils.getEntityPosition(creature).set(rand.nextFloat() * 10, rand.nextFloat() * 10, rand.nextFloat() * 10); +// EntityUtils.getEntityScale(creature).set(0.01f); +// } + } + public void setFLAG_INIT_SERVER(boolean FLAG_INIT_SERVER) { this.FLAG_INIT_SERVER = FLAG_INIT_SERVER; diff --git a/src/main/java/electrosphere/game/world/World.java b/src/main/java/electrosphere/game/world/World.java new file mode 100644 index 00000000..7e253426 --- /dev/null +++ b/src/main/java/electrosphere/game/world/World.java @@ -0,0 +1,89 @@ +package electrosphere.game.world; + +import electrosphere.game.terrain.TerrainManager; +import electrosphere.game.world.datacell.DataCell; +import java.util.List; +import org.joml.Vector3f; + +/** + * + * @author amaterasu + */ +public class World { + + public static enum WorldType { + GAME_WORLD, + ARENA_WORLD, + } + + WorldType type; + + List cellsLoadedIntoMemory; + + TerrainManager terrainManager; + + + + /* + + world max + +---------------------+ + | | + | | + | | + | | + | | + +---------------------+ + world min + + + basically we're saying what the maximum and minimum x and z something can occupy are + + FOR THE TIME BEING DOES NOT ACCOUNT FOR Y + */ + Vector3f worldMinPoint; + Vector3f worldMaxPoint; + + public static World createArenaWorld(){ + World rVal = new World(); + rVal.type = WorldType.ARENA_WORLD; + rVal.worldMinPoint = new Vector3f(0,0,0); + rVal.worldMaxPoint = new Vector3f(200,0,200); + return rVal; + } + + public static World createGameWorld(TerrainManager terrainManager){ + World rVal = new World(); + rVal.type = WorldType.GAME_WORLD; + rVal.terrainManager = terrainManager; + rVal.worldMinPoint = new Vector3f(0,0,0); + int worldDim = rVal.terrainManager.getWorldDiscreteSize(); + rVal.worldMaxPoint = new Vector3f(worldDim,0,worldDim); + return rVal; + } + + + public float getElevationAtPoint(Vector3f point){ + float rVal = 0.0f; + switch(type){ + case GAME_WORLD: + rVal = terrainManager.getHeightAtPosition(point.x, point.z); + break; + case ARENA_WORLD: + break; + } + return rVal; + } + + public Vector3f getWorldBoundMin(){ + return worldMinPoint; + } + + public Vector3f getWorldBoundMax(){ + return worldMaxPoint; + } + + public TerrainManager getTerrainManager(){ + return terrainManager; + } +} diff --git a/src/main/java/electrosphere/game/world/datacell/DataCell.java b/src/main/java/electrosphere/game/world/datacell/DataCell.java new file mode 100644 index 00000000..22cab3da --- /dev/null +++ b/src/main/java/electrosphere/game/world/datacell/DataCell.java @@ -0,0 +1,9 @@ +package electrosphere.game.world.datacell; + +/** + * + * @author amaterasu + */ +public class DataCell { + +} diff --git a/src/main/java/electrosphere/main/Globals.java b/src/main/java/electrosphere/main/Globals.java index 5fc116b8..4f1232e9 100644 --- a/src/main/java/electrosphere/main/Globals.java +++ b/src/main/java/electrosphere/main/Globals.java @@ -13,11 +13,14 @@ import electrosphere.cfg.MainConfig; import electrosphere.controls.ControlHandler; import electrosphere.entity.Entity; import electrosphere.entity.EntityManager; -import electrosphere.entity.types.creature.CreatureType; -import electrosphere.entity.types.creature.CreatureTypeList; +import electrosphere.entity.collision.CollisionEngine; +import electrosphere.entity.types.creature.creaturemap.CreatureType; +import electrosphere.entity.types.creature.creaturemap.CreatureTypeList; +import electrosphere.entity.types.hitbox.HitboxManager; import electrosphere.game.cell.DrawCellManager; import electrosphere.game.state.LoadingThread; import electrosphere.game.terrain.TerrainManager; +import electrosphere.game.world.World; import electrosphere.menu.Menu; import electrosphere.net.client.ClientNetworking; import electrosphere.net.server.Server; @@ -75,6 +78,18 @@ public class Globals { public static ControlHandler controlHandler; + // + // Collision engine + // + public static CollisionEngine collisionEngine; + + + // + //current world + // + public static World world; + + // //Entity Types Map // @@ -148,6 +163,9 @@ public class Globals { public static AssetManager assetManager; + //manages hitboxes + public static HitboxManager hitboxManager; + //chunk stuff //constant for how far in game units you have to move to load chunks public static DrawCellManager drawCellManager; @@ -205,6 +223,8 @@ public class Globals { assetManager = new AssetManager(); //load widget manager widgetManager = new WidgetManager(); + //hitbox manager + hitboxManager = new HitboxManager(); } public static void initDefaultGraphicalResources(){ @@ -226,7 +246,12 @@ public class Globals { loadingBox = WidgetUtils.createVerticallyAlignedTextBox(520, 100, 50, 7, 1, "LOADING", true); //init default shaderProgram defaultMeshShader = ShaderProgram.smart_assemble_shader(false,true); + //init skybox assetManager.registerModelToSpecificString(RenderUtils.createSkyboxModel(null), AssetDataStrings.ASSET_STRING_SKYBOX_BASIC); + //init hitbox + assetManager.addModelPathToQueue("Models/unitsphere.fbx"); + //init smallcube + assetManager.addModelPathToQueue("Models/SmallCube.fbx"); } static void initEntityTypeMap(){ diff --git a/src/main/java/electrosphere/main/Main.java b/src/main/java/electrosphere/main/Main.java index a5eec148..599065f3 100644 --- a/src/main/java/electrosphere/main/Main.java +++ b/src/main/java/electrosphere/main/Main.java @@ -4,7 +4,7 @@ import com.google.gson.Gson; import electrosphere.cfg.MainConfig; import electrosphere.controls.ControlHandler; import electrosphere.entity.CameraEntityUtils; -import electrosphere.entity.CreatureUtils; +import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.renderer.Camera; import electrosphere.renderer.Material; import electrosphere.renderer.Model; @@ -12,8 +12,10 @@ import electrosphere.renderer.RenderUtils; import electrosphere.renderer.ShaderProgram; import electrosphere.renderer.texture.Texture; import electrosphere.entity.Entity; +import electrosphere.entity.EntityDataStrings; import electrosphere.entity.EntityUtils; import electrosphere.entity.state.MovementTree; +import electrosphere.entity.types.hitbox.HitboxUtils; import electrosphere.game.cell.DrawCellManager; import electrosphere.game.state.LoadingThread; import electrosphere.game.state.SimulationState; @@ -213,6 +215,9 @@ public class Main { MovementTree behaviorTree = CreatureUtils.getEntityMovementTree(currentMoveable); behaviorTree.simulate(); } + for(Entity currentHitbox : Globals.hitboxManager.getAllHitboxes()){ + HitboxUtils.updatePosition(currentHitbox); + } } @@ -317,30 +322,5 @@ public class Main { } - static void creatingRandomEntities(){ -// String unitCubeModelPath = Globals.assetManager.registerModel(ModelUtils.createUnitCube()); -// Entity unitCube = EntityUtils.spawnDrawableEntity(unitCubeModelPath); -// EntityUtils.getEntityPosition(unitCube).set(10,2,10); - -// String goundPlaneModelPath = "Models/groundplanemassiveuv.fbx"; -// Entity groundPlane = EntityUtils.spawnDrawableEntity(goundPlaneModelPath); -// EntityUtils.getEntityPosition(groundPlane).set(10f,2f,10f); -// EntityUtils.getEntityRotation(groundPlane).rotateAxis((float)Math.PI/2, new Vector3f(1,0,0)); -// EntityUtils.getEntityScale(groundPlane).set(5); - - String unitsphereModelPath = "Models/unitsphere.fbx"; - Entity unitsphere = EntityUtils.spawnDrawableEntity(unitsphereModelPath); - EntityUtils.getEntityPosition(unitsphere).set(10f,2f,10f); - EntityUtils.getEntityScale(unitsphere).set(1); - -// Entity font = FontUtils.makeFont(7, 1); -// EntityUtils.getEntityPosition(font).set(new Vector3f(0.2f,0.2f,0.0f)); - - for(int i = 0; i < 10; i++){ - Random rand = new Random(); - Entity creature = CreatureUtils.spawnBasicCreature(0, 0.01f, 0.01f); - EntityUtils.getEntityPosition(creature).set(rand.nextFloat() * 10, rand.nextFloat() * 10, rand.nextFloat() * 10); - EntityUtils.getEntityScale(creature).set(0.01f); - } - } + } diff --git a/src/main/java/electrosphere/net/NetUtils.java b/src/main/java/electrosphere/net/NetUtils.java index dd30c50f..2b91be35 100644 --- a/src/main/java/electrosphere/net/NetUtils.java +++ b/src/main/java/electrosphere/net/NetUtils.java @@ -1,6 +1,6 @@ package electrosphere.net; -import electrosphere.entity.CreatureUtils; +import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.entity.Entity; import electrosphere.net.message.EntityMessage; diff --git a/src/main/java/electrosphere/net/client/ClientNetworking.java b/src/main/java/electrosphere/net/client/ClientNetworking.java index 0df2e658..9f75cfce 100644 --- a/src/main/java/electrosphere/net/client/ClientNetworking.java +++ b/src/main/java/electrosphere/net/client/ClientNetworking.java @@ -1,6 +1,6 @@ package electrosphere.net.client; -import electrosphere.entity.CreatureUtils; +import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; import electrosphere.main.Globals; diff --git a/src/main/java/electrosphere/net/server/ServerConnectionHandler.java b/src/main/java/electrosphere/net/server/ServerConnectionHandler.java index 407dad8f..e0165f6a 100644 --- a/src/main/java/electrosphere/net/server/ServerConnectionHandler.java +++ b/src/main/java/electrosphere/net/server/ServerConnectionHandler.java @@ -1,6 +1,6 @@ package electrosphere.net.server; -import electrosphere.entity.CreatureUtils; +import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; import electrosphere.main.Globals; @@ -85,7 +85,7 @@ public class ServerConnectionHandler implements Runnable { System.exit(1); } //spawn player in world - Entity newPlayerCharacter = CreatureUtils.spawnBasicCreature(0, 0.001f, 0.55f); + Entity newPlayerCharacter = CreatureUtils.spawnBasicCreature(0, 0.001f, 0.05f); EntityUtils.getEntityScale(newPlayerCharacter).set(0.005f); EntityUtils.getEntityPosition(newPlayerCharacter).set(Globals.spawnPoint.x,Globals.drawCellManager.getElevationAtRealPoint(Globals.spawnPoint.x, Globals.spawnPoint.z),Globals.spawnPoint.z); CreatureUtils.setControllerPlayerId(newPlayerCharacter, playerID); diff --git a/src/main/java/electrosphere/renderer/Actor.java b/src/main/java/electrosphere/renderer/Actor.java index bf48301b..21fbf746 100644 --- a/src/main/java/electrosphere/renderer/Actor.java +++ b/src/main/java/electrosphere/renderer/Actor.java @@ -3,6 +3,8 @@ import electrosphere.main.Globals; import electrosphere.renderer.anim.Animation; import org.joml.Matrix4f; +import org.joml.Vector3f; +import org.joml.Vector4f; /** * @@ -101,4 +103,28 @@ public class Actor { return modelPath; } + public Vector3f getBonePosition(String boneName){ + Vector3f rVal = new Vector3f(); + Model model = Globals.assetManager.fetchModel(modelPath); + if(model != null){ + if(animation != null){ + model.playAnimation(animation); + model.incrementTime(0.001); + model.incrementTime(animationTime); + if(model.currentAnimation == null){ + playingAnimation = false; + } + Bone currentBone = model.boneMap.get(boneName); + if(currentBone != null){ + Vector4f result = currentBone.final_transform.transform(new Matrix4f(currentBone.inverseBindPoseMatrix).invert().transform(new Vector4f(rVal.x,rVal.y,rVal.z,1))); +// currentBone.inverseBindPoseMatrix + rVal.x = result.x; + rVal.y = result.y; + rVal.z = result.z; + } + } + } + return rVal; + } + } diff --git a/src/main/java/electrosphere/renderer/Light/LightManager.java b/src/main/java/electrosphere/renderer/Light/LightManager.java new file mode 100644 index 00000000..34405f65 --- /dev/null +++ b/src/main/java/electrosphere/renderer/Light/LightManager.java @@ -0,0 +1,9 @@ +package electrosphere.renderer.Light; + +/** + * + * @author amaterasu + */ +public class LightManager { + +} diff --git a/src/main/java/electrosphere/renderer/Model.java b/src/main/java/electrosphere/renderer/Model.java index 61f8afce..4b84f786 100644 --- a/src/main/java/electrosphere/renderer/Model.java +++ b/src/main/java/electrosphere/renderer/Model.java @@ -361,4 +361,10 @@ public class Model { } } } + + public void listAllBoneIDs(){ + for(String id : boneMap.keySet()){ + System.out.println(id); + } + } } diff --git a/src/main/java/electrosphere/renderer/RenderUtils.java b/src/main/java/electrosphere/renderer/RenderUtils.java index 4b622034..3ebe36fc 100644 --- a/src/main/java/electrosphere/renderer/RenderUtils.java +++ b/src/main/java/electrosphere/renderer/RenderUtils.java @@ -23,6 +23,7 @@ import electrosphere.renderer.framebuffer.Renderbuffer; import electrosphere.renderer.ui.Widget; import electrosphere.util.Utilities; import org.joml.Matrix4f; +import org.joml.Quaternionf; import org.joml.Vector3f; import org.lwjgl.BufferUtils; import static org.lwjgl.glfw.GLFW.GLFW_CONTEXT_VERSION_MAJOR; @@ -612,7 +613,7 @@ public class RenderUtils { //draw currentActor.drawForDepthBuffer(); } - + //bind default framebuffer @@ -677,6 +678,18 @@ public class RenderUtils { // } } + for(Entity currentHitbox : Globals.hitboxManager.getAllHitboxes()){ + Model hitboxModel; + if((hitboxModel = Globals.assetManager.fetchModel("Models/unitsphere.fbx")) != null){ + Vector3f position = EntityUtils.getEntityPosition(currentHitbox); + modelTransformMatrix.identity(); + modelTransformMatrix.translate(new Vector3f(position).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera)).sub(new Vector3f(0,1,0))); +// modelTransformMatrix.translate(-0.25f, 0.0f, 0.5f); //center sphere + modelTransformMatrix.scale(0.1f); + hitboxModel.modelMatrix = modelTransformMatrix; + hitboxModel.draw(); + } + } diff --git a/src/main/resources/Data/entity_map.json b/src/main/resources/Data/entity_map.json index c565183a..e9052728 100644 --- a/src/main/resources/Data/entity_map.json +++ b/src/main/resources/Data/entity_map.json @@ -2,11 +2,17 @@ "types": [ { "id" : 0, - "modelPath" : "Models/person1walkanim.fbx" + "modelPath" : "Models/person1walkanim.fbx", + "hitboxes" : [ + { + "bone": "Bone.031" + } + ] }, { "id" : 1, - "modelPath" : "" + "modelPath" : "", + "hitboxes" : [] } ] } diff --git a/src/main/resources/Models/SmallCube.fbx b/src/main/resources/Models/SmallCube.fbx new file mode 100644 index 0000000000000000000000000000000000000000..dd0ec374af6a298527399c09c165f8453080f643 GIT binary patch literal 14828 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