@author Agares
*/
public class MinimapAppState extends AbstractMyrdragorAppState {
private Camera miniCam;
private ViewPort minimapVP;
private CharacterControl player;
private FlyByCamera flyCam;
private WaterFilter water;
private FilterPostProcessor fpp;
private FrameBuffer outBuf;
private Texture2D output;
private float updateTime;
/**
*
-
@param stateManager
-
@param app
*/
@Override
public void initialize(AppStateManager stateManager, Application app) {
super.initialize(stateManager, app);
this.app = (MyrdragorApplication) app;
if (this.app.getStateManager().getState(GameAppState.class) != null) {
player = this.app.getStateManager().getState(GameAppState.class).getPlayer();
}
flyCam = this.app.getFlyByCamera();
initMinimapViewPort();
initOverlay();
initFPP();
}
/**
*
-
@param stateManager
*/
@Override
public void stateDetached(AppStateManager stateManager) {
super.stateDetached(stateManager);
if (fpp != null) {
minimapVP.removeProcessor(fpp);
}
minimapVP.clearScenes();
minimapVP.setClearFlags(true, true, true);
app.getRenderManager().removeMainView(minimapVP);
miniCam = null;
}
@Override
public void update(float tpf) {
float init = app.getTimer().getTimeInSeconds();
super.update(tpf);
if (miniCam != null && minimapVP != null) {
if (!flyCam.isEnabled()) {
Vector3f camLoc = player.getPhysicsLocation().add(0, 400, 0);
miniCam.setLocation(camLoc);
} else {
Vector3f camLoc = app.getCamera().getLocation().add(0, 400, 0);
miniCam.setLocation(camLoc);
}
updateOverlay();
}
updateTime = app.getTimer().getTimeInSeconds() - init;
}
private void initMinimapViewPort() {
miniCam = new Camera(256, 256);
minimapVP = app.getRenderManager().createPreView("MinimapVp", miniCam);
minimapVP.setClearFlags(true, true, true);
minimapVP.setBackgroundColor(new ColorRGBA(0, 0, 0, 0));
// create offscreen framebuffer
outBuf = new FrameBuffer(256, 256, 1);
//setup framebuffer's cam
miniCam.setFrustumPerspective(45f, 1f, 1f, 1000f);
Vector3f camLoc = app.getCamera().getLocation().add(0, 400, 0);
miniCam.setLocation(camLoc);
miniCam.lookAtDirection(new Vector3f(0, -1, 0), new Vector3f(0, 0, -1));
//setup framebuffer's texture
output = new Texture2D(256, 256, Format.RGBA8);
output.setMinFilter(Texture.MinFilter.Trilinear);
output.setMagFilter(Texture.MagFilter.Bilinear);
//setup framebuffer to use texture
outBuf.setDepthBuffer(Format.Depth);
outBuf.setColorTexture(output);
//set viewport to render to offscreen framebuffer
minimapVP.setOutputFrameBuffer(outBuf);
minimapVP.attachScene(app.getRootNode());
}
private void updateOverlay() {
if (app.getDataHandler().getNifty().getCurrentScreen().getScreenController() instanceof MainGame) {
MainGame guiCtrl = (MainGame) app.getDataHandler().getNifty().getCurrentScreen().getScreenController();
guiCtrl.setCharViewDir(player.getViewDirection().clone());
}
}
public void initOverlay() {
if (app.getDataHandler().getNifty().getCurrentScreen().getScreenController() instanceof MainGame) {
MainGame guiCtrl = (MainGame) app.getDataHandler().getNifty().getCurrentScreen().getScreenController();
guiCtrl.setCharViewDir(player.getViewDirection().clone());
guiCtrl.setMinimapImage(output);
}
}
private void initFPP() {
DirectionalLight dl = null;
if (app.getStateManager().getState(WorldAppState.class) != null) {
LightList localLightList = app.getStateManager().getState(WorldAppState.class).getSceneNode().getLocalLightList();
for (Light light : localLightList) {
if (light instanceof DirectionalLight) {
dl = (DirectionalLight) light;
break;
}
}
}
if (dl == null && app.getStateManager().getState(WorldTileEditorAppState.class) != null) {
dl = app.getStateManager().getState(WorldTileEditorAppState.class).getDirectionalLight();
}
if (dl != null) {
water = new WaterFilter(app.getRootNode(), dl.getDirection());
fpp = new FilterPostProcessor(app.getAssetManager());
fpp.addFilter(water);
water.setWaveScale(0.003f);
water.setMaxAmplitude(2f);
water.setFoamExistence(new Vector3f(0.25f, 1f, 0.25f));
water.setDeepWaterColor(ColorRGBA.Brown);
water.setUnderWaterFogDistance(50);
water.setWaterColor(ColorRGBA.Brown.mult(1.2f));
water.setFoamTexture((Texture2D) app.getAssetManager().loadTexture("Common/MatDefs/Water/Textures/foam2.jpg"));
water.setWaterHeight(20);
minimapVP.addProcessor(fpp);
}
}
@Override
public PieValue getPerformanceinfo() {
return new PieValue(updateTime, Color.CYAN, “MinimapAppState”);
}
}