diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java index 40a35fc70..31bb32ac4 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java @@ -5,6 +5,8 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import java.util.function.Supplier; import com.dfsek.terra.addons.image.config.ImageLoader; +import com.dfsek.terra.addons.image.config.sampler.RotateColorSamplerTemplate; +import com.dfsek.terra.addons.image.config.sampler.ConstantColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.SingleColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.TileColorSamplerTemplate; import com.dfsek.terra.addons.image.image.Image; @@ -44,6 +46,8 @@ public class ImageLibraryAddon implements AddonInitializer { COLOR_PICKER_REGISTRY_KEY); colorSamplerRegistry.register(addon.key("SINGLE"), SingleColorSamplerTemplate::new); colorSamplerRegistry.register(addon.key("TILED"), TileColorSamplerTemplate::new); + colorSamplerRegistry.register(addon.key("COLOR"), ConstantColorSamplerTemplate::new); + colorSamplerRegistry.register(addon.key("ROTATE"), RotateColorSamplerTemplate::new); }); } } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ConstantColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ConstantColorSamplerTemplate.java new file mode 100644 index 000000000..2e3269daf --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ConstantColorSamplerTemplate.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.image.config.sampler; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.image.sampler.ColorSampler; + + +public class ConstantColorSamplerTemplate implements ObjectTemplate { + + @Value("color") + private int color; + + @Override + public ColorSampler get() { + return ((x, z) -> color); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/RotateColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/RotateColorSamplerTemplate.java new file mode 100644 index 000000000..b7fcc4dc4 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/RotateColorSamplerTemplate.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.addons.image.config.sampler; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.jafama.FastMath; + +import com.dfsek.terra.addons.image.sampler.ColorSampler; +import com.dfsek.terra.addons.image.sampler.RotateColorSampler; + + +public class RotateColorSamplerTemplate implements ObjectTemplate { + + @Value("image") + private ColorSampler sampler; + + @Value("angle") + private double angle; + + @Override + public ColorSampler get() { + return new RotateColorSampler(sampler, FastMath.toRadians(angle)); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/RotateColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/RotateColorSampler.java new file mode 100644 index 000000000..f7e511617 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/RotateColorSampler.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.addons.image.sampler; + +import net.jafama.FastMath; + + +public class RotateColorSampler implements ColorSampler { + + private final ColorSampler sampler; + + private final double radians; + + public RotateColorSampler(ColorSampler sampler, double radians) { + this.sampler = sampler; + this.radians = radians; + } + + @Override + public Integer apply(int x, int z) { + return sampler.apply( + (int) (x * FastMath.cos(radians) - z * FastMath.sin(radians)), + (int) (z * FastMath.cos(radians) + x * FastMath.sin(radians)) + ); + } +}