diff --git a/src/main/java/io/github/cottonmc/templates/model/AffineQuadTransformer.java b/src/main/java/io/github/cottonmc/templates/model/AffineQuadTransformer.java deleted file mode 100644 index 816e604..0000000 --- a/src/main/java/io/github/cottonmc/templates/model/AffineQuadTransformer.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.cottonmc.templates.model; - -import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; -import net.minecraft.util.math.AffineTransformation; -import org.joml.Matrix4f; -import org.joml.Vector3f; -import org.joml.Vector4f; - -public record AffineQuadTransformer(Matrix4f affineMatrix) implements RenderContext.QuadTransform { - public AffineQuadTransformer(AffineTransformation aff) { - this(aff.getMatrix()); - } - - @Override - public boolean transform(MutableQuadView quad) { - Vector3f pos3 = new Vector3f(); - Vector4f pos4 = new Vector4f(); //ugh - - for(int i = 0; i < 4; i++) { - //Copy pos into a vec3, then a vec4. the w component is set to 0 since this is a point, not a normal - quad.copyPos(i, pos3); - //kinda a hack to center the affine transformation not at 0,0,0 - //it's an *affine* transformation, they can rotate around the not-origin... should modify the transformation instead? - pos3.add(-0.5f, -0.5f, -0.5f); - pos4.set(pos3, 0); - - //Compute the matrix-vector product. This function mutates the vec4 in-place. - //Note that `transformAffine` has the same purpose as `transform`; the difference is it - //assumes (without checking) that the last row of the matrix is 0,0,0,1, as an optimization - affineMatrix.transformAffine(pos4); - - //Manually copy the data back onto the vertex - quad.pos(i, pos4.x + 0.5f, pos4.y + 0.5f, pos4.z + 0.5f); - } - - return true; - } -} diff --git a/src/main/java/io/github/cottonmc/templates/model/MatrixMeshTransformer.java b/src/main/java/io/github/cottonmc/templates/model/MatrixMeshTransformer.java new file mode 100644 index 0000000..3b04dda --- /dev/null +++ b/src/main/java/io/github/cottonmc/templates/model/MatrixMeshTransformer.java @@ -0,0 +1,57 @@ +package io.github.cottonmc.templates.model; + +import io.github.cottonmc.templates.TemplatesClient; +import net.fabricmc.fabric.api.renderer.v1.Renderer; +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.minecraft.util.math.AffineTransformation; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import org.joml.Vector4f; + +/** + * Transforms the position of each vertex in a `Mesh`. + * The transformation's origin is bumped to (0.5, 0.5, 0.5) just because it's more convenient for me lol. + */ +public class MatrixMeshTransformer { + public static Mesh transformAroundCenter(AffineTransformation aff, Mesh oldMesh) { + return transformAroundCenter(aff.getMatrix(), oldMesh); + } + + public static Mesh transformAroundCenter(Matrix4f mat, Mesh oldMesh) { + Renderer r = TemplatesClient.getFabricRenderer(); + MeshBuilder newMesh = r.meshBuilder(); + QuadEmitter emitter = newMesh.getEmitter(); + + //re-used buffers + Vector3f pos3 = new Vector3f(); + Vector4f pos4 = new Vector4f(); + + oldMesh.forEach(oldQuad -> { + //Initialize the new quad + emitter.copyFrom(oldQuad); + + //For each vertex: + for(int i = 0; i < 4; i++) { + //Copy pos into a vec3, then a vec4. the w component is set to 0 since this is a point, not a normal + emitter.copyPos(i, pos3); + pos3.add(-0.5f, -0.5f, -0.5f); + pos4.set(pos3, 0); + + //Compute the matrix-vector product. This function mutates the vec4 in-place. + //Note that `transformAffine` has the same purpose as `transform`; the difference is it + //assumes (without checking) that the last row of the matrix is 0,0,0,1, as an optimization + mat.transform(pos4); + + //Manually copy the data back onto the vertex + emitter.pos(i, pos4.x + 0.5f, pos4.y + 0.5f, pos4.z + 0.5f); + } + + //Output the quad + emitter.emit(); + }); + + return newMesh.build(); + } +} diff --git a/src/main/java/io/github/cottonmc/templates/model/TemplateBakedModel.java b/src/main/java/io/github/cottonmc/templates/model/TemplateBakedModel.java index 9ff3a4c..ded3e04 100644 --- a/src/main/java/io/github/cottonmc/templates/model/TemplateBakedModel.java +++ b/src/main/java/io/github/cottonmc/templates/model/TemplateBakedModel.java @@ -31,8 +31,7 @@ public final class TemplateBakedModel extends ForwardingBakedModel { this.wrapped = baseModel; this.tam = tam; - this.affineTransformer = new AffineQuadTransformer(aff); - this.baseMesh = baseMesh; + this.baseMesh = MatrixMeshTransformer.transformAroundCenter(aff, baseMesh); //Hard to explain what this is for... //Basically, the previous incarnation of this mod assembled the north/south/east/west faces all individually. @@ -50,7 +49,6 @@ public final class TemplateBakedModel extends ForwardingBakedModel { } private final TemplateAppearanceManager tam; - private final AffineQuadTransformer affineTransformer; private final Mesh baseMesh; private final Map facePermutation = new EnumMap<>(Direction.class); @@ -62,20 +60,16 @@ public final class TemplateBakedModel extends ForwardingBakedModel { @Override public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { - context.pushTransform(affineTransformer); context.pushTransform(retexturingBlockTransformer(blockView, state, pos, randomSupplier)); context.meshConsumer().accept(baseMesh); context.popTransform(); - context.popTransform(); } @Override public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { - context.pushTransform(affineTransformer); context.pushTransform(retexturingItemTransformer(stack, randomSupplier)); context.meshConsumer().accept(baseMesh); context.popTransform(); - context.popTransform(); } @Override