Only upload unique LOD uniforms once
This commit is contained in:
+7
-3
@@ -180,8 +180,7 @@ public class McLodRenderer implements IMcLodRenderer
|
||||
for (int lodIndex = 0; lodIndex < bufferContainers.size(); lodIndex++)
|
||||
{
|
||||
LodBufferContainer bufferContainer = bufferContainers.get(lodIndex);
|
||||
bufferContainer.uniforms.createBufferData(renderEventParam, bufferContainer);
|
||||
bufferContainer.uniforms.upload();
|
||||
bufferContainer.uniformContainer.tryUpload();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,6 +210,7 @@ public class McLodRenderer implements IMcLodRenderer
|
||||
.putFloat() // uMircoOffset
|
||||
.putFloat() // uEarthRadius
|
||||
|
||||
.putVec3() // uCameraPos
|
||||
.putMat4f() // uCombinedMatrix
|
||||
.get();
|
||||
|
||||
@@ -223,6 +223,10 @@ public class McLodRenderer implements IMcLodRenderer
|
||||
.putFloat(0.01f) // uMircoOffset // 0.01 block offset
|
||||
.putFloat(earthCurveRatio) // uEarthRadius
|
||||
|
||||
.putVec3(
|
||||
(float)renderEventParam.exactCameraPosition.x,
|
||||
(float)renderEventParam.exactCameraPosition.y,
|
||||
(float)renderEventParam.exactCameraPosition.z) // uCameraPos
|
||||
.putMat4f(combinedMatrix.createJomlMatrix()) // uCombinedMatrix
|
||||
.get();
|
||||
|
||||
@@ -337,7 +341,7 @@ public class McLodRenderer implements IMcLodRenderer
|
||||
profiler.popPush("binding");
|
||||
|
||||
LodBufferContainer bufferContainer = bufferContainers.get(lodIndex);
|
||||
LodUniformBufferWrapper uniformWrapper = (LodUniformBufferWrapper)bufferContainer.uniforms;
|
||||
LodUniformBufferWrapper uniformWrapper = (LodUniformBufferWrapper)bufferContainer.uniformContainer;
|
||||
|
||||
boolean columnBuilderDebugEnabled = Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugEnable.get();
|
||||
if (columnBuilderDebugEnabled)
|
||||
|
||||
+31
-11
@@ -14,9 +14,21 @@ import java.nio.ByteBuffer;
|
||||
/**
|
||||
* TODO ??
|
||||
*/
|
||||
public class LodUniformBufferWrapper extends AbstractUniformBufferWrapper implements ILodContainerUniformBufferWrapper
|
||||
public class LodUniformBufferWrapper extends UniformBufferWrapper implements ILodContainerUniformBufferWrapper
|
||||
{
|
||||
|
||||
private boolean uploaded = false;
|
||||
|
||||
|
||||
|
||||
//=============//
|
||||
// constructor //
|
||||
//=============//
|
||||
//region
|
||||
|
||||
public LodUniformBufferWrapper() { super(LodUniformBufferWrapper.class.getName()); }
|
||||
|
||||
//endregion
|
||||
|
||||
|
||||
|
||||
@@ -25,18 +37,13 @@ public class LodUniformBufferWrapper extends AbstractUniformBufferWrapper implem
|
||||
//========//
|
||||
//region
|
||||
|
||||
public void createBufferData(RenderParams renderEventParam, LodBufferContainer bufferContainer)
|
||||
@Override
|
||||
public void createUniformData(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);
|
||||
|
||||
(float) (bufferContainer.minCornerBlockPos.getX()),
|
||||
(float) (bufferContainer.minCornerBlockPos.getY()),
|
||||
(float) (bufferContainer.minCornerBlockPos.getZ()));
|
||||
|
||||
// upload data //
|
||||
|
||||
@@ -51,6 +58,19 @@ public class LodUniformBufferWrapper extends AbstractUniformBufferWrapper implem
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tryUpload()
|
||||
{
|
||||
if (this.uploaded)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
this.upload();
|
||||
|
||||
this.uploaded = true;
|
||||
}
|
||||
|
||||
//endregion
|
||||
|
||||
}
|
||||
|
||||
+32
-16
@@ -5,6 +5,7 @@ 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.common.render.blaze.wrappers.buffer.VertexBufferWrapper;
|
||||
import com.seibel.distanthorizons.core.logging.DhLogger;
|
||||
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
||||
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IUniformBufferWrapper;
|
||||
@@ -12,7 +13,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.render.IUniformBufferWr
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
|
||||
public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrapper
|
||||
public class UniformBufferWrapper implements IUniformBufferWrapper
|
||||
{
|
||||
private static final DhLogger LOGGER = new DhLoggerBuilder().build();
|
||||
|
||||
@@ -22,7 +23,10 @@ public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrap
|
||||
|
||||
private final String name;
|
||||
|
||||
private ByteBuffer buffer = null;
|
||||
private int cpuBufferSize = 0;
|
||||
private int gpuBufferSize = 0;
|
||||
|
||||
private ByteBuffer cpuBuffer = null;
|
||||
public GpuBuffer gpuBuffer = null;
|
||||
|
||||
|
||||
@@ -32,7 +36,7 @@ public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrap
|
||||
//=============//
|
||||
//region
|
||||
|
||||
public AbstractUniformBufferWrapper() { this.name = this.getClass().getSimpleName(); }
|
||||
public UniformBufferWrapper(String name) { this.name = name; }
|
||||
|
||||
//endregion
|
||||
|
||||
@@ -45,37 +49,49 @@ public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrap
|
||||
|
||||
protected ByteBuffer getOrCreateBuffer(int size)
|
||||
{
|
||||
if (this.buffer == null
|
||||
|| this.buffer.capacity() != size)
|
||||
if (this.cpuBuffer == null
|
||||
|| this.cpuBufferSize != size)
|
||||
{
|
||||
this.buffer = ByteBuffer.allocateDirect(size);
|
||||
this.buffer.order(ByteOrder.nativeOrder());
|
||||
this.cpuBuffer = ByteBuffer.allocateDirect(size);
|
||||
this.cpuBuffer.order(ByteOrder.nativeOrder());
|
||||
|
||||
int usage = GpuBuffer.USAGE_COPY_DST
|
||||
| GpuBuffer.USAGE_VERTEX
|
||||
| GpuBuffer.USAGE_UNIFORM;
|
||||
int byteSize = (this.buffer.limit() - this.buffer.position());
|
||||
this.gpuBuffer = GPU_DEVICE.createBuffer(this::getBufferName, usage, byteSize);
|
||||
this.cpuBufferSize = size;
|
||||
}
|
||||
|
||||
return this.buffer;
|
||||
return this.cpuBuffer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void upload() throws IllegalStateException
|
||||
{
|
||||
if (this.buffer == null)
|
||||
if (this.cpuBuffer == null)
|
||||
{
|
||||
throw new IllegalStateException("Upload called before buffer was created");
|
||||
}
|
||||
|
||||
if (this.gpuBuffer == null
|
||||
|| this.gpuBufferSize != this.cpuBufferSize)
|
||||
{
|
||||
if (this.gpuBuffer != null)
|
||||
{
|
||||
this.gpuBuffer.close();
|
||||
}
|
||||
|
||||
int usage = GpuBuffer.USAGE_COPY_DST
|
||||
| GpuBuffer.USAGE_VERTEX
|
||||
| GpuBuffer.USAGE_UNIFORM;
|
||||
this.gpuBuffer = GPU_DEVICE.createBuffer(this::getBufferName, usage, this.cpuBufferSize);
|
||||
|
||||
this.gpuBufferSize = this.cpuBufferSize;
|
||||
}
|
||||
|
||||
|
||||
int byteSize = (this.buffer.limit() - this.buffer.position());
|
||||
|
||||
int byteSize = (this.cpuBuffer.limit() - this.cpuBuffer.position());
|
||||
GpuBufferSlice bufferSlice = new GpuBufferSlice(this.gpuBuffer, /*offset*/0, byteSize);
|
||||
if (!bufferSlice.buffer().isClosed())
|
||||
{
|
||||
COMMAND_ENCODER.writeToBuffer(bufferSlice, this.buffer);
|
||||
COMMAND_ENCODER.writeToBuffer(bufferSlice, this.cpuBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
+1
-1
Submodule coreSubProjects updated: 39dd1c8509...e1a932cf38
Reference in New Issue
Block a user