001package com.fs.starfarer.api.util;
002
003
004public class FaderUtil  {
005
006        public static enum State {IN, OUT, IDLE};
007        
008        private float currBrightness;
009        private float durationIn, durationOut;
010        private State state;
011        
012        private boolean bounceDown = false;
013        private boolean bounceUp = false;
014        
015        public FaderUtil(float currBrightness, float duration) {
016                this.currBrightness = currBrightness;
017                this.durationIn = duration;
018                this.durationOut = duration;
019                state = State.IDLE;
020        }
021        
022        public FaderUtil(float currBrightness, float durationIn, float durationOut) {
023                this.currBrightness = currBrightness;
024                this.durationIn = durationIn;
025                this.durationOut = durationOut;
026                state = State.IDLE;
027        }
028        
029        public FaderUtil(float currBrightness, float durationIn, float durationOut, boolean bounceUp, boolean bounceDown) {
030                this(currBrightness, durationIn, durationOut);
031                setBounce(bounceUp, bounceDown);
032        }
033        
034        public State getState() {
035                return state;
036        }
037
038        public void setState(State state) {
039                this.state = state;
040        }
041
042        public void setBounceDown(boolean bounceDown) {
043                this.bounceDown = bounceDown;
044        }
045
046        public void setBounceUp(boolean bounceUp) {
047                this.bounceUp = bounceUp;
048        }
049        
050        public void setBounce(boolean up, boolean down) {
051                this.bounceUp = up;
052                this.bounceDown = down;
053        }
054
055        public void forceIn() {
056                currBrightness = 1;
057                if (bounceDown) state = State.OUT;
058                else state = State.IDLE;
059        }
060        
061        public void forceOut() {
062                currBrightness = 0;
063                if (bounceUp) state = State.IN;
064                else state = State.IDLE;
065        }
066        
067        public void fadeIn() {
068                if (durationIn <= 0) {
069                        forceIn();
070                } else {
071                        state = State.IN;
072                }
073        }
074        
075        public void fadeOut() {
076                if (durationOut <= 0) {
077                        forceOut();
078                } else {
079                        state = State.OUT;
080                }
081        }
082        
083        public boolean isFadedOut() {
084                return getBrightness() == 0 && (isIdle() || isFadingOut());
085        }
086        
087        public boolean isFadedIn() {
088                return getBrightness() == 1 && isIdle();
089        }
090        
091        public boolean isFadingOut() {
092                return state == State.OUT;
093        }
094        
095        public boolean isFadingIn() {
096                return state == State.IN;
097        }
098        
099        public boolean isIdle() {
100                return state == State.IDLE;
101        }
102        
103        public void advance(float amount) {
104                if (state == State.IDLE) return;
105                
106                if (state == State.IN) {
107                        if (currBrightness == 1) { 
108                                if (bounceDown) state = State.OUT;
109                                else state = State.IDLE;
110                                return;
111                        }
112                        float delta = amount / durationIn;
113                        currBrightness += delta;
114                        if (currBrightness > 1) { 
115                                currBrightness = 1;
116                        }
117                } else if (state == State.OUT) {
118                        if (currBrightness == 0) {
119                                if (bounceUp) state = State.IN;
120                                else state = State.IDLE;
121                                return;
122                        }
123                        float delta = amount / durationOut;
124                        currBrightness -= delta;
125                        if (currBrightness < 0) {
126                                currBrightness = 0;
127                        }
128                }
129        }
130        
131        public void setDurationIn(float durationIn) {
132                this.durationIn = durationIn;
133        }
134
135        public void setDurationOut(float durationOut) {
136                this.durationOut = durationOut;
137        }
138        
139        public FaderUtil setDuration(float in, float out) {
140                this.durationIn = in;
141                this.durationOut = out;
142                return this;
143        }
144
145        public float getBrightness() {
146                return currBrightness;
147        }
148
149        public float getDurationIn() {
150                return durationIn;
151        }
152
153        public float getDurationOut() {
154                return durationOut;
155        }
156
157        public void setBrightness(float brightness) {
158                this.currBrightness = brightness;
159        }
160
161        @Override
162        public String toString() {
163                return String.format("%s, curr: %f, in: %f, out: %f, up: %b, down: %b", state.name(), 
164                                                         currBrightness, durationIn, durationOut,
165                                                         bounceUp, bounceDown);
166        }
167
168        public boolean isBounceDown() {
169                return bounceDown;
170        }
171
172        public boolean isBounceUp() {
173                return bounceUp;
174        }
175
176        
177        
178}