package speiger.src.coreengine.rendering.gui.helper.animations; import java.util.Iterator; import java.util.List; import java.util.function.BiConsumer; import speiger.src.collections.objects.lists.ObjectArrayList; import speiger.src.collections.objects.maps.impl.hash.Object2ObjectLinkedOpenHashMap; import speiger.src.collections.objects.maps.interfaces.Object2ObjectMap; import speiger.src.collections.objects.utils.maps.Object2ObjectMaps; import speiger.src.coreengine.rendering.gui.GuiComponent; import speiger.src.coreengine.rendering.gui.helper.animations.Animation.AnimationListener; public class Animator { GuiComponent owner; List> listeners = new ObjectArrayList>(); float xMod = 0F; float yMod = 0F; float widthMod = 0F; float heightMod = 0F; float scaleMod = 1F; float visibilityMod = 1F; boolean changed = false; boolean redraw = false; Object2ObjectMap animations = new Object2ObjectLinkedOpenHashMap(); public Animator(GuiComponent owner) { this.owner = owner; } public void addAnimation(Animation animation, boolean reverse, float delay) { AnimationInstance old = animations.remove(animation); animations.put(animation, animation.createInstance(owner, old, delay, reverse)); } public boolean isPlayingAnimation(Animation animation) { return animations.containsKey(animation); } public void update(float particalTicks) { for(int i = 0,m=listeners.size();i> iter = Object2ObjectMaps.fastIterator(animations);iter.hasNext();) { Object2ObjectMap.Entry animation = iter.next(); AnimationInstance instance = animation.getValue(); instance.update(this, particalTicks); if(instance.isDone()) { AnimationListener listener = instance.getListener(); if(listener != null) { listener.onAnimationFinished(animation.getKey(), owner, instance.isReverse()); } iter.remove(); } } applyValues(true); if(changed) { owner.onChanged(redraw); } owner.finishMassChanging(); } private void resetValues() { if(!changed) return; if(!owner.hasConstraints()) owner.changeVisibility(1F / visibilityMod).getBox().move(-xMod, -yMod).grow(-widthMod, -heightMod).scale(1F / scaleMod); else owner.changeVisibility(1F / visibilityMod).getBox().scale(1F / scaleMod); xMod = 0F; yMod = 0F; widthMod = 0F; heightMod = 0F; scaleMod = 1F; visibilityMod = 1F; changed = false; redraw = false; } public void applyValues(boolean internal) { if(!changed || (internal && owner.hasConstraints())) { return; } owner.changeVisibility(visibilityMod).getBox().scale(scaleMod).move(xMod, yMod).grow(widthMod, heightMod); } public void modifyX(float value) { if(value == 0F) { return; } xMod += value; changed = true; } public void modifyY(float value) { if(value == 0F) { return; } yMod += value; changed = true; } public void modifyWidth(float value) { if(value == 0F) { return; } widthMod += value; changed = true; redraw = true; } public void modifyHeight(float value) { if(value == 0F) { return; } heightMod += value; changed = true; redraw = true; } public void modifyScale(float value) { if(value == 1F) { return; } scaleMod *= value; changed = true; redraw = true; } public void modifyVisibility(float value) { visibilityMod *= value; changed = true; } }