Hitboxes!
This commit is contained in:
		
							parent
							
								
									a3269b962d
								
							
						
					
					
						commit
						7379afbbc7
					
				| @ -1,7 +1,7 @@ | |||||||
| package electrosphere.controls; | package electrosphere.controls; | ||||||
| 
 | 
 | ||||||
| import electrosphere.entity.CameraEntityUtils; | import electrosphere.entity.CameraEntityUtils; | ||||||
| import electrosphere.entity.CreatureUtils; | import electrosphere.entity.types.creature.CreatureUtils; | ||||||
| import electrosphere.entity.EntityUtils; | import electrosphere.entity.EntityUtils; | ||||||
| import electrosphere.entity.state.MovementTree; | import electrosphere.entity.state.MovementTree; | ||||||
| import electrosphere.entity.state.MovementTree.MovementTreeState; | import electrosphere.entity.state.MovementTree.MovementTreeState; | ||||||
|  | |||||||
| @ -68,5 +68,17 @@ public class EntityDataStrings { | |||||||
|     public static final String DATA_STRING_UI_ELEMENT = "uiEntity"; |     public static final String DATA_STRING_UI_ELEMENT = "uiEntity"; | ||||||
|     public static final String DATA_STRING_UI_ELEMENT_FONT = "uiFont"; |     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"; | ||||||
|  |      | ||||||
|      |      | ||||||
| } | } | ||||||
|  | |||||||
| @ -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<Entity> 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<Entity> getCollisionEntities(){ | ||||||
|  |         return collisionEntities; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |      | ||||||
|  | } | ||||||
| @ -1,6 +1,6 @@ | |||||||
| package electrosphere.entity.state; | package electrosphere.entity.state; | ||||||
| 
 | 
 | ||||||
| import electrosphere.entity.CreatureUtils; | import electrosphere.entity.types.creature.CreatureUtils; | ||||||
| import electrosphere.entity.Entity; | import electrosphere.entity.Entity; | ||||||
| import electrosphere.entity.EntityUtils; | import electrosphere.entity.EntityUtils; | ||||||
| import electrosphere.main.Globals; | import electrosphere.main.Globals; | ||||||
| @ -80,6 +80,7 @@ public class MovementTree { | |||||||
| //        Model entityModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(parent)); | //        Model entityModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(parent)); | ||||||
|         Vector3f position = EntityUtils.getEntityPosition(parent); |         Vector3f position = EntityUtils.getEntityPosition(parent); | ||||||
|         Vector3f movementVector = CreatureUtils.getMovementVector(parent); |         Vector3f movementVector = CreatureUtils.getMovementVector(parent); | ||||||
|  |         Vector3f newPosition; | ||||||
|          |          | ||||||
|         //parse attached network messages |         //parse attached network messages | ||||||
|         for(EntityMessage message : networkMessageQueue){ |         for(EntityMessage message : networkMessageQueue){ | ||||||
| @ -113,8 +114,11 @@ public class MovementTree { | |||||||
|                     state = MovementTreeState.MOVE; |                     state = MovementTreeState.MOVE; | ||||||
|                 } |                 } | ||||||
|                 //move the entity |                 //move the entity | ||||||
|                 position.add(new Vector3f(movementVector).mul(velocity)); |                 newPosition = new Vector3f(position).add(new Vector3f(movementVector).mul(velocity)); | ||||||
|                 position.y = Globals.drawCellManager.getElevationAtRealPoint(position.x, position.z); |                 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); |                 EntityUtils.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector); | ||||||
|                 break; |                 break; | ||||||
|             case MOVE: |             case MOVE: | ||||||
| @ -128,8 +132,11 @@ public class MovementTree { | |||||||
|                 } |                 } | ||||||
|                 //check if can move forward (collision engine) |                 //check if can move forward (collision engine) | ||||||
|                 //if can, move forward by entity movement stats |                 //if can, move forward by entity movement stats | ||||||
|                 position.add(new Vector3f(movementVector).mul(velocity)); |                 newPosition = new Vector3f(position).add(new Vector3f(movementVector).mul(velocity)); | ||||||
|                 position.y = Globals.drawCellManager.getElevationAtRealPoint(position.x, position.z); |                 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); |                 EntityUtils.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector); | ||||||
|                 break; |                 break; | ||||||
|             case SLOWDOWN: |             case SLOWDOWN: | ||||||
| @ -148,8 +155,11 @@ public class MovementTree { | |||||||
|                     state = MovementTreeState.IDLE; |                     state = MovementTreeState.IDLE; | ||||||
|                 } |                 } | ||||||
|                 //move the entity |                 //move the entity | ||||||
|                 position.add(new Vector3f(movementVector).mul(velocity)); |                 newPosition = new Vector3f(position).add(new Vector3f(movementVector).mul(velocity)); | ||||||
|                 position.y = Globals.drawCellManager.getElevationAtRealPoint(position.x, position.z); |                 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); |                 EntityUtils.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector); | ||||||
|                 break; |                 break; | ||||||
|             case IDLE: |             case IDLE: | ||||||
|  | |||||||
| @ -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.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.Globals; | ||||||
| import electrosphere.main.Main; | import electrosphere.main.Main; | ||||||
| import electrosphere.net.message.EntityMessage; | import electrosphere.net.message.EntityMessage; | ||||||
| @ -35,7 +41,11 @@ public class CreatureUtils { | |||||||
| //    } | //    } | ||||||
|      |      | ||||||
|     public static Entity spawnBasicCreature(int creatureId, float acceleration, float maxVelocity){ |     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_IS_CREATURE, true); | ||||||
|         rVal.putData(EntityDataStrings.DATA_STRING_CREATURE_TYPE, creatureId); |         rVal.putData(EntityDataStrings.DATA_STRING_CREATURE_TYPE, creatureId); | ||||||
|         rVal.putData(EntityDataStrings.DATA_STRING_MOVEMENT_BT, new MovementTree(rVal)); |         rVal.putData(EntityDataStrings.DATA_STRING_MOVEMENT_BT, new MovementTree(rVal)); | ||||||
| @ -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 { | public class CreatureType { | ||||||
|     int id; |     int id; | ||||||
|     String modelPath; |     String modelPath; | ||||||
|  |     List<HitboxData> hitboxes; | ||||||
| 
 | 
 | ||||||
|     public int getId() { |     public int getId() { | ||||||
|         return id; |         return id; | ||||||
| @ -24,4 +27,14 @@ public class CreatureType { | |||||||
|         this.modelPath = modelPath; |         this.modelPath = modelPath; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     public List<HitboxData> getHitboxes() { | ||||||
|  |         return hitboxes; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setHitboxes(List<HitboxData> hitboxes) { | ||||||
|  |         this.hitboxes = hitboxes; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |      | ||||||
|  |      | ||||||
| } | } | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package electrosphere.entity.types.creature; | package electrosphere.entity.types.creature.creaturemap; | ||||||
| 
 | 
 | ||||||
| import java.util.List; | import java.util.List; | ||||||
| 
 | 
 | ||||||
| @ -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; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |      | ||||||
|  | } | ||||||
| @ -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<Entity> hitboxes = new ArrayList(); | ||||||
|  |      | ||||||
|  |     public HitboxManager(){ | ||||||
|  |          | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public void registerHitbox(Entity hitbox){ | ||||||
|  |         hitboxes.add(hitbox); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public List<Entity> getAllHitboxes(){ | ||||||
|  |         return hitboxes; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -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); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -4,9 +4,12 @@ import electrosphere.controls.ControlHandler; | |||||||
| import electrosphere.entity.CameraEntityUtils; | import electrosphere.entity.CameraEntityUtils; | ||||||
| import electrosphere.entity.Entity; | import electrosphere.entity.Entity; | ||||||
| import electrosphere.entity.EntityUtils; | import electrosphere.entity.EntityUtils; | ||||||
|  | import electrosphere.entity.collision.CollisionEngine; | ||||||
|  | import electrosphere.entity.types.creature.CreatureUtils; | ||||||
| import electrosphere.game.cell.DrawCellManager; | import electrosphere.game.cell.DrawCellManager; | ||||||
| import electrosphere.game.state.SimulationState.SimulationStateMachine; | import electrosphere.game.state.SimulationState.SimulationStateMachine; | ||||||
| import electrosphere.game.terrain.TerrainManager; | import electrosphere.game.terrain.TerrainManager; | ||||||
|  | import electrosphere.game.world.World; | ||||||
| import electrosphere.main.Globals; | import electrosphere.main.Globals; | ||||||
| import static electrosphere.main.Globals.loadingBox; | import static electrosphere.main.Globals.loadingBox; | ||||||
| import electrosphere.menu.MenuUtils; | import electrosphere.menu.MenuUtils; | ||||||
| @ -16,6 +19,7 @@ import electrosphere.net.server.Server; | |||||||
| import electrosphere.renderer.Model; | import electrosphere.renderer.Model; | ||||||
| import electrosphere.renderer.RenderUtils; | import electrosphere.renderer.RenderUtils; | ||||||
| import electrosphere.renderer.assetmanager.AssetDataStrings; | import electrosphere.renderer.assetmanager.AssetDataStrings; | ||||||
|  | import java.util.Random; | ||||||
| import java.util.concurrent.Semaphore; | import java.util.concurrent.Semaphore; | ||||||
| import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||||
| import java.util.logging.Level; | import java.util.logging.Level; | ||||||
| @ -82,6 +86,9 @@ public class LoadingThread extends Thread { | |||||||
|                 //initialize the terrain manager (server only) |                 //initialize the terrain manager (server only) | ||||||
|                 initTerrainManager(); |                 initTerrainManager(); | ||||||
|                  |                  | ||||||
|  |                 //init the data of the world | ||||||
|  |                 initGameWorld(); | ||||||
|  |                  | ||||||
|                 //initialize the server thread (server only) |                 //initialize the server thread (server only) | ||||||
|                 if(FLAG_INIT_SERVER){ |                 if(FLAG_INIT_SERVER){ | ||||||
|                     initServerThread(); |                     initServerThread(); | ||||||
| @ -95,6 +102,9 @@ public class LoadingThread extends Thread { | |||||||
|                 //initialize the cell manager (client) |                 //initialize the cell manager (client) | ||||||
|                 initDynamicCellManager(); |                 initDynamicCellManager(); | ||||||
|                  |                  | ||||||
|  |                 //collision engine | ||||||
|  |                 initCollisionEngine(); | ||||||
|  |                  | ||||||
|                 //initialize the basic graphical entities of the world (skybox, camera) |                 //initialize the basic graphical entities of the world (skybox, camera) | ||||||
|                 initWorldBaseGraphicalEntities(); |                 initWorldBaseGraphicalEntities(); | ||||||
|                  |                  | ||||||
| @ -123,7 +133,8 @@ public class LoadingThread extends Thread { | |||||||
|             case LOAD_ARENA: |             case LOAD_ARENA: | ||||||
|                 loadingBox.setDraw(true); |                 loadingBox.setDraw(true); | ||||||
|                  |                  | ||||||
|                 Globals.spawnPoint = new Vector3f(1,0,1); |                 //init the data of the world | ||||||
|  |                 initArenaWorld(); | ||||||
|                  |                  | ||||||
|                 //initialize the server thread (server only) |                 //initialize the server thread (server only) | ||||||
|                 if(FLAG_INIT_SERVER){ |                 if(FLAG_INIT_SERVER){ | ||||||
| @ -138,9 +149,14 @@ public class LoadingThread extends Thread { | |||||||
|                 //initialize the cell manager (client) |                 //initialize the cell manager (client) | ||||||
|                 initArenaCellManager(); |                 initArenaCellManager(); | ||||||
|                  |                  | ||||||
|  |                 //collision engine | ||||||
|  |                 initCollisionEngine(); | ||||||
|  |                  | ||||||
|                 //initialize the basic graphical entities of the world (skybox, camera) |                 //initialize the basic graphical entities of the world (skybox, camera) | ||||||
|                 initWorldBaseGraphicalEntities(); |                 initWorldBaseGraphicalEntities(); | ||||||
|                  |                  | ||||||
|  |                 creatingRandomEntities(); | ||||||
|  |                  | ||||||
|                 loadingBox.setDraw(false); |                 loadingBox.setDraw(false); | ||||||
|                  |                  | ||||||
|                 Globals.RENDER_FLAG_RENDER_SHADOW_MAP = true; |                 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(){ |     static void initServerThread(){ | ||||||
| @ -314,6 +343,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) { |     public void setFLAG_INIT_SERVER(boolean FLAG_INIT_SERVER) { | ||||||
|         this.FLAG_INIT_SERVER = FLAG_INIT_SERVER; |         this.FLAG_INIT_SERVER = FLAG_INIT_SERVER; | ||||||
|     } |     } | ||||||
|  | |||||||
							
								
								
									
										89
									
								
								src/main/java/electrosphere/game/world/World.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								src/main/java/electrosphere/game/world/World.java
									
									
									
									
									
										Normal file
									
								
							| @ -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<DataCell> 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; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,9 @@ | |||||||
|  | package electrosphere.game.world.datacell; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * | ||||||
|  |  * @author amaterasu | ||||||
|  |  */ | ||||||
|  | public class DataCell { | ||||||
|  |      | ||||||
|  | } | ||||||
| @ -13,11 +13,14 @@ import electrosphere.cfg.MainConfig; | |||||||
| import electrosphere.controls.ControlHandler; | import electrosphere.controls.ControlHandler; | ||||||
| import electrosphere.entity.Entity; | import electrosphere.entity.Entity; | ||||||
| import electrosphere.entity.EntityManager; | import electrosphere.entity.EntityManager; | ||||||
| import electrosphere.entity.types.creature.CreatureType; | import electrosphere.entity.collision.CollisionEngine; | ||||||
| import electrosphere.entity.types.creature.CreatureTypeList; | 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.cell.DrawCellManager; | ||||||
| import electrosphere.game.state.LoadingThread; | import electrosphere.game.state.LoadingThread; | ||||||
| import electrosphere.game.terrain.TerrainManager; | import electrosphere.game.terrain.TerrainManager; | ||||||
|  | import electrosphere.game.world.World; | ||||||
| import electrosphere.menu.Menu; | import electrosphere.menu.Menu; | ||||||
| import electrosphere.net.client.ClientNetworking; | import electrosphere.net.client.ClientNetworking; | ||||||
| import electrosphere.net.server.Server; | import electrosphere.net.server.Server; | ||||||
| @ -75,6 +78,18 @@ public class Globals { | |||||||
|     public static ControlHandler controlHandler; |     public static ControlHandler controlHandler; | ||||||
|      |      | ||||||
|      |      | ||||||
|  |     // | ||||||
|  |     // Collision engine | ||||||
|  |     // | ||||||
|  |     public static CollisionEngine collisionEngine; | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     // | ||||||
|  |     //current world | ||||||
|  |     // | ||||||
|  |     public static World world; | ||||||
|  |      | ||||||
|  |      | ||||||
|     // |     // | ||||||
|     //Entity Types Map |     //Entity Types Map | ||||||
|     //  |     //  | ||||||
| @ -148,6 +163,9 @@ public class Globals { | |||||||
|     public static AssetManager assetManager; |     public static AssetManager assetManager; | ||||||
|      |      | ||||||
|      |      | ||||||
|  |     //manages hitboxes | ||||||
|  |     public static HitboxManager hitboxManager; | ||||||
|  |      | ||||||
|     //chunk stuff |     //chunk stuff | ||||||
|     //constant for how far in game units you have to move to load chunks |     //constant for how far in game units you have to move to load chunks | ||||||
|     public static DrawCellManager drawCellManager; |     public static DrawCellManager drawCellManager; | ||||||
| @ -205,6 +223,8 @@ public class Globals { | |||||||
|         assetManager = new AssetManager(); |         assetManager = new AssetManager(); | ||||||
|         //load widget manager |         //load widget manager | ||||||
|         widgetManager = new WidgetManager(); |         widgetManager = new WidgetManager(); | ||||||
|  |         //hitbox manager | ||||||
|  |         hitboxManager = new HitboxManager(); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     public static void initDefaultGraphicalResources(){ |     public static void initDefaultGraphicalResources(){ | ||||||
| @ -226,7 +246,12 @@ public class Globals { | |||||||
|         loadingBox = WidgetUtils.createVerticallyAlignedTextBox(520, 100, 50, 7, 1, "LOADING", true); |         loadingBox = WidgetUtils.createVerticallyAlignedTextBox(520, 100, 50, 7, 1, "LOADING", true); | ||||||
|         //init default shaderProgram |         //init default shaderProgram | ||||||
|         defaultMeshShader = ShaderProgram.smart_assemble_shader(false,true); |         defaultMeshShader = ShaderProgram.smart_assemble_shader(false,true); | ||||||
|  |         //init skybox | ||||||
|         assetManager.registerModelToSpecificString(RenderUtils.createSkyboxModel(null), AssetDataStrings.ASSET_STRING_SKYBOX_BASIC); |         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(){ |     static void initEntityTypeMap(){ | ||||||
|  | |||||||
| @ -4,7 +4,7 @@ import com.google.gson.Gson; | |||||||
| import electrosphere.cfg.MainConfig; | import electrosphere.cfg.MainConfig; | ||||||
| import electrosphere.controls.ControlHandler; | import electrosphere.controls.ControlHandler; | ||||||
| import electrosphere.entity.CameraEntityUtils; | import electrosphere.entity.CameraEntityUtils; | ||||||
| import electrosphere.entity.CreatureUtils; | import electrosphere.entity.types.creature.CreatureUtils; | ||||||
| import electrosphere.renderer.Camera; | import electrosphere.renderer.Camera; | ||||||
| import electrosphere.renderer.Material; | import electrosphere.renderer.Material; | ||||||
| import electrosphere.renderer.Model; | import electrosphere.renderer.Model; | ||||||
| @ -12,8 +12,10 @@ import electrosphere.renderer.RenderUtils; | |||||||
| import electrosphere.renderer.ShaderProgram; | import electrosphere.renderer.ShaderProgram; | ||||||
| import electrosphere.renderer.texture.Texture; | import electrosphere.renderer.texture.Texture; | ||||||
| import electrosphere.entity.Entity; | import electrosphere.entity.Entity; | ||||||
|  | import electrosphere.entity.EntityDataStrings; | ||||||
| import electrosphere.entity.EntityUtils; | import electrosphere.entity.EntityUtils; | ||||||
| import electrosphere.entity.state.MovementTree; | import electrosphere.entity.state.MovementTree; | ||||||
|  | import electrosphere.entity.types.hitbox.HitboxUtils; | ||||||
| import electrosphere.game.cell.DrawCellManager; | import electrosphere.game.cell.DrawCellManager; | ||||||
| import electrosphere.game.state.LoadingThread; | import electrosphere.game.state.LoadingThread; | ||||||
| import electrosphere.game.state.SimulationState; | import electrosphere.game.state.SimulationState; | ||||||
| @ -213,6 +215,9 @@ public class Main { | |||||||
|                     MovementTree behaviorTree = CreatureUtils.getEntityMovementTree(currentMoveable); |                     MovementTree behaviorTree = CreatureUtils.getEntityMovementTree(currentMoveable); | ||||||
|                     behaviorTree.simulate(); |                     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); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package electrosphere.net; | package electrosphere.net; | ||||||
| 
 | 
 | ||||||
| import electrosphere.entity.CreatureUtils; | import electrosphere.entity.types.creature.CreatureUtils; | ||||||
| import electrosphere.entity.Entity; | import electrosphere.entity.Entity; | ||||||
| import electrosphere.net.message.EntityMessage; | import electrosphere.net.message.EntityMessage; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package electrosphere.net.client; | package electrosphere.net.client; | ||||||
| 
 | 
 | ||||||
| import electrosphere.entity.CreatureUtils; | import electrosphere.entity.types.creature.CreatureUtils; | ||||||
| import electrosphere.entity.Entity; | import electrosphere.entity.Entity; | ||||||
| import electrosphere.entity.EntityUtils; | import electrosphere.entity.EntityUtils; | ||||||
| import electrosphere.main.Globals; | import electrosphere.main.Globals; | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package electrosphere.net.server; | package electrosphere.net.server; | ||||||
| 
 | 
 | ||||||
| import electrosphere.entity.CreatureUtils; | import electrosphere.entity.types.creature.CreatureUtils; | ||||||
| import electrosphere.entity.Entity; | import electrosphere.entity.Entity; | ||||||
| import electrosphere.entity.EntityUtils; | import electrosphere.entity.EntityUtils; | ||||||
| import electrosphere.main.Globals; | import electrosphere.main.Globals; | ||||||
| @ -85,7 +85,7 @@ public class ServerConnectionHandler implements Runnable { | |||||||
|             System.exit(1); |             System.exit(1); | ||||||
|         } |         } | ||||||
|         //spawn player in world |         //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.getEntityScale(newPlayerCharacter).set(0.005f); | ||||||
|         EntityUtils.getEntityPosition(newPlayerCharacter).set(Globals.spawnPoint.x,Globals.drawCellManager.getElevationAtRealPoint(Globals.spawnPoint.x, Globals.spawnPoint.z),Globals.spawnPoint.z); |         EntityUtils.getEntityPosition(newPlayerCharacter).set(Globals.spawnPoint.x,Globals.drawCellManager.getElevationAtRealPoint(Globals.spawnPoint.x, Globals.spawnPoint.z),Globals.spawnPoint.z); | ||||||
|         CreatureUtils.setControllerPlayerId(newPlayerCharacter, playerID); |         CreatureUtils.setControllerPlayerId(newPlayerCharacter, playerID); | ||||||
|  | |||||||
| @ -3,6 +3,8 @@ | |||||||
| import electrosphere.main.Globals; | import electrosphere.main.Globals; | ||||||
| import electrosphere.renderer.anim.Animation; | import electrosphere.renderer.anim.Animation; | ||||||
| import org.joml.Matrix4f; | import org.joml.Matrix4f; | ||||||
|  | import org.joml.Vector3f; | ||||||
|  | import org.joml.Vector4f; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * |  * | ||||||
| @ -101,4 +103,28 @@ public class Actor { | |||||||
|         return modelPath; |         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; | ||||||
|  |     } | ||||||
|  |      | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,9 @@ | |||||||
|  | package electrosphere.renderer.Light; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * | ||||||
|  |  * @author amaterasu | ||||||
|  |  */ | ||||||
|  | public class LightManager { | ||||||
|  |      | ||||||
|  | } | ||||||
| @ -361,4 +361,10 @@ public class Model { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |      | ||||||
|  |     public void listAllBoneIDs(){ | ||||||
|  |         for(String id : boneMap.keySet()){ | ||||||
|  |             System.out.println(id); | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -23,6 +23,7 @@ import electrosphere.renderer.framebuffer.Renderbuffer; | |||||||
| import electrosphere.renderer.ui.Widget; | import electrosphere.renderer.ui.Widget; | ||||||
| import electrosphere.util.Utilities; | import electrosphere.util.Utilities; | ||||||
| import org.joml.Matrix4f; | import org.joml.Matrix4f; | ||||||
|  | import org.joml.Quaternionf; | ||||||
| import org.joml.Vector3f; | import org.joml.Vector3f; | ||||||
| import org.lwjgl.BufferUtils; | import org.lwjgl.BufferUtils; | ||||||
| import static org.lwjgl.glfw.GLFW.GLFW_CONTEXT_VERSION_MAJOR; | import static org.lwjgl.glfw.GLFW.GLFW_CONTEXT_VERSION_MAJOR; | ||||||
| @ -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(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|          |          | ||||||
|          |          | ||||||
|          |          | ||||||
|  | |||||||
| @ -2,11 +2,17 @@ | |||||||
|     "types": [ |     "types": [ | ||||||
|         { |         { | ||||||
|             "id" : 0, |             "id" : 0, | ||||||
|             "modelPath" : "Models/person1walkanim.fbx" |             "modelPath" : "Models/person1walkanim.fbx", | ||||||
|  |             "hitboxes" : [ | ||||||
|  |                 { | ||||||
|  |                     "bone": "Bone.031" | ||||||
|  |                 } | ||||||
|  |             ] | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "id" : 1, |             "id" : 1, | ||||||
|             "modelPath" : "" |             "modelPath" : "", | ||||||
|  |             "hitboxes" : [] | ||||||
|         } |         } | ||||||
|     ] |     ] | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										
											BIN
										
									
								
								src/main/resources/Models/SmallCube.fbx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/main/resources/Models/SmallCube.fbx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user