Skip to content

Commit

Permalink
Use vertex buffer offsets instead of pointers
Browse files Browse the repository at this point in the history
  • Loading branch information
IMS212 committed Aug 24, 2024
1 parent ae1e7b1 commit cb049f5
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 20 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package net.irisshaders.iris.mixin;

import com.mojang.blaze3d.vertex.ByteBufferBuilder;
import net.irisshaders.iris.vertices.MojangBufferAccessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;

@Mixin(ByteBufferBuilder.class)
public class MixinByteBufferBuilder implements MojangBufferAccessor {
@Shadow
long pointer;

@Override
public long getPointer() {
return this.pointer;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.irisshaders.iris.mixin.vertices;

import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.ByteBufferBuilder;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.blaze3d.vertex.VertexFormat;
Expand All @@ -12,6 +13,7 @@
import net.irisshaders.iris.vertices.ExtendedDataHelper;
import net.irisshaders.iris.vertices.ImmediateState;
import net.irisshaders.iris.vertices.IrisVertexFormats;
import net.irisshaders.iris.vertices.MojangBufferAccessor;
import net.irisshaders.iris.vertices.NormI8;
import net.irisshaders.iris.vertices.NormalHelper;
import org.joml.Vector3f;
Expand Down Expand Up @@ -76,14 +78,18 @@ public abstract class MixinBufferBuilder implements VertexConsumer, BlockSensiti
@Unique
private int currentLocalPosZ;
@Unique
private final long[] vertexPointers = new long[4];
private final long[] vertexOffsets = new long[4];

@Shadow
public abstract VertexConsumer setNormal(float f, float g, float h);

@Shadow
protected abstract long beginElement(VertexFormatElement vertexFormatElement);

@Shadow
@Final
private ByteBufferBuilder buffer;

@ModifyVariable(method = "<init>", at = @At(value = "FIELD", target = "Lcom/mojang/blaze3d/vertex/VertexFormatElement;POSITION:Lcom/mojang/blaze3d/vertex/VertexFormatElement;", ordinal = 0), argsOnly = true)
private VertexFormat iris$extendFormat(VertexFormat format) {
boolean iris$isTerrain = false;
Expand Down Expand Up @@ -170,7 +176,7 @@ private void injectMidBlock(float x, float y, float z, CallbackInfoReturnable<Ve
return;
}

vertexPointers[iris$vertexCount] = vertexPointer;
vertexOffsets[iris$vertexCount] = vertexPointer - ((MojangBufferAccessor) buffer).getPointer();

iris$vertexCount++;

Expand Down Expand Up @@ -203,7 +209,7 @@ private void fillExtendedData(int vertexAmount) {

int stride = format.getVertexSize();

polygon.setup(vertexPointers, stride, vertexAmount);
polygon.setup(((MojangBufferAccessor) buffer).getPointer(), vertexOffsets, stride, vertexAmount);

float midU = 0;
float midV = 0;
Expand All @@ -223,27 +229,30 @@ private void fillExtendedData(int vertexAmount) {
// NormalHelper.computeFaceNormalTri(normal, polygon); // Removed to enable smooth shaded triangles. Mods rendering triangles with bad normals need to recalculate their normals manually or otherwise shading might be inconsistent.

for (int vertex = 0; vertex < vertexAmount; vertex++) {
int vertexNormal = MemoryUtil.memGetInt(vertexPointers[vertex] + normalOffset); // retrieve per-vertex normal
long newPointer = ((MojangBufferAccessor) buffer).getPointer() + vertexOffsets[vertex];
int vertexNormal = MemoryUtil.memGetInt(newPointer + normalOffset); // retrieve per-vertex normal

int tangent = NormalHelper.computeTangentSmooth(NormI8.unpackX(vertexNormal), NormI8.unpackY(vertexNormal), NormI8.unpackZ(vertexNormal), polygon);

MemoryUtil.memPutFloat(vertexPointers[vertex] + midTexOffset, midU);
MemoryUtil.memPutFloat(vertexPointers[vertex] + midTexOffset + 4, midV);
MemoryUtil.memPutInt(vertexPointers[vertex] + tangentOffset, tangent);
MemoryUtil.memPutFloat(newPointer + midTexOffset, midU);
MemoryUtil.memPutFloat(newPointer + midTexOffset + 4, midV);
MemoryUtil.memPutInt(newPointer + tangentOffset, tangent);
}
} else {
NormalHelper.computeFaceNormal(normal, polygon);
int packedNormal = NormI8.pack(normal.x, normal.y, normal.z, 0.0f);
int tangent = NormalHelper.computeTangent(normal.x, normal.y, normal.z, polygon);

for (int vertex = 0; vertex < vertexAmount; vertex++) {
MemoryUtil.memPutFloat(vertexPointers[vertex] + midTexOffset, midU);
MemoryUtil.memPutFloat(vertexPointers[vertex] + midTexOffset + 4, midV);
MemoryUtil.memPutInt(vertexPointers[vertex] + normalOffset, packedNormal);
MemoryUtil.memPutInt(vertexPointers[vertex] + tangentOffset, tangent);
long newPointer = ((MojangBufferAccessor) buffer).getPointer() + vertexOffsets[vertex];

MemoryUtil.memPutFloat(newPointer + midTexOffset, midU);
MemoryUtil.memPutFloat(newPointer + midTexOffset + 4, midV);
MemoryUtil.memPutInt(newPointer + normalOffset, packedNormal);
MemoryUtil.memPutInt(newPointer + tangentOffset, tangent);
}
}

Arrays.fill(vertexPointers, 0);
Arrays.fill(vertexOffsets, 0);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,36 @@
import org.lwjgl.system.MemoryUtil;

public class BufferBuilderPolygonView implements QuadView {
private long[] writePointers;
private long[] writeOffsets;
private long pointer;

public void setup(long[] writePointers, int stride, int vertexAmount) {
this.writePointers = writePointers;
public void setup(long pointer, long[] writeOffsets, int stride, int vertexAmount) {
this.pointer = pointer;
this.writeOffsets = writeOffsets;
}

@Override
public float x(int index) {
return MemoryUtil.memGetFloat(writePointers[index]);
return MemoryUtil.memGetFloat(pointer + writeOffsets[index]);
}

@Override
public float y(int index) {
return MemoryUtil.memGetFloat(writePointers[index] + 4);
return MemoryUtil.memGetFloat(pointer + writeOffsets[index] + 4);
}

@Override
public float z(int index) {
return MemoryUtil.memGetFloat(writePointers[index] + 8);
return MemoryUtil.memGetFloat(pointer + writeOffsets[index] + 8);
}

@Override
public float u(int index) {
return MemoryUtil.memGetFloat(writePointers[index] + 16);
return MemoryUtil.memGetFloat(pointer + writeOffsets[index] + 16);
}

@Override
public float v(int index) {
return MemoryUtil.memGetFloat(writePointers[index] + 20);
return MemoryUtil.memGetFloat(pointer + writeOffsets[index] + 20);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package net.irisshaders.iris.vertices;

public interface MojangBufferAccessor {
long getPointer();
}
1 change: 1 addition & 0 deletions common/src/main/resources/mixins.iris.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"MixinBiomes",
"MixinBlockStateBehavior",
"MixinBooleanState",
"MixinByteBufferBuilder",
"MixinChainedJsonException",
"MixinClientLanguage",
"MixinClientPacketListener",
Expand Down

0 comments on commit cb049f5

Please sign in to comment.