60 lines
1.4 KiB
Java
60 lines
1.4 KiB
Java
package speiger.src.coreengine.rendering.utils.states;
|
|
|
|
import speiger.src.collections.floats.collections.FloatStack;
|
|
import speiger.src.collections.floats.lists.FloatArrayList;
|
|
|
|
public abstract class FloatState implements IGLState
|
|
{
|
|
protected final float defaultValue;
|
|
protected FloatStack states = new FloatArrayList();
|
|
|
|
public FloatState(float defaultValue)
|
|
{
|
|
this.defaultValue = defaultValue;
|
|
}
|
|
|
|
public void push(float newValue)
|
|
{
|
|
if((states.isEmpty() && equalsNot(newValue, defaultValue)) || (states.size() > 0 && equalsNot(states.top(), newValue)))
|
|
{
|
|
setValue(newValue);
|
|
}
|
|
states.push(newValue);
|
|
}
|
|
|
|
public void pop()
|
|
{
|
|
if(states.isEmpty()) throw new IllegalStateException("State is already reset");
|
|
float prev = states.pop();
|
|
if(states.isEmpty() && equalsNot(defaultValue, prev)) setValue(defaultValue);
|
|
else if(!states.isEmpty() && equalsNot(states.top(), prev)) setValue(states.top());
|
|
}
|
|
|
|
protected abstract void setValue(float value);
|
|
|
|
protected abstract String getName();
|
|
|
|
protected boolean equalsNot(float key, float value)
|
|
{
|
|
return Float.floatToIntBits(key) != Float.floatToIntBits(value);
|
|
}
|
|
|
|
@Override
|
|
public void reapply()
|
|
{
|
|
if(states.isEmpty()) setValue(defaultValue);
|
|
else setValue(states.top());
|
|
}
|
|
|
|
@Override
|
|
public void cleanup()
|
|
{
|
|
if(states.size() > 1)
|
|
{
|
|
float value = states.top();
|
|
states.clear();
|
|
states.push(value);
|
|
}
|
|
}
|
|
}
|