diff --git a/src/main/java/com/jozufozu/flywheel/Flywheel.java b/src/main/java/com/jozufozu/flywheel/Flywheel.java index 8a05d51fd..4a6f63102 100644 --- a/src/main/java/com/jozufozu/flywheel/Flywheel.java +++ b/src/main/java/com/jozufozu/flywheel/Flywheel.java @@ -13,6 +13,8 @@ import com.jozufozu.flywheel.core.Models; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.StitchedSprite; import com.jozufozu.flywheel.core.compile.ProgramCompiler; +import com.jozufozu.flywheel.core.materials.InstanceShaders; +import com.jozufozu.flywheel.core.vertex.LayoutShaders; import com.jozufozu.flywheel.event.ReloadRenderersEvent; import com.jozufozu.flywheel.mixin.PausedPartialTickAccessor; import com.jozufozu.flywheel.vanilla.VanillaInstances; @@ -73,6 +75,8 @@ public class Flywheel { forgeEventBus.addListener(ProgramCompiler::invalidateAll); forgeEventBus.addListener(Models::onReload); + modEventBus.addListener(LayoutShaders::flwInit); + modEventBus.addListener(InstanceShaders::flwInit); modEventBus.addListener(Contexts::flwInit); modEventBus.addListener(PartialModel::onModelRegistry); modEventBus.addListener(PartialModel::onModelBake); diff --git a/src/main/java/com/jozufozu/flywheel/api/struct/Instanced.java b/src/main/java/com/jozufozu/flywheel/api/struct/Instanced.java index 64e95b6ba..c7d2b8f45 100644 --- a/src/main/java/com/jozufozu/flywheel/api/struct/Instanced.java +++ b/src/main/java/com/jozufozu/flywheel/api/struct/Instanced.java @@ -1,8 +1,7 @@ package com.jozufozu.flywheel.api.struct; import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer; - -import net.minecraft.resources.ResourceLocation; +import com.jozufozu.flywheel.core.source.FileResolution; public interface Instanced extends StructType { /** @@ -12,6 +11,5 @@ public interface Instanced extends StructType { */ StructWriter getWriter(VecBuffer backing); - ResourceLocation getProgramSpec(); - + FileResolution getInstanceShader(); } diff --git a/src/main/java/com/jozufozu/flywheel/api/vertex/VertexType.java b/src/main/java/com/jozufozu/flywheel/api/vertex/VertexType.java index 5b7afb654..1ae89d406 100644 --- a/src/main/java/com/jozufozu/flywheel/api/vertex/VertexType.java +++ b/src/main/java/com/jozufozu/flywheel/api/vertex/VertexType.java @@ -3,6 +3,7 @@ package com.jozufozu.flywheel.api.vertex; import java.nio.ByteBuffer; import com.jozufozu.flywheel.core.layout.BufferLayout; +import com.jozufozu.flywheel.core.source.FileResolution; /** * A vertex type containing metadata about a specific vertex layout. @@ -32,7 +33,7 @@ public interface VertexType { */ VertexList createReader(ByteBuffer buffer, int vertexCount); - String getShaderHeader(); + FileResolution getLayoutShader(); default int getStride() { return getLayout().getStride(); diff --git a/src/main/java/com/jozufozu/flywheel/backend/Backend.java b/src/main/java/com/jozufozu/flywheel/backend/Backend.java index fd12889d0..79f4b6c93 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/Backend.java +++ b/src/main/java/com/jozufozu/flywheel/backend/Backend.java @@ -8,11 +8,9 @@ import com.jozufozu.flywheel.backend.gl.versioned.GlCompat; import com.jozufozu.flywheel.backend.instancing.ParallelTaskEngine; import com.jozufozu.flywheel.config.BackendType; import com.jozufozu.flywheel.config.FlwConfig; -import com.jozufozu.flywheel.core.shader.ProgramSpec; import com.mojang.logging.LogUtils; import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; @@ -53,11 +51,6 @@ public class Backend { return backendType == null ? "Uninitialized" : backendType.getProperName(); } - @Nullable - public static ProgramSpec getSpec(ResourceLocation name) { - return loader.get(name); - } - public static void refresh() { backendType = chooseEngine(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/Loader.java b/src/main/java/com/jozufozu/flywheel/backend/Loader.java index 0986282c9..2b3c1008e 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/Loader.java +++ b/src/main/java/com/jozufozu/flywheel/backend/Loader.java @@ -1,32 +1,15 @@ package com.jozufozu.flywheel.backend; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import org.jetbrains.annotations.Nullable; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher; import com.jozufozu.flywheel.core.GameStateRegistry; import com.jozufozu.flywheel.core.crumbling.CrumblingRenderer; -import com.jozufozu.flywheel.core.shader.ProgramSpec; import com.jozufozu.flywheel.core.source.Resolver; import com.jozufozu.flywheel.core.source.ShaderSources; import com.jozufozu.flywheel.event.GatherContextEvent; -import com.jozufozu.flywheel.util.ResourceUtil; -import com.jozufozu.flywheel.util.StringUtil; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ReloadableResourceManager; -import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import net.minecraftforge.fml.ModLoader; @@ -39,11 +22,6 @@ import net.minecraftforge.fml.ModLoader; *

*/ public class Loader implements ResourceManagerReloadListener { - public static final String PROGRAM_DIR = "flywheel/programs/"; - private static final Gson GSON = new GsonBuilder().create(); - - private final Map programs = new HashMap<>(); - private boolean firstLoad = true; Loader() { @@ -57,11 +35,6 @@ public class Loader implements ResourceManagerReloadListener { } } - @Nullable - public ProgramSpec get(ResourceLocation name) { - return programs.get(name); - } - @Override public void onResourceManagerReload(ResourceManager manager) { Backend.refresh(); @@ -74,8 +47,6 @@ public class Loader implements ResourceManagerReloadListener { ShaderSources sources = new ShaderSources(manager); - loadProgramSpecs(manager); - Resolver.INSTANCE.run(sources); Backend.LOGGER.info("Loaded all shader sources."); @@ -89,35 +60,4 @@ public class Loader implements ResourceManagerReloadListener { firstLoad = false; } - - private void loadProgramSpecs(ResourceManager manager) { - programs.clear(); - - Collection programSpecs = manager.listResources(PROGRAM_DIR, s -> s.endsWith(".json")); - - for (ResourceLocation location : programSpecs) { - try (Resource file = manager.getResource(location)) { - String s = StringUtil.readToString(file.getInputStream()); - - ResourceLocation specName = ResourceUtil.trim(location, PROGRAM_DIR, ".json"); - - DataResult> 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 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 template; - private final FileResolution header; + private final FileResolution contextShader; - public FragmentCompiler(Template template, FileResolution header) { - this.header = header; + public FragmentCompiler(Template template, FileResolution contextShader) { this.template = template; + this.contextShader = contextShader; } @Override @@ -27,16 +26,16 @@ public class FragmentCompiler extends Memoizer 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