diff --git a/api/src/main/java/com/seibel/distanthorizons/api/enums/rendering/EDhApiBlockMaterial.java b/api/src/main/java/com/seibel/distanthorizons/api/enums/rendering/EDhApiBlockMaterial.java
index 076a9f92d..f0f2b64a3 100644
--- a/api/src/main/java/com/seibel/distanthorizons/api/enums/rendering/EDhApiBlockMaterial.java
+++ b/api/src/main/java/com/seibel/distanthorizons/api/enums/rendering/EDhApiBlockMaterial.java
@@ -1,11 +1,25 @@
package com.seibel.distanthorizons.api.enums.rendering;
/**
- * contains the indices used by Iris to determine how different block types should be rendered
+ * contains the indices used by shaders to determine
+ * how different block types should be rendered.
*
- * USE_OPTIFINE_FOG_SETTING,
- * FOG_ENABLED,
- * FOG_DISABLED
+ * UNKOWN,
+ * LEAVES,
+ * STONE,
+ * WOOD,
+ * METAL,
+ * DIRT,
+ * LAVA,
+ * DEEPSLATE,
+ * SNOW,
+ * SAND,
+ * TERRACOTTA,
+ * NETHER_STONE,
+ * WATER,
+ * GRASS,
+ * AIR,
+ * ILLUMINATED,
*
* @author James Seibel
* @since API 3.0.0
diff --git a/api/src/main/java/com/seibel/distanthorizons/api/objects/render/DhApiRenderableBox.java b/api/src/main/java/com/seibel/distanthorizons/api/objects/render/DhApiRenderableBox.java
index a69684e95..d3411dc15 100644
--- a/api/src/main/java/com/seibel/distanthorizons/api/objects/render/DhApiRenderableBox.java
+++ b/api/src/main/java/com/seibel/distanthorizons/api/objects/render/DhApiRenderableBox.java
@@ -1,6 +1,7 @@
package com.seibel.distanthorizons.api.objects.render;
+import com.seibel.distanthorizons.api.enums.rendering.EDhApiBlockMaterial;
import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderableBoxGroup;
import com.seibel.distanthorizons.api.objects.math.DhApiVec3d;
import com.seibel.distanthorizons.api.objects.math.DhApiVec3f;
@@ -22,6 +23,7 @@ public class DhApiRenderableBox
public DhApiVec3d maxPos;
public Color color;
+ public byte material;
@@ -29,20 +31,21 @@ public class DhApiRenderableBox
// constructors //
//==============//
- public DhApiRenderableBox(DhApiVec3d minPos, float width, Color color)
+ public DhApiRenderableBox(DhApiVec3d minPos, float width, Color color, EDhApiBlockMaterial material)
{
this(minPos, new DhApiVec3d(
minPos.x + width,
minPos.y + width,
minPos.z + width
- ), color);
+ ), color, material);
}
- public DhApiRenderableBox(DhApiVec3d minPos, DhApiVec3d maxPos, Color color)
+ public DhApiRenderableBox(DhApiVec3d minPos, DhApiVec3d maxPos, Color color, EDhApiBlockMaterial material)
{
this.minPos = minPos;
this.maxPos = maxPos;
this.color = color;
+ this.material = material.index;
}
}
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/BeaconRenderHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/BeaconRenderHandler.java
index 38eb0d470..6518107ca 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/BeaconRenderHandler.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/BeaconRenderHandler.java
@@ -19,6 +19,7 @@
package com.seibel.distanthorizons.core.render.renderer.generic;
+import com.seibel.distanthorizons.api.enums.rendering.EDhApiBlockMaterial;
import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderableBoxGroup;
import com.seibel.distanthorizons.api.objects.math.DhApiVec3d;
import com.seibel.distanthorizons.api.objects.math.DhApiVec3f;
@@ -186,7 +187,8 @@ public class BeaconRenderHandler
DhApiRenderableBox beaconBox = new DhApiRenderableBox(
new DhApiVec3d(beacon.pos.x, beacon.pos.y+1, beacon.pos.z),
new DhApiVec3d(beacon.pos.x+1, BEAM_TOP_Y, beacon.pos.z+1),
- beacon.color
+ beacon.color,
+ EDhApiBlockMaterial.ILLUMINATED
);
this.beaconBoxGroup.add(beaconBox);
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/CloudRenderHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/CloudRenderHandler.java
index db549e2a3..d18fc7e0c 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/CloudRenderHandler.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/CloudRenderHandler.java
@@ -19,6 +19,7 @@
package com.seibel.distanthorizons.core.render.renderer.generic;
+import com.seibel.distanthorizons.api.enums.rendering.EDhApiBlockMaterial;
import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderableBoxGroup;
import com.seibel.distanthorizons.api.objects.math.DhApiVec3d;
import com.seibel.distanthorizons.api.objects.math.DhApiVec3f;
@@ -208,7 +209,8 @@ public class CloudRenderHandler
DhApiRenderableBox box = new DhApiRenderableBox(
new DhApiVec3d(minXBlockPos, 0, minZBlockPos),
new DhApiVec3d(maxXBlockPos, CLOUD_BOX_THICKNESS, maxZBlockPos),
- color
+ color,
+ EDhApiBlockMaterial.UNKOWN
);
boxList.add(box);
}
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 42ae9a475..94ab35d92 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,6 +21,7 @@ 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.enums.rendering.EDhApiBlockMaterial;
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;
@@ -221,7 +222,8 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister
ModInfo.NAME + ":CyanChunkBox",
new DhApiRenderableBox(
new DhApiVec3d(0,0,0), new DhApiVec3d(16,190,16),
- new Color(Color.CYAN.getRed(), Color.CYAN.getGreen(), Color.CYAN.getBlue(), 125))
+ new Color(Color.CYAN.getRed(), Color.CYAN.getGreen(), Color.CYAN.getBlue(), 125),
+ EDhApiBlockMaterial.WATER)
);
singleGiantBoxGroup.setSkyLight(LodUtil.MAX_MC_LIGHT);
singleGiantBoxGroup.setBlockLight(LodUtil.MAX_MC_LIGHT);
@@ -233,7 +235,8 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister
ModInfo.NAME + ":GreenBeacon",
new DhApiRenderableBox(
new DhApiVec3d(16,0,31), new DhApiVec3d(17,2000,32),
- new Color(Color.GREEN.getRed(), Color.GREEN.getGreen(), Color.GREEN.getBlue(), 125))
+ new Color(Color.GREEN.getRed(), Color.GREEN.getGreen(), Color.GREEN.getBlue(), 125),
+ EDhApiBlockMaterial.ILLUMINATED)
);
singleTallBoxGroup.setSkyLight(LodUtil.MAX_MC_LIGHT);
singleTallBoxGroup.setBlockLight(LodUtil.MAX_MC_LIGHT);
@@ -246,7 +249,10 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister
{
absBoxList.add(new DhApiRenderableBox(
new DhApiVec3d(i,150+i,24), new DhApiVec3d(1+i,151+i,25),
- new Color(Color.ORANGE.getRed(), Color.ORANGE.getGreen(), Color.ORANGE.getBlue())));
+ new Color(Color.ORANGE.getRed(), Color.ORANGE.getGreen(), Color.ORANGE.getBlue()),
+ EDhApiBlockMaterial.LAVA
+ )
+ );
}
IDhApiRenderableBoxGroup absolutePosBoxGroup = factory.createAbsolutePositionedGroup(ModInfo.NAME + ":OrangeStairs", absBoxList);
this.add(absolutePosBoxGroup);
@@ -258,7 +264,10 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister
{
relBoxList.add(new DhApiRenderableBox(
new DhApiVec3d(0,i,0), new DhApiVec3d(1,1+i,1),
- new Color(Color.MAGENTA.getRed(), Color.MAGENTA.getGreen(), Color.MAGENTA.getBlue())));
+ new Color(Color.MAGENTA.getRed(), Color.MAGENTA.getGreen(), Color.MAGENTA.getBlue()),
+ EDhApiBlockMaterial.METAL
+ )
+ );
}
IDhApiRenderableBoxGroup relativePosBoxGroup = factory.createRelativePositionedGroup(
ModInfo.NAME + ":MovingMagentaGroup",
@@ -282,7 +291,10 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister
{
massRelBoxList.add(new DhApiRenderableBox(
new DhApiVec3d(-x, 0, -z), new DhApiVec3d(1-x, 1, 1-z),
- new Color(Color.RED.getRed(), Color.RED.getGreen(), Color.RED.getBlue())));
+ new Color(Color.RED.getRed(), Color.RED.getGreen(), Color.RED.getBlue()),
+ EDhApiBlockMaterial.TERRACOTTA
+ )
+ );
}
}
IDhApiRenderableBoxGroup massRelativePosBoxGroup = factory.createRelativePositionedGroup(
@@ -474,6 +486,11 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister
this.vertexAttribDivisor(4, 1);
GL32.glVertexAttribPointer(4, 3, GL32.GL_FLOAT, false, 3 * Float.BYTES, 0);
+ GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, boxGroup.instanceMaterialVbo);
+ GL32.glEnableVertexAttribArray(5);
+ this.vertexAttribDivisor(5, 1);
+ GL32.glVertexAttribIPointer(5, 1, GL32.GL_BYTE, Byte.BYTES, 0);
+
// Draw instanced
if (boxGroup.uploadedBoxCount > 0)
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/RenderableBoxGroup.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/RenderableBoxGroup.java
index 4ac380661..e02588c86 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/RenderableBoxGroup.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/generic/RenderableBoxGroup.java
@@ -55,6 +55,7 @@ public class RenderableBoxGroup
// instance data
public int instanceColorVbo = 0;
+ public int instanceMaterialVbo = 0;
public int instanceScaleVbo = 0;
public int instanceChunkPosVbo = 0;
public int instanceSubChunkPosVbo = 0;
@@ -236,14 +237,15 @@ public class RenderableBoxGroup
this.instanceSubChunkPosVbo = GL32.glGenBuffers();
this.instanceScaleVbo = GL32.glGenBuffers();
this.instanceColorVbo = GL32.glGenBuffers();
+ this.instanceMaterialVbo = GL32.glGenBuffers();
}
int boxCount = this.size();
this.uploadedBoxCount = boxCount;
- // transformation / scaling //
+ // transformation / scaling //
int[] chunkPosData = new int[boxCount * 3];
float[] subChunkPosData = new float[boxCount * 3];
float[] scalingData = new float[boxCount * 3];
@@ -268,9 +270,9 @@ public class RenderableBoxGroup
}
- // colors //
-
+ // colors/materials //
float[] colorData = new float[boxCount * 4];
+ byte[] materialData = new byte[boxCount];
for (int i = 0; i < boxCount; i++)
{
DhApiRenderableBox box = this.get(i);
@@ -280,6 +282,8 @@ public class RenderableBoxGroup
colorData[colorIndex + 1] = color.getGreen() / 255.0f;
colorData[colorIndex + 2] = color.getBlue() / 255.0f;
colorData[colorIndex + 3] = color.getAlpha() / 255.0f;
+
+ materialData[i] = box.material;
}
@@ -294,6 +298,10 @@ public class RenderableBoxGroup
// Upload colors
GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, this.instanceColorVbo);
GL32.glBufferData(GL32.GL_ARRAY_BUFFER, colorData, GL32.GL_DYNAMIC_DRAW);
+
+ // Upload materials
+ GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, this.instanceMaterialVbo);
+ GL32.glBufferData(GL32.GL_ARRAY_BUFFER, colorData, GL32.GL_DYNAMIC_DRAW);
}
@@ -333,6 +341,12 @@ public class RenderableBoxGroup
GL32.glDeleteBuffers(this.instanceColorVbo);
this.instanceColorVbo = 0;
}
+
+ if (this.instanceMaterialVbo != 0)
+ {
+ GL32.glDeleteBuffers(this.instanceMaterialVbo);
+ this.instanceMaterialVbo = 0;
+ }
});
}
diff --git a/core/src/main/resources/shaders/genericObject/instanced/vert.vert b/core/src/main/resources/shaders/genericObject/instanced/vert.vert
index 25231ac39..a7d9a6a96 100644
--- a/core/src/main/resources/shaders/genericObject/instanced/vert.vert
+++ b/core/src/main/resources/shaders/genericObject/instanced/vert.vert
@@ -4,6 +4,7 @@ layout (location = 1) in vec4 aColor;
layout (location = 2) in vec3 aScale;
layout (location = 3) in ivec3 aTranslateChunk;
layout (location = 4) in vec3 aTranslateSubChunk;
+layout (location = 5) in int aMaterial;
uniform ivec3 uOffsetChunk;
uniform vec3 uOffsetSubChunk;