package io.vivarium.visualizer;
import io.vivarium.core.Action;
import io.vivarium.core.Creature;
import io.vivarium.core.bubble.BubblePosition;
public class BubbleCreatureDelegate
{
private final Creature _creature;
private final BubblePosition _position;
private double _x1, _y1, _x2, _y2;
private double _heading1, _heading2;
private double _radius1, _radius2;
private float _isPregnant1, _isPregnant2;
private boolean _isSpawning;
private boolean _isDying;
public BubbleCreatureDelegate(Creature creature, BubblePosition position)
{
_creature = creature;
_position = position;
_x1 = _x2 = _position.getX();
_y1 = _y2 = _position.getY();
_heading1 = _heading2 = _position.getHeading();
_radius1 = _radius2 = _position.getRadius();
_isPregnant1 = _isPregnant2 = _creature.getGestation() > 0 ? 1 : 0;
_isSpawning = _creature.getAction() == Action.SPAWN;
}
public void updateSnapshot()
{
_x1 = _x2;
_x2 = _position.getX();
_y1 = _y2;
_y2 = _position.getY();
_heading1 = _heading2;
_heading2 = _position.getHeading();
_radius1 = _radius2;
_radius1 = _position.getRadius();
_isPregnant1 = _isPregnant2;
_isPregnant2 = _creature.getGestation() > 0 ? 1 : 0;
}
public boolean isDying()
{
return _isDying;
}
public void die()
{
_isDying = true;
}
public Creature getCreature()
{
return _creature;
}
public float getX(float interpolationFraction)
{
return (float) ((_x2 - _x1) * interpolationFraction + _x1);
}
public float getY(float interpolationFraction)
{
return (float) ((_y2 - _y1) * interpolationFraction + _y1);
}
public float getHeading(float interpolationFraction)
{
double heading1 = _heading1 * 180 / (Math.PI);
double heading2 = _heading2 * 180 / (Math.PI);
double rotationInterpolated;
if (Math.abs(heading2 - heading1) < 180)
{
rotationInterpolated = (1 - interpolationFraction) * heading1 + interpolationFraction * heading2;
}
else
{
if (heading2 > heading1)
{
heading2 -= 360;
}
else
{
heading2 += 360;
}
rotationInterpolated = (1 - interpolationFraction) * heading1 + interpolationFraction * heading2;
}
return (float) rotationInterpolated;
}
public float getRadius(float interpolationFraction)
{
return (float) ((_radius2 - _radius1) * interpolationFraction + _radius1);
}
public float getPregnancy(float interpolationFraction)
{
return (_isPregnant2 - _isPregnant1) * interpolationFraction + _isPregnant1;
}
public float getScale(float interpolationFraction)
{
if (_isDying)
{
return 1 - interpolationFraction;
}
else if (_isSpawning)
{
return interpolationFraction;
}
else
{
return 1;
}
}
}