package electrosphere.engine; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.joml.Matrix4f; import org.joml.Vector3d; import org.joml.Vector3f; import electrosphere.audio.AudioEngine; import electrosphere.audio.VirtualAudioSourceManager; import electrosphere.auth.AuthenticationManager; import electrosphere.client.culling.ClientEntityCullingManager; import electrosphere.client.fluid.cells.FluidCellManager; import electrosphere.client.fluid.manager.ClientFluidManager; import electrosphere.client.foliagemanager.ClientFoliageManager; import electrosphere.client.player.ClientPlayerData; import electrosphere.client.scene.ClientSceneWrapper; import electrosphere.client.scene.ClientWorldData; import electrosphere.client.sim.ClientSimulation; import electrosphere.client.terrain.cells.DrawCellManager; import electrosphere.client.terrain.cells.VoxelTextureAtlas; import electrosphere.client.terrain.manager.ClientTerrainManager; import electrosphere.collision.CollisionEngine; import electrosphere.collision.CollisionWorldData; import electrosphere.controls.CameraHandler; import electrosphere.controls.ControlCallback; import electrosphere.controls.ControlHandler; import electrosphere.controls.MouseCallback; import electrosphere.controls.ScrollCallback; import electrosphere.engine.assetmanager.AssetDataStrings; import electrosphere.engine.assetmanager.AssetManager; import electrosphere.engine.loadingthreads.InitialAssetLoading; import electrosphere.engine.loadingthreads.LoadingThread; import electrosphere.engine.profiler.Profiler; import electrosphere.engine.time.Timekeeper; import electrosphere.entity.Entity; import electrosphere.entity.Scene; import electrosphere.entity.types.hitbox.HitboxManager; import electrosphere.game.config.UserSettings; import electrosphere.game.data.voxel.VoxelType; import electrosphere.game.server.structure.virtual.StructureManager; import electrosphere.game.server.world.MacroData; import electrosphere.game.server.world.ServerWorldData; import electrosphere.logger.LoggerInterface; import electrosphere.menu.WindowUtils; import electrosphere.net.client.ClientNetworking; import electrosphere.net.monitor.NetMonitor; import electrosphere.net.server.Server; import electrosphere.net.server.player.Player; import electrosphere.net.server.player.PlayerManager; import electrosphere.net.synchronization.ClientSynchronizationManager; import electrosphere.net.synchronization.EntityValueTrackingService; import electrosphere.renderer.RenderUtils; import electrosphere.renderer.RenderingEngine; import electrosphere.renderer.actor.instance.InstanceManager; import electrosphere.renderer.light.PointLight; import electrosphere.renderer.light.SpotLight; import electrosphere.renderer.loading.ModelPretransforms; import electrosphere.renderer.meshgen.FluidChunkModelGeneration; import electrosphere.renderer.model.Material; import electrosphere.renderer.shader.ShaderOptionMap; import electrosphere.renderer.shader.ShaderProgram; import electrosphere.renderer.texture.TextureMap; import electrosphere.renderer.ui.ElementManager; import electrosphere.renderer.ui.elements.ImagePanel; import electrosphere.renderer.ui.font.FontManager; import electrosphere.script.ScriptEngine; import electrosphere.server.ai.AIManager; import electrosphere.server.content.ServerContentManager; import electrosphere.server.datacell.EntityDataCellMapper; import electrosphere.server.datacell.RealmManager; import electrosphere.server.db.DatabaseController; import electrosphere.server.fluid.manager.ServerFluidManager; import electrosphere.server.pathfinding.NavMeshManager; import electrosphere.server.simulation.MacroSimulation; import electrosphere.server.simulation.MicroSimulation; import electrosphere.server.terrain.manager.ServerTerrainManager; import electrosphere.util.FileUtils; /** * * @author amaterasu */ public class Globals { // //Top level user settings object // public static UserSettings userSettings; // //Timekeeper // public static Timekeeper timekeeper; // //Rendering Engine // public static RenderingEngine renderingEngine; // //Audio Engine // public static AudioEngine audioEngine; public static VirtualAudioSourceManager virtualAudioSourceManager; // //Core Engine signals // public static boolean ENGINE_SHUTDOWN_FLAG = false; //main debug flag //current enables imgui debug menu or not public static boolean ENGINE_DEBUG = true; // //Profiler // public static Profiler profiler; // //Garbage Collection // //set to true to trigger full GC every frame //a full GC includes collecting old generations as well -- likely very laggy!! public static boolean EXPLICIT_GC = false; // //Client connection to server // public static ClientNetworking clientConnection; public static boolean RUN_CLIENT = true; public static int clientCharacterID; // //Server manager thing // public static Thread serverThread; public static Server server; public static boolean RUN_SERVER = true; // //Authentication manager // public static AuthenticationManager authenticationManager; // //Controls Handler // public static ControlHandler controlHandler; public static boolean updateCamera = true; public static ControlCallback controlCallback = new ControlCallback(); public static MouseCallback mouseCallback = new MouseCallback(); public static ScrollCallback scrollCallback = new ScrollCallback(); // // Game Save stuff // public static String currentSaveName = "default"; // // Game config // public static electrosphere.game.data.Config gameConfigDefault; public static electrosphere.game.data.Config gameConfigCurrent; // // Database stuff // public static DatabaseController dbController = new DatabaseController(); // //Camera handler stuff // public static CameraHandler cameraHandler = new CameraHandler(); // //Server scene management // public static ServerWorldData serverWorldData; public static RealmManager realmManager; public static EntityDataCellMapper entityDataCellMapper; // //behavior tree tracking service // public static EntityValueTrackingService entityValueTrackingService; // //Player manager // public static PlayerManager playerManager; public static Player clientPlayer; public static String clientUsername; public static String clientPassword; // //Generic OpenGL Statements // public static long window; // //OpenGL - Other // public static int WINDOW_WIDTH = 1920; public static int WINDOW_HEIGHT = 1080; //title bar dimensions public static int WINDOW_TITLE_BAR_HEIGHT = 0; public static float verticalFOV = 90; public static float aspectRatio = 2.0f; //matrices for drawing models public static Matrix4f viewMatrix = new Matrix4f(); public static Matrix4f projectionMatrix; public static Matrix4f lightDepthMatrix = new Matrix4f(); //locations for shadow map specific variables public static int shadowMapTextureLoc = 0; public static int depthMapShaderProgramLoc = 0; // //OpenGL - Abstracted engine objects // public static String textureDiffuseDefault; public static String textureSpecularDefault; public static Material materialDefault; public static String blackTexture; public static String testingTexture; public static String whiteTexture; public static String offWhiteTexture; public static String imagePlaneModelID; public static String solidPlaneModelID; public static ArrayList lightPointListDefault; public static SpotLight lightSpotDefault; public static TextureMap textureMapDefault; public static ModelPretransforms modelPretransforms; public static ShaderProgram defaultMeshShader; public static ShaderProgram terrainShaderProgram; public static String particleBillboardModel; public static ShaderOptionMap shaderOptionMap; //manages all loaded fonts public static FontManager fontManager; // //Engine - Main managers/variables // //terrain manager // public static boolean LOAD_TERRAIN = true; public static ServerTerrainManager serverTerrainManager; //fluid manager public static ServerFluidManager serverFluidManager; //spawn point public static Vector3d spawnPoint = new Vector3d(0,0,0); //content manager public static ServerContentManager serverContentManager; //manages all models loaded into memory public static AssetManager assetManager; //macro simulation public static MacroSimulation macroSimulation; public static MacroData macroData; //flag to only run a simulation without full client public static boolean RUN_SIMULATION_ONLY = false; //micro simulation public static MicroSimulation microSimulation; //script engine public static ScriptEngine scriptEngine; //manages hitboxes public static HitboxManager clientHitboxManager; //client scene management public static Scene clientScene; public static ClientSceneWrapper clientSceneWrapper; public static ClientEntityCullingManager clientEntityCullingManager; public static ClientSimulation clientSimulation; public static ClientSynchronizationManager clientSynchronizationManager; //instanced actor manager public static InstanceManager clientInstanceManager = new InstanceManager(); //client side foliage manager public static ClientFoliageManager clientFoliageManager; //client world data public static ClientWorldData clientWorldData; //client terrain manager public static ClientTerrainManager clientTerrainManager; //client fluid manager public static ClientFluidManager clientFluidManager; //client player data public static ClientPlayerData clientPlayerData = new ClientPlayerData(); //chunk stuff //draw cell manager public static DrawCellManager drawCellManager; public static VoxelTextureAtlas voxelTextureAtlas = new VoxelTextureAtlas(); //fluid cell manager public static FluidCellManager fluidCellManager; //navmesh manager public static NavMeshManager navMeshManager; //famous fuckin last words, but temporary solution //global arraylist of values for the skybox colors //edit(6/1/21): :upside_down_smile: public static ArrayList skyboxColors; //thread for loading different game states public static List loadingThreadsList = new LinkedList(); public static InitialAssetLoading initialAssetLoadingThread = new InitialAssetLoading(); //manager for all widgets currently being drawn to screen public static ElementManager elementManager; public static int openInventoriesCount = 0; //collision world data public static CollisionWorldData commonWorldData; //structure manager public static StructureManager structureManager; //the player camera entity public static Entity playerCamera; //the player in world cursor public static Entity playerCursor; //the creature the player camera will orbit and will receive controlHandler movementTree updates public static Entity playerEntity; //client current selected voxel type public static VoxelType clientSelectedVoxelType = null; //skybox entity public static Entity skybox; //ai manager public static AIManager aiManager; //drag item state public static Entity draggedItem = null; public static Object dragSourceInventory = null; // //Base engine creation flags // public static boolean HEADLESS = false; // // // Renderer flags // // public static boolean RENDER_FLAG_RENDER_SHADOW_MAP = false; public static boolean RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT = false; public static boolean RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER = false; public static boolean RENDER_FLAG_RENDER_BLACK_BACKGROUND = true; public static boolean RENDER_FLAG_RENDER_WHITE_BACKGROUND = false; public static boolean RENDER_FLAG_RENDER_UI = true; public static boolean RENDER_FLAG_RENDER_UI_BOUNDS = false; // // Debugging tools // public static NetMonitor netMonitor; public static void initGlobals(){ LoggerInterface.loggerStartup.INFO("Initialize global variables"); //timekeeper timekeeper = new Timekeeper(); //load in default texture map textureMapDefault = FileUtils.loadObjectFromAssetPath("Textures/default_texture_map.json", TextureMap.class); //load model pretransforms modelPretransforms = FileUtils.loadObjectFromAssetPath("Models/modelPretransforms.json", ModelPretransforms.class); modelPretransforms.init(); //load in shader options map shaderOptionMap = FileUtils.loadObjectFromAssetPath("Shaders/shaderoptions.json", ShaderOptionMap.class); shaderOptionMap.debug(); //client scene wrapper clientScene = new Scene(); clientSceneWrapper = new ClientSceneWrapper(clientScene, new CollisionEngine()); //temporary hold for skybox colors skyboxColors = new ArrayList(); //load asset manager assetManager = new AssetManager(); //load widget manager elementManager = new ElementManager(); //script engine scriptEngine = new ScriptEngine(); scriptEngine.init(); //hitbox manager clientHitboxManager = new HitboxManager(); //ai manager aiManager = new AIManager(); //realm & data cell manager realmManager = new RealmManager(); entityDataCellMapper = new EntityDataCellMapper(); //nav mesh manager navMeshManager = new NavMeshManager(); //terrain Globals.clientTerrainManager = new ClientTerrainManager(); //fluid Globals.clientFluidManager = new ClientFluidManager(); //game config gameConfigDefault = electrosphere.game.data.Config.loadDefaultConfig(); gameConfigCurrent = gameConfigDefault; // //Values that depend on the loaded config Globals.clientSelectedVoxelType = (VoxelType)gameConfigCurrent.getVoxelData().getTypes().toArray()[1]; //player manager playerManager = new PlayerManager(); //behavior tree tracking service entityValueTrackingService = new EntityValueTrackingService(); //net monitor if(Globals.userSettings.getNetRunNetMonitor()){ netMonitor = new NetMonitor(); } //client synchronization manager clientSynchronizationManager = new ClientSynchronizationManager(); //profiler profiler = new Profiler(); } public static void initDefaultAudioResources(){ LoggerInterface.loggerStartup.INFO("Loading default audio resources"); Globals.assetManager.addAudioPathToQueue("/Audio/inventoryGrabItem.ogg"); Globals.assetManager.addAudioPathToQueue("/Audio/inventorySlotItem.ogg"); Globals.assetManager.addAudioPathToQueue("/Audio/openMenu.ogg"); Globals.assetManager.addAudioPathToQueue("/Audio/closeMenu.ogg"); Globals.assetManager.addAudioPathToQueue("/Audio/ambienceWind1SeamlessMono.ogg"); Globals.assetManager.loadAssetsInQueue(); } public static void initDefaultGraphicalResources(){ LoggerInterface.loggerStartup.INFO("Loading default graphical resources"); //create default textures Globals.assetManager.addTexturePathtoQueue("Textures/default_diffuse.png"); Globals.assetManager.addTexturePathtoQueue("Textures/default_specular.png"); //create default material materialDefault = new Material(); materialDefault.set_diffuse("Textures/default_diffuse.png"); materialDefault.set_specular("Textures/default_specular.png"); //create default lights //create font manager fontManager = new FontManager(); fontManager.loadFonts(); assetManager.registerModelToSpecificString(RenderUtils.createBitmapCharacter(), AssetDataStrings.BITMAP_CHARACTER_MODEL); //particle billboard model particleBillboardModel = assetManager.registerModel(RenderUtils.createParticleModel()); //black texture for backgrouns blackTexture = "Textures/b1.png"; Globals.assetManager.addTexturePathtoQueue(blackTexture); //white texture for backgrounds whiteTexture = "Textures/w1.png"; Globals.assetManager.addTexturePathtoQueue(whiteTexture); //off white texture for backgrounds offWhiteTexture = "Textures/ow1.png"; Globals.assetManager.addTexturePathtoQueue(offWhiteTexture); //initialize required windows WindowUtils.initBaseWindows(); //init default shaderProgram defaultMeshShader = ShaderProgram.smart_assemble_shader(false,true); //init terrain shader program terrainShaderProgram = ShaderProgram.loadSpecificShader("/Shaders/terrain2/terrain2.vs", "/Shaders/terrain2/terrain2.fs"); //init fluid shader program FluidChunkModelGeneration.fluidChunkShaderProgram = ShaderProgram.loadSpecificShader("/Shaders/fluid2/fluid2.vs", "/Shaders/fluid2/fluid2.fs"); //init models assetManager.addModelPathToQueue("Models/basic/geometry/unitsphere.fbx"); assetManager.addModelPathToQueue("Models/basic/geometry/unitsphere_1.fbx"); assetManager.addModelPathToQueue("Models/basic/geometry/unitsphere_grey.fbx"); assetManager.addModelPathToQueue("Models/basic/geometry/SmallCube.fbx"); assetManager.addModelPathToQueue("Models/basic/geometry/unitcylinder.fbx"); assetManager.addModelPathToQueue("Models/basic/geometry/unitplane.fbx"); assetManager.addModelPathToQueue("Models/basic/geometry/unitcube.fbx"); imagePlaneModelID = assetManager.registerModel(RenderUtils.createPlaneModel("Shaders/plane/plane.vs", "Shaders/plane/plane.fs")); assetManager.addShaderToQueue("Shaders/plane/plane.vs", null, "Shaders/plane/plane.fs"); solidPlaneModelID = assetManager.registerModel(RenderUtils.createInWindowPanel("Shaders/ui/plainBox/plainBox.vs", "Shaders/ui/plainBox/plainBox.fs")); //image panel ImagePanel.imagePanelModelPath = assetManager.registerModel(RenderUtils.createPlaneModel("Shaders/plane/plane.vs", "Shaders/plane/plane.fs")); //init ui images assetManager.addTexturePathtoQueue("Textures/ui/WindowBorder.png"); assetManager.addTexturePathtoQueue("Textures/ui/uiFrame1.png"); assetManager.addTexturePathtoQueue("Textures/ui/uiFrame2.png"); testingTexture = "Textures/Testing1.png"; Globals.assetManager.addTexturePathtoQueue(testingTexture); Globals.assetManager.addShaderToQueue("Shaders/ui/plainBox/plainBox.vs", "Shaders/ui/plainBox/plainBox.fs"); // //in game ui stuff // elementManager.registerWindow(WindowStrings.WINDOW_MENU_MAIN,WidgetUtils.createInGameMainMenuButton()); //window content shader assetManager.addShaderToQueue("Shaders/ui/windowContent/windowContent.vs", null, "Shaders/ui/windowContent/windowContent.fs"); //debug shaders assetManager.addShaderToQueue("Shaders/ui/debug/windowBorder/windowBound.vs", null, "Shaders/ui/debug/windowBorder/windowBound.fs"); assetManager.addShaderToQueue("Shaders/ui/debug/windowContentBorder/windowContentBound.vs", null, "Shaders/ui/debug/windowContentBorder/windowContentBound.fs"); //as these assets are required for the renderer to work, we go ahead and //load them into memory now. The loading time penalty is worth it I think. Globals.assetManager.loadAssetsInQueue(); } }