> result = ProgramSpec.CODEC.decode(JsonOps.INSTANCE, GSON.fromJson(s, JsonElement.class));
-
- ProgramSpec spec = result.get()
- .orThrow()
- .getFirst();
-
- spec.setName(specName);
-
- if (programs.containsKey(specName)) {
- throw new IllegalStateException("Program spec '" + specName + "' already registered.");
- }
- programs.put(specName, spec);
-
- } catch (Exception e) {
- Backend.LOGGER.error("Could not load program " + location, e);
- }
- }
- }
-
}
diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/shader/GlShader.java b/src/main/java/com/jozufozu/flywheel/backend/gl/shader/GlShader.java
index de6a7f22f..b1b4dd71c 100644
--- a/src/main/java/com/jozufozu/flywheel/backend/gl/shader/GlShader.java
+++ b/src/main/java/com/jozufozu/flywheel/backend/gl/shader/GlShader.java
@@ -21,10 +21,20 @@ public class GlShader extends GlObject {
GlCompat.safeShaderSource(handle, source);
GL20.glCompileShader(handle);
+// File dir = new File(Minecraft.getInstance().gameDirectory, "flywheel_sources");
+// dir.mkdirs();
+// File file = new File(dir, name.toString().replaceAll("[:/]", "_"));
+// try (FileWriter writer = new FileWriter(file)) {
+// writer.write(source);
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+
// String log = GL20.glGetShaderInfoLog(handle);
//
// if (!log.isEmpty()) {
-// env.printShaderInfoLog(source, log, this.name);
+// System.out.println(log);
+//// env.printShaderInfoLog(source, log, this.name);
// }
if (GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS) != GL20.GL_TRUE) {
diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstance.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstance.java
index 85390c42e..bc24cb221 100644
--- a/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstance.java
+++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/blockentity/BlockEntityInstance.java
@@ -5,7 +5,7 @@ import com.jozufozu.flywheel.api.MaterialManager;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
import com.jozufozu.flywheel.api.instance.TickableInstance;
import com.jozufozu.flywheel.backend.instancing.AbstractInstance;
-import com.jozufozu.flywheel.core.Materials;
+import com.jozufozu.flywheel.core.materials.Materials;
import com.jozufozu.flywheel.core.materials.model.ModelData;
import com.jozufozu.flywheel.core.materials.oriented.OrientedData;
import com.jozufozu.flywheel.util.box.GridAlignedBB;
diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java
index 5bcfa88ab..97c4e7aab 100644
--- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java
+++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancingEngine.java
@@ -14,13 +14,14 @@ import com.jozufozu.flywheel.api.struct.StructType;
import com.jozufozu.flywheel.backend.instancing.Engine;
import com.jozufozu.flywheel.backend.instancing.TaskEngine;
import com.jozufozu.flywheel.backend.model.MeshPool;
-import com.jozufozu.flywheel.core.Formats;
-import com.jozufozu.flywheel.core.RenderContext;
import com.jozufozu.flywheel.core.CoreShaderInfoMap;
import com.jozufozu.flywheel.core.CoreShaderInfoMap.CoreShaderInfo;
+import com.jozufozu.flywheel.core.GameStateRegistry;
+import com.jozufozu.flywheel.core.RenderContext;
import com.jozufozu.flywheel.core.compile.ProgramCompiler;
import com.jozufozu.flywheel.core.compile.ProgramContext;
import com.jozufozu.flywheel.core.shader.WorldProgram;
+import com.jozufozu.flywheel.core.vertex.Formats;
import com.jozufozu.flywheel.util.Textures;
import com.jozufozu.flywheel.util.WeakHashSet;
import com.mojang.blaze3d.systems.RenderSystem;
@@ -32,7 +33,6 @@ import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.ShaderInstance;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Vec3i;
-import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
public class InstancingEngine implements Engine {
@@ -118,7 +118,7 @@ public class InstancingEngine
implements Engine {
if (!toRender.isEmpty()) {
Instanced extends InstanceData> instanceType = entry.getKey();
- setup(instanceType.getProgramSpec(), coreShaderInfo, camX, camY, camZ, viewProjection, level);
+ setup(instanceType, coreShaderInfo, camX, camY, camZ, viewProjection, level);
instanceCount += material.getInstanceCount();
vertexCount += material.getVertexCount();
@@ -145,7 +145,7 @@ public class InstancingEngine
implements Engine {
return coreShaderInfo;
}
- protected P setup(ResourceLocation programSpec, CoreShaderInfo coreShaderInfo, double camX, double camY, double camZ, Matrix4f viewProjection, ClientLevel level) {
+ protected P setup(Instanced> instanceType, CoreShaderInfo coreShaderInfo, double camX, double camY, double camZ, Matrix4f viewProjection, ClientLevel level) {
float alphaDiscard = coreShaderInfo.alphaDiscard();
if (alphaDiscard == 0) {
alphaDiscard = 0.0001f;
@@ -153,7 +153,7 @@ public class InstancingEngine
implements Engine {
alphaDiscard = 0;
}
- P program = context.getProgram(ProgramContext.create(programSpec, Formats.POS_TEX_NORMAL, alphaDiscard, coreShaderInfo.fogType()));
+ P program = context.getProgram(new ProgramContext(Formats.POS_TEX_NORMAL, instanceType.getInstanceShader(), alphaDiscard, coreShaderInfo.fogType(), GameStateRegistry.takeSnapshot()));
program.bind();
program.uploadUniforms(camX, camY, camZ, viewProjection, level);
diff --git a/src/main/java/com/jozufozu/flywheel/core/Contexts.java b/src/main/java/com/jozufozu/flywheel/core/Contexts.java
index 215d6a108..01f568755 100644
--- a/src/main/java/com/jozufozu/flywheel/core/Contexts.java
+++ b/src/main/java/com/jozufozu/flywheel/core/Contexts.java
@@ -20,11 +20,13 @@ public class Contexts {
public static void flwInit(GatherContextEvent event) {
GameStateRegistry.register(NormalDebugStateProvider.INSTANCE);
- FileResolution worldBuiltins = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.WORLD, ".glsl"));
- FileResolution crumblingBuiltins = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.CRUMBLING, ".glsl"));
+ FileResolution worldVertex = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.WORLD, ".vert"));
+ FileResolution worldFragment = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.WORLD, ".frag"));
+ FileResolution crumblingVertex = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.CRUMBLING, ".vert"));
+ FileResolution crumblingFragment = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.CRUMBLING, ".frag"));
- WORLD = ProgramCompiler.create(Templates.INSTANCING, WorldProgram::new, worldBuiltins);
- CRUMBLING = ProgramCompiler.create(Templates.INSTANCING, CrumblingProgram::new, crumblingBuiltins);
+ WORLD = ProgramCompiler.create(WorldProgram::new, Templates.INSTANCING, Templates.FRAGMENT, worldVertex, worldFragment);
+ CRUMBLING = ProgramCompiler.create(CrumblingProgram::new, Templates.INSTANCING, Templates.FRAGMENT, crumblingVertex, crumblingFragment);
}
public static class Names {
diff --git a/src/main/java/com/jozufozu/flywheel/core/Programs.java b/src/main/java/com/jozufozu/flywheel/core/Programs.java
deleted file mode 100644
index 8a00ca79b..000000000
--- a/src/main/java/com/jozufozu/flywheel/core/Programs.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.jozufozu.flywheel.core;
-
-import com.jozufozu.flywheel.Flywheel;
-
-import net.minecraft.resources.ResourceLocation;
-
-public class Programs {
- public static final ResourceLocation TRANSFORMED = Flywheel.rl("model");
- public static final ResourceLocation ORIENTED = Flywheel.rl("oriented");
-}
diff --git a/src/main/java/com/jozufozu/flywheel/core/compile/CompileUtil.java b/src/main/java/com/jozufozu/flywheel/core/compile/CompileUtil.java
index ca312e347..b97152197 100644
--- a/src/main/java/com/jozufozu/flywheel/core/compile/CompileUtil.java
+++ b/src/main/java/com/jozufozu/flywheel/core/compile/CompileUtil.java
@@ -12,12 +12,11 @@ public class CompileUtil {
public static final Pattern matType = Pattern.compile("^mat([234])(?:x([234]))?$");
protected static String generateHeader(GLSLVersion version, ShaderType type) {
- return "#version "
- + version
- + '\n'
+ return "#version " + version + '\n'
+ "#extension GL_ARB_explicit_attrib_location : enable\n"
+ "#extension GL_ARB_conservative_depth : enable\n"
- + type.getDefineStatement();
+ + type.getDefineStatement()
+ + '\n';
}
public static int getElementCount(String type) {
diff --git a/src/main/java/com/jozufozu/flywheel/core/compile/FragmentCompiler.java b/src/main/java/com/jozufozu/flywheel/core/compile/FragmentCompiler.java
index 6dccf21da..925da17d5 100644
--- a/src/main/java/com/jozufozu/flywheel/core/compile/FragmentCompiler.java
+++ b/src/main/java/com/jozufozu/flywheel/core/compile/FragmentCompiler.java
@@ -9,15 +9,14 @@ import com.jozufozu.flywheel.core.shader.ShaderConstants;
import com.jozufozu.flywheel.core.shader.StateSnapshot;
import com.jozufozu.flywheel.core.source.FileIndexImpl;
import com.jozufozu.flywheel.core.source.FileResolution;
-import com.jozufozu.flywheel.core.source.SourceFile;
public class FragmentCompiler extends Memoizer {
private final Template extends FragmentData> template;
- private final FileResolution header;
+ private final FileResolution contextShader;
- public FragmentCompiler(Template extends FragmentData> template, FileResolution header) {
- this.header = header;
+ public FragmentCompiler(Template extends FragmentData> template, FileResolution contextShader) {
this.template = template;
+ this.contextShader = contextShader;
}
@Override
@@ -27,16 +26,16 @@ public class FragmentCompiler extends Memoizer maybeFragmentMain = file.findFunction("fragment");
+ Optional maybeContextFragment = file.findFunction("flw_contextFragment");
- if (maybeFragmentMain.isEmpty()) {
- ErrorReporter.generateMissingFunction(file, "fragment", "\"fragment\" function not defined");
- throw new RuntimeException();
+ if (maybeContextFragment.isEmpty()) {
+ ErrorReporter.generateMissingFunction(file, "flw_contextFragment", "\"flw_contextFragment\" function not defined");
+ throw new ShaderLoadingException();
}
- fragmentMain = maybeFragmentMain.get();
- ImmutableList fragmentParameters = fragmentMain.getParameters();
+ contextFragment = maybeContextFragment.get();
+ ImmutableList params = contextFragment.getParameters();
- if (fragmentParameters.size() != 1) {
- ErrorReporter.generateSpanError(fragmentMain.getArgs(), "fragment function must have exactly one argument");
- throw new RuntimeException();
+ if (params.size() != 0) {
+ ErrorReporter.generateSpanError(contextFragment.getArgs(), "\"flw_contextFragment\" function must not have any arguments");
+ throw new ShaderLoadingException();
}
-
- interpolantName = fragmentMain.getParameters().get(0).type;
-
- Optional maybeInterpolant = file.findStruct(interpolantName);
-
- if (maybeInterpolant.isEmpty()) {
- ErrorReporter.generateMissingStruct(file, interpolantName, "struct not defined");
-
- throw new RuntimeException();
- }
-
- interpolant = maybeInterpolant.get();
}
@Override
public String generateFooter() {
StringBuilder builder = new StringBuilder();
- prefixFields(builder, interpolant, "in", "v2f_");
- builder.append(String.format("""
+ builder.append("""
void main() {
- Fragment o;
- o.color = v2f_color;
- o.texCoords = v2f_texCoords;
- o.light = v2f_light;
- o.diffuse = v2f_diffuse;
-
- vec4 color = %s;
- FLWFinalizeColor(color);
+ flw_contextFragment();
}
- """,
- fragmentMain.call("o")
- ));
+ """
+ );
return builder.toString();
}
-
- public static void prefixFields(StringBuilder builder, ShaderStruct struct, String qualifier, String prefix) {
- ImmutableList fields = struct.getFields();
-
- for (StructField field : fields) {
- builder.append(qualifier)
- .append(' ')
- .append(field.type)
- .append(' ')
- .append(prefix)
- .append(field.name)
- .append(";\n");
- }
- }
}
diff --git a/src/main/java/com/jozufozu/flywheel/core/compile/InstancingTemplateData.java b/src/main/java/com/jozufozu/flywheel/core/compile/InstancingTemplateData.java
index 88a4be1f4..64c47caf5 100644
--- a/src/main/java/com/jozufozu/flywheel/core/compile/InstancingTemplateData.java
+++ b/src/main/java/com/jozufozu/flywheel/core/compile/InstancingTemplateData.java
@@ -15,45 +15,30 @@ import com.jozufozu.flywheel.core.source.parse.Variable;
import com.jozufozu.flywheel.core.source.span.Span;
public class InstancingTemplateData implements VertexData {
-
public final SourceFile file;
- public final ShaderFunction vertexMain;
- public final Span vertexName;
+ public final ShaderFunction instanceVertex;
public final Span instanceName;
public final ShaderStruct instance;
public InstancingTemplateData(SourceFile file) {
this.file = file;
- Optional vertexFunc = file.findFunction("vertex");
+ Optional maybeInstanceVertex = file.findFunction("flw_instanceVertex");
- if (vertexFunc.isEmpty()) {
- ErrorReporter.generateFileError(file, "could not find \"vertex\" function");
+ if (maybeInstanceVertex.isEmpty()) {
+ ErrorReporter.generateMissingFunction(file, "flw_instanceVertex", "\"flw_instanceVertex\" function not defined");
throw new ShaderLoadingException();
}
- vertexMain = vertexFunc.get();
- ImmutableList vertexParams = vertexMain.getParameters();
+ instanceVertex = maybeInstanceVertex.get();
+ ImmutableList params = instanceVertex.getParameters();
- if (vertexParams.size() != 2) {
- ErrorReporter.generateSpanError(vertexMain.getArgs(), "instancing requires vertex function to have 2 arguments");
+ if (params.size() != 1) {
+ ErrorReporter.generateSpanError(instanceVertex.getArgs(), "\"flw_contextFragment\" function must have exactly 1 argument");
throw new ShaderLoadingException();
}
- Variable vertexParam = vertexParams.get(0);
- vertexName = vertexParam.type;
-
- boolean namedVertex = vertexParam.type
- .toString()
- .equals("Vertex");
-
- if (!(namedVertex && vertexParam.qualifier == Variable.Qualifier.INOUT)) {
- ErrorReporter.generateSpanError(vertexParam.qualifierSpan, "first parameter must be inout Vertex");
- throw new ShaderLoadingException();
- }
-
- instanceName = vertexParams.get(1).type;
-
+ instanceName = params.get(0).type;
Optional maybeInstance = file.findStruct(instanceName);
if (maybeInstance.isEmpty()) {
@@ -80,36 +65,26 @@ public class InstancingTemplateData implements VertexData {
.append(' ')
.append(field.type)
.append(' ')
- .append("a_i_")
+ .append("_flw_a_i_")
.append(field.name)
.append(";\n");
attributeBinding += CompileUtil.getAttributeCount(field.type);
}
+ template.append('\n');
+
template.append(String.format("""
- out vec4 v2f_color;
- out vec2 v2f_texCoords;
- out vec2 v2f_light;
- out float v2f_diffuse;
-
void main() {
- Vertex v = FLWCreateVertex();
- %s i;
- %s
- vertex(v, i);
- gl_Position = FLWVertex(v);
- v.normal = normalize(v.normal);
+ flw_layoutVertex();
- v2f_color = v.color;
- v2f_texCoords = v.texCoords;
- v2f_light = v.light;
- v2f_diffuse = FLWDiffuse(v.normal);
- #if defined(DEBUG_NORMAL)
- v2f_color = vec4(v.normal, 1.);
- #endif
+ %s instance;
+ %s
+ flw_instanceVertex(instance);
+
+ flw_contextVertex();
}
""",
instanceName,
- assignFields(instance, "i.", "a_i_")
+ assignFields(instance, "instance.", "_flw_a_i_")
));
return template.toString();
diff --git a/src/main/java/com/jozufozu/flywheel/core/compile/ProgramCompiler.java b/src/main/java/com/jozufozu/flywheel/core/compile/ProgramCompiler.java
index 7baaa7ac5..f031d26cc 100644
--- a/src/main/java/com/jozufozu/flywheel/core/compile/ProgramCompiler.java
+++ b/src/main/java/com/jozufozu/flywheel/core/compile/ProgramCompiler.java
@@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.List;
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
-import com.jozufozu.flywheel.core.Templates;
import com.jozufozu.flywheel.core.source.FileResolution;
import com.jozufozu.flywheel.event.ReloadRenderersEvent;
@@ -33,15 +32,17 @@ public class ProgramCompiler extends Memoizer The type of program to compile.
* @return A program compiler.
*/
- public static ProgramCompiler create(Template template, GlProgram.Factory factory, FileResolution header) {
- return new ProgramCompiler<>(factory, new VertexCompiler(template, header), new FragmentCompiler(Templates.FRAGMENT, header));
+ public static ProgramCompiler create(GlProgram.Factory
factory, Template vertexTemplate, Template fragmentTemplate, FileResolution vertexContextShader, FileResolution fragmentContextShader) {
+ return new ProgramCompiler<>(factory, new VertexCompiler(vertexTemplate, vertexContextShader), new FragmentCompiler(fragmentTemplate, fragmentContextShader));
}
/**
@@ -63,9 +64,9 @@ public class ProgramCompiler extends Memoizer {
public static class Context {
/**
- * The file to compile.
+ * The vertex type to use.
*/
- private final SourceFile file;
+ private final VertexType vertexType;
+
+ /**
+ * The instance shader source.
+ */
+ private final SourceFile instanceShader;
/**
* The shader constants to apply.
*/
private final StateSnapshot ctx;
- /**
- * The vertex type to use.
- */
- private final VertexType vertexType;
-
- public Context(SourceFile file, StateSnapshot ctx, VertexType vertexType) {
- this.file = file;
- this.ctx = ctx;
+ public Context(VertexType vertexType, SourceFile instanceShader, StateSnapshot ctx) {
this.vertexType = vertexType;
+ this.instanceShader = instanceShader;
+ this.ctx = ctx;
}
@Override
@@ -82,12 +75,12 @@ public class VertexCompiler extends Memoizer {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
var that = (Context) o;
- return file == that.file && vertexType == that.vertexType && ctx.equals(that.ctx);
+ return vertexType == that.vertexType && instanceShader == that.instanceShader && ctx.equals(that.ctx);
}
@Override
public int hashCode() {
- return Objects.hash(file, ctx, vertexType);
+ return Objects.hash(vertexType, instanceShader, ctx);
}
}
}
diff --git a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java
index e8907738f..9a36b2eee 100644
--- a/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java
+++ b/src/main/java/com/jozufozu/flywheel/core/crumbling/CrumblingRenderer.java
@@ -14,8 +14,8 @@ import com.jozufozu.flywheel.backend.instancing.SerialTaskEngine;
import com.jozufozu.flywheel.backend.instancing.instancing.InstancedMaterial;
import com.jozufozu.flywheel.backend.instancing.instancing.InstancingEngine;
import com.jozufozu.flywheel.core.Contexts;
-import com.jozufozu.flywheel.core.RenderContext;
import com.jozufozu.flywheel.core.CoreShaderInfoMap.CoreShaderInfo;
+import com.jozufozu.flywheel.core.RenderContext;
import com.jozufozu.flywheel.event.ReloadRenderersEvent;
import com.jozufozu.flywheel.mixin.LevelRendererAccessor;
import com.jozufozu.flywheel.util.Lazy;
@@ -191,7 +191,7 @@ public class CrumblingRenderer {
CoreShaderInfo coreShaderInfo = getCoreShaderInfo();
for (Map.Entry, InstancedMaterial>> entry : materials.entrySet()) {
- CrumblingProgram program = setup(entry.getKey().getProgramSpec(), coreShaderInfo, camX, camY, camZ, viewProjection, level);
+ CrumblingProgram program = setup(entry.getKey(), coreShaderInfo, camX, camY, camZ, viewProjection, level);
program.setAtlasSize(width, height);
diff --git a/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java b/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java
index c2ac1bec3..a30b26547 100644
--- a/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java
+++ b/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java
@@ -3,8 +3,8 @@ package com.jozufozu.flywheel.core.hardcoded;
import java.util.List;
import com.jozufozu.flywheel.api.vertex.VertexList;
-import com.jozufozu.flywheel.core.Formats;
import com.jozufozu.flywheel.core.model.Mesh;
+import com.jozufozu.flywheel.core.vertex.Formats;
import com.jozufozu.flywheel.core.vertex.PosTexNormalVertex;
import com.jozufozu.flywheel.core.vertex.PosTexNormalWriterUnsafe;
import com.mojang.blaze3d.platform.MemoryTracker;
diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/InstanceShaders.java b/src/main/java/com/jozufozu/flywheel/core/materials/InstanceShaders.java
new file mode 100644
index 000000000..8cc97b31c
--- /dev/null
+++ b/src/main/java/com/jozufozu/flywheel/core/materials/InstanceShaders.java
@@ -0,0 +1,24 @@
+package com.jozufozu.flywheel.core.materials;
+
+import com.jozufozu.flywheel.Flywheel;
+import com.jozufozu.flywheel.core.source.FileResolution;
+import com.jozufozu.flywheel.core.source.Resolver;
+import com.jozufozu.flywheel.event.GatherContextEvent;
+import com.jozufozu.flywheel.util.ResourceUtil;
+
+import net.minecraft.resources.ResourceLocation;
+
+public class InstanceShaders {
+ public static FileResolution MODEL;
+ public static FileResolution ORIENTED;
+
+ public static void flwInit(GatherContextEvent event) {
+ MODEL = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.MODEL, ".vert"));
+ ORIENTED = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.ORIENTED, ".vert"));
+ }
+
+ public static class Names {
+ public static final ResourceLocation MODEL = Flywheel.rl("instance/model");
+ public static final ResourceLocation ORIENTED = Flywheel.rl("instance/oriented");
+ }
+}
diff --git a/src/main/java/com/jozufozu/flywheel/core/Materials.java b/src/main/java/com/jozufozu/flywheel/core/materials/Materials.java
similarity index 56%
rename from src/main/java/com/jozufozu/flywheel/core/Materials.java
rename to src/main/java/com/jozufozu/flywheel/core/materials/Materials.java
index ac437afe8..7f81b5b41 100644
--- a/src/main/java/com/jozufozu/flywheel/core/Materials.java
+++ b/src/main/java/com/jozufozu/flywheel/core/materials/Materials.java
@@ -1,22 +1,12 @@
-package com.jozufozu.flywheel.core;
+package com.jozufozu.flywheel.core.materials;
-import com.jozufozu.flywheel.Flywheel;
import com.jozufozu.flywheel.api.struct.StructType;
import com.jozufozu.flywheel.core.materials.model.ModelData;
import com.jozufozu.flywheel.core.materials.model.ModelType;
import com.jozufozu.flywheel.core.materials.oriented.OrientedData;
import com.jozufozu.flywheel.core.materials.oriented.OrientedType;
-import net.minecraft.resources.ResourceLocation;
-
public class Materials {
-
- public static final StructType ORIENTED = new OrientedType();
public static final StructType TRANSFORMED = new ModelType();
-
- public static class Names {
- public static final ResourceLocation MODEL = Flywheel.rl("model");
- public static final ResourceLocation ORIENTED = Flywheel.rl("oriented");
- public static final ResourceLocation PASSTHRU = Flywheel.rl("passthru");
- }
+ public static final StructType ORIENTED = new OrientedType();
}
diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java
index 8e26cee70..108828492 100644
--- a/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java
+++ b/src/main/java/com/jozufozu/flywheel/core/materials/model/ModelType.java
@@ -4,12 +4,11 @@ import com.jozufozu.flywheel.api.struct.Batched;
import com.jozufozu.flywheel.api.struct.Instanced;
import com.jozufozu.flywheel.api.struct.StructWriter;
import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer;
-import com.jozufozu.flywheel.core.Programs;
import com.jozufozu.flywheel.core.layout.BufferLayout;
import com.jozufozu.flywheel.core.layout.CommonItems;
+import com.jozufozu.flywheel.core.materials.InstanceShaders;
import com.jozufozu.flywheel.core.model.ModelTransformer;
-
-import net.minecraft.resources.ResourceLocation;
+import com.jozufozu.flywheel.core.source.FileResolution;
public class ModelType implements Instanced, Batched {
@@ -34,8 +33,8 @@ public class ModelType implements Instanced, Batched {
}
@Override
- public ResourceLocation getProgramSpec() {
- return Programs.TRANSFORMED;
+ public FileResolution getInstanceShader() {
+ return InstanceShaders.MODEL;
}
@Override
diff --git a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java
index c74056390..e48429232 100644
--- a/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java
+++ b/src/main/java/com/jozufozu/flywheel/core/materials/oriented/OrientedType.java
@@ -4,14 +4,13 @@ import com.jozufozu.flywheel.api.struct.Batched;
import com.jozufozu.flywheel.api.struct.Instanced;
import com.jozufozu.flywheel.api.struct.StructWriter;
import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer;
-import com.jozufozu.flywheel.core.Programs;
import com.jozufozu.flywheel.core.layout.BufferLayout;
import com.jozufozu.flywheel.core.layout.CommonItems;
+import com.jozufozu.flywheel.core.materials.InstanceShaders;
import com.jozufozu.flywheel.core.model.ModelTransformer;
+import com.jozufozu.flywheel.core.source.FileResolution;
import com.mojang.math.Quaternion;
-import net.minecraft.resources.ResourceLocation;
-
public class OrientedType implements Instanced, Batched {
public static final BufferLayout FORMAT = BufferLayout.builder()
@@ -35,8 +34,8 @@ public class OrientedType implements Instanced, Batched
- * These are defined through json. All ProgramSpecs in {@code assets/modid/flywheel/programs} are parsed and
- * processed. One ProgramSpec typically specifies one "material" that can be used in game to render things.
- *
- *
- * All shader source files in {@code assets/modid/flywheel/shaders} are completely loaded and parsed into
- * {@link SourceFile SourceFiles}, but not compiled until one of them is
- * referenced by a ProgramSpec.
- *
- */
-public class ProgramSpec {
-
- public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group(
- ResourceLocation.CODEC.fieldOf("vertex")
- .forGetter(ProgramSpec::getSourceLoc),
- ResourceLocation.CODEC.fieldOf("fragment")
- .forGetter(ProgramSpec::getFragmentLoc))
- .apply(instance, ProgramSpec::new));
-
- public ResourceLocation name;
- public final FileResolution vertex;
- public final FileResolution fragment;
-
- public ProgramSpec(ResourceLocation vertex, ResourceLocation fragment) {
- this.vertex = Resolver.INSTANCE.get(vertex);
- this.fragment = Resolver.INSTANCE.get(fragment);
- }
-
- public void setName(ResourceLocation name) {
- this.name = name;
- this.vertex.addSpec(name);
- this.fragment.addSpec(name);
- }
-
- public ResourceLocation getSourceLoc() {
- return vertex.getFileLoc();
- }
-
- public ResourceLocation getFragmentLoc() {
- return fragment.getFileLoc();
- }
-
- public SourceFile getVertexFile() {
- return vertex.getFile();
- }
-
- public SourceFile getFragmentFile() {
- return fragment.getFile();
- }
-
- @Override
- public String toString() {
- return name.toString();
- }
-}
diff --git a/src/main/java/com/jozufozu/flywheel/core/source/FileIndex.java b/src/main/java/com/jozufozu/flywheel/core/source/FileIndex.java
index 91ce1e36e..55d91a96a 100644
--- a/src/main/java/com/jozufozu/flywheel/core/source/FileIndex.java
+++ b/src/main/java/com/jozufozu/flywheel/core/source/FileIndex.java
@@ -11,6 +11,8 @@ public interface FileIndex {
*/
int getFileID(SourceFile sourceFile);
+ boolean exists(SourceFile sourceFile);
+
SourceFile getFile(int fileID);
default Span getLineSpan(int fileId, int lineNo) {
diff --git a/src/main/java/com/jozufozu/flywheel/core/source/FileIndexImpl.java b/src/main/java/com/jozufozu/flywheel/core/source/FileIndexImpl.java
index 4529a2d0b..90aefb176 100644
--- a/src/main/java/com/jozufozu/flywheel/core/source/FileIndexImpl.java
+++ b/src/main/java/com/jozufozu/flywheel/core/source/FileIndexImpl.java
@@ -31,12 +31,16 @@ public class FileIndexImpl implements FileIndex {
return size;
}
+ @Override
+ public boolean exists(SourceFile sourceFile) {
+ return files.indexOf(sourceFile) != -1;
+ }
+
@Override
public SourceFile getFile(int fileId) {
return files.get(fileId);
}
-
public void printShaderInfoLog(String source, String log, ResourceLocation name) {
List lines = log.lines()
.toList();
diff --git a/src/main/java/com/jozufozu/flywheel/core/source/FileResolution.java b/src/main/java/com/jozufozu/flywheel/core/source/FileResolution.java
index 86c9dadd0..23bb7f617 100644
--- a/src/main/java/com/jozufozu/flywheel/core/source/FileResolution.java
+++ b/src/main/java/com/jozufozu/flywheel/core/source/FileResolution.java
@@ -93,4 +93,9 @@ public class FileResolution {
extraCrashInfoProviders.clear();
file = null;
}
+
+ @Override
+ public String toString() {
+ return "FileResolution[" + fileLoc + "]";
+ }
}
diff --git a/src/main/java/com/jozufozu/flywheel/core/source/ShaderSources.java b/src/main/java/com/jozufozu/flywheel/core/source/ShaderSources.java
index 2026e9694..8e657fe86 100644
--- a/src/main/java/com/jozufozu/flywheel/core/source/ShaderSources.java
+++ b/src/main/java/com/jozufozu/flywheel/core/source/ShaderSources.java
@@ -53,7 +53,6 @@ public class ShaderSources implements SourceFinder {
@Override
@Nullable
public SourceFile findSource(ResourceLocation name) {
-
return shaderSources.get(name);
}
}
diff --git a/src/main/java/com/jozufozu/flywheel/core/source/SourceFile.java b/src/main/java/com/jozufozu/flywheel/core/source/SourceFile.java
index c2a13f21c..35004c0d1 100644
--- a/src/main/java/com/jozufozu/flywheel/core/source/SourceFile.java
+++ b/src/main/java/com/jozufozu/flywheel/core/source/SourceFile.java
@@ -2,11 +2,12 @@ package com.jozufozu.flywheel.core.source;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import java.util.Set;
import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -27,10 +28,6 @@ import net.minecraft.resources.ResourceLocation;
*
*/
public class SourceFile {
- private static final Pattern includePattern = Pattern.compile("#use \"(.*)\"");
-
- // https://regexr.com/60n3d
- public static final Pattern functionDeclaration = Pattern.compile("(\\w+)\\s+(\\w+)\\s*\\(([\\w,\\s]*)\\)\\s*\\{");
public final ResourceLocation name;
@@ -141,15 +138,20 @@ public class SourceFile {
for (Import include : imports) {
SourceFile file = include.getFile();
- if (file != null) file.generateFinalSource(env, source);
+ if (file != null && !env.exists(file)) {
+ file.generateFinalSource(env, source);
+ }
}
source.append("#line ")
.append(0)
.append(' ')
.append(env.getFileID(this))
+ .append(" // ")
+ .append(name)
.append('\n');
source.append(elided);
+ source.append('\n');
}
public String printSource() {
@@ -176,7 +178,7 @@ public class SourceFile {
* Scan the source for function definitions and "parse" them into objects that contain properties of the function.
*/
private ImmutableMap parseFunctions() {
- Matcher matcher = functionDeclaration.matcher(source);
+ Matcher matcher = ShaderFunction.functionDeclaration.matcher(source);
Map functions = new HashMap<>();
@@ -210,7 +212,7 @@ public class SourceFile {
* Scan the source for function definitions and "parse" them into objects that contain properties of the function.
*/
private ImmutableMap parseStructs() {
- Matcher matcher = ShaderStruct.struct.matcher(source);
+ Matcher matcher = ShaderStruct.PATTERN.matcher(source);
ImmutableMap.Builder structs = ImmutableMap.builder();
while (matcher.find()) {
@@ -232,15 +234,22 @@ public class SourceFile {
* @param elisions
*/
private ImmutableList parseImports(List elisions) {
- Matcher uses = includePattern.matcher(source);
+ Matcher uses = Import.PATTERN.matcher(source);
+ Set importedFiles = new HashSet<>();
List imports = new ArrayList<>();
while (uses.find()) {
Span use = Span.fromMatcher(this, uses);
Span file = Span.fromMatcher(this, uses, 1);
- imports.add(new Import(Resolver.INSTANCE, use, file));
+ String fileName = file.get();
+ if (importedFiles.add(fileName)) {
+ Import import1 = Import.create(Resolver.INSTANCE, use, file);
+ if (import1 != null) {
+ imports.add(import1);
+ }
+ }
elisions.add(use); // we have to trim that later
}
diff --git a/src/main/java/com/jozufozu/flywheel/core/source/error/ErrorReporter.java b/src/main/java/com/jozufozu/flywheel/core/source/error/ErrorReporter.java
index acac0ccfa..9da3055ea 100644
--- a/src/main/java/com/jozufozu/flywheel/core/source/error/ErrorReporter.java
+++ b/src/main/java/com/jozufozu/flywheel/core/source/error/ErrorReporter.java
@@ -25,7 +25,6 @@ public class ErrorReporter {
}
public static void generateFileError(SourceFile file, String message) {
-
String error = ErrorBuilder.error(message)
.pointAtFile(file)
.build();
diff --git a/src/main/java/com/jozufozu/flywheel/core/source/parse/Import.java b/src/main/java/com/jozufozu/flywheel/core/source/parse/Import.java
index 5fbd5f0c6..90273e7f8 100644
--- a/src/main/java/com/jozufozu/flywheel/core/source/parse/Import.java
+++ b/src/main/java/com/jozufozu/flywheel/core/source/parse/Import.java
@@ -1,8 +1,7 @@
package com.jozufozu.flywheel.core.source.parse;
-import java.util.ArrayList;
-import java.util.List;
import java.util.Optional;
+import java.util.regex.Pattern;
import org.jetbrains.annotations.Nullable;
@@ -12,34 +11,31 @@ import com.jozufozu.flywheel.core.source.SourceFile;
import com.jozufozu.flywheel.core.source.error.ErrorReporter;
import com.jozufozu.flywheel.core.source.span.Span;
+import net.minecraft.ResourceLocationException;
import net.minecraft.resources.ResourceLocation;
public class Import extends AbstractShaderElement {
- public static final List IMPORTS = new ArrayList<>();
-
- private final Span file;
+ public static final Pattern PATTERN = Pattern.compile("^\\s*#\\s*use\\s+\"(.*)\"", Pattern.MULTILINE);
private final FileResolution resolution;
- public Import(Resolver resolver, Span self, Span file) {
+ protected Import(Span self, FileResolution resolution, Span file) {
super(self);
- this.file = file;
-
- resolution = resolver.get(toRL(file))
- .addSpan(file);
-
- IMPORTS.add(this);
+ this.resolution = resolution.addSpan(file);
}
- private ResourceLocation toRL(Span file) {
+ @Nullable
+ public static Import create(Resolver resolver, Span self, Span file) {
+ ResourceLocation fileLocation;
try {
- return new ResourceLocation(file.get());
- } catch (RuntimeException error) {
- ErrorReporter.generateSpanError(file, "malformed source name");
+ fileLocation = new ResourceLocation(file.get());
+ } catch (ResourceLocationException e) {
+ ErrorReporter.generateSpanError(file, "malformed source location");
+ return null;
}
- return new ResourceLocation("");
+ return new Import(self, resolver.get(fileLocation), file);
}
public FileResolution getResolution() {
diff --git a/src/main/java/com/jozufozu/flywheel/core/source/parse/ShaderFunction.java b/src/main/java/com/jozufozu/flywheel/core/source/parse/ShaderFunction.java
index 9dfe551de..b7e735589 100644
--- a/src/main/java/com/jozufozu/flywheel/core/source/parse/ShaderFunction.java
+++ b/src/main/java/com/jozufozu/flywheel/core/source/parse/ShaderFunction.java
@@ -9,6 +9,9 @@ import com.jozufozu.flywheel.core.source.span.Span;
public class ShaderFunction extends AbstractShaderElement {
+ // https://regexr.com/60n3d
+ public static final Pattern functionDeclaration = Pattern.compile("(\\w+)\\s+(\\w+)\\s*\\(([\\w,\\s]*)\\)\\s*\\{");
+
public static final Pattern argument = Pattern.compile("(?:(inout|in|out) )?(\\w+)\\s+(\\w+)");
public static final Pattern assignment = Pattern.compile("(\\w+)\\s*=");
diff --git a/src/main/java/com/jozufozu/flywheel/core/source/parse/ShaderStruct.java b/src/main/java/com/jozufozu/flywheel/core/source/parse/ShaderStruct.java
index e3db7fd29..d89e5497e 100644
--- a/src/main/java/com/jozufozu/flywheel/core/source/parse/ShaderStruct.java
+++ b/src/main/java/com/jozufozu/flywheel/core/source/parse/ShaderStruct.java
@@ -10,7 +10,7 @@ import com.jozufozu.flywheel.core.source.span.Span;
public class ShaderStruct extends AbstractShaderElement {
// https://regexr.com/61rpe
- public static final Pattern struct = Pattern.compile("struct\\s+([\\w\\d]*)\\s*\\{([\\w\\d\\s,;]*)}\\s*;\\s");
+ public static final Pattern PATTERN = Pattern.compile("struct\\s+([\\w\\d]*)\\s*\\{([\\w\\d\\s,;]*)}\\s*;\\s");
public final Span name;
public final Span body;
diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertex.java b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertex.java
index a554d7f2c..080f2a26a 100644
--- a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertex.java
+++ b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertex.java
@@ -7,6 +7,7 @@ import com.jozufozu.flywheel.api.vertex.VertexType;
import com.jozufozu.flywheel.core.layout.BufferLayout;
import com.jozufozu.flywheel.core.layout.CommonItems;
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferBuilder;
+import com.jozufozu.flywheel.core.source.FileResolution;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.datafixers.util.Pair;
@@ -38,24 +39,8 @@ public class BlockVertex implements VertexType {
}
@Override
- public String getShaderHeader() {
- return """
-layout (location = 0) in vec3 _flw_v_pos;
-layout (location = 1) in vec4 _flw_v_color;
-layout (location = 2) in vec2 _flw_v_texCoords;
-layout (location = 3) in vec2 _flw_v_light;
-layout (location = 4) in vec3 _flw_v_normal;
-
-Vertex FLWCreateVertex() {
- Vertex v;
- v.pos = _flw_v_pos;
- v.color = _flw_v_color;
- v.texCoords = _flw_v_texCoords;
- v.light = _flw_v_light;
- v.normal = _flw_v_normal;
- return v;
-}
- """;
+ public FileResolution getLayoutShader() {
+ return LayoutShaders.BLOCK;
}
public BlockVertexListUnsafe.Shaded createReader(ByteBuffer buffer, int vertexCount, int unshadedStartVertex) {
diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexList.java b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexList.java
index d746896ea..8c856b94f 100644
--- a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexList.java
+++ b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexList.java
@@ -5,7 +5,6 @@ import java.nio.ByteBuffer;
import com.jozufozu.flywheel.api.vertex.ShadedVertexList;
import com.jozufozu.flywheel.api.vertex.VertexList;
import com.jozufozu.flywheel.api.vertex.VertexType;
-import com.jozufozu.flywheel.core.Formats;
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferBuilder;
import com.jozufozu.flywheel.util.RenderMath;
import com.mojang.blaze3d.vertex.BufferBuilder;
diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexListUnsafe.java b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexListUnsafe.java
index bd96c4bfb..7258b3af4 100644
--- a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexListUnsafe.java
+++ b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexListUnsafe.java
@@ -7,7 +7,6 @@ import org.lwjgl.system.MemoryUtil;
import com.jozufozu.flywheel.api.vertex.ShadedVertexList;
import com.jozufozu.flywheel.api.vertex.VertexList;
import com.jozufozu.flywheel.api.vertex.VertexType;
-import com.jozufozu.flywheel.core.Formats;
import com.jozufozu.flywheel.util.RenderMath;
public class BlockVertexListUnsafe implements VertexList {
diff --git a/src/main/java/com/jozufozu/flywheel/core/Formats.java b/src/main/java/com/jozufozu/flywheel/core/vertex/Formats.java
similarity index 52%
rename from src/main/java/com/jozufozu/flywheel/core/Formats.java
rename to src/main/java/com/jozufozu/flywheel/core/vertex/Formats.java
index 21f45dd76..901ff449d 100644
--- a/src/main/java/com/jozufozu/flywheel/core/Formats.java
+++ b/src/main/java/com/jozufozu/flywheel/core/vertex/Formats.java
@@ -1,10 +1,6 @@
-package com.jozufozu.flywheel.core;
-
-import com.jozufozu.flywheel.core.vertex.BlockVertex;
-import com.jozufozu.flywheel.core.vertex.PosTexNormalVertex;
+package com.jozufozu.flywheel.core.vertex;
public class Formats {
-
- public static final PosTexNormalVertex POS_TEX_NORMAL = new PosTexNormalVertex();
public static final BlockVertex BLOCK = new BlockVertex();
+ public static final PosTexNormalVertex POS_TEX_NORMAL = new PosTexNormalVertex();
}
diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/LayoutShaders.java b/src/main/java/com/jozufozu/flywheel/core/vertex/LayoutShaders.java
new file mode 100644
index 000000000..31fd55b64
--- /dev/null
+++ b/src/main/java/com/jozufozu/flywheel/core/vertex/LayoutShaders.java
@@ -0,0 +1,24 @@
+package com.jozufozu.flywheel.core.vertex;
+
+import com.jozufozu.flywheel.Flywheel;
+import com.jozufozu.flywheel.core.source.FileResolution;
+import com.jozufozu.flywheel.core.source.Resolver;
+import com.jozufozu.flywheel.event.GatherContextEvent;
+import com.jozufozu.flywheel.util.ResourceUtil;
+
+import net.minecraft.resources.ResourceLocation;
+
+public class LayoutShaders {
+ public static FileResolution BLOCK;
+ public static FileResolution POS_TEX_NORMAL;
+
+ public static void flwInit(GatherContextEvent event) {
+ BLOCK = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.BLOCK, ".vert"));
+ POS_TEX_NORMAL = Resolver.INSTANCE.get(ResourceUtil.subPath(Names.POS_TEX_NORMAL, ".vert"));
+ }
+
+ public static class Names {
+ public static final ResourceLocation BLOCK = Flywheel.rl("layout/block");
+ public static final ResourceLocation POS_TEX_NORMAL = Flywheel.rl("layout/pos_tex_normal");
+ }
+}
diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertex.java b/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertex.java
index b10139c88..e55540dbf 100644
--- a/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertex.java
+++ b/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertex.java
@@ -5,6 +5,7 @@ import java.nio.ByteBuffer;
import com.jozufozu.flywheel.api.vertex.VertexType;
import com.jozufozu.flywheel.core.layout.BufferLayout;
import com.jozufozu.flywheel.core.layout.CommonItems;
+import com.jozufozu.flywheel.core.source.FileResolution;
public class PosTexNormalVertex implements VertexType {
@@ -28,21 +29,7 @@ public class PosTexNormalVertex implements VertexType {
}
@Override
- public String getShaderHeader() {
- return """
-layout (location = 0) in vec3 _flw_v_pos;
-layout (location = 1) in vec2 _flw_v_texCoords;
-layout (location = 2) in vec3 _flw_v_normal;
-
-Vertex FLWCreateVertex() {
- Vertex v;
- v.pos = _flw_v_pos;
- v.color = vec4(1.);
- v.texCoords = _flw_v_texCoords;
- v.light = vec2(0.);
- v.normal = _flw_v_normal;
- return v;
-}
- """;
+ public FileResolution getLayoutShader() {
+ return LayoutShaders.POS_TEX_NORMAL;
}
}
diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertexListUnsafe.java b/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertexListUnsafe.java
index 49eddde63..df6aa57cd 100644
--- a/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertexListUnsafe.java
+++ b/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertexListUnsafe.java
@@ -6,7 +6,6 @@ import org.lwjgl.system.MemoryUtil;
import com.jozufozu.flywheel.api.vertex.VertexList;
import com.jozufozu.flywheel.api.vertex.VertexType;
-import com.jozufozu.flywheel.core.Formats;
import com.jozufozu.flywheel.util.RenderMath;
public class PosTexNormalVertexListUnsafe implements VertexList {
diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java
index 6ffe7d3f4..062da4dad 100644
--- a/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java
+++ b/src/main/java/com/jozufozu/flywheel/vanilla/BellInstance.java
@@ -6,8 +6,8 @@ import com.jozufozu.flywheel.api.MaterialManager;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance;
import com.jozufozu.flywheel.core.BasicModelSupplier;
-import com.jozufozu.flywheel.core.Materials;
import com.jozufozu.flywheel.core.hardcoded.ModelPart;
+import com.jozufozu.flywheel.core.materials.Materials;
import com.jozufozu.flywheel.core.materials.oriented.OrientedData;
import com.jozufozu.flywheel.util.AnimationTickHolder;
import com.mojang.math.Quaternion;
diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java
index abb696838..cfaca529e 100644
--- a/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java
+++ b/src/main/java/com/jozufozu/flywheel/vanilla/ChestInstance.java
@@ -9,8 +9,8 @@ import com.jozufozu.flywheel.api.MaterialManager;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance;
import com.jozufozu.flywheel.core.BasicModelSupplier;
-import com.jozufozu.flywheel.core.Materials;
import com.jozufozu.flywheel.core.hardcoded.ModelPart;
+import com.jozufozu.flywheel.core.materials.Materials;
import com.jozufozu.flywheel.core.materials.model.ModelData;
import com.jozufozu.flywheel.core.materials.oriented.OrientedData;
import com.jozufozu.flywheel.util.AnimationTickHolder;
diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java
index 3c2a81b45..98da7aa81 100644
--- a/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java
+++ b/src/main/java/com/jozufozu/flywheel/vanilla/MinecartInstance.java
@@ -7,9 +7,9 @@ import com.jozufozu.flywheel.api.instance.DynamicInstance;
import com.jozufozu.flywheel.api.instance.TickableInstance;
import com.jozufozu.flywheel.backend.instancing.entity.EntityInstance;
import com.jozufozu.flywheel.core.BasicModelSupplier;
-import com.jozufozu.flywheel.core.Materials;
import com.jozufozu.flywheel.core.Models;
import com.jozufozu.flywheel.core.hardcoded.ModelPart;
+import com.jozufozu.flywheel.core.materials.Materials;
import com.jozufozu.flywheel.core.materials.model.ModelData;
import com.jozufozu.flywheel.core.model.Mesh;
import com.jozufozu.flywheel.util.AnimationTickHolder;
diff --git a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java
index a1a979e4f..407b755f0 100644
--- a/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java
+++ b/src/main/java/com/jozufozu/flywheel/vanilla/ShulkerBoxInstance.java
@@ -6,8 +6,8 @@ import com.jozufozu.flywheel.api.MaterialManager;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance;
import com.jozufozu.flywheel.core.BasicModelSupplier;
-import com.jozufozu.flywheel.core.Materials;
import com.jozufozu.flywheel.core.hardcoded.ModelPart;
+import com.jozufozu.flywheel.core.materials.Materials;
import com.jozufozu.flywheel.core.materials.model.ModelData;
import com.jozufozu.flywheel.util.AnimationTickHolder;
import com.jozufozu.flywheel.util.transform.TransformStack;
diff --git a/src/main/resources/assets/flywheel/flywheel/programs/model.json b/src/main/resources/assets/flywheel/flywheel/programs/model.json
deleted file mode 100644
index dbee0ddd4..000000000
--- a/src/main/resources/assets/flywheel/flywheel/programs/model.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "vertex": "flywheel:model.vert",
- "fragment": "flywheel:block.frag"
-}
diff --git a/src/main/resources/assets/flywheel/flywheel/programs/oriented.json b/src/main/resources/assets/flywheel/flywheel/programs/oriented.json
deleted file mode 100644
index f012f819b..000000000
--- a/src/main/resources/assets/flywheel/flywheel/programs/oriented.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "vertex": "flywheel:oriented.vert",
- "fragment": "flywheel:block.frag"
-}
diff --git a/src/main/resources/assets/flywheel/flywheel/programs/passthru.json b/src/main/resources/assets/flywheel/flywheel/programs/passthru.json
deleted file mode 100644
index 9e180f2de..000000000
--- a/src/main/resources/assets/flywheel/flywheel/programs/passthru.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "vertex": "flywheel:passthru.vert",
- "fragment": "flywheel:block.frag"
-}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/api/fragment.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/api/fragment.glsl
new file mode 100644
index 000000000..ee9cf8489
--- /dev/null
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/api/fragment.glsl
@@ -0,0 +1,12 @@
+in vec4 flw_vertexPos;
+in vec4 flw_vertexColor;
+in vec2 flw_vertexTexCoord;
+in vec2 flw_vertexLight;
+in vec3 flw_vertexNormal;
+
+in float flw_distance;
+
+in vec4 flw_var0;
+in vec4 flw_var1;
+in vec4 flw_var2;
+in vec4 flw_var3;
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/api/vertex.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/api/vertex.glsl
new file mode 100644
index 000000000..11ab56206
--- /dev/null
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/api/vertex.glsl
@@ -0,0 +1,12 @@
+out vec4 flw_vertexPos;
+out vec4 flw_vertexColor;
+out vec2 flw_vertexTexCoord;
+out vec2 flw_vertexLight;
+out vec3 flw_vertexNormal;
+
+out float flw_distance;
+
+out vec4 flw_var0;
+out vec4 flw_var1;
+out vec4 flw_var2;
+out vec4 flw_var3;
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/block.frag b/src/main/resources/assets/flywheel/flywheel/shaders/block.frag
deleted file mode 100644
index 366d2cc63..000000000
--- a/src/main/resources/assets/flywheel/flywheel/shaders/block.frag
+++ /dev/null
@@ -1,13 +0,0 @@
-
-struct Fragment {
- vec2 texCoords;
- vec4 color;
- float diffuse;
- vec2 light;
-};
-
-vec4 fragment(Fragment r) {
- vec4 tex = FLWBlockTexture(r.texCoords);
-
- return vec4(tex.rgb * FLWLight(r.light).rgb * r.diffuse, tex.a) * r.color;
-}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/common.vert b/src/main/resources/assets/flywheel/flywheel/shaders/context/common.vert
new file mode 100644
index 000000000..d1019c033
--- /dev/null
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/context/common.vert
@@ -0,0 +1,26 @@
+#use "flywheel:api/vertex.glsl"
+#use "flywheel:util/diffuse.glsl"
+#use "flywheel:util/fog.glsl"
+
+uniform mat4 uViewProjection;
+uniform vec3 uCameraPos;
+uniform int uConstantAmbientLight;
+uniform int uFogShape;
+
+out float _flw_diffuse;
+
+void flw_contextVertex() {
+ flw_vertexNormal = normalize(flw_vertexNormal);
+ if (uConstantAmbientLight == 1) {
+ _flw_diffuse = diffuseNether(flw_vertexNormal);
+ } else {
+ _flw_diffuse = diffuse(flw_vertexNormal);
+ }
+ flw_distance = fog_distance(flw_vertexPos.xyz, uCameraPos, uFogShape);
+ gl_Position = uViewProjection * flw_vertexPos;
+
+ // TODO: remove this
+ #ifdef DEBUG_NORMAL
+ flw_vertexColor = vec4(flw_vertexNormal, 1.0);
+ #endif
+}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.frag b/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.frag
new file mode 100644
index 000000000..12e1b140d
--- /dev/null
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.frag
@@ -0,0 +1,34 @@
+#use "flywheel:api/fragment.glsl"
+#use "flywheel:util/fog.glsl"
+
+uniform vec2 uFogRange;
+uniform vec4 uFogColor;
+uniform vec2 uTextureScale;
+
+uniform sampler2D uBlockAtlas;
+uniform sampler2D uCrumbling;
+
+in float _flw_diffuse;
+
+out vec4 fragColor;
+
+void flw_contextFragment() {
+ vec4 texColor = texture(uBlockAtlas, flw_vertexTexCoord);
+ vec4 crumblingColor = texture(uCrumbling, flw_vertexTexCoord * uTextureScale);
+ crumblingColor.a *= texColor.a;
+ vec4 color = flw_vertexColor * vec4(crumblingColor.rgb * _flw_diffuse, crumblingColor.a);
+
+ #ifdef ALPHA_DISCARD
+ if (color.a < ALPHA_DISCARD) {
+ discard;
+ }
+ #endif
+
+ #ifdef COLOR_FOG
+ color = linear_fog(color, flw_distance, uFogRange.x, uFogRange.y, uFogColor);
+ #elif defined(FADE_FOG)
+ color = linear_fog_fade(color, flw_distance, uFogRange.x, uFogRange.y);
+ #endif
+
+ fragColor = color;
+}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.glsl
deleted file mode 100644
index 6007383b8..000000000
--- a/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.glsl
+++ /dev/null
@@ -1,64 +0,0 @@
-#use "flywheel:context/fog.glsl"
-
-uniform float uTime;
-uniform mat4 uViewProjection;
-uniform vec3 uCameraPos;
-uniform int uConstantAmbientLight;
-
-uniform vec2 uTextureScale;
-uniform sampler2D uBlockAtlas;
-uniform sampler2D uLightMap;
-uniform sampler2D uCrumbling;
-
-uniform vec2 uWindowSize;
-
-#ifdef VERTEX_SHADER
-
-#use "flywheel:context/diffuse.glsl"
-
-vec4 FLWVertex(inout Vertex v) {
- fragDistance = fog_distance(v.pos, uCameraPos);
-
- return uViewProjection * vec4(v.pos, 1.);
-}
-
-float FLWDiffuse(vec3 normal) {
- if (uConstantAmbientLight == 1) {
- return diffuseNether(normal);
- } else {
- return diffuse(normal);
- }
-}
-
-#elif defined(FRAGMENT_SHADER)
-
-out vec4 fragColor;
-
-vec4 FLWBlockTexture(vec2 texCoords) {
- vec4 cr = texture(uCrumbling, texCoords * uTextureScale);
- float diffuseAlpha = texture(uBlockAtlas, texCoords).a;
- cr.a = cr.a * diffuseAlpha;
- return cr;
-}
-
-vec4 FLWLight(vec2 lightCoords) {
- return vec4(1.);
-}
-
-void FLWFinalizeColor(vec4 color) {
- #ifdef ALPHA_DISCARD
- if (color.a < ALPHA_DISCARD) {
- discard;
- }
- #endif
-
- #ifdef COLOR_FOG
- color = linear_fog(color);
- #elif defined(FADE_FOG)
- color = linear_fog_fade(color);
- #endif
-
- fragColor = color;
-}
-
-#endif
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.vert b/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.vert
new file mode 100644
index 000000000..6b2d25e44
--- /dev/null
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/context/crumbling.vert
@@ -0,0 +1 @@
+#use "flywheel:context/common.vert"
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/fog.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/context/fog.glsl
deleted file mode 100644
index d038a4acd..000000000
--- a/src/main/resources/assets/flywheel/flywheel/shaders/context/fog.glsl
+++ /dev/null
@@ -1,50 +0,0 @@
-uniform vec4 uFogColor;
-uniform vec2 uFogRange;
-uniform int uFogShape;
-
-#ifdef VERTEX_SHADER
-out float fragDistance;
-#elif defined(FRAGMENT_SHADER)
-in float fragDistance;
-#endif
-
-float spherical_distance(vec3 relativePos) {
- return length(relativePos);
-}
-
-float cylindrical_distance(vec3 relativePos) {
- float distXZ = length(relativePos.xz);
- float distY = abs(relativePos.y);
- return max(distXZ, distY);
-}
-
-float fog_distance(vec3 relativePos) {
- if (uFogShape == 0) {
- return spherical_distance(relativePos);
- } else {
- return cylindrical_distance(relativePos);
- }
-}
-
-float fog_distance(vec3 worldPos, vec3 cameraPos) {
- return fog_distance(worldPos - cameraPos);
-}
-
-vec4 linear_fog(vec4 color) {
- if (fragDistance <= uFogRange.x) {
- return color;
- }
-
- float fogValue = fragDistance < uFogRange.y ? smoothstep(uFogRange.x, uFogRange.y, fragDistance) : 1.0;
- return vec4(mix(color.rgb, uFogColor.rgb, fogValue * uFogColor.a), color.a);
-}
-
-vec4 linear_fog_fade(vec4 color) {
- if (fragDistance <= uFogRange.x) {
- return color;
- } else if (fragDistance >= uFogRange.y) {
- return vec4(0.0);
- }
-
- return color * smoothstep(uFogRange.y, uFogRange.x, fragDistance);
-}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/world.frag b/src/main/resources/assets/flywheel/flywheel/shaders/context/world.frag
new file mode 100644
index 000000000..9f9877268
--- /dev/null
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/context/world.frag
@@ -0,0 +1,39 @@
+#use "flywheel:api/fragment.glsl"
+#use "flywheel:util/fog.glsl"
+
+// optimize discard usage
+#ifdef ALPHA_DISCARD
+#ifdef GL_ARB_conservative_depth
+layout (depth_greater) out float gl_FragDepth;
+#endif
+#endif
+
+uniform vec2 uFogRange;
+uniform vec4 uFogColor;
+
+uniform sampler2D uBlockAtlas;
+uniform sampler2D uLightMap;
+
+in float _flw_diffuse;
+
+out vec4 fragColor;
+
+void flw_contextFragment() {
+ vec4 texColor = texture(uBlockAtlas, flw_vertexTexCoord);
+ vec4 lightColor = texture(uLightMap, flw_vertexLight);
+ vec4 color = flw_vertexColor * vec4(texColor.rgb * lightColor.rgb * _flw_diffuse, texColor.a);
+
+ #ifdef ALPHA_DISCARD
+ if (color.a < ALPHA_DISCARD) {
+ discard;
+ }
+ #endif
+
+ #ifdef COLOR_FOG
+ color = linear_fog(color, flw_distance, uFogRange.x, uFogRange.y, uFogColor);
+ #elif defined(FADE_FOG)
+ color = linear_fog_fade(color, flw_distance, uFogRange.x, uFogRange.y);
+ #endif
+
+ fragColor = color;
+}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/world.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/context/world.glsl
deleted file mode 100644
index 0635b13c2..000000000
--- a/src/main/resources/assets/flywheel/flywheel/shaders/context/world.glsl
+++ /dev/null
@@ -1,68 +0,0 @@
-#use "flywheel:context/fog.glsl"
-
-uniform float uTime;
-uniform mat4 uViewProjection;
-uniform vec3 uCameraPos;
-uniform int uConstantAmbientLight;
-
-uniform vec2 uTextureScale;
-uniform sampler2D uBlockAtlas;
-uniform sampler2D uLightMap;
-
-uniform vec2 uWindowSize;
-
-#ifdef VERTEX_SHADER
-
-#use "flywheel:context/diffuse.glsl"
-
-vec4 FLWVertex(inout Vertex v) {
- fragDistance = fog_distance(v.pos, uCameraPos);
-
- return uViewProjection * vec4(v.pos, 1.);
-}
-
-float FLWDiffuse(vec3 normal) {
- if (uConstantAmbientLight == 1) {
- return diffuseNether(normal);
- } else {
- return diffuse(normal);
- }
-}
-
-#elif defined(FRAGMENT_SHADER)
-
-#use "flywheel:core/lightutil.glsl"
-
-// optimize discard usage
-#ifdef ALPHA_DISCARD
-#ifdef GL_ARB_conservative_depth
-layout (depth_greater) out float gl_FragDepth;
-#endif
-#endif
-out vec4 fragColor;
-
-vec4 FLWBlockTexture(vec2 texCoords) {
- return texture(uBlockAtlas, texCoords);
-}
-
-vec4 FLWLight(vec2 lightCoords) {
- return texture(uLightMap, shiftLight(lightCoords));
-}
-
-void FLWFinalizeColor(vec4 color) {
- #ifdef ALPHA_DISCARD
- if (color.a < ALPHA_DISCARD) {
- discard;
- }
- #endif
-
- #ifdef COLOR_FOG
- color = linear_fog(color);
- #elif defined(FADE_FOG)
- color = linear_fog_fade(color);
- #endif
-
- fragColor = color;
-}
-
-#endif
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/world.vert b/src/main/resources/assets/flywheel/flywheel/shaders/context/world.vert
new file mode 100644
index 000000000..6b2d25e44
--- /dev/null
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/context/world.vert
@@ -0,0 +1 @@
+#use "flywheel:context/common.vert"
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/instance/model.vert b/src/main/resources/assets/flywheel/flywheel/shaders/instance/model.vert
new file mode 100644
index 000000000..cea24a54a
--- /dev/null
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/instance/model.vert
@@ -0,0 +1,16 @@
+#use "flywheel:api/vertex.glsl"
+#use "flywheel:util/light.glsl"
+
+struct Instance {
+ vec2 light;
+ vec4 color;
+ mat4 transform;
+ mat3 normalMat;
+};
+
+void flw_instanceVertex(Instance instance) {
+ flw_vertexPos = instance.transform * flw_vertexPos;
+ flw_vertexNormal = instance.normalMat * flw_vertexNormal;
+ flw_vertexColor = instance.color;
+ flw_vertexLight = shiftLight(instance.light);
+}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/instance/oriented.vert b/src/main/resources/assets/flywheel/flywheel/shaders/instance/oriented.vert
new file mode 100644
index 000000000..c9e5b5cff
--- /dev/null
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/instance/oriented.vert
@@ -0,0 +1,18 @@
+#use "flywheel:api/vertex.glsl"
+#use "flywheel:util/light.glsl"
+#use "flywheel:util/quaternion.glsl"
+
+struct Oriented {
+ vec2 light;
+ vec4 color;
+ vec3 pos;
+ vec3 pivot;
+ vec4 rotation;
+};
+
+void flw_instanceVertex(Oriented oriented) {
+ flw_vertexPos = vec4(rotateVertexByQuat(flw_vertexPos.xyz - oriented.pivot, oriented.rotation) + oriented.pivot + oriented.pos, 1.0);
+ flw_vertexNormal = rotateVertexByQuat(flw_vertexNormal, oriented.rotation);
+ flw_vertexColor = oriented.color;
+ flw_vertexLight = shiftLight(oriented.light);
+}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/layout/block.vert b/src/main/resources/assets/flywheel/flywheel/shaders/layout/block.vert
new file mode 100644
index 000000000..d4175c75c
--- /dev/null
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/layout/block.vert
@@ -0,0 +1,16 @@
+#use "flywheel:api/vertex.glsl"
+#use "flywheel:util/light.glsl"
+
+layout(location = 0) in vec3 _flw_v_pos;
+layout(location = 1) in vec4 _flw_v_color;
+layout(location = 2) in vec2 _flw_v_texCoord;
+layout(location = 3) in vec2 _flw_v_light;
+layout(location = 4) in vec3 _flw_v_normal;
+
+void flw_layoutVertex() {
+ flw_vertexPos = vec4(_flw_v_pos, 1.0);
+ flw_vertexColor = _flw_v_color;
+ flw_vertexTexCoord = _flw_v_texCoord;
+ flw_vertexLight = shiftLight(_flw_v_light);
+ flw_vertexNormal = _flw_v_normal;
+}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/layout/pos_tex_normal.vert b/src/main/resources/assets/flywheel/flywheel/shaders/layout/pos_tex_normal.vert
new file mode 100644
index 000000000..36a17186e
--- /dev/null
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/layout/pos_tex_normal.vert
@@ -0,0 +1,13 @@
+#use "flywheel:api/vertex.glsl"
+
+layout(location = 0) in vec3 _flw_v_pos;
+layout(location = 1) in vec2 _flw_v_texCoord;
+layout(location = 2) in vec3 _flw_v_normal;
+
+void flw_layoutVertex() {
+ flw_vertexPos = vec4(_flw_v_pos, 1.0);
+ flw_vertexColor = vec4(1.0);
+ flw_vertexTexCoord = _flw_v_texCoord;
+ flw_vertexLight = vec2(0.0);
+ flw_vertexNormal = _flw_v_normal;
+}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/model.vert b/src/main/resources/assets/flywheel/flywheel/shaders/model.vert
deleted file mode 100644
index 0feeb9a1b..000000000
--- a/src/main/resources/assets/flywheel/flywheel/shaders/model.vert
+++ /dev/null
@@ -1,14 +0,0 @@
-
-struct Instance {
- vec2 light;
- vec4 color;
- mat4 transform;
- mat3 normalMat;
-};
-
-void vertex(inout Vertex v, Instance i) {
- v.pos = (i.transform * vec4(v.pos, 1.)).xyz;
- v.normal = i.normalMat * v.normal;
- v.color = i.color;
- v.light = i.light;
-}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/oriented.vert b/src/main/resources/assets/flywheel/flywheel/shaders/oriented.vert
deleted file mode 100644
index 8478e8b4a..000000000
--- a/src/main/resources/assets/flywheel/flywheel/shaders/oriented.vert
+++ /dev/null
@@ -1,16 +0,0 @@
-#use "flywheel:core/quaternion.glsl"
-
-struct Oriented {
- vec2 light;
- vec4 color;
- vec3 pos;
- vec3 pivot;
- vec4 rotation;
-};
-
-void vertex(inout Vertex v, Oriented o) {
- v.pos = rotateVertexByQuat(v.pos - o.pivot, o.rotation) + o.pivot + o.pos;
- v.normal = rotateVertexByQuat(v.normal, o.rotation);
- v.color = o.color;
- v.light = o.light;
-}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/passthru.vert b/src/main/resources/assets/flywheel/flywheel/shaders/passthru.vert
deleted file mode 100644
index a7642d2ab..000000000
--- a/src/main/resources/assets/flywheel/flywheel/shaders/passthru.vert
+++ /dev/null
@@ -1,4 +0,0 @@
-
-void vertex(inout Vertex v) {
-
-}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/core/color.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/util/color.glsl
similarity index 100%
rename from src/main/resources/assets/flywheel/flywheel/shaders/core/color.glsl
rename to src/main/resources/assets/flywheel/flywheel/shaders/util/color.glsl
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/context/diffuse.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/util/diffuse.glsl
similarity index 100%
rename from src/main/resources/assets/flywheel/flywheel/shaders/context/diffuse.glsl
rename to src/main/resources/assets/flywheel/flywheel/shaders/util/diffuse.glsl
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/util/fog.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/util/fog.glsl
new file mode 100644
index 000000000..a9c8d043d
--- /dev/null
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/util/fog.glsl
@@ -0,0 +1,40 @@
+float spherical_distance(vec3 relativePos) {
+ return length(relativePos);
+}
+
+float cylindrical_distance(vec3 relativePos) {
+ float distXZ = length(relativePos.xz);
+ float distY = abs(relativePos.y);
+ return max(distXZ, distY);
+}
+
+float fog_distance(vec3 relativePos, int fogShape) {
+ if (fogShape == 0) {
+ return spherical_distance(relativePos);
+ } else {
+ return cylindrical_distance(relativePos);
+ }
+}
+
+float fog_distance(vec3 worldPos, vec3 cameraPos, int fogShape) {
+ return fog_distance(worldPos - cameraPos, fogShape);
+}
+
+vec4 linear_fog(vec4 color, float distance, float fogStart, float fogEnd, vec4 fogColor) {
+ if (distance <= fogStart) {
+ return color;
+ }
+
+ float fogValue = distance < fogEnd ? smoothstep(fogStart, fogEnd, distance) : 1.0;
+ return vec4(mix(color.rgb, fogColor.rgb, fogValue * fogColor.a), color.a);
+}
+
+vec4 linear_fog_fade(vec4 color, float distance, float fogStart, float fogEnd) {
+ if (distance <= fogStart) {
+ return color;
+ } else if (distance >= fogEnd) {
+ return vec4(0.0);
+ }
+
+ return color * smoothstep(fogEnd, fogStart, distance);
+}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/core/lightutil.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/util/light.glsl
similarity index 70%
rename from src/main/resources/assets/flywheel/flywheel/shaders/core/lightutil.glsl
rename to src/main/resources/assets/flywheel/flywheel/shaders/util/light.glsl
index 9967c4f51..f8cd2089e 100644
--- a/src/main/resources/assets/flywheel/flywheel/shaders/core/lightutil.glsl
+++ b/src/main/resources/assets/flywheel/flywheel/shaders/util/light.glsl
@@ -1,4 +1,4 @@
// Adjust the [0,1] normalized lightmap value based on the texture matrix from LightTexture#enableLightmap
vec2 shiftLight(vec2 lm) {
- return lm * 0.99609375 + 0.03125;// * 255/256 + 1/32
+ return lm * 0.99609375 + 0.03125; // * 255/256 + 1/32
}
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/core/matutils.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/util/matrix.glsl
similarity index 100%
rename from src/main/resources/assets/flywheel/flywheel/shaders/core/matutils.glsl
rename to src/main/resources/assets/flywheel/flywheel/shaders/util/matrix.glsl
diff --git a/src/main/resources/assets/flywheel/flywheel/shaders/core/quaternion.glsl b/src/main/resources/assets/flywheel/flywheel/shaders/util/quaternion.glsl
similarity index 100%
rename from src/main/resources/assets/flywheel/flywheel/shaders/core/quaternion.glsl
rename to src/main/resources/assets/flywheel/flywheel/shaders/util/quaternion.glsl