diff --git a/src/main/java/com/seibel/lod/Main.java b/src/main/java/com/seibel/lod/Main.java deleted file mode 100644 index 0417cb22d..000000000 --- a/src/main/java/com/seibel/lod/Main.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.seibel.lod; - -import java.util.HashMap; -import java.util.Map; - -import com.seibel.lod.builders.lodTemplates.Box; -import com.seibel.lod.config.LodConfig; -import com.seibel.lod.enums.HorizontalQuality; -import com.seibel.lod.enums.HorizontalScale; -import com.seibel.lod.util.DataPointUtil; - -import net.minecraft.util.Direction; - -public class Main -{ - public static void main(String[] args) - { - for(byte detail = 0; detail < 13; detail++) - { - byte minGenDetail = 0; - byte maxDetail = 10; - int distance; - if (detail <= minGenDetail) - distance = 0; - else if (detail >= maxDetail) - distance = 10000; - else - { - int distanceUnit = HorizontalScale.LOW.distanceUnit; - switch (HorizontalQuality.HIGH) - { - case LINEAR: - ; - distance = (detail * distanceUnit); - default: - double base = HorizontalQuality.HIGH.quadraticBase; - distance = (int) (Math.pow(base, detail) * distanceUnit); - } - } - System.out.println(distance); - } - } -} diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilder.java similarity index 79% rename from src/main/java/com/seibel/lod/builders/LodBufferBuilder.java rename to src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilder.java index 759e46ead..95de06517 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilder.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.seibel.lod.builders; +package com.seibel.lod.builders.bufferBuilding; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -32,7 +32,7 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL15C; -import com.seibel.lod.builders.lodTemplates.Box; +import com.seibel.lod.builders.bufferBuilding.lodTemplates.Box; import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.VerticalQuality; import com.seibel.lod.objects.LodDimension; @@ -70,66 +70,87 @@ public class LodBufferBuilder * This holds the threads used to generate buffers. */ public static ExecutorService bufferBuilderThreads = Executors.newFixedThreadPool(LodConfig.CLIENT.threading.numberOfBufferBuilderThreads.get(), new LodThreadFactory(LodBufferBuilder.class.getSimpleName() + " - builder")); - + /** - * The buffers that are used to create LODs using far fog + * This boolean matrix indicate the buffer builder in that position has to be regenerated */ - public volatile BufferBuilder[][] buildableBuffers; - + public volatile boolean[][] regenPos; + + /** + * This boolean indicate that all buffer need to be regenerated + */ + public volatile boolean fullRegeneration = false; + + /** + * max capacity of buffers + */ + //public volatile int BUFFER_MAX_CAPACITY = 1 << (26); + public volatile int BUFFER_MAX_CAPACITY = (int) (64 * Math.pow(10, 6)); + + /** + * buffer builder for the vertex + */ + public volatile int[][] bufferSize; + + /** + * buffer builder for the vertex + */ + public volatile BufferBuilder[][][] buildableBuffers; + /** * Used when building new VBOs */ - public volatile VertexBuffer[][] buildableVbos; - + public volatile VertexBuffer[][][] buildableVbos; + /** * VBOs that are sent over to the LodNodeRenderer */ - public volatile VertexBuffer[][] drawableVbos; - + public volatile VertexBuffer[][][] drawableVbos; + /** * if this is true the LOD buffers are currently being * regenerated. */ public boolean generatingBuffers = false; - + /** * if this is true new LOD buffers have been generated * and are waiting to be swapped with the drawable buffers */ private boolean switchVbos = false; - + /** * Size of the buffer builders in bytes last time we created them */ public int previousBufferSize = 0; - + /** * Width of the dimension in regions last time we created the buffers */ public int previousRegionWidth = 0; - + /** * this is used to prevent multiple threads creating, destroying, or using the buffers at the same time */ private ReentrantLock bufferLock = new ReentrantLock(); - + private volatile Box[][] boxCache; private volatile PosToRenderContainer[][] setsToRender; private volatile RegionPos center; - + /** * This is the ChunkPos the player was at the last time the buffers were built. * IE the center of the buffers last time they were built */ private volatile ChunkPos drawableCenterChunkPos = new ChunkPos(0, 0); private volatile ChunkPos buildableCenterChunkPos = new ChunkPos(0, 0); - - + + public LodBufferBuilder() { - + } - + /** * Create a thread to asynchronously generate LOD buffers * centered around the given camera X and Z. @@ -140,61 +161,60 @@ public class LodBufferBuilder * swapped with the drawable buffers in the LodRenderer to be drawn. */ public void generateLodBuffersAsync(LodRenderer renderer, LodDimension lodDim, - BlockPos playerBlockPos, boolean fullRegen) + BlockPos playerBlockPos, boolean fullRegen) { - + // only allow one generation process to happen at a time if (generatingBuffers) return; - + if (buildableBuffers == null) // setupBuffers hasn't been called yet return; - + generatingBuffers = true; - + // round the player's block position down to the nearest chunk BlockPos ChunkPos playerChunkPos = new ChunkPos(playerBlockPos); BlockPos playerBlockPosRounded = playerChunkPos.getWorldPosition(); - + Thread thread = new Thread(() -> { bufferLock.lock(); - + try { long startTime = System.currentTimeMillis(); - + ArrayList> nodeToRenderThreads = new ArrayList<>(lodDim.getWidth() * lodDim.getWidth()); - + startBuffers(fullRegen, lodDim); - - + + RegionPos playerRegionPos = new RegionPos(playerChunkPos); if (center == null) center = playerRegionPos; - + if (setsToRender == null) setsToRender = new PosToRenderContainer[lodDim.getWidth()][lodDim.getWidth()]; - + if (setsToRender.length != lodDim.getWidth()) setsToRender = new PosToRenderContainer[lodDim.getWidth()][lodDim.getWidth()]; - + if (boxCache == null) boxCache = new Box[lodDim.getWidth()][lodDim.getWidth()]; - + if (boxCache.length != lodDim.getWidth()) boxCache = new Box[lodDim.getWidth()][lodDim.getWidth()]; - + // this will be the center of the VBOs once they have been built buildableCenterChunkPos = playerChunkPos; - - - + + //================================// // create the nodeToRenderThreads // //================================// - + for (int xRegion = 0; xRegion < lodDim.getWidth(); xRegion++) { for (int zRegion = 0; zRegion < lodDim.getWidth(); zRegion++) @@ -204,53 +224,53 @@ public class LodBufferBuilder RegionPos regionPos = new RegionPos( xRegion + lodDim.getCenterRegionPosX() - Math.floorDiv(lodDim.getWidth(), 2), zRegion + lodDim.getCenterRegionPosZ() - Math.floorDiv(lodDim.getWidth(), 2)); - + // local position in the vbo and bufferBuilder arrays - BufferBuilder currentBuffer = buildableBuffers[xRegion][zRegion]; + BufferBuilder[] currentBuffers = buildableBuffers[xRegion][zRegion]; LodRegion region = lodDim.getRegion(regionPos.x, regionPos.z); - + if (region == null) continue; - + // make sure the buffers weren't // changed while we were running this method - if (currentBuffer == null || !currentBuffer.building()) + if (currentBuffers == null || !currentBuffers[0].building()) return; - + byte minDetail = region.getMinDetailLevel(); - - + + final int xR = xRegion; final int zR = zRegion; Callable dataToRenderThread = () -> { Map adjData = new HashMap<>(); - + // determine how many LODs we can stack vertically int maxVerticalData = 1; if (LodConfig.CLIENT.worldGenerator.lodQualityMode.get() == VerticalQuality.VOXEL) maxVerticalData = 256; - + // create adjData's arrays for (Direction direction : Box.ADJ_DIRECTIONS) adjData.put(direction, new long[maxVerticalData]); - + //previous setToRender cache if (setsToRender[xR][zR] == null) setsToRender[xR][zR] = new PosToRenderContainer(minDetail, regionPos.x, regionPos.z); - + if (boxCache[xR][zR] == null) boxCache[xR][zR] = new Box(); - + PosToRenderContainer posToRender = setsToRender[xR][zR]; posToRender.clear(minDetail, regionPos.x, regionPos.z); - + lodDim.getDataToRender( posToRender, regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ()); - + byte detailLevel; int posX; int posZ; @@ -258,30 +278,31 @@ public class LodBufferBuilder int zAdj; int chunkXdist; int chunkZdist; - + int bufferIndex; // keep a local version so we don't have to worry about indexOutOfBounds Exceptions // if it changes in the LodRenderer while we are working here boolean[][] vanillaRenderedChunks = renderer.vanillaRenderedChunks; short gameChunkRenderDistance = (short) (vanillaRenderedChunks.length / 2 - 1); - + for (int index = 0; index < posToRender.getNumberOfPos(); index++) { + bufferIndex = Math.floorMod(index, currentBuffers.length); detailLevel = posToRender.getNthDetailLevel(index); posX = posToRender.getNthPosX(index); posZ = posToRender.getNthPosZ(index); - + // skip any chunks that Minecraft is going to render chunkXdist = LevelPosUtil.getChunkPos(detailLevel, posX) - playerChunkPos.x; chunkZdist = LevelPosUtil.getChunkPos(detailLevel, posZ) - playerChunkPos.z; - + if (gameChunkRenderDistance >= Math.abs(chunkXdist) - && gameChunkRenderDistance >= Math.abs(chunkZdist) - && detailLevel <= LodUtil.CHUNK_DETAIL_LEVEL - && vanillaRenderedChunks[chunkXdist + gameChunkRenderDistance + 1][chunkZdist + gameChunkRenderDistance + 1]) + && gameChunkRenderDistance >= Math.abs(chunkZdist) + && detailLevel <= LodUtil.CHUNK_DETAIL_LEVEL + && vanillaRenderedChunks[chunkXdist + gameChunkRenderDistance + 1][chunkZdist + gameChunkRenderDistance + 1]) { continue; } - + // skip any chunks that Minecraft is going to render for (Direction direction : Box.ADJ_DIRECTIONS) { @@ -290,12 +311,12 @@ public class LodBufferBuilder chunkXdist = LevelPosUtil.getChunkPos(detailLevel, xAdj) - playerChunkPos.x; chunkZdist = LevelPosUtil.getChunkPos(detailLevel, zAdj) - playerChunkPos.z; boolean performFaceCulling = true; - + if (performFaceCulling - && posToRender.contains(detailLevel, xAdj, zAdj) - && (gameChunkRenderDistance < Math.abs(chunkXdist) - || gameChunkRenderDistance < Math.abs(chunkZdist) - || !vanillaRenderedChunks[chunkXdist + gameChunkRenderDistance + 1][chunkZdist + gameChunkRenderDistance + 1])) + && posToRender.contains(detailLevel, xAdj, zAdj) + && (gameChunkRenderDistance < Math.abs(chunkXdist) + || gameChunkRenderDistance < Math.abs(chunkZdist) + || !vanillaRenderedChunks[chunkXdist + gameChunkRenderDistance + 1][chunkZdist + gameChunkRenderDistance + 1])) { if (!adjData.containsKey(direction) || adjData.get(direction) == null) adjData.put(direction, new long[maxVerticalData]); @@ -304,36 +325,34 @@ public class LodBufferBuilder long data = lodDim.getData(detailLevel, xAdj, zAdj, verticalIndex); adjData.get(direction)[verticalIndex] = data; } - } - else + } else { adjData.put(direction, null); } } - + long data; for (int verticalIndex = 0; verticalIndex < lodDim.getMaxVerticalData(detailLevel, posX, posZ); verticalIndex++) { data = lodDim.getData(detailLevel, posX, posZ, verticalIndex); if (DataPointUtil.isVoid(data) || !DataPointUtil.doesItExist(data)) break; - - LodConfig.CLIENT.graphics.lodTemplate.get().template.addLodToBuffer(currentBuffer, playerBlockPosRounded, data, adjData, + + LodConfig.CLIENT.graphics.lodTemplate.get().template.addLodToBuffer(currentBuffers[bufferIndex], playerBlockPosRounded, data, adjData, detailLevel, posX, posZ, boxCache[xR][zR], renderer.previousDebugMode, renderer.lightMap); } - - + + } // for pos to in list to render - // the thread executed successfully + // the thread executed successfully return true; }; nodeToRenderThreads.add(dataToRenderThread); } } // region z } // region z - - - + + long executeStart = System.currentTimeMillis(); // wait for all threads to finish List> futuresBuffer = bufferBuilderThreads.invokeAll(nodeToRenderThreads); @@ -348,49 +367,47 @@ public class LodBufferBuilder } } long executeEnd = System.currentTimeMillis(); - - + + long endTime = System.currentTimeMillis(); @SuppressWarnings("unused") long buildTime = endTime - startTime; @SuppressWarnings("unused") long executeTime = executeEnd - executeStart; - + // ClientProxy.LOGGER.info("Thread Build time: " + buildTime + " ms" + '\n' + // "thread execute time: " + executeTime + " ms"); - + // mark that the buildable buffers as ready to swap switchVbos = true; - } - catch (Exception e) + } catch (Exception e) { ClientProxy.LOGGER.warn("\"LodNodeBufferBuilder.generateLodBuffersAsync\" ran into trouble: "); e.printStackTrace(); - } - finally + } finally { // regardless of if we successfully created the buffers // we are done generating. generatingBuffers = false; - + // clean up any potentially open resources if (buildableBuffers != null) closeBuffers(fullRegen, lodDim); - + // upload the new buffers uploadBuffers(fullRegen, lodDim); bufferLock.unlock(); } - + }); - + mainGenThread.execute(thread); } - + //===============================// // BufferBuilder related methods // //===============================// - + /** * Called from the LodRenderer to create the * BufferBuilders.

@@ -401,29 +418,51 @@ public class LodBufferBuilder { bufferLock.lock(); int numbRegionsWide = lodDimension.getWidth(); - int bufferMaxCapacity; - + long memoryRequired; + int numberOfBuffers; + previousRegionWidth = numbRegionsWide; - buildableBuffers = new BufferBuilder[numbRegionsWide][numbRegionsWide]; - - buildableVbos = new VertexBuffer[numbRegionsWide][numbRegionsWide]; - drawableVbos = new VertexBuffer[numbRegionsWide][numbRegionsWide]; - + bufferSize = new int[numbRegionsWide][numbRegionsWide]; + buildableBuffers = new BufferBuilder[numbRegionsWide][numbRegionsWide][]; + + buildableVbos = new VertexBuffer[numbRegionsWide][numbRegionsWide][]; + drawableVbos = new VertexBuffer[numbRegionsWide][numbRegionsWide][]; + for (int x = 0; x < numbRegionsWide; x++) { for (int z = 0; z < numbRegionsWide; z++) { - bufferMaxCapacity = lodDimension.getMemoryRequired(x, z, LodConfig.CLIENT.graphics.lodTemplate.get()); - buildableBuffers[x][z] = new BufferBuilder(bufferMaxCapacity); - - buildableVbos[x][z] = new VertexBuffer(LodRenderer.LOD_VERTEX_FORMAT); - drawableVbos[x][z] = new VertexBuffer(LodRenderer.LOD_VERTEX_FORMAT); + memoryRequired = lodDimension.getMemoryRequired(x, z, LodConfig.CLIENT.graphics.lodTemplate.get()); + //if the memory required is less than the max buffer capacity we divide the memory across multiple buffers + if (BUFFER_MAX_CAPACITY > memoryRequired) + { + bufferSize[x][z] = 1; + buildableBuffers[x][z] = new BufferBuilder[1]; + buildableVbos[x][z] = new VertexBuffer[1]; + drawableVbos[x][z] = new VertexBuffer[1]; + } else + { + numberOfBuffers = (int) Math.ceil(memoryRequired / BUFFER_MAX_CAPACITY)+1; + System.out.println(numberOfBuffers); + memoryRequired = BUFFER_MAX_CAPACITY; + bufferSize[x][z] = numberOfBuffers; + buildableBuffers[x][z] = new BufferBuilder[numberOfBuffers]; + buildableVbos[x][z] = new VertexBuffer[numberOfBuffers]; + drawableVbos[x][z] = new VertexBuffer[numberOfBuffers]; + } + + for (int i = 0; i < bufferSize[x][z]; i++) + { + buildableBuffers[x][z][i] = new BufferBuilder((int) memoryRequired); + buildableVbos[x][z][i] = new VertexBuffer(LodRenderer.LOD_VERTEX_FORMAT); + drawableVbos[x][z][i] = new VertexBuffer(LodRenderer.LOD_VERTEX_FORMAT); + } } } - + bufferLock.unlock(); } - + /** * sets the buffers and Vbos to null, forcing them to be recreated.

*

@@ -432,14 +471,14 @@ public class LodBufferBuilder public void destroyBuffers() { bufferLock.lock(); - + buildableBuffers = null; buildableVbos = null; drawableVbos = null; - + bufferLock.unlock(); } - + /** * Calls begin on each of the buildable BufferBuilders. */ @@ -454,14 +493,18 @@ public class LodBufferBuilder // for some reason BufferBuilder.vertexCounts // isn't reset unless this is called, which can cause // a false indexOutOfBoundsException - buildableBuffers[x][z].discard(); - - buildableBuffers[x][z].begin(GL11.GL_QUADS, LodRenderer.LOD_VERTEX_FORMAT); + + for (int i = 0; i < buildableBuffers[x][z].length; i++) + { + buildableBuffers[x][z][i].discard(); + + buildableBuffers[x][z][i].begin(GL11.GL_QUADS, LodRenderer.LOD_VERTEX_FORMAT); + } } } } } - + /** * Calls end on each of the buildable BufferBuilders. */ @@ -469,48 +512,54 @@ public class LodBufferBuilder { for (int x = 0; x < buildableBuffers.length; x++) for (int z = 0; z < buildableBuffers.length; z++) - if (buildableBuffers[x][z] != null && buildableBuffers[x][z].building() && (fullRegen || lodDim.doesRegionNeedBufferRegen(x, z))) - buildableBuffers[x][z].end(); + for (int i = 0; i < buildableBuffers[x][z].length; i++) + { + if (buildableBuffers[x][z][i] != null && buildableBuffers[x][z][i].building() && (fullRegen || lodDim.doesRegionNeedBufferRegen(x, z))) + { + buildableBuffers[x][z][i].end(); + } + } } - + /** * Upload all buildableBuffers to the GPU. */ private void uploadBuffers(boolean fullRegen, LodDimension lodDim) { GlProxy glProxy = GlProxy.getInstance(); - + try { // make sure we are uploading to a different OpenGL context, // to prevent interference (IE stuttering) with the Minecraft context. glProxy.setGlContext(GlProxyContext.LOD_BUILDER); - + for (int x = 0; x < buildableVbos.length; x++) { for (int z = 0; z < buildableVbos.length; z++) { if (fullRegen || lodDim.doesRegionNeedBufferRegen(x, z)) { - ByteBuffer builderBuffer = buildableBuffers[x][z].popNextBuffer().getSecond(); - vboUpload(buildableVbos[x][z], builderBuffer); - lodDim.setRegenRegionBufferByArrayIndex(x, z, false); + for (int i = 0; i < buildableBuffers[x][z].length; i++) + { + ByteBuffer builderBuffer = buildableBuffers[x][z][i].popNextBuffer().getSecond(); + vboUpload(buildableVbos[x][z][i], builderBuffer); + lodDim.setRegenRegionBufferByArrayIndex(x, z, false); + } } } } - } - catch (IllegalStateException e) + } catch (IllegalStateException e) { ClientProxy.LOGGER.error(LodBufferBuilder.class.getSimpleName() + " - UploadBuffers failed: " + e.getMessage()); e.printStackTrace(); - } - finally + } finally { // make sure the context is disabled glProxy.setGlContext(GlProxyContext.NONE); } } - + /** * Uploads the uploadBuffer into the VBO in GPU memory. */ @@ -521,22 +570,22 @@ public class LodBufferBuilder { // this is how many points will be rendered vbo.vertexCount = (uploadBuffer.remaining() / vbo.format.getVertexSize()); - + GL15C.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo.id); - + // subData only works if the memory is allocated beforehand. GL15C.glBufferData(GL15.GL_ARRAY_BUFFER, uploadBuffer.remaining(), GL15C.GL_DYNAMIC_DRAW); - + // interestingly bufferSubData renders faster than glMapBuffer // even though OpenGLInsights-AsynchronousBufferTransfers says glMapBuffer // is faster for transferring data. They must put the data in different memory // or something. GL15C.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, uploadBuffer); - + GL15C.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } } - + /** * Get the newly created VBOs */ @@ -546,35 +595,35 @@ public class LodBufferBuilder // since this is called on the main render thread if (bufferLock.tryLock()) { - VertexBuffer[][] tmpVbo = drawableVbos; + VertexBuffer[][][] tmpVbo = drawableVbos; drawableVbos = buildableVbos; buildableVbos = tmpVbo; - + drawableCenterChunkPos = buildableCenterChunkPos; - + // the vbos have been swapped switchVbos = false; bufferLock.unlock(); } - + return new VertexBuffersAndOffset(drawableVbos, drawableCenterChunkPos); } - + /** * A simple container to pass multiple objects back in the getVertexBuffers method. */ public class VertexBuffersAndOffset { - public VertexBuffer[][] vbos; + public VertexBuffer[][][] vbos; public ChunkPos drawableCenterChunkPos; - - public VertexBuffersAndOffset(VertexBuffer[][] newVbos, ChunkPos newDrawableCenterChunkPos) + + public VertexBuffersAndOffset(VertexBuffer[][][] newVbos, ChunkPos newDrawableCenterChunkPos) { vbos = newVbos; drawableCenterChunkPos = newDrawableCenterChunkPos; } } - + /** * If this is true the buildable near and far * buffers have been generated and are ready to be @@ -584,5 +633,19 @@ public class LodBufferBuilder { return switchVbos; } - + + + /** + * + */ + public void setPartialRegen() + { + } + + /** + * + */ + public void setFullRegen() + { + } } diff --git a/src/main/java/com/seibel/lod/builders/lodTemplates/AbstractLodTemplate.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java similarity index 96% rename from src/main/java/com/seibel/lod/builders/lodTemplates/AbstractLodTemplate.java rename to src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java index 1702857b2..8c47febaa 100644 --- a/src/main/java/com/seibel/lod/builders/lodTemplates/AbstractLodTemplate.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.seibel.lod.builders.lodTemplates; +package com.seibel.lod.builders.bufferBuilding.lodTemplates; import java.util.Map; diff --git a/src/main/java/com/seibel/lod/builders/lodTemplates/Box.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/Box.java similarity index 99% rename from src/main/java/com/seibel/lod/builders/lodTemplates/Box.java rename to src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/Box.java index 4f460ceed..8804b7fb3 100644 --- a/src/main/java/com/seibel/lod/builders/lodTemplates/Box.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/Box.java @@ -1,4 +1,4 @@ -package com.seibel.lod.builders.lodTemplates; +package com.seibel.lod.builders.bufferBuilding.lodTemplates; import java.util.Arrays; import java.util.HashMap; diff --git a/src/main/java/com/seibel/lod/builders/lodTemplates/CubicLodTemplate.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java similarity index 98% rename from src/main/java/com/seibel/lod/builders/lodTemplates/CubicLodTemplate.java rename to src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java index 4bde077b2..810d19129 100644 --- a/src/main/java/com/seibel/lod/builders/lodTemplates/CubicLodTemplate.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.seibel.lod.builders.lodTemplates; +package com.seibel.lod.builders.bufferBuilding.lodTemplates; import java.util.Map; diff --git a/src/main/java/com/seibel/lod/builders/lodTemplates/DynamicLodTemplate.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java similarity index 96% rename from src/main/java/com/seibel/lod/builders/lodTemplates/DynamicLodTemplate.java rename to src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java index 47d1384af..395020bca 100644 --- a/src/main/java/com/seibel/lod/builders/lodTemplates/DynamicLodTemplate.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.seibel.lod.builders.lodTemplates; +package com.seibel.lod.builders.bufferBuilding.lodTemplates; import java.util.Map; diff --git a/src/main/java/com/seibel/lod/builders/lodTemplates/TriangularLodTemplate.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java similarity index 96% rename from src/main/java/com/seibel/lod/builders/lodTemplates/TriangularLodTemplate.java rename to src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java index d16c76f1d..195469514 100644 --- a/src/main/java/com/seibel/lod/builders/lodTemplates/TriangularLodTemplate.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.seibel.lod.builders.lodTemplates; +package com.seibel.lod.builders.bufferBuilding.lodTemplates; import java.util.Map; diff --git a/src/main/java/com/seibel/lod/builders/LodBuilder.java b/src/main/java/com/seibel/lod/builders/lodBuilding/LodBuilder.java similarity index 99% rename from src/main/java/com/seibel/lod/builders/LodBuilder.java rename to src/main/java/com/seibel/lod/builders/lodBuilding/LodBuilder.java index 68ace1bf4..8f79af46f 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilder.java +++ b/src/main/java/com/seibel/lod/builders/lodBuilding/LodBuilder.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.seibel.lod.builders; +package com.seibel.lod.builders.lodBuilding; import java.awt.Color; import java.util.List; diff --git a/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java b/src/main/java/com/seibel/lod/builders/lodBuilding/LodBuilderConfig.java similarity index 98% rename from src/main/java/com/seibel/lod/builders/LodBuilderConfig.java rename to src/main/java/com/seibel/lod/builders/lodBuilding/LodBuilderConfig.java index 5bbab40c2..679779d6e 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilderConfig.java +++ b/src/main/java/com/seibel/lod/builders/lodBuilding/LodBuilderConfig.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.seibel.lod.builders; +package com.seibel.lod.builders.lodBuilding; import com.seibel.lod.enums.DistanceGenerationMode; diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java index b6c367172..93c639b6a 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java @@ -27,8 +27,8 @@ import java.util.concurrent.Executors; import java.util.function.Supplier; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import com.seibel.lod.builders.LodBuilder; -import com.seibel.lod.builders.LodBuilderConfig; +import com.seibel.lod.builders.lodBuilding.LodBuilder; +import com.seibel.lod.builders.lodBuilding.LodBuilderConfig; import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DistanceGenerationMode; import com.seibel.lod.objects.LodDimension; diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java index a51998ade..a81db12c0 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java @@ -6,7 +6,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; -import com.seibel.lod.builders.LodBuilder; +import com.seibel.lod.builders.lodBuilding.LodBuilder; import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DistanceGenerationMode; import com.seibel.lod.objects.LodDimension; diff --git a/src/main/java/com/seibel/lod/enums/LodTemplate.java b/src/main/java/com/seibel/lod/enums/LodTemplate.java index 7d4a04909..180008dc2 100644 --- a/src/main/java/com/seibel/lod/enums/LodTemplate.java +++ b/src/main/java/com/seibel/lod/enums/LodTemplate.java @@ -17,10 +17,10 @@ */ package com.seibel.lod.enums; -import com.seibel.lod.builders.lodTemplates.AbstractLodTemplate; -import com.seibel.lod.builders.lodTemplates.CubicLodTemplate; -import com.seibel.lod.builders.lodTemplates.DynamicLodTemplate; -import com.seibel.lod.builders.lodTemplates.TriangularLodTemplate; +import com.seibel.lod.builders.bufferBuilding.lodTemplates.AbstractLodTemplate; +import com.seibel.lod.builders.bufferBuilding.lodTemplates.CubicLodTemplate; +import com.seibel.lod.builders.bufferBuilding.lodTemplates.DynamicLodTemplate; +import com.seibel.lod.builders.bufferBuilding.lodTemplates.TriangularLodTemplate; /** * Cubic, Triangular, Dynamic diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index 7332e7190..4dca1dc54 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -870,7 +870,7 @@ public class LodDimension } /** Returns the minimum memory required by the dimension in Bytes */ - public int getMemoryRequired(int x, int z, LodTemplate template) + public long getMemoryRequired(int x, int z, LodTemplate template) { /*return regions[x][z].getMinMemoryNeeded(template);*/ @@ -901,8 +901,8 @@ public class LodDimension int levelToGen = DetailDistanceUtil.getLodDrawDetail(detail); int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - levelToGen); int maxVerticalData = DetailDistanceUtil.getMaxVerticalData(detail); - int memoryUse = LodUtil.regionRenderingMemoryUse(x,z,template); - System.out.println(detail + " " + memoryUse + " " + template.getBufferMemoryForSingleLod(maxVerticalData)); + long memoryUse = LodUtil.regionRenderingMemoryUse(x,z,template); + //System.out.println(detail + " " + memoryUse + " " + template.getBufferMemoryForSingleLod(maxVerticalData)); return memoryUse; //return memoryUse; } diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index 75eded8de..d351e9762 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -22,8 +22,8 @@ import org.apache.logging.log4j.Logger; import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.matrix.MatrixStack; -import com.seibel.lod.builders.LodBufferBuilder; -import com.seibel.lod.builders.LodBuilder; +import com.seibel.lod.builders.bufferBuilding.LodBufferBuilder; +import com.seibel.lod.builders.lodBuilding.LodBuilder; import com.seibel.lod.builders.worldGeneration.LodNodeGenWorker; import com.seibel.lod.builders.worldGeneration.LodWorldGenerator; import com.seibel.lod.config.LodConfig; diff --git a/src/main/java/com/seibel/lod/render/LodRenderer.java b/src/main/java/com/seibel/lod/render/LodRenderer.java index 457ac3d61..cf5e30428 100644 --- a/src/main/java/com/seibel/lod/render/LodRenderer.java +++ b/src/main/java/com/seibel/lod/render/LodRenderer.java @@ -27,8 +27,8 @@ import org.lwjgl.opengl.NVFogDistance; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; -import com.seibel.lod.builders.LodBufferBuilder; -import com.seibel.lod.builders.LodBufferBuilder.VertexBuffersAndOffset; +import com.seibel.lod.builders.bufferBuilding.LodBufferBuilder; +import com.seibel.lod.builders.bufferBuilding.LodBufferBuilder.VertexBuffersAndOffset; import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DebugMode; import com.seibel.lod.enums.DetailDropOff; @@ -95,7 +95,7 @@ public class LodRenderer /** * Each VertexBuffer represents 1 region */ - private VertexBuffer[][] vbos; + private VertexBuffer[][][] vbos; public static final VertexFormat LOD_VERTEX_FORMAT = DefaultVertexFormats.POSITION_COLOR; private ChunkPos vbosCenter = new ChunkPos(0,0); @@ -270,20 +270,23 @@ public class LodRenderer int halfWidth = vbos.length / 2; int quarterWidth = vbos.length / 4; - for (int i = 0; i < vbos.length; i++) + for (int x = 0; x < vbos.length; x++) { - for (int j = 0; j < vbos.length; j++) + for (int z = 0; z < vbos.length; z++) { - RegionPos vboPos = new RegionPos(i + lodDim.getCenterRegionPosX() - lodDim.getWidth() / 2, j + lodDim.getCenterRegionPosZ() - lodDim.getWidth() / 2); + RegionPos vboPos = new RegionPos(x + lodDim.getCenterRegionPosX() - lodDim.getWidth() / 2, z + lodDim.getCenterRegionPosZ() - lodDim.getWidth() / 2); if (cullingDisabled || RenderUtil.isRegionInViewFrustum(renderInfo.getBlockPosition(), cameraDir, vboPos.blockPos())) { - if ((i > halfWidth - quarterWidth && i < halfWidth + quarterWidth) && (j > halfWidth - quarterWidth && j < halfWidth + quarterWidth)) + if ((x > halfWidth - quarterWidth && x < halfWidth + quarterWidth) && (z > halfWidth - quarterWidth && z < halfWidth + quarterWidth)) setupFog(fogSettings.near.distance, fogSettings.near.quality); else setupFog(fogSettings.far.distance, fogSettings.far.quality); - sendLodsToGpuAndDraw(vbos[i][j], modelViewMatrix); + for(int i = 0; i < lodBufferBuilder.bufferSize[x][z]; i++) + { + sendLodsToGpuAndDraw(vbos[x][z][i], modelViewMatrix); + } } } } diff --git a/src/main/java/com/seibel/lod/util/LodUtil.java b/src/main/java/com/seibel/lod/util/LodUtil.java index 78bf65bde..a97ca2334 100644 --- a/src/main/java/com/seibel/lod/util/LodUtil.java +++ b/src/main/java/com/seibel/lod/util/LodUtil.java @@ -341,7 +341,7 @@ public class LodUtil * @param regionPosZ z region position to check * @return number of lods in the region */ - public static int regionRenderingMemoryUse(int regionPosX, int regionPosZ, LodTemplate template) + public static long regionRenderingMemoryUse(int regionPosX, int regionPosZ, LodTemplate template) { int xRegionSign = (int) Math.signum(regionPosX); int zRegionSign = (int) Math.signum(regionPosZ); @@ -364,7 +364,7 @@ public class LodUtil int count; int minDistance; int maxDistance; - int memoryUse = 0; + long memoryUse = 0; int number = 0; for(byte detailLevel = BLOCK_DETAIL_LEVEL; detailLevel <= REGION_DETAIL_LEVEL; detailLevel++) { @@ -398,7 +398,6 @@ public class LodUtil count *= maxVerticalData; memoryUse += template.getBufferMemoryForSingleLod(maxVerticalData) * count; } - System.out.println(number); return memoryUse; }