ProjectZombie/src/projectzombie/display/DisplayRenderUI.java

228 lines
7.1 KiB
Java
Executable File

package projectzombie.display;
import java.text.DecimalFormat;
import org.lwjgl.opengl.GL33;
import gl_engine.MathHelpers;
import gl_engine.matrix.Matrix4;
import gl_engine.vec.Vec2d;
import gl_engine.vec.Vec3d;
import projectzombie.Main;
import projectzombie.init.Models;
import projectzombie.inventory.Inventory;
import projectzombie.model.Model;
import projectzombie.model.ModelGui;
import projectzombie.text.Text;
import projectzombie.util.gl.GlHelpers;
import projectzombie.util.math.ItemStack;
import projectzombie.world.chunk.ChunkEventHandler;
import projectzombie.world.layer.Layer;
public class DisplayRenderUI
{
public static boolean showFPS = false;
public static boolean debug = false;
public static int guiScale = 2;
public static Matrix4 camera, projection;
private static float calculateGreen(double a) {
return (float)(-2 * a * (a - 1) + 0.25 * a * a);
}
public static void renderGameGui()
{
{
Matrix4 matrix = Matrix4.translate(-Models.UI_ITEM_SLOTS.getWidth() / 2, -9.5, 0);
Inventory inventory = Main.player.getInventory();
int slot = Main.player.inventory_hand;
double offset = Models.UI_ITEM_SLOTS.getWidth() / 10;
Matrix4 matrix_slot = Matrix4.multiply(matrix, Matrix4.translate(offset * slot, 0, 0));
Models.UI_ITEM_SLOTS.setModel(matrix);
Models.UI_ITEM_SLOTS.render();
Models.UI_ACTIVE_SLOT.setModel(matrix_slot);
Models.UI_ACTIVE_SLOT.render();
for(int i = 0; i < 10; i++)
{
ItemStack stack = inventory.getItem(i);
if(stack.isEmpty()) {
continue;
}
Model model_item = stack.item.getModel(stack).getGuiModel();
double item_offset = (Models.UI_ACTIVE_SLOT.getHeight() - model_item.getHeight()) / 2;
Matrix4 matrix_item = Matrix4.multiply(matrix, Matrix4.translate(i * offset + item_offset, item_offset, 0));
model_item.setModel(matrix_item);
model_item.render();
double damage = stack.item.getDamage(stack);
if(damage > 0)
{
Matrix4 matrix_damage = Matrix4.multiply(matrix_item, Matrix4.translate(0, -0.85 / 16, 0));
matrix_damage = Matrix4.multiply(Matrix4.scale(new Vec3d(damage * 0.85, 0.85 / 16, 0)), matrix_damage);
GL33.glUniform4f(Main.window.glsl_color,
1 - (float)MathHelpers.squared(1 - damage),
1 - (float)MathHelpers.squared(damage), 0, 1);
Models.UI_PIXEL_WHITE.setModel(matrix_damage);
Models.UI_PIXEL_WHITE.render();
GL33.glUniform4f(Main.window.glsl_color, 1, 1, 1, 1);
}
if(stack.count > 1)
{
Matrix4 matrix_text = Matrix4.multiply(matrix, Matrix4.translate(i * offset + 0.25, 0.28125, 0));
matrix_text = Matrix4.multiply(Matrix4.scale(new Vec3d(0.4, 0.4, 0.4)), matrix_text);
Text.render("" + stack.count, matrix_text);
}
}
}
{
ModelGui model_health_f = Models.UI_HEALTH_FG;
ModelGui model_health_b = Models.UI_HEALTH_BG;
ModelGui model_temperature = Models.UI_TEMPERATURE;
ModelGui model_water = Models.UI_WATER;
Matrix4 matrix;
{
double offset = -(79 * 15.0) / 160;
matrix = Matrix4.translate(offset, -9.5 + (1.5 * 17) / 16, 0);
model_health_b.setModel(matrix);
model_health_b.render();
GL33.glUniform1i(Main.window.glsl_do_discard_coords, 1);
GL33.glUniform4f(Main.window.glsl_discard_coords, -10, -10, (float)MathHelpers.map(
Main.player.getHealth(),
0, Main.player.maxHealth(),
offset, offset + model_health_f.getWidth()), 10);
model_health_f.setModel(matrix);
model_health_f.render();
}
double temperature = MathHelpers.smoothStep(Main.player.getTemperature());
double hydration = MathHelpers.smoothStep(1 - Main.player.getHydration());
{
Vec2d offset = new Vec2d((1 * 0.75) / 8, -9.5 + (1.5 * 17) / 16);
matrix = Matrix4.translate(offset.x, offset.y, 0);
GL33.glUniform1i(Main.window.glsl_do_discard_coords, 0);
GL33.glUniform4f(Main.window.glsl_color, 0.65f, 0.65f, 0.65f, 1);
model_water.setModel(matrix);
model_water.render();
GL33.glUniform1i(Main.window.glsl_do_discard_coords, 1);
GL33.glUniform4f(Main.window.glsl_discard_coords,
(float)offset.x, (float)offset.y,
(float)(offset.x + model_water.getWidth()),
(float)(offset.y + model_water.getHeight() * Main.player.getHydration()));
GL33.glUniform4f(Main.window.glsl_color,
(float)hydration * 0.75f, calculateGreen(hydration), 1 - (float)hydration, 1);
model_water.render();
GL33.glUniform1i(Main.window.glsl_do_discard_coords, 0);
}
{
GL33.glUniform4f(Main.window.glsl_color,
(float)temperature, calculateGreen(temperature), 1 - (float)temperature, 1);
matrix = Matrix4.translate(-(9 * 0.75) / 8, -9.5 + (1.5 * 17) / 16, 0);
model_temperature.setModel(matrix);
model_temperature.render();
}
GL33.glUniform4f(Main.window.glsl_color, 1, 1, 1, 1);
}
}
public static void render()
{
DecimalFormat dec = new DecimalFormat("0.####");
camera = Matrix4.identity();
projection = Matrix4.scale(new Vec3d(0.1/GlHelpers.getAspectRatio(), 0.1, 1));
GL33.glUniform3f(Main.window.glsl_day_low, 1, 1, 1);
GL33.glUniform3f(Main.window.glsl_day_high, 1, 1, 1);
GL33.glUniformMatrix4fv(Main.window.glsl_projection, true, projection.getArray());
GL33.glDisable(GL33.GL_DEPTH_TEST);
if(Main.menu.doGameRender && Main.menu.showIngameGUI && ChunkEventHandler.loaded) {
renderGameGui();
}
double aspect = (double)Main.window.getWidth() / (double)Main.window.getHeight();
Matrix4 matrix = Matrix4.scale(new Vec3d(0.35, 0.35, 0.35));
matrix = Matrix4.multiply(matrix, Matrix4.translate(-10 * aspect, 9.5, 0));
if(showFPS) {
float fps = DisplayStatsEventHandler.fps;
if(fps >= 120) {
GL33.glUniform4f(Main.window.glsl_color, 0, 1, 0, 1);
} else if(fps >= 60) {
GL33.glUniform4f(Main.window.glsl_color, 1, 1, 0, 1);
} else {
GL33.glUniform4f(Main.window.glsl_color, 1, 0, 0, 1);
}
Text.render("Fps: " + DisplayStatsEventHandler.fps, matrix);
matrix = Matrix4.multiply(matrix, Matrix4.translate(0, -0.7, 0));
}
if(debug) {
Layer layer = Main.world.getLayer();
Vec3d pos = Main.player.getPos();
GL33.glUniform4f(Main.window.glsl_color, 1, 1, 0, 1);
if(ChunkEventHandler.loaded)
{
Text.render("temperature: " + dec.format(
layer.layergen.getTemperatureStatic(layer, Main.player.getPos().xz())), matrix);
matrix = Matrix4.multiply(matrix, Matrix4.translate(0, -0.35, 0));
Text.render("humidity: " + dec.format(
layer.layergen.getHumidity(layer, Main.player.getPos().xz())), matrix);
matrix = Matrix4.multiply(matrix, Matrix4.translate(0, -0.7, 0));
Text.render("x: "+dec.format(pos.x), matrix);
matrix = Matrix4.multiply(matrix, Matrix4.translate(0, -0.35, 0));
Text.render("y: "+dec.format(pos.y), matrix);
matrix = Matrix4.multiply(matrix, Matrix4.translate(0, -0.35, 0));
Text.render("z: "+dec.format(pos.z), matrix);
matrix = Matrix4.multiply(matrix, Matrix4.translate(0, -0.7, 0));
}
}
GL33.glUniform4f(Main.window.glsl_color, 1, 1, 1, 1);
// Render the loaded menu
Main.menu.render();
}
}