diff --git a/src/main/java/electrosphere/engine/LoadingThread.java b/src/main/java/electrosphere/engine/LoadingThread.java index 35ca6dbf..0ef6c731 100644 --- a/src/main/java/electrosphere/engine/LoadingThread.java +++ b/src/main/java/electrosphere/engine/LoadingThread.java @@ -12,11 +12,11 @@ import electrosphere.game.client.player.ClientPlayerData; import electrosphere.game.client.terrain.manager.ClientTerrainManager; import electrosphere.game.client.world.ClientWorldData; import electrosphere.game.collision.CommonWorldData; -import electrosphere.game.state.SimulationState.SimulationStateMachine; +import electrosphere.game.state.MacroSimulation; import electrosphere.game.server.terrain.manager.ServerTerrainManager; import electrosphere.game.server.world.ServerWorldData; import electrosphere.game.state.AttachUtils; -import electrosphere.game.state.SimulationState; +import electrosphere.game.state.MicroSimulation; import electrosphere.logger.LoggerInterface; import electrosphere.main.Globals; import static electrosphere.main.Globals.loadingBox; @@ -73,7 +73,6 @@ public class LoadingThread extends Thread { MenuUtils.makeMenuDrawable(Globals.currentMenu); - SimulationState.simulationState = SimulationStateMachine.TITLE_MENU; break; @@ -131,6 +130,12 @@ public class LoadingThread extends Thread { } } + //initialize the "virtual" objects simulation + initMacroSimulation(); + + //initialize the "real" objects simulation + initMicroSimulation(); + loadingBox.setDraw(false); Globals.RENDER_FLAG_RENDER_SHADOW_MAP = true; @@ -141,7 +146,6 @@ public class LoadingThread extends Thread { LoggerInterface.loggerEngine.INFO("Finished loading"); - SimulationState.simulationState = SimulationStateMachine.MAIN_SIMULATION; Globals.controlHandler.setHandlerState(ControlHandler.ControlsState.MAIN_GAME); break; @@ -195,6 +199,12 @@ public class LoadingThread extends Thread { } } + //initialize the "virtual" objects simulation + initMacroSimulation(); + + //initialize the "real" objects simulation + initMicroSimulation(); + loadingBox.setDraw(false); Globals.RENDER_FLAG_RENDER_SHADOW_MAP = true; @@ -205,7 +215,6 @@ public class LoadingThread extends Thread { LoggerInterface.loggerEngine.INFO("Finished loading"); - SimulationState.simulationState = SimulationStateMachine.MAIN_SIMULATION; Globals.controlHandler.setHandlerState(ControlHandler.ControlsState.MAIN_GAME); break; @@ -406,6 +415,14 @@ public class LoadingThread extends Thread { } + static void initMacroSimulation(){ + Globals.macroSimulation = new MacroSimulation(); + } + + + static void initMicroSimulation(){ + Globals.microSimulation = new MicroSimulation(); + } static void creatingRandomEntities(){ // String unitCubeModelPath = Globals.assetManager.registerModel(ModelUtils.createUnitCube()); diff --git a/src/main/java/electrosphere/entity/types/hitbox/HitboxUtils.java b/src/main/java/electrosphere/entity/types/hitbox/HitboxUtils.java index 4edc2967..bde8fdda 100644 --- a/src/main/java/electrosphere/entity/types/hitbox/HitboxUtils.java +++ b/src/main/java/electrosphere/entity/types/hitbox/HitboxUtils.java @@ -47,29 +47,14 @@ public class HitboxUtils { 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); } @@ -88,6 +73,7 @@ public class HitboxUtils { generatorType != receiverType ){ if(generatorType.equals(EntityDataStrings.COLLISION_ENTITY_DATA_TYPE_HURT)){ +// Globals.microSimulation.freeze(); EntityUtils.getEntityPosition(generatorParent).set(Globals.spawnPoint); } else if(receiverParent.equals(EntityDataStrings.COLLISION_ENTITY_DATA_TYPE_HURT)){ EntityUtils.getEntityPosition(receiverParent).set(Globals.spawnPoint); diff --git a/src/main/java/electrosphere/game/server/terrain/generation/TerrainGen.java b/src/main/java/electrosphere/game/server/terrain/generation/TerrainGen.java index ba536ebb..fe00f5dc 100644 --- a/src/main/java/electrosphere/game/server/terrain/generation/TerrainGen.java +++ b/src/main/java/electrosphere/game/server/terrain/generation/TerrainGen.java @@ -257,7 +257,7 @@ public class TerrainGen { float[][] rVal = new float[elevation.length][elevation[0].length]; for(int x = 0; x < DIMENSION-1; x++){ for(int y = 0; y < DIMENSION-1; y++){ - rVal[x][y] = elevation[x][y] + Utilities.random_Integer(0, (int)(elevation[x][y] / 4)); + rVal[x][y] = elevation[x][y] + Utilities.random_Integer(0, (int)(elevation[x][y] / verticalInterpolationRatio)); } } return rVal; diff --git a/src/main/java/electrosphere/game/state/AttachUtils.java b/src/main/java/electrosphere/game/state/AttachUtils.java index 92dc7031..a28166dc 100644 --- a/src/main/java/electrosphere/game/state/AttachUtils.java +++ b/src/main/java/electrosphere/game/state/AttachUtils.java @@ -34,7 +34,7 @@ public class AttachUtils { position = position.rotate(((Quaternionf)EntityUtils.getEntityRotation(parent))); position.add(new Vector3f(EntityUtils.getEntityPosition(parent))); EntityUtils.getEntityPosition(currentEntity).set(position); - EntityUtils.getEntityRotation(currentEntity).add(EntityUtils.getEntityRotation(parent)).normalize(); + EntityUtils.getEntityRotation(currentEntity).set(EntityUtils.getEntityRotation(parent)).normalize(); } } } diff --git a/src/main/java/electrosphere/game/server/simulation/Simulation.java b/src/main/java/electrosphere/game/state/MacroSimulation.java similarity index 71% rename from src/main/java/electrosphere/game/server/simulation/Simulation.java rename to src/main/java/electrosphere/game/state/MacroSimulation.java index 18d658a1..7c05e9a5 100644 --- a/src/main/java/electrosphere/game/server/simulation/Simulation.java +++ b/src/main/java/electrosphere/game/state/MacroSimulation.java @@ -1,4 +1,4 @@ -package electrosphere.game.server.simulation; +package electrosphere.game.state; import electrosphere.game.server.civilization.Civilization; import electrosphere.game.server.civilization.model.CivilizationMap; @@ -11,7 +11,7 @@ import electrosphere.util.Utilities; import java.util.LinkedList; import java.util.List; -public class Simulation { +public class MacroSimulation { List civilizationList = new LinkedList(); List cultureList = new LinkedList(); @@ -19,13 +19,13 @@ public class Simulation { List creatureList = new LinkedList(); List characterList = new LinkedList(); - public Simulation(){ + public MacroSimulation(){ init(); } void init(){ - CreatureTypeMap creatureTypeMap = FileLoadingUtils.loadObjectFromAssetPath("Data/creatures.json", CreatureTypeMap.class); - CivilizationMap civilizationMap = FileLoadingUtils.loadObjectFromAssetPath("Data/civilization.json", CivilizationMap.class); +// CreatureTypeMap creatureTypeMap = FileLoadingUtils.loadObjectFromAssetPath("Data/creatures.json", CreatureTypeMap.class); +// CivilizationMap civilizationMap = FileLoadingUtils.loadObjectFromAssetPath("Data/civilization.json", CivilizationMap.class); } public void simulate(){ diff --git a/src/main/java/electrosphere/game/state/MicroSimulation.java b/src/main/java/electrosphere/game/state/MicroSimulation.java new file mode 100644 index 00000000..9981e391 --- /dev/null +++ b/src/main/java/electrosphere/game/state/MicroSimulation.java @@ -0,0 +1,58 @@ +package electrosphere.game.state; + +import electrosphere.entity.Entity; +import electrosphere.entity.state.MovementTree; +import electrosphere.entity.types.creature.CreatureUtils; +import electrosphere.entity.types.hitbox.HitboxUtils; +import electrosphere.entity.types.item.ItemUtils; +import electrosphere.main.Globals; + +/** + * + * @author amaterasu + */ +public class MicroSimulation { + + boolean isReady = false; + + public MicroSimulation(){ + isReady = true; + } + + public void simulate(){ + //make items play idle animation + for(Entity item : Globals.entityManager.getItemEntities()){ + ItemUtils.updateItemActorAnimation(item); + } + //simulate creature behavior trees + for(Entity currentMoveable : Globals.entityManager.getMoveable()){ + MovementTree behaviorTree = CreatureUtils.getEntityMovementTree(currentMoveable); + behaviorTree.simulate(); + } + //update attached entity positions + AttachUtils.updateAttachedEntityPositions(); + //update hitbox positions + for(Entity currentHitbox : Globals.hitboxManager.getAllHitboxes()){ + HitboxUtils.updatePosition(currentHitbox); + } + //collide hitboxes + for(Entity currentHitbox : Globals.hitboxManager.getAllHitboxes()){ + if(isReady){ + HitboxUtils.collideEntities(currentHitbox); + } + } + } + + public boolean isReady(){ + return isReady; + } + + public void freeze(){ + isReady = false; + } + + public void unfreeze(){ + isReady = true; + } + +} diff --git a/src/main/java/electrosphere/game/state/SimulationState.java b/src/main/java/electrosphere/game/state/SimulationState.java deleted file mode 100644 index f52d7914..00000000 --- a/src/main/java/electrosphere/game/state/SimulationState.java +++ /dev/null @@ -1,17 +0,0 @@ -package electrosphere.game.state; - -/** - * - * @author amaterasu - */ -public class SimulationState { - public enum SimulationStateMachine { - LOADING, - TITLE_MENU, - MAIN_SIMULATION, - ARENA_SIMULATION, - } - - public static SimulationStateMachine simulationState; - -} diff --git a/src/main/java/electrosphere/logger/LoggerInterface.java b/src/main/java/electrosphere/logger/LoggerInterface.java index 4bcf2032..b4bd13eb 100644 --- a/src/main/java/electrosphere/logger/LoggerInterface.java +++ b/src/main/java/electrosphere/logger/LoggerInterface.java @@ -17,8 +17,8 @@ public class LoggerInterface { public static Logger loggerEngine; public static void initLoggers(){ - loggerNetworking = new Logger(LogLevel.DEBUG); - loggerFileIO = new Logger(LogLevel.ERROR); + loggerNetworking = new Logger(LogLevel.WARNING); + loggerFileIO = new Logger(LogLevel.WARNING); loggerGameLogic = new Logger(LogLevel.DEBUG); loggerRenderer = new Logger(LogLevel.WARNING); loggerEngine = new Logger(LogLevel.WARNING); diff --git a/src/main/java/electrosphere/main/Globals.java b/src/main/java/electrosphere/main/Globals.java index 5a4ada68..9b36ae95 100644 --- a/src/main/java/electrosphere/main/Globals.java +++ b/src/main/java/electrosphere/main/Globals.java @@ -21,8 +21,10 @@ import electrosphere.game.client.world.ClientWorldData; import electrosphere.game.collision.CommonWorldData; import electrosphere.game.state.AliveManager; import electrosphere.engine.LoadingThread; +import electrosphere.game.state.MacroSimulation; import electrosphere.game.server.terrain.manager.ServerTerrainManager; import electrosphere.game.server.world.ServerWorldData; +import electrosphere.game.state.MicroSimulation; import electrosphere.menu.Menu; import electrosphere.net.client.ClientNetworking; import electrosphere.net.server.Server; @@ -84,6 +86,7 @@ public class Globals { //Controls Handler // public static ControlHandler controlHandler; + public static boolean updateCamera = true; // @@ -170,6 +173,12 @@ public class Globals { //manages all models loaded into memory public static AssetManager assetManager; + //macro simulation + public static MacroSimulation macroSimulation; + + //micro simulation + public static MicroSimulation microSimulation; + //manages hitboxes public static HitboxManager hitboxManager; diff --git a/src/main/java/electrosphere/main/Main.java b/src/main/java/electrosphere/main/Main.java index 11208eaf..509279e6 100644 --- a/src/main/java/electrosphere/main/Main.java +++ b/src/main/java/electrosphere/main/Main.java @@ -14,8 +14,7 @@ import electrosphere.entity.types.hitbox.HitboxUtils; import electrosphere.entity.types.item.ItemUtils; import electrosphere.game.state.AttachUtils; import electrosphere.engine.LoadingThread; -import electrosphere.game.state.SimulationState; -import electrosphere.game.state.SimulationState.SimulationStateMachine; +import electrosphere.game.state.MicroSimulation; import electrosphere.logger.LoggerInterface; import electrosphere.renderer.RenderingEngine; import electrosphere.util.FileLoadingUtils; @@ -103,9 +102,6 @@ public class Main { //initialize logging interfaces LoggerInterface.initLoggers(); - //set simulation status to loading title menu - SimulationState.simulationState = SimulationStateMachine.LOADING; - //controls initControlHandler(); @@ -170,7 +166,7 @@ public class Main { /// I N P U T C O N T R O L S /// cameraSpeed = 2.5f * deltaTime; - if (glfwGetKey(Globals.window, GLFW_KEY_ESCAPE) == GLFW_PRESS && SimulationState.simulationState == SimulationStateMachine.MAIN_SIMULATION) { + if (glfwGetKey(Globals.window, GLFW_KEY_ESCAPE) == GLFW_PRESS && Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT) { break; } @@ -190,26 +186,8 @@ public class Main { /// /// C L I E N T S I M U L A T I O N S T U F F /// - if(SimulationState.simulationState == SimulationStateMachine.MAIN_SIMULATION || SimulationState.simulationState == SimulationStateMachine.ARENA_SIMULATION){ - //make items play idle animation - for(Entity item : Globals.entityManager.getItemEntities()){ - ItemUtils.updateItemActorAnimation(item); - } - //simulate creature behavior trees - for(Entity currentMoveable : Globals.entityManager.getMoveable()){ - MovementTree behaviorTree = CreatureUtils.getEntityMovementTree(currentMoveable); - behaviorTree.simulate(); - } - //update attached entity positions - AttachUtils.updateAttachedEntityPositions(); - //update hitbox positions - for(Entity currentHitbox : Globals.hitboxManager.getAllHitboxes()){ - HitboxUtils.updatePosition(currentHitbox); - } - //collide hitboxes - for(Entity currentHitbox : Globals.hitboxManager.getAllHitboxes()){ - HitboxUtils.collideEntities(currentHitbox); - } + if(Globals.microSimulation != null && Globals.microSimulation.isReady()){ + Globals.microSimulation.simulate(); } @@ -231,7 +209,7 @@ public class Main { /// C A M E R A S T U F F /// //poll mouse variables and update camera variables - if(SimulationState.simulationState == SimulationStateMachine.MAIN_SIMULATION || SimulationState.simulationState == SimulationStateMachine.ARENA_SIMULATION){ + if(Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT){ updateMouseVariables(); @@ -295,22 +273,22 @@ public class Main { public static void updateMouseVariables(){ glfwGetCursorPos(Globals.window, mouse_X_Buffer, mouse_Y_Buffer); - xpos = mouse_X_Buffer[0]; - ypos = mouse_Y_Buffer[0]; - float xoffset = (float) (xpos - mouse_lastX) * mouseSensitivity; - float yoffset = (float) (mouse_lastY - ypos) * mouseSensitivity; - mouse_lastX = (float) xpos; - mouse_lastY = (float) ypos; + xpos = mouse_X_Buffer[0]; + ypos = mouse_Y_Buffer[0]; + float xoffset = (float) (xpos - mouse_lastX) * mouseSensitivity; + float yoffset = (float) (mouse_lastY - ypos) * mouseSensitivity; + mouse_lastX = (float) xpos; + mouse_lastY = (float) ypos; - yaw = yaw + xoffset; - pitch = pitch - yoffset; + yaw = yaw + xoffset; + pitch = pitch - yoffset; - if (pitch > 100.0f) { - pitch = 100.0f; - } - if (pitch < -99.0f) { - pitch = -99.0f; - } + if (pitch > 100.0f) { + pitch = 100.0f; + } + if (pitch < -99.0f) { + pitch = -99.0f; + } } diff --git a/src/main/java/electrosphere/renderer/Actor.java b/src/main/java/electrosphere/renderer/Actor.java index 1c852330..cf1d5169 100644 --- a/src/main/java/electrosphere/renderer/Actor.java +++ b/src/main/java/electrosphere/renderer/Actor.java @@ -109,7 +109,6 @@ public class Actor { if(model != null){ if(animation != null){ model.playAnimation(animation); - model.incrementTime(0.001); model.incrementTime(animationTime); model.update_node_transform(model.root_anim_node); Bone currentBone = model.boneMap.get(boneName); @@ -125,4 +124,22 @@ public class Actor { return rVal; } + public Matrix4f getBoneTransform(String boneName){ + Matrix4f rVal = new Matrix4f(); + Model model = Globals.assetManager.fetchModel(modelPath); + if(model != null){ + if(animation != null){ + model.playAnimation(animation); + model.incrementTime(animationTime); + model.update_node_transform(model.root_anim_node); + Bone currentBone = model.boneMap.get(boneName); + if(currentBone != null){ + rVal = currentBone.final_transform; +// currentBone.inverseBindPoseMatrix + } + } + } + return rVal; + } + } diff --git a/src/main/java/electrosphere/renderer/RenderingEngine.java b/src/main/java/electrosphere/renderer/RenderingEngine.java index c253bdda..ffaad8b2 100644 --- a/src/main/java/electrosphere/renderer/RenderingEngine.java +++ b/src/main/java/electrosphere/renderer/RenderingEngine.java @@ -94,7 +94,7 @@ public class RenderingEngine { // glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE); Allows you to make the background transparent // glfwWindowHint(GLFW_OPACITY, 23); //Creates the window reference object - Globals.window = glfwCreateWindow(screenWidth, screenHeight, "LearnOpenGL", NULL, NULL); + Globals.window = glfwCreateWindow(screenWidth, screenHeight, "ORPG", NULL, NULL); //Errors for failure to create window (IE: No GUI mode on linux ?) if (Globals.window == NULL) { LoggerInterface.loggerEngine.ERROR("Failed to make window.", new Exception("Renderer Creation Failure")); diff --git a/src/main/java/electrosphere/util/worldviewer/TerrainViewer.java b/src/main/java/electrosphere/util/worldviewer/TerrainViewer.java index 38d67ebe..7929eb00 100644 --- a/src/main/java/electrosphere/util/worldviewer/TerrainViewer.java +++ b/src/main/java/electrosphere/util/worldviewer/TerrainViewer.java @@ -1,7 +1,7 @@ package electrosphere.util.worldviewer; import com.google.gson.Gson; -import electrosphere.game.server.simulation.Simulation; +import electrosphere.game.state.MacroSimulation; import electrosphere.game.server.terrain.manager.ServerTerrainManager; import electrosphere.game.server.terrain.models.TerrainModel; import electrosphere.main.Globals; @@ -41,7 +41,7 @@ public class TerrainViewer { // Utilities.saveObjectToBakedJsonFile("/Config/testingTerrain.json", terrainModel); terrainModel = FileLoadingUtils.loadObjectFromAssetPath("/Config/testingTerrain.json", TerrainModel.class); - Simulation simulation = new Simulation(); + MacroSimulation simulation = new MacroSimulation(); JFrame frame = new JFrame(); TerrainViewerJComponent jComponent = new TerrainViewerJComponent(terrainModel);