Skip to content

Commit 5e71562

Browse files
committed
2.14.0 - rare candy (note there is a chance that this commit will not work due to potential failure of library upload to mavne.)
1 parent 72ab0df commit 5e71562

5 files changed

Lines changed: 83 additions & 61 deletions

File tree

common/src/main/java/generations/gg/generations/core/generationscore/common/client/GenerationsCoreClient.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -557,11 +557,16 @@ object GenerationsCoreClient {
557557
RenderSystem.enableDepthTest()
558558
RenderSystem.defaultBlendFunc()
559559
RenderSystem.enableBlend()
560-
renderRareCandyTransparent(true)
560+
renderRareCandyTransparent()
561561
RenderStateRecord.pop()
562+
563+
ModelRegistry.worldRareCandy.end()
564+
565+
ModelRegistry.tick()
562566
}
563567

564568
fun firstRenderPass() {
569+
ModelRegistry.worldRareCandy.update(MinecraftClientGameProvider.getTimePassed())
565570

566571
MatrixCache.projectionMatrix = RenderSystem.getProjectionMatrix()
567572
MatrixCache.viewMatrix = RenderSystem.getModelViewMatrix()
@@ -576,21 +581,21 @@ object GenerationsCoreClient {
576581

577582

578583
fun renderRareCandySolid() {
579-
renderRareCandy(RenderStage.SOLID, false)
584+
renderRareCandy(RenderStage.SOLID)
580585
}
581586

582-
fun renderRareCandyTransparent(clear: Boolean = false) {
583-
renderRareCandy(RenderStage.TRANSPARENT, clear)
587+
fun renderRareCandyTransparent() {
588+
renderRareCandy(RenderStage.TRANSPARENT)
584589
}
585590

586-
fun renderRareCandy(stage: RenderStage, clear: Boolean) {
591+
fun renderRareCandy(stage: RenderStage) {
587592
if (GenerationsCore.CONFIG.client.useVanilla) return
588593

589594
var startTime = System.currentTimeMillis()
590595
RenderSystem.enableDepthTest()
591596
BufferUploader.reset()
592597

593-
ModelRegistry.worldRareCandy.render(stage, clear, MinecraftClientGameProvider.getTimePassed())
598+
ModelRegistry.worldRareCandy.render(stage, false)
594599
if (shouldRenderFpsPie()) LOGGER.warn("RareCandy render took " + (System.currentTimeMillis() - startTime) + "ms")
595600
}
596601
}

common/src/main/java/generations/gg/generations/core/generationscore/common/client/render/rarecandy/CompiledModel.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import gg.generations.rarecandy.renderer.components.MultiRenderObject
1111
import gg.generations.rarecandy.renderer.rendering.ObjectInstance
1212
import gg.generations.rarecandy.renderer.storage.AnimatedObjectInstance
1313
import gg.generations.rarecandy.renderer.storage.ObjectManager
14+
import net.minecraft.client.Minecraft
1415
import net.minecraft.client.renderer.MultiBufferSource
1516
import net.minecraft.resources.ResourceLocation
1617
import net.minecraft.server.packs.resources.Resource
@@ -65,7 +66,8 @@ class CompiledModel @JvmOverloads constructor(
6566
}
6667

6768
private fun renderRareCandy(instance: ObjectInstance, objectManager: ObjectManager) {
68-
objectManager.add(renderObject!!, instance)
69+
if(instance.isLinked) instance.use()
70+
else objectManager.add(renderObject!!, instance)
6971
}
7072

7173
fun delete() {
@@ -84,11 +86,13 @@ class CompiledModel @JvmOverloads constructor(
8486
fun init() {}
8587

8688
@JvmStatic
87-
fun of(pair: ResourceLocation, resource: Resource): CompiledModel {
89+
fun of(key: ResourceLocation): CompiledModel {
8890
return try {
89-
CompiledModel(pair, resource, { AnimatedMeshObject() })
91+
val resource = Minecraft.getInstance().resourceManager.getResourceOrThrow(key)
92+
93+
CompiledModel(key, resource, { AnimatedMeshObject() })
9094
} catch (e: Exception) {
91-
val path = pair.toString()
95+
val path = key.toString()
9296
if (path.endsWith(".smdx") || path.endsWith(".pqc")) throw RuntimeException("Tried reading a 1.12 .smdx or .pqc")
9397
throw RuntimeException("Failed to load $path", e)
9498
}

common/src/main/java/generations/gg/generations/core/generationscore/common/client/render/rarecandy/ModelRegistry.kt

Lines changed: 47 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package generations.gg.generations.core.generationscore.common.client.render.rarecandy
22

3+
import com.mojang.blaze3d.pipeline.RenderCall
34
import com.mojang.blaze3d.systems.RenderSystem
45
import com.mojang.blaze3d.vertex.PoseStack
56
import com.mojang.math.Axis
@@ -21,52 +22,64 @@ import java.util.concurrent.TimeUnit
2122
import java.util.function.BiConsumer
2223

2324
object ModelRegistry {
24-
private const val DUMMY = "dummy"
25-
26-
// val CACHE = TimedCache(Duration.ofMinutes(1), BiConsumer<ResourceLocation, CompiledModel>{
27-
// key, value ->
28-
//// System.out.println("DELETING: $key")
29-
// RenderSystem.recordRenderCall { value.delete() }
30-
// }, Function {
31-
// val resourceManager = Minecraft.getInstance().resourceManager
32-
// try {
33-
// of(it, resourceManager.getResourceOrThrow(it))
34-
// } catch (e: Exception) {
35-
// throw RuntimeException(e)
36-
// }
37-
// });
38-
39-
private val LOADER = Caffeine.newBuilder().executor(Minecraft.getInstance()).expireAfterAccess(2, TimeUnit.MINUTES)
40-
.removalListener { key: ResourceLocation, value: CompiledModel, cause: RemovalCause ->
41-
if(GenerationsCore.CONFIG.client.logModelLoading) GenerationsCore.LOGGER.info(String.format("%s was removed from cache. Deleting GPU Resouces next.", key, cause))
42-
RenderSystem.recordRenderCall { value.delete() }
43-
}
44-
.buildAsync<ResourceLocation, CompiledModel>(
45-
CacheLoader { key ->
46-
val resourceManager = Minecraft.getInstance().resourceManager
47-
try {
48-
return@CacheLoader of(key, resourceManager.getResourceOrThrow(key))
49-
} catch (e: Exception) {
50-
throw RuntimeException(e)
51-
}
52-
})
25+
private val modelsToLoad: MutableList<ResourceLocation> = mutableListOf()
26+
27+
private val CACHE = mutableMapOf<ResourceLocation, CompiledModel>()
28+
private val TIMES = mutableMapOf<ResourceLocation, Double>()
29+
5330
@JvmStatic
5431
operator fun get(modelProvider: ModelContextProviders.ModelProvider): CompiledModel? {
5532
return modelProvider.model?.let(::get)
5633
}
5734

5835
@JvmStatic
59-
fun cache() = LOADER
36+
fun clear() {
37+
ensureOnRenderThread {
38+
CACHE.forEach { (_, value) -> value.delete() }
6039

61-
@JvmStatic
62-
fun clear() = LOADER.asMap().clear()
40+
CACHE.clear()
41+
}
42+
}
43+
44+
fun ensureOnRenderThread(runnable: RenderCall) {
45+
if (RenderSystem.isOnRenderThread()) {
46+
runnable.execute()
47+
} else {
48+
RenderSystem.recordRenderCall(runnable)
49+
}
50+
}
6351

64-
fun tick() = /*CACHE.tick()*/ {}
52+
fun tick() {
53+
ensureOnRenderThread {
54+
val time = MinecraftClientGameProvider.getTimePassed();
55+
56+
modelsToLoad.forEach {
57+
CACHE[it] = of(it);
58+
TIMES[it] = time
59+
}
60+
61+
modelsToLoad.clear()
62+
63+
val keys = TIMES.filter { time - it.value >= 5.0 }.map { it.key }
64+
65+
for(key in keys) {
66+
CACHE[key]?.also {
67+
it.delete()
68+
}
69+
70+
CACHE.remove(key)
71+
TIMES.remove(key)
72+
}
73+
}
74+
}
6575

6676
@JvmStatic
6777
operator fun get(location: ResourceLocation): CompiledModel? {
6878
return try {
69-
LOADER[location].getNow(null)
79+
if(modelsToLoad.contains(location)) return null;
80+
else {
81+
CACHE[location]?.also { TIMES[location] = MinecraftClientGameProvider.getTimePassed() } ?: run { modelsToLoad += location }.let { null }
82+
}
7083
} catch (e: Exception) {
7184
null
7285
}

common/src/main/java/generations/gg/generations/core/generationscore/common/client/render/rarecandy/Pipelines.kt

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,14 @@ object Pipelines {
9999
.supplyMat4("projectionMatrix") { MatrixCache.projectionMatrix }
100100
.supplyVec2("uvOffset") { it.transform.offset() ?: Transform.DEFAULT_OFFSET }
101101
.supplyVec2("uvScale") { it.transform.scale() ?: Transform.DEFAULT_SCALE }
102-
.supplyMat4s("boneTransforms") { ctx -> ctx.instance.instanceOrNull<AnimatedObjectInstance>()?.transforms ?: AnimationController.NO_ANIMATION }
102+
.supplyMat4s("boneTransforms") { ctx -> ctx.instance().instanceOrNull<AnimatedObjectInstance>()?.transforms ?: AnimationController.NO_ANIMATION }
103103

104104
.supplyColorArray("ColorModulator") { RenderSystem.getShaderColor() }
105105
.supplyFloatUniform("FogStart") { RenderSystem.getShaderFogStart() }
106106
.supplyFloatUniform("FogEnd") { RenderSystem.getShaderFogEnd() }
107107
.supplyColorArray("FogColor") { RenderSystem.getShaderFogColor() }
108108

109-
.supplyTexture("diffuse", 0) { it.instance.instanceOrNull<StatueInstance>()?.material?.let { GenerationsTextureLoader.getTextureOrNull(it) } ?: it.getTextureOrOther({ it.material.images().diffuse }) { ITextureLoader.instance().nuetralFallback } }
109+
.supplyTexture("diffuse", 0) { it.instance().instanceOrNull<StatueInstance>()?.material?.let { GenerationsTextureLoader.getTextureOrNull(it) } ?: it.getTextureOrOther({ it.material.images().diffuse }) { ITextureLoader.instance().nuetralFallback } }
110110
.supplyTexture("mask", 1) { it.getTextureOrOther({ it.material.images().mask }) { ITextureLoader.instance().darkFallback } }
111111
.supplyTexture("layer", 2) { it.getTextureOrOther({ it.material.images().layer }) { ITextureLoader.instance().darkFallback } }
112112
.supplyTexture("lightmap", 3) { Minecraft.getInstance().gameRenderer.lightTexture() as ITexture }
@@ -121,11 +121,11 @@ object Pipelines {
121121
ctx.uniform().upload2i(light and 0xFFFF, light shr 16 and 0xFFFF)
122122
}
123123

124-
.supplyVec3("tint") { it.instance.instanceOrNull<CobblemonInstance>()?.tint?.takeIf { it != ZERO } ?: ONE }
124+
.supplyVec3("tint") { it.instance().instanceOrNull<CobblemonInstance>()?.tint?.takeIf { it != ZERO } ?: ONE }
125125

126126
.supplyInt("frame") { pingpong(MinecraftClientGameProvider.getTimePassed()).toInt() }
127127

128-
.supplyVec3("baseColor1") { ctx -> ctx.instance.instanceOrNull<TintProvider>()?.tint ?: ctx.takeIf { !it.isStatueMaterial }?.material?.values()?.baseColor1 ?: ONE }
128+
.supplyVec3("baseColor1") { ctx -> ctx.instance().instanceOrNull<TintProvider>()?.tint ?: ctx.takeIf { !it.isStatueMaterial }?.material?.values()?.baseColor1 ?: ONE }
129129
.supplyVec3("baseColor2") { ctx -> ctx.takeIf { !it.isStatueMaterial }?.material?.values()?.baseColor2 ?: ONE }
130130
.supplyVec3("baseColor3") { ctx -> ctx.takeIf { !it.isStatueMaterial }?.material?.values()?.baseColor3 ?: ONE }
131131
.supplyVec3("baseColor4") { ctx -> ctx.takeIf { !it.isStatueMaterial }?.material?.values()?.baseColor4 ?: ONE }
@@ -146,10 +146,10 @@ object Pipelines {
146146
.supplyVec3("Light1_Direction") { RenderSystem.shaderLightDirections[1] }
147147

148148
.supplyBooleanUniform("useTera") {
149-
val isActive = it.instance.instanceOrNull<CobblemonInstance>()?.teraActive ?: false
149+
val isActive = it.instance().instanceOrNull<CobblemonInstance>()?.teraActive ?: false
150150
return@supplyBooleanUniform isActive
151151
}
152-
.supplyVec3("teraTint") { it.instance.instanceOrNull<CobblemonInstance>()?.teraTint?.takeIf { it != ZERO } ?: ONE }
152+
.supplyVec3("teraTint") { it.instance().instanceOrNull<CobblemonInstance>()?.teraTint?.takeIf { it != ZERO } ?: ONE }
153153

154154
.prePostDraw({ material ->
155155
if (material.cullType() != CullType.None) {
@@ -178,26 +178,26 @@ fun pingpong(time: Double): Double = (sin(time * Math.PI * 2) * 7 + 7).toInt().t
178178

179179
private fun Pipeline.Builder.supplyColorArray(name: String, function: (UniformUploadContext) -> FloatArray): Pipeline.Builder = this.supplyUniform(name) {
180180
val color = function.invoke(it)
181-
it.uniform.upload4f(color[0], color[1], color[2], color[3])
181+
it.uniform().upload4f(color[0], color[1], color[2], color[3])
182182
}
183183

184-
private fun Pipeline.Builder.supplyMat4s(name: String, function: (UniformUploadContext) -> Array<Matrix4f>): Pipeline.Builder = this.supplyUniform(name) { it.uniform.uploadMat4fs(function.invoke(it)) }
185-
private fun Pipeline.Builder.supplyMat4(name: String, function: (UniformUploadContext) -> Matrix4f): Pipeline.Builder = this.supplyUniform(name) { it.uniform.uploadMat4f(function.invoke(it)) }
186-
private fun Pipeline.Builder.supplyVec2(name: String, function: (UniformUploadContext) -> Vector2f): Pipeline.Builder = this.supplyUniform(name) { it.uniform.uploadVec2f(function.invoke(it)) }
187-
private fun Pipeline.Builder.supplyVec3(name: String, function: (UniformUploadContext) -> Vector3f): Pipeline.Builder = this.supplyUniform(name) { it.uniform.uploadVec3f(function.invoke(it))}
188-
private fun Pipeline.Builder.supplyFloatUniform(name: String, function: (UniformUploadContext) -> Float): Pipeline.Builder = this.supplyUniform(name) { it.uniform.uploadFloat(function.invoke(it)) }
184+
private fun Pipeline.Builder.supplyMat4s(name: String, function: (UniformUploadContext) -> Array<Matrix4f>): Pipeline.Builder = this.supplyUniform(name) { it.uniform().uploadMat4fs(function.invoke(it)) }
185+
private fun Pipeline.Builder.supplyMat4(name: String, function: (UniformUploadContext) -> Matrix4f): Pipeline.Builder = this.supplyUniform(name) { it.uniform().uploadMat4f(function.invoke(it)) }
186+
private fun Pipeline.Builder.supplyVec2(name: String, function: (UniformUploadContext) -> Vector2f): Pipeline.Builder = this.supplyUniform(name) { it.uniform().uploadVec2f(function.invoke(it)) }
187+
private fun Pipeline.Builder.supplyVec3(name: String, function: (UniformUploadContext) -> Vector3f): Pipeline.Builder = this.supplyUniform(name) { it.uniform().uploadVec3f(function.invoke(it))}
188+
private fun Pipeline.Builder.supplyFloatUniform(name: String, function: (UniformUploadContext) -> Float): Pipeline.Builder = this.supplyUniform(name) { it.uniform().uploadFloat(function.invoke(it)) }
189189
private fun Pipeline.Builder.supplyEnumUniform(name: String, value: Enum<*>): Pipeline.Builder = this.supplyInt(name) { value.ordinal }
190-
private fun Pipeline.Builder.supplyInt(name: String, function: (UniformUploadContext) -> Int): Pipeline.Builder = this.also { this.supplyUniform(name) { it.uniform.uploadInt(function.invoke(it)) } }
190+
private fun Pipeline.Builder.supplyInt(name: String, function: (UniformUploadContext) -> Int): Pipeline.Builder = this.also { this.supplyUniform(name) { it.uniform().uploadInt(function.invoke(it)) } }
191191
public inline fun <reified T> Any?.instanceOrNull(): T? = if(this is T) this else null
192192

193193
private val UniformUploadContext.isStatueMaterial: Boolean
194194
get() = statueMaterial != null
195195

196196
private val UniformUploadContext.statueMaterial: String?
197-
get() = this.instance.instanceOrNull<StatueInstance>()?.material?.takeIf { GenerationsTextureLoader.has(it) }
197+
get() = this.instance().instanceOrNull<StatueInstance>()?.material?.takeIf { GenerationsTextureLoader.has(it) }
198198

199199
private val UniformUploadContext.transform: Transform
200-
get() = this.instance.instanceOrNull<AnimatedObjectInstance>()?.getTransform(this.material.materialName)?.takeIf { !it.isUnit } ?: this.`object`().getTransform(this.instance.variant())
200+
get() = this.instance().instanceOrNull<AnimatedObjectInstance>()?.getTransform(this.material.materialName)?.takeIf { !it.isUnit } ?: this.`object`().getTransform(this.instance().variant())
201201

202202

203203
private fun UniformUploadContext.getTextureOrOther(function: (UniformUploadContext) -> String?, supplier: () -> ITexture): ITexture = GenerationsTextureLoader.getTexture(function.invoke(this))?.takeUnless { texture -> texture === GenerationsTextureLoader.MissingTextureProxy } ?: supplier.invoke()
@@ -209,7 +209,7 @@ private fun Pipeline.Builder.supplyTexture(name: String, slot: Int, function: (U
209209
it.uniform().uploadInt(slot)
210210
}
211211

212-
private fun Pipeline.Builder.supplyBooleanUniform(name: String, function: (UniformUploadContext) -> Boolean): Pipeline.Builder { return this.supplyUniform(name) { it.uniform.uploadBoolean(function.invoke(it)) } }
212+
private fun Pipeline.Builder.supplyBooleanUniform(name: String, function: (UniformUploadContext) -> Boolean): Pipeline.Builder { return this.supplyUniform(name) { it.uniform().uploadBoolean(function.invoke(it)) } }
213213

214214
fun read(manager: ResourceManager, name: ResourceLocation): String {
215215
try {

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ badPackets=8.2
2626
parchment=2024.11.17
2727

2828
WTHIT=12.5.1
29-
rareCandy=2.13.2
29+
rareCandy=2.14.0
3030

3131
recipe_viewer=rei
3232
rei=16.0.799

0 commit comments

Comments
 (0)