ColorPicker -> ColorSampler

This commit is contained in:
Astrash
2022-11-25 10:17:56 +11:00
parent 64c2a41d19
commit 8670c4cdf3
17 changed files with 105 additions and 115 deletions

View File

@@ -7,28 +7,25 @@
package com.dfsek.terra.addons.biome.image;
import java.awt.image.BufferedImage;
import java.util.Optional;
import com.dfsek.terra.addons.image.converter.ColorConverter;
import com.dfsek.terra.addons.image.picker.ColorPicker;
import com.dfsek.terra.addons.image.sampler.ColorSampler;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class ImageBiomeProvider implements BiomeProvider {
private final BufferedImage image;
private final int resolution;
private final ColorConverter<Biome> colorConverter;
private final ColorPicker colorPicker;
private final ColorSampler colorSampler;
public ImageBiomeProvider(BufferedImage image, ColorConverter<Biome> colorConverter, ColorPicker colorPicker, int resolution) {
this.image = image;
public ImageBiomeProvider(ColorConverter<Biome> colorConverter, ColorSampler colorSampler, int resolution) {
this.resolution = resolution;
this.colorConverter = colorConverter;
this.colorPicker = colorPicker;
this.colorSampler = colorSampler;
}
@Override
@@ -39,7 +36,7 @@ public class ImageBiomeProvider implements BiomeProvider {
public Biome getBiome(int x, int z) {
x /= resolution;
z /= resolution;
return colorConverter.apply(colorPicker.apply(image, x, z));
return colorConverter.apply(colorSampler.apply(x, z));
}
@Override

View File

@@ -12,11 +12,9 @@ import com.dfsek.tectonic.api.config.template.annotations.Description;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.awt.image.BufferedImage;
import com.dfsek.terra.addons.biome.image.ImageBiomeProvider;
import com.dfsek.terra.addons.image.converter.ColorConverter;
import com.dfsek.terra.addons.image.picker.ColorPicker;
import com.dfsek.terra.addons.image.sampler.ColorSampler;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
@@ -30,16 +28,13 @@ public class ImageProviderTemplate implements ObjectTemplate<BiomeProvider> {
private int resolution = 1;
@Value("image")
private BufferedImage image;
@Value("mode")
private ColorPicker colorPicker;
private ColorSampler colorSampler;
@Value("biomes")
private ColorConverter<Biome> colorConverter;
@Override
public BiomeProvider get() {
return new ImageBiomeProvider(image, colorConverter, colorPicker, resolution);
return new ImageBiomeProvider(colorConverter, colorSampler, resolution);
}
}

View File

@@ -7,31 +7,27 @@
package com.dfsek.terra.addons.noise.image;
import java.awt.image.BufferedImage;
import com.dfsek.terra.addons.image.picker.ColorPicker;
import com.dfsek.terra.addons.image.sampler.ColorSampler;
import com.dfsek.terra.addons.image.util.ColorUtil.Channel;
import com.dfsek.terra.api.noise.NoiseSampler;
public class ImageSampler implements NoiseSampler {
private final BufferedImage image;
private final Channel channel;
private final double frequency;
private final ColorPicker colorPicker;
private final ColorSampler colorSampler;
public ImageSampler(BufferedImage image, ColorPicker colorPicker, Channel channel, double frequency) {
this.image = image;
public ImageSampler(ColorSampler colorSampler, Channel channel, double frequency) {
this.channel = channel;
this.frequency = frequency;
this.colorPicker = colorPicker;
this.colorSampler = colorSampler;
}
@Override
public double noise(long seed, double x, double y) {
return channel.from(colorPicker.apply(image, (int) (x * frequency), (int) (y * frequency))) / 255D * 2 - 1;
return channel.from(colorSampler.apply((int) (x * frequency), (int) (y * frequency))) / 255D * 2 - 1;
}
@Override

View File

@@ -9,9 +9,7 @@ package com.dfsek.terra.addons.noise.image.config;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import java.awt.image.BufferedImage;
import com.dfsek.terra.addons.image.picker.ColorPicker;
import com.dfsek.terra.addons.image.sampler.ColorSampler;
import com.dfsek.terra.addons.image.util.ColorUtil.Channel;
import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate;
import com.dfsek.terra.addons.noise.image.ImageSampler;
@@ -23,10 +21,7 @@ import com.dfsek.terra.api.noise.NoiseSampler;
public class ImageSamplerTemplate extends SamplerTemplate<ImageSampler> {
@Value("image")
private @Meta BufferedImage image;
@Value("mode")
private @Meta ColorPicker colorPicker;
private @Meta ColorSampler colorSampler;
@Value("frequency")
private @Meta double frequency;
@@ -36,6 +31,6 @@ public class ImageSamplerTemplate extends SamplerTemplate<ImageSampler> {
@Override
public NoiseSampler get() {
return new ImageSampler(image, colorPicker, channel, frequency);
return new ImageSampler(colorSampler, channel, frequency);
}
}

View File

@@ -6,9 +6,9 @@ import java.awt.image.BufferedImage;
import java.util.function.Supplier;
import com.dfsek.terra.addons.image.config.BufferedImageLoader;
import com.dfsek.terra.addons.image.config.picker.SingleColorPickerTemplate;
import com.dfsek.terra.addons.image.config.picker.TileColorPickerTemplate;
import com.dfsek.terra.addons.image.picker.ColorPicker;
import com.dfsek.terra.addons.image.config.sampler.SingleColorSamplerTemplate;
import com.dfsek.terra.addons.image.config.sampler.TileColorSamplerTemplate;
import com.dfsek.terra.addons.image.sampler.ColorSampler;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon;
@@ -21,7 +21,7 @@ import com.dfsek.terra.api.util.reflection.TypeKey;
public class ImageLibraryAddon implements AddonInitializer {
public static final TypeKey<Supplier<ObjectTemplate<ColorPicker>>> COLOR_PICKER_REGISTRY_KEY = new TypeKey<>() {
public static final TypeKey<Supplier<ObjectTemplate<ColorSampler>>> COLOR_PICKER_REGISTRY_KEY = new TypeKey<>() {
};
@Inject
@@ -40,10 +40,10 @@ public class ImageLibraryAddon implements AddonInitializer {
event.getPack().applyLoader(BufferedImage.class, new BufferedImageLoader(event.getPack().getLoader()));
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<ColorPicker>>> colorPickerRegistry = event.getPack().getOrCreateRegistry(
CheckedRegistry<Supplier<ObjectTemplate<ColorSampler>>> colorSamplerRegistry = event.getPack().getOrCreateRegistry(
COLOR_PICKER_REGISTRY_KEY);
colorPickerRegistry.register(addon.key("SINGLE"), SingleColorPickerTemplate::new);
colorPickerRegistry.register(addon.key("TILED"), TileColorPickerTemplate::new);
colorSamplerRegistry.register(addon.key("SINGLE"), SingleColorSamplerTemplate::new);
colorSamplerRegistry.register(addon.key("TILED"), TileColorSamplerTemplate::new);
});
}
}

View File

@@ -1,17 +0,0 @@
package com.dfsek.terra.addons.image.config.picker;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.image.picker.ColorPicker;
import com.dfsek.terra.addons.image.picker.transform.Alignment;
public abstract class ColorPickerTemplate implements ObjectTemplate<ColorPicker> {
@Value("align")
@Default
protected Alignment alignment = Alignment.NONE;
}

View File

@@ -1,18 +0,0 @@
package com.dfsek.terra.addons.image.config.picker;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.image.picker.ColorPicker;
import com.dfsek.terra.addons.image.picker.SimpleColorPicker;
public class SingleColorPickerTemplate extends ColorPickerTemplate {
@Value("fallback")
private int fallback;
@Override
public ColorPicker get() {
return new SimpleColorPicker(fallback, alignment);
}
}

View File

@@ -1,13 +0,0 @@
package com.dfsek.terra.addons.image.config.picker;
import com.dfsek.terra.addons.image.picker.ColorPicker;
import com.dfsek.terra.addons.image.picker.TileColorPicker;
public class TileColorPickerTemplate extends ColorPickerTemplate {
@Override
public ColorPicker get() {
return new TileColorPicker(alignment);
}
}

View File

@@ -0,0 +1,22 @@
package com.dfsek.terra.addons.image.config.sampler;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.awt.image.BufferedImage;
import com.dfsek.terra.addons.image.sampler.ColorSampler;
import com.dfsek.terra.addons.image.sampler.transform.Alignment;
public abstract class ColorSamplerTemplate implements ObjectTemplate<ColorSampler> {
@Value("path")
protected BufferedImage image;
@Value("align")
@Default
protected Alignment alignment = Alignment.NONE;
}

View File

@@ -0,0 +1,17 @@
package com.dfsek.terra.addons.image.config.sampler;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.image.sampler.ColorSampler;
import com.dfsek.terra.addons.image.sampler.SimpleColorSampler;
public class SingleColorSamplerTemplate extends ColorSamplerTemplate {
@Value("fallback")
private int fallback;
@Override
public ColorSampler get() {
return new SimpleColorSampler(image, fallback, alignment);
}
}

View File

@@ -0,0 +1,13 @@
package com.dfsek.terra.addons.image.config.sampler;
import com.dfsek.terra.addons.image.sampler.ColorSampler;
import com.dfsek.terra.addons.image.sampler.TileColorSampler;
public class TileColorSamplerTemplate extends ColorSamplerTemplate {
@Override
public ColorSampler get() {
return new TileColorSampler(image, alignment);
}
}

View File

@@ -1,15 +0,0 @@
package com.dfsek.terra.addons.image.picker;
import java.awt.image.BufferedImage;
@FunctionalInterface
public interface ColorPicker {
/**
* @param image Lookup image
* @param x World x coordinate
* @param z World z coordinate
* @return Integer representing a web color
*/
Integer apply(BufferedImage image, int x, int z);
}

View File

@@ -0,0 +1,12 @@
package com.dfsek.terra.addons.image.sampler;
@FunctionalInterface
public interface ColorSampler {
/**
* @param x World x coordinate
* @param z World z coordinate
* @return Integer representing a web color
*/
Integer apply(int x, int z);
}

View File

@@ -1,23 +1,26 @@
package com.dfsek.terra.addons.image.picker;
package com.dfsek.terra.addons.image.sampler;
import java.awt.image.BufferedImage;
import com.dfsek.terra.addons.image.picker.transform.ImageTransformation;
import com.dfsek.terra.addons.image.sampler.transform.ImageTransformation;
public class SimpleColorPicker implements ColorPicker {
public class SimpleColorSampler implements ColorSampler {
private final BufferedImage image;
private final Integer fallback;
private final ImageTransformation transformation;
public SimpleColorPicker(int fallbackColor, ImageTransformation transformation) {
public SimpleColorSampler(BufferedImage image, int fallbackColor, ImageTransformation transformation) {
this.image = image;
this.fallback = fallbackColor;
this.transformation = transformation;
}
@Override
public Integer apply(BufferedImage image, int x, int z) {
public Integer apply(int x, int z) {
x = transformation.transformX(image, x);
z = transformation.transformZ(image, z);
if(x < 0 || z < 0 || x >= image.getWidth() || z >= image.getHeight()) return fallback;

View File

@@ -1,22 +1,25 @@
package com.dfsek.terra.addons.image.picker;
package com.dfsek.terra.addons.image.sampler;
import net.jafama.FastMath;
import java.awt.image.BufferedImage;
import com.dfsek.terra.addons.image.picker.transform.ImageTransformation;
import com.dfsek.terra.addons.image.sampler.transform.ImageTransformation;
public class TileColorPicker implements ColorPicker {
public class TileColorSampler implements ColorSampler {
private final BufferedImage image;
private final ImageTransformation transformation;
public TileColorPicker(ImageTransformation transformation) {
public TileColorSampler(BufferedImage image, ImageTransformation transformation) {
this.image = image;
this.transformation = transformation;
}
@Override
public Integer apply(BufferedImage image, int x, int z) {
public Integer apply(int x, int z) {
x = transformation.transformX(image, x);
z = transformation.transformZ(image, z);
return image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.floorMod(z, image.getHeight()));

View File

@@ -1,4 +1,4 @@
package com.dfsek.terra.addons.image.picker.transform;
package com.dfsek.terra.addons.image.sampler.transform;
import java.awt.image.BufferedImage;

View File

@@ -1,4 +1,4 @@
package com.dfsek.terra.addons.image.picker.transform;
package com.dfsek.terra.addons.image.sampler.transform;
import java.awt.image.BufferedImage;