Skip to content

Commit d5eb56a

Browse files
committed
Use Std140Builder
1 parent f655340 commit d5eb56a

5 files changed

Lines changed: 84 additions & 44 deletions

File tree

src/main/java/btw/lowercase/renderer/Renderer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.visuals.legacy.animatium.renderer.RenderDescriptor;
4848
import org.visuals.legacy.animatium.renderer.buffer.Geometry;
4949
import org.visuals.legacy.animatium.renderer.texture.TextureAndSampler;
50+
import org.visuals.legacy.animatium.renderer.uniform.UniformStorage;
5051
import org.visuals.legacy.animatium.util.compatibility.IrisPipeline;
5152
import org.visuals.legacy.animatium.util.compatibility.IrisUtil;
5253

@@ -150,6 +151,10 @@ public void setUniform(final String name, final GpuBuffer data) {
150151
this.setUniform(name, data.slice());
151152
}
152153

154+
public void setUniform(final UniformStorage storage) {
155+
this.setUniform(storage.getName(), storage.upload());
156+
}
157+
153158
public void setProjectionMatrix(final Matrix4f matrix4f) {
154159
if (this.projectionMatrixBuffer == null) {
155160
this.projectionMatrixBuffer = new ProjectionMatrixBuffer("Immediate Projection Buffer for " + this.name);

src/main/kotlin/org/visuals/legacy/animatium/handler/rendering/lighting/lightmap/LegacyLightmapRenderer.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,17 @@ import org.visuals.legacy.animatium.renderer.uniform.UniformStorage
3535

3636
class LegacyLightmapRenderer : AutoCloseable {
3737
companion object {
38-
private val BASE_GEOMETRY = BasicGeometry(0, 3)
3938
private val SkyDarken = UniformKey.Float("SkyDarken")
4039
private val SkyDarkness = UniformKey.Float("SkyDarkness")
4140
private val BlockLightRed = UniformKey.Float("BlockLightRed")
4241
private val NightVisionScale = UniformKey.Float("NightVisionScale")
4342
private val Gamma = UniformKey.Float("Gamma")
44-
private val UseBrightLightmap = UniformKey.Integer("UseBrightLightmap")
43+
private val UseBrightLightmap = UniformKey.Boolean("UseBrightLightmap")
44+
45+
private val BASE_GEOMETRY = BasicGeometry(0, 3)
4546
}
4647

47-
private val lightmapInfoUniform = UniformStorage.builder("Legacy Lightmap UBO")
48+
private val lightmapInfoUniform = UniformStorage.builder("LightmapInfo")
4849
.with(SkyDarken)
4950
.with(SkyDarkness)
5051
.with(BlockLightRed)
@@ -61,15 +62,13 @@ class LegacyLightmapRenderer : AutoCloseable {
6162
Renderer.of({ "Legacy Lightmap Update" }, textureView).use { renderer ->
6263
renderer.setPipeline(AnimatiumPipelines.LEGACY_LIGHTMAP)
6364
renderer.setUniform(
64-
"LightmapInfo",
6565
this.lightmapInfoUniform
6666
.set(SkyDarken, state.skyDarken)
6767
.set(SkyDarkness, state.skyDarkness)
6868
.set(BlockLightRed, state.blockLightRed)
6969
.set(NightVisionScale, state.nightVisionScale)
7070
.set(Gamma, state.gamma)
71-
.set(UseBrightLightmap, if (state.useBrightLightmap) 1 else 0)
72-
.upload()
71+
.set(UseBrightLightmap, state.useBrightLightmap)
7372
)
7473
renderer.draw(BASE_GEOMETRY)
7574
}

src/main/kotlin/org/visuals/legacy/animatium/renderer/uniform/UniformKey.kt

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,33 +27,50 @@ package org.visuals.legacy.animatium.renderer.uniform
2727

2828
import org.joml.*
2929

30-
class UniformKey<T>(val name: String, val serializer: UniformSerializer<*>) {
30+
class UniformKey<T> {
3131
companion object {
3232
@JvmStatic
33-
fun Integer(name: String): UniformKey<Int> = UniformKey(name, UniformSerializer.INTEGER)
33+
fun <T> of(name: String, serializer: UniformSerializer<T>): UniformKey<T> = UniformKey(name, serializer)
3434

3535
@JvmStatic
36-
fun Float(name: String): UniformKey<Float> = UniformKey(name, UniformSerializer.FLOAT)
36+
fun Integer(name: String): UniformKey<Int> = of(name, UniformSerializer.INTEGER)
3737

3838
@JvmStatic
39-
fun Matrix4f(name: String): UniformKey<Matrix4f> = UniformKey(name, UniformSerializer.MATRIX4F)
39+
fun Float(name: String): UniformKey<Float> = of(name, UniformSerializer.FLOAT)
4040

4141
@JvmStatic
42-
fun Vector2f(name: String): UniformKey<Vector2f> = UniformKey(name, UniformSerializer.VECTOR2F)
42+
fun Double(name: String): UniformKey<Double> = of(name, UniformSerializer.DOUBLE)
4343

4444
@JvmStatic
45-
fun Vector2i(name: String): UniformKey<Vector2i> = UniformKey(name, UniformSerializer.VECTOR2I)
45+
fun Boolean(name: String): UniformKey<Boolean> = of(name, UniformSerializer.BOOLEAN)
4646

4747
@JvmStatic
48-
fun Vector3f(name: String): UniformKey<Vector3f> = UniformKey(name, UniformSerializer.VECTOR3F)
48+
fun Matrix4f(name: String): UniformKey<Matrix4f> = of(name, UniformSerializer.MATRIX4F)
4949

5050
@JvmStatic
51-
fun Vector3i(name: String): UniformKey<Vector3i> = UniformKey(name, UniformSerializer.VECTOR3I)
51+
fun Vector2f(name: String): UniformKey<Vector2f> = of(name, UniformSerializer.VECTOR2F)
5252

5353
@JvmStatic
54-
fun Vector4f(name: String): UniformKey<Vector4f> = UniformKey(name, UniformSerializer.VECTOR4F)
54+
fun Vector2i(name: String): UniformKey<Vector2i> = of(name, UniformSerializer.VECTOR2I)
5555

5656
@JvmStatic
57-
fun Vector4i(name: String): UniformKey<Vector4i> = UniformKey(name, UniformSerializer.VECTOR4I)
57+
fun Vector3f(name: String): UniformKey<Vector3f> = of(name, UniformSerializer.VECTOR3F)
58+
59+
@JvmStatic
60+
fun Vector3i(name: String): UniformKey<Vector3i> = of(name, UniformSerializer.VECTOR3I)
61+
62+
@JvmStatic
63+
fun Vector4f(name: String): UniformKey<Vector4f> = of(name, UniformSerializer.VECTOR4F)
64+
65+
@JvmStatic
66+
fun Vector4i(name: String): UniformKey<Vector4i> = of(name, UniformSerializer.VECTOR4I)
67+
}
68+
69+
val name: String
70+
val serializer: UniformSerializer<T>
71+
72+
private constructor(name: String, serializer: UniformSerializer<T>) {
73+
this.name = name
74+
this.serializer = serializer
5875
}
5976
}

src/main/kotlin/org/visuals/legacy/animatium/renderer/uniform/UniformSerializer.kt

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@
2525

2626
package org.visuals.legacy.animatium.renderer.uniform
2727

28+
import com.mojang.blaze3d.buffers.Std140Builder
2829
import com.mojang.blaze3d.buffers.Std140SizeCalculator
2930
import org.joml.*
30-
import java.nio.ByteBuffer
3131

3232
abstract class UniformSerializer<T> {
3333
companion object {
3434
val INTEGER = object : UniformSerializer<Int>() {
35-
override fun put(buffer: ByteBuffer, value: Int) {
36-
buffer.putInt(value)
35+
override fun put(builder: Std140Builder, value: Int) {
36+
builder.putInt(value)
3737
}
3838

3939
override fun size(calculator: Std140SizeCalculator) {
@@ -42,18 +42,22 @@ abstract class UniformSerializer<T> {
4242
}
4343

4444
val FLOAT = object : UniformSerializer<Float>() {
45-
override fun put(buffer: ByteBuffer, value: Float) {
46-
buffer.putFloat(value)
45+
override fun put(builder: Std140Builder, value: Float) {
46+
builder.putFloat(value)
4747
}
4848

4949
override fun size(calculator: Std140SizeCalculator) {
5050
calculator.putFloat()
5151
}
5252
}
5353

54+
val DOUBLE = FLOAT.map(Double::toFloat)
55+
56+
val BOOLEAN = INTEGER.map<Boolean> { if (it) 1 else 0 }
57+
5458
val MATRIX4F = object : UniformSerializer<Matrix4f>() {
55-
override fun put(buffer: ByteBuffer, value: Matrix4f) {
56-
value.get(buffer)
59+
override fun put(builder: Std140Builder, value: Matrix4f) {
60+
builder.putMat4f(value)
5761
}
5862

5963
override fun size(calculator: Std140SizeCalculator) {
@@ -62,8 +66,8 @@ abstract class UniformSerializer<T> {
6266
}
6367

6468
val VECTOR2F = object : UniformSerializer<Vector2f>() {
65-
override fun put(buffer: ByteBuffer, value: Vector2f) {
66-
value.get(buffer)
69+
override fun put(builder: Std140Builder, value: Vector2f) {
70+
builder.putVec2(value)
6771
}
6872

6973
override fun size(calculator: Std140SizeCalculator) {
@@ -72,8 +76,8 @@ abstract class UniformSerializer<T> {
7276
}
7377

7478
val VECTOR2I = object : UniformSerializer<Vector2i>() {
75-
override fun put(buffer: ByteBuffer, value: Vector2i) {
76-
value.get(buffer)
79+
override fun put(builder: Std140Builder, value: Vector2i) {
80+
builder.putIVec2(value)
7781
}
7882

7983
override fun size(calculator: Std140SizeCalculator) {
@@ -82,8 +86,8 @@ abstract class UniformSerializer<T> {
8286
}
8387

8488
val VECTOR3F = object : UniformSerializer<Vector3f>() {
85-
override fun put(buffer: ByteBuffer, value: Vector3f) {
86-
value.get(buffer)
89+
override fun put(builder: Std140Builder, value: Vector3f) {
90+
builder.putVec3(value)
8791
}
8892

8993
override fun size(calculator: Std140SizeCalculator) {
@@ -92,8 +96,8 @@ abstract class UniformSerializer<T> {
9296
}
9397

9498
val VECTOR3I = object : UniformSerializer<Vector3i>() {
95-
override fun put(buffer: ByteBuffer, value: Vector3i) {
96-
value.get(buffer)
99+
override fun put(builder: Std140Builder, value: Vector3i) {
100+
builder.putIVec3(value)
97101
}
98102

99103
override fun size(calculator: Std140SizeCalculator) {
@@ -102,8 +106,8 @@ abstract class UniformSerializer<T> {
102106
}
103107

104108
val VECTOR4F = object : UniformSerializer<Vector4f>() {
105-
override fun put(buffer: ByteBuffer, value: Vector4f) {
106-
value.get(buffer)
109+
override fun put(builder: Std140Builder, value: Vector4f) {
110+
builder.putVec4(value)
107111
}
108112

109113
override fun size(calculator: Std140SizeCalculator) {
@@ -112,8 +116,8 @@ abstract class UniformSerializer<T> {
112116
}
113117

114118
val VECTOR4I = object : UniformSerializer<Vector4i>() {
115-
override fun put(buffer: ByteBuffer, value: Vector4i) {
116-
value.get(buffer)
119+
override fun put(builder: Std140Builder, value: Vector4i) {
120+
builder.putIVec4(value)
117121
}
118122

119123
override fun size(calculator: Std140SizeCalculator) {
@@ -122,7 +126,20 @@ abstract class UniformSerializer<T> {
122126
}
123127
}
124128

125-
abstract fun put(buffer: ByteBuffer, value: T)
129+
abstract fun put(builder: Std140Builder, value: T)
126130

127131
abstract fun size(calculator: Std140SizeCalculator)
132+
133+
fun <From> map(conversion: (value: From) -> T): UniformSerializer<From> {
134+
val outer = this
135+
return object : UniformSerializer<From>() {
136+
override fun put(builder: Std140Builder, value: From) {
137+
outer.put(builder, conversion(value))
138+
}
139+
140+
override fun size(calculator: Std140SizeCalculator) {
141+
outer.size(calculator)
142+
}
143+
}
144+
}
128145
}

src/main/kotlin/org/visuals/legacy/animatium/renderer/uniform/UniformStorage.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,16 @@ package org.visuals.legacy.animatium.renderer.uniform
2727

2828
import com.mojang.blaze3d.buffers.GpuBuffer
2929
import com.mojang.blaze3d.buffers.GpuBufferSlice
30+
import com.mojang.blaze3d.buffers.Std140Builder
3031
import com.mojang.blaze3d.buffers.Std140SizeCalculator
3132
import com.mojang.blaze3d.systems.RenderSystem
3233

3334
class UniformStorage : AutoCloseable {
34-
private val name: String
35+
val name: String
36+
3537
private val keys: MutableList<UniformKey<*>>
3638
private val values = LinkedHashMap<UniformKey<*>, Any?>()
3739
private val size: Int
38-
3940
private var closed = false
4041

4142
private constructor(name: String, keys: List<UniformKey<*>>, size: Int) {
@@ -53,9 +54,9 @@ class UniformStorage : AutoCloseable {
5354

5455
fun <T> set(key: UniformKey<T>, value: T): UniformStorage {
5556
if (this.closed) {
56-
throw RuntimeException("Cannot set value in uniform storage \"" + this.name + "\" as it has been closed!")
57+
throw RuntimeException("Cannot set value in Uniform Storage (${this.name}) as it has been closed!")
5758
} else if (!this.keys.contains(key)) {
58-
throw UnsupportedOperationException("Uniform storage does not contain key '" + key.name + "'!")
59+
throw UnsupportedOperationException("Uniform storage does not contain key '${key.name}'!")
5960
} else {
6061
this.values[key] = value
6162
return this
@@ -71,7 +72,7 @@ class UniformStorage : AutoCloseable {
7172

7273
fun upload(): GpuBufferSlice {
7374
if (this.closed) {
74-
throw RuntimeException("Cannot update uniform storage \"" + this.name + "\" as it has been closed!")
75+
throw RuntimeException("Cannot upload Uniform Storage (${this.name}) as it has been closed!")
7576
} else {
7677
val device = RenderSystem.getDevice()
7778
val transientMemory = device.createCommandEncoder().transientMemory()
@@ -81,11 +82,12 @@ class UniformStorage : AutoCloseable {
8182
alignment.toLong(),
8283
GpuBuffer.USAGE_UNIFORM
8384
).use { view ->
85+
val builder = Std140Builder.intoBuffer(view.data)
8486
for (entry in this.values) {
8587
val key = entry.key
8688
val value = entry.value
87-
?: throw RuntimeException("Failed to bind \"" + key.name + "\" in Uniform Storage (" + this.name + ") as value is not set!")
88-
(key.serializer as UniformSerializer<Any>).put(view.data, value)
89+
?: throw RuntimeException("Failed to bind \"${key.name}\" in Uniform Storage (${this.name}) as value is not set!")
90+
(key.serializer as UniformSerializer<Any>).put(builder, value)
8991
}
9092

9193
return view.slice
@@ -116,7 +118,7 @@ class UniformStorage : AutoCloseable {
116118
fun build(): UniformStorage {
117119
val size = this.calculator.get()
118120
if (size == 0) {
119-
throw RuntimeException("Cannot build Uniform Storage (" + this.name + ") as it contains no uniforms!")
121+
throw RuntimeException("Cannot build Uniform Storage (${this.name}) as it contains no uniforms!")
120122
} else {
121123
return UniformStorage(this.name, this.keys, size)
122124
}

0 commit comments

Comments
 (0)