Create shared state in EnhancedPlacementContext for memory efficiency

This commit is contained in:
DBotThePony 2025-03-25 11:09:47 +07:00
parent 0af5fb7301
commit bf6fec7753
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -1,5 +1,6 @@
package ru.dbotthepony.mc.otm.worldgen
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap
import net.minecraft.core.BlockPos
import net.minecraft.util.RandomSource
import net.minecraft.world.level.ChunkPos
@ -18,15 +19,32 @@ class EnhancedPlacementContext {
fun place(context: EnhancedPlacementContext, positions: List<BlockPos>, feature: EnhancedFeature.Configured<*, *>)
}
val level: WorldGenLevel
val generator: ChunkGenerator
val random: RandomSource
val origin: ChunkPos
private val placer: Placer
val vanillaContext: PlacementContext
private data class SharedState(
val level: WorldGenLevel,
val generator: ChunkGenerator,
val random: RandomSource,
val origin: ChunkPos,
val placer: Placer,
val vanillaContext: PlacementContext,
)
private var parent: EnhancedPlacementContext? = null
private val variables = HashMap<PlacementVariable<*>, KOptional<*>>()
private val state: SharedState
val level: WorldGenLevel
get() = state.level
val generator: ChunkGenerator
get() = state.generator
val random: RandomSource
get() = state.random
val origin: ChunkPos
get() = state.origin
private val placer: Placer
get() = state.placer
val vanillaContext: PlacementContext
get() = state.vanillaContext
private val parent: EnhancedPlacementContext?
private val variables = Reference2ObjectOpenHashMap<PlacementVariable<*>, KOptional<*>>(0)
private fun <T> recursiveGet(index: PlacementVariable<T>): KOptional<T>? {
return variables[index] as KOptional<T>? ?: parent?.recursiveGet(index)
@ -56,23 +74,21 @@ class EnhancedPlacementContext {
origin: ChunkPos,
placer: Placer,
) {
this.level = level
this.generator = generator
this.random = random
this.origin = origin
this.placer = placer
state = SharedState(
level = level,
generator = generator,
random = random,
origin = origin,
placer = placer,
vanillaContext = PlacementContext(level, generator, Optional.empty())
)
vanillaContext = PlacementContext(level, generator, Optional.empty())
parent = null
}
private constructor(parent: EnhancedPlacementContext) {
this.level = parent.level
this.generator = parent.generator
this.random = parent.random
this.origin = parent.origin
this.placer = parent.placer
this.state = parent.state
this.parent = parent
this.vanillaContext = parent.vanillaContext
}
fun push(): EnhancedPlacementContext {