From ff4a00d103c077e42b424c63775ce66e09edff55 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 14 Jul 2021 15:28:29 -0400 Subject: [PATCH] Support interpolator types for object scale ups --- .../com/volmit/iris/object/IrisObject.java | 9 +++++-- .../IrisObjectPlacementScaleInterpolator.java | 24 +++++++++++++++++++ .../volmit/iris/object/IrisObjectScale.java | 6 ++++- 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/volmit/iris/object/IrisObjectPlacementScaleInterpolator.java diff --git a/src/main/java/com/volmit/iris/object/IrisObject.java b/src/main/java/com/volmit/iris/object/IrisObject.java index f996c80a2..29cc03ad9 100644 --- a/src/main/java/com/volmit/iris/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/object/IrisObject.java @@ -774,7 +774,7 @@ public class IrisObject extends IrisRegistrant { } } - public IrisObject scaled(double scale) { + public IrisObject scaled(double scale, IrisObjectPlacementScaleInterpolator interpolation) { Vector sm1 = new Vector(scale - 1, scale - 1, scale - 1); scale = Math.max(0.001, Math.min(50, scale)); if (scale < 1) { @@ -814,7 +814,12 @@ public class IrisObject extends IrisRegistrant { } if (scale > 1) { - // oo.trihermite((int) Math.round(scale)); + switch(interpolation) + { + case TRILINEAR -> oo.trilinear((int) Math.round(scale)); + case TRICUBIC -> oo.tricubic((int) Math.round(scale)); + case TRIHERMITE -> oo.trihermite((int) Math.round(scale)); + } } return oo; diff --git a/src/main/java/com/volmit/iris/object/IrisObjectPlacementScaleInterpolator.java b/src/main/java/com/volmit/iris/object/IrisObjectPlacementScaleInterpolator.java new file mode 100644 index 000000000..8bdce0de9 --- /dev/null +++ b/src/main/java/com/volmit/iris/object/IrisObjectPlacementScaleInterpolator.java @@ -0,0 +1,24 @@ +package com.volmit.iris.object; + +import com.volmit.iris.util.Desc; +import com.volmit.iris.util.DontObfuscate; + +@Desc("Use 3D Interpolation on scaled objects if they are larger than the origin.") +public enum IrisObjectPlacementScaleInterpolator +{ + @DontObfuscate + @Desc("Don't interpolate, big cubes") + NONE, + + @DontObfuscate + @Desc("Uses linear interpolation in 3 dimensions, generally pretty good, but slow") + TRILINEAR, + + @DontObfuscate + @Desc("Uses cubic spline interpolation in 3 dimensions, even better, but extreme slowdowns") + TRICUBIC, + + @DontObfuscate + @Desc("Uses hermite spline interpolation in 3 dimensions, even better, but extreme slowdowns") + TRIHERMITE +} diff --git a/src/main/java/com/volmit/iris/object/IrisObjectScale.java b/src/main/java/com/volmit/iris/object/IrisObjectScale.java index a582b5e2c..3a1115304 100644 --- a/src/main/java/com/volmit/iris/object/IrisObjectScale.java +++ b/src/main/java/com/volmit/iris/object/IrisObjectScale.java @@ -31,6 +31,10 @@ public class IrisObjectScale { @Desc("The maximum height for placement (top of object)") private double maximumScale = 1; + @DontObfuscate + @Desc("If this object is scaled up beyond its origin size, specify a 3D interpolator") + private IrisObjectPlacementScaleInterpolator interpolation = IrisObjectPlacementScaleInterpolator.NONE; + private final transient ConcurrentLinkedHashMap> cache = new ConcurrentLinkedHashMap.Builder>() .initialCapacity(64) @@ -68,7 +72,7 @@ public class IrisObjectScale { KList c = new KList<>(); for (double i = minimumScale; i < maximumScale; i += (maximumScale - minimumScale) / (double) (Math.min(variations, 32))) { - c.add(origin.scaled(i)); + c.add(origin.scaled(i, getInterpolation())); } return c;