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