Skip to content
This repository has been archived by the owner on Oct 9, 2019. It is now read-only.

Commit

Permalink
Voxel-Build 115: Extract logic into States
Browse files Browse the repository at this point in the history
Every screen update and render has moved into a State, to reduce
the amount of code present in the global update and render
functions and to keep things clean.
  • Loading branch information
danirod committed Nov 16, 2015
1 parent b1124be commit d047043
Show file tree
Hide file tree
Showing 11 changed files with 337 additions and 210 deletions.
119 changes: 25 additions & 94 deletions src/main/java/net/guerra24/voxel/client/core/GlobalStates.java
@@ -1,130 +1,61 @@
package net.guerra24.voxel.client.core;

import java.util.Random;

import net.guerra24.voxel.client.api.API;
import net.guerra24.voxel.client.core.states.GameSPState;
import net.guerra24.voxel.client.core.states.InPauseState;
import net.guerra24.voxel.client.core.states.LoadingState;
import net.guerra24.voxel.client.core.states.MainMenuState;
import net.guerra24.voxel.client.core.states.OptionsState;
import net.guerra24.voxel.client.graphics.opengl.Display;
import net.guerra24.voxel.client.input.Keyboard;
import net.guerra24.voxel.client.menu.MainMenu;
import net.guerra24.voxel.client.menu.OptionsMenu;
import net.guerra24.voxel.client.menu.PauseMenu;
import net.guerra24.voxel.client.resources.GameResources;
import net.guerra24.voxel.client.resources.Loader;
import net.guerra24.voxel.client.world.WorldsHandler;
import net.guerra24.voxel.universal.util.vector.Vector3f;

public class GlobalStates {

public boolean loop = false;
private GameState state;

private MainMenu mainMenu;
private PauseMenu pauseMenu;
private OptionsMenu optionsMenu;
public GameState state;

public enum GameState {
GAME_SP, MAINMENU, IN_PAUSE, LOADING_WORLD, OPTIONS;
GAME_SP(new GameSPState()),
MAINMENU(new MainMenuState()),
IN_PAUSE(new InPauseState()),
LOADING_WORLD(new LoadingState()),
OPTIONS(new OptionsState());

GameState(State state) {
this.state = state;
}

State state;
}

public GlobalStates(Loader loader) {
mainMenu = new MainMenu(loader);
pauseMenu = new PauseMenu();
optionsMenu = new OptionsMenu();
loop = true;
state = GameState.MAINMENU;
}

public void updateUpdateThread(GameResources gm, WorldsHandler worlds, API api, Display display) {

if (state == GameState.MAINMENU && mainMenu.getPlayButton().pressed()) {
state = GameState.LOADING_WORLD;
Random seed;
if (VoxelVariables.isCustomSeed) {
seed = new Random(VoxelVariables.seed.hashCode());
} else {
seed = new Random();
}
worlds.getActiveWorld().startWorld("World-0", seed, 0, api, gm);
gm.getCamera().setMouse();
gm.getSoundSystem().stop("menu1");
gm.getSoundSystem().rewind("menu1");
state = GameState.GAME_SP;
}

if (state == GameState.MAINMENU && mainMenu.getExitButton().pressed()) {
loop = false;
}

if (state == GameState.IN_PAUSE && pauseMenu.getBackToMain().pressed()) {
worlds.getActiveWorld().clearDimension(gm);
gm.getSoundSystem().play("menu1");
gm.getCamera().setPosition(new Vector3f(0, 0, 1));
gm.getCamera().setPitch(0);
gm.getCamera().setYaw(0);
state = GameState.MAINMENU;
gm.getSoundSystem().setVolume("menu1", 1f);
}

if (state == GameState.MAINMENU && mainMenu.getOptionsButton().pressed()) {
gm.getCamera().setPosition(new Vector3f(-1.4f, -3.4f, 1.4f));
state = GameState.OPTIONS;
}

if (state == GameState.OPTIONS && optionsMenu.getExitButton().pressed()) {
gm.getCamera().setPosition(new Vector3f(0, 0, 1));
state = GameState.MAINMENU;
}
if (state == GameState.MAINMENU) {
if (mainMenu.getPlayButton().insideButton())
mainMenu.getList().get(0).changeScale(0.074f);
else
mainMenu.getList().get(0).changeScale(0.07f);
if (mainMenu.getExitButton().insideButton())
mainMenu.getList().get(2).changeScale(0.074f);
else
mainMenu.getList().get(2).changeScale(0.07f);
if (mainMenu.getOptionsButton().insideButton())
mainMenu.getList().get(1).changeScale(0.074f);
else
mainMenu.getList().get(1).changeScale(0.07f);

}

if (state == GameState.OPTIONS) {
if (optionsMenu.getExitButton().insideButton())
mainMenu.getList().get(3).changeScale(0.074f);
else
mainMenu.getList().get(3).changeScale(0.07f);
}

if (state == GameState.GAME_SP && !display.isDisplayFocused() && !VoxelVariables.debug) {
gm.getCamera().unlockMouse();
state = GameState.IN_PAUSE;
}

public void doUpdate(Voxel voxel, float delta) {

state.state.update(voxel, this, delta);

if (Display.isCloseRequested())
loop = false;

while (Keyboard.next()) {
if (state == GameState.GAME_SP && Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
gm.getCamera().unlockMouse();
voxel.getGameResources().getCamera().unlockMouse();
state = GameState.IN_PAUSE;
} else if (state == GameState.IN_PAUSE && Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
gm.getCamera().setMouse();
voxel.getGameResources().getCamera().setMouse();
state = GameState.GAME_SP;
}
}
}

public void updateRenderThread(GameResources gm, WorldsHandler worlds, API api, Display display) {
public void doRender(Voxel voxel, float delta) {
state.state.render(voxel, this, delta);
}

public GameState getState() {
return state;
}

public MainMenu getMainMenu() {
return mainMenu;
}

}
9 changes: 9 additions & 0 deletions src/main/java/net/guerra24/voxel/client/core/State.java
@@ -0,0 +1,9 @@
package net.guerra24.voxel.client.core;

public interface State {

void update(Voxel voxel, GlobalStates states, float delta);

void render(Voxel voxel, GlobalStates states, float delta);

}
111 changes: 16 additions & 95 deletions src/main/java/net/guerra24/voxel/client/core/Voxel.java
Expand Up @@ -102,12 +102,8 @@ private void init() {
worldsHandler.registerWorld(world.getCodeName(), world);
worldsHandler.setActiveWorld("Infinity");
Logger.log("Initializing Threads");
worldThread2 = new WorldThread1();
worldThread2 = new WorldThread1(this);
worldThread2.setName("Voxel World 1");
worldThread2.setWorldHandler(worldsHandler);
worldThread2.setGameResources(gameResources);
worldThread2.setVoxel(this);
worldThread2.setGuiResources(guiResources);
worldThread2.start();
/*
* new Thread(new Runnable() { public void run() {
Expand Down Expand Up @@ -138,104 +134,21 @@ public void mainLoop() {
Display.timeCountRender -= 1f;
}
delta = Display.getDeltaRender();
render(gameResources, delta);
render(delta);
}
dispose();
}

public void render(GameResources gm, float delta) {
private void render(float delta) {
Display.fpsCount++;
switch (gm.getGlobalStates().getState()) {
case MAINMENU:
gm.getFrustum().calculateFrustum(gm.getRenderer().getProjectionMatrix(), gm.getCamera());
gm.getRenderer().prepare();
gm.getRenderer().renderGui(gm.getGlobalStates().getMainMenu().getList(), gm);
gm.getGuiRenderer().renderGui(gm.guis2);
break;
case IN_PAUSE:
gm.getRenderer().prepare();
gm.getRenderer().begin(gm);
worldsHandler.getActiveWorld().updateChunksRender(gm);
gm.getRenderer().end(gm);
gm.getRenderer().renderEntity(gm.getPhysics().getMobManager().getMobs(), gm);
gm.getSkyboxRenderer().render(VoxelVariables.RED, VoxelVariables.GREEN, VoxelVariables.BLUE, delta, gm);
gm.getParticleController().render(gm);
gm.getGuiRenderer().renderGui(gm.guis4);
break;
case GAME_SP:
worldsHandler.getActiveWorld().lighting();

gm.getWaterFBO().begin(128, 128);
gm.getCamera().invertPitch();
gm.getRenderer().prepare();
gm.getSkyboxRenderer().render(VoxelVariables.RED, VoxelVariables.GREEN, VoxelVariables.BLUE, delta, gm);
gm.getWaterFBO().end();
gm.getCamera().invertPitch();

gm.getSun_Camera().setPosition(gm.getCamera().getPosition());
if (VoxelVariables.useShadows) {
gm.getMasterShadowRenderer().being();
gm.getRenderer().prepare();
worldsHandler.getActiveWorld().updateChunksShadow(gm);
gm.getMasterShadowRenderer().end();
}

gm.getFrustum().calculateFrustum(gm.getRenderer().getProjectionMatrix(), gm.getCamera());

gm.getPostProcessing().getPost_fbo().begin(Display.getWidth(), Display.getHeight());
gm.getRenderer().prepare();
gm.getRenderer().begin(gm);
worldsHandler.getActiveWorld().updateChunksRender(gm);
gm.getRenderer().end(gm);
gm.getSkyboxRenderer().render(VoxelVariables.RED, VoxelVariables.GREEN, VoxelVariables.BLUE, delta, gm);
gm.getRenderer().renderEntity(gm.getPhysics().getMobManager().getMobs(), gm);
gm.getParticleController().render(gm);
gm.getCamera().update(delta, gameResources, guiResources, worldsHandler.getActiveWorld(), api, client);
gm.getPhysics().getMobManager().getPlayer().update(delta, gm, guiResources, worldsHandler.getActiveWorld(),
api);
gm.getPostProcessing().getPost_fbo().end();

gm.getRenderer().prepare();
gm.getPostProcessing().render(gm);
gm.getGuiRenderer().renderGui(gm.guis);
break;
case LOADING_WORLD:
gm.getRenderer().prepare();
gm.getGuiRenderer().renderGui(gm.guis3);
break;
case OPTIONS:
gm.getFrustum().calculateFrustum(gm.getRenderer().getProjectionMatrix(), gm.getCamera());
gm.getRenderer().prepare();
gm.getRenderer().renderGui(gm.getGlobalStates().getMainMenu().getList(), gm);
gm.getGuiRenderer().renderGui(gm.guis2);
break;
}
gm.getTextMasterRenderer().render();
gm.getGlobalStates().updateRenderThread(gm, worldsHandler, api, display);
display.updateDisplay(VoxelVariables.FPS, gm);
gameResources.getGlobalStates().doRender(this, delta);
gameResources.getTextMasterRenderer().render();
display.updateDisplay(VoxelVariables.FPS, gameResources);
}

public void update(GameResources gm, GuiResources gi, WorldsHandler world, float delta) {
public void update(float delta) {
Display.upsCount++;
switch (gm.getGlobalStates().getState()) {
case MAINMENU:
break;
case IN_PAUSE:
break;
case GAME_SP:
worldsHandler.getActiveWorld().updateChunksGeneration(gm, api);
gm.getPhysics().getMobManager().update(delta, gm, gi, world.getActiveWorld(), api);
gm.getParticleController().update(delta, gm, gi, world.getActiveWorld());
gm.getRenderer().getWaterRenderer().update(delta);
gm.update(gm.getSkyboxRenderer().update(delta));
gm.getParticleController().update(delta, gm, gi, world.getActiveWorld());
break;
case LOADING_WORLD:
break;
case OPTIONS:
break;
}
gm.getGlobalStates().updateUpdateThread(gm, world, api, display);
gameResources.getGlobalStates().doUpdate(this, delta);
}

public void dispose() {
Expand All @@ -261,4 +174,12 @@ public DedicatedClient getClient() {
return client;
}

public WorldsHandler getWorldsHandler() {
return worldsHandler;
}

public Display getDisplay() {
return display;
}

}
29 changes: 8 additions & 21 deletions src/main/java/net/guerra24/voxel/client/core/WorldThread1.java
Expand Up @@ -30,12 +30,15 @@
import net.guerra24.voxel.client.world.WorldsHandler;

public class WorldThread1 extends Thread {
private GameResources gameResources;
private GuiResources guiResources;
private WorldsHandler world;
private Voxel voxel;
private final GameResources gameResources;
private final Voxel voxel;
private long variableYieldTime, lastTime;
private int fps = 20;

public WorldThread1(Voxel voxel) {
this.voxel = voxel;
this.gameResources = voxel.getGameResources();
}

@Override
public void run() {
Expand All @@ -46,29 +49,13 @@ public void run() {
delta = Display.getDeltaUpdate();
accumulator += delta;
while (accumulator >= interval) {
voxel.update(gameResources, guiResources, world, interval);
voxel.update(interval);
accumulator -= interval;
}
sync(fps);
}
}

public void setGameResources(GameResources gameResources) {
this.gameResources = gameResources;
}

public void setWorldHandler(WorldsHandler dimensionHandler) {
this.world = dimensionHandler;
}

public void setVoxel(Voxel kernel) {
this.voxel = kernel;
}

public void setGuiResources(GuiResources guiResources) {
this.guiResources = guiResources;
}

private void sync(int fps) {
if (fps <= 0)
return;
Expand Down

0 comments on commit d047043

Please sign in to comment.