Constraint caches and digest caching made more efficient.
This commit is contained in:
@@ -9,8 +9,8 @@ import mightypork.gamecore.gui.components.SimplePainter;
|
|||||||
import mightypork.gamecore.render.Render;
|
import mightypork.gamecore.render.Render;
|
||||||
import mightypork.utils.math.Easing;
|
import mightypork.utils.math.Easing;
|
||||||
import mightypork.utils.math.color.RGB;
|
import mightypork.utils.math.color.RGB;
|
||||||
import mightypork.utils.math.constraints.num.NumAnimated;
|
|
||||||
import mightypork.utils.math.constraints.num.Num;
|
import mightypork.utils.math.constraints.num.Num;
|
||||||
|
import mightypork.utils.math.constraints.num.NumAnimated;
|
||||||
import mightypork.utils.math.constraints.rect.Rect;
|
import mightypork.utils.math.constraints.rect.Rect;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ import mightypork.gamecore.render.fonts.FontRenderer.Align;
|
|||||||
import mightypork.rogue.Res;
|
import mightypork.rogue.Res;
|
||||||
import mightypork.utils.math.Easing;
|
import mightypork.utils.math.Easing;
|
||||||
import mightypork.utils.math.color.RGB;
|
import mightypork.utils.math.color.RGB;
|
||||||
import mightypork.utils.math.constraints.num.NumAnimated;
|
|
||||||
import mightypork.utils.math.constraints.num.Num;
|
import mightypork.utils.math.constraints.num.Num;
|
||||||
|
import mightypork.utils.math.constraints.num.NumAnimated;
|
||||||
import mightypork.utils.math.constraints.rect.Rect;
|
import mightypork.utils.math.constraints.rect.Rect;
|
||||||
import mightypork.utils.math.constraints.vect.Vect;
|
import mightypork.utils.math.constraints.vect.Vect;
|
||||||
import mightypork.utils.math.constraints.vect.VectAnimated;
|
import mightypork.utils.math.constraints.vect.VectAnimated;
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package mightypork.test;
|
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.vect.Vect;
|
||||||
|
import mightypork.utils.math.constraints.vect.VectCache;
|
||||||
|
import mightypork.utils.math.constraints.vect.VectVar;
|
||||||
|
|
||||||
|
|
||||||
|
public class TestConstCaching {
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
VectVar in = Vect.makeVar(0, 0);
|
||||||
|
VectCache cache = in.cached();
|
||||||
|
cache.enableDigestCaching(true);
|
||||||
|
|
||||||
|
System.out.println("in = "+in);
|
||||||
|
System.out.println("cache = "+cache);
|
||||||
|
System.out.println("cache digest = " + cache.digest());
|
||||||
|
System.out.println("\n-- in := 100, 50, 25 --\n");
|
||||||
|
in.setTo(100,50,25);
|
||||||
|
System.out.println("in = "+in);
|
||||||
|
System.out.println("cache = "+cache);
|
||||||
|
System.out.println("cache digest = " + cache.digest());
|
||||||
|
System.out.println("\n-- cache.poll() --\n");
|
||||||
|
cache.poll();
|
||||||
|
System.out.println("in = "+in);
|
||||||
|
System.out.println("cache = "+cache);
|
||||||
|
System.out.println("cache digest = " + cache.digest());
|
||||||
|
System.out.println("\n-- in := 1, 2, 3 --\n");
|
||||||
|
in.setTo(1,2,3);
|
||||||
|
System.out.println("in = "+in);
|
||||||
|
System.out.println("cache = "+cache);
|
||||||
|
System.out.println("cache digest = " + cache.digest());
|
||||||
|
System.out.println("\n-- cache.poll() --\n");
|
||||||
|
cache.poll();
|
||||||
|
System.out.println("cache = "+cache);
|
||||||
|
System.out.println("cache digest = " + cache.digest());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -62,8 +62,9 @@ public abstract class Num implements NumBound, Digestable<NumDigest> {
|
|||||||
private Num p_square;
|
private Num p_square;
|
||||||
private Num p_neg;
|
private Num p_neg;
|
||||||
private Num p_abs;
|
private Num p_abs;
|
||||||
private NumDigest lastDigest;
|
private NumDigest lastDigest = null;
|
||||||
private boolean digestCachingEnabled;
|
private boolean digestCachingEnabled = false;
|
||||||
|
private boolean digestDirty = true;
|
||||||
|
|
||||||
|
|
||||||
public NumConst freeze()
|
public NumConst freeze()
|
||||||
@@ -72,6 +73,18 @@ public abstract class Num implements NumBound, Digestable<NumDigest> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap this constraint into a caching adapter. Value will stay fixed (ie.
|
||||||
|
* no re-calculations) until cache receives a poll() call.
|
||||||
|
*
|
||||||
|
* @return the caching adapter
|
||||||
|
*/
|
||||||
|
public NumCache cached()
|
||||||
|
{
|
||||||
|
return new NumCache(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a snapshot of the current state, to be used for processing.
|
* Get a snapshot of the current state, to be used for processing.
|
||||||
*
|
*
|
||||||
@@ -81,9 +94,16 @@ public abstract class Num implements NumBound, Digestable<NumDigest> {
|
|||||||
@Override
|
@Override
|
||||||
public NumDigest digest()
|
public NumDigest digest()
|
||||||
{
|
{
|
||||||
if (digestCachingEnabled && lastDigest != null) return lastDigest;
|
if (digestCachingEnabled) {
|
||||||
|
if (digestDirty) {
|
||||||
|
lastDigest = new NumDigest(this);
|
||||||
|
digestDirty = false;
|
||||||
|
}
|
||||||
|
|
||||||
return lastDigest = new NumDigest(this);
|
return lastDigest;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new NumDigest(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -91,12 +111,10 @@ public abstract class Num implements NumBound, Digestable<NumDigest> {
|
|||||||
public void enableDigestCaching(boolean yes)
|
public void enableDigestCaching(boolean yes)
|
||||||
{
|
{
|
||||||
digestCachingEnabled = yes;
|
digestCachingEnabled = yes;
|
||||||
|
digestDirty = true; // schedule update nest time digest() is called
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if digest caching is enabled.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isDigestCachingEnabled()
|
public boolean isDigestCachingEnabled()
|
||||||
{
|
{
|
||||||
@@ -107,7 +125,7 @@ public abstract class Num implements NumBound, Digestable<NumDigest> {
|
|||||||
@Override
|
@Override
|
||||||
public void poll()
|
public void poll()
|
||||||
{
|
{
|
||||||
if (digestCachingEnabled) lastDigest = new NumDigest(this);
|
if (digestCachingEnabled) digestDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ package mightypork.utils.math.constraints.num;
|
|||||||
|
|
||||||
|
|
||||||
import mightypork.utils.math.Calc;
|
import mightypork.utils.math.Calc;
|
||||||
import mightypork.utils.math.Easing;
|
|
||||||
import mightypork.utils.math.Calc.Deg;
|
import mightypork.utils.math.Calc.Deg;
|
||||||
|
import mightypork.utils.math.Easing;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ package mightypork.utils.math.constraints.num;
|
|||||||
|
|
||||||
|
|
||||||
import mightypork.utils.math.Calc;
|
import mightypork.utils.math.Calc;
|
||||||
import mightypork.utils.math.Easing;
|
|
||||||
import mightypork.utils.math.Calc.Rad;
|
import mightypork.utils.math.Calc.Rad;
|
||||||
|
import mightypork.utils.math.Easing;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package mightypork.utils.math.constraints.num;
|
package mightypork.utils.math.constraints.num;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Numeric constraint
|
* Numeric constraint
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package mightypork.utils.math.constraints.num;
|
package mightypork.utils.math.constraints.num;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class NumBoundAdapter extends NumAdapter implements PluggableNumBound {
|
public class NumBoundAdapter extends NumAdapter implements PluggableNumBound {
|
||||||
|
|
||||||
private NumBound backing = null;
|
private NumBound backing = null;
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package mightypork.utils.math.constraints.num;
|
||||||
|
|
||||||
|
|
||||||
|
public class NumCache extends NumAdapter {
|
||||||
|
|
||||||
|
private final NumVar cache = Num.makeVar();
|
||||||
|
private final Num source;
|
||||||
|
private boolean inited = false;
|
||||||
|
|
||||||
|
|
||||||
|
public NumCache(Num source) {
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Num getSource()
|
||||||
|
{
|
||||||
|
if (!inited) poll();
|
||||||
|
|
||||||
|
return cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update cached value and cached digest (if digest caching is enabled)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void poll()
|
||||||
|
{
|
||||||
|
inited = true;
|
||||||
|
cache.setTo(source);
|
||||||
|
|
||||||
|
super.poll();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package mightypork.utils.math.constraints.num;
|
||||||
|
|
||||||
|
|
||||||
|
public class NumProxy extends NumAdapter {
|
||||||
|
|
||||||
|
private final Num source;
|
||||||
|
|
||||||
|
|
||||||
|
public NumProxy(Num source) {
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Num getSource()
|
||||||
|
{
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
package mightypork.utils.math.constraints.num;
|
package mightypork.utils.math.constraints.num;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pluggable numeric constraint
|
* Pluggable numeric constraint
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -161,6 +161,7 @@ public abstract class Rect implements RectBound, Digestable<RectDigest> {
|
|||||||
|
|
||||||
private RectDigest lastDigest = null;
|
private RectDigest lastDigest = null;
|
||||||
private boolean digestCachingEnabled = false;
|
private boolean digestCachingEnabled = false;
|
||||||
|
private boolean digestDirty = true; // digest is null
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -175,12 +176,31 @@ public abstract class Rect implements RectBound, Digestable<RectDigest> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap this constraint into a caching adapter. Value will stay fixed (ie.
|
||||||
|
* no re-calculations) until cache receives a poll() call.
|
||||||
|
*
|
||||||
|
* @return the caching adapter
|
||||||
|
*/
|
||||||
|
public RectCache cached()
|
||||||
|
{
|
||||||
|
return new RectCache(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RectDigest digest()
|
public RectDigest digest()
|
||||||
{
|
{
|
||||||
if (digestCachingEnabled && lastDigest != null) return lastDigest;
|
if (digestCachingEnabled) {
|
||||||
|
if (digestDirty) {
|
||||||
|
lastDigest = new RectDigest(this);
|
||||||
|
digestDirty = false;
|
||||||
|
}
|
||||||
|
|
||||||
return lastDigest = new RectDigest(this);
|
return lastDigest;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new RectDigest(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -188,12 +208,10 @@ public abstract class Rect implements RectBound, Digestable<RectDigest> {
|
|||||||
public void enableDigestCaching(boolean yes)
|
public void enableDigestCaching(boolean yes)
|
||||||
{
|
{
|
||||||
digestCachingEnabled = yes;
|
digestCachingEnabled = yes;
|
||||||
|
digestDirty = true; // schedule update nest time digest() is called
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if digest caching is enabled.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isDigestCachingEnabled()
|
public boolean isDigestCachingEnabled()
|
||||||
{
|
{
|
||||||
@@ -204,7 +222,7 @@ public abstract class Rect implements RectBound, Digestable<RectDigest> {
|
|||||||
@Override
|
@Override
|
||||||
public void poll()
|
public void poll()
|
||||||
{
|
{
|
||||||
if (digestCachingEnabled) lastDigest = new RectDigest(this);
|
if (digestCachingEnabled) digestDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package mightypork.utils.math.constraints.rect;
|
package mightypork.utils.math.constraints.rect;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rect constraint (ie. region)
|
* Rect constraint (ie. region)
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package mightypork.utils.math.constraints.rect;
|
package mightypork.utils.math.constraints.rect;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pluggable rect bound adapter
|
* Pluggable rect bound adapter
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package mightypork.utils.math.constraints.rect;
|
||||||
|
|
||||||
|
|
||||||
|
public class RectCache extends RectAdapter {
|
||||||
|
|
||||||
|
private final RectVar cache = Rect.makeVar();
|
||||||
|
private final Rect source;
|
||||||
|
private boolean inited = false;
|
||||||
|
|
||||||
|
|
||||||
|
public RectCache(Rect source) {
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Rect getSource()
|
||||||
|
{
|
||||||
|
if (!inited) poll();
|
||||||
|
|
||||||
|
return cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update cached value and cached digest (if digest caching is enabled)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void poll()
|
||||||
|
{
|
||||||
|
inited = true;
|
||||||
|
cache.setTo(source);
|
||||||
|
|
||||||
|
super.poll();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
package mightypork.utils.math.constraints.rect;
|
package mightypork.utils.math.constraints.rect;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class RectDigest {
|
public class RectDigest {
|
||||||
|
|
||||||
public final double x;
|
public final double x;
|
||||||
|
|||||||
@@ -104,8 +104,9 @@ public abstract class Vect implements VectBound, Digestable<VectDigest> {
|
|||||||
private Num p_xc;
|
private Num p_xc;
|
||||||
private Num p_yc;
|
private Num p_yc;
|
||||||
private Num p_zc;
|
private Num p_zc;
|
||||||
private boolean digestCachingEnabled;
|
private VectDigest lastDigest = null;
|
||||||
private VectDigest lastDigest;
|
private boolean digestCachingEnabled = false;
|
||||||
|
private boolean digestDirty = true; // it's null
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -238,12 +239,31 @@ public abstract class Vect implements VectBound, Digestable<VectDigest> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap this constraint into a caching adapter. Value will stay fixed (ie.
|
||||||
|
* no re-calculations) until cache receives a poll() call.
|
||||||
|
*
|
||||||
|
* @return the caching adapter
|
||||||
|
*/
|
||||||
|
public VectCache cached()
|
||||||
|
{
|
||||||
|
return new VectCache(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VectDigest digest()
|
public VectDigest digest()
|
||||||
{
|
{
|
||||||
if (digestCachingEnabled && lastDigest != null) return lastDigest;
|
if (digestCachingEnabled) {
|
||||||
|
if (digestDirty) {
|
||||||
|
lastDigest = new VectDigest(this);
|
||||||
|
digestDirty = false;
|
||||||
|
}
|
||||||
|
|
||||||
return lastDigest = new VectDigest(this);
|
return lastDigest;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new VectDigest(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -251,6 +271,7 @@ public abstract class Vect implements VectBound, Digestable<VectDigest> {
|
|||||||
public void enableDigestCaching(boolean yes)
|
public void enableDigestCaching(boolean yes)
|
||||||
{
|
{
|
||||||
digestCachingEnabled = yes;
|
digestCachingEnabled = yes;
|
||||||
|
digestDirty = true; // schedule update nest time digest() is called
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -264,7 +285,7 @@ public abstract class Vect implements VectBound, Digestable<VectDigest> {
|
|||||||
@Override
|
@Override
|
||||||
public void poll()
|
public void poll()
|
||||||
{
|
{
|
||||||
if (digestCachingEnabled) lastDigest = new VectDigest(this);
|
if (digestCachingEnabled) digestDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1036,7 +1057,7 @@ public abstract class Vect implements VectBound, Digestable<VectDigest> {
|
|||||||
* @param vec other vector
|
* @param vec other vector
|
||||||
* @return result
|
* @return result
|
||||||
*/
|
*/
|
||||||
public final Vect cross(final Vect vec)
|
public Vect cross(final Vect vec)
|
||||||
{
|
{
|
||||||
return new Vect() {
|
return new Vect() {
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package mightypork.utils.math.constraints.vect;
|
package mightypork.utils.math.constraints.vect;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Element holding a vector, used for constraint building.
|
* Element holding a vector, used for constraint building.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package mightypork.utils.math.constraints.vect;
|
package mightypork.utils.math.constraints.vect;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class VectBoundAdapter extends VectAdapter implements PluggableVectBound {
|
public class VectBoundAdapter extends VectAdapter implements PluggableVectBound {
|
||||||
|
|
||||||
private VectBound backing = null;
|
private VectBound backing = null;
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package mightypork.utils.math.constraints.vect;
|
||||||
|
|
||||||
|
|
||||||
|
public class VectCache extends VectAdapter {
|
||||||
|
|
||||||
|
private final VectVar cache = Vect.makeVar();
|
||||||
|
private final Vect source;
|
||||||
|
private boolean inited = false;
|
||||||
|
|
||||||
|
|
||||||
|
public VectCache(Vect source) {
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Vect getSource()
|
||||||
|
{
|
||||||
|
if (!inited) poll();
|
||||||
|
|
||||||
|
return cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update cached value and cached digest (if digest caching is enabled)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void poll()
|
||||||
|
{
|
||||||
|
inited = true;
|
||||||
|
cache.setTo(source);
|
||||||
|
|
||||||
|
super.poll();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -351,6 +351,12 @@ public final class VectConst extends Vect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public VectConst cross(VectConst vec)
|
||||||
|
{
|
||||||
|
return super.cross(vec).freeze();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RectConst expand(double left, double right, double top, double bottom)
|
public RectConst expand(double left, double right, double top, double bottom)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package mightypork.utils.math.constraints.vect;
|
||||||
|
|
||||||
|
|
||||||
|
public class VectProxy extends VectAdapter {
|
||||||
|
|
||||||
|
private final Vect source;
|
||||||
|
|
||||||
|
|
||||||
|
public VectProxy(Vect source) {
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Vect getSource()
|
||||||
|
{
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user