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)
{