1.21.5 partial

This commit is contained in:
mcrcortex
2025-04-01 16:10:10 +10:00
parent 7f3be8c1ac
commit 9e442ef854
12 changed files with 530 additions and 24 deletions

View File

@@ -82,7 +82,7 @@ dependencies {
//modRuntimeOnly "maven.modrinth:nvidium:0.2.6-beta"
modCompileOnly "maven.modrinth:nvidium:0.2.8-beta"
modImplementation("maven.modrinth:cloth-config:17.0.144+fabric")
modImplementation("maven.modrinth:cloth-config:18.0.145+fabric")
modImplementation("maven.modrinth:modmenu:14.0.0-rc.2")
@@ -94,7 +94,7 @@ dependencies {
modCompileOnly("maven.modrinth:chunky:1.4.27-fabric")
modRuntimeOnly("maven.modrinth:chunky:1.4.27-fabric")
//modRuntimeOnly("maven.modrinth:chunky:1.4.27-fabric")
modRuntimeOnly("maven.modrinth:spark:1.10.121-fabric")
modRuntimeOnly("maven.modrinth:fabric-permissions-api:0.3.3")

View File

@@ -1,30 +1,44 @@
package me.cortex.voxy.client.core.gl.shader;
import com.mojang.blaze3d.opengl.GlConst;
import com.mojang.blaze3d.opengl.GlStateManager;
import me.cortex.voxy.client.core.gl.GlBuffer;
import me.cortex.voxy.client.core.gl.GlDebug;
import me.cortex.voxy.client.core.gl.GlTexture;
import me.cortex.voxy.common.util.Pair;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static org.lwjgl.opengl.ARBDirectStateAccess.glBindTextureUnit;
import static org.lwjgl.opengl.GL11.glBindTexture;
import static org.lwjgl.opengl.GL30.glBindBufferBase;
import static org.lwjgl.opengl.GL30.glBindBufferRange;
import static org.lwjgl.opengl.GL31.GL_UNIFORM_BUFFER;
import static org.lwjgl.opengl.GL33.glBindSampler;
import static org.lwjgl.opengl.GL43.GL_SHADER_STORAGE_BUFFER;
//TODO: rewrite the entire shader builder system
public class AutoBindingShader extends Shader {
private record BufferBinding(int target, int index, GlBuffer buffer, long offset, long size) {}
private record TextureBinding(int unit, int sampler, GlTexture texture) {}
private final Map<String, String> defines;
private final List<BufferBinding> bindings = new ArrayList<>();
private final List<TextureBinding> textureBindings = new ArrayList<>();
AutoBindingShader(Shader.Builder<AutoBindingShader> builder, int program) {
super(program);
this.defines = builder.defines;
}
public AutoBindingShader name(String name) {
return GlDebug.name(name, this);
}
public AutoBindingShader ssbo(int index, GlBuffer binding) {
return this.ssbo(index, binding, 0);
}
@@ -47,9 +61,24 @@ public class AutoBindingShader extends Shader {
return this;
}
public AutoBindingShader texture(String define, GlTexture texture) {
return this.texture(define, -1, texture);
}
public AutoBindingShader texture(String define, int sampler, GlTexture texture) {
return this.texture(Integer.parseInt(this.defines.get(define)), sampler, texture);
}
public AutoBindingShader texture(int unit, int sampler, GlTexture texture) {
this.textureBindings.add(new TextureBinding(unit, sampler, texture));
return this;
}
@Override
public void bind() {
super.bind();
if (!this.bindings.isEmpty()) {
for (var binding : this.bindings) {
if (binding.offset == 0 && binding.size == -1) {
glBindBufferBase(binding.target, binding.index, binding.buffer.id);
@@ -58,4 +87,17 @@ public class AutoBindingShader extends Shader {
}
}
}
if (!this.textureBindings.isEmpty()) {
for (var binding : this.textureBindings) {
if (binding.texture != null) {
GlStateManager._activeTexture(GlConst.GL_TEXTURE0+binding.unit);
GlStateManager._bindTexture(0);
glBindTextureUnit(binding.unit, binding.texture.id);
}
if (binding.sampler != -1) {
glBindSampler(binding.unit, binding.sampler);
}
}
}
}
}

View File

@@ -123,7 +123,7 @@ public class BakedBlockEntityModel {
}
}
layer.putInto(bb);
BudgetBufferRenderer.draw(bb.end());
//BudgetBufferRenderer.draw(bb.end());
}
}
}

View File

@@ -1,17 +1,47 @@
package me.cortex.voxy.client.core.model;
import com.mojang.blaze3d.buffers.GpuBuffer;
import com.mojang.blaze3d.pipeline.RenderPipeline;
import com.mojang.blaze3d.systems.RenderPass;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.textures.GpuTexture;
import com.mojang.blaze3d.vertex.VertexFormat;
import net.minecraft.client.gl.GlGpuBuffer;
import net.minecraft.client.gl.*;
import net.minecraft.client.render.BuiltBuffer;
import static org.lwjgl.opengl.GL15C.*;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.util.Identifier;
import org.joml.Matrix4f;
public class BudgetBufferRenderer {
public static void draw(BuiltBuffer buffer) {
var params = buffer.getDrawParameters();
try (var gpuBuf = params.format().uploadImmediateIndexBuffer(buffer.getBuffer())) {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ((GlGpuBuffer)RenderSystem.getSequentialBuffer(VertexFormat.DrawMode.QUADS).getIndexBuffer(params.indexCount())).id);
}
public static final RenderPipeline RENDERER_THING = RenderPipeline.builder()
.withLocation(Identifier.of("voxy","bakery/position_tex"))
.withVertexShader(Identifier.of("voxy","bakery/position_tex"))
.withFragmentShader(Identifier.of("voxy","bakery/position_tex"))
.withUniform("transform", UniformType.MATRIX4X4)
.withSampler("tex")
.withVertexFormat(VertexFormats.POSITION_TEXTURE_COLOR, VertexFormat.DrawMode.QUADS)
.build();
public static void draw(BuiltBuffer buffer, GpuTexture tex, Matrix4f matrix) {
RenderSystem.ShapeIndexBuffer shapeIndexBuffer = RenderSystem.getSequentialBuffer(buffer.getDrawParameters().mode());
GpuBuffer gpuBuffer = buffer.getDrawParameters().format().uploadImmediateVertexBuffer(buffer.getBuffer());
var res = (GlResourceManager)RenderSystem.getDevice()
.createCommandEncoder();
res.currentProgram = null;
res.currentPipeline = RENDERER_THING;
try (RenderPass renderPass = new RenderPassImpl(res, false)) {
renderPass.setPipeline(RENDERER_THING);
renderPass.setVertexBuffer(0, gpuBuffer);
renderPass.bindSampler("tex", tex);
renderPass.setUniform("transform", matrix);
renderPass.setIndexBuffer(shapeIndexBuffer.getIndexBuffer(buffer.getDrawParameters().indexCount()), shapeIndexBuffer.getIndexType());
renderPass.drawIndexed(0, buffer.getDrawParameters().indexCount());
}
//gpuBuffer.close();
buffer.close();
res.currentProgram = null;
res.currentPipeline = null;
}
}

View File

@@ -0,0 +1,67 @@
package me.cortex.voxy.client.core.model.bakery;
import me.cortex.voxy.client.core.gl.GlBuffer;
import me.cortex.voxy.client.core.gl.GlFramebuffer;
import me.cortex.voxy.client.core.gl.GlTexture;
import me.cortex.voxy.client.core.gl.shader.Shader;
import me.cortex.voxy.client.core.gl.shader.ShaderType;
import static org.lwjgl.opengl.ARBDirectStateAccess.glTextureParameteri;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL11.GL_STENCIL_INDEX;
import static org.lwjgl.opengl.GL30.*;
import static org.lwjgl.opengl.GL43.*;
public class GlViewCapture {
private final int width;
private final int height;
private final GlTexture colourTex;
private final GlTexture depthTex;
private final GlTexture stencilTex;
final GlFramebuffer framebuffer;
private final Shader copyOutShader;
public GlViewCapture(int width, int height) {
this.width = width;
this.height = height;
this.colourTex = new GlTexture().store(GL_RGBA8, 1, width*3, height*2).name("ModelBakeryColour");
this.depthTex = new GlTexture().store(GL_DEPTH24_STENCIL8, 1, width*3, height*2).name("ModelBakeryDepth");
//TODO: FIXME: Mesa is broken when trying to read from a sampler of GL_STENCIL_INDEX
// it seems to just ignore the value set in GL_DEPTH_STENCIL_TEXTURE_MODE
glTextureParameteri(this.depthTex.id, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);
this.stencilTex = this.depthTex.createView();
glTextureParameteri(this.depthTex.id, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
this.framebuffer = new GlFramebuffer().bind(GL_COLOR_ATTACHMENT0, this.colourTex).bind(GL_DEPTH_STENCIL_ATTACHMENT, this.depthTex).verify().name("ModelFramebuffer");
glTextureParameteri(this.stencilTex.id, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);
this.copyOutShader = Shader.makeAuto()
.define("WIDTH", width)
.define("HEIGHT", height)
.define("COLOUR_IN_BINDING", 0)
.define("DEPTH_IN_BINDING", 1)
.define("STENCIL_IN_BINDING", 2)
.define("BUFFER_OUT_BINDING", 3)
.add(ShaderType.COMPUTE, "voxy:bakery/bufferreorder.comp")
.compile()
.name("ModelBakeryOut")
.texture("COLOUR_IN_BINDING", 0, this.colourTex)
.texture("DEPTH_IN_BINDING", 0, this.depthTex)
.texture("STENCIL_IN_BINDING", 0, this.stencilTex);
}
public void emitToStream(int buffer, int offset) {
this.copyOutShader.bind();
glBindBufferRange(GL_SHADER_STORAGE_BUFFER, 3, buffer, offset, (this.width*3L)*(this.height*2L)*4L*2);//its 2*4 because colour + depth stencil
glDispatchCompute(3, 2, 1);
}
public void free() {
this.framebuffer.free();
this.colourTex.free();
this.stencilTex.free();
this.depthTex.free();
this.copyOutShader.free();
}
}

View File

@@ -0,0 +1,315 @@
package me.cortex.voxy.client.core.model.bakery;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.textures.GpuTexture;
import com.mojang.blaze3d.vertex.VertexFormat;
import me.cortex.voxy.client.core.gl.GlFramebuffer;
import me.cortex.voxy.client.core.gl.GlTexture;
import me.cortex.voxy.client.core.gl.shader.Shader;
import me.cortex.voxy.client.core.gl.shader.ShaderType;
import me.cortex.voxy.client.core.model.BakedBlockEntityModel;
import me.cortex.voxy.client.core.model.BudgetBufferRenderer;
import me.cortex.voxy.client.core.rendering.util.GlStateCapture;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gl.GlBackend;
import net.minecraft.client.render.*;
import net.minecraft.client.render.model.BlockStateModel;
import net.minecraft.client.util.BufferAllocator;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.fluid.FluidState;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ColorHelper;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.RotationAxis;
import net.minecraft.util.math.random.LocalRandom;
import net.minecraft.world.BlockRenderView;
import net.minecraft.world.LightType;
import net.minecraft.world.biome.ColorResolver;
import net.minecraft.world.chunk.light.LightingProvider;
import org.jetbrains.annotations.Nullable;
import org.joml.Matrix4f;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL11C;
import java.util.ArrayList;
import java.util.List;
import static org.lwjgl.opengl.ARBDirectStateAccess.glBlitNamedFramebuffer;
import static org.lwjgl.opengl.ARBDirectStateAccess.glTextureParameteri;
import static org.lwjgl.opengl.ARBShaderImageLoadStore.GL_FRAMEBUFFER_BARRIER_BIT;
import static org.lwjgl.opengl.ARBShaderImageLoadStore.glMemoryBarrier;
import static org.lwjgl.opengl.GL11C.GL_TEXTURE_2D;
import static org.lwjgl.opengl.GL14C.glBlendFuncSeparate;
import static org.lwjgl.opengl.GL20C.glUniformMatrix4fv;
import static org.lwjgl.opengl.GL30.*;
import static org.lwjgl.opengl.GL43.*;
//Builds a texture for each face of a model
public class ModelTextureBakery2 {
private static final List<MatrixStack> FACE_VIEWS = new ArrayList<>();
private final int width;
private final int height;
private final GlViewCapture capture;
public ModelTextureBakery2(int width, int height) {
this.width = width;
this.height = height;
this.capture = new GlViewCapture(width, height);
//This is done to help make debugging easier
FACE_VIEWS.clear();
AddViews();
}
private static void AddViews() {
//TODO: FIXME: need to bake in the correct orientation, HOWEVER some orientations require a flipped winding order!!!!
addView(-90,0, 0, false);//Direction.DOWN
addView(90,0, 0, false);//Direction.UP
addView(0,180, 0, true);//Direction.NORTH
addView(0,0, 0, false);//Direction.SOUTH
//TODO: check these arnt the wrong way round
addView(0,90, 270, false);//Direction.EAST
addView(0,270, 270, false);//Direction.WEST
}
private static void addView(float pitch, float yaw, float rotation, boolean flipX) {
var stack = new MatrixStack();
stack.translate(0.5f,0.5f,0.5f);
stack.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(rotation));
stack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(pitch));
stack.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(yaw));
stack.translate(-0.5f,-0.5f,-0.5f);
FACE_VIEWS.add(stack);
}
//TODO: For block entities, also somehow attempt to render the default block entity, e.g. chests and stuff
// cause that will result in ok looking micro details in the terrain
public void renderFacesToStream(BlockState state, long randomValue, boolean renderFluid, int streamBuffer, int streamBaseOffset) {
int[] viewport = new int[4];
glGetIntegerv(GL_VIEWPORT, viewport);
int oldFB = glGetInteger(GL_DRAW_FRAMEBUFFER_BINDING);
var model = MinecraftClient.getInstance()
.getBakedModelManager()
.getBlockModels()
.getModel(state);
BakedBlockEntityModel entityModel = state.hasBlockEntity()?BakedBlockEntityModel.bake(state):null;
var projection = new Matrix4f().identity().set(new float[]{
2,0,0,0,
0, 2,0,0,
0,0, -1f,0,
-1,-1,0,1,
});
RenderLayer renderLayer = null;
if (!renderFluid) {
renderLayer = RenderLayers.getBlockLayer(state);
} else {
renderLayer = RenderLayers.getFluidLayer(state.getFluidState());
}
//TODO: figure out why calling this makes minecraft render black
//renderLayer.startDrawing();
glClearColor(0,0,0,0);
glClearDepth(1);
glClearStencil(0);
glBindFramebuffer(GL_FRAMEBUFFER, this.capture.framebuffer.id);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glEnable(GL_STENCIL_TEST);
glDepthRange(0, 1);
glDepthMask(true);
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
//glDepthFunc(GL_LESS);
//TODO: Find a better solution
if (renderLayer == RenderLayer.getTranslucent()) {
//Very hacky blend function to retain the effect of the applied alpha since we dont really want to apply alpha
// this is because we apply the alpha again when rendering the terrain meaning the alpha is being double applied
glBlendFuncSeparate(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
} else {
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
}
//glBlendFunc(GL_ONE, GL_ONE);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
glStencilFunc(GL_ALWAYS, 1, 0xFF);
glStencilMask(0xFF);
var tex = MinecraftClient.getInstance().getTextureManager().getTexture(Identifier.of("minecraft", "textures/atlas/blocks.png")).getGlTexture();
for (int i = 0; i < FACE_VIEWS.size(); i++) {
glViewport((i%3)*this.width, (i/3)*this.height, this.width, this.height);
glBindFramebuffer(GL_FRAMEBUFFER, this.capture.framebuffer.id);
captureViewToStream(state, model, entityModel, new Matrix4f(projection).mul(FACE_VIEWS.get(i).peek().getPositionMatrix()), randomValue, i, renderFluid, tex);
}
//renderLayer.endDrawing();
glDisable(GL_STENCIL_TEST);
glDisable(GL_BLEND);
glBindFramebuffer(GL_FRAMEBUFFER, oldFB);
GL11C.glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
this.capture.emitToStream(streamBuffer, streamBaseOffset);
/*
var target = DefaultTerrainRenderPasses.CUTOUT.getTarget();
int boundFB = ((net.minecraft.client.texture.GlTexture) target.getColorAttachment()).getOrCreateFramebuffer(((GlBackend) RenderSystem.getDevice()).getFramebufferManager(), target.getDepthAttachment());
glBlitNamedFramebuffer(this.capture.framebuffer.id, boundFB, 0, 0, 16*3, 16*2, 0, 0,16*3*16, 16*2*16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
*/
//TODO: FIXME: fully revert the state of opengl
}
private final BufferAllocator allocator = new BufferAllocator(786432);
private void captureViewToStream(BlockState state, BlockStateModel model, BakedBlockEntityModel blockEntityModel, Matrix4f transform, long randomValue, int face, boolean renderFluid, GpuTexture texture) {
//glActiveTexture(GL_TEXTURE0);
//glUniform1i(0, 0);
//float[] mat = new float[4*4];
//transform.get(mat);
//glUniformMatrix4fv(1, false, mat);
if (blockEntityModel != null && !renderFluid) {
blockEntityModel.renderOut();
}
var bb = new BufferBuilder(this.allocator, VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR) {
@Override
public void vertex(float x, float y, float z, int color, float u, float v, int overlay, int light, float normalX, float normalY, float normalZ) {
super.vertex(x, y, z, ColorHelper.getArgb(0,0,1), u, v, overlay, light, normalX, normalY, normalZ);
}
@Override
public VertexConsumer color(int argb) {
return super.color(ColorHelper.getArgb(0,0,1));
}
@Override
public VertexConsumer color(int red, int green, int blue, int alpha) {
return super.color(0, 0, 1, 255);
}
};
if (!renderFluid) {
//TODO: need to do 2 variants for quads, one which have coloured, ones that dont, might be able to pull a spare bit
// at the end whether or not a pixel should be mixed with texture
renderQuads(bb, model, new MatrixStack(), randomValue);
} else {
MinecraftClient.getInstance().getBlockRenderManager().renderFluid(BlockPos.ORIGIN, new BlockRenderView() {
@Override
public float getBrightness(Direction direction, boolean shaded) {
return 0;
}
@Override
public LightingProvider getLightingProvider() {
return null;
}
@Override
public int getLightLevel(LightType type, BlockPos pos) {
return 0;
}
@Override
public int getColor(BlockPos pos, ColorResolver colorResolver) {
return 0;
}
@Nullable
@Override
public BlockEntity getBlockEntity(BlockPos pos) {
return null;
}
@Override
public BlockState getBlockState(BlockPos pos) {
if (pos.equals(Direction.byIndex(face).getVector())) {
return Blocks.AIR.getDefaultState();
}
//Fixme:
// This makes it so that the top face of water is always air, if this is commented out
// the up block will be a liquid state which makes the sides full
// if this is uncommented, that issue is fixed but e.g. stacking water layers ontop of eachother
// doesnt fill the side of the block
//if (pos.getY() == 1) {
// return Blocks.AIR.getDefaultState();
//}
return state;
}
@Override
public FluidState getFluidState(BlockPos pos) {
if (pos.equals(Direction.byIndex(face).getVector())) {
return Blocks.AIR.getDefaultState().getFluidState();
}
//if (pos.getY() == 1) {
// return Blocks.AIR.getDefaultState().getFluidState();
//}
return state.getFluidState();
}
@Override
public int getHeight() {
return 0;
}
@Override
public int getBottomY() {
return 0;
}
}, bb, state, state.getFluidState());
}
try {
//System.err.println("REPLACE THE UPLOADING WITH THREAD SAFE VARIENT");
BudgetBufferRenderer.draw(bb.end(), texture, transform);
} catch (IllegalStateException e) {
//System.err.println("Got empty buffer builder! for block " + state);
}
}
private static void renderQuads(BufferBuilder builder, BlockStateModel model, MatrixStack stack, long randomValue) {
for (Direction direction : new Direction[]{Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST, null}) {
for (var part : model.getParts(new LocalRandom(randomValue))) {
var quads = part.getQuads(direction);
for (var quad : quads) {
//TODO: mark pixels that have
int meta = 1;
builder.quad(stack.peek(), quad, ((meta >> 16) & 0xff) / 255f, ((meta >> 8) & 0xff) / 255f, (meta & 0xff) / 255f, 1.0f, 0, 0);
}
}
}
}
public void free() {
this.capture.free();
this.allocator.close();
}
}

View File

@@ -1,12 +1,16 @@
package me.cortex.voxy.client.core.rendering;
import com.mojang.blaze3d.opengl.GlConst;
import com.mojang.blaze3d.opengl.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import me.cortex.voxy.client.config.VoxyConfig;
import me.cortex.voxy.client.core.gl.Capabilities;
import me.cortex.voxy.client.core.gl.GlBuffer;
import me.cortex.voxy.client.core.gl.GlTexture;
import me.cortex.voxy.client.core.model.ColourDepthTextureData;
import me.cortex.voxy.client.core.model.ModelBakerySubsystem;
import me.cortex.voxy.client.core.model.ModelTextureBakery;
import me.cortex.voxy.client.core.model.bakery.ModelTextureBakery2;
import me.cortex.voxy.client.core.rendering.building.RenderDataFactory45;
import me.cortex.voxy.client.core.rendering.building.RenderGenerationService;
import me.cortex.voxy.client.core.rendering.post.PostProcessing;
@@ -20,10 +24,15 @@ import me.cortex.voxy.common.world.WorldEngine;
import me.cortex.voxy.common.world.WorldSection;
import me.cortex.voxy.common.world.other.Mapper;
import me.cortex.voxy.commonImpl.VoxyCommon;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass;
import net.irisshaders.iris.targets.RenderTarget;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gl.GlBackend;
import net.minecraft.client.render.Camera;
import net.minecraft.client.render.Frustum;
import net.minecraft.client.render.LightmapTextureManager;
import net.minecraft.client.util.math.MatrixStack;
import org.joml.Matrix4f;
import org.lwjgl.opengl.GL11;
@@ -34,8 +43,9 @@ import java.util.List;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
import static org.lwjgl.opengl.GL11C.glFinish;
import static org.lwjgl.opengl.GL11C.*;
import static org.lwjgl.opengl.GL30C.GL_DRAW_FRAMEBUFFER_BINDING;
import static org.lwjgl.opengl.GL30C.glBindFramebuffer;
public class VoxyRenderSystem {
private final RenderService renderer;
@@ -94,7 +104,7 @@ public class VoxyRenderSystem {
).mulLocal(makeProjectionMatrix(16, 16*3000));
}
//private static final ModelTextureBakery mtb = new ModelTextureBakery(16, 16);
//private static final ModelTextureBakery2 mtb = new ModelTextureBakery2(16, 16);
//private static final RawDownloadStream downstream = new RawDownloadStream(1<<20);
public void renderOpaque(MatrixStack matrices, double cameraX, double cameraY, double cameraZ) {
/*
@@ -164,7 +174,12 @@ public class VoxyRenderSystem {
.setScreenSize(MinecraftClient.getInstance().getFramebuffer().textureWidth, MinecraftClient.getInstance().getFramebuffer().textureHeight);
viewport.frameId++;
int boundFB = GL11.glGetInteger(GL_DRAW_FRAMEBUFFER_BINDING);
int oldFB = GL11.glGetInteger(GL_DRAW_FRAMEBUFFER_BINDING);
var target = DefaultTerrainRenderPasses.CUTOUT.getTarget();
int boundFB = ((net.minecraft.client.texture.GlTexture) target.getColorAttachment()).getOrCreateFramebuffer(((GlBackend) RenderSystem.getDevice()).getFramebufferManager(), target.getDepthAttachment());
if (boundFB == 0) {
throw new IllegalStateException("Cannot use the default framebuffer as cannot source from it");
}
@@ -172,7 +187,7 @@ public class VoxyRenderSystem {
//int boundDepthBuffer = glGetNamedFramebufferAttachmentParameteri(boundFB, GL_DEPTH_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME);
//TODO:FIXME!!! ??
this.postProcessing.setup(MinecraftClient.getInstance().getFramebuffer().textureWidth, MinecraftClient.getInstance().getFramebuffer().textureHeight, boundFB);
this.postProcessing.setup(target.textureWidth, target.textureHeight, boundFB);
this.renderer.renderFarAwayOpaque(viewport);
@@ -184,6 +199,7 @@ public class VoxyRenderSystem {
this.postProcessing.renderPost(projection, RenderSystem.getProjectionMatrix(), boundFB);
glBindFramebuffer(GlConst.GL_FRAMEBUFFER, oldFB);
}
public void addDebugInfo(List<String> debug) {

View File

@@ -154,6 +154,7 @@ public class PostProcessing {
mat.get(data);
glUniformMatrix4fv(4, false, data);//invMVP
glActiveTexture(GL_TEXTURE0);
glBindImageTexture(0, this.colourSSAO.id, 0, false,0, GL_READ_WRITE, GL_RGBA8);
glActiveTexture(GL_TEXTURE1);
GL11C.glBindTexture(GL_TEXTURE_2D, this.depthStencil.id);

View File

@@ -0,0 +1,32 @@
#version 450
layout(local_size_x = WIDTH, local_size_y = HEIGHT) in;
layout(binding = COLOUR_IN_BINDING) uniform sampler2D colourTexIn;
layout(binding = DEPTH_IN_BINDING) uniform sampler2D depthTexIn;
layout(binding = STENCIL_IN_BINDING) uniform usampler2D stencilTexIn;
layout(binding = BUFFER_OUT_BINDING, std430) writeonly restrict buffer OutBuffer {
uvec2[] outBuffer;
};
void main() {
uint localOutIndex = gl_LocalInvocationID.x + gl_LocalInvocationID.y*WIDTH;
uint groupOutIndex = (gl_WorkGroupID.x + gl_WorkGroupID.y*3)*(WIDTH*HEIGHT);
uint globalOutIndex = groupOutIndex+localOutIndex;
ivec2 samplePoint = ivec2(gl_GlobalInvocationID.xy);
uvec2 outPoint = uvec2(0);
uvec4 colour = clamp(uvec4(texelFetch(colourTexIn, samplePoint, 0)*255), uvec4(0), uvec4(255));//TODO: check that this actually gets to the range of 255
colour <<= uvec4(0,8,16,24);//ABGR format!!!
outPoint.x = colour.r|colour.g|colour.b|colour.a;
float depth = clamp(texelFetch(depthTexIn, samplePoint, 0).r, 0, 1);//Opengl grumble grumble
uint stencil = texelFetch(stencilTexIn, samplePoint, 0).r;
uint value = uint(depth*((1<<24)-1))<<8;
value |= stencil;
outPoint.y = value;
outBuffer[globalOutIndex] = outPoint;
}

View File

@@ -4,7 +4,7 @@ layout(location=0) in vec3 pos;
layout(location=1) in vec2 uv;
layout(location=2) in vec4 _metadata;
layout(location=1) uniform mat4 transform;
uniform mat4 transform;
out vec2 texCoord;
out flat uint metadata;

View File

@@ -32,7 +32,7 @@
"common.voxy.mixins.json"
],
"depends": {
"minecraft": "1.21.4",
"minecraft": "1.21.5",
"fabricloader": ">=0.14.22",
"fabric-api": ">=0.91.1",
"cloth-config": ">=13",

View File

@@ -26,3 +26,6 @@ accessible field net/minecraft/world/chunk/PalettedContainer$Data storage Lnet/m
accessible field net/minecraft/world/chunk/PalettedContainer$Data palette Lnet/minecraft/world/chunk/Palette;
accessible field net/minecraft/client/gl/GlGpuBuffer id I
accessible field net/minecraft/client/gl/GlResourceManager currentProgram Lnet/minecraft/client/gl/ShaderProgram;
accessible field net/minecraft/client/gl/GlResourceManager currentPipeline Lcom/mojang/blaze3d/pipeline/RenderPipeline;