Create shared state in EnhancedPlacementContext for memory efficiency
This commit is contained in:
parent
0af5fb7301
commit
bf6fec7753
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user