package de.lessvoid.nifty.tools.pulsate.provider; import de.lessvoid.nifty.tools.pulsate.PulsatorProvider; import javax.annotation.Nonnull; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; /** * SinusPulsator. * * @author void */ public class SinusPulsator implements PulsatorProvider { /** * the logger. */ @Nonnull private static final Logger log = Logger.getLogger(SinusPulsator.class.getName()); /** * constant to half things. */ private static final float HALF = 0.5f; /** * period for one full cycle in ms. */ private float period; /** * start time. */ private long startTime; /** * cycle (true) or one shot (false). */ private boolean cycle = true; /** * start the pulsator at 1 (true) or 0 (false). */ private boolean reverse = false; /** * Initialize the Pulsator. * * @param parameter the parameters */ @Override public void initialize(@Nonnull final Properties parameter) { try { period = Float.parseFloat(parameter.getProperty("period", "1000")); } catch (NumberFormatException e) { log.log(Level.SEVERE, "Failed to parse \"period\" value.", e); period = 1000.f; } this.cycle = Boolean.parseBoolean(parameter.getProperty("cycle", Boolean.toString(true))); this.reverse = Boolean.parseBoolean(parameter.getProperty("reverse", Boolean.toString(false))); } /** * Get current value for the given time. * * @param msTime current time * @return the pulsate value in [0,1] interval */ @Override public float getValue(final long msTime) { long t = msTime - startTime; if (!cycle && t > period * HALF) return (reverse? 0.0f: 1.0f); else return getSinusValue(t + (reverse? (long)(period * HALF): 0l)); } /** * get scaled sinus. * * @param x input * @return sinus */ private float getSinusValue(final long x) { return (float) Math.abs(Math.sin((Math.PI * x / period))); } /** * Reset. * * @param msTime current time */ @Override public void reset(final long msTime) { this.startTime = msTime; } }