From b70c090e946c97032ebc26511197555f126f7a33 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Tue, 23 Jul 2024 19:39:44 -0500 Subject: [PATCH] Refactor and cleanup buffer building --- .../render/ColumnRenderSource.java | 2 +- .../render/bufferBuilding/ColumnBox.java | 55 +--- .../bufferBuilding/ColumnRenderBuffer.java | 43 ++- .../ColumnRenderBufferBuilder.java | 253 +++++++++--------- 4 files changed, 168 insertions(+), 185 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/ColumnRenderSource.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/ColumnRenderSource.java index 1bed16709..2ede2327c 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/ColumnRenderSource.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/ColumnRenderSource.java @@ -288,7 +288,7 @@ public class ColumnRenderSource implements IDataSource String SUBDATA_DELIMITER = ","; StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(this.pos); + stringBuilder.append(DhSectionPos.toString(this.pos)); stringBuilder.append(LINE_DELIMITER); int size = 1; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java index 0cc51e422..700baa3d8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java @@ -40,7 +40,7 @@ public class ColumnBox short xSize, short ySize, short zSize, short x, short minY, short z, int color, byte irisBlockMaterialId, byte skyLight, byte blockLight, - long topData, long bottomData, ColumnArrayView[][] adjData) + long topData, long bottomData, ColumnArrayView[] adjData) { short maxX = (short) (x + xSize); short maxY = (short) (minY + ySize); @@ -119,7 +119,7 @@ public class ColumnBox // TODO merge duplicate code //NORTH face vertex creation { - ColumnArrayView[] adjDataNorth = adjData[EDhDirection.NORTH.ordinal() - 2]; // TODO can we use something other than ordinal-2? + ColumnArrayView adjDataNorth = adjData[EDhDirection.NORTH.ordinal() - 2]; // TODO can we use something other than ordinal-2? int adjOverlapNorth = ColorUtil.INVISIBLE; if (adjDataNorth == null) { @@ -129,18 +129,9 @@ public class ColumnBox builder.addQuadAdj(EDhDirection.NORTH, x, minY, z, xSize, ySize, color, irisBlockMaterialId, LodUtil.MAX_MC_LIGHT, blockLight); } } - else if (adjDataNorth.length == 1) - { - makeAdjVerticalQuad(builder, adjDataNorth[0], EDhDirection.NORTH, x, minY, z, xSize, ySize, - color, adjOverlapNorth, irisBlockMaterialId, skyLightTop, blockLight, - topData, bottomData); - } else { - makeAdjVerticalQuad(builder, adjDataNorth[0], EDhDirection.NORTH, x, minY, z, (short) (xSize / 2), ySize, - color, adjOverlapNorth, irisBlockMaterialId, skyLightTop, blockLight, - topData, bottomData); - makeAdjVerticalQuad(builder, adjDataNorth[1], EDhDirection.NORTH, (short) (x + xSize / 2), minY, z, (short) (xSize / 2), ySize, + makeAdjVerticalQuad(builder, adjDataNorth, EDhDirection.NORTH, x, minY, z, xSize, ySize, color, adjOverlapNorth, irisBlockMaterialId, skyLightTop, blockLight, topData, bottomData); } @@ -148,26 +139,16 @@ public class ColumnBox //SOUTH face vertex creation { - ColumnArrayView[] adjDataSouth = adjData[EDhDirection.SOUTH.ordinal() - 2]; + ColumnArrayView adjDataSouth = adjData[EDhDirection.SOUTH.ordinal() - 2]; int adjOverlapSouth = ColorUtil.INVISIBLE; if (adjDataSouth == null) { if (!isTransparent || overVoid) builder.addQuadAdj(EDhDirection.SOUTH, x, minY, maxZ, xSize, ySize, color, irisBlockMaterialId, LodUtil.MAX_MC_LIGHT, blockLight); } - else if (adjDataSouth.length == 1) - { - makeAdjVerticalQuad(builder, adjDataSouth[0], EDhDirection.SOUTH, x, minY, maxZ, xSize, ySize, - color, adjOverlapSouth, irisBlockMaterialId, skyLightTop, blockLight, - topData, bottomData); - } else { - makeAdjVerticalQuad(builder, adjDataSouth[0], EDhDirection.SOUTH, x, minY, maxZ, (short) (xSize / 2), ySize, - color, adjOverlapSouth, irisBlockMaterialId, skyLightTop, blockLight, - topData, bottomData); - - makeAdjVerticalQuad(builder, adjDataSouth[1], EDhDirection.SOUTH, (short) (x + xSize / 2), minY, maxZ, (short) (xSize / 2), ySize, + makeAdjVerticalQuad(builder, adjDataSouth, EDhDirection.SOUTH, x, minY, maxZ, xSize, ySize, color, adjOverlapSouth, irisBlockMaterialId, skyLightTop, blockLight, topData, bottomData); } @@ -175,25 +156,16 @@ public class ColumnBox //WEST face vertex creation { - ColumnArrayView[] adjDataWest = adjData[EDhDirection.WEST.ordinal() - 2]; + ColumnArrayView adjDataWest = adjData[EDhDirection.WEST.ordinal() - 2]; int adjOverlapWest = ColorUtil.INVISIBLE; if (adjDataWest == null) { if (!isTransparent || overVoid) builder.addQuadAdj(EDhDirection.WEST, x, minY, z, zSize, ySize, color, irisBlockMaterialId, LodUtil.MAX_MC_LIGHT, blockLight); } - else if (adjDataWest.length == 1) - { - makeAdjVerticalQuad(builder, adjDataWest[0], EDhDirection.WEST, x, minY, z, zSize, ySize, - color, adjOverlapWest, irisBlockMaterialId, skyLightTop, blockLight, - topData, bottomData); - } else { - makeAdjVerticalQuad(builder, adjDataWest[0], EDhDirection.WEST, x, minY, z, (short) (zSize / 2), ySize, - color, adjOverlapWest, irisBlockMaterialId, skyLightTop, blockLight, - topData, bottomData); - makeAdjVerticalQuad(builder, adjDataWest[1], EDhDirection.WEST, x, minY, (short) (z + zSize / 2), (short) (zSize / 2), ySize, + makeAdjVerticalQuad(builder, adjDataWest, EDhDirection.WEST, x, minY, z, zSize, ySize, color, adjOverlapWest, irisBlockMaterialId, skyLightTop, blockLight, topData, bottomData); } @@ -201,25 +173,16 @@ public class ColumnBox //EAST face vertex creation { - ColumnArrayView[] adjDataEast = adjData[EDhDirection.EAST.ordinal() - 2]; + ColumnArrayView adjDataEast = adjData[EDhDirection.EAST.ordinal() - 2]; int adjOverlapEast = ColorUtil.INVISIBLE; if (adjData[EDhDirection.EAST.ordinal() - 2] == null) { if (!isTransparent || overVoid) builder.addQuadAdj(EDhDirection.EAST, maxX, minY, z, zSize, ySize, color, irisBlockMaterialId, LodUtil.MAX_MC_LIGHT, blockLight); } - else if (adjDataEast.length == 1) - { - makeAdjVerticalQuad(builder, adjDataEast[0], EDhDirection.EAST, maxX, minY, z, zSize, ySize, - color, adjOverlapEast, irisBlockMaterialId, skyLightTop, blockLight, - topData, bottomData); - } else { - makeAdjVerticalQuad(builder, adjDataEast[0], EDhDirection.EAST, maxX, minY, z, (short) (zSize / 2), ySize, - color, adjOverlapEast, irisBlockMaterialId, skyLightTop, blockLight, - topData, bottomData); - makeAdjVerticalQuad(builder, adjDataEast[1], EDhDirection.EAST, maxX, minY, (short) (z + zSize / 2), (short) (zSize / 2), ySize, + makeAdjVerticalQuad(builder, adjDataEast, EDhDirection.EAST, maxX, minY, z, zSize, ySize, color, adjOverlapEast, irisBlockMaterialId, skyLightTop, blockLight, topData, bottomData); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBuffer.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBuffer.java index 8a95bc2c7..81694c8a6 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBuffer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBuffer.java @@ -146,7 +146,7 @@ public class ColumnRenderBuffer implements AutoCloseable { // opaque vbos // - this.vbos = ColumnRenderBufferBuilder.resizeBuffer(this.vbos, builder.getCurrentNeededOpaqueVertexBufferCount()); + this.vbos = resizeBuffer(this.vbos, builder.getCurrentNeededOpaqueVertexBufferCount()); for (int i = 0; i < this.vbos.length; i++) { if (this.vbos[i] == null) @@ -163,7 +163,7 @@ public class ColumnRenderBuffer implements AutoCloseable // transparent vbos // - this.vbosTransparent = ColumnRenderBufferBuilder.resizeBuffer(this.vbosTransparent, builder.getCurrentNeededTransparentVertexBufferCount()); + this.vbosTransparent = resizeBuffer(this.vbosTransparent, builder.getCurrentNeededTransparentVertexBufferCount()); for (int i = 0; i < this.vbosTransparent.length; i++) { if (this.vbosTransparent[i] == null) @@ -180,10 +180,10 @@ public class ColumnRenderBuffer implements AutoCloseable private void uploadBuffersDirect(LodQuadBuilder builder, EDhApiGpuUploadMethod method) throws InterruptedException { - this.vbos = ColumnRenderBufferBuilder.resizeBuffer(this.vbos, builder.getCurrentNeededOpaqueVertexBufferCount()); + this.vbos = resizeBuffer(this.vbos, builder.getCurrentNeededOpaqueVertexBufferCount()); uploadBuffersDirect(this.vbos, builder.makeOpaqueVertexBuffers(), method); - this.vbosTransparent = ColumnRenderBufferBuilder.resizeBuffer(this.vbosTransparent, builder.getCurrentNeededTransparentVertexBufferCount()); + this.vbosTransparent = resizeBuffer(this.vbosTransparent, builder.getCurrentNeededTransparentVertexBufferCount()); uploadBuffersDirect(this.vbosTransparent, builder.makeTransparentVertexBuffers(), method); } private static void uploadBuffersDirect(GLVertexBuffer[] vbos, Iterator iter, EDhApiGpuUploadMethod method) throws InterruptedException @@ -318,9 +318,9 @@ public class ColumnRenderBuffer implements AutoCloseable - //==============// - // misc methods // - //==============// + //================// + // helper methods // + //================// /** can be used when debugging */ public boolean hasNonNullVbos() { return this.vbos != null || this.vbosTransparent != null; } @@ -366,6 +366,35 @@ public class ColumnRenderBuffer implements AutoCloseable } } + public static GLVertexBuffer[] resizeBuffer(GLVertexBuffer[] vbos, int newSize) + { + if (vbos.length == newSize) + { + return vbos; + } + + GLVertexBuffer[] newVbos = new GLVertexBuffer[newSize]; + System.arraycopy(vbos, 0, newVbos, 0, Math.min(vbos.length, newSize)); + if (newSize < vbos.length) + { + for (int i = newSize; i < vbos.length; i++) + { + if (vbos[i] != null) + { + vbos[i].close(); + } + } + } + return newVbos; + } + + + + + //================// + // base overrides // + //================// + /** * This method is called when object is no longer in use. * Called either after uploadBuffers() returned false (On buffer Upload diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBufferBuilder.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBufferBuilder.java index 495864d41..a398448d8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBufferBuilder.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBufferBuilder.java @@ -85,16 +85,8 @@ public class ColumnRenderBufferBuilder try { boolean enableTransparency = Config.Client.Advanced.Graphics.Quality.transparency.get().transparencyEnabled; - - long builderStartTime = System.currentTimeMillis(); - LodQuadBuilder builder = new LodQuadBuilder(enableTransparency, clientLevel.getClientLevelWrapper()); makeLodRenderData(builder, renderSource, adjData); - - long builderEndTime = System.currentTimeMillis(); - long buildMs = builderEndTime - builderStartTime; - //LOGGER.debug("RenderRegion end QuadBuild @ " + renderSource.pos + " took: " + buildMs); - return builder; } catch (UncheckedInterruptedException e) @@ -146,19 +138,20 @@ public class ColumnRenderBufferBuilder } private static void makeLodRenderData(LodQuadBuilder quadBuilder, ColumnRenderSource renderSource, ColumnRenderSource[] adjRegions) { - // Variable initialization - EDhApiDebugRendering debugMode = Config.Client.Advanced.Debugging.debugRendering.get(); + //=============// + // debug check // + //=============// // can be used to limit which section positions are build and thus, rendered // useful when debugging a specific section - boolean enableColumnBufferLimit = Config.Client.Advanced.Debugging.columnBuilderDebugEnable.get(); - if (enableColumnBufferLimit) + boolean columnBuilderDebugEnabled = Config.Client.Advanced.Debugging.columnBuilderDebugEnable.get(); + if (columnBuilderDebugEnabled) { if (DhSectionPos.getDetailLevel(renderSource.pos) == Config.Client.Advanced.Debugging.columnBuilderDebugDetailLevel.get() && DhSectionPos.getX(renderSource.pos) == Config.Client.Advanced.Debugging.columnBuilderDebugXPos.get() && DhSectionPos.getZ(renderSource.pos) == Config.Client.Advanced.Debugging.columnBuilderDebugZPos.get()) { - int test = 0; + int breakpoint = 0; } else { @@ -166,32 +159,22 @@ public class ColumnRenderBufferBuilder } } - byte detailLevel = renderSource.getDataDetailLevel(); - for (int x = 0; x < ColumnRenderSource.SECTION_SIZE; x++) + + + //===================// + // build each column // + //===================// + + byte thisDetailLevel = renderSource.getDataDetailLevel(); + for (int relX = 0; relX < ColumnRenderSource.SECTION_SIZE; relX++) { - for (int z = 0; z < ColumnRenderSource.SECTION_SIZE; z++) + for (int relZ = 0; relZ < ColumnRenderSource.SECTION_SIZE; relZ++) { - // can be uncommented to limit the buffer building to a specific - // relative position in this section. - // useful for debugging a single column's rendering - if (Config.Client.Advanced.Debugging.columnBuilderDebugEnable.get()) - { - int wantedX = Config.Client.Advanced.Debugging.columnBuilderDebugXRow.get(); - if (wantedX >= 0 && x != wantedX) - { - continue; - } - int wantedZ = Config.Client.Advanced.Debugging.columnBuilderDebugZRow.get(); - if (wantedZ >= 0 && z != wantedZ) - { - continue; - } - } - - + // stop the builder if requested UncheckedInterruptedException.throwIfInterrupted(); - ColumnArrayView columnRenderData = renderSource.getVerticalDataPointView(x, z); + // ignore empty/null columns + ColumnArrayView columnRenderData = renderSource.getVerticalDataPointView(relX, relZ); if (columnRenderData.size() == 0 || !RenderDataPointUtil.doesDataPointExist(columnRenderData.get(0)) || RenderDataPointUtil.isVoid(columnRenderData.get(0))) @@ -199,43 +182,66 @@ public class ColumnRenderBufferBuilder continue; } - ColumnRenderSource.DebugSourceFlag debugSourceFlag = renderSource.debugGetFlag(x, z); - - ColumnArrayView[][] adjColumnViews = new ColumnArrayView[4][]; - // We extract the adj data in the four cardinal direction - - // we first reset the adjShadeDisabled. This is used to disable the shade on the - // border when we have transparent block like water or glass - // to avoid having a "darker border" underground - // Arrays.fill(adjShadeDisabled, false); - // We check every adj block in each direction + //=============// + // debug limit // + //=============// - // If the adj block is rendered in the same region and with same detail - // and is positioned in a place that is not going to be rendered by vanilla game - // then we can set this position as adj - // We avoid cases where the adjPosition is in player chunk while the position is - // not - // to always have a wall underwater + // can be used to limit the buffer building to a specific relative position. + // useful for debugging a single column + if (columnBuilderDebugEnabled) + { + int wantedX = Config.Client.Advanced.Debugging.columnBuilderDebugXRow.get(); + if (wantedX >= 0 && relX != wantedX) + { + continue; + } + int wantedZ = Config.Client.Advanced.Debugging.columnBuilderDebugZRow.get(); + if (wantedZ >= 0 && relZ != wantedZ) + { + continue; + } + } + + + + //==================================// + // get adjacent render data columns // + //==================================// + + ColumnArrayView[] adjColumnViews = new ColumnArrayView[EDhDirection.ADJ_DIRECTIONS.length]; for (EDhDirection lodDirection : EDhDirection.ADJ_DIRECTIONS) { try { - int xAdj = x + lodDirection.getNormal().x; - int zAdj = z + lodDirection.getNormal().z; - boolean isCrossRegionBoundary = + int xAdj = relX + lodDirection.getNormal().x; + int zAdj = relZ + lodDirection.getNormal().z; + boolean isCrossRenderSourceBoundary = (xAdj < 0 || xAdj >= ColumnRenderSource.SECTION_SIZE) || (zAdj < 0 || zAdj >= ColumnRenderSource.SECTION_SIZE); ColumnRenderSource adjRenderSource; byte adjDetailLevel; - //we check if the detail of the adjPos is equal to the correct one (region border fix) - //or if the detail is wrong by 1 value (region+circle border fix) - if (isCrossRegionBoundary) + + + //=========================// + // get the adjacent render // + // source if present // + //=========================// + + if (!isCrossRenderSourceBoundary) { - //we compute at which detail that position should be rendered + // the adjacent position is inside this same render source + adjRenderSource = renderSource; + adjDetailLevel = thisDetailLevel; + } + else + { + // the adjacent position is outside this render source + + // skip empty sections adjRenderSource = adjRegions[lodDirection.ordinal() - 2]; if (adjRenderSource == null) { @@ -243,57 +249,65 @@ public class ColumnRenderBufferBuilder } adjDetailLevel = adjRenderSource.getDataDetailLevel(); - if (adjDetailLevel != detailLevel) + if (adjDetailLevel == thisDetailLevel) { - //TODO: Implement this + // if the adjacent position is outside this render source, + // wrap the position around so it's inside the adjacent source + + if (xAdj < 0) + { + xAdj += ColumnRenderSource.SECTION_SIZE; + } + if (xAdj >= ColumnRenderSource.SECTION_SIZE) + { + xAdj -= ColumnRenderSource.SECTION_SIZE; + } + + if (zAdj < 0) + { + zAdj += ColumnRenderSource.SECTION_SIZE; + } + if (zAdj >= ColumnRenderSource.SECTION_SIZE) + { + zAdj -= ColumnRenderSource.SECTION_SIZE; + } } else { - if (xAdj < 0) - xAdj += ColumnRenderSource.SECTION_SIZE; - - if (zAdj < 0) - zAdj += ColumnRenderSource.SECTION_SIZE; - - if (xAdj >= ColumnRenderSource.SECTION_SIZE) - xAdj -= ColumnRenderSource.SECTION_SIZE; - - if (zAdj >= ColumnRenderSource.SECTION_SIZE) - zAdj -= ColumnRenderSource.SECTION_SIZE; + // TODO: handle adjacent sections with a lower detail level + // if not handled sometimes holes will appear on the boarder + // between high and low detail sections, + // since the low detail section assumes it is next to another + // low detail section that would cover the hole. } } - else - { - adjRenderSource = renderSource; - adjDetailLevel = detailLevel; - } - if (adjDetailLevel < detailLevel - 1 || adjDetailLevel > detailLevel + 1) - { - continue; - } - if (adjDetailLevel == detailLevel || adjDetailLevel > detailLevel) - { - adjColumnViews[lodDirection.ordinal() - 2] = new ColumnArrayView[1]; - adjColumnViews[lodDirection.ordinal() - 2][0] = adjRenderSource.getVerticalDataPointView(xAdj, zAdj); - } - else - { - adjColumnViews[lodDirection.ordinal() - 2] = new ColumnArrayView[2]; - adjColumnViews[lodDirection.ordinal() - 2][0] = adjRenderSource.getVerticalDataPointView(xAdj, zAdj); - adjColumnViews[lodDirection.ordinal() - 2][1] = adjRenderSource.getVerticalDataPointView( - xAdj + (lodDirection.getAxis() == EDhDirection.Axis.X ? 0 : 1), - zAdj + (lodDirection.getAxis() == EDhDirection.Axis.Z ? 0 : 1)); - } + + //========================// + // get the adjacent views // + //========================// + + // the old logic handled additional cases, but they never appeared to fire, + // so just these two cases should be fine + LodUtil.assertTrue(adjDetailLevel == thisDetailLevel || adjDetailLevel > thisDetailLevel); + + adjColumnViews[lodDirection.ordinal() - 2] = adjRenderSource.getVerticalDataPointView(xAdj, zAdj); } catch (RuntimeException e) { - EVENT_LOGGER.warn("Failed to get adj data for [" + detailLevel + ":" + x + "," + z + "] at [" + lodDirection + "], Error: "+e.getMessage(), e); + EVENT_LOGGER.warn("Failed to get adj data for relative pos: [" + thisDetailLevel + ":" + relX + "," + relZ + "] at [" + lodDirection + "], Error: "+e.getMessage(), e); } } // for adjacent directions + + //==========================// + // build this render column // + //==========================// + + ColumnRenderSource.DebugSourceFlag debugSourceFlag = renderSource.debugGetFlag(relX, relZ); + // We render every vertical lod present in this position // We only stop when we find a block that is void or non-existing block for (int i = 0; i < columnRenderData.size(); i++) @@ -319,8 +333,11 @@ public class ColumnRenderBufferBuilder long topDataPoint = (i - 1) >= 0 ? columnRenderData.get(i - 1) : RenderDataPointUtil.EMPTY_DATA; long bottomDataPoint = (i + 1) < columnRenderData.size() ? columnRenderData.get(i + 1) : RenderDataPointUtil.EMPTY_DATA; - addLodToBuffer(data, topDataPoint, bottomDataPoint, adjColumnViews, detailLevel, - x, z, quadBuilder, debugMode, debugSourceFlag); + addLodToBuffer( + data, topDataPoint, bottomDataPoint, + adjColumnViews, + thisDetailLevel, relX, relZ, + quadBuilder, debugSourceFlag); } }// for z @@ -329,16 +346,17 @@ public class ColumnRenderBufferBuilder quadBuilder.finalizeData(); } private static void addLodToBuffer( - long data, long topData, long bottomData, ColumnArrayView[][] adjColumnViews, - byte detailLevel, int offsetPosX, int offsetOosZ, LodQuadBuilder quadBuilder, - EDhApiDebugRendering debugging, ColumnRenderSource.DebugSourceFlag debugSource) + long data, long topData, long bottomData, + ColumnArrayView[] adjColumnViews, + byte detailLevel, int renderSourceOffsetPosX, int renderSourceOffsetPosZ, + LodQuadBuilder quadBuilder, ColumnRenderSource.DebugSourceFlag debugSource) { - DhLodPos blockOffsetPos = new DhLodPos(detailLevel, offsetPosX, offsetOosZ).convertToDetailLevel(LodUtil.BLOCK_DETAIL_LEVEL); + long sectionPos = DhSectionPos.encode(detailLevel, renderSourceOffsetPosX, renderSourceOffsetPosZ); short width = (short) BitShiftUtil.powerOfTwo(detailLevel); - short x = (short) blockOffsetPos.x; + short x = (short) DhSectionPos.getMinCornerBlockX(sectionPos); short yMin = RenderDataPointUtil.getYMin(data); - short z = (short) (short) blockOffsetPos.z; + short z = (short) DhSectionPos.getMinCornerBlockZ(sectionPos); short ySize = (short) (RenderDataPointUtil.getYMax(data) - yMin); if (ySize == 0) @@ -347,7 +365,7 @@ public class ColumnRenderBufferBuilder } else if (ySize < 0) { - throw new IllegalArgumentException("Negative y size for the data! Data: " + RenderDataPointUtil.toString(data)); + throw new IllegalArgumentException("Negative y size for the data! Data: [" + RenderDataPointUtil.toString(data) + "]."); } byte blockMaterialId = RenderDataPointUtil.getBlockMaterialId(data); @@ -356,6 +374,7 @@ public class ColumnRenderBufferBuilder int color; boolean fullBright = false; + EDhApiDebugRendering debugging = Config.Client.Advanced.Debugging.debugRendering.get(); switch (debugging) { case OFF: @@ -468,32 +487,4 @@ public class ColumnRenderBufferBuilder topData, bottomData, adjColumnViews); // setAdjData } - - - //=================// - // vbo interaction // - //=================// - - public static GLVertexBuffer[] resizeBuffer(GLVertexBuffer[] vbos, int newSize) - { - if (vbos.length == newSize) - { - return vbos; - } - - GLVertexBuffer[] newVbos = new GLVertexBuffer[newSize]; - System.arraycopy(vbos, 0, newVbos, 0, Math.min(vbos.length, newSize)); - if (newSize < vbos.length) - { - for (int i = newSize; i < vbos.length; i++) - { - if (vbos[i] != null) - { - vbos[i].close(); - } - } - } - return newVbos; - } - }