From 2946a7ec9e1860033cf96984d103b6d6b315c6e5 Mon Sep 17 00:00:00 2001 From: josua Date: Wed, 22 Jul 2020 11:07:47 +1000 Subject: [PATCH] Added shadow quality setting, updated the BDF to fix boolean --- .classpath | 2 +- src/projectzombie/display/DisplayRender.java | 71 ++++++++++++++----- src/projectzombie/display/DisplayWindow.java | 7 ++ .../entity/player/EntityPlayer.java | 2 +- src/projectzombie/menu/MenuSettings.java | 45 ++++++++++++ .../settings/SettingQuality.java | 2 +- src/projectzombie/settings/Settings.java | 62 +++++++++++++++- .../math/random/NoiseGeneratorSimplex.java | 17 +++-- .../layer/layergen/LayerGenBossArena.java | 2 +- .../world/layer/layergen/LayerGenCaves.java | 8 +-- .../world/layer/layergen/LayerGenEarth.java | 12 ++-- .../layer/layergen/LayerGenLavaCaves.java | 4 +- 12 files changed, 195 insertions(+), 39 deletions(-) diff --git a/.classpath b/.classpath index 344bafb..61eec66 100755 --- a/.classpath +++ b/.classpath @@ -41,6 +41,6 @@ - + diff --git a/src/projectzombie/display/DisplayRender.java b/src/projectzombie/display/DisplayRender.java index 78e2c48..d42d701 100755 --- a/src/projectzombie/display/DisplayRender.java +++ b/src/projectzombie/display/DisplayRender.java @@ -15,6 +15,7 @@ import gl_engine.vec.Vec3d; import projectzombie.Main; import projectzombie.entity.player.EntityPlayer; import projectzombie.model.Model; +import projectzombie.settings.SettingQuality; import projectzombie.util.math.ColorRange; import projectzombie.world.chunk.Chunk; import projectzombie.world.chunk.ChunkEventHandler; @@ -24,7 +25,58 @@ public class DisplayRender { public static int shadow_fbo; public static int shadow_depth; - public static int shadow_size = 2048; + public static int shadow_size; + private static SettingQuality shadow_quality; + + public static SettingQuality setShadowQuality(SettingQuality quality) + { + int size; + + switch(quality) + { + case LOWEST: + size = 1024; + break; + case LOW: + size = 2048; + break; + case MEDIUM: + size = 4096; + break; + case HIGH: + size = 8192; + break; + case EXTREME: + size = 16384; + break; + default: + size = 2048; + quality = SettingQuality.LOW; + break; + } + + if(Main.window != null && size > Main.window.texture_max_size) { + quality = SettingQuality.LOWEST; + size = 1024; + } + + shadow_size = size; + shadow_quality = quality; + + return quality; + } + + public static SettingQuality getShadowQuality() { + return shadow_quality; + } + + public static void updateShadowQuality() + { + GL33.glBindFramebuffer(GL33.GL_FRAMEBUFFER, shadow_fbo); + GL33.glDeleteTextures(shadow_depth); + + shadow_depth = generateDepthTexture(shadow_size, shadow_size); + } private static int generateDepthTexture(int width, int height) { @@ -46,23 +98,6 @@ public class DisplayRender return depth; } - private static int generateColorTexture(int width, int height) - { - int color = GL33.glGenTextures(); - - GL33.glBindTexture(GL33.GL_TEXTURE_2D, color); - - GL33.glTexImage2D( - GL33.GL_TEXTURE_2D, 0, GL33.GL_RGB, width, height, - 0, GL33.GL_RGB, GL33.GL_FLOAT, (ByteBuffer) null); - - GL33.glTexParameteri(GL33.GL_TEXTURE_2D, GL33.GL_TEXTURE_MIN_FILTER, GL33.GL_LINEAR); - GL33.glTexParameteri(GL33.GL_TEXTURE_2D, GL33.GL_TEXTURE_MAG_FILTER, GL33.GL_LINEAR); - GL33.glFramebufferTexture(GL33.GL_FRAMEBUFFER, GL33.GL_COLOR_ATTACHMENT0, color, 0); - - return color; - } - public static void init() { shadow_fbo = GL33.glGenFramebuffers(); diff --git a/src/projectzombie/display/DisplayWindow.java b/src/projectzombie/display/DisplayWindow.java index 918470f..c8dd1c5 100755 --- a/src/projectzombie/display/DisplayWindow.java +++ b/src/projectzombie/display/DisplayWindow.java @@ -32,6 +32,7 @@ public class DisplayWindow implements IMainloopTask private int height; private boolean fullscreen = true; private boolean mouseVisibility_last = false; + public int texture_max_size; public static int fps = 0; @@ -182,6 +183,12 @@ public class DisplayWindow implements IMainloopTask glVertexAttribPointer(0, 2, GL_FLOAT, false, Float.BYTES * 2, 0); glEnableVertexAttribArray(0); + int[] ptr = new int[1]; + GL33.glGetIntegerv(GL33.GL_MAX_TEXTURE_SIZE, ptr); + + texture_max_size = ptr[0]; + System.out.println("Max texture size: " + texture_max_size); + DisplayRender.init(); } diff --git a/src/projectzombie/entity/player/EntityPlayer.java b/src/projectzombie/entity/player/EntityPlayer.java index d726648..e7f3ee5 100755 --- a/src/projectzombie/entity/player/EntityPlayer.java +++ b/src/projectzombie/entity/player/EntityPlayer.java @@ -291,7 +291,7 @@ public class EntityPlayer extends Entity implements if(break_progress > ts.tile.hardness) { - ItemStack[] stacks = ts.tile.getTileDrops(tile_front); + ItemStack[] stacks = ts.tile.getTileDrops(ts); for(ItemStack stack : stacks) { layer.spawnEntity(new EntityItem( diff --git a/src/projectzombie/menu/MenuSettings.java b/src/projectzombie/menu/MenuSettings.java index 5bcd08e..dccfbd5 100755 --- a/src/projectzombie/menu/MenuSettings.java +++ b/src/projectzombie/menu/MenuSettings.java @@ -2,6 +2,7 @@ package projectzombie.menu; import gl_engine.vec.Vec2d; import projectzombie.Main; +import projectzombie.display.DisplayRender; import projectzombie.display.DisplayRenderUI; import projectzombie.entity.EntityParticle; import projectzombie.input.types.InputGUI; @@ -14,6 +15,7 @@ import projectzombie.menu.gui.components.ButtonBasic; import projectzombie.menu.gui.components.ButtonSetting; import projectzombie.menu.gui.components.GUIBackToMenu; import projectzombie.menu.gui.components.OverlayBackground; +import projectzombie.settings.SettingQuality; import projectzombie.settings.Settings; import projectzombie.world.chunk.Chunk; @@ -22,6 +24,18 @@ public class MenuSettings extends Menu private GUI gui; private Menu menuOld; + public static String render(SettingQuality setting) { + switch(setting) + { + case HIGH: return "High"; + case MEDIUM: return "Medium"; + case LOW: return "Low"; + case EXTREME: return "Extreme"; + case LOWEST: return "Lowest"; + default: return "Unknown"; + } + } + public MenuSettings(Menu menuOld) { this.menuOld = menuOld; @@ -57,6 +71,37 @@ public class MenuSettings extends Menu Settings.update(); })); + group.add(new ButtonSetting("Shadows: " + render(DisplayRender.getShadowQuality()), button -> + { + SettingQuality quality = DisplayRender.getShadowQuality(); + + switch(quality) + { + case LOWEST: + quality = SettingQuality.LOW; + break; + case LOW: + quality = SettingQuality.MEDIUM; + break; + case MEDIUM: + quality = SettingQuality.HIGH; + break; + case HIGH: + quality = SettingQuality.EXTREME; + break; + case EXTREME: + quality = SettingQuality.LOWEST; + break; + } + + quality = DisplayRender.setShadowQuality(quality); + + DisplayRender.updateShadowQuality(); + Settings.update(); + + button.setText("Shadows: " + render(quality)); + })); + /*group.add(new ButtonSetting("Dynamic Lighting: " + (LightingManager.lightingMode == 0 ? "Fast" : "Fancy"), button -> { diff --git a/src/projectzombie/settings/SettingQuality.java b/src/projectzombie/settings/SettingQuality.java index 2a112c9..cce7c04 100755 --- a/src/projectzombie/settings/SettingQuality.java +++ b/src/projectzombie/settings/SettingQuality.java @@ -1,5 +1,5 @@ package projectzombie.settings; public enum SettingQuality { - OFF, FAST, FANCY + LOWEST, LOW, MEDIUM, HIGH, EXTREME } diff --git a/src/projectzombie/settings/Settings.java b/src/projectzombie/settings/Settings.java index 79f5b65..06682d3 100755 --- a/src/projectzombie/settings/Settings.java +++ b/src/projectzombie/settings/Settings.java @@ -6,6 +6,7 @@ import bdf.file.BdfFileManager; import bdf.types.BdfNamedList; import bdf.types.BdfObject; import bdf.types.BdfTypes; +import projectzombie.display.DisplayRender; import projectzombie.display.DisplayRenderUI; import projectzombie.entity.EntityParticle; import projectzombie.world.chunk.Chunk; @@ -36,14 +37,73 @@ public class Settings implements IBdfClassManager } else { DisplayRenderUI.debug = false; } + + if(nl.get("shadow_size").getType() == BdfTypes.INTEGER) + { + SettingQuality quality = DisplayRender.getShadowQuality(); + + switch(nl.get("shadow_size").getInteger()) + { + case 0: + quality = SettingQuality.LOWEST; + break; + case 1: + quality = SettingQuality.LOW; + break; + case 2: + quality = SettingQuality.MEDIUM; + break; + case 3: + quality = SettingQuality.HIGH; + break; + case 4: + quality = SettingQuality.EXTREME; + break; + default: + quality = SettingQuality.LOW; + break; + } + + DisplayRender.setShadowQuality(quality); + } + + else { + DisplayRender.setShadowQuality(SettingQuality.LOW); + } } @Override - public void BdfClassSave(BdfObject bdf) { + public void BdfClassSave(BdfObject bdf) + { + int shadow_size; + + switch(DisplayRender.getShadowQuality()) + { + case LOWEST: + shadow_size = 0; + break; + case LOW: + shadow_size = 1; + break; + case MEDIUM: + shadow_size = 2; + break; + case HIGH: + shadow_size = 3; + break; + case EXTREME: + shadow_size = 4; + break; + default: + shadow_size = 1; + break; + } + BdfNamedList nl = bdf.getNamedList(); nl.set("render_distance", BdfObject.withInteger(Chunk.RENDER_DISTANCE)); nl.set("show_fps", BdfObject.withBoolean(DisplayRenderUI.showFPS)); nl.set("debug", BdfObject.withBoolean(DisplayRenderUI.debug)); + nl.set("shadow_size", BdfObject.withInteger(shadow_size)); } public static void init() { diff --git a/src/projectzombie/util/math/random/NoiseGeneratorSimplex.java b/src/projectzombie/util/math/random/NoiseGeneratorSimplex.java index 1fcd798..30ec9f2 100644 --- a/src/projectzombie/util/math/random/NoiseGeneratorSimplex.java +++ b/src/projectzombie/util/math/random/NoiseGeneratorSimplex.java @@ -1,20 +1,29 @@ package projectzombie.util.math.random; +import java.util.Random; + +import gl_engine.MathHelpers; + public class NoiseGeneratorSimplex implements NoiseGenerator { private OpenSimplexNoise simplex; + private double off_x, off_y, off_z; - public NoiseGeneratorSimplex(long seed) { - simplex = new OpenSimplexNoise(seed); + public NoiseGeneratorSimplex(Random rand) + { + simplex = new OpenSimplexNoise(rand.nextLong()); + off_x = MathHelpers.map(rand.nextDouble(), 0, 1, -1024, 1024); + off_y = MathHelpers.map(rand.nextDouble(), 0, 1, -1024, 1024); + off_z = MathHelpers.map(rand.nextDouble(), 0, 1, -1024, 1024); } @Override public double eval(double x, double y) { - return simplex.eval(x, y); + return simplex.eval(x + off_x, y + off_y); } @Override public double eval(double x, double y, double z) { - return simplex.eval(x, y, z); + return simplex.eval(x + off_x, y + off_y, z + off_z); } } diff --git a/src/projectzombie/world/layer/layergen/LayerGenBossArena.java b/src/projectzombie/world/layer/layergen/LayerGenBossArena.java index e3c83e2..7da37f0 100755 --- a/src/projectzombie/world/layer/layergen/LayerGenBossArena.java +++ b/src/projectzombie/world/layer/layergen/LayerGenBossArena.java @@ -29,7 +29,7 @@ public class LayerGenBossArena extends LayerGen implements LayerGenRememberPlaye super.init(layer); layer.noise_gens = new NoiseGenerator[] { - new NoiseGeneratorSimplex(rand.nextLong()), + new NoiseGeneratorSimplex(rand), }; } diff --git a/src/projectzombie/world/layer/layergen/LayerGenCaves.java b/src/projectzombie/world/layer/layergen/LayerGenCaves.java index cccd62a..5165308 100755 --- a/src/projectzombie/world/layer/layergen/LayerGenCaves.java +++ b/src/projectzombie/world/layer/layergen/LayerGenCaves.java @@ -53,10 +53,10 @@ public class LayerGenCaves extends LayerGen Random lrand = new Random(layer.lseed); layer.noise_gens = new NoiseGenerator[] { - new NoiseGeneratorSimplex(rand.nextLong()), // Temperature - new NoiseGeneratorSimplex(rand.nextLong()), // Humidity - new NoiseGeneratorSimplex(lrand.nextLong()), // Cave structure - new NoiseGeneratorSimplex(lrand.nextLong()), // Caverns + new NoiseGeneratorSimplex(rand), // Temperature + new NoiseGeneratorSimplex(rand), // Humidity + new NoiseGeneratorSimplex(lrand), // Cave structure + new NoiseGeneratorSimplex(lrand), // Caverns }; } diff --git a/src/projectzombie/world/layer/layergen/LayerGenEarth.java b/src/projectzombie/world/layer/layergen/LayerGenEarth.java index 78a2ff2..9fff91f 100755 --- a/src/projectzombie/world/layer/layergen/LayerGenEarth.java +++ b/src/projectzombie/world/layer/layergen/LayerGenEarth.java @@ -68,13 +68,13 @@ public class LayerGenEarth extends LayerGen layer.noise_gens = new NoiseGenerator[] { - new NoiseGeneratorSimplex(rand.nextLong()), // Temperature - new NoiseGeneratorSimplex(rand.nextLong()), // Humidity + new NoiseGeneratorSimplex(rand), // Temperature + new NoiseGeneratorSimplex(rand), // Humidity - new NoiseGeneratorSimplex(lrand.nextLong()), // Wind - new NoiseGeneratorSimplex(lrand.nextLong()), // Wind - new NoiseGeneratorSimplex(lrand.nextLong()), // Water - new NoiseGeneratorSimplex(lrand.nextLong()), // Rocks + new NoiseGeneratorSimplex(lrand), // Wind + new NoiseGeneratorSimplex(lrand), // Wind + new NoiseGeneratorSimplex(lrand), // Water + new NoiseGeneratorSimplex(lrand), // Rocks }; } diff --git a/src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java b/src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java index 52c6d3f..5e3374b 100755 --- a/src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java +++ b/src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java @@ -28,8 +28,8 @@ public class LayerGenLavaCaves extends LayerGen Random rand = new Random(layer.lseed); layer.noise_gens = new NoiseGenerator[] { - new NoiseGeneratorSimplex(rand.nextLong()), - new NoiseGeneratorSimplex(rand.nextLong()), + new NoiseGeneratorSimplex(rand), + new NoiseGeneratorSimplex(rand), }; }