Began work on config, found out that i dont think occlusion culling is doing occlusion culling
This commit is contained in:
@@ -44,7 +44,12 @@ dependencies {
|
|||||||
modImplementation(fabricApi.module("fabric-command-api-v2", project.fabric_version))
|
modImplementation(fabricApi.module("fabric-command-api-v2", project.fabric_version))
|
||||||
modImplementation("net.fabricmc.fabric-api:fabric-rendering-data-attachment-v1:0.3.38+73761d2e9a")
|
modImplementation("net.fabricmc.fabric-api:fabric-rendering-data-attachment-v1:0.3.38+73761d2e9a")
|
||||||
|
|
||||||
|
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
||||||
|
|
||||||
modImplementation "maven.modrinth:sodium:mc1.20.3-0.5.5"
|
modImplementation "maven.modrinth:sodium:mc1.20.3-0.5.5"
|
||||||
|
|
||||||
|
modImplementation("maven.modrinth:cloth-config:13.0.121+fabric")
|
||||||
|
modImplementation("maven.modrinth:modmenu:9.0.0")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package me.cortex.zenith.client.config;
|
||||||
|
|
||||||
|
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
|
||||||
|
import com.terraformersmc.modmenu.api.ModMenuApi;
|
||||||
|
|
||||||
|
public class ScreenFactory implements ModMenuApi {
|
||||||
|
@Override
|
||||||
|
public ConfigScreenFactory<?> getModConfigScreenFactory() {
|
||||||
|
return parent -> null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package me.cortex.zenith.client.config;
|
||||||
|
|
||||||
|
public class ZenithConfig {
|
||||||
|
int qualityScale;
|
||||||
|
int ingestThreads;
|
||||||
|
int savingThreads;
|
||||||
|
int renderThreads;
|
||||||
|
int savingCompressionLevel;
|
||||||
|
StorageConfig storageConfig;
|
||||||
|
|
||||||
|
public static abstract class StorageConfig { }
|
||||||
|
public static class FragmentedStorageConfig extends StorageConfig { }
|
||||||
|
public static class LmdbStorageConfig extends StorageConfig { }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package me.cortex.zenith.client.config;
|
||||||
|
|
||||||
|
import com.terraformersmc.modmenu.api.ModMenuApi;
|
||||||
|
|
||||||
|
public class ZenithConfigScreenFactory implements ModMenuApi {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -9,6 +9,7 @@ import me.cortex.zenith.client.core.other.BlockStateColour;
|
|||||||
import me.cortex.zenith.client.core.other.ColourResolver;
|
import me.cortex.zenith.client.core.other.ColourResolver;
|
||||||
import me.cortex.zenith.common.world.other.Mapper;
|
import me.cortex.zenith.common.world.other.Mapper;
|
||||||
import me.cortex.zenith.client.importers.WorldImporter;
|
import me.cortex.zenith.client.importers.WorldImporter;
|
||||||
|
import me.cortex.zenith.common.world.storage.SplicedStorageBackendAdaptor;
|
||||||
import me.cortex.zenith.common.world.storage.lmdb.LMDBStorageBackend;
|
import me.cortex.zenith.common.world.storage.lmdb.LMDBStorageBackend;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
@@ -65,17 +66,17 @@ public class VoxelCore {
|
|||||||
SharedIndexBuffer.INSTANCE.id();
|
SharedIndexBuffer.INSTANCE.id();
|
||||||
this.renderer = new Gl46FarWorldRenderer();
|
this.renderer = new Gl46FarWorldRenderer();
|
||||||
System.out.println("Renderer initialized");
|
System.out.println("Renderer initialized");
|
||||||
this.world = new WorldEngine(new LMDBStorageBackend(new File("storagefile.db")), 2, 20, 5);//"storagefile.db"//"ethoslab.db"
|
this.world = new WorldEngine(new SplicedStorageBackendAdaptor(), 2, 20, 5);//"storagefile.db"//"ethoslab.db"
|
||||||
System.out.println("World engine");
|
System.out.println("World engine");
|
||||||
|
|
||||||
this.renderTracker = new RenderTracker(this.world, this.renderer);
|
this.renderTracker = new RenderTracker(this.world, this.renderer);
|
||||||
this.renderGen = new RenderGenerationService(this.world,5, this.renderTracker::processBuildResult);
|
this.renderGen = new RenderGenerationService(this.world,7, this.renderTracker::processBuildResult);
|
||||||
this.world.setDirtyCallback(this.renderTracker::sectionUpdated);
|
this.world.setDirtyCallback(this.renderTracker::sectionUpdated);
|
||||||
this.renderTracker.setRenderGen(this.renderGen);
|
this.renderTracker.setRenderGen(this.renderGen);
|
||||||
System.out.println("Render tracker and generator initialized");
|
System.out.println("Render tracker and generator initialized");
|
||||||
|
|
||||||
//To get to chunk scale multiply the scale by 2, the scale is after how many chunks does the lods halve
|
//To get to chunk scale multiply the scale by 2, the scale is after how many chunks does the lods halve
|
||||||
this.distanceTracker = new DistanceTracker(this.renderTracker, 5, 20);//16
|
this.distanceTracker = new DistanceTracker(this.renderTracker, 5, 64);//16
|
||||||
System.out.println("Distance tracker initialized");
|
System.out.println("Distance tracker initialized");
|
||||||
|
|
||||||
this.postProcessing = null;//new PostProcessing();
|
this.postProcessing = null;//new PostProcessing();
|
||||||
|
|||||||
@@ -23,26 +23,27 @@ import static org.lwjgl.opengl.GL42.*;
|
|||||||
import static org.lwjgl.opengl.GL42.GL_FRAMEBUFFER_BARRIER_BIT;
|
import static org.lwjgl.opengl.GL42.GL_FRAMEBUFFER_BARRIER_BIT;
|
||||||
import static org.lwjgl.opengl.GL43.*;
|
import static org.lwjgl.opengl.GL43.*;
|
||||||
import static org.lwjgl.opengl.GL43.GL_SHADER_STORAGE_BUFFER;
|
import static org.lwjgl.opengl.GL43.GL_SHADER_STORAGE_BUFFER;
|
||||||
|
import static org.lwjgl.opengl.NVRepresentativeFragmentTest.GL_REPRESENTATIVE_FRAGMENT_TEST_NV;
|
||||||
|
|
||||||
public class Gl46FarWorldRenderer extends AbstractFarWorldRenderer {
|
public class Gl46FarWorldRenderer extends AbstractFarWorldRenderer {
|
||||||
private final Shader commandGen = Shader.make()
|
private final Shader commandGen = Shader.make()
|
||||||
.add(ShaderType.COMPUTE, "voxelmon:lod/gl46/cmdgen.comp")
|
.add(ShaderType.COMPUTE, "zenith:lod/gl46/cmdgen.comp")
|
||||||
.compile();
|
.compile();
|
||||||
|
|
||||||
private final Shader lodShader = Shader.make()
|
private final Shader lodShader = Shader.make()
|
||||||
.add(ShaderType.VERTEX, "voxelmon:lod/gl46/quads.vert")
|
.add(ShaderType.VERTEX, "zenith:lod/gl46/quads.vert")
|
||||||
.add(ShaderType.FRAGMENT, "voxelmon:lod/gl46/quads.frag")
|
.add(ShaderType.FRAGMENT, "zenith:lod/gl46/quads.frag")
|
||||||
.compile();
|
.compile();
|
||||||
|
|
||||||
|
|
||||||
//TODO: Note the cull shader needs a different element array since its rastering cubes not quads
|
//TODO: Note the cull shader needs a different element array since its rastering cubes not quads
|
||||||
private final Shader cullShader = Shader.make()
|
private final Shader cullShader = Shader.make()
|
||||||
.add(ShaderType.VERTEX, "voxelmon:lod/gl46/cull/raster.vert")
|
.add(ShaderType.VERTEX, "zenith:lod/gl46/cull/raster.vert")
|
||||||
.add(ShaderType.FRAGMENT, "voxelmon:lod/gl46/cull/raster.frag")
|
.add(ShaderType.FRAGMENT, "zenith:lod/gl46/cull/raster.frag")
|
||||||
.compile();
|
.compile();
|
||||||
|
|
||||||
private final GlBuffer glCommandBuffer = new GlBuffer(100_000*5*4, 0);
|
private final GlBuffer glCommandBuffer = new GlBuffer(200_000*5*4, 0);
|
||||||
private final GlBuffer glVisibilityBuffer = new GlBuffer(100_000*4, 0);
|
private final GlBuffer glVisibilityBuffer = new GlBuffer(200_000*4, 0);
|
||||||
|
|
||||||
public Gl46FarWorldRenderer() {
|
public Gl46FarWorldRenderer() {
|
||||||
super();
|
super();
|
||||||
@@ -108,6 +109,11 @@ public class Gl46FarWorldRenderer extends AbstractFarWorldRenderer {
|
|||||||
cullShader.bind();
|
cullShader.bind();
|
||||||
glColorMask(false, false, false, false);
|
glColorMask(false, false, false, false);
|
||||||
glDepthMask(false);
|
glDepthMask(false);
|
||||||
|
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glDepthFunc(GL_LEQUAL);
|
||||||
|
//glEnable(GL_REPRESENTATIVE_FRAGMENT_TEST_NV);
|
||||||
|
|
||||||
glDrawElementsInstanced(GL_TRIANGLES, 6 * 2 * 3, GL_UNSIGNED_BYTE, (1 << 16) * 6 * 2, this.geometry.getSectionCount());
|
glDrawElementsInstanced(GL_TRIANGLES, 6 * 2 * 3, GL_UNSIGNED_BYTE, (1 << 16) * 6 * 2, this.geometry.getSectionCount());
|
||||||
glDepthMask(true);
|
glDepthMask(true);
|
||||||
glColorMask(true, true, true, true);
|
glColorMask(true, true, true, true);
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ public class SaveLoadSystem {
|
|||||||
raw.limit(raw.position());
|
raw.limit(raw.position());
|
||||||
raw.rewind();
|
raw.rewind();
|
||||||
ByteBuffer compressedData = MemoryUtil.memAlloc((int)ZSTD_COMPRESSBOUND(raw.remaining()));
|
ByteBuffer compressedData = MemoryUtil.memAlloc((int)ZSTD_COMPRESSBOUND(raw.remaining()));
|
||||||
long compressedSize = ZSTD_compress(compressedData, raw, 15);
|
long compressedSize = ZSTD_compress(compressedData, raw, 7);
|
||||||
compressedData.limit((int) compressedSize);
|
compressedData.limit((int) compressedSize);
|
||||||
compressedData.rewind();
|
compressedData.rewind();
|
||||||
MemoryUtil.memFree(raw);
|
MemoryUtil.memFree(raw);
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
package me.cortex.zenith.common.world.storage;
|
||||||
|
|
||||||
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
|
import me.cortex.zenith.common.world.storage.lmdb.LMDBStorageBackend;
|
||||||
|
import net.minecraft.util.math.random.RandomSeed;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
//Segments the section data into multiple dbs
|
||||||
|
public class SplicedStorageBackendAdaptor extends StorageBackend {
|
||||||
|
private final StorageBackend[] backends = new StorageBackend[32];
|
||||||
|
|
||||||
|
public SplicedStorageBackendAdaptor() {
|
||||||
|
for (int i = 0; i < this.backends.length; i++) {
|
||||||
|
this.backends[i] = new LMDBStorageBackend(new File("db_store/storage-db-"+i+".db"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//public static long getWorldSectionId(int lvl, int x, int y, int z) {
|
||||||
|
// return ((long)lvl<<60)|((long)(y&0xFF)<<52)|((long)(z&((1<<24)-1))<<28)|((long)(x&((1<<24)-1))<<4);//NOTE: 4 bits spare for whatever
|
||||||
|
// }
|
||||||
|
//private int getSegmentId(long key) {
|
||||||
|
// return (int) (((key>>4)&1)|((key>>27)&0b10)|((key>>50)&0b100));
|
||||||
|
//}
|
||||||
|
|
||||||
|
private int getSegmentId(long key) {
|
||||||
|
return (int) (RandomSeed.mixStafford13(RandomSeed.mixStafford13(key)^key)&0x1F);
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: reencode the key to be shifted one less OR
|
||||||
|
// use like a mix64 to shuffle the key in getSegmentId so that
|
||||||
|
// multiple layers of spliced storage backends can be stacked
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ByteBuffer getSectionData(long key) {
|
||||||
|
return this.backends[this.getSegmentId(key)].getSectionData(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSectionData(long key, ByteBuffer data) {
|
||||||
|
this.backends[this.getSegmentId(key)].setSectionData(key, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteSectionData(long key) {
|
||||||
|
this.backends[this.getSegmentId(key)].deleteSectionData(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void putIdMapping(int id, ByteBuffer data) {
|
||||||
|
this.backends[0].putIdMapping(id, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Int2ObjectOpenHashMap<byte[]> getIdMappingsData() {
|
||||||
|
return this.backends[0].getIdMappingsData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void flush() {
|
||||||
|
for (var db : this.backends) {
|
||||||
|
db.flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
for (var db : this.backends) {
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,9 +4,9 @@
|
|||||||
#import <zenith:lod/gl46/bindings.glsl>
|
#import <zenith:lod/gl46/bindings.glsl>
|
||||||
flat in uint id;
|
flat in uint id;
|
||||||
flat in uint value;
|
flat in uint value;
|
||||||
//out vec4 colour;
|
out vec4 colour;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
visibilityData[id] = value;
|
visibilityData[id] = value;
|
||||||
//colour = vec4(float(id&7)/7, float((id>>3)&7)/7, float((id>>6)&7)/7, 1);
|
colour = vec4(float(id&7)/7, float((id>>3)&7)/7, float((id>>6)&7)/7, 1);
|
||||||
}
|
}
|
||||||
@@ -15,6 +15,9 @@
|
|||||||
"entrypoints": {
|
"entrypoints": {
|
||||||
"client": [
|
"client": [
|
||||||
"me.cortex.zenith.client.Voxelmon"
|
"me.cortex.zenith.client.Voxelmon"
|
||||||
|
],
|
||||||
|
"modmenu": [
|
||||||
|
"me.cortex.zenith.client.config.ZenithConfigScreenFactory"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"mixins": [
|
"mixins": [
|
||||||
|
|||||||
Reference in New Issue
Block a user