Renderer/src/main/java/electrosphere/engine/Globals.java
austin ac12b3f5a8
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
async load texture atlas
2024-05-07 21:39:20 -04:00

563 lines
20 KiB
Java

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<PointLight> 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<Vector3f> skyboxColors;
//thread for loading different game states
public static List<LoadingThread> loadingThreadsList = new LinkedList<LoadingThread>();
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<Vector3f>();
//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();
}
}