aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/makamys/neodymium/renderer/NeoRenderer.java17
-rw-r--r--src/main/java/makamys/neodymium/util/Preprocessor.java49
-rw-r--r--src/main/resources/shaders/chunk.frag9
3 files changed, 69 insertions, 6 deletions
diff --git a/src/main/java/makamys/neodymium/renderer/NeoRenderer.java b/src/main/java/makamys/neodymium/renderer/NeoRenderer.java
index 172ddcd..d307c28 100644
--- a/src/main/java/makamys/neodymium/renderer/NeoRenderer.java
+++ b/src/main/java/makamys/neodymium/renderer/NeoRenderer.java
@@ -14,10 +14,12 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Queue;
+import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.lwjgl.BufferUtils;
@@ -30,6 +32,7 @@ import makamys.neodymium.Neodymium;
import makamys.neodymium.ducks.IWorldRenderer;
import makamys.neodymium.renderer.Mesh.GPUStatus;
import makamys.neodymium.util.GuiHelper;
+import makamys.neodymium.util.Preprocessor;
import makamys.neodymium.util.Util;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
@@ -464,12 +467,20 @@ public class NeoRenderer {
}
public void reloadShader() {
- boolean errors = false;
+ Set<String> defines = new HashSet<>();
+ if(Config.renderFog) {
+ defines.add("RENDER_FOG");
+ }
+ if(Config.simplifyChunkMeshes) {
+ defines.add("SIMPLIFY_MESHES");
+ }
+ boolean errors = false;
+
int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
- glShaderSource(vertexShader, Util.readFile("shaders/chunk.vert"));
+ glShaderSource(vertexShader, Preprocessor.preprocess(Util.readFile("shaders/chunk.vert"), defines));
glCompileShader(vertexShader);
if(glGetShaderi(vertexShader, GL_COMPILE_STATUS) == 0) {
@@ -480,7 +491,7 @@ public class NeoRenderer {
int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(fragmentShader, Util.readFile("shaders/chunk.frag"));
+ glShaderSource(fragmentShader, Preprocessor.preprocess(Util.readFile("shaders/chunk.frag"), defines));
glCompileShader(fragmentShader);
if(glGetShaderi(fragmentShader, GL_COMPILE_STATUS) == 0) {
diff --git a/src/main/java/makamys/neodymium/util/Preprocessor.java b/src/main/java/makamys/neodymium/util/Preprocessor.java
new file mode 100644
index 0000000..8ee9229
--- /dev/null
+++ b/src/main/java/makamys/neodymium/util/Preprocessor.java
@@ -0,0 +1,49 @@
+package makamys.neodymium.util;
+
+import java.util.Set;
+
+public class Preprocessor {
+
+ public static String preprocess(String text, Set<String> defines) {
+ String[] lines = text.replaceAll("\\r\\n", "\\n").split("\\n");
+
+ IfElseBlockStatus ifElseBlockStatus = IfElseBlockStatus.NONE;
+ boolean ifElseConditionMet = false;
+
+ for(int i = 0; i < lines.length; i++) {
+ String line = lines[i];
+
+ boolean commentLine = false;
+
+ if(line.startsWith("#ifdef ")) {
+ ifElseBlockStatus = IfElseBlockStatus.IF;
+ ifElseConditionMet = defines.contains(line.split(" ")[1]);
+ commentLine = true;
+ } else if(line.startsWith("#else")) {
+ ifElseBlockStatus = IfElseBlockStatus.ELSE;
+ commentLine = true;
+ } else if(line.startsWith("#endif")) {
+ ifElseBlockStatus = IfElseBlockStatus.NONE;
+ commentLine = true;
+ } else {
+ if(ifElseBlockStatus == IfElseBlockStatus.IF && !ifElseConditionMet) {
+ commentLine = true;
+ }
+ if(ifElseBlockStatus == IfElseBlockStatus.ELSE && ifElseConditionMet) {
+ commentLine = true;
+ }
+ }
+
+ if(commentLine) {
+ lines[i] = "//" + line;
+ }
+ }
+
+ return String.join("\n", lines);
+ }
+
+ public static enum IfElseBlockStatus {
+ NONE, IF, ELSE;
+ }
+
+}
diff --git a/src/main/resources/shaders/chunk.frag b/src/main/resources/shaders/chunk.frag
index 24cc97e..6cc1a07 100644
--- a/src/main/resources/shaders/chunk.frag
+++ b/src/main/resources/shaders/chunk.frag
@@ -18,12 +18,15 @@ uniform sampler2D lightTex;
void main()
{
vec2 goodTexCoord = TexCoord;
+
+#ifdef SIMPLIFY_MESHES
if(MQPos.x <= 254){
float wrappedU = mod(MQPos.x, 1.0);
float wrappedV = mod(MQPos.y, 1.0);
goodTexCoord = ProvokingTexCoord.xy + (((TexCoord.xy - ProvokingTexCoord.xy) / MQPos.zw) * vec2(wrappedU, wrappedV));
}
+#endif
vec4 texColor = texture(atlas, goodTexCoord);
@@ -33,9 +36,9 @@ void main()
vec4 rasterColor = ((texColor * colorMult) * lightyColor);
- if(FogFactor >= 0){
+#ifdef RENDER_FOG
FragColor = vec4(mix(FogColor.xyz, rasterColor.xyz, FogFactor), rasterColor.w);
- } else {
+#else
FragColor = rasterColor;
- }
+#endif
}