Iris support v1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'fabric-loom' version '1.2-SNAPSHOT'
|
id 'fabric-loom' version "1.5.7"
|
||||||
id 'maven-publish'
|
id 'maven-publish'
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,11 +49,12 @@ dependencies {
|
|||||||
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
||||||
|
|
||||||
//TODO: this is to eventually not need sodium installed as atm its just used for parsing shaders
|
//TODO: this is to eventually not need sodium installed as atm its just used for parsing shaders
|
||||||
modRuntimeOnly "maven.modrinth:sodium:mc1.20.3-0.5.5"
|
modRuntimeOnly "maven.modrinth:sodium:mc1.20.4-0.5.8"
|
||||||
modCompileOnly "maven.modrinth:sodium:mc1.20.3-0.5.5"
|
modCompileOnly "maven.modrinth:sodium:mc1.20.4-0.5.8"
|
||||||
|
|
||||||
modImplementation("maven.modrinth:cloth-config:13.0.121+fabric")
|
modImplementation("maven.modrinth:cloth-config:13.0.121+fabric")
|
||||||
modImplementation("maven.modrinth:modmenu:9.0.0")
|
modImplementation("maven.modrinth:modmenu:9.0.0")
|
||||||
|
modImplementation("maven.modrinth:iris:1.6.17+1.20.4")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package me.cortex.voxy.client.core;
|
package me.cortex.voxy.client.core;
|
||||||
|
|
||||||
import com.mojang.blaze3d.platform.GlStateManager;
|
import com.mojang.blaze3d.platform.GlStateManager;
|
||||||
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
import me.cortex.voxy.client.config.VoxyConfig;
|
import me.cortex.voxy.client.config.VoxyConfig;
|
||||||
import me.cortex.voxy.client.core.rendering.*;
|
import me.cortex.voxy.client.core.rendering.*;
|
||||||
import me.cortex.voxy.client.core.rendering.building.RenderGenerationService;
|
import me.cortex.voxy.client.core.rendering.building.RenderGenerationService;
|
||||||
@@ -9,6 +10,7 @@ import me.cortex.voxy.client.core.util.DebugUtil;
|
|||||||
import me.cortex.voxy.client.saver.ContextSelectionSystem;
|
import me.cortex.voxy.client.saver.ContextSelectionSystem;
|
||||||
import me.cortex.voxy.common.world.WorldEngine;
|
import me.cortex.voxy.common.world.WorldEngine;
|
||||||
import me.cortex.voxy.client.importers.WorldImporter;
|
import me.cortex.voxy.client.importers.WorldImporter;
|
||||||
|
import net.coderbot.iris.Iris;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.render.Camera;
|
import net.minecraft.client.render.Camera;
|
||||||
import net.minecraft.client.render.Frustum;
|
import net.minecraft.client.render.Frustum;
|
||||||
@@ -136,6 +138,9 @@ public class VoxelCore {
|
|||||||
//this.renderer.getModelManager().updateEntry(0, Blocks.COMPARATOR.getDefaultState());
|
//this.renderer.getModelManager().updateEntry(0, Blocks.COMPARATOR.getDefaultState());
|
||||||
//this.renderer.getModelManager().updateEntry(0, Blocks.OAK_LEAVES.getDefaultState());
|
//this.renderer.getModelManager().updateEntry(0, Blocks.OAK_LEAVES.getDefaultState());
|
||||||
|
|
||||||
|
var fb = Iris.getPipelineManager().getPipelineNullable().getSodiumTerrainPipeline().getTerrainSolidFramebuffer();
|
||||||
|
fb.bind();
|
||||||
|
|
||||||
int boundFB = GlStateManager.getBoundFramebuffer();
|
int boundFB = GlStateManager.getBoundFramebuffer();
|
||||||
this.postProcessing.setup(MinecraftClient.getInstance().getFramebuffer().textureWidth, MinecraftClient.getInstance().getFramebuffer().textureHeight, boundFB);
|
this.postProcessing.setup(MinecraftClient.getInstance().getFramebuffer().textureWidth, MinecraftClient.getInstance().getFramebuffer().textureHeight, boundFB);
|
||||||
|
|
||||||
@@ -159,7 +164,7 @@ public class VoxelCore {
|
|||||||
this.renderer.renderFarAwayTranslucent();
|
this.renderer.renderFarAwayTranslucent();
|
||||||
|
|
||||||
|
|
||||||
this.postProcessing.renderPost(boundFB);
|
this.postProcessing.renderPost(projection, RenderSystem.getProjectionMatrix(), boundFB);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ public class Gl46FarWorldRenderer extends AbstractFarWorldRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
|
||||||
//this.models.bakery.renderFaces(Blocks.WATER.getDefaultState().with(FluidBlock.LEVEL, 1), 1234, true);
|
//this.models.bakery.renderFaces(Blocks.WATER.getDefaultState().with(FluidBlock.LEVEL, 1), 1234, true);
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ public class FullscreenBlit {
|
|||||||
.compile();
|
.compile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void bind() {
|
||||||
|
this.shader.bind();
|
||||||
|
}
|
||||||
|
|
||||||
public void blit() {
|
public void blit() {
|
||||||
glBindVertexArray(EMPTY_VAO);
|
glBindVertexArray(EMPTY_VAO);
|
||||||
this.shader.bind();
|
this.shader.bind();
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ public class PostProcessing {
|
|||||||
private GlTexture depthStencil;
|
private GlTexture depthStencil;
|
||||||
|
|
||||||
private final FullscreenBlit emptyBlit = new FullscreenBlit("voxy:post/noop.frag");
|
private final FullscreenBlit emptyBlit = new FullscreenBlit("voxy:post/noop.frag");
|
||||||
private final FullscreenBlit blitTexture = new FullscreenBlit("voxy:post/blit_texture_cutout.frag");
|
//private final FullscreenBlit blitTexture = new FullscreenBlit("voxy:post/blit_texture_cutout.frag");
|
||||||
|
private final FullscreenBlit blitTexture = new FullscreenBlit("voxy:post/blit_texture_depth_cutout.frag");
|
||||||
private final Shader ssaoComp = Shader.make()
|
private final Shader ssaoComp = Shader.make()
|
||||||
.add(ShaderType.COMPUTE, "voxy:post/ssao.comp")
|
.add(ShaderType.COMPUTE, "voxy:post/ssao.comp")
|
||||||
.compile();
|
.compile();
|
||||||
@@ -134,7 +135,7 @@ public class PostProcessing {
|
|||||||
|
|
||||||
|
|
||||||
//Executes the post processing and emits to whatever framebuffer is currently bound via a blit
|
//Executes the post processing and emits to whatever framebuffer is currently bound via a blit
|
||||||
public void renderPost(int outputFB) {
|
public void renderPost(Matrix4f fromProjection, Matrix4f tooProjection, int outputFB) {
|
||||||
glDisable(GL_STENCIL_TEST);
|
glDisable(GL_STENCIL_TEST);
|
||||||
|
|
||||||
|
|
||||||
@@ -145,11 +146,23 @@ public class PostProcessing {
|
|||||||
//glBlitNamedFramebuffer(this.framebuffer.id, outputFB, 0,0, this.width, this.height, 0,0, this.width, this.height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
//glBlitNamedFramebuffer(this.framebuffer.id, outputFB, 0,0, this.width, this.height, 0,0, this.width, this.height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||||
|
|
||||||
|
|
||||||
|
this.blitTexture.bind();
|
||||||
|
|
||||||
|
float[] data = new float[4*4];
|
||||||
|
var mat = new Matrix4f(fromProjection).invert();
|
||||||
|
mat.get(data);
|
||||||
|
glUniformMatrix4fv(2, false, data);//inverse fromProjection
|
||||||
|
tooProjection.get(data);
|
||||||
|
glUniformMatrix4fv(3, false, data);//tooProjection
|
||||||
|
|
||||||
|
|
||||||
|
glActiveTexture(GL_TEXTURE1);
|
||||||
|
GL11C.glBindTexture(GL_TEXTURE_2D, this.depthStencil.id);
|
||||||
|
glTexParameteri (GL_TEXTURE_2D, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, this.colour.id);
|
glBindTexture(GL_TEXTURE_2D, this.colour.id);
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
glDepthMask(false);
|
glDepthMask(true);
|
||||||
this.blitTexture.blit();
|
this.blitTexture.blit();
|
||||||
glDisable(GL_DEPTH_TEST);
|
glDisable(GL_DEPTH_TEST);
|
||||||
glDepthMask(true);
|
glDepthMask(true);
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public abstract class MixinWorldRenderer implements IGetVoxelCore {
|
|||||||
private void injectOpaqueRender(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f projectionMatrix, CallbackInfo ci) {
|
private void injectOpaqueRender(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f projectionMatrix, CallbackInfo ci) {
|
||||||
if (this.core != null) {
|
if (this.core != null) {
|
||||||
var cam = camera.getPos();
|
var cam = camera.getPos();
|
||||||
this.core.renderOpaque(matrices, cam.x, cam.y, cam.z);
|
//this.core.renderOpaque(matrices, cam.x, cam.y, cam.z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package me.cortex.voxy.client.mixin.sodium;
|
||||||
|
|
||||||
|
import me.cortex.voxy.client.core.IGetVoxelCore;
|
||||||
|
import me.jellysquid.mods.sodium.client.gl.device.CommandList;
|
||||||
|
import me.jellysquid.mods.sodium.client.render.chunk.ChunkRenderMatrices;
|
||||||
|
import me.jellysquid.mods.sodium.client.render.chunk.DefaultChunkRenderer;
|
||||||
|
import me.jellysquid.mods.sodium.client.render.chunk.lists.ChunkRenderListIterable;
|
||||||
|
import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses;
|
||||||
|
import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass;
|
||||||
|
import me.jellysquid.mods.sodium.client.render.viewport.CameraTransform;
|
||||||
|
import net.coderbot.iris.pipeline.ShadowRenderer;
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import org.joml.Matrix4f;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(value = DefaultChunkRenderer.class, remap = false)
|
||||||
|
public class MixinDefaultChunkRenderer {
|
||||||
|
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/ShaderChunkRenderer;end(Lme/jellysquid/mods/sodium/client/render/chunk/terrain/TerrainRenderPass;)V", shift = At.Shift.BEFORE))
|
||||||
|
private void injectRender(ChunkRenderMatrices matrices, CommandList commandList, ChunkRenderListIterable renderLists, TerrainRenderPass renderPass, CameraTransform camera, CallbackInfo ci) {
|
||||||
|
if (renderPass == DefaultTerrainRenderPasses.CUTOUT) {
|
||||||
|
var core = ((IGetVoxelCore) MinecraftClient.getInstance().worldRenderer).getVoxelCore();
|
||||||
|
if (core != null && !ShadowRenderer.ACTIVE) {
|
||||||
|
var stack = new MatrixStack();
|
||||||
|
stack.loadIdentity();
|
||||||
|
stack.multiplyPositionMatrix(new Matrix4f(matrices.modelView()));
|
||||||
|
core.renderOpaque(stack, camera.x, camera.y, camera.z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,14 +24,25 @@ public class RocksDBStorageBackend extends StorageBackend {
|
|||||||
private final List<AbstractImmutableNativeReference> closeList = new ArrayList<>();
|
private final List<AbstractImmutableNativeReference> closeList = new ArrayList<>();
|
||||||
|
|
||||||
public RocksDBStorageBackend(String path) {
|
public RocksDBStorageBackend(String path) {
|
||||||
try {
|
var lockPath = new File(path).toPath().resolve("LOCK");
|
||||||
var lockPath = new File(path).toPath().resolve("LOCK");
|
if (Files.exists(lockPath)) {
|
||||||
if (Files.exists(lockPath)) {
|
System.err.println("WARNING, deleting rocksdb LOCK file");
|
||||||
System.err.println("WARNING, deleting rocksdb LOCK file");
|
int attempts = 10;
|
||||||
Files.delete(lockPath);
|
while (attempts-- != 0) {
|
||||||
|
try {
|
||||||
|
Files.delete(lockPath);
|
||||||
|
break;
|
||||||
|
} catch (IOException e) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Files.exists(lockPath)) {
|
||||||
|
throw new RuntimeException("Unable to delete rocksdb lock file");
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final ColumnFamilyOptions cfOpts = new ColumnFamilyOptions().optimizeUniversalStyleCompaction();
|
final ColumnFamilyOptions cfOpts = new ColumnFamilyOptions().optimizeUniversalStyleCompaction();
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ uint faceHasAlphaCuttout(uint faceData) {
|
|||||||
return (faceData>>22)&1u;
|
return (faceData>>22)&1u;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: try and get rid of
|
||||||
uint faceHasAlphaCuttoutOverride(uint faceData) {
|
uint faceHasAlphaCuttoutOverride(uint faceData) {
|
||||||
return (faceData>>23)&1u;
|
return (faceData>>23)&1u;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#version 450 core
|
||||||
|
|
||||||
|
layout(binding = 0) uniform sampler2D colourTex;
|
||||||
|
layout(binding = 1) uniform sampler2D depthTex;
|
||||||
|
layout(location = 2) uniform mat4 invProjMat;
|
||||||
|
layout(location = 3) uniform mat4 projMat;
|
||||||
|
|
||||||
|
out vec4 colour;
|
||||||
|
in vec2 UV;
|
||||||
|
|
||||||
|
vec3 rev3d(vec3 clip) {
|
||||||
|
vec4 view = invProjMat * vec4(clip*2.0-1.0,1.0);
|
||||||
|
return view.xyz/view.w;
|
||||||
|
}
|
||||||
|
float projDepth(vec3 pos) {
|
||||||
|
vec4 view = projMat * vec4(pos, 1);
|
||||||
|
return view.z/view.w;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
colour = texture(colourTex, UV.xy);
|
||||||
|
if (colour.a == 0.0) {
|
||||||
|
discard;
|
||||||
|
}
|
||||||
|
|
||||||
|
float depth = texture(depthTex, UV.xy).r;
|
||||||
|
depth = projDepth(rev3d(vec3(UV.xy, depth)));
|
||||||
|
depth = min(1f-(2f/((1<<24)-1)), depth);
|
||||||
|
depth = depth * 0.5f + 0.5f;
|
||||||
|
depth = gl_DepthRange.diff * depth + gl_DepthRange.near;
|
||||||
|
gl_FragDepth = depth;
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
"defaultRequire": 1
|
"defaultRequire": 1
|
||||||
},
|
},
|
||||||
"mixins": [
|
"mixins": [
|
||||||
|
"sodium.MixinDefaultChunkRenderer",
|
||||||
"sodium.MixinRenderSectionManager"
|
"sodium.MixinRenderSectionManager"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user