Support interpolator types for object scale ups

This commit is contained in:
Daniel Mills 2021-07-14 15:28:29 -04:00
parent dbdf8a97ae
commit ff4a00d103
3 changed files with 36 additions and 3 deletions

View File

@ -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); Vector sm1 = new Vector(scale - 1, scale - 1, scale - 1);
scale = Math.max(0.001, Math.min(50, scale)); scale = Math.max(0.001, Math.min(50, scale));
if (scale < 1) { if (scale < 1) {
@ -814,7 +814,12 @@ public class IrisObject extends IrisRegistrant {
} }
if (scale > 1) { 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; return oo;

View File

@ -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
}

View File

@ -31,6 +31,10 @@ public class IrisObjectScale {
@Desc("The maximum height for placement (top of object)") @Desc("The maximum height for placement (top of object)")
private double maximumScale = 1; 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<IrisObject, KList<IrisObject>> cache private final transient ConcurrentLinkedHashMap<IrisObject, KList<IrisObject>> cache
= new ConcurrentLinkedHashMap.Builder<IrisObject, KList<IrisObject>>() = new ConcurrentLinkedHashMap.Builder<IrisObject, KList<IrisObject>>()
.initialCapacity(64) .initialCapacity(64)
@ -68,7 +72,7 @@ public class IrisObjectScale {
KList<IrisObject> c = new KList<>(); KList<IrisObject> c = new KList<>();
for (double i = minimumScale; i < maximumScale; i += (maximumScale - minimumScale) / (double) (Math.min(variations, 32))) { 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; return c;