Skip to content

Commit 6e87421

Browse files
committed
Pushing what i have 3.1.0 rare candy stuff.
1 parent 9524b51 commit 6e87421

17 files changed

Lines changed: 281 additions & 176 deletions

File tree

common/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ dependencies {
1717

1818
// modImplementation(group = "earth.terrarium.common_storage_lib", name = "common-storage-lib-common-1.21.1", version = "0.0.7")
1919

20-
implementation(files("../libs/RareCandy-3.0.0.jar"))
20+
implementation(files("../libs/RareCandy-3.1.0.jar"))
2121

2222
// implementation("gg.generations:RareCandy:${project.properties["rareCandy"]}"){isTransitive = false}
2323

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

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ object GenerationsCoreClient {
124124
fun onInitialize(implementation: GenerationsCoreClientImplementation) {
125125
// if (GenerationsCore.CONFIG.client.useRenderDoc) {
126126
// try {
127-
// System.loadLibrary("renderdoc")
127+
System.loadLibrary("renderdoc")
128128
// } catch (e: UnsatisfiedLinkError) {
129129
// LOGGER.warn("Attempted to use renderdoc without renderdoc installed.")
130130
// }
@@ -162,7 +162,7 @@ object GenerationsCoreClient {
162162

163163

164164
fun setupClient(event: Minecraft) {
165-
165+
Pipelines.onInitialize(event.resourceManager)
166166
event.tell({
167167
val renderer = TimeCapsuleItemRender()
168168

@@ -177,9 +177,6 @@ object GenerationsCoreClient {
177177
addWoodType(GenerationsWoodTypes.ULTRA_DARK)
178178
addWoodType(GenerationsWoodTypes.GHOST)
179179

180-
Pipelines.onInitialize(event.resourceManager)
181-
182-
183180

184181
registerScreens()
185182
})
@@ -554,6 +551,8 @@ object GenerationsCoreClient {
554551
}
555552

556553
fun secondRenderPass() {
554+
if(!Pipelines.initialized) return
555+
557556
// renderHighlightedPath(stack, Minecraft.getInstance().levelRenderer.ticks, camera)
558557

559558
RenderStateRecord.push()
@@ -563,13 +562,11 @@ object GenerationsCoreClient {
563562
renderRareCandyTransparent()
564563
RenderStateRecord.pop()
565564

566-
ModelRegistry.worldRareCandy.end()
567-
568-
ModelRegistry.tick()
565+
ModelRegistry.tick(MinecraftClientGameProvider.getTimePassed())
569566
}
570567

571568
fun firstRenderPass() {
572-
ModelRegistry.worldRareCandy.update(MinecraftClientGameProvider.getTimePassed())
569+
if(!Pipelines.initialized) return
573570

574571
MatrixCache.projectionMatrix = RenderSystem.getProjectionMatrix()
575572
MatrixCache.viewMatrix = RenderSystem.getModelViewMatrix()
@@ -598,7 +595,7 @@ object GenerationsCoreClient {
598595
RenderSystem.enableDepthTest()
599596
BufferUploader.reset()
600597

601-
ModelRegistry.worldRareCandy.render(stage)
598+
ModelRegistry.render(stage)
602599
if (shouldRenderFpsPie()) LOGGER.warn("RareCandy render took " + (System.currentTimeMillis() - startTime) + "ms")
603600
}
604601
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ object GenerationsTextureLoader : ITextureLoader() {
8181
}
8282
}
8383

84+
override fun contains(p0: String?): Boolean = REGULAR.containsKey(p0)
8485

8586
override fun getTexture(s: String?): ITexture {
8687
val texture = REGULAR.getOrDefault(s, null)?.let { Minecraft.getInstance().textureManager.getTexture(it, null) }.takeIf { it is ITextureWithResourceLocation } ?: return MissingTextureProxy

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import gg.generations.rarecandy.renderer.animation.AnimationInstance
66
import gg.generations.rarecandy.renderer.animation.Transform
77
import gg.generations.rarecandy.renderer.storage.AnimatedObjectInstance
88
import gg.generations.rarecandy.renderer.storage.SSBOBuffer
9+
import net.minecraft.util.FastColor.ABGR32
910
import org.joml.Matrix4f
1011
import org.joml.Vector3f
1112
import org.lwjgl.system.MemoryUtil
@@ -22,13 +23,14 @@ open class CobblemonInstance(var light: Int = 0, var overlay: Int = 0, var tint:
2223
override fun update(instanceBuffer: SSBOBuffer) {
2324
super.update(instanceBuffer)
2425

25-
instanceBuffer.put(tint)
26+
instanceBuffer.putRgba(tint)
2627
instanceBuffer.put(teraTint.x)
2728
instanceBuffer.put(teraTint.y)
2829
instanceBuffer.put(teraTint.z)
2930
instanceBuffer.put(if (teraActive) 1 else 0) // uint teraActive
30-
instanceBuffer.put(light)
31-
instanceBuffer.put(overlay)
31+
32+
instanceBuffer.putPackedUv(light)
33+
instanceBuffer.putPackedUv(overlay)
3234
}
3335

3436
override fun changeAnimation(newAnimation: AnimationInstance?) = Unit
@@ -58,4 +60,13 @@ open class CobblemonInstance(var light: Int = 0, var overlay: Int = 0, var tint:
5860
}
5961
}
6062
}
63+
}
64+
65+
fun SSBOBuffer.putRgba(color: Int) {
66+
this.put(ABGR32.fromArgb32(color))
67+
}
68+
69+
fun SSBOBuffer.putPackedUv(uv: Int) {
70+
this.put((uv and '\uffff'.code).toShort())
71+
this.put((uv shr 16 and '\uffff'.code).toShort())
6172
}

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

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package generations.gg.generations.core.generationscore.common.client.render.rarecandy
22

33
import generations.gg.generations.core.generationscore.common.GenerationsCore
4-
import generations.gg.generations.core.generationscore.common.client.GenerationsCoreClient
5-
import generations.gg.generations.core.generationscore.common.client.render.rarecandy.ModelRegistry.worldRareCandy
64
import generations.gg.generations.core.generationscore.common.client.render.rarecandy.loading.GenerationsModelLoader
75
import generations.gg.generations.core.generationscore.common.util.TaskQueue
6+
import gg.generations.rarecandy.pokeutils.reader.ITextureLoader
87
import gg.generations.rarecandy.renderer.animation.Animation
98
import gg.generations.rarecandy.renderer.components.MultiRenderObject
109
import gg.generations.rarecandy.renderer.rendering.ObjectInstance
11-
import gg.generations.rarecandy.renderer.rendering.RareCandy
10+
import gg.generations.rarecandy.renderer.rendering.RenderStage
1211
import net.minecraft.client.Minecraft
1312
import net.minecraft.resources.ResourceLocation
1413
import net.minecraft.server.packs.resources.Resource
@@ -18,43 +17,41 @@ import net.minecraft.server.packs.resources.Resource
1817
*/
1918
class CompiledModel(
2019
val name: ResourceLocation,
21-
stream: Resource?
20+
stream: Resource
2221
) {
22+
val empty: Boolean
23+
get() = renderObject?.isEmpty ?: false
24+
2325
@JvmField
2426
var renderObject: MultiRenderObject? = null
25-
val map: List<String> = ArrayList()
2627

2728
@JvmField
2829
var guiInstance: CobblemonInstance? = null
2930

3031
init {
31-
RareCandy.runLater {
32-
if(GenerationsCore.CONFIG.client.logModelLoading) GenerationsCore.LOGGER.info("Loading PK: $name")
32+
ModelRegistry.runLater {
33+
/*if(GenerationsCore.CONFIG.client.logModelLoading) */GenerationsCore.LOGGER.info("Loading PK: $name")
3334
renderObject = GenerationsModelLoader.compiledModelMethod(this, stream?.open(), name.toString())
3435
}
3536
}
3637

3738
fun render(instance: ObjectInstance) {
3839
if (renderObject == null) return
39-
// if (!renderObject!!.isReady) return
40-
41-
// if(GenerationsCore.CONFIG.client.useVanilla) {
42-
// renderVanilla(instance, source)
43-
// } else {
44-
renderRareCandy(instance, ModelRegistry.worldRareCandy)
45-
// }
46-
}
4740

48-
private fun renderRareCandy(instance: ObjectInstance, renderer: RareCandy) {
4941
renderObject?.run {
50-
renderer.add(this, instance)
42+
this.add(instance)
5143
instance.use()
5244
}
5345
}
5446

5547
fun delete() {
5648
if(GenerationsCore.CONFIG.client.logModelLoading) println("Deleting GPU Resources for: $name")
57-
renderObject?.close()
49+
renderObject?.run {
50+
this.close()
51+
this.imageNameToId.keys.forEach {
52+
ITextureLoader.instance().remove(it)
53+
}
54+
}
5855
}
5956

6057
fun getVariantId(variant: String?): Int {
@@ -67,6 +64,14 @@ class CompiledModel(
6764
return model.animationNameToId[animation]?.let { model.animations[it] }
6865
}
6966

67+
fun render(stage: RenderStage) {
68+
renderObject?.render(stage)
69+
}
70+
71+
fun update(time: Double) {
72+
renderObject?.update(time)
73+
}
74+
7075
companion object {
7176
val queue = TaskQueue()
7277

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

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,22 @@ import com.mojang.blaze3d.pipeline.RenderCall
44
import com.mojang.blaze3d.systems.RenderSystem
55
import com.mojang.blaze3d.vertex.PoseStack
66
import com.mojang.math.Axis
7-
import generations.gg.generations.core.generationscore.common.GenerationsCore
87
import generations.gg.generations.core.generationscore.common.client.model.ModelContextProviders
98
import generations.gg.generations.core.generationscore.common.client.model.ModelContextProviders.AngleProvider
109
import generations.gg.generations.core.generationscore.common.client.render.rarecandy.CompiledModel.Companion.of
1110
import generations.gg.generations.core.generationscore.common.world.level.block.entities.ModelProvidingBlockEntity
1211
import generations.gg.generations.core.generationscore.common.world.level.block.generic.GenericRotatableModelBlock
13-
import gg.generations.rarecandy.renderer.animation.Animation
1412
import gg.generations.rarecandy.renderer.rendering.RareCandy
15-
import gg.generations.rarecandy.shaded.caffeine.cache.CacheLoader
16-
import gg.generations.rarecandy.shaded.caffeine.cache.Caffeine
17-
import gg.generations.rarecandy.shaded.caffeine.cache.RemovalCause
18-
import net.minecraft.client.Minecraft
13+
import gg.generations.rarecandy.renderer.rendering.RenderStage
1914
import net.minecraft.core.Direction
2015
import net.minecraft.resources.ResourceLocation
21-
import java.util.concurrent.TimeUnit
22-
import java.util.function.BiConsumer
16+
import java.util.concurrent.ConcurrentLinkedQueue
2317

2418
object ModelRegistry {
25-
private val modelsToLoad: MutableList<ResourceLocation> = mutableListOf()
26-
27-
private val CACHE = mutableMapOf<ResourceLocation, CompiledModel>()
28-
private val TIMES = mutableMapOf<ResourceLocation, Double>()
19+
val TASKS = ConcurrentLinkedQueue<Runnable>()
20+
private val modelsToLoad = mutableListOf<ResourceLocation>()
21+
private val models = mutableMapOf<ResourceLocation, CompiledModel>()
22+
private val modelsToUnload = mutableListOf<ResourceLocation>()
2923

3024
@JvmStatic
3125
operator fun get(modelProvider: ModelContextProviders.ModelProvider): CompiledModel? {
@@ -34,10 +28,15 @@ object ModelRegistry {
3428

3529
@JvmStatic
3630
fun clear() {
37-
ensureOnRenderThread {
38-
CACHE.forEach { (_, value) -> value.delete() }
31+
runLater {
32+
modelsToUnload.clear()
33+
modelsToLoad.clear()
34+
35+
for(model in models.values) {
36+
model.delete()
37+
}
3938

40-
CACHE.clear()
39+
models.clear()
4140
}
4241
}
4342

@@ -49,26 +48,38 @@ object ModelRegistry {
4948
}
5049
}
5150

52-
fun tick() {
53-
ensureOnRenderThread {
54-
val time = MinecraftClientGameProvider.getTimePassed();
51+
fun tick(time: Double) {
52+
var task = TASKS.poll()
53+
while (task != null) {
54+
task.run()
55+
task = TASKS.poll()
56+
}
5557

56-
modelsToLoad.forEach {
57-
CACHE[it] = of(it);
58-
TIMES[it] = time
59-
}
58+
for ((key, model) in models) {
59+
model.update(time)
60+
model.takeIf({ it.empty })?.run { modelsToUnload.add(key) }
61+
}
6062

61-
modelsToLoad.clear()
63+
if(modelsToLoad.isEmpty() and modelsToUnload.isEmpty()) return
64+
65+
ensureOnRenderThread {
66+
if(modelsToLoad.isNotEmpty()) {
67+
for (key in modelsToLoad) {
68+
models[key] = of(key);
69+
}
70+
modelsToLoad.clear()
71+
}
6272

63-
val keys = TIMES.filter { time - it.value >= 5.0 }.map { it.key }
73+
if(modelsToLoad.isNotEmpty()) {
74+
for (key in modelsToUnload) {
75+
models[key]?.also {
76+
it.delete()
6477

65-
for(key in keys) {
66-
CACHE[key]?.also {
67-
it.delete()
78+
}
79+
models.remove(key)
6880
}
6981

70-
CACHE.remove(key)
71-
TIMES.remove(key)
82+
modelsToUnload.clear()
7283
}
7384
}
7485
}
@@ -78,7 +89,7 @@ object ModelRegistry {
7889
return try {
7990
if(modelsToLoad.contains(location)) null;
8091
else {
81-
CACHE[location]?.also { TIMES[location] = MinecraftClientGameProvider.getTimePassed() } ?: run { modelsToLoad += location }.let { null }
92+
models[location] ?: run { modelsToLoad += location }.let { null }
8293
}
8394
} catch (e: Exception) {
8495
null
@@ -90,6 +101,12 @@ object ModelRegistry {
90101
CompiledModel.init()
91102
}
92103

104+
fun render(stage: RenderStage) {
105+
models.values.forEach {
106+
it.render(stage)
107+
}
108+
}
109+
93110
fun prepForBER(stack: PoseStack, supplier: AngleProvider) {
94111
stack.translate(0.5f, 0.0f, 0.5f)
95112
if (supplier is ModelProvidingBlockEntity) {
@@ -117,10 +134,8 @@ object ModelRegistry {
117134
}
118135
}
119136

120-
@JvmStatic
121-
val worldRareCandy: RareCandy = RareCandy().also {
122-
Animation.animationModifier = BiConsumer { animation: Animation, s: String ->
123-
if (s == "gfb") animation.ticksPerSecond = 60000f // 60 fps. 1000 ticks per frame?
124-
}
137+
fun runLater(runnable: Runnable) {
138+
TASKS += runnable
125139
}
140+
126141
}

0 commit comments

Comments
 (0)