/*******************************************************************************
* Copyright (c) 2013 Philip Collin.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* Philip Collin - initial API and implementation
******************************************************************************/
package com.lyeeedar.Roguelike3D.Graphics.Screens;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.math.collision.Ray;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.Touchpad;
import com.esotericsoftware.tablelayout.Cell;
import com.lyeeedar.Graphics.ParticleEffects.ParticleEffect;
import com.lyeeedar.Graphics.ParticleEffects.ParticleEmitter;
import com.lyeeedar.Roguelike3D.Roguelike3DGame;
import com.lyeeedar.Roguelike3D.Roguelike3DGame.GameScreen;
import com.lyeeedar.Roguelike3D.Game.GameData;
import com.lyeeedar.Roguelike3D.Game.GameObject;
import com.lyeeedar.Roguelike3D.Game.Actor.GameActor;
import com.lyeeedar.Roguelike3D.Game.Level.LevelGraphics;
import com.lyeeedar.Roguelike3D.Game.LevelObjects.LevelObject;
import com.lyeeedar.Roguelike3D.Game.Spell.Spell;
import com.lyeeedar.Roguelike3D.Graphics.Lights.LightManager.LightQuality;
import com.lyeeedar.Roguelike3D.Graphics.Models.VisibleObject;
import com.lyeeedar.Roguelike3D.Graphics.Renderers.DeferredRenderer;
import com.lyeeedar.Roguelike3D.Graphics.Renderers.ForwardRenderer;
public class InGameScreen extends AbstractScreen {
public boolean paused = false;
Texture pausedTint;
public static final int VIEW_DISTANCE = 100;
public static final int ACTIVATE_DISTANCE = 100;
public static final boolean SHOW_COLLISION_BOX = false;
public static final int MAP_WIDTH = 100;
public static final int MAP_HEIGHT = 100;
public static final int MAP_X = 10;
public static final int MAP_Y = 10;
Texture crosshairs;
Sprite arrow;
float time = 0;
int particleNum = 0;
int drawnParticleNum = 0;
ArrayList<ParticleEmitter> visibleEmitters = new ArrayList<ParticleEmitter>();
public InGameScreen(Roguelike3DGame game) {
super(game);
}
@Override
public void drawModels(float delta) {
if (GameData.skyBox != null) GameData.skyBox.render(cam);
renderer.begin();
for (VisibleObject vo : GameData.levelGraphics.graphics)
{
vo.render(renderer);
}
GameData.level.render(renderer, cam, visibleEmitters);
renderer.end(GameData.lightManager);
}
@Override
public void drawTransparent(float delta) {
particleNum = 0;
for (Spell s : GameData.spells)
{
s.particleEffect.getVisibleEmitters(visibleEmitters, cam);
}
Collections.sort(visibleEmitters, ParticleEmitter.getComparator());
ParticleEmitter.begin(cam);
for (ParticleEmitter p : visibleEmitters)
{
particleNum += p.getActiveParticles();
p.render();
}
ParticleEmitter.end();
visibleEmitters.clear();
time -= delta;
if (time < 0)
{
System.out.println("Java Heap Size: "+Gdx.app.getJavaHeap()/1000000+"mb");
System.out.println("Visible Particles: "+particleNum);
System.out.println("Frame Time: "+Gdx.graphics.getRawDeltaTime());
time = 1;
drawnParticleNum = particleNum;
}
}
@Override
public void drawOrthogonals(float delta) {
spriteBatch.begin();
//Table.drawDebug(stage);
if (paused)
{
spriteBatch.draw(pausedTint, 0, 0, screen_width, screen_height);
int x = (int)( ( (GameData.player.position.x / 10f) + 0.5f) * LevelGraphics.STEP );
int y = (int)( ( (GameData.player.position.z / 10f) + 0.5f) * LevelGraphics.STEP );
spriteBatch.draw(GameData.levelGraphics.map, MAP_X, MAP_Y, MAP_WIDTH*2, MAP_HEIGHT*2,
x-MAP_WIDTH, y-MAP_HEIGHT, MAP_WIDTH*2, MAP_HEIGHT*2,
false, false);
// Work out angle
float angle = 90 * GameData.player.rotation.x;
if (GameData.player.rotation.z > 0)
{
angle = 180+angle;
}
else
{
angle = 0-angle;
}
arrow.setRotation(angle);
arrow.setPosition(MAP_WIDTH+MAP_X, MAP_HEIGHT+MAP_Y);
arrow.draw(spriteBatch);
}
else
{
spriteBatch.draw(crosshairs, screen_width/2f, screen_height/2f);
if (activatePrompt != null) font.draw(spriteBatch, activatePrompt, screen_width/2f, (screen_height/2f)-40);
}
font.draw(spriteBatch, desc, 300, 20);
font.draw(spriteBatch, "FPS: " + Gdx.graphics.getFramesPerSecond(), 20, screen_height-20);
font.draw(spriteBatch, "Render Type: " + getRenderType(), 20, screen_height-40);
font.draw(spriteBatch, "Visible Particles: " + drawnParticleNum, 20, screen_height-60);
spriteBatch.end();
stage.draw();
}
public String getRenderType()
{
if (GameData.lightQuality == LightQuality.FORWARD_VERTEX)
{
return "Forward";
}
else if (DeferredRenderer.BUFFER == 0)
{
return "Deferred - Final";
}
else if (DeferredRenderer.BUFFER == 1)
{
return "Deferred - Geometry";
}
else if (DeferredRenderer.BUFFER == 2)
{
return "Deferred - Normals";
}
else if (DeferredRenderer.BUFFER == 3)
{
return "Deferred - Depth";
}
else if (DeferredRenderer.BUFFER == 4)
{
return "Deferred - Lighting";
}
else
{
return "";
}
}
int count = 1;
float dist = VIEW_DISTANCE;
float tempdist = 0;
//GameObject lookedAtObject = null;
StringBuilder desc = new StringBuilder();
String activatePrompt = null;
Ray ray = new Ray(new Vector3(), new Vector3());
boolean tabCD = false;
boolean cd1 = false;
boolean cd2 = false;
boolean cdPlus = false;
boolean cdMinus = false;
float activateCD = 0;
@Override
public void update(float delta) {
activateCD -= delta;
if (!paused)
{
GameData.level.update(delta, cam);
Iterator<Spell> spells = GameData.spells.iterator();
while (spells.hasNext())
{
Spell s = spells.next();
boolean dispose = s.update(delta, cam);
if (dispose) spells.remove();
}
if (GameData.player == null) return;
cam.position.set(GameData.player.position).add(GameData.player.offsetPos);
cam.direction.set(GameData.player.rotation).add(GameData.player.offsetRot);
cam.update();
}
if (Gdx.input.isKeyPressed(Keys.ESCAPE)) game.switchScreen(GameScreen.MAINMENU);
if (Gdx.input.isKeyPressed(Keys.TAB) && !tabCD)
{
if (paused)
{
paused = false;
Gdx.input.setCursorCatched(true);
tabCD = true;
}
else
{
paused = true;
Gdx.input.setCursorCatched(false);
Gdx.input.setCursorPosition(screen_width/2, screen_height/2);
tabCD = true;
}
}
else if (!Gdx.input.isKeyPressed(Keys.TAB))
{
tabCD = false;
}
if (Gdx.input.isKeyPressed(Keys.NUM_1) && !cd1)
{
DeferredRenderer.BUFFER++;
if (DeferredRenderer.BUFFER == 5) DeferredRenderer.BUFFER = 0;
cd1 = true;
}
else if (!Gdx.input.isKeyPressed(Keys.NUM_1))
{
cd1 = false;
}
if (paused)
{
Ray ray2 = cam.getPickRay(Gdx.input.getX(), Gdx.input.getY());
dist = cam.far*cam.far;
ray.set(ray2);
activatePrompt = null;
}
// else
// {
// ray.origin.set(GameData.player.position);
// ray.direction.set(GameData.player.rotation);
// dist = VIEW_DISTANCE;
//
// activatePrompt = getActivatePrompt(dist, ray);
// }
//
// getDescription(dist, ray, paused);
//
// if (!paused && GameData.controls.getActivate() && activateCD < 0)
// {
// ray.origin.set(GameData.player.position);
// ray.direction.set(GameData.player.rotation);
// dist = ACTIVATE_DISTANCE;
//
// GameObject go = GameData.level.getClosestActor(ray, dist, GameData.player.UID, tmpVec);
//
// if (go != null)
// {
// System.out.println("actor collision");
// dist = tmpVec.dst2(ray.origin);
// }
//
// GameObject go2 = GameData.level.getClosestLevelObject(ray, dist, GameData.player.UID, tmpVec);
//
// if (go2 != null)
// {
// if (go != null) go.activate();
// else go2.activate();
// }
// else
// {
// if (go != null) go.activate();
// }
//
// activateCD = 1;
// }
stage.act(delta);
}
// public void getDescription(float dist, Ray ray, boolean longDesc)
// {
// desc.delete(0, desc.length());
// desc.append("There is nothing there but empty space.");
//
// GameObject go = GameData.level.getClosestActor(ray, dist, GameData.player.UID, tmpVec);
//
// if (go != null)
// {
// desc.delete(0, desc.length());
// if (longDesc) {
// desc.append(go.getRadius());
// }
// else
// {
// desc.append(go.getShortDesc());
// }
//
// dist = tmpVec.dst2(ray.origin);
// }
//
// go = GameData.level.getClosestLevelObject(ray, dist, GameData.player.UID, tmpVec);
//
// if (go != null)
// {
// desc.delete(0, desc.length());
// if (longDesc) {
// desc.append(go.getRadius());
// }
// else
// {
// desc.append(go.getShortDesc());
// }
//
// dist = tmpVec.dst2(ray.origin);
// }
//
// dist = GameData.level.getDescription(ray, dist, desc, paused);
// }
//
// public String getActivatePrompt(float dist, Ray ray)
// {
// String desc = null;
//
// GameObject go = GameData.level.getClosestActor(ray, dist, GameData.player.UID, tmpVec);
//
// if (go != null)
// {
//
// desc = go.getActivatePrompt();
//
// dist = tmpVec.dst2(ray.origin);
// }
//
// go = GameData.level.getClosestLevelObject(ray, dist, GameData.player.UID, tmpVec);
//
// if (go != null)
// {
// desc = go.getActivatePrompt();
//
// dist = tmpVec.dst2(ray.origin);
// }
//
// return desc;
// }
Table table;
@Override
public void create() {
GameData.init(game);
crosshairs = new Texture(Gdx.files.internal("data/textures/crosshairs.png"));
arrow = new Sprite(new Texture(Gdx.files.internal("data/textures/arrow.png")));
pausedTint = new Texture(Gdx.files.internal("data/textures/pausedScreenTint.png"));
if (GameData.isAndroid) {
stage.addActor(GameData.controls.getMovePad());
stage.addActor(GameData.controls.getLookPad());
}
}
@Override
public void hide() {
Gdx.input.setCursorCatched(false);
Gdx.input.setInputProcessor(null);
}
@Override
public void show()
{
Gdx.input.setCursorCatched(true);
if (renderer != null) renderer.dispose();
if (GameData.lightQuality == LightQuality.FORWARD_VERTEX)
{
renderer = new ForwardRenderer();
}
else if (GameData.lightQuality == LightQuality.DEFERRED)
{
renderer = new DeferredRenderer();
}
else
{
System.err.println("ARRRRRRRGGGGGHHHHHHH!");
}
renderer.createShader(GameData.lightManager);
renderer.updateResolution();
renderer.cam = cam;
stage.setViewport(GameData.resolution[0], GameData.resolution[1], false);
Gdx.input.setInputProcessor(stage);
}
@Override
public void pause() {
// TODO Auto-generated method stub
}
@Override
public void resume() {
// TODO Auto-generated method stub
}
@Override
public void superDispose() {
pausedTint.dispose();
crosshairs.dispose();
}
}