fix leak in LOD renderer and start separating uniforms
This commit is contained in:
+83
@@ -0,0 +1,83 @@
|
||||
package com.seibel.distanthorizons.common.renderTest;
|
||||
|
||||
import com.mojang.blaze3d.buffers.GpuBuffer;
|
||||
import com.mojang.blaze3d.buffers.GpuBufferSlice;
|
||||
import com.mojang.blaze3d.systems.CommandEncoder;
|
||||
import com.mojang.blaze3d.systems.GpuDevice;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IUniformBufferWrapper;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrapper
|
||||
{
|
||||
private final String name;
|
||||
|
||||
private ByteBuffer buffer = null;
|
||||
public GpuBuffer gpuBuffer = null;
|
||||
|
||||
|
||||
|
||||
//========//
|
||||
// render //
|
||||
//========//
|
||||
//region
|
||||
|
||||
public AbstractUniformBufferWrapper() { this.name = this.getClass().getSimpleName(); }
|
||||
public AbstractUniformBufferWrapper(String name) { this.name = name; }
|
||||
|
||||
protected ByteBuffer getOrCreateBuffer(int size)
|
||||
{
|
||||
GpuDevice gpuDevice = RenderSystem.getDevice();
|
||||
|
||||
if (this.buffer == null
|
||||
|| this.buffer.capacity() != size)
|
||||
{
|
||||
this.buffer = ByteBuffer.allocateDirect(size);
|
||||
this.buffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||
|
||||
// GpuBuffer.USAGE_UNIFORM = 128
|
||||
// GpuBuffer.USAGE_INDEX = 64
|
||||
int usage = 8 | 32 | 128; // is this just using OpenGL VBO flags?, if so I can't find it, supposedly GlDevice on Mojang's side
|
||||
int byteSize = (this.buffer.limit() - this.buffer.position());
|
||||
this.gpuBuffer = gpuDevice.createBuffer(this::getName, usage, byteSize);
|
||||
}
|
||||
|
||||
return this.buffer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void upload() throws IllegalStateException
|
||||
{
|
||||
if (this.buffer == null)
|
||||
{
|
||||
throw new IllegalStateException("Upload called before buffer was created");
|
||||
}
|
||||
|
||||
|
||||
|
||||
GpuDevice gpuDevice = RenderSystem.getDevice();
|
||||
CommandEncoder commandEncoder = gpuDevice.createCommandEncoder();
|
||||
|
||||
int byteSize = (this.buffer.limit() - this.buffer.position());
|
||||
GpuBufferSlice bufferSlice = new GpuBufferSlice(this.gpuBuffer, /*offset*/0, byteSize);
|
||||
commandEncoder.writeToBuffer(bufferSlice, this.buffer);
|
||||
}
|
||||
private String getName() { return this.name; }
|
||||
|
||||
@Override
|
||||
public void close()
|
||||
{
|
||||
if (this.gpuBuffer != null)
|
||||
{
|
||||
this.gpuBuffer.close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//endregion
|
||||
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
package com.seibel.distanthorizons.common.renderTest;
|
||||
|
||||
import com.mojang.blaze3d.buffers.GpuBuffer;
|
||||
import com.mojang.blaze3d.buffers.GpuBufferSlice;
|
||||
import com.mojang.blaze3d.buffers.Std140Builder;
|
||||
import com.mojang.blaze3d.buffers.Std140SizeCalculator;
|
||||
import com.mojang.blaze3d.systems.CommandEncoder;
|
||||
import com.mojang.blaze3d.systems.GpuDevice;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.seibel.distanthorizons.core.config.Config;
|
||||
import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.LodBufferContainer;
|
||||
import com.seibel.distanthorizons.core.pos.DhSectionPos;
|
||||
import com.seibel.distanthorizons.core.render.renderer.RenderParams;
|
||||
import com.seibel.distanthorizons.core.util.math.Mat4f;
|
||||
import com.seibel.distanthorizons.core.util.math.Vec3d;
|
||||
import com.seibel.distanthorizons.core.util.math.Vec3f;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.render.ILodContainerUniformBufferWrapper;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IUniformBufferWrapper;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class LodContainerUniformBufferWrapper extends AbstractUniformBufferWrapper implements ILodContainerUniformBufferWrapper
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
//========//
|
||||
// ??? //
|
||||
//========//
|
||||
//region
|
||||
|
||||
public void createBufferData(RenderParams renderEventParam, LodBufferContainer bufferContainer)
|
||||
{
|
||||
Vec3d camPos = renderEventParam.exactCameraPosition;
|
||||
Vec3f modelOffset = new Vec3f(
|
||||
(float) (bufferContainer.minCornerBlockPos.getX() - camPos.x),
|
||||
(float) (bufferContainer.minCornerBlockPos.getY() - camPos.y),
|
||||
(float) (bufferContainer.minCornerBlockPos.getZ() - camPos.z));
|
||||
|
||||
|
||||
Mat4f combinedMatrix = new Mat4f(renderEventParam.dhProjectionMatrix);
|
||||
combinedMatrix.multiply(renderEventParam.dhModelViewMatrix);
|
||||
|
||||
|
||||
// upload data //
|
||||
|
||||
int uniformBufferSize = new Std140SizeCalculator()
|
||||
.putVec3() // uModelOffset
|
||||
.get();
|
||||
|
||||
ByteBuffer buffer = this.getOrCreateBuffer(uniformBufferSize);
|
||||
Std140Builder.intoBuffer(buffer)
|
||||
.putVec3(modelOffset.x, modelOffset.y, modelOffset.z) // uModelOffset
|
||||
.get();
|
||||
|
||||
}
|
||||
|
||||
//endregion
|
||||
|
||||
}
|
||||
+39
-27
@@ -24,7 +24,6 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice;
|
||||
import com.mojang.blaze3d.pipeline.RenderPipeline;
|
||||
import com.mojang.blaze3d.platform.DepthTestFunction;
|
||||
import com.mojang.blaze3d.platform.PolygonMode;
|
||||
import com.mojang.blaze3d.shaders.UniformType;
|
||||
import com.mojang.blaze3d.systems.CommandEncoder;
|
||||
import com.mojang.blaze3d.systems.GpuDevice;
|
||||
import com.mojang.blaze3d.systems.RenderPass;
|
||||
@@ -36,7 +35,6 @@ import com.seibel.distanthorizons.core.logging.DhLogger;
|
||||
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcTestRenderer;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.resources.Identifier;
|
||||
|
||||
@@ -64,6 +62,14 @@ public class McApplyRenderer
|
||||
|
||||
private GpuBuffer vboGpuBuffer;
|
||||
|
||||
private GpuTextureView dhColorTextureView;
|
||||
private GpuSampler dhColorTextureSampler;
|
||||
|
||||
private GpuTextureView dhDepthTextureView;
|
||||
private GpuSampler dhDepthTextureSampler;
|
||||
|
||||
private GpuTextureView mcColorTextureView;
|
||||
|
||||
|
||||
//=============//
|
||||
// constructor //
|
||||
@@ -179,18 +185,45 @@ public class McApplyRenderer
|
||||
CommandEncoder commandEncoder = gpuDevice.createCommandEncoder();
|
||||
|
||||
|
||||
{
|
||||
GpuTexture mcColorTexture = Minecraft.getInstance().getMainRenderTarget().getColorTexture();
|
||||
if (this.mcColorTextureView == null
|
||||
|| this.mcColorTextureView.texture() != mcColorTexture)
|
||||
{
|
||||
this.mcColorTextureView = gpuDevice.createTextureView(mcColorTexture);
|
||||
}
|
||||
|
||||
|
||||
if (this.dhColorTextureSampler == null)
|
||||
{
|
||||
this.dhColorTextureSampler = gpuDevice.createSampler(
|
||||
AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, // U,V
|
||||
FilterMode.NEAREST, FilterMode.NEAREST, // minFilter, magFilter
|
||||
1, // maxAnisotropy
|
||||
OptionalDouble.empty() // maxLod
|
||||
);
|
||||
|
||||
this.dhDepthTextureSampler = gpuDevice.createSampler(
|
||||
AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, // U,V
|
||||
FilterMode.NEAREST, FilterMode.NEAREST, // minFilter, magFilter
|
||||
1, // maxAnisotropy
|
||||
OptionalDouble.empty() // maxLod
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// create a render pass
|
||||
{
|
||||
Supplier<String> debugLabelSupplier = () -> "distantHorizons:McApplyRenderer";
|
||||
GpuTextureView colorTexture = gpuDevice.createTextureView(Minecraft.getInstance().getMainRenderTarget().getColorTexture());
|
||||
OptionalInt optionalClearColorAsInt = OptionalInt.empty();
|
||||
GpuTextureView depthTexture = null;
|
||||
OptionalDouble optionalDepthValueAsDouble = OptionalDouble.empty();
|
||||
|
||||
try (RenderPass renderPass = commandEncoder.createRenderPass(
|
||||
debugLabelSupplier,
|
||||
colorTexture,
|
||||
this.mcColorTextureView,
|
||||
optionalClearColorAsInt,
|
||||
depthTexture, optionalDepthValueAsDouble))
|
||||
{
|
||||
@@ -200,29 +233,8 @@ public class McApplyRenderer
|
||||
|
||||
// render pass setup
|
||||
{
|
||||
// bind color texture
|
||||
{
|
||||
GpuTextureView textureView = gpuDevice.createTextureView(McLodRenderer.INSTANCE.dhColorTexture);
|
||||
GpuSampler gpuSampler = gpuDevice.createSampler(
|
||||
AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, // U,V
|
||||
FilterMode.NEAREST, FilterMode.NEAREST, // minFilter, magFilter
|
||||
1, // maxAnisotropy
|
||||
OptionalDouble.empty() // maxLod
|
||||
);
|
||||
renderPass.bindTexture("uDhColorTexture", textureView, gpuSampler);
|
||||
}
|
||||
|
||||
// bind depth texture
|
||||
{
|
||||
GpuTextureView textureView = gpuDevice.createTextureView(McLodRenderer.INSTANCE.dhDepthTexture);
|
||||
GpuSampler gpuSampler = gpuDevice.createSampler(
|
||||
AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, // U,V
|
||||
FilterMode.NEAREST, FilterMode.NEAREST, // minFilter, magFilter
|
||||
1, // maxAnisotropy
|
||||
OptionalDouble.empty() // maxLod
|
||||
);
|
||||
renderPass.bindTexture("uDhDepthTexture", textureView, gpuSampler);
|
||||
}
|
||||
renderPass.bindTexture("uDhDepthTexture", McLodRenderer.INSTANCE.dhDepthTextureView, this.dhColorTextureSampler);
|
||||
renderPass.bindTexture("uDhColorTexture", McLodRenderer.INSTANCE.dhColorTextureView, this.dhDepthTextureSampler);
|
||||
|
||||
// bind VBO
|
||||
renderPass.setVertexBuffer(0, this.vboGpuBuffer); // vertex buffer can only be "0" lol
|
||||
|
||||
+124
-85
@@ -16,19 +16,20 @@ import com.mojang.blaze3d.systems.RenderPass;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.textures.*;
|
||||
import com.mojang.blaze3d.vertex.VertexFormat;
|
||||
import com.seibel.distanthorizons.api.objects.math.DhApiVec3f;
|
||||
import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper;
|
||||
import com.seibel.distanthorizons.core.config.Config;
|
||||
import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.LodBufferContainer;
|
||||
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
|
||||
import com.seibel.distanthorizons.core.logging.DhLogger;
|
||||
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||
import com.seibel.distanthorizons.core.pos.DhSectionPos;
|
||||
import com.seibel.distanthorizons.core.render.glObject.GLEnums;
|
||||
import com.seibel.distanthorizons.core.render.glObject.buffer.QuadElementBuffer;
|
||||
import com.seibel.distanthorizons.core.render.renderer.RenderParams;
|
||||
import com.seibel.distanthorizons.core.util.ColorUtil;
|
||||
import com.seibel.distanthorizons.core.util.RenderUtil;
|
||||
import com.seibel.distanthorizons.core.util.math.Mat4f;
|
||||
import com.seibel.distanthorizons.core.util.objects.SortedArraySet;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper;
|
||||
@@ -64,10 +65,17 @@ public class McLodRenderer implements IMcLodRenderer
|
||||
private GpuBuffer indexBuffer;
|
||||
|
||||
private GpuBuffer fragUniformBuffer;
|
||||
private GpuBuffer vertUniformBuffer;
|
||||
private GpuBuffer vertSharedUniformBuffer;
|
||||
|
||||
public GpuTexture dhDepthTexture;
|
||||
public GpuTextureView dhDepthTextureView;
|
||||
|
||||
public GpuTexture dhColorTexture;
|
||||
public GpuTextureView dhColorTextureView;
|
||||
|
||||
private GpuTexture mcLightTexture;
|
||||
private GpuTextureView mcLightTextureView;
|
||||
private GpuSampler mcLightGpuSampler;
|
||||
|
||||
|
||||
|
||||
@@ -117,7 +125,8 @@ public class McLodRenderer implements IMcLodRenderer
|
||||
|
||||
pipelineBuilder.withSampler("uLightMap");
|
||||
|
||||
pipelineBuilder.withUniform("vertUniformBlock", UniformType.UNIFORM_BUFFER);
|
||||
pipelineBuilder.withUniform("vertUniqueUniformBlock", UniformType.UNIFORM_BUFFER);
|
||||
pipelineBuilder.withUniform("vertSharedUniformBlock", UniformType.UNIFORM_BUFFER);
|
||||
pipelineBuilder.withUniform("fragUniformBlock", UniformType.UNIFORM_BUFFER);
|
||||
|
||||
pipelineBuilder.withVertexFormat(this.vertexFormat, VertexFormat.Mode.TRIANGLES);
|
||||
@@ -134,9 +143,6 @@ public class McLodRenderer implements IMcLodRenderer
|
||||
pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT);
|
||||
this.transparentPipeline = pipelineBuilder.build();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
//endregion
|
||||
@@ -155,8 +161,7 @@ public class McLodRenderer implements IMcLodRenderer
|
||||
public void render(
|
||||
RenderParams renderEventParam,
|
||||
boolean opaquePass,
|
||||
DhApiVec3f modelOffset,
|
||||
IVertexBufferWrapper[] bufferList,
|
||||
SortedArraySet<LodBufferContainer> bufferContainers,
|
||||
IProfilerWrapper profiler)
|
||||
{
|
||||
this.tryInit();
|
||||
@@ -168,10 +173,20 @@ public class McLodRenderer implements IMcLodRenderer
|
||||
|
||||
|
||||
|
||||
profiler.push("set vert uniforms");
|
||||
profiler.push("vert unique uniforms");
|
||||
{
|
||||
// create data //
|
||||
|
||||
for (int lodIndex = 0; lodIndex < bufferContainers.size(); lodIndex++)
|
||||
{
|
||||
LodBufferContainer bufferContainer = bufferContainers.get(lodIndex);
|
||||
bufferContainer.uniforms.createBufferData(renderEventParam, bufferContainer);
|
||||
bufferContainer.uniforms.upload();
|
||||
}
|
||||
}
|
||||
|
||||
profiler.popPush("vert share uniforms");
|
||||
{
|
||||
Mat4f combinedMatrix = new Mat4f(renderEventParam.dhProjectionMatrix);
|
||||
combinedMatrix.multiply(renderEventParam.dhModelViewMatrix);
|
||||
|
||||
@@ -196,33 +211,27 @@ public class McLodRenderer implements IMcLodRenderer
|
||||
.putFloat() // uMircoOffset
|
||||
.putFloat() // uEarthRadius
|
||||
|
||||
.putVec3() // uModelOffset
|
||||
|
||||
.putMat4f() // uCombinedMatrix
|
||||
.get();
|
||||
|
||||
ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize);
|
||||
buffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||
buffer = Std140Builder.intoBuffer(buffer)
|
||||
Std140Builder.intoBuffer(buffer)
|
||||
.putInt(0) // uIsWhiteWorld
|
||||
|
||||
.putFloat((float)renderEventParam.worldYOffset) // uWorldYOffset
|
||||
.putFloat((float) renderEventParam.worldYOffset) // uWorldYOffset
|
||||
.putFloat(0.01f) // uMircoOffset // 0.01 block offset
|
||||
.putFloat(earthCurveRatio) // uEarthRadius
|
||||
|
||||
.putVec3(modelOffset.x, modelOffset.y, modelOffset.z) // uModelOffset
|
||||
|
||||
.putMat4f(combinedMatrix.createJomlMatrix()) // uCombinedMatrix
|
||||
.get();
|
||||
|
||||
this.vertUniformBuffer = UniformHandler.createBuffer("vertUniformBlock", uniformBufferSize, this.vertUniformBuffer);
|
||||
GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vertUniformBuffer, 0, uniformBufferSize);
|
||||
this.vertSharedUniformBuffer = UniformHandler.createBuffer("vertSharedUniformBlock", uniformBufferSize, this.vertSharedUniformBuffer);
|
||||
GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vertSharedUniformBuffer, 0, uniformBufferSize);
|
||||
|
||||
commandEncoder.writeToBuffer(bufferSlice, buffer);
|
||||
|
||||
}
|
||||
|
||||
|
||||
profiler.popPush("set frag uniforms");
|
||||
{
|
||||
int uniformBufferSize = new Std140SizeCalculator()
|
||||
@@ -297,7 +306,10 @@ public class McLodRenderer implements IMcLodRenderer
|
||||
if (this.dhDepthTexture != null)
|
||||
{
|
||||
this.dhDepthTexture.close();
|
||||
this.dhDepthTextureView.close();
|
||||
|
||||
this.dhColorTexture.close();
|
||||
this.dhDepthTextureView.close();
|
||||
}
|
||||
|
||||
// TODO USAGE_TEXTURE_BINDING = 4
|
||||
@@ -308,97 +320,124 @@ public class McLodRenderer implements IMcLodRenderer
|
||||
MC_RENDER.getTargetFramebufferViewportWidth(), MC_RENDER.getTargetFramebufferViewportHeight(),
|
||||
1, 1
|
||||
);
|
||||
this.dhDepthTextureView = gpuDevice.createTextureView(this.dhDepthTexture);
|
||||
|
||||
this.dhColorTexture = gpuDevice.createTexture("DhColorTexture",
|
||||
usage,
|
||||
TextureFormat.RGBA8,
|
||||
MC_RENDER.getTargetFramebufferViewportWidth(), MC_RENDER.getTargetFramebufferViewportHeight(),
|
||||
1, 1
|
||||
);
|
||||
this.dhColorTextureView = gpuDevice.createTextureView(this.dhColorTexture);
|
||||
}
|
||||
|
||||
|
||||
profiler.popPush("create render pass");
|
||||
|
||||
// create a render pass
|
||||
Supplier<String> debugLabelSupplier = () -> "distantHorizons:McLodRenderer";
|
||||
OptionalInt optionalClearColorAsInt = OptionalInt.empty();
|
||||
OptionalDouble optionalDepthValueAsDouble = OptionalDouble.empty();
|
||||
|
||||
try (
|
||||
GpuTextureView colorTextureView = gpuDevice.createTextureView(this.dhColorTexture);
|
||||
GpuTextureView depthTextureView = gpuDevice.createTextureView(this.dhDepthTexture);
|
||||
RenderPass renderPass = commandEncoder.createRenderPass(
|
||||
debugLabelSupplier,
|
||||
colorTextureView,
|
||||
optionalClearColorAsInt,
|
||||
depthTextureView, optionalDepthValueAsDouble))
|
||||
LightMapWrapper lightMapWrapper = (LightMapWrapper) renderEventParam.lightmap;
|
||||
if (this.mcLightTexture != lightMapWrapper.gpuTexture)
|
||||
{
|
||||
//renderPass.pushDebugGroup();
|
||||
//renderPass.popDebugGroup();
|
||||
|
||||
|
||||
// bind MC Lightmap
|
||||
this.mcLightTexture = lightMapWrapper.gpuTexture;
|
||||
if (this.mcLightTextureView != null)
|
||||
{
|
||||
LightMapWrapper lightMapWrapper = (LightMapWrapper) renderEventParam.lightmap;
|
||||
|
||||
GpuTextureView textureView = gpuDevice.createTextureView(lightMapWrapper.gpuTexture);
|
||||
GpuSampler gpuSampler = gpuDevice.createSampler(
|
||||
AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, // U,V
|
||||
FilterMode.NEAREST, FilterMode.NEAREST, // minFilter, magFilter
|
||||
1, // maxAnisotropy
|
||||
OptionalDouble.empty() // maxLod
|
||||
);
|
||||
renderPass.bindTexture("uLightMap", textureView, gpuSampler);
|
||||
this.mcLightTextureView.close();
|
||||
}
|
||||
|
||||
|
||||
renderPass.setUniform("vertUniformBlock", this.vertUniformBuffer);
|
||||
renderPass.setUniform("fragUniformBlock", this.fragUniformBuffer);
|
||||
this.mcLightTextureView = gpuDevice.createTextureView(this.mcLightTexture);
|
||||
this.mcLightGpuSampler = gpuDevice.createSampler(
|
||||
AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, // U,V
|
||||
FilterMode.NEAREST, FilterMode.NEAREST, // minFilter, magFilter
|
||||
1, // maxAnisotropy
|
||||
OptionalDouble.empty() // maxLod
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
profiler.popPush("setup");
|
||||
|
||||
// create a render pass
|
||||
Supplier<String> debugLabelSupplier = () -> "distantHorizons:McLodRenderer";
|
||||
OptionalInt optionalClearColorAsInt = OptionalInt.empty();
|
||||
OptionalDouble optionalDepthValueAsDouble = OptionalDouble.empty();
|
||||
|
||||
|
||||
profiler.popPush("set pipeline");
|
||||
|
||||
renderPass.setPipeline(opaquePass ? this.opaquePipeline : this.transparentPipeline);
|
||||
renderPass.setIndexBuffer(this.indexBuffer, VertexFormat.IndexType.INT);
|
||||
|
||||
// render pass setup
|
||||
for (int i = 0; i < bufferList.length; i++)
|
||||
try(RenderPass renderPass = commandEncoder.createRenderPass(
|
||||
debugLabelSupplier,
|
||||
this.dhColorTextureView,
|
||||
optionalClearColorAsInt,
|
||||
this.dhDepthTextureView, optionalDepthValueAsDouble)
|
||||
)
|
||||
{
|
||||
VertexBufferWrapper bufferWrapper = (VertexBufferWrapper)bufferList[i];
|
||||
if (!bufferWrapper.uploaded
|
||||
|| bufferWrapper.vertexCount == 0)
|
||||
//renderPass.pushDebugGroup();
|
||||
//renderPass.popDebugGroup();
|
||||
|
||||
// bind MC Lightmap
|
||||
renderPass.bindTexture("uLightMap", this.mcLightTextureView, this.mcLightGpuSampler);
|
||||
|
||||
// set pipeline
|
||||
renderPass.setPipeline(opaquePass ? this.opaquePipeline : this.transparentPipeline);
|
||||
renderPass.setIndexBuffer(this.indexBuffer, VertexFormat.IndexType.INT);
|
||||
|
||||
// shared uniforms
|
||||
renderPass.setUniform("fragUniformBlock", this.fragUniformBuffer);
|
||||
renderPass.setUniform("vertSharedUniformBlock", this.vertSharedUniformBuffer);
|
||||
|
||||
|
||||
|
||||
|
||||
for (int lodIndex = 0; lodIndex < bufferContainers.size(); lodIndex++)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
profiler.popPush("set VBO");
|
||||
|
||||
renderPass.setVertexBuffer(0, bufferWrapper.vboGpuBuffer); // vertex buffer can only be "0" lol
|
||||
|
||||
profiler.popPush("render");
|
||||
|
||||
try
|
||||
{
|
||||
renderPass.drawIndexed(
|
||||
/*indexStart*/ 0,
|
||||
/*firstIndex*/0,
|
||||
/*indexCount*/bufferWrapper.indexCount,
|
||||
/*instanceCount*/1);
|
||||
}
|
||||
catch (IllegalStateException e)
|
||||
{
|
||||
if (!e.getMessage().contains("Vertex buffer at slot 0 has been closed"))
|
||||
profiler.popPush("binding");
|
||||
|
||||
LodBufferContainer bufferContainer = bufferContainers.get(lodIndex);
|
||||
LodContainerUniformBufferWrapper uniformWrapper = (LodContainerUniformBufferWrapper)bufferContainer.uniforms;
|
||||
|
||||
boolean columnBuilderDebugEnabled = Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugEnable.get();
|
||||
if (columnBuilderDebugEnabled)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
if (DhSectionPos.getDetailLevel(bufferContainer.pos) == Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugDetailLevel.get()
|
||||
&& DhSectionPos.getX(bufferContainer.pos) == Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugXPos.get()
|
||||
&& DhSectionPos.getZ(bufferContainer.pos) == Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugZPos.get())
|
||||
{
|
||||
int breakpoint = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
renderPass.setUniform("vertUniqueUniformBlock", uniformWrapper.gpuBuffer);
|
||||
|
||||
|
||||
|
||||
profiler.popPush("rendering");
|
||||
|
||||
// render each buffer
|
||||
IVertexBufferWrapper[] bufferWrapperList = opaquePass ? bufferContainer.vbos : bufferContainer.vbosTransparent;
|
||||
for (int i = 0; i < bufferWrapperList.length; i++)
|
||||
{
|
||||
VertexBufferWrapper bufferWrapper = (VertexBufferWrapper) bufferWrapperList[i];
|
||||
if (!bufferWrapper.uploaded
|
||||
|| bufferWrapper.vertexCount == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeBufferRenderEvent.class, new DhApiBeforeBufferRenderEvent.EventParam(renderEventParam, modelPos));
|
||||
|
||||
renderPass.setVertexBuffer(0, bufferWrapper.vboGpuBuffer); // vertex buffer can only be "0" lol
|
||||
|
||||
renderPass.drawIndexed(
|
||||
/*indexStart*/ 0,
|
||||
/*firstIndex*/0,
|
||||
/*indexCount*/bufferWrapper.indexCount,
|
||||
/*instanceCount*/1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
profiler.pop();
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.mojang.blaze3d.buffers.GpuBuffer;
|
||||
import com.mojang.blaze3d.systems.GpuDevice;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
|
||||
@Deprecated // TODO use Uniform Wrapper instead
|
||||
public class UniformHandler
|
||||
{
|
||||
|
||||
|
||||
+8
-12
@@ -24,6 +24,7 @@ import com.seibel.distanthorizons.api.interfaces.block.IDhApiBlockStateWrapper;
|
||||
import com.seibel.distanthorizons.api.interfaces.override.worldGenerator.IDhApiWorldGenerator;
|
||||
import com.seibel.distanthorizons.api.interfaces.world.IDhApiLevelWrapper;
|
||||
import com.seibel.distanthorizons.api.interfaces.factories.IDhApiWrapperFactory;
|
||||
import com.seibel.distanthorizons.common.renderTest.LodContainerUniformBufferWrapper;
|
||||
import com.seibel.distanthorizons.common.renderTest.McGenericObjectRenderer;
|
||||
import com.seibel.distanthorizons.common.renderTest.McInstancedVboContainer;
|
||||
import com.seibel.distanthorizons.common.renderTest.VertexBufferWrapper;
|
||||
@@ -40,7 +41,9 @@ import com.seibel.distanthorizons.core.util.LodUtil;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.render.ILodContainerUniformBufferWrapper;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IUniformBufferWrapper;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IVertexBufferWrapper;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
|
||||
@@ -363,22 +366,15 @@ public class WrapperFactory implements IWrapperFactory
|
||||
|
||||
|
||||
@Override
|
||||
public IVertexBufferWrapper createVboWrapper()
|
||||
{
|
||||
return new VertexBufferWrapper();
|
||||
}
|
||||
public IVertexBufferWrapper createVboWrapper() { return new VertexBufferWrapper(); }
|
||||
@Override
|
||||
public ILodContainerUniformBufferWrapper createLodContainerUniformWrapper() { return new LodContainerUniformBufferWrapper(); }
|
||||
|
||||
@Override
|
||||
public IInstancedVboContainer createInstancedVboContainer()
|
||||
{
|
||||
return new McInstancedVboContainer();
|
||||
}
|
||||
public IInstancedVboContainer createInstancedVboContainer() { return new McInstancedVboContainer(); }
|
||||
|
||||
@Override
|
||||
public IMcGenericRenderer createGenericRenderer()
|
||||
{
|
||||
return new McGenericObjectRenderer();
|
||||
}
|
||||
public IMcGenericRenderer createGenericRenderer() { return new McGenericObjectRenderer(); }
|
||||
|
||||
|
||||
|
||||
|
||||
+1
-1
Submodule coreSubProjects updated: 2a554395f7...0f539f3a6f
Reference in New Issue
Block a user