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 00000000..dd0ec374 Binary files /dev/null and b/src/main/resources/Models/SmallCube.fbx differ