From dd535b9c6daaaa89b8055ec4d9237041ad86eddc Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Mon, 12 Sep 2022 22:32:30 -0700 Subject: [PATCH] Instandirect - Finishing touches on the unification --- .../flywheel/api/pipeline/PipelineShader.java | 9 ++-- .../flywheel/api/struct/StructType.java | 2 - .../flywheel/api/struct/StructWriter.java | 3 +- .../backend/instancing/PipelineCompiler.java | 3 +- .../indirect/IndirectCullingGroup.java | 9 ++-- .../indirect/IndirectInstancer.java | 21 ++++----- .../instancing/indirect/IndirectModel.java | 2 +- .../jozufozu/flywheel/core/Components.java | 7 +-- .../flywheel/core/layout/BufferLayout.java | 30 ++++++++----- .../flywheel/core/layout/CommonItems.java | 25 +++++------ .../core/source/CompilationContext.java | 1 + .../core/structs/ColoredLitWriter.java | 14 +++--- .../oriented/OrientedStorageWriter.java | 43 ------------------- .../core/structs/oriented/OrientedType.java | 5 --- .../core/structs/oriented/OrientedWriter.java | 21 ++++----- .../transformed/TransformedStorageWriter.java | 31 ------------- .../structs/transformed/TransformedType.java | 6 --- .../transformed/TransformedWriter.java | 9 ++-- .../transformed/TransformedWriterUnsafe.java | 0 .../flywheel/flywheel/instance/oriented.vert | 2 +- .../flywheel/instance/transformed.vert | 2 +- .../flywheel/flywheel/layout/block.vert | 1 - .../flywheel/layout/pos_tex_normal.vert | 1 - .../assets/flywheel/flywheel/util/types.glsl | 4 +- 24 files changed, 86 insertions(+), 165 deletions(-) delete mode 100644 src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedStorageWriter.java delete mode 100644 src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedStorageWriter.java delete mode 100644 src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedWriterUnsafe.java diff --git a/src/main/java/com/jozufozu/flywheel/api/pipeline/PipelineShader.java b/src/main/java/com/jozufozu/flywheel/api/pipeline/PipelineShader.java index 393f8d263..f33c3b006 100644 --- a/src/main/java/com/jozufozu/flywheel/api/pipeline/PipelineShader.java +++ b/src/main/java/com/jozufozu/flywheel/api/pipeline/PipelineShader.java @@ -1,8 +1,9 @@ package com.jozufozu.flywheel.api.pipeline; -import java.util.function.Function; +import java.util.function.BiFunction; import com.jozufozu.flywheel.api.struct.StructType; +import com.jozufozu.flywheel.api.vertex.VertexType; import com.jozufozu.flywheel.backend.gl.GLSLVersion; import com.jozufozu.flywheel.core.SourceComponent; import com.jozufozu.flywheel.core.source.FileResolution; @@ -16,11 +17,11 @@ public record PipelineShader(GLSLVersion glslVersion, FileResolution vertex, Fil * @param structType The struct type to convert. * @return A source component defining functions that unpack a representation of the given struct type. */ - public SourceComponent assemble(StructType structType) { - return factory.apply(structType); + public SourceComponent assemble(VertexType vertexType, StructType structType) { + return factory.apply(vertexType, structType); } - public interface InstanceAssemblerFactory extends Function, SourceComponent> { + public interface InstanceAssemblerFactory extends BiFunction, SourceComponent> { } } diff --git a/src/main/java/com/jozufozu/flywheel/api/struct/StructType.java b/src/main/java/com/jozufozu/flywheel/api/struct/StructType.java index 5de8d85ec..ef14279de 100644 --- a/src/main/java/com/jozufozu/flywheel/api/struct/StructType.java +++ b/src/main/java/com/jozufozu/flywheel/api/struct/StructType.java @@ -29,8 +29,6 @@ public interface StructType { VertexTransformer getVertexTransformer(); - StorageBufferWriter getStorageBufferWriter(); - interface VertexTransformer { void transform(MutableVertexList vertexList, S struct, ClientLevel level); } diff --git a/src/main/java/com/jozufozu/flywheel/api/struct/StructWriter.java b/src/main/java/com/jozufozu/flywheel/api/struct/StructWriter.java index 5b1e0bd33..21caf4adc 100644 --- a/src/main/java/com/jozufozu/flywheel/api/struct/StructWriter.java +++ b/src/main/java/com/jozufozu/flywheel/api/struct/StructWriter.java @@ -9,5 +9,6 @@ public interface StructWriter { /** * Write the given struct to the given memory address. */ - void write(long ptr, S struct); + void write(final long ptr, final S struct); + } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/PipelineCompiler.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/PipelineCompiler.java index 0551d09c6..5df7ae5b6 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/PipelineCompiler.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/PipelineCompiler.java @@ -99,7 +99,7 @@ public class PipelineCompiler extends Memoizer getVertexComponents() { var layout = vertexType.getLayoutShader() .getFile(); - var instanceAssembly = pipelineShader.assemble(structType); + var instanceAssembly = pipelineShader.assemble(vertexType, structType); var instance = structType.getInstanceShader() .getFile(); var material = this.material.getVertexShader() @@ -133,7 +133,6 @@ public class PipelineCompiler extends Memoizer { private static final int BARRIER_BITS = GL_SHADER_STORAGE_BARRIER_BIT | GL_COMMAND_BARRIER_BIT; - final StorageBufferWriter storageBufferWriter; + final StructWriter storageBufferWriter; final GlProgram compute; final GlProgram draw; private final VertexType vertexType; @@ -48,9 +48,10 @@ public class IndirectCullingGroup { IndirectCullingGroup(StructType structType, VertexType vertexType) { this.vertexType = vertexType; - storageBufferWriter = structType.getStorageBufferWriter(); + storageBufferWriter = structType.getWriter(); - objectStride = storageBufferWriter.getAlignment(); + objectStride = structType.getLayout() + .getStride(); buffers = new IndirectBuffers(objectStride); buffers.createBuffers(); buffers.createObjectStorage(128); diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/indirect/IndirectInstancer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/indirect/IndirectInstancer.java index c1c24ba46..e1a44890c 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/indirect/IndirectInstancer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/indirect/IndirectInstancer.java @@ -4,21 +4,22 @@ import org.lwjgl.system.MemoryUtil; import com.jozufozu.flywheel.api.instancer.InstancedPart; import com.jozufozu.flywheel.api.struct.StructType; +import com.jozufozu.flywheel.api.struct.StructWriter; import com.jozufozu.flywheel.backend.instancing.AbstractInstancer; -import com.jozufozu.flywheel.core.layout.BufferLayout; public class IndirectInstancer extends AbstractInstancer { - public final BufferLayout instanceFormat; - public final IndirectModel parent; + private final long objectStride; + private final StructWriter writer; int instanceCount = 0; boolean anyToUpdate; - public IndirectInstancer(IndirectModel parent, StructType type) { + public IndirectInstancer(StructType type) { super(type); - this.parent = parent; - this.instanceFormat = type.getLayout(); + this.objectStride = type.getLayout() + .getStride(); + writer = type.getWriter(); } @Override @@ -41,12 +42,10 @@ public class IndirectInstancer extends AbstractInstance } public void writeSparse(long objectPtr, long batchIDPtr, int batchID) { - var storageBufferWriter = this.type.getStorageBufferWriter(); - long objectStride = storageBufferWriter.getAlignment(); for (int i = 0, size = data.size(); i < size; i++) { final var element = data.get(i); if (element.checkDirtyAndClear()) { - storageBufferWriter.write(objectPtr + i * objectStride, element); + writer.write(objectPtr + i * objectStride, element); MemoryUtil.memPutInt(batchIDPtr + i * IndirectBuffers.INT_SIZE, batchID); } @@ -54,11 +53,9 @@ public class IndirectInstancer extends AbstractInstance } public void writeFull(long objectPtr, long batchIDPtr, int batchID) { - var storageBufferWriter = this.type.getStorageBufferWriter(); - var objectStride = storageBufferWriter.getAlignment(); for (var object : data) { // write object - storageBufferWriter.write(objectPtr, object); + writer.write(objectPtr, object); objectPtr += objectStride; // write batchID diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/indirect/IndirectModel.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/indirect/IndirectModel.java index 29638638b..40492ab39 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/indirect/IndirectModel.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/indirect/IndirectModel.java @@ -11,7 +11,7 @@ public class IndirectModel { public IndirectModel(StructType type, Model model) { this.model = model; - this.instancer = new IndirectInstancer<>(this, type); + this.instancer = new IndirectInstancer<>(type); } public void init(IndirectDrawManager indirectDrawManager) { diff --git a/src/main/java/com/jozufozu/flywheel/core/Components.java b/src/main/java/com/jozufozu/flywheel/core/Components.java index a75dd70ca..feaf5505d 100644 --- a/src/main/java/com/jozufozu/flywheel/core/Components.java +++ b/src/main/java/com/jozufozu/flywheel/core/Components.java @@ -29,9 +29,10 @@ public class Components { public static final ContextShader WORLD = ComponentRegistry.register(new ContextShader(WorldProgram::new, Files.WORLD_VERTEX, Files.WORLD_FRAGMENT)); public static final ContextShader CRUMBLING = ComponentRegistry.register(new ContextShader(CrumblingProgram::new, Files.WORLD_VERTEX, Files.CRUMBLING_FRAGMENT)); - public static final PipelineShader INSTANCED_ARRAYS = new PipelineShader(GLSLVersion.V420, Pipeline.INSTANCED_ARRAYS_DRAW, Pipeline.DRAW_FRAGMENT, (structType) -> structType.getLayout() - .getInstancedArraysComponent()); - public static final PipelineShader INDIRECT = new PipelineShader(GLSLVersion.V460, Pipeline.INDIRECT_DRAW, Pipeline.DRAW_FRAGMENT, (structType) -> structType.getLayout() + public static final PipelineShader INSTANCED_ARRAYS = new PipelineShader(GLSLVersion.V420, Pipeline.INSTANCED_ARRAYS_DRAW, Pipeline.DRAW_FRAGMENT, (vertexType, structType) -> structType.getLayout() + .getInstancedArraysComponent(vertexType.getLayout() + .getAttributeCount())); + public static final PipelineShader INDIRECT = new PipelineShader(GLSLVersion.V460, Pipeline.INDIRECT_DRAW, Pipeline.DRAW_FRAGMENT, (vertexType, structType) -> structType.getLayout() .getIndirectComponent()); public static final FileResolution UTIL_TYPES = FileResolution.get(Flywheel.rl("util/types.glsl")); diff --git a/src/main/java/com/jozufozu/flywheel/core/layout/BufferLayout.java b/src/main/java/com/jozufozu/flywheel/core/layout/BufferLayout.java index 405ac098c..c53c68b2d 100644 --- a/src/main/java/com/jozufozu/flywheel/core/layout/BufferLayout.java +++ b/src/main/java/com/jozufozu/flywheel/core/layout/BufferLayout.java @@ -59,8 +59,8 @@ public class BufferLayout { return stride; } - public InstancedArraysComponent getInstancedArraysComponent() { - return new InstancedArraysComponent(); + public InstancedArraysComponent getInstancedArraysComponent(int baseIndex) { + return new InstancedArraysComponent(baseIndex); } public IndirectComponent getIndirectComponent() { @@ -109,6 +109,14 @@ public class BufferLayout { } public class InstancedArraysComponent implements SourceComponent { + private static final String ATTRIBUTE_SUFFIX = "_vertex_in"; + + private final int baseIndex; + + public InstancedArraysComponent(int baseIndex) { + this.baseIndex = baseIndex; + } + @Override public Collection included() { return Collections.emptyList(); @@ -116,7 +124,8 @@ public class BufferLayout { @Override public String source(CompilationContext ctx) { - return generateInstancedArrays(5, "Instance"); + var generated = generateInstancedArrays("Instance"); + return ctx.generatedHeader(generated, name().toString()) + generated; } @Override @@ -124,17 +133,16 @@ public class BufferLayout { return Flywheel.rl("generated_instanced_arrays"); } - public String generateInstancedArrays(int baseIndex, String structName) { + public String generateInstancedArrays(String structName) { var builder = new GlslBuilder(); builder.define("FlwInstance", structName); int i = baseIndex; - final var attributeSuffix = "_vertex_in"; for (var field : layoutItems) { builder.vertexInput() .binding(i) .type(field.type.typeName()) - .name(field.name + attributeSuffix); + .name(field.name + ATTRIBUTE_SUFFIX); i += field.type.attributeCount(); } @@ -155,7 +163,7 @@ public class BufferLayout { .name("flw_unpackInstance"); var args = layoutItems.stream() - .map(it -> new GlslExpr.Variable(it.name + attributeSuffix)) + .map(it -> new GlslExpr.Variable(it.name + ATTRIBUTE_SUFFIX)) .map(GlslExpr::minPrint) .collect(Collectors.joining(", ")); @@ -169,7 +177,7 @@ public class BufferLayout { private static final String UNPACK_ARG = "p"; - private static GlslExpr intoGlsl(LayoutItem layoutItem) { + private static GlslExpr genGlslForLayoutItem(LayoutItem layoutItem) { return GlslExpr.variable(UNPACK_ARG) .access(layoutItem.name) .transform(layoutItem.type::unpack); @@ -187,8 +195,8 @@ public class BufferLayout { @Override public String source(CompilationContext ctx) { - var content = generateIndirect("IndirectStruct"); - return ctx.generatedHeader(content, name().toString()) + content; + var generated = generateIndirect("IndirectStruct"); + return ctx.generatedHeader(generated, name().toString()) + generated; } public String generateIndirect(String structName) { @@ -216,7 +224,7 @@ public class BufferLayout { .argumentIn(packedStructName, UNPACK_ARG); var args = layoutItems.stream() - .map(IndirectComponent::intoGlsl) + .map(IndirectComponent::genGlslForLayoutItem) .map(GlslExpr::minPrint) .collect(Collectors.joining(", ")); diff --git a/src/main/java/com/jozufozu/flywheel/core/layout/CommonItems.java b/src/main/java/com/jozufozu/flywheel/core/layout/CommonItems.java index ac2e5bddb..843fd5f6e 100644 --- a/src/main/java/com/jozufozu/flywheel/core/layout/CommonItems.java +++ b/src/main/java/com/jozufozu/flywheel/core/layout/CommonItems.java @@ -10,12 +10,23 @@ public class CommonItems { private static final String VEC4_TYPE = "vec4"; private static final String VEC2_TYPE = "vec2"; private static final String FLOAT_TYPE = "float"; + private static final String IVEC2_TYPE = "ivec2"; + private static final String UINT_TYPE = "uint"; + private static final String VEC4F_TYPE = "Vec4F"; + private static final String VEC3F_TYPE = "Vec3F"; + private static final String LIGHT_COORD_TYPE = "LightCoord"; + public static final PrimitiveItem LIGHT_COORD = PrimitiveItem.builder() + .setAttribute(new VertexAttributeI(GlNumericType.USHORT, 2)) + .setTypeName(IVEC2_TYPE) + .setPackedTypeName(LIGHT_COORD_TYPE) + .unpack(expr -> expr.callFunction("unpackLightCoord")) + .createPrimitiveItem(); + public static final PrimitiveItem FLOAT = PrimitiveItem.builder() .setAttribute(new VertexAttributeF(GlNumericType.FLOAT, 1, false)) .setTypeName(FLOAT_TYPE) .setPackedTypeName(FLOAT_TYPE) .createPrimitiveItem(); - private static final String UINT_TYPE = "uint"; public static final PrimitiveItem NORM_3x8 = PrimitiveItem.builder() .setAttribute(new VertexAttributeF(GlNumericType.BYTE, 3, true)) .setTypeName(VEC3_TYPE) @@ -36,35 +47,25 @@ public class CommonItems { .unpack(expr -> expr.callFunction("unpackUnorm4x8") .swizzle("xyz")) .createPrimitiveItem(); - private static final String IVEC2_TYPE = "ivec2"; - private static final String VEC4F_TYPE = "Vec4F"; public static final PrimitiveItem VEC4 = PrimitiveItem.builder() .setAttribute(new VertexAttributeF(GlNumericType.FLOAT, 4, false)) .setTypeName(VEC4_TYPE) .setPackedTypeName(VEC4F_TYPE) .unpack(expr -> expr.callFunction("unpackVec4F")) .createPrimitiveItem(); - private static final String VEC3F_TYPE = "Vec3F"; public static final PrimitiveItem VEC3 = PrimitiveItem.builder() .setAttribute(new VertexAttributeF(GlNumericType.FLOAT, 3, false)) .setTypeName(VEC3_TYPE) .setPackedTypeName(VEC3F_TYPE) .unpack(expr -> expr.callFunction("unpackVec3F")) .createPrimitiveItem(); - private static final String VEC2F_TYPE = "Vec2F"; public static final PrimitiveItem VEC2 = PrimitiveItem.builder() .setAttribute(new VertexAttributeF(GlNumericType.FLOAT, 2, false)) .setTypeName(VEC2_TYPE) .setPackedTypeName(VEC2F_TYPE) .unpack(expr -> expr.callFunction("unpackVec2F")) .createPrimitiveItem(); - private static final String LIGHT_COORD_TYPE = "LightCoord"; - public static final PrimitiveItem LIGHT_COORD = PrimitiveItem.builder() - .setAttribute(new VertexAttributeI(GlNumericType.USHORT, 2)) - .setTypeName(VEC2_TYPE) - .setPackedTypeName(LIGHT_COORD_TYPE) - .unpack(expr -> expr.callFunction("unpackLightCoord")) - .createPrimitiveItem(); + private static final String VEC2F_TYPE = "Vec2F"; public static final MatrixItem MAT3 = new MatrixItem(3, 3, "mat3", "Mat3F", "unpackMat3F"); diff --git a/src/main/java/com/jozufozu/flywheel/core/source/CompilationContext.java b/src/main/java/com/jozufozu/flywheel/core/source/CompilationContext.java index 016af40c7..c962694d3 100644 --- a/src/main/java/com/jozufozu/flywheel/core/source/CompilationContext.java +++ b/src/main/java/com/jozufozu/flywheel/core/source/CompilationContext.java @@ -14,6 +14,7 @@ public class CompilationContext { private String generatedSource = ""; private int generatedLines = 0; + String sourceHeader(SourceFile sourceFile) { return "#line " + 0 + ' ' + getOrCreateFileID(sourceFile) + " // " + sourceFile.name + '\n'; } diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/ColoredLitWriter.java b/src/main/java/com/jozufozu/flywheel/core/structs/ColoredLitWriter.java index dcd23aca0..0e33ac94d 100644 --- a/src/main/java/com/jozufozu/flywheel/core/structs/ColoredLitWriter.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/ColoredLitWriter.java @@ -6,12 +6,12 @@ import com.jozufozu.flywheel.api.struct.StructWriter; public abstract class ColoredLitWriter implements StructWriter { @Override - public void write(long ptr, D d) { - MemoryUtil.memPutByte(ptr, d.blockLight); - MemoryUtil.memPutByte(ptr + 1, d.skyLight); - MemoryUtil.memPutByte(ptr + 2, d.r); - MemoryUtil.memPutByte(ptr + 3, d.g); - MemoryUtil.memPutByte(ptr + 4, d.b); - MemoryUtil.memPutByte(ptr + 5, d.a); + public void write(final long ptr, final D d) { + MemoryUtil.memPutShort(ptr, d.blockLight); + MemoryUtil.memPutShort(ptr + 2, d.skyLight); + MemoryUtil.memPutByte(ptr + 4, d.r); + MemoryUtil.memPutByte(ptr + 5, d.g); + MemoryUtil.memPutByte(ptr + 6, d.b); + MemoryUtil.memPutByte(ptr + 7, d.a); } } diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedStorageWriter.java b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedStorageWriter.java deleted file mode 100644 index 17183e8cc..000000000 --- a/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedStorageWriter.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.jozufozu.flywheel.core.structs.oriented; - - -import org.lwjgl.system.MemoryUtil; - -import com.jozufozu.flywheel.api.struct.StorageBufferWriter; - -public class OrientedStorageWriter implements StorageBufferWriter { - - public static final OrientedStorageWriter INSTANCE = new OrientedStorageWriter(); - - private OrientedStorageWriter() { - } - - @Override - public void write(final long ptr, OrientedPart d) { - MemoryUtil.memPutFloat(ptr, d.qX); - MemoryUtil.memPutFloat(ptr + 4, d.qY); - MemoryUtil.memPutFloat(ptr + 8, d.qZ); - MemoryUtil.memPutFloat(ptr + 12, d.qW); - - MemoryUtil.memPutFloat(ptr + 16, d.posX); - MemoryUtil.memPutFloat(ptr + 20, d.posY); - MemoryUtil.memPutFloat(ptr + 24, d.posZ); - - MemoryUtil.memPutFloat(ptr + 28, d.pivotX); - MemoryUtil.memPutFloat(ptr + 32, d.pivotY); - MemoryUtil.memPutFloat(ptr + 36, d.pivotZ); - - MemoryUtil.memPutShort(ptr + 40, d.skyLight); - MemoryUtil.memPutShort(ptr + 42, d.blockLight); - - MemoryUtil.memPutByte(ptr + 44, d.r); - MemoryUtil.memPutByte(ptr + 45, d.g); - MemoryUtil.memPutByte(ptr + 46, d.b); - MemoryUtil.memPutByte(ptr + 47, d.a); - } - - @Override - public int getAlignment() { - return 48; - } -} diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedType.java b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedType.java index 826d4f791..f03134e8e 100644 --- a/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedType.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedType.java @@ -37,11 +37,6 @@ public class OrientedType implements StructType { return OrientedWriter.INSTANCE; } - @Override - public OrientedStorageWriter getStorageBufferWriter() { - return OrientedStorageWriter.INSTANCE; - } - @Override public FileResolution getInstanceShader() { return Components.Files.ORIENTED; diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedWriter.java b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedWriter.java index 8aa99cef4..983e63718 100644 --- a/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedWriter.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedWriter.java @@ -11,15 +11,16 @@ public class OrientedWriter extends ColoredLitWriter { public void write(long ptr, OrientedPart d) { super.write(ptr, d); - MemoryUtil.memPutFloat(ptr + 6, d.posX); - MemoryUtil.memPutFloat(ptr + 10, d.posY); - MemoryUtil.memPutFloat(ptr + 14, d.posZ); - MemoryUtil.memPutFloat(ptr + 18, d.pivotX); - MemoryUtil.memPutFloat(ptr + 22, d.pivotY); - MemoryUtil.memPutFloat(ptr + 26, d.pivotZ); - MemoryUtil.memPutFloat(ptr + 30, d.qX); - MemoryUtil.memPutFloat(ptr + 34, d.qY); - MemoryUtil.memPutFloat(ptr + 38, d.qZ); - MemoryUtil.memPutFloat(ptr + 42, d.qW); + MemoryUtil.memPutFloat(ptr + 8, d.posX); + MemoryUtil.memPutFloat(ptr + 12, d.posY); + MemoryUtil.memPutFloat(ptr + 16, d.posZ); + MemoryUtil.memPutFloat(ptr + 20, d.pivotX); + MemoryUtil.memPutFloat(ptr + 24, d.pivotY); + MemoryUtil.memPutFloat(ptr + 28, d.pivotZ); + MemoryUtil.memPutFloat(ptr + 32, d.qX); + MemoryUtil.memPutFloat(ptr + 36, d.qY); + MemoryUtil.memPutFloat(ptr + 40, d.qZ); + MemoryUtil.memPutFloat(ptr + 44, d.qW); } + } diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedStorageWriter.java b/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedStorageWriter.java deleted file mode 100644 index a9f370442..000000000 --- a/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedStorageWriter.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.jozufozu.flywheel.core.structs.transformed; - -import org.lwjgl.system.MemoryUtil; - -import com.jozufozu.flywheel.api.struct.StorageBufferWriter; -import com.jozufozu.flywheel.extension.MatrixWrite; - -public class TransformedStorageWriter implements StorageBufferWriter { - - public static final TransformedStorageWriter INSTANCE = new TransformedStorageWriter(); - - private TransformedStorageWriter() { - } - - @Override - public void write(long ptr, TransformedPart instance) { - MatrixWrite.writeUnsafe(instance.model, ptr); - MatrixWrite.writeUnsafe(instance.normal, ptr + 64); - MemoryUtil.memPutByte(ptr + 100, instance.r); - MemoryUtil.memPutByte(ptr + 101, instance.g); - MemoryUtil.memPutByte(ptr + 102, instance.b); - MemoryUtil.memPutByte(ptr + 103, instance.a); - MemoryUtil.memPutShort(ptr + 104, instance.skyLight); - MemoryUtil.memPutShort(ptr + 106, instance.blockLight); - } - - @Override - public int getAlignment() { - return 108; - } -} diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedType.java b/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedType.java index 02451b6eb..683f9bbaa 100644 --- a/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedType.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedType.java @@ -1,6 +1,5 @@ package com.jozufozu.flywheel.core.structs.transformed; -import com.jozufozu.flywheel.api.struct.StorageBufferWriter; import com.jozufozu.flywheel.api.struct.StructType; import com.jozufozu.flywheel.api.struct.StructWriter; import com.jozufozu.flywheel.core.Components; @@ -34,11 +33,6 @@ public class TransformedType implements StructType { return TransformedWriter.INSTANCE; } - @Override - public StorageBufferWriter getStorageBufferWriter() { - return TransformedStorageWriter.INSTANCE; - } - @Override public FileResolution getInstanceShader() { return Components.Files.TRANSFORMED; diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedWriter.java b/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedWriter.java index 8e708d98e..da958341a 100644 --- a/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedWriter.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedWriter.java @@ -7,11 +7,10 @@ public class TransformedWriter extends ColoredLitWriter { public static final TransformedWriter INSTANCE = new TransformedWriter(); @Override - public void write(long ptr, TransformedPart d) { + public void write(final long ptr, final TransformedPart d) { super.write(ptr, d); - ptr += 6; - - ((MatrixWrite) (Object) d.model).flywheel$writeUnsafe(ptr); - ((MatrixWrite) (Object) d.normal).flywheel$writeUnsafe(ptr + 4 * 16); + MatrixWrite.writeUnsafe(d.model, ptr + 8); + MatrixWrite.writeUnsafe(d.normal, ptr + 72); } + } diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedWriterUnsafe.java b/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedWriterUnsafe.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/assets/flywheel/flywheel/instance/oriented.vert b/src/main/resources/assets/flywheel/flywheel/instance/oriented.vert index 34c29a142..73eac352e 100644 --- a/src/main/resources/assets/flywheel/flywheel/instance/oriented.vert +++ b/src/main/resources/assets/flywheel/flywheel/instance/oriented.vert @@ -15,6 +15,6 @@ void flw_instanceVertex(in FlwInstance i) { flw_vertexPos = vec4(rotateVertexByQuat(flw_vertexPos.xyz - i.pivot, i.rotation) + i.pivot + i.position, 1.0); flw_vertexNormal = rotateVertexByQuat(flw_vertexNormal, i.rotation); flw_vertexColor = i.color; - flw_vertexLight = i.light; + flw_vertexLight = i.light / 15.0; } #endif diff --git a/src/main/resources/assets/flywheel/flywheel/instance/transformed.vert b/src/main/resources/assets/flywheel/flywheel/instance/transformed.vert index 78fcaa831..2ad3fe34c 100644 --- a/src/main/resources/assets/flywheel/flywheel/instance/transformed.vert +++ b/src/main/resources/assets/flywheel/flywheel/instance/transformed.vert @@ -14,6 +14,6 @@ void flw_instanceVertex(in FlwInstance i) { flw_vertexPos = i.pose * flw_vertexPos; flw_vertexNormal = i.normal * flw_vertexNormal; flw_vertexColor = i.color; - flw_vertexLight = i.light; + flw_vertexLight = i.light / 15.0; } #endif diff --git a/src/main/resources/assets/flywheel/flywheel/layout/block.vert b/src/main/resources/assets/flywheel/flywheel/layout/block.vert index 4123724aa..a3af3b16d 100644 --- a/src/main/resources/assets/flywheel/flywheel/layout/block.vert +++ b/src/main/resources/assets/flywheel/flywheel/layout/block.vert @@ -5,7 +5,6 @@ layout(location = 1) in vec4 _flw_v_color; layout(location = 2) in vec2 _flw_v_texCoord; layout(location = 3) in ivec2 _flw_v_light; layout(location = 4) in vec3 _flw_v_normal; -#define FLW_INSTANCE_BASE_INDEX 5 void flw_layoutVertex() { flw_vertexPos = vec4(_flw_v_pos, 1.0); diff --git a/src/main/resources/assets/flywheel/flywheel/layout/pos_tex_normal.vert b/src/main/resources/assets/flywheel/flywheel/layout/pos_tex_normal.vert index 80b02f8bc..4ecfb2c3c 100644 --- a/src/main/resources/assets/flywheel/flywheel/layout/pos_tex_normal.vert +++ b/src/main/resources/assets/flywheel/flywheel/layout/pos_tex_normal.vert @@ -3,7 +3,6 @@ layout(location = 0) in vec3 _flw_v_pos; layout(location = 1) in vec2 _flw_v_texCoord; layout(location = 2) in vec3 _flw_v_normal; -#define FLW_INSTANCE_BASE_INDEX 3 void flw_layoutVertex() { flw_vertexPos = vec4(_flw_v_pos, 1.0); diff --git a/src/main/resources/assets/flywheel/flywheel/util/types.glsl b/src/main/resources/assets/flywheel/flywheel/util/types.glsl index 731e81357..8d4825e92 100644 --- a/src/main/resources/assets/flywheel/flywheel/util/types.glsl +++ b/src/main/resources/assets/flywheel/flywheel/util/types.glsl @@ -66,6 +66,6 @@ void unpackBoundingSphere(in BoundingSphere sphere, out vec3 center, out float r radius = sphere.radius; } -vec2 unpackLightCoord(in LightCoord light) { - return vec2(float((light.p >> 16) & 0xFFFFu), float(light.p & 0xFFFFu)) / 15.0; +ivec2 unpackLightCoord(in LightCoord light) { + return ivec2(light.p & 0xFFFFu, (light.p >> 16) & 0xFFFFu); }