diff --git a/src/main/java/com/seibel/lod/core/api/ClientApi.java b/src/main/java/com/seibel/lod/core/api/ClientApi.java index 439e74ef0..c5ffb96bd 100644 --- a/src/main/java/com/seibel/lod/core/api/ClientApi.java +++ b/src/main/java/com/seibel/lod/core/api/ClientApi.java @@ -40,7 +40,7 @@ import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper; * Specifically for the client. * * @author James Seibel - * @version 11-12-2021 + * @version 12-8-2021 */ public class ClientApi { @@ -141,6 +141,9 @@ public class ClientApi { MC.sendChatMessage(ModInfo.READABLE_NAME + " experimental build " + ModInfo.VERSION); MC.sendChatMessage("You are running a unsupported version of the mod!"); + MC.sendChatMessage("=========================================="); + MC.sendChatMessage("SEIZURE WARNING: Flashing lights expected!"); // remove this line when the lighting shaders are fixed + MC.sendChatMessage("=========================================="); MC.sendChatMessage("Here be dragons!"); configOverrideReminderPrinted = true; diff --git a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/LodBufferBuilderFactory.java b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/LodBufferBuilderFactory.java index ab792b48c..17a9a03b0 100644 --- a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/LodBufferBuilderFactory.java +++ b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/LodBufferBuilderFactory.java @@ -68,7 +68,7 @@ import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftWrapper; * rendered by the LodRenderer. * * @author James Seibel - * @version 11-29-2021 + * @version 12-8-2021 */ public class LodBufferBuilderFactory { @@ -879,7 +879,7 @@ public class LodBufferBuilderFactory if (vbo.id != -1 && GLProxy.getInstance().getGlContext() == GLProxyContext.LOD_BUILDER) { // this is how many points will be rendered - vbo.vertexCount = (uploadBuffer.capacity() / ((Float.BYTES * 3) + (Byte.BYTES * 4))); // TODO make this change with the LodTemplate + vbo.vertexCount = (uploadBuffer.capacity() / ((Float.BYTES * 3) + (Byte.BYTES * 4) + Byte.BYTES + Byte.BYTES)); // TODO make this change with the LodTemplate GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo.id); try diff --git a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java index 69bb57b10..90ac7d0d5 100644 --- a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java +++ b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java @@ -32,7 +32,7 @@ import com.seibel.lod.core.wrapperInterfaces.block.AbstractBlockPosWrapper; * This is the abstract class used to create different * BufferBuilders. * @author James Seibel - * @version 11-13-2021 + * @version 12-8-2021 */ public abstract class AbstractLodTemplate { @@ -43,10 +43,13 @@ public abstract class AbstractLodTemplate /** add the given position and color to the buffer */ protected void addPosAndColor(LodBufferBuilder buffer, float x, float y, float z, - int color) + int color, byte blockLightValue, byte skyLightValue) { - // TODO re-add transparency by replacing the 255 with "ColorUtil.getAlpha(color)" - buffer.vertex(x, y, z).color(ColorUtil.getRed(color), ColorUtil.getGreen(color), ColorUtil.getBlue(color), 255).endVertex(); + // TODO re-add transparency by replacing the color 255 with "ColorUtil.getAlpha(color)" + buffer.position(x, y, z) + .color(ColorUtil.getRed(color), ColorUtil.getGreen(color), ColorUtil.getBlue(color), 255) + .minecraftLightValue(blockLightValue).minecraftLightValue(skyLightValue) + .endVertex(); } } diff --git a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java index aaf016b05..fae2a980d 100644 --- a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java +++ b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java @@ -25,7 +25,6 @@ import com.seibel.lod.core.enums.LodDirection; import com.seibel.lod.core.enums.rendering.DebugMode; import com.seibel.lod.core.objects.VertexOptimizer; import com.seibel.lod.core.objects.opengl.LodBufferBuilder; -import com.seibel.lod.core.util.ColorUtil; import com.seibel.lod.core.util.DataPointUtil; import com.seibel.lod.core.util.LodUtil; import com.seibel.lod.core.wrapperInterfaces.block.AbstractBlockPosWrapper; @@ -33,7 +32,7 @@ import com.seibel.lod.core.wrapperInterfaces.block.AbstractBlockPosWrapper; /** * Builds LODs as rectangular prisms. * @author James Seibel - * @version 11-8-2021 + * @version 12-8-2021 */ public class CubicLodTemplate extends AbstractLodTemplate { @@ -69,11 +68,9 @@ public class CubicLodTemplate extends AbstractLodTemplate bufferCenterBlockPos, adjData, color, - DataPointUtil.getLightSkyAlt(data), - DataPointUtil.getLightBlock(data), adjShadeDisabled); - addBoundingBoxToBuffer(buffer, vertexOptimizer); + addBoundingBoxToBuffer(buffer, vertexOptimizer, DataPointUtil.getLightBlock(data), DataPointUtil.getLightSkyAlt(data)); } private void generateBoundingBox(VertexOptimizer vertexOptimizer, @@ -82,8 +79,6 @@ public class CubicLodTemplate extends AbstractLodTemplate AbstractBlockPosWrapper bufferCenterBlockPos, Map adjData, int color, - int skyLight, - int blockLight, boolean[] adjShadeDisabled) { // don't add an LOD if it is empty @@ -102,18 +97,15 @@ public class CubicLodTemplate extends AbstractLodTemplate double z = -bufferCenterBlockPos.getZ(); vertexOptimizer.reset(); vertexOptimizer.setColor(color, adjShadeDisabled); - vertexOptimizer.setLights(skyLight, blockLight); vertexOptimizer.setWidth(width, height - depth, width); vertexOptimizer.setOffset((int) (xOffset + x), (int) (depth + yOffset), (int) (zOffset + z)); vertexOptimizer.setUpCulling(32, bufferCenterBlockPos); vertexOptimizer.setAdjData(adjData); } - private void addBoundingBoxToBuffer(LodBufferBuilder buffer, VertexOptimizer vertexOptimizer) + private void addBoundingBoxToBuffer(LodBufferBuilder buffer, VertexOptimizer vertexOptimizer, byte blockLightValue, byte skyLightValue) { int color; - int skyLight; - int blockLight; for (LodDirection lodDirection : VertexOptimizer.DIRECTIONS) { if(vertexOptimizer.isCulled(lodDirection)) @@ -125,14 +117,11 @@ public class CubicLodTemplate extends AbstractLodTemplate for (int vertexIndex = 0; vertexIndex < 6; vertexIndex++) { color = vertexOptimizer.getColor(lodDirection); - skyLight = vertexOptimizer.getSkyLight(lodDirection, verticalFaceIndex); - blockLight = vertexOptimizer.getBlockLight(); - color = ColorUtil.applyLightValue(color, skyLight, blockLight); addPosAndColor(buffer, vertexOptimizer.getX(lodDirection, vertexIndex), vertexOptimizer.getY(lodDirection, vertexIndex, verticalFaceIndex) + DataPointUtil.VERTICAL_OFFSET, vertexOptimizer.getZ(lodDirection, vertexIndex), - color); + color, blockLightValue, skyLightValue); } verticalFaceIndex++; } diff --git a/src/main/java/com/seibel/lod/core/objects/VertexOptimizer.java b/src/main/java/com/seibel/lod/core/objects/VertexOptimizer.java index 4c13f247b..518219bd3 100644 --- a/src/main/java/com/seibel/lod/core/objects/VertexOptimizer.java +++ b/src/main/java/com/seibel/lod/core/objects/VertexOptimizer.java @@ -37,7 +37,7 @@ import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftWrapper; /** * This class handles all the vertex optimization that's needed for a column of lods. W * @author Leonardo Amato - * @version 10-2-2021 + * @version 12-8-2021 */ public class VertexOptimizer { @@ -197,7 +197,6 @@ public class VertexOptimizer */ public final Map adjHeight; public final Map adjDepth; - public final Map skyLights; public byte blockLight; /** Holds if the given direction should be culled or not */ @@ -212,15 +211,6 @@ public class VertexOptimizer boxWidth = new int[3]; colorMap = new int[6]; - skyLights = new HashMap() - {{ - put(LodDirection.UP, new byte[1]); - put(LodDirection.DOWN, new byte[1]); - put(LodDirection.EAST, new byte[LodUtil.MAX_NUMBER_OF_VERTICAL_LODS]); - put(LodDirection.WEST, new byte[LodUtil.MAX_NUMBER_OF_VERTICAL_LODS]); - put(LodDirection.SOUTH, new byte[LodUtil.MAX_NUMBER_OF_VERTICAL_LODS]); - put(LodDirection.NORTH, new byte[LodUtil.MAX_NUMBER_OF_VERTICAL_LODS]); - }}; adjHeight = new HashMap() {{ put(LodDirection.EAST, new int[LodUtil.MAX_NUMBER_OF_VERTICAL_LODS]); @@ -240,10 +230,9 @@ public class VertexOptimizer } /** Set the light of the columns */ - public void setLights(int skyLight, int blockLight) + public void setBlockLight(byte blockLight) { - this.blockLight = (byte) blockLight; - skyLights.get(LodDirection.UP)[0] = (byte) skyLight; + this.blockLight = blockLight; } /** @@ -277,20 +266,11 @@ public class VertexOptimizer /** */ - public byte getSkyLight(LodDirection lodDirection, int verticalIndex) - { - if(lodDirection == LodDirection.UP || lodDirection == LodDirection.DOWN) - return skyLights.get(lodDirection)[0]; - else - return skyLights.get(lodDirection)[verticalIndex]; - } - - /** - */ - public int getBlockLight() + public byte getBlockLight() { return blockLight; } + /** clears this box, resetting everything to default values */ public void reset() { @@ -304,7 +284,6 @@ public class VertexOptimizer { adjHeight.get(lodDirection)[i] = VOID_FACE; adjDepth.get(lodDirection)[i] = VOID_FACE; - skyLights.get(lodDirection)[i] = 0; } } } @@ -355,10 +334,6 @@ public class VertexOptimizer }*/ //Down direction case singleAdjDataPoint = adjData.get(LodDirection.DOWN)[0]; - if(DataPointUtil.doesItExist(singleAdjDataPoint)) - skyLights.get(LodDirection.DOWN)[0] = DataPointUtil.getLightSkyAlt(singleAdjDataPoint); - else - skyLights.get(LodDirection.DOWN)[0] = skyLights.get(LodDirection.UP)[0]; //other sided //TODO clean some similar cases for (LodDirection lodDirection : ADJ_DIRECTIONS) @@ -373,7 +348,6 @@ public class VertexOptimizer adjDepth.get(lodDirection)[0] = minY; adjHeight.get(lodDirection)[1] = VOID_FACE; adjDepth.get(lodDirection)[1] = VOID_FACE; - skyLights.get(lodDirection)[0] = 15; //in void set full skylight continue; } @@ -404,12 +378,10 @@ public class VertexOptimizer { adjHeight.get(lodDirection)[0] = getMaxY(); adjDepth.get(lodDirection)[0] = getMinY(); - skyLights.get(lodDirection)[0] = DataPointUtil.getLightSkyAlt(singleAdjDataPoint); //skyLights.get(Direction.UP)[0]; } else { adjDepth.get(lodDirection)[faceToDraw] = getMinY(); - skyLights.get(lodDirection)[faceToDraw] = DataPointUtil.getLightSkyAlt(singleAdjDataPoint); } faceToDraw++; toFinish = false; @@ -435,12 +407,10 @@ public class VertexOptimizer { adjHeight.get(lodDirection)[0] = getMaxY(); adjDepth.get(lodDirection)[0] = height; - skyLights.get(lodDirection)[0] = DataPointUtil.getLightSkyAlt(singleAdjDataPoint); //skyLights.get(Direction.UP)[0]; } else { adjDepth.get(lodDirection)[faceToDraw] = height; - skyLights.get(lodDirection)[faceToDraw] = DataPointUtil.getLightSkyAlt(singleAdjDataPoint); } toFinish = false; faceToDraw++; @@ -468,7 +438,6 @@ public class VertexOptimizer } adjDepth.get(lodDirection)[faceToDraw] = height; - skyLights.get(lodDirection)[faceToDraw] = DataPointUtil.getLightSkyAlt(singleAdjDataPoint); faceToDraw++; adjHeight.get(lodDirection)[faceToDraw] = depth; firstFace = false; @@ -482,7 +451,6 @@ public class VertexOptimizer { adjHeight.get(lodDirection)[0] = getMaxY(); adjDepth.get(lodDirection)[0] = getMinY(); - skyLights.get(lodDirection)[0] = skyLights.get(LodDirection.UP)[0]; faceToDraw++; } else if (toFinish) @@ -491,10 +459,6 @@ public class VertexOptimizer if(toFinishIndex < dataPoint.length) { singleAdjDataPoint = dataPoint[toFinishIndex]; - if (DataPointUtil.doesItExist(singleAdjDataPoint)) - skyLights.get(lodDirection)[faceToDraw] = DataPointUtil.getLightSkyAlt(singleAdjDataPoint); - else - skyLights.get(lodDirection)[faceToDraw] = skyLights.get(LodDirection.UP)[0]; } faceToDraw++; } diff --git a/src/main/java/com/seibel/lod/core/objects/opengl/DefaultLodVertexFormats.java b/src/main/java/com/seibel/lod/core/objects/opengl/DefaultLodVertexFormats.java index 116ed0f0c..6a0e9cb83 100644 --- a/src/main/java/com/seibel/lod/core/objects/opengl/DefaultLodVertexFormats.java +++ b/src/main/java/com/seibel/lod/core/objects/opengl/DefaultLodVertexFormats.java @@ -26,7 +26,7 @@ import com.google.common.collect.ImmutableList; * DefaultVertexFormats class. * * @author James Seibel - * @version 11-13-2021 + * @version 12-8-2021 */ public class DefaultLodVertexFormats { @@ -37,6 +37,8 @@ public class DefaultLodVertexFormats public static final LodVertexFormatElement ELEMENT_NORMAL = new LodVertexFormatElement(0, LodVertexFormatElement.DataType.BYTE, 3); public static final LodVertexFormatElement ELEMENT_PADDING = new LodVertexFormatElement(0, LodVertexFormatElement.DataType.BYTE, 1); + public static final LodVertexFormatElement ELEMENT_BLOCK_LIGHT = new LodVertexFormatElement(0, LodVertexFormatElement.DataType.UBYTE, 1); + public static final LodVertexFormat POSITION = new LodVertexFormat(ImmutableList.builder().add(ELEMENT_POSITION).build()); public static final LodVertexFormat POSITION_COLOR = new LodVertexFormat(ImmutableList.builder().add(ELEMENT_POSITION).add(ELEMENT_COLOR).build()); @@ -45,4 +47,5 @@ public class DefaultLodVertexFormats public static final LodVertexFormat POSITION_COLOR_TEX = new LodVertexFormat(ImmutableList.builder().add(ELEMENT_POSITION).add(ELEMENT_COLOR).add(ELEMENT_UV).build()); public static final LodVertexFormat POSITION_COLOR_TEX_LIGHTMAP = new LodVertexFormat(ImmutableList.builder().add(ELEMENT_POSITION).add(ELEMENT_COLOR).add(ELEMENT_UV).add(ELEMENT_LIGHT_MAP_UV).build()); + public static final LodVertexFormat POSITION_COLOR_BLOCK_LIGHT_SKY_LIGHT = new LodVertexFormat(ImmutableList.builder().add(ELEMENT_POSITION).add(ELEMENT_COLOR).add(ELEMENT_BLOCK_LIGHT).add(ELEMENT_BLOCK_LIGHT).build()); } diff --git a/src/main/java/com/seibel/lod/core/objects/opengl/LodBufferBuilder.java b/src/main/java/com/seibel/lod/core/objects/opengl/LodBufferBuilder.java index 29d764092..1baa8a165 100644 --- a/src/main/java/com/seibel/lod/core/objects/opengl/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/core/objects/opengl/LodBufferBuilder.java @@ -19,7 +19,6 @@ package com.seibel.lod.core.objects.opengl; -import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; @@ -38,7 +37,7 @@ import com.google.common.collect.Lists; * OpenGL buffers. * * @author James Seibel - * @version 11-13-2021 + * @version 12-8-2021 */ public class LodBufferBuilder { @@ -354,7 +353,22 @@ public class LodBufferBuilder } } - public LodBufferBuilder vertex(float x, float y, float z) + public LodBufferBuilder minecraftLightValue(byte lightValue) + { + LodVertexFormatElement LodVertexFormatelement = this.currentElement(); + if (LodVertexFormatelement.getType() != LodVertexFormatElement.DataType.UBYTE) + { + throw new IllegalStateException("Light Color must be stored as a UBYTE"); + } + else + { + this.putByte(0, lightValue); + this.nextElement(); + return this; + } + } + + public LodBufferBuilder position(float x, float y, float z) { if (this.currentElement().getType() != LodVertexFormatElement.DataType.FLOAT) { diff --git a/src/main/java/com/seibel/lod/core/render/GLProxy.java b/src/main/java/com/seibel/lod/core/render/GLProxy.java index 3c3109e22..819d8a15c 100644 --- a/src/main/java/com/seibel/lod/core/render/GLProxy.java +++ b/src/main/java/com/seibel/lod/core/render/GLProxy.java @@ -19,7 +19,6 @@ package com.seibel.lod.core.render; -import java.io.File; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -57,7 +56,7 @@ import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftWrapper; * https://stackoverflow.com/questions/63509735/massive-performance-loss-with-glmapbuffer

* * @author James Seibel - * @version 12-1-2021 + * @version 12-8-2021 */ public class GLProxy { @@ -90,6 +89,8 @@ public class GLProxy public LodShaderProgram lodShaderProgram; /** This is the VAO that is used when rendering */ public final int vertexArrayObjectId; + /** This is the 2D texture that holds MC's lightmap */ + public final int lightMapTextureId; /** Requires OpenGL 4.5, and offers the best buffer uploading */ @@ -103,7 +104,7 @@ public class GLProxy private GLProxy() { - ClientApi.LOGGER.error("Creating " + GLProxy.class.getSimpleName() + "... If this is the last message you see in the log there must have been a OpenGL error."); + ClientApi.LOGGER.info("Creating " + GLProxy.class.getSimpleName() + "... If this is the last message you see in the log there must have been a OpenGL error."); // getting Minecraft's context has to be done on the render thread, // where the GL context is @@ -174,7 +175,7 @@ public class GLProxy if (!bufferStorageSupported) { String fallBackVersion = mapBufferRangeSupported ? "3.0" : "1.5"; - ClientApi.LOGGER.error("This GPU doesn't support Buffer Storage (OpenGL 4.5), falling back to OpenGL " + fallBackVersion + ". This may cause stuttering and reduced performance."); + ClientApi.LOGGER.warn("This GPU doesn't support Buffer Storage (OpenGL 4.5), falling back to OpenGL " + fallBackVersion + ". This may cause stuttering and reduced performance."); } @@ -230,6 +231,7 @@ public class GLProxy // this must be created on minecraft's render context to work correctly vertexArrayObjectId = GL30.glGenVertexArrays(); + lightMapTextureId = GL30.glGenTextures(); @@ -243,7 +245,7 @@ public class GLProxy // GLProxy creation success - ClientApi.LOGGER.error(GLProxy.class.getSimpleName() + " creation successful. OpenGL smiles upon you this day."); + ClientApi.LOGGER.info(GLProxy.class.getSimpleName() + " creation successful. OpenGL smiles upon you this day."); } /** Creates all required shaders */ @@ -255,13 +257,13 @@ public class GLProxy try { // get the shaders from the resource folder - vertexShader = LodShader.loadShader(GL20.GL_VERTEX_SHADER, "shaders" + File.separator + "standard.vert", false); - fragmentShader = LodShader.loadShader(GL20.GL_FRAGMENT_SHADER, "shaders" + File.separator + "flat_shaded.frag", false); +// vertexShader = LodShader.loadShader(GL20.GL_VERTEX_SHADER, "shaders" + File.separator + "standard.vert", false); +// fragmentShader = LodShader.loadShader(GL20.GL_FRAGMENT_SHADER, "shaders" + File.separator + "flat_shaded.frag", false); // this can be used when testing shaders, // since we can't hot swap the files in the resource folder -// vertexShader = LodShader.loadShader(GL20.GL_VERTEX_SHADER, "C:/Users/James Seibel/Desktop/shaders/standard.vert", true); -// fragmentShader = LodShader.loadShader(GL20.GL_FRAGMENT_SHADER, "C:/Users/James Seibel/Desktop/shaders/flat_shaded.frag", true); + vertexShader = LodShader.loadShader(GL20.GL_VERTEX_SHADER, "C:/Users/James Seibel/Desktop/shaders/standard.vert", true); + fragmentShader = LodShader.loadShader(GL20.GL_FRAGMENT_SHADER, "C:/Users/James Seibel/Desktop/shaders/flat_shaded.frag", true); // create the shaders diff --git a/src/main/java/com/seibel/lod/core/render/LodRenderer.java b/src/main/java/com/seibel/lod/core/render/LodRenderer.java index 2bb298b48..de3f1e149 100644 --- a/src/main/java/com/seibel/lod/core/render/LodRenderer.java +++ b/src/main/java/com/seibel/lod/core/render/LodRenderer.java @@ -27,6 +27,7 @@ import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL30; import com.seibel.lod.core.api.ApiShared; +import com.seibel.lod.core.api.ClientApi; import com.seibel.lod.core.builders.bufferBuilding.LodBufferBuilderFactory; import com.seibel.lod.core.builders.bufferBuilding.LodBufferBuilderFactory.VertexBuffersAndOffset; import com.seibel.lod.core.enums.config.GpuUploadMethod; @@ -60,7 +61,7 @@ import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper; * This is where LODs are draw to the world. * * @author James Seibel - * @version 11-27-2021 + * @version 12-8-2021 */ public class LodRenderer { @@ -278,6 +279,13 @@ public class LodRenderer shaderProgram.enableVertexAttribute(posAttrib); int colAttrib = shaderProgram.getAttributeLocation("color"); shaderProgram.enableVertexAttribute(colAttrib); + int blockSkyLightAttrib = shaderProgram.getAttributeLocation("blockSkyLight"); + // TODO the block sky light is being passed in correctly but the data + // we were given appears to be incorrect, so we won't use it for now + //shaderProgram.enableVertexAttribute(blockSkyLightAttrib); + int blockLightAttrib = shaderProgram.getAttributeLocation("blockLight"); + shaderProgram.enableVertexAttribute(blockLightAttrib); + // global uniforms @@ -291,6 +299,58 @@ public class LodRenderer shaderProgram.setUniform(fogColorUniform, getFogColor()); + int skyLightUniform = shaderProgram.getUniformLocation("worldSkyLight"); + shaderProgram.setUniform(skyLightUniform, (int) (MC.getSkyDarken(partialTicks) * 15)); + + int lightMapUniform = shaderProgram.getUniformLocation("lightMap"); + + + + GL20.glBindTexture(GL20.GL_TEXTURE_2D, glProxy.lightMapTextureId); + + GL20.glTexParameteri(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_WRAP_S, GL20.GL_CLAMP_TO_BORDER); + GL20.glTexParameteri(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_WRAP_T, GL20.GL_CLAMP_TO_BORDER); + GL20.glTexParameteri(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_MIN_FILTER, GL20.GL_NEAREST); + GL20.glTexParameteri(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_MAG_FILTER, GL20.GL_NEAREST); + + + // get the latest lightmap from MC + try + { + int lightMapHeight = MC_RENDER.getLightmapTextureHeight(); + int lightMapWidth = MC_RENDER.getLightmapTextureWidth(); + int[] pixels = MC_RENDER.getLightmapPixels(); + + // comment me out to see when the lightmap is changing +// boolean same = true; +// int badIndex = 0; +// if (testArray != null && pixels != null) +// for (int i = 0; i < pixels.length; i++) +// { +// if(pixels[i] != testArray[i]) +// { +// same = false; +// badIndex = i; +// break; +// } +// } +// testArray = pixels; +// MC.sendChatMessage(same + " " + badIndex); + + // comment this line out to prevent uploading the new lightmap + GL20.glTexImage2D(GL20.GL_TEXTURE_2D, 0, GL20.GL_RGBA, lightMapWidth, + lightMapHeight, 0, GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixels); + + // TODO is this needed/correct? + shaderProgram.setUniform(lightMapUniform, 0); + } + catch (Exception e) + { + ClientApi.LOGGER.info(e.getMessage(), e); + } + + + // region dependent uniforms int fogEnabledUniform = shaderProgram.getUniformLocation("fogEnabled"); int nearFogEnabledUniform = shaderProgram.getUniformLocation("nearFogEnabled"); @@ -341,7 +401,7 @@ public class LodRenderer for (int i = 0; i < vbos[x][z].length; i++) { bufferId = (storageBufferIds != null && renderBufferStorage) ? storageBufferIds[x][z][i] : vbos[x][z][i].id; - drawArrays(bufferId, vbos[x][z][i].vertexCount, posAttrib, colAttrib); + drawArrays(bufferId, vbos[x][z][i].vertexCount, posAttrib, colAttrib, blockLightAttrib, blockSkyLightAttrib); } } @@ -349,18 +409,21 @@ public class LodRenderer } + GL20.glBindTexture(GL20.GL_TEXTURE_2D, 0); //================// // render cleanup // //================// - // if this cleanup isn't done MC may crash + // if this cleanup isn't done MC will crash // when trying to render its own terrain GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); GL30.glBindVertexArray(0); GL20.glDisableVertexAttribArray(posAttrib); GL20.glDisableVertexAttribArray(colAttrib); +// GL20.glDisableVertexAttribArray(blockSkyLightAttrib); + GL20.glDisableVertexAttribArray(blockLightAttrib); } @@ -387,8 +450,10 @@ public class LodRenderer // end of internal LOD profiling profiler.pop(); } - - + + // Temporary variables James was using while working with the shader lightmap + int[] testArray = null; + int testInt = 0; @@ -396,14 +461,14 @@ public class LodRenderer /** This is where the actual drawing happens. */ - private void drawArrays(int glBufferId, int vertexCount, int posAttrib, int colAttrib) + private void drawArrays(int glBufferId, int vertexCount, int posAttrib, int colAttrib, int blockLightAttrib, int blockSkyLightAttrib) { if (glBufferId == 0) return; // can be used to check for OpenGL errors // int error = GL15.glGetError(); -// ClientProxy.LOGGER.info(Integer.toHexString(error)); +// ClientApi.LOGGER.info(Integer.toHexString(error)); // bind the buffer we are going to draw @@ -411,11 +476,15 @@ public class LodRenderer GL30.glBindVertexArray(GLProxy.getInstance().vertexArrayObjectId); // let OpenGL know how our buffer is set up - int vertexByteCount = (Float.BYTES * 3) + (Byte.BYTES * 4); + int vertexByteCount = (Float.BYTES * 3) + (Byte.BYTES * 4) + Byte.BYTES + Byte.BYTES; // TODO move this into the template GL20.glEnableVertexAttribArray(posAttrib); GL20.glVertexAttribPointer(posAttrib, 3, GL15.GL_FLOAT, false, vertexByteCount, 0); GL20.glEnableVertexAttribArray(colAttrib); GL20.glVertexAttribPointer(colAttrib, 4, GL15.GL_UNSIGNED_BYTE, true, vertexByteCount, Float.BYTES * 3); + GL20.glEnableVertexAttribArray(blockLightAttrib); + GL20.glVertexAttribPointer(blockLightAttrib, 1, GL15.GL_UNSIGNED_BYTE, false, vertexByteCount, Float.BYTES * (3 + 1)); +// GL20.glEnableVertexAttribArray(blockSkyLightAttrib); +// GL20.glVertexAttribPointer(blockSkyLightAttrib, 1, GL15.GL_UNSIGNED_BYTE, false, vertexByteCount, Float.BYTES * (3 + 1 + 1)); // draw the LODs diff --git a/src/main/java/com/seibel/lod/core/util/LodUtil.java b/src/main/java/com/seibel/lod/core/util/LodUtil.java index f87c85f0a..c82223777 100644 --- a/src/main/java/com/seibel/lod/core/util/LodUtil.java +++ b/src/main/java/com/seibel/lod/core/util/LodUtil.java @@ -44,7 +44,7 @@ import com.seibel.lod.core.wrapperInterfaces.world.IWorldWrapper; * This class holds methods and constants that may be used in multiple places. * * @author James Seibel - * @version 11-13-2021 + * @version 12-8-2021 */ public class LodUtil { @@ -140,7 +140,7 @@ public class LodUtil public static final int MAX_ALLOCATABLE_DIRECT_MEMORY = 64 * 1024 * 1024; /** the format of data stored in the GPU buffers */ - public static final LodVertexFormat LOD_VERTEX_FORMAT = DefaultLodVertexFormats.POSITION_COLOR; + public static final LodVertexFormat LOD_VERTEX_FORMAT = DefaultLodVertexFormats.POSITION_COLOR_BLOCK_LIGHT_SKY_LIGHT; diff --git a/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java b/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java index b39289b1a..bdc9ad8ba 100644 --- a/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java +++ b/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftRenderWrapper.java @@ -33,7 +33,7 @@ import com.seibel.lod.core.wrapperInterfaces.chunk.AbstractChunkPosWrapper; * rendering in Minecraft. * * @author James Seibel - * @version 11-26-2021 + * @version 12-8-2021 */ public interface IMinecraftRenderWrapper { @@ -66,4 +66,14 @@ public interface IMinecraftRenderWrapper * is going to render this frame. */ HashSet getRenderedChunks(); + + /** @returns null if there was a issue getting the lightmap */ + int[] getLightmapPixels(); + + /** @returns -1 if there was an issue getting the lightmap */ + int getLightmapTextureHeight(); + /** @returns -1 if there was an issue getting the lightmap */ + int getLightmapTextureWidth(); + /** @returns -1 if there was an issue getting the lightmap */ + public int getLightmapGLFormat(); } diff --git a/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftWrapper.java b/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftWrapper.java index f6668e0dc..fb9ba3f0f 100644 --- a/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftWrapper.java +++ b/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftWrapper.java @@ -34,7 +34,7 @@ import com.seibel.lod.core.wrapperInterfaces.world.IWorldWrapper; * Contains everything related to the Minecraft object. * * @author James Seibel - * @version 9-16-2021 + * @version 12-8-2021 */ public interface IMinecraftWrapper { @@ -77,18 +77,18 @@ public interface IMinecraftWrapper /** * Returns the color int at the given pixel coordinates * from the current lightmap. - * @param u x location in texture space - * @param v z location in texture space + * @param blockLight x location in texture space + * @param skyLight z location in texture space */ - int getColorIntFromLightMap(int u, int v); + int getColorIntFromLightMap(int blockLight, int skyLight); /** * Returns the Color at the given pixel coordinates * from the current lightmap. - * @param u x location in texture space - * @param v z location in texture space + * @param blockLight x location in texture space + * @param skyLight z location in texture space */ - Color getColorFromLightMap(int u, int v); + Color getColorFromLightMap(int blockLight, int skyLight);