SimpleJavaEngine/src/main/java/speiger/src/coreengine/rendering/utils/states/FloatState.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);
}
}
}