diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiGenericObjectShaderProgram.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiGenericObjectShaderProgram.java new file mode 100644 index 000000000..0c5fcbd38 --- /dev/null +++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/override/rendering/IDhApiGenericObjectShaderProgram.java @@ -0,0 +1,78 @@ +/* + * This file is part of the Distant Horizons mod + * licensed under the GNU LGPL v3 License. + * + * Copyright (C) 2020-2023 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.seibel.distanthorizons.api.interfaces.override.rendering; + +import com.seibel.distanthorizons.api.interfaces.override.IDhApiOverrideable; +import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderableBoxGroup; +import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiRenderParam; +import com.seibel.distanthorizons.api.objects.math.DhApiVec3d; +import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBox; +import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBoxGroupShading; + +/** + * @author James Seibel + * @version 2024-7-11 + * @since API 3.0.0 + */ +public interface IDhApiGenericObjectShaderProgram extends IDhApiOverrideable +{ + + /** + * If this method is called that means this program has the highest priority as defined by {@link IDhApiOverrideable#getPriority()} + * and gets to decide if it wants to be used to render this frame or not.

+ * + * If this method returns true then this program will be used for this frame.
+ * If this returns false then the default DH {@link IDhApiGenericObjectShaderProgram} will be used instead. + */ + boolean overrideThisFrame(); + + /** @return the OpenGL ID for this shader program */ + int getId(); + + /** Free any OpenGL objects owned by this program. */ + void free(); + + /** Runs any necessary binding this program needs so rendering can be done. */ + void bind(); + /** Runs any necessary unbinding this program needs so rendering can be done by another program. */ + void unbind(); + + /** Binds the given Vertex Buffer Object to this shader program for rendering. */ + void bindVertexBuffer(int vbo); + + + /** sets up the necessary uniforms for rendering */ + void fillIndirectUniformData( + DhApiRenderParam renderParameters, + DhApiRenderableBoxGroupShading shading, IDhApiRenderableBoxGroup boxGroup, + DhApiVec3d camPos); + + /** sets up the necessary uniforms for rendering */ + void fillSharedDirectUniformData( + DhApiRenderParam renderParameters, + DhApiRenderableBoxGroupShading shading, IDhApiRenderableBoxGroup boxGroup, + DhApiVec3d camPos); + void fillDirectUniformData( + DhApiRenderParam renderParameters, + IDhApiRenderableBoxGroup boxGroup, DhApiRenderableBox box, + DhApiVec3d camPos); + + +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java index 7f63649c5..c7fbdd6cc 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java @@ -164,8 +164,6 @@ public class LodRenderProgram extends ShaderProgram implements IDhApiShaderProgr @Override public void bindVertexBuffer(int vbo) { this.vao.bindBufferToAllBindingPoints(vbo); } - public void unbindVertexBuffer() { this.vao.unbindBuffersFromAllBindingPoint(); } - @Override public void fillUniformData(DhApiRenderParam renderParameters) { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/GenericObjectRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/GenericObjectRenderer.java index 19b2273dd..2264cf1ac 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/GenericObjectRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/GenericObjectRenderer.java @@ -21,11 +21,11 @@ package com.seibel.distanthorizons.core.render.renderer.generic; import com.seibel.distanthorizons.api.enums.config.EDhApiGpuUploadMethod; import com.seibel.distanthorizons.api.enums.config.EDhApiLoggerMode; +import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiGenericObjectShaderProgram; import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderableBoxGroup; import com.seibel.distanthorizons.api.interfaces.render.IDhApiCustomRenderRegister; import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiRenderParam; import com.seibel.distanthorizons.api.objects.math.DhApiVec3d; -import com.seibel.distanthorizons.api.objects.math.DhApiVec3i; import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBox; import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBoxGroupShading; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; @@ -36,15 +36,11 @@ import com.seibel.distanthorizons.core.render.glObject.GLProxy; import com.seibel.distanthorizons.core.render.glObject.GLState; import com.seibel.distanthorizons.core.render.glObject.buffer.GLElementBuffer; import com.seibel.distanthorizons.core.render.glObject.buffer.GLVertexBuffer; -import com.seibel.distanthorizons.core.render.glObject.shader.ShaderProgram; -import com.seibel.distanthorizons.core.render.glObject.vertexAttribute.AbstractVertexAttribute; -import com.seibel.distanthorizons.core.render.glObject.vertexAttribute.VertexPointer; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper; -import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.util.math.Vec3d; -import com.seibel.distanthorizons.core.util.math.Vec3f; +import com.seibel.distanthorizons.coreapi.DependencyInjection.OverrideInjector; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.opengl.ARBInstancedArrays; @@ -80,37 +76,15 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister // rendering setup private boolean init = false; - private ShaderProgram shader; + private IDhApiGenericObjectShaderProgram shaderProgram; private GLVertexBuffer boxVertexBuffer; private GLElementBuffer boxIndexBuffer; - private AbstractVertexAttribute va; private boolean useInstancedRendering; private boolean vertexAttribDivisorSupported; private boolean instancedArraysSupported; - // shader uniforms - private int directShaderTransformUniform; - private int directShaderColorUniform; - - private int instancedShaderOffsetChunkUniform; - private int instancedShaderOffsetSubChunkUniform; - private int instancedShaderCameraChunkPosUniform; - private int instancedShaderCameraSubChunkPosUniform; - private int instancedShaderProjectionModelViewMatrixUniform; - - private int lightMapUniform; - private int skyLightUniform; - private int blockLightUniform; - - private int northShadingUniform; - private int southShadingUniform; - private int eastShadingUniform; - private int westShadingUniform; - private int topShadingUniform; - private int bottomShadingUniform; - private final ConcurrentHashMap boxGroupById = new ConcurrentHashMap<>(); @@ -201,37 +175,7 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister LOGGER.warn("Instanced rendering not supported by this GPU, falling back to direct rendering. Generic object rendering will be slow."); } - - this.va = AbstractVertexAttribute.create(); - this.va.bind(); - // Pos - this.va.setVertexAttribute(0, 0, VertexPointer.addVec3Pointer(false)); - this.va.completeAndCheck(Float.BYTES * 3); - - this.shader = new ShaderProgram( - this.useInstancedRendering ? "shaders/genericObject/instanced/vert.vert" : "shaders/genericObject/direct/vert.vert", - this.useInstancedRendering ? "shaders/genericObject/instanced/frag.frag" : "shaders/genericObject/direct/frag.frag", - "fragColor", new String[]{"vPosition"}); - - this.directShaderTransformUniform = this.shader.tryGetUniformLocation("uTransform"); - this.directShaderColorUniform = this.shader.tryGetUniformLocation("uColor"); - - this.instancedShaderOffsetChunkUniform = this.shader.tryGetUniformLocation("uOffsetChunk"); - this.instancedShaderOffsetSubChunkUniform = this.shader.tryGetUniformLocation("uOffsetSubChunk"); - this.instancedShaderCameraChunkPosUniform = this.shader.tryGetUniformLocation("uCameraPosChunk"); - this.instancedShaderCameraSubChunkPosUniform = this.shader.tryGetUniformLocation("uCameraPosSubChunk"); - this.instancedShaderProjectionModelViewMatrixUniform = this.shader.tryGetUniformLocation("uProjectionMvm"); - - this.lightMapUniform = this.shader.getUniformLocation("uLightMap"); - this.skyLightUniform = this.shader.getUniformLocation("uSkyLight"); - this.blockLightUniform = this.shader.getUniformLocation("uBlockLight"); - //this.shadingModeUniform = this.shader.getUniformLocation("uShadingMode"); - this.northShadingUniform = this.shader.getUniformLocation("uNorthShading"); - this.southShadingUniform = this.shader.getUniformLocation("uSouthShading"); - this.eastShadingUniform = this.shader.getUniformLocation("uEastShading"); - this.westShadingUniform = this.shader.getUniformLocation("uWestShading"); - this.topShadingUniform = this.shader.getUniformLocation("uTopShading"); - this.bottomShadingUniform = this.shader.getUniformLocation("uBottomShading"); + this.shaderProgram = new GenericObjectShaderProgram(this.useInstancedRendering); this.createBuffers(); @@ -411,15 +355,18 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister GL32.glBlendEquation(GL32.GL_FUNC_ADD); GL32.glBlendFuncSeparate(GL32.GL_SRC_ALPHA, GL32.GL_ONE_MINUS_SRC_ALPHA, GL32.GL_ONE, GL32.GL_ONE_MINUS_SRC_ALPHA); - this.shader.bind(); - this.va.bind(); - this.va.bindBufferToAllBindingPoints(this.boxVertexBuffer.getId()); + IDhApiGenericObjectShaderProgram shaderProgram = this.shaderProgram; + IDhApiGenericObjectShaderProgram shaderProgramOverride = OverrideInjector.INSTANCE.get(IDhApiGenericObjectShaderProgram.class); + if (shaderProgramOverride != null && shaderProgram.overrideThisFrame()) + { + shaderProgram = shaderProgramOverride; + } + + shaderProgram.bind(); + shaderProgram.bindVertexBuffer(this.boxVertexBuffer.getId()); this.boxIndexBuffer.bind(); - Mat4f projectionMvmMatrix = new Mat4f(renderEventParam.dhProjectionMatrix); - projectionMvmMatrix.multiply(renderEventParam.dhModelViewMatrix); - Vec3d camPos = MC_RENDER.getCameraExactPosition(); @@ -441,12 +388,12 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister if (this.useInstancedRendering) { profiler.popPush("rendering"); - this.renderBoxGroupInstanced(boxGroup, camPos, projectionMvmMatrix); + this.renderBoxGroupInstanced(shaderProgram, renderEventParam, boxGroup, camPos); } else { profiler.popPush("rendering"); - this.renderBoxGroupDirect(boxGroup, projectionMvmMatrix, camPos); + this.renderBoxGroupDirect(shaderProgram, renderEventParam, boxGroup, camPos); } boxGroup.postRender(renderEventParam); @@ -459,7 +406,7 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister // clean up // profiler.popPush("cleanup"); - this.shader.unbind(); + shaderProgram.unbind(); glState.restore(); profiler.pop(); @@ -471,57 +418,22 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister // instanced rendering // //=====================// - private void renderBoxGroupInstanced(RenderableBoxGroup boxGroup, Vec3d camPos, Mat4f projectionMvmMatrix) + private void renderBoxGroupInstanced(IDhApiGenericObjectShaderProgram shaderProgram, DhApiRenderParam renderEventParam, RenderableBoxGroup boxGroup, Vec3d camPos) { // update instance data // boxGroup.updateVertexAttributeData(); - this.shader.setUniform(this.instancedShaderOffsetChunkUniform, - new DhApiVec3i( - LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().x), - LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().y), - LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().z) - )); - this.shader.setUniform(this.instancedShaderOffsetSubChunkUniform, - new Vec3f( - LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().x), - LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().y), - LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().z) - )); - - this.shader.setUniform(this.instancedShaderCameraChunkPosUniform, - new DhApiVec3i( - LodUtil.getChunkPosFromDouble(camPos.x), - LodUtil.getChunkPosFromDouble(camPos.y), - LodUtil.getChunkPosFromDouble(camPos.z) - )); - this.shader.setUniform(this.instancedShaderCameraSubChunkPosUniform, - new Vec3f( - LodUtil.getSubChunkPosFromDouble(camPos.x), - LodUtil.getSubChunkPosFromDouble(camPos.y), - LodUtil.getSubChunkPosFromDouble(camPos.z) - )); - - this.shader.setUniform(this.instancedShaderProjectionModelViewMatrixUniform, - projectionMvmMatrix); - - this.shader.setUniform(this.lightMapUniform, 0); // TODO this should probably be passed in - this.shader.setUniform(this.skyLightUniform, boxGroup.skyLight); - this.shader.setUniform(this.blockLightUniform, boxGroup.blockLight); - DhApiRenderableBoxGroupShading shading = boxGroup.shading; if (shading == null) { shading = DhApiRenderableBoxGroupShading.getUnshaded(); } - this.shader.setUniform(this.northShadingUniform, shading.north); - this.shader.setUniform(this.southShadingUniform, shading.south); - this.shader.setUniform(this.eastShadingUniform, shading.east); - this.shader.setUniform(this.westShadingUniform, shading.west); - this.shader.setUniform(this.topShadingUniform, shading.top); - this.shader.setUniform(this.bottomShadingUniform, shading.bottom); + shaderProgram.fillIndirectUniformData( + renderEventParam, + shading, boxGroup, + camPos); @@ -589,48 +501,28 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister // direct rendering // //==================// - private void renderBoxGroupDirect(RenderableBoxGroup boxGroup, Mat4f transformMatrix, Vec3d camPos) + private void renderBoxGroupDirect(IDhApiGenericObjectShaderProgram shaderProgram, DhApiRenderParam renderEventParam, RenderableBoxGroup boxGroup, Vec3d camPos) { - this.shader.setUniform(this.lightMapUniform, 0); // TODO this should probably be passed in - this.shader.setUniform(this.skyLightUniform, boxGroup.skyLight); - this.shader.setUniform(this.blockLightUniform, boxGroup.blockLight); - DhApiRenderableBoxGroupShading shading = boxGroup.shading; if (shading == null) { shading = DhApiRenderableBoxGroupShading.getUnshaded(); } - this.shader.setUniform(this.northShadingUniform, shading.north); - this.shader.setUniform(this.southShadingUniform, shading.south); - this.shader.setUniform(this.eastShadingUniform, shading.east); - this.shader.setUniform(this.westShadingUniform, shading.west); - this.shader.setUniform(this.topShadingUniform, shading.top); - this.shader.setUniform(this.bottomShadingUniform, shading.bottom); + shaderProgram.fillSharedDirectUniformData(renderEventParam, shading, boxGroup, camPos); for (DhApiRenderableBox box : boxGroup) { - this.renderBox(boxGroup, box, transformMatrix, camPos); + this.renderBox(shaderProgram, renderEventParam, boxGroup, box, camPos); } } private void renderBox( + IDhApiGenericObjectShaderProgram shaderProgram, + DhApiRenderParam renderEventParam, RenderableBoxGroup boxGroup, DhApiRenderableBox box, - Mat4f transformationMatrix, Vec3d camPos) + Vec3d camPos) { - Mat4f boxTransform = Mat4f.createTranslateMatrix( - (float) (box.minPos.x + boxGroup.getOriginBlockPos().x - camPos.x), - (float) (box.minPos.y + boxGroup.getOriginBlockPos().y - camPos.y), - (float) (box.minPos.z + boxGroup.getOriginBlockPos().z - camPos.z)); - boxTransform.multiply(Mat4f.createScaleMatrix( - (float) (box.maxPos.x - box.minPos.x), - (float) (box.maxPos.y - box.minPos.y), - (float) (box.maxPos.z - box.minPos.z))); - Mat4f transformMatrix = transformationMatrix.copy(); - transformMatrix.multiply(boxTransform); - this.shader.setUniform(this.directShaderTransformUniform, transformMatrix); - - this.shader.setUniform(this.directShaderColorUniform, box.color); - + shaderProgram.fillDirectUniformData(renderEventParam, boxGroup, box, camPos); GL32.glDrawElements(GL32.GL_TRIANGLES, BOX_INDICES.length, GL32.GL_UNSIGNED_INT, 0); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/GenericObjectShaderProgram.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/GenericObjectShaderProgram.java new file mode 100644 index 000000000..d51b2a647 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/GenericObjectShaderProgram.java @@ -0,0 +1,229 @@ +package com.seibel.distanthorizons.core.render.renderer.generic; + +import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiGenericObjectShaderProgram; +import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderableBoxGroup; +import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiRenderParam; +import com.seibel.distanthorizons.api.objects.math.DhApiVec3d; +import com.seibel.distanthorizons.api.objects.math.DhApiVec3i; +import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBox; +import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBoxGroupShading; +import com.seibel.distanthorizons.core.render.glObject.shader.ShaderProgram; +import com.seibel.distanthorizons.core.render.glObject.vertexAttribute.AbstractVertexAttribute; +import com.seibel.distanthorizons.core.render.glObject.vertexAttribute.VertexPointer; +import com.seibel.distanthorizons.core.util.LodUtil; +import com.seibel.distanthorizons.core.util.math.Mat4f; +import com.seibel.distanthorizons.core.util.math.Vec3f; + +public class GenericObjectShaderProgram extends ShaderProgram implements IDhApiGenericObjectShaderProgram +{ + public static final String VERTEX_SHADER_INSTANCED_PATH = "shaders/genericObject/instanced/vert.vert"; + public static final String VERTEX_SHADER_DIRECT_PATH = "shaders/genericObject/direct/vert.vert"; + public static final String FRAGMENT_SHADER_INSTANCED_PATH = "shaders/genericObject/instanced/frag.frag"; + public static final String FRAGMENT_SHADER_DIRECT_PATH = "shaders/genericObject/direct/frag.frag"; + + public final AbstractVertexAttribute va; + + + // shader uniforms + private final int directShaderTransformUniform; + private final int directShaderColorUniform; + + private final int instancedShaderOffsetChunkUniform; + private final int instancedShaderOffsetSubChunkUniform; + private final int instancedShaderCameraChunkPosUniform; + private final int instancedShaderCameraSubChunkPosUniform; + private final int instancedShaderProjectionModelViewMatrixUniform; + + private final int lightMapUniform; + private final int skyLightUniform; + private final int blockLightUniform; + + private final int northShadingUniform; + private final int southShadingUniform; + private final int eastShadingUniform; + private final int westShadingUniform; + private final int topShadingUniform; + private final int bottomShadingUniform; + + + + //=============// + // constructor // + //=============// + + public GenericObjectShaderProgram(boolean useInstancedRendering) + { + super( + useInstancedRendering ? VERTEX_SHADER_INSTANCED_PATH : VERTEX_SHADER_DIRECT_PATH, + useInstancedRendering ? FRAGMENT_SHADER_INSTANCED_PATH : FRAGMENT_SHADER_DIRECT_PATH, + "fragColor", new String[]{"vPosition"}); + + this.va = AbstractVertexAttribute.create(); + this.va.bind(); + // Pos + this.va.setVertexAttribute(0, 0, VertexPointer.addVec3Pointer(false)); + this.va.completeAndCheck(Float.BYTES * 3); + + this.directShaderTransformUniform = this.tryGetUniformLocation("uTransform"); + this.directShaderColorUniform = this.tryGetUniformLocation("uColor"); + + this.instancedShaderOffsetChunkUniform = this.tryGetUniformLocation("uOffsetChunk"); + this.instancedShaderOffsetSubChunkUniform = this.tryGetUniformLocation("uOffsetSubChunk"); + this.instancedShaderCameraChunkPosUniform = this.tryGetUniformLocation("uCameraPosChunk"); + this.instancedShaderCameraSubChunkPosUniform = this.tryGetUniformLocation("uCameraPosSubChunk"); + this.instancedShaderProjectionModelViewMatrixUniform = this.tryGetUniformLocation("uProjectionMvm"); + + this.lightMapUniform = this.getUniformLocation("uLightMap"); + this.skyLightUniform = this.getUniformLocation("uSkyLight"); + this.blockLightUniform = this.getUniformLocation("uBlockLight"); + this.northShadingUniform = this.getUniformLocation("uNorthShading"); + this.southShadingUniform = this.getUniformLocation("uSouthShading"); + this.eastShadingUniform = this.getUniformLocation("uEastShading"); + this.westShadingUniform = this.getUniformLocation("uWestShading"); + this.topShadingUniform = this.getUniformLocation("uTopShading"); + this.bottomShadingUniform = this.getUniformLocation("uBottomShading"); + + } + + + + //=========// + // methods // + //=========// + + @Override + public void bind() + { + super.bind(); + this.va.bind(); + } + @Override + public void unbind() + { + super.unbind(); + this.va.unbind(); + } + + @Override + public void free() + { + this.va.free(); + super.free(); + } + + @Override + public void bindVertexBuffer(int vbo) { this.va.bindBufferToAllBindingPoints(vbo); } + + @Override + public void fillIndirectUniformData( + DhApiRenderParam renderParameters, + DhApiRenderableBoxGroupShading shading, IDhApiRenderableBoxGroup boxGroup, + DhApiVec3d camPos + ) + { + Mat4f projectionMvmMatrix = new Mat4f(renderParameters.dhProjectionMatrix); + projectionMvmMatrix.multiply(renderParameters.dhModelViewMatrix); + + super.bind(); + + + + + this.setUniform(this.instancedShaderOffsetChunkUniform, + new DhApiVec3i( + LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().x), + LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().y), + LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().z) + )); + this.setUniform(this.instancedShaderOffsetSubChunkUniform, + new Vec3f( + LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().x), + LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().y), + LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().z) + )); + + this.setUniform(this.instancedShaderCameraChunkPosUniform, + new DhApiVec3i( + LodUtil.getChunkPosFromDouble(camPos.x), + LodUtil.getChunkPosFromDouble(camPos.y), + LodUtil.getChunkPosFromDouble(camPos.z) + )); + this.setUniform(this.instancedShaderCameraSubChunkPosUniform, + new Vec3f( + LodUtil.getSubChunkPosFromDouble(camPos.x), + LodUtil.getSubChunkPosFromDouble(camPos.y), + LodUtil.getSubChunkPosFromDouble(camPos.z) + )); + + this.setUniform(this.instancedShaderProjectionModelViewMatrixUniform, projectionMvmMatrix); + + this.setUniform(this.lightMapUniform, 0); // TODO this should probably be passed in + this.setUniform(this.skyLightUniform, boxGroup.getSkyLight()); + this.setUniform(this.blockLightUniform, boxGroup.getBlockLight()); + + + this.setUniform(this.northShadingUniform, shading.north); + this.setUniform(this.southShadingUniform, shading.south); + this.setUniform(this.eastShadingUniform, shading.east); + this.setUniform(this.westShadingUniform, shading.west); + this.setUniform(this.topShadingUniform, shading.top); + this.setUniform(this.bottomShadingUniform, shading.bottom); + + + } + + + @Override + public void fillSharedDirectUniformData( + DhApiRenderParam renderParameters, + DhApiRenderableBoxGroupShading shading, IDhApiRenderableBoxGroup boxGroup, + DhApiVec3d camPos) + { + + this.setUniform(this.lightMapUniform, 0); // TODO this should probably be passed in + this.setUniform(this.skyLightUniform, boxGroup.getSkyLight()); + this.setUniform(this.blockLightUniform, boxGroup.getBlockLight()); + + + this.setUniform(this.northShadingUniform, shading.north); + this.setUniform(this.southShadingUniform, shading.south); + this.setUniform(this.eastShadingUniform, shading.east); + this.setUniform(this.westShadingUniform, shading.west); + this.setUniform(this.topShadingUniform, shading.top); + this.setUniform(this.bottomShadingUniform, shading.bottom); + + } + + public void fillDirectUniformData( + DhApiRenderParam renderParameters, + IDhApiRenderableBoxGroup boxGroup, DhApiRenderableBox box, + DhApiVec3d camPos) + { + Mat4f projectionMvmMatrix = new Mat4f(renderParameters.dhProjectionMatrix); + projectionMvmMatrix.multiply(renderParameters.dhModelViewMatrix); + + Mat4f boxTransform = Mat4f.createTranslateMatrix( + (float) (box.minPos.x + boxGroup.getOriginBlockPos().x - camPos.x), + (float) (box.minPos.y + boxGroup.getOriginBlockPos().y - camPos.y), + (float) (box.minPos.z + boxGroup.getOriginBlockPos().z - camPos.z)); + boxTransform.multiply(Mat4f.createScaleMatrix( + (float) (box.maxPos.x - box.minPos.x), + (float) (box.maxPos.y - box.minPos.y), + (float) (box.maxPos.z - box.minPos.z))); + projectionMvmMatrix.multiply(boxTransform); + this.setUniform(this.directShaderTransformUniform, projectionMvmMatrix); + + this.setUniform(this.directShaderColorUniform, box.color); + + } + + + + @Override + public int getId() { return this.id; } + + /** The base DH render program should always render */ + @Override + public boolean overrideThisFrame() { return true; } + +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/util/math/Vec3d.java b/core/src/main/java/com/seibel/distanthorizons/core/util/math/Vec3d.java index 1eb4da89a..57911612f 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/util/math/Vec3d.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/util/math/Vec3d.java @@ -19,6 +19,7 @@ package com.seibel.distanthorizons.core.util.math; +import com.seibel.distanthorizons.api.objects.math.DhApiVec3d; import com.seibel.distanthorizons.coreapi.util.MathUtil; /** @@ -29,7 +30,7 @@ import com.seibel.distanthorizons.coreapi.util.MathUtil; * @author James Seibel * @version 11-18-2021 */ -public class Vec3d +public class Vec3d extends DhApiVec3d { public static Vec3d XNeg = new Vec3d(-1.0F, 0.0F, 0.0F); public static Vec3d XPos = new Vec3d(1.0F, 0.0F, 0.0F); @@ -40,16 +41,13 @@ public class Vec3d public static final Vec3d ZERO_VECTOR = new Vec3d(0.0D, 0.0D, 0.0D); - public double x; - public double y; - public double z; + //==============// + // constructors // + //==============// - public Vec3d() - { - - } + public Vec3d() { } public Vec3d(double x, double y, double z) { @@ -58,47 +56,11 @@ public class Vec3d this.z = z; } - @Override - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - else if (obj != null && this.getClass() == obj.getClass()) - { - Vec3d Vec3f = (Vec3d) obj; - if (Double.compare(Vec3f.x, this.x) != 0) - { - return false; - } - else if (Double.compare(Vec3f.y, this.y) != 0) - { - return false; - } - else - { - return Double.compare(Vec3f.z, this.z) == 0; - } - } - else - { - return false; - } - } - @Override - public int hashCode() - { - long longVal = Double.doubleToLongBits(this.x); - - int intVal = (int) (longVal ^ longVal >>> 32); - longVal = Double.doubleToLongBits(this.y); - intVal = 31 * intVal + (int) (longVal ^ longVal >>> 32); - longVal = Double.doubleToLongBits(this.z); - - return 31 * intVal + (int) (longVal ^ longVal >>> 32); - } + + //=========// + // methods // + //=========// public void mul(double scalar) { @@ -149,10 +111,7 @@ public class Vec3d this.z -= vector.z; } - public double dotProduct(Vec3d vector) - { - return this.x * vector.x + this.y * vector.y + this.z * vector.z; - } + public double dotProduct(Vec3d vector) { return this.x * vector.x + this.y * vector.y + this.z * vector.z; } public Vec3d normalize() { @@ -173,80 +132,10 @@ public class Vec3d this.z = f * f4 - f1 * f3; } - /* Matrix3f is not currently needed/implemented - public void transform(Matrix3f p_229188_1_) - { - double f = this.x; - double f1 = this.y; - double f2 = this.z; - this.x = p_229188_1_.m00 * f + p_229188_1_.m01 * f1 + p_229188_1_.m02 * f2; - this.y = p_229188_1_.m10 * f + p_229188_1_.m11 * f1 + p_229188_1_.m12 * f2; - this.z = p_229188_1_.m20 * f + p_229188_1_.m21 * f1 + p_229188_1_.m22 * f2; - } - */ - - /* Quaternions are not currently needed/implemented - public void transform(Quaternion p_214905_1_) - { - Quaternion quaternion = new Quaternion(p_214905_1_); - quaternion.mul(new Quaternion(this.x(), this.y(), this.z(), 0.0F)); - Quaternion quaternion1 = new Quaternion(p_214905_1_); - quaternion1.conj(); - quaternion.mul(quaternion1); - this.set(quaternion.i(), quaternion.j(), quaternion.k()); - } - */ - - /* not currently needed - * percent may actually be partial ticks (which is available when rendering) - public void linearInterp(Vec3f resultingVector, double percent) - { - double f = 1.0F - percent; - this.x = this.x * f + resultingVector.x * percent; - this.y = this.y * f + resultingVector.y * percent; - this.z = this.z * f + resultingVector.z * percent; - } - */ - - /* Quaternions are not currently needed/implemented - public Quaternion rotation(double p_229193_1_) - { - return new Quaternion(this, p_229193_1_, false); - } - - - @OnlyIn(Dist.CLIENT) - public Quaternion rotationDegrees(double p_229187_1_) - { - return new Quaternion(this, p_229187_1_, true); - } - */ - - public Vec3d copy() - { - return new Vec3d(this.x, this.y, this.z); - } - - /* not currently needed/implemented - public void map(double2doubleFunction p_229191_1_) - { - this.x = p_229191_1_.get(this.x); - this.y = p_229191_1_.get(this.y); - this.z = p_229191_1_.get(this.z); - } - */ - - @Override - public String toString() - { - return "[" + this.x + ", " + this.y + ", " + this.z + "]"; - } + public Vec3d copy() { return new Vec3d(this.x, this.y, this.z); } // Forge start - public Vec3d(double[] values) - { - set(values); - } + public Vec3d(double[] values) { this.set(values); } public void set(double[] values) {