This commit is contained in:
mcrcortex
2025-03-28 09:54:32 +10:00
parent 8b3f8812de
commit e0314de4f6
2 changed files with 29 additions and 22 deletions

View File

@@ -20,6 +20,14 @@ import java.util.Map;
public class RenderDataFactory45 { public class RenderDataFactory45 {
private static final boolean VERIFY_MESHING = VoxyCommon.isVerificationFlagOn("verifyMeshing"); private static final boolean VERIFY_MESHING = VoxyCommon.isVerificationFlagOn("verifyMeshing");
//TODO: MAKE a render cache that caches each WorldSection directional face generation, cause then can just pull that directly
// instead of needing to regen the entire thing
//Ok so the idea for fluid rendering is to make it use a seperate mesher and use a different code path for it
// since fluid states are explicitly overlays over the base block
// can do funny stuff like double rendering
private final WorldEngine world; private final WorldEngine world;
private final ModelFactory modelMan; private final ModelFactory modelMan;
@@ -121,8 +129,11 @@ public class RenderDataFactory45 {
long quad = data | Integer.toUnsignedLong(encodedPosition); long quad = data | Integer.toUnsignedLong(encodedPosition);
MemoryUtil.memPutLong(RenderDataFactory45.this.directionalQuadBufferPtr + (RenderDataFactory45.this.directionalQuadCounters[face]++)*8L + face*8L*(1<<16), quad); MemoryUtil.memPutLong(RenderDataFactory45.this.directionalQuadBufferPtr + (RenderDataFactory45.this.directionalQuadCounters[face]++)*8L + face*8L*(1<<16), quad);
//Update AABB bounds //Update AABB bounds
if (axis == 0) {//Y if (axis == 0) {//Y
RenderDataFactory45.this.minY = Math.min(RenderDataFactory45.this.minY, auxPos); RenderDataFactory45.this.minY = Math.min(RenderDataFactory45.this.minY, auxPos);

View File

@@ -131,32 +131,12 @@ public class RenderDataFactory5 {
this.modelMan = modelManager; this.modelMan = modelManager;
} }
private int prepareSectionData() {
//TODO: MAKE a render cache that caches each WorldSection directional face generation, cause then can just pull that directly
// instead of needing to regen the entire thing
//Ok so the idea for fluid rendering is to make it use a seperate mesher and use a different code path for it
// since fluid states are explicitly overlays over the base block
// can do funny stuff like double rendering
private static final boolean USE_UINT64 = Capabilities.INSTANCE.INT64_t;
public static final int QUADS_PER_MESHLET = 14;
private static void writePos(long ptr, long pos) {
if (USE_UINT64) {
MemoryUtil.memPutLong(ptr, pos);
} else {
MemoryUtil.memPutInt(ptr, (int) (pos>>32));
MemoryUtil.memPutInt(ptr + 4, (int)pos);
}
}
private void prepareSectionData() {
final var sectionData = this.sectionData; final var sectionData = this.sectionData;
int opaque = 0; int opaque = 0;
int notEmpty = 0; int notEmpty = 0;
int neighborAcquireMsk = 0; int neighborAcquireMsk = 0;//-+x, -+y, -+Z
for (int i = 0; i < 32*32*32;) { for (int i = 0; i < 32*32*32;) {
long block = sectionData[i + 32 * 32 * 32];//Get the block mapping long block = sectionData[i + 32 * 32 * 32];//Get the block mapping
@@ -178,10 +158,26 @@ public class RenderDataFactory5 {
if ((i & 31) == 0) { if ((i & 31) == 0) {
this.opaqueMasks[(i >> 5) - 1] = opaque; this.opaqueMasks[(i >> 5) - 1] = opaque;
this.nonOpaqueMasks[(i >> 5) - 1] = notEmpty^opaque; this.nonOpaqueMasks[(i >> 5) - 1] = notEmpty^opaque;
int neighborMsk = 0;
//-+x
neighborMsk |= notEmpty&1;
neighborMsk |= (notEmpty>>>30)&0b10;
//notEmpty = (notEmpty != 0)?1:0;
neighborMsk |= notEmpty!=0&&((i>>5)&0x1F)==0?0b100:0;//-z
neighborMsk |= notEmpty!=0&&((i>>5)&0x1F)==31?0b1000:0;//+z
neighborMsk |= notEmpty!=0&&(i>>10)==0?0b10000:0;//-y
neighborMsk |= notEmpty!=0&&(i>>10)==31?0b100000:0;//+y
neighborAcquireMsk |= neighborMsk;
opaque = 0; opaque = 0;
notEmpty = 0; notEmpty = 0;
} }
} }
return neighborAcquireMsk;
} }