Skip to content

Commit

Permalink
change: create clean cache when generating biomes (#195)
Browse files Browse the repository at this point in the history
  • Loading branch information
ishland authored Jan 4, 2025
1 parent bada38d commit b20b77e
Show file tree
Hide file tree
Showing 8 changed files with 103 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,28 +17,36 @@
*/
package terrablender.mixin;

import com.mojang.datafixers.util.Either;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.core.QuartPos;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.Climate;
import net.minecraft.world.level.biome.MultiNoiseBiomeSource;
import net.minecraft.world.level.biome.MultiNoiseBiomeSourceParameterList;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import terrablender.worldgen.IExtendedMultiNoiseBiomeSource;
import terrablender.worldgen.IExtendedParameterList;

import java.util.List;

@Mixin(MultiNoiseBiomeSource.class)
public abstract class MixinMultiNoiseBiomeSource
public abstract class MixinMultiNoiseBiomeSource implements IExtendedMultiNoiseBiomeSource
{
@Shadow
public abstract Climate.ParameterList<Holder<Biome>> parameters();

@Shadow @Final @Mutable
private Either<Climate.ParameterList<Holder<Biome>>, Holder<MultiNoiseBiomeSourceParameterList>> parameters;

@Inject(method="getNoiseBiome(IIILnet/minecraft/world/level/biome/Climate$Sampler;)Lnet/minecraft/core/Holder;", at=@At("HEAD"), cancellable = true)
public void getNoiseBiome(int x, int y, int z, Climate.Sampler sampler, CallbackInfoReturnable<Holder<Biome>> cir)
{
Expand All @@ -53,4 +61,15 @@ public void addDebugInfo(List<String> debugLines, BlockPos pos, Climate.Sampler
IExtendedParameterList<Holder<Biome>> extension = (IExtendedParameterList<Holder<Biome>>) this.parameters();
if (extension.isInitialized()) debugLines.add("Region: " + extension.getRegion(extension.getUniqueness(qx, 0, qz)).getName().toString());
}

@Override
public MultiNoiseBiomeSource clone() {
try {
MultiNoiseBiomeSource cloned = (MultiNoiseBiomeSource) super.clone();
((MixinMultiNoiseBiomeSource) (Object) cloned).parameters = Either.left(((IExtendedParameterList<Holder<Biome>>) this.parameters()).clone());
return cloned;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package terrablender.mixin;

import net.minecraft.world.level.biome.BiomeResolver;
import net.minecraft.world.level.biome.MultiNoiseBiomeSource;
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;
import terrablender.worldgen.IExtendedMultiNoiseBiomeSource;

@Mixin(NoiseBasedChunkGenerator.class)
public class MixinNoiseBasedChunkGenerator {

@ModifyArg(method = "doCreateBiomes", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/chunk/ChunkAccess;fillBiomesFromNoise(Lnet/minecraft/world/level/biome/BiomeResolver;Lnet/minecraft/world/level/biome/Climate$Sampler;)V"))
private BiomeResolver modifyBiomeSource(BiomeResolver biomeResolver) {
if (biomeResolver instanceof MultiNoiseBiomeSource multiNoiseBiomeSource) {
return ((IExtendedMultiNoiseBiomeSource) multiNoiseBiomeSource).clone();
} else {
return biomeResolver;
}
}

}
18 changes: 17 additions & 1 deletion Common/src/main/java/terrablender/mixin/MixinParameterList.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,12 @@
import terrablender.worldgen.IExtendedParameterList;
import terrablender.worldgen.RegionUtils.SearchTreeEntry;
import terrablender.worldgen.noise.Area;
import terrablender.worldgen.noise.InitialLayer;
import terrablender.worldgen.noise.LayeredNoiseUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

@Mixin(Climate.ParameterList.class)
public abstract class MixinParameterList<T> implements IExtendedParameterList<T>
Expand All @@ -50,6 +52,7 @@ public abstract class MixinParameterList<T> implements IExtendedParameterList<T>

private boolean initialized = false;
private boolean treesPopulated = false;
private Supplier<Area> newUniqueness;
private Area uniqueness;
private SearchTreeEntry[] uniqueTrees;

Expand All @@ -60,7 +63,9 @@ public void initializeForTerraBlender(RegistryAccess registryAccess, RegionType
if (this.initialized)
return;

this.uniqueness = LayeredNoiseUtil.uniqueness(registryAccess, regionType, seed);
InitialLayer initialLayer = LayeredNoiseUtil.initialUniqueness(registryAccess, regionType);
this.newUniqueness = () -> LayeredNoiseUtil.finalUniqueness(regionType, seed, initialLayer);
this.uniqueness = this.newUniqueness.get();
this.uniqueTrees = new SearchTreeEntry[Regions.getCount(regionType)];

Registry<Biome> biomeRegistry = registryAccess.lookupOrThrow(Registries.BIOME);
Expand Down Expand Up @@ -142,4 +147,15 @@ public T findValuePositional(Climate.TargetPoint target, int x, int y, int z)
else
return (T)biome;
}

@Override
public Climate.ParameterList<T> clone() {
try {
Climate.ParameterList<T> cloned = (Climate.ParameterList<T>) super.clone();
((MixinParameterList<T>) (Object) cloned).uniqueness = ((MixinParameterList<T>) (Object) cloned).newUniqueness.get();
return cloned;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package terrablender.mixin;

import com.mojang.datafixers.util.Either;
import net.minecraft.core.Holder;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.Climate;
import net.minecraft.world.level.biome.MultiNoiseBiomeSource;
import net.minecraft.world.level.biome.MultiNoiseBiomeSourceParameterList;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(MultiNoiseBiomeSource.class)
public interface MultiNoiseBiomeSourceAccess {

@Mutable
@Accessor
void setParameters(Either<Climate.ParameterList<Holder<Biome>>, Holder<MultiNoiseBiomeSourceParameterList>> parameters);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package terrablender.worldgen;

import net.minecraft.world.level.biome.MultiNoiseBiomeSource;

public interface IExtendedMultiNoiseBiomeSource extends Cloneable {

MultiNoiseBiomeSource clone();

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import terrablender.api.Region;
import terrablender.api.RegionType;

public interface IExtendedParameterList<T>
public interface IExtendedParameterList<T> extends Cloneable
{
void initializeForTerraBlender(RegistryAccess registryAccess, RegionType regionType, long seed);
T findValuePositional(Climate.TargetPoint target, int x, int y, int z);
Expand All @@ -31,4 +31,5 @@ public interface IExtendedParameterList<T>
Region getRegion(int uniqueness);
int getTreeCount();
boolean isInitialized();
Climate.ParameterList<T> clone();
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,20 @@ public class LayeredNoiseUtil
{
public static Area uniqueness(RegistryAccess registryAccess, RegionType regionType, long seed)
{
return finalUniqueness(regionType, seed, initialUniqueness(registryAccess, regionType));
}

public static InitialLayer initialUniqueness(RegistryAccess registryAccess, RegionType regionType) {
return new InitialLayer(registryAccess, regionType);
}

public static Area finalUniqueness(RegionType regionType, long seed, InitialLayer initialLayer) {
int numZooms = TerraBlender.CONFIG.overworldRegionSize;

if (regionType == RegionType.NETHER)
numZooms = TerraBlender.CONFIG.netherRegionSize;

return createZoomedArea(seed, numZooms, new InitialLayer(registryAccess, regionType));
return createZoomedArea(seed, numZooms, initialLayer);
}

public static Area biomeArea(RegistryAccess registryAccess, long seed, int size, List<WeightedEntry.Wrapper<ResourceKey<Biome>>> entries)
Expand Down
4 changes: 3 additions & 1 deletion Common/src/main/resources/terrablender.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@
"MixinBuiltInRegistries",
"MixinChunkGenerator",
"MixinMultiNoiseBiomeSource",
"MixinNoiseBasedChunkGenerator",
"MixinNoiseGeneratorSettings",
"MixinParameterList",
"MixinPrimaryLevelData",
"MixinTheEndBiomeSource"
"MixinTheEndBiomeSource",
"MultiNoiseBiomeSourceAccess"
],
"client": [
"MixinWorldOpenFlows"
Expand Down

0 comments on commit b20b77e

Please sign in to comment.