Graphics Programming 0

- Fixed factory gauges not rendering with correct normals. Probably.
This commit is contained in:
simibubi 2024-12-11 19:04:19 +01:00
parent de60a86abf
commit f8fc832a18
2 changed files with 36 additions and 2 deletions

View file

@ -82,17 +82,34 @@ public class FactoryPanelModel extends BakedModelWrapperWithData {
for (BakedQuad bakedQuad : quadsToAdd) {
int[] vertices = bakedQuad.getVertices();
int[] transformedVertices = Arrays.copyOf(vertices, vertices.length);
Vec3 quadNormal = Vec3.atLowerCornerOf(bakedQuad.getDirection()
.getNormal());
quadNormal = VecHelper.rotate(quadNormal, 180, Axis.Y);
quadNormal = VecHelper.rotate(quadNormal, xRot + 90, Axis.X);
quadNormal = VecHelper.rotate(quadNormal, yRot, Axis.Y);
for (int i = 0; i < vertices.length / BakedQuadHelper.VERTEX_STRIDE; i++) {
Vec3 vertex = BakedQuadHelper.getXYZ(vertices, i);
Vec3 normal = BakedQuadHelper.getNormalXYZ(vertices, i);
vertex = vertex.add(slot.xOffset * .5, 0, slot.yOffset * .5);
vertex = VecHelper.rotateCentered(vertex, 180, Axis.Y);
vertex = VecHelper.rotateCentered(vertex, xRot + 90, Axis.X);
vertex = VecHelper.rotateCentered(vertex, yRot, Axis.Y);
normal = VecHelper.rotate(normal, 180, Axis.Y);
normal = VecHelper.rotate(normal, xRot + 90, Axis.X);
normal = VecHelper.rotate(normal, yRot, Axis.Y);
BakedQuadHelper.setXYZ(transformedVertices, i, vertex);
BakedQuadHelper.setNormalXYZ(transformedVertices, i, new Vec3(0, 1, 0));
}
quads.add(BakedQuadHelper.cloneWithCustomGeometry(bakedQuad, transformedVertices));
Direction newNormal = Direction.fromDelta((int) Math.round(quadNormal.x), (int) Math.round(quadNormal.y),
(int) Math.round(quadNormal.z));
quads.add(new BakedQuad(transformedVertices, bakedQuad.getTintIndex(), newNormal, bakedQuad.getSprite(),
bakedQuad.isShade()));
}
}

View file

@ -6,6 +6,7 @@ import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.VertexFormat;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.util.Mth;
import net.minecraft.world.phys.Vec3;
public final class BakedQuadHelper {
@ -46,6 +47,22 @@ public final class BakedQuadHelper {
vertexData[vertex * VERTEX_STRIDE + Z_OFFSET] = Float.floatToRawIntBits((float) xyz.z);
}
public static Vec3 getNormalXYZ(int[] vertexData, int vertex) {
int data = vertexData[vertex * VERTEX_STRIDE + NORMAL_OFFSET];
float x = (byte) (data >> 24 & 0xFF) / 127f;
float y = (byte) (data >> 16 & 0xFF) / 127f;
float z = (byte) (data >> 8 & 0xFF) / 127f;
return new Vec3(x, y, z);
}
public static void setNormalXYZ(int[] vertexData, int vertex, Vec3 xyz) {
int x = Byte.toUnsignedInt((byte) (Mth.clamp(xyz.x, -1.0f, 1.0f) * 127));
int y = Byte.toUnsignedInt((byte) (Mth.clamp(xyz.y, -1.0f, 1.0f) * 127));
int z = Byte.toUnsignedInt((byte) (Mth.clamp(xyz.z, -1.0f, 1.0f) * 127));
int data = (x << 24) | (y << 16) | (z << 8);
vertexData[vertex * VERTEX_STRIDE + NORMAL_OFFSET] = data;
}
public static float getU(int[] vertexData, int vertex) {
return Float.intBitsToFloat(vertexData[vertex * VERTEX_STRIDE + U_OFFSET]);
}