From 3ab671827d3b972be31e1589c91c9a26c80acbe9 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 7 Feb 2023 10:55:17 +1100 Subject: [PATCH] Re-add old image sampler to config-noise-function w/ deprecation notice --- .../dfsek/terra/addons/noise/NoiseAddon.java | 5 +- .../templates/ImageSamplerTemplate.java | 47 ++++++++++++ .../addons/noise/samplers/ImageSampler.java | 75 +++++++++++++++++++ 3 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java index 5f634d112..86743f2cc 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java @@ -18,6 +18,7 @@ import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.noise.config.templates.BinaryArithmeticTemplate; import com.dfsek.terra.addons.noise.config.templates.DomainWarpTemplate; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; +import com.dfsek.terra.addons.noise.config.templates.ImageSamplerTemplate; import com.dfsek.terra.addons.noise.config.templates.KernelTemplate; import com.dfsek.terra.addons.noise.config.templates.LinearHeightmapSamplerTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.CellularNoiseTemplate; @@ -91,7 +92,9 @@ public class NoiseAddon implements AddonInitializer { noiseRegistry.register(addon.key("PROBABILITY"), ProbabilityNormalizerTemplate::new); noiseRegistry.register(addon.key("SCALE"), ScaleNormalizerTemplate::new); noiseRegistry.register(addon.key("POSTERIZATION"), PosterizationNormalizerTemplate::new); - + + noiseRegistry.register(addon.key("IMAGE"), ImageSamplerTemplate::new); + noiseRegistry.register(addon.key("DOMAIN_WARP"), DomainWarpTemplate::new); noiseRegistry.register(addon.key("FBM"), BrownianMotionTemplate::new); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java new file mode 100644 index 000000000..bbccae810 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/ImageSamplerTemplate.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra Core Addons are licensed under the terms of the MIT License. For more details, + * reference the LICENSE file in this module's root directory. + */ + +package com.dfsek.terra.addons.noise.config.templates; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.awt.image.BufferedImage; + +import com.dfsek.terra.addons.noise.samplers.ImageSampler; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.noise.NoiseSampler; + + +@SuppressWarnings({ "unused", "FieldMayBeFinal" }) +public class ImageSamplerTemplate extends SamplerTemplate { + + private static final Logger logger = LoggerFactory.getLogger(ImageSamplerTemplate.class); + + private static boolean used = false; + + @Value("image") + private @Meta BufferedImage image; + + @Value("frequency") + private @Meta double frequency; + + @Value("channel") + private ImageSampler.@Meta Channel channel; + + @Override + public NoiseSampler get() { + if(!used) { + logger.warn("The IMAGE NoiseSampler implemented by the config-noise-function addon is deprecated. " + + "It is recommended to use the IMAGE NoiseSampler implemented by the config-noise-image " + + "addon instead."); + used = true; + } + return new ImageSampler(image, channel, frequency); + } +} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java new file mode 100644 index 000000000..5016d7954 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra Core Addons are licensed under the terms of the MIT License. For more details, + * reference the LICENSE file in this module's root directory. + */ + +package com.dfsek.terra.addons.noise.samplers; + +import net.jafama.FastMath; + +import java.awt.image.BufferedImage; + +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class ImageSampler implements NoiseSampler { + private final BufferedImage image; + private final Channel channel; + + private final double frequency; + + public ImageSampler(BufferedImage image, Channel channel, double frequency) { + this.image = image; + this.channel = channel; + this.frequency = frequency; + } + + @Override + public double noise(long seed, double x, double y) { + return ((channel.getChannel(image.getRGB(FastMath.floorMod(FastMath.floorToInt(x * frequency), image.getWidth()), + FastMath.floorMod(FastMath.floorToInt(y * frequency), image.getHeight()))) / 255D) - 0.5) * + 2; + } + + @Override + public double noise(long seed, double x, double y, double z) { + return noise(seed, x, y); + } + + public enum Channel { + RED { + @Override + public int getChannel(int mashed) { + return (mashed >> 16) & 0xff; + } + }, + GREEN { + @Override + public int getChannel(int mashed) { + return (mashed >> 8) & 0xff; + } + }, + BLUE { + @Override + public int getChannel(int mashed) { + return mashed & 0xff; + } + }, + GRAYSCALE { + @Override + public int getChannel(int mashed) { + return (RED.getChannel(mashed) + GREEN.getChannel(mashed) + BLUE.getChannel(mashed)) / 3; + } + }, + ALPHA { + @Override + public int getChannel(int mashed) { + return (mashed >> 24) & 0xff; + } + }; + + public abstract int getChannel(int mashed); + } +}