package electrosphere.engine.loadingthreads; import java.util.concurrent.TimeUnit; import org.joml.Quaternionf; import org.joml.Vector3f; import electrosphere.engine.Globals; import electrosphere.entity.Entity; import electrosphere.entity.EntityCreationUtils; import electrosphere.entity.EntityUtils; import electrosphere.entity.state.movement.ApplyRotationTree; import electrosphere.entity.types.camera.CameraEntityUtils; import electrosphere.game.client.cells.DrawCellManager; import electrosphere.game.client.targeting.crosshair.Crosshair; import electrosphere.logger.LoggerInterface; import electrosphere.menu.MenuGenerators; import electrosphere.menu.MenuGeneratorsMultiplayer; import electrosphere.menu.WindowStrings; import electrosphere.menu.WindowUtils; import electrosphere.net.NetUtils; import electrosphere.net.client.ClientNetworking; import electrosphere.renderer.ui.Window; import electrosphere.client.culling.ClientEntityCullingManager; import electrosphere.client.sim.ClientSimulation; import electrosphere.controls.ControlHandler; public class ClientLoading { protected static void loadMainMenu(){ Window loadingWindow = (Window)Globals.elementManager.getWindow(WindowStrings.WINDOW_LOADING); WindowUtils.recursiveSetVisible(loadingWindow,false); WindowUtils.focusWindow(WindowStrings.WINDOW_MENU_MAIN); WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN), true); } protected static void loadCharacterServer(){ Window loadingWindow = (Window)Globals.elementManager.getWindow(WindowStrings.WINDOW_LOADING); WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN), false); WindowUtils.replaceMainMenuContents(MenuGenerators.createEmptyMainMenu()); loadingWindow.setVisible(true); //disable menu input Globals.controlHandler.setHandlerState(ControlHandler.ControlsState.NO_INPUT); //initialize the client thread (client) initClientThread(); //while we don't know what races are playable, wait while(Globals.gameConfigCurrent.getCreatureTypeLoader().getPlayableRaces().size() == 0){ try { TimeUnit.MILLISECONDS.sleep(5); } catch (InterruptedException ex) {} } //once we have them, bring up the character creation interface //init character creation window //eventually should replace with at ui to select an already created character or create a new one WindowUtils.replaceMainMenuContents(MenuGeneratorsMultiplayer.createMultiplayerCharacterCreationWindow()); //make loading dialog disappear loadingWindow.setVisible(false); //make character creation window visible WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN), true); //recapture window Globals.controlHandler.setShouldRecapture(true); //log LoggerInterface.loggerEngine.INFO("[Client]Finished loading character creation menu"); //set menu controls again Globals.controlHandler.setHandlerState(ControlHandler.ControlsState.TITLE_MENU); } protected static void loadClientWorld(){ Window loadingWindow = (Window)Globals.elementManager.getWindow(WindowStrings.WINDOW_LOADING); WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN), false); WindowUtils.replaceMainMenuContents(MenuGenerators.createEmptyMainMenu()); loadingWindow.setVisible(true); //disable menu input Globals.controlHandler.setHandlerState(ControlHandler.ControlsState.NO_INPUT); //collision engine if(!Globals.RUN_SERVER){ LoadingUtils.initCommonWorldData(Globals.RUN_SERVER); } //initialize the "real" objects simulation initClientSimulation(); //initialize the cell manager (client) initDrawCellManager(); //initialize the basic graphical entities of the world (skybox, camera) initWorldBaseGraphicalEntities(); //init arena specific stuff (ie different skybox colors) initArenaGraphicalEntities(); //sets micro and macro sims to ready if they exist setSimulationsToReady(); //init culling manager and other graphics-focused non-simulation items initEntitycullingManager(); //hide cursor Globals.controlHandler.hideMouse(); //make loading window disappear loadingWindow.setVisible(false); //recapture screen Globals.controlHandler.setShouldRecapture(true); //set rendering flags to main game mode Globals.RENDER_FLAG_RENDER_SHADOW_MAP = true; Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT = true; Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER = true; Globals.RENDER_FLAG_RENDER_UI = true; Globals.RENDER_FLAG_RENDER_BLACK_BACKGROUND = false; Globals.RENDER_FLAG_RENDER_WHITE_BACKGROUND = false; LoggerInterface.loggerEngine.INFO("[Client]Finished loading main game"); //set controls state Globals.controlHandler.setHandlerState(ControlHandler.ControlsState.MAIN_GAME); } private static void initClientThread(){ //start client networking Thread clientThread = null; if(Globals.RUN_CLIENT){ Globals.clientConnection = new ClientNetworking(NetUtils.getAddress(),NetUtils.getPort()); clientThread = new Thread(Globals.clientConnection); clientThread.start(); } } /** * Creates client simulation object */ private static void initClientSimulation(){ if(Globals.clientSimulation == null){ Globals.clientSimulation = new ClientSimulation(); } } /** * Sets client simulation object state to ready */ private static void setSimulationsToReady(){ Globals.clientSimulation.setReady(true); } private static void initWorldBaseGraphicalEntities(){ /* Skybox */ // Model skyboxModel = Globals.assetManager.fetchModel(AssetDataStrings.ASSET_STRING_SKYBOX_BASIC); // Globals.skybox = EntityUtils.spawnDrawableEntity(AssetDataStrings.ASSET_STRING_SKYBOX_BASIC); /* Player Camera */ Globals.playerCamera = CameraEntityUtils.spawnPlayerEntityTrackingCameraEntity(new Vector3f(1,0,1), new Vector3f(0,0,1)); // Globals.playerCamera = CameraEntityUtils.spawnPlayerEntityAirplaneTrackingCameraEntity(new Vector3f(1,0,1), new Vector3f(0,0,1)); /* Targeting crosshair */ Crosshair.initCrossHairEntity(); } static void initArenaGraphicalEntities(){ float skyR = 150; float skyG = 200; float skyB = 250; float groundR = 20; float groundG = 20; float groundB = 20; Globals.skyboxColors.add(new Vector3f(skyR,skyG,skyB)); Globals.skyboxColors.add(new Vector3f(skyR,skyG,skyB)); Globals.skyboxColors.add(new Vector3f(groundR,groundG,groundB)); Globals.skyboxColors.add(new Vector3f(groundR,groundG,groundB)); Globals.skyboxColors.add(new Vector3f(skyR,skyG,skyB)); Globals.skyboxColors.add(new Vector3f(skyR,skyG,skyB)); Globals.skyboxColors.add(new Vector3f(groundR,groundG,groundB)); Globals.skyboxColors.add(new Vector3f(groundR,groundG,groundB)); //starry sky true skybox Entity skybox = EntityCreationUtils.createClientSpatialEntity(); EntityCreationUtils.makeEntityDrawable(skybox, "Models/skyboxSphere.fbx"); EntityUtils.getRotation(skybox).rotateX((float)(-Math.PI/2.0f)); EntityUtils.getScale(skybox).mul(2000.0f); Globals.assetManager.queueOverrideMeshShader("Models/skyboxSphere.fbx", "Sphere", "Shaders/skysphere/skysphere.vs", "Shaders/skysphere/skysphere.fs"); //cloud ring pseudo skybox Entity cloudRing = EntityCreationUtils.createClientSpatialEntity(); EntityCreationUtils.makeEntityDrawable(cloudRing, "Models/cloudRing.fbx"); EntityUtils.getRotation(cloudRing).rotateX((float)(-Math.PI/2.0f)); EntityUtils.getScale(cloudRing).mul(1000.0f); Globals.clientScene.registerBehaviorTree(new ApplyRotationTree(cloudRing,new Quaternionf().rotationZ(0.0001f))); Globals.assetManager.queueOverrideMeshShader("Models/cloudRing.fbx", "Sphere", "Shaders/skysphere/skysphere.vs", "Shaders/skysphere/skysphere.fs"); } static void initDrawCellManager(){ //initialize draw cell manager Globals.drawCellManager = new DrawCellManager(Globals.commonWorldData, Globals.clientTerrainManager, 0, 0); //set our draw cell manager to actually generate drawable chunks Globals.drawCellManager.setGenerateDrawables(true); //Alerts the client simulation that it should start loading terrain Globals.clientSimulation.setLoadingTerrain(true); //wait for all the terrain data to arrive while(Globals.drawCellManager.containsInvalidCell()){ // Globals.drawCellManager.updateInvalidCell(); try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException ex) { } // System.out.println("invalid cell"); } while(Globals.drawCellManager.containsUndrawableCell()){ // Globals.drawCellManager.makeCellDrawable(); try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException ex) { } // System.out.println("undrawable"); } while(Globals.drawCellManager.containsPhysicsNeedingCell()){ try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException ex) { } } // System.out.println("Draw Cell Manager ready"); } private static void initEntitycullingManager(){ Globals.clientEntityCullingManager = new ClientEntityCullingManager(Globals.clientScene); } }