341 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			341 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package electrosphere.engine.loadingthreads;
 | |
| 
 | |
| import java.util.Random;
 | |
| import java.util.concurrent.TimeUnit;
 | |
| 
 | |
| import org.joml.Quaterniond;
 | |
| import org.joml.Vector3d;
 | |
| import org.joml.Vector3f;
 | |
| import org.joml.Vector3i;
 | |
| 
 | |
| import electrosphere.audio.AudioUtils;
 | |
| import electrosphere.audio.VirtualAudioSource;
 | |
| import electrosphere.audio.VirtualAudioSourceManager.VirtualAudioSourceType;
 | |
| import electrosphere.client.culling.ClientEntityCullingManager;
 | |
| import electrosphere.client.fluid.cells.FluidCellManager;
 | |
| import electrosphere.client.foliagemanager.ClientFoliageManager;
 | |
| import electrosphere.client.sim.ClientSimulation;
 | |
| import electrosphere.client.targeting.crosshair.Crosshair;
 | |
| import electrosphere.client.terrain.cells.DrawCell;
 | |
| import electrosphere.client.terrain.cells.DrawCellManager;
 | |
| import electrosphere.client.terrain.cells.DrawCell.DrawCellFace;
 | |
| import electrosphere.collision.CollisionEngine;
 | |
| import electrosphere.controls.ControlHandler;
 | |
| import electrosphere.engine.Globals;
 | |
| import electrosphere.entity.ClientEntityUtils;
 | |
| import electrosphere.entity.DrawableUtils;
 | |
| import electrosphere.entity.Entity;
 | |
| import electrosphere.entity.EntityCreationUtils;
 | |
| import electrosphere.entity.EntityDataStrings;
 | |
| import electrosphere.entity.EntityUtils;
 | |
| import electrosphere.entity.btree.BehaviorTree;
 | |
| import electrosphere.entity.state.movement.ApplyRotationTree;
 | |
| import electrosphere.entity.types.camera.CameraEntityUtils;
 | |
| import electrosphere.entity.types.terrain.TerrainChunk;
 | |
| import electrosphere.entity.types.tree.ProceduralTree;
 | |
| import electrosphere.logger.LoggerInterface;
 | |
| import electrosphere.menu.MenuGenerators;
 | |
| import electrosphere.menu.WindowStrings;
 | |
| import electrosphere.menu.WindowUtils;
 | |
| import electrosphere.menu.mainmenu.MenuGeneratorsMultiplayer;
 | |
| import electrosphere.net.NetUtils;
 | |
| import electrosphere.net.client.ClientNetworking;
 | |
| import electrosphere.renderer.meshgen.TransvoxelModelGeneration.TransvoxelChunkData;
 | |
| import electrosphere.renderer.ui.elements.Window;
 | |
| import electrosphere.server.datacell.EntityDataCellMapper;
 | |
| import electrosphere.server.terrain.manager.ServerTerrainChunk;
 | |
| import electrosphere.util.MathUtils;
 | |
| 
 | |
| 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.hintUpdateControlState(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.setRecapture(true);
 | |
|         //log
 | |
|         LoggerInterface.loggerEngine.INFO("[Client]Finished loading character creation menu");
 | |
|         //set menu controls again
 | |
|         Globals.controlHandler.hintUpdateControlState(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.hintUpdateControlState(ControlHandler.ControlsState.NO_INPUT);
 | |
|         //initialize the "real" objects simulation
 | |
|         initClientSimulation();
 | |
|         //init foliage manager
 | |
|         initFoliageManager();
 | |
|         //initialize the cell manager (client)
 | |
|         initDrawCellManager();
 | |
|         //init the fluid cell manager
 | |
|         initFluidCellManager();
 | |
|         //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();
 | |
|         //make loading window disappear
 | |
|         loadingWindow.setVisible(false);
 | |
|         //recapture screen
 | |
|         Globals.controlHandler.setRecapture(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.hintUpdateControlState(ControlHandler.ControlsState.MAIN_GAME);
 | |
|     }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * Inits the client networking thread and socket
 | |
|      */
 | |
|     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
 | |
|         
 | |
|         */
 | |
|         if(Globals.controlHandler.cameraIsThirdPerson()){
 | |
|             Globals.playerCamera = CameraEntityUtils.spawnPlayerEntityTrackingCameraEntity(new Vector3f(1,0,1), MathUtils.getOriginVectorf());
 | |
|         } else {
 | |
|             Globals.playerCamera = CameraEntityUtils.spawnPlayerEntityTrackingCameraFirstPersonEntity(new Vector3f(1,0,1), MathUtils.getOriginVectorf());
 | |
|         }
 | |
| 
 | |
|         
 | |
|         /*
 | |
|         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/environment/skyboxSphere.fbx");
 | |
|         DrawableUtils.disableCulling(skybox);
 | |
|         EntityUtils.getRotation(skybox).rotateX((float)(-Math.PI/2.0f));
 | |
|         EntityUtils.getScale(skybox).mul(200000.0f);
 | |
|         Globals.assetManager.queueOverrideMeshShader("Models/environment/skyboxSphere.fbx", "Sphere", "Shaders/skysphere/skysphere.vs", "Shaders/skysphere/skysphere.fs");
 | |
| 
 | |
|         //cloud ring pseudo skybox
 | |
|         Entity cloudRing = EntityCreationUtils.createClientSpatialEntity();
 | |
|         EntityCreationUtils.makeEntityDrawable(cloudRing, "Models/environment/cloudRing.fbx");
 | |
|         DrawableUtils.disableCulling(cloudRing);
 | |
|         EntityUtils.getRotation(cloudRing).rotateX((float)(-Math.PI/2.0f));
 | |
|         EntityUtils.getScale(cloudRing).mul(100000.0f);
 | |
|         Globals.clientScene.registerBehaviorTree(new ApplyRotationTree(cloudRing,new Quaterniond().rotationZ(0.0001)));
 | |
|         Globals.assetManager.queueOverrideMeshShader("Models/environment/cloudRing.fbx", "Sphere", "Shaders/skysphere/skysphere.vs", "Shaders/skysphere/skysphere.fs");
 | |
| 
 | |
|         Globals.playerCursor = EntityCreationUtils.createClientSpatialEntity();
 | |
|         EntityCreationUtils.makeEntityDrawable(Globals.playerCursor, "Models/basic/geometry/unitsphere_1.fbx");
 | |
|         EntityUtils.getScale(Globals.playerCursor).set(30f);
 | |
| 
 | |
| 
 | |
|     }
 | |
| 
 | |
|     static void initDrawCellManager(){
 | |
|         while(Globals.clientWorldData == null || Globals.initialAssetLoadingThread.isLoading()){
 | |
|             try {
 | |
|                 TimeUnit.MILLISECONDS.sleep(10);
 | |
|             } catch (InterruptedException ex) {
 | |
|             }
 | |
|         }
 | |
|         //initialize draw cell manager
 | |
|         Globals.drawCellManager = new DrawCellManager(Globals.clientTerrainManager, 0, 0, 0);
 | |
|         //construct texture atlas
 | |
|         Globals.drawCellManager.attachTextureAtlas(Globals.voxelTextureAtlas);
 | |
|         //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.containsUnrequestedCell()){
 | |
| //            Globals.drawCellManager.updateInvalidCell();
 | |
|             try {
 | |
|                 TimeUnit.MILLISECONDS.sleep(10);
 | |
|             } catch (InterruptedException ex) {
 | |
|                 ex.printStackTrace();
 | |
|             }
 | |
| //            System.out.println("invalid cell");
 | |
|         }
 | |
|         
 | |
|         while(Globals.drawCellManager.containsUndrawableCell()){
 | |
| //            Globals.drawCellManager.makeCellDrawable();
 | |
|             try {
 | |
|                 TimeUnit.MILLISECONDS.sleep(10);
 | |
|             } catch (InterruptedException ex) {
 | |
|                 ex.printStackTrace();
 | |
|             }
 | |
| //            System.out.println("undrawable");
 | |
|         }
 | |
|         
 | |
|         // while(Globals.drawCellManager.containsPhysicsNeedingCell()){
 | |
|         //     try {
 | |
|         //         TimeUnit.MILLISECONDS.sleep(10);
 | |
|         //     } catch (InterruptedException ex) {
 | |
|         //     }
 | |
|         // }
 | |
|         // System.out.println("Draw Cell Manager ready");
 | |
|     }
 | |
| 
 | |
|     static void initFluidCellManager(){
 | |
|         while(Globals.clientWorldData == null){
 | |
|             try {
 | |
|                 TimeUnit.MILLISECONDS.sleep(10);
 | |
|             } catch (InterruptedException ex) {
 | |
|             }
 | |
|         }
 | |
|         //initialize draw cell manager
 | |
|         Globals.fluidCellManager = new FluidCellManager(Globals.clientTerrainManager, 0, 0, 0);
 | |
|         //set our draw cell manager to actually generate drawable chunks
 | |
|         Globals.fluidCellManager.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.fluidCellManager.containsUnrequestedCell()){
 | |
| //            Globals.drawCellManager.updateInvalidCell();
 | |
|             try {
 | |
|                 TimeUnit.MILLISECONDS.sleep(10);
 | |
|             } catch (InterruptedException ex) {
 | |
|                 ex.printStackTrace();
 | |
|             }
 | |
| //            System.out.println("invalid cell");
 | |
|         }
 | |
|         
 | |
|         while(Globals.fluidCellManager.containsUndrawableCell()){
 | |
| //            Globals.drawCellManager.makeCellDrawable();
 | |
|             try {
 | |
|                 TimeUnit.MILLISECONDS.sleep(10);
 | |
|             } catch (InterruptedException ex) {
 | |
|                 ex.printStackTrace();
 | |
|             }
 | |
| //            System.out.println("undrawable");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Starts up the entity culling manager
 | |
|      */
 | |
|     private static void initEntityCullingManager(){
 | |
|         Globals.clientEntityCullingManager = new ClientEntityCullingManager(Globals.clientScene);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Starts up the foliage manager
 | |
|      */
 | |
|     private static void initFoliageManager(){
 | |
|         Globals.clientFoliageManager = new ClientFoliageManager();
 | |
|         Globals.clientFoliageManager.start();
 | |
|     }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| }
 |