Revision 20dbec0e
Added by Leszek Koltunski over 5 years ago
src/main/java/org/distorted/library/effect/Effect.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
package org.distorted.library.effect; |
21 | 21 |
|
22 |
import org.distorted.library.message.EffectListener; |
|
23 |
|
|
22 | 24 |
import java.lang.reflect.Method; |
25 |
import java.util.ArrayList; |
|
23 | 26 |
|
24 | 27 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
25 | 28 |
/** |
... | ... | |
37 | 40 |
private final int mRegionDim; |
38 | 41 |
private final int mCenterDim; |
39 | 42 |
|
43 |
ArrayList<EffectListener> mListeners =null; |
|
44 |
int mNumListeners=0; // ==mListeners.length(), but we only create mListeners if the first one gets added |
|
45 |
|
|
40 | 46 |
private static long mNextID = 0; |
41 | 47 |
|
42 | 48 |
private final static float[] mUnity= new float[MAX_UNITY_DIM*NUM_EFFECTS]; |
... | ... | |
99 | 105 |
*/ |
100 | 106 |
public abstract boolean compute(float[] uniforms, int index, long currentDuration, long step ); |
101 | 107 |
|
108 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
109 |
/** |
|
110 |
* Only for use by the library itself. |
|
111 |
* |
|
112 |
* @y.exclude |
|
113 |
*/ |
|
114 |
public int getNumListeners() |
|
115 |
{ |
|
116 |
return mNumListeners; |
|
117 |
} |
|
118 |
|
|
119 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
120 |
/** |
|
121 |
* Only for use by the library itself. |
|
122 |
* |
|
123 |
* @y.exclude |
|
124 |
*/ |
|
125 |
public EffectListener removeFirstListener() |
|
126 |
{ |
|
127 |
if( mNumListeners>0 ) |
|
128 |
{ |
|
129 |
mNumListeners--; |
|
130 |
return mListeners.remove(0); |
|
131 |
} |
|
132 |
|
|
133 |
return null; |
|
134 |
} |
|
135 |
|
|
102 | 136 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
103 | 137 |
// PUBLIC API |
104 | 138 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
233 | 267 |
{ |
234 | 268 |
return mDimension; |
235 | 269 |
} |
270 |
|
|
271 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
272 |
/** |
|
273 |
* Adds the calling class to the list of Listeners that get notified when this Effect gets 'finished' |
|
274 |
* i.e. when the Dynamic inside this Effect reaches its final point and stops moving. This will be sent |
|
275 |
* only once, on the first time the Dynamic reaches its final point. |
|
276 |
* |
|
277 |
* If there's no Dynamic, ths message will never be sent. |
|
278 |
* |
|
279 |
* @param el A class implementing the EffectListener interface that wants to get notifications. |
|
280 |
*/ |
|
281 |
public void notifyWhenFinished(EffectListener el) |
|
282 |
{ |
|
283 |
if( mListeners==null ) mListeners = new ArrayList<>(); |
|
284 |
|
|
285 |
if( !mListeners.contains(el) ) |
|
286 |
{ |
|
287 |
mListeners.add(el); |
|
288 |
mNumListeners++; |
|
289 |
} |
|
290 |
} |
|
236 | 291 |
} |
src/main/java/org/distorted/library/effectqueue/EffectQueue.java | ||
---|---|---|
24 | 24 |
import org.distorted.library.effect.EffectType; |
25 | 25 |
import org.distorted.library.main.DistortedLibrary; |
26 | 26 |
import org.distorted.library.main.InternalMaster; |
27 |
import org.distorted.library.message.EffectListener; |
|
28 |
import org.distorted.library.message.EffectMessage; |
|
29 |
import org.distorted.library.message.EffectMessageSender; |
|
30 | 27 |
|
31 | 28 |
import java.util.ArrayList; |
32 | 29 |
import java.util.HashMap; |
... | ... | |
53 | 50 |
Effect[] mEffects; |
54 | 51 |
int[] mName; |
55 | 52 |
long mTime=0; |
56 |
ArrayList<EffectListener> mListeners =null; |
|
57 |
int mNumListeners=0; // ==mListeners.length(), but we only create mListeners if the first one gets added |
|
58 |
long mDistortedEffectsID; |
|
59 | 53 |
|
60 | 54 |
private static int[] mMax = new int[EffectType.LENGTH]; |
61 | 55 |
private static long mNextID; |
... | ... | |
90 | 84 |
|
91 | 85 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
92 | 86 |
|
93 |
EffectQueue(long id, int numUniforms, int index)
|
|
87 |
EffectQueue(int numUniforms, int index) |
|
94 | 88 |
{ |
95 | 89 |
mCreated = false; |
96 | 90 |
mID = 0; |
97 | 91 |
mNumEffects = 0; |
98 | 92 |
mNumEffectsToBe = 0; |
99 |
mDistortedEffectsID = id; |
|
100 | 93 |
mIndex = index; |
101 | 94 |
|
102 | 95 |
mJobs.add(new Job(CREATE,numUniforms,false,null)); // create the stuff that depends on max number |
... | ... | |
105 | 98 |
|
106 | 99 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
107 | 100 |
|
108 |
public static void allocateQueues(EffectQueue[] queues, EffectQueue[] from, int flags, long id)
|
|
101 |
public static void allocateQueues(EffectQueue[] queues, EffectQueue[] from, int flags) |
|
109 | 102 |
{ |
110 |
queues[0] = (flags & DistortedLibrary.CLONE_MATRIX ) != 0 ? from[0] : new EffectQueueMatrix(id);
|
|
111 |
queues[1] = (flags & DistortedLibrary.CLONE_VERTEX ) != 0 ? from[1] : new EffectQueueVertex(id);
|
|
112 |
queues[2] = (flags & DistortedLibrary.CLONE_FRAGMENT ) != 0 ? from[2] : new EffectQueueFragment(id);
|
|
113 |
queues[3] = (flags & DistortedLibrary.CLONE_POSTPROCESS) != 0 ? from[3] : new EffectQueuePostprocess(id);
|
|
103 |
queues[0] = (flags & DistortedLibrary.CLONE_MATRIX ) != 0 ? from[0] : new EffectQueueMatrix(); |
|
104 |
queues[1] = (flags & DistortedLibrary.CLONE_VERTEX ) != 0 ? from[1] : new EffectQueueVertex(); |
|
105 |
queues[2] = (flags & DistortedLibrary.CLONE_FRAGMENT ) != 0 ? from[2] : new EffectQueueFragment(); |
|
106 |
queues[3] = (flags & DistortedLibrary.CLONE_POSTPROCESS) != 0 ? from[3] : new EffectQueuePostprocess(); |
|
114 | 107 |
} |
115 | 108 |
|
116 | 109 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
205 | 198 |
return mMax[index]; |
206 | 199 |
} |
207 | 200 |
|
208 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
209 |
|
|
210 |
public void registerForMessages(EffectListener el) |
|
211 |
{ |
|
212 |
if( mListeners==null ) mListeners = new ArrayList<>(); |
|
213 |
|
|
214 |
if( !mListeners.contains(el) ) |
|
215 |
{ |
|
216 |
mListeners.add(el); |
|
217 |
mNumListeners++; |
|
218 |
} |
|
219 |
} |
|
220 |
|
|
221 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
222 |
|
|
223 |
public void deregisterForMessages(EffectListener el) |
|
224 |
{ |
|
225 |
if( mListeners.remove(el) ) |
|
226 |
{ |
|
227 |
mNumListeners--; |
|
228 |
} |
|
229 |
} |
|
230 |
|
|
231 | 201 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
232 | 202 |
|
233 | 203 |
public static void onDestroy() |
... | ... | |
244 | 214 |
{ |
245 | 215 |
mNumEffects--; |
246 | 216 |
|
247 |
long removedID = mEffects[effect].getID(); |
|
248 |
|
|
249 | 217 |
for(int j=effect; j<mNumEffects; j++ ) |
250 | 218 |
{ |
251 | 219 |
mEffects[j] = mEffects[j+1]; |
... | ... | |
254 | 222 |
} |
255 | 223 |
|
256 | 224 |
mEffects[mNumEffects] = null; |
257 |
|
|
258 |
for(int i=0; i<mNumListeners; i++) |
|
259 |
EffectMessageSender.newMessage( mListeners.get(i), EffectMessage.EFFECT_REMOVED, removedID, mDistortedEffectsID); |
|
260 | 225 |
} |
261 | 226 |
|
262 | 227 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
441 | 406 |
case DETALL: for(int j=0; j<mNumEffects; j++ ) |
442 | 407 |
{ |
443 | 408 |
changed = true; |
444 |
|
|
445 |
if( job.notify ) |
|
446 |
{ |
|
447 |
for(int k=0; k<mNumListeners; k++) |
|
448 |
EffectMessageSender.newMessage( mListeners.get(k), EffectMessage.EFFECT_REMOVED, mEffects[j].getID(), mDistortedEffectsID); |
|
449 |
} |
|
450 |
|
|
451 | 409 |
mEffects[j] = null; |
452 | 410 |
} |
453 | 411 |
|
src/main/java/org/distorted/library/effectqueue/EffectQueueFragment.java | ||
---|---|---|
23 | 23 |
|
24 | 24 |
import org.distorted.library.effect.EffectType; |
25 | 25 |
import org.distorted.library.effect.FragmentEffect; |
26 |
import org.distorted.library.message.EffectMessage; |
|
27 | 26 |
import org.distorted.library.message.EffectMessageSender; |
28 | 27 |
|
29 | 28 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
39 | 38 |
|
40 | 39 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
41 | 40 |
|
42 |
EffectQueueFragment(long id)
|
|
41 |
EffectQueueFragment() |
|
43 | 42 |
{ |
44 |
super(id,NUM_UNIFORMS,INDEX);
|
|
43 |
super(NUM_UNIFORMS,INDEX); |
|
45 | 44 |
} |
46 | 45 |
|
47 | 46 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
67 | 66 |
|
68 | 67 |
if( mEffects[i].compute(mUniforms, NUM_UNIFORMS*i, mCurrentDuration[i], step) ) |
69 | 68 |
{ |
70 |
for(int j=0; j<mNumListeners; j++) |
|
71 |
EffectMessageSender.newMessage( mListeners.get(j), EffectMessage.EFFECT_FINISHED, mEffects[i].getID(), mDistortedEffectsID); |
|
69 |
EffectMessageSender.newMessage(mEffects[i]); |
|
72 | 70 |
} |
73 | 71 |
|
74 | 72 |
mUniforms[NUM_UNIFORMS*i+5] -= halfX; |
src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java | ||
---|---|---|
24 | 24 |
|
25 | 25 |
import org.distorted.library.effect.EffectType; |
26 | 26 |
import org.distorted.library.effect.MatrixEffect; |
27 |
import org.distorted.library.message.EffectMessage; |
|
28 | 27 |
import org.distorted.library.message.EffectMessageSender; |
29 | 28 |
|
30 | 29 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
48 | 47 |
|
49 | 48 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
50 | 49 |
|
51 |
EffectQueueMatrix(long id)
|
|
50 |
EffectQueueMatrix() |
|
52 | 51 |
{ |
53 |
super(id,NUM_UNIFORMS,INDEX );
|
|
52 |
super(NUM_UNIFORMS,INDEX ); |
|
54 | 53 |
} |
55 | 54 |
|
56 | 55 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
128 | 127 |
|
129 | 128 |
if( mEffects[i].compute(mUniforms, NUM_UNIFORMS*i, mCurrentDuration[i], step) ) |
130 | 129 |
{ |
131 |
for(int j=0; j<mNumListeners; j++) |
|
132 |
EffectMessageSender.newMessage( mListeners.get(j), EffectMessage.EFFECT_FINISHED, mEffects[i].getID(), mDistortedEffectsID); |
|
130 |
EffectMessageSender.newMessage(mEffects[i]); |
|
133 | 131 |
} |
134 | 132 |
} |
135 | 133 |
|
src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java | ||
---|---|---|
34 | 34 |
import org.distorted.library.main.InternalRenderState; |
35 | 35 |
import org.distorted.library.main.InternalSurface; |
36 | 36 |
import org.distorted.library.mesh.MeshBase; |
37 |
import org.distorted.library.message.EffectMessage; |
|
38 | 37 |
import org.distorted.library.message.EffectMessageSender; |
39 | 38 |
import org.distorted.library.program.DistortedProgram; |
40 | 39 |
|
... | ... | |
60 | 59 |
|
61 | 60 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
62 | 61 |
|
63 |
EffectQueuePostprocess(long id)
|
|
62 |
EffectQueuePostprocess() |
|
64 | 63 |
{ |
65 |
super(id,NUM_UNIFORMS,INDEX );
|
|
64 |
super(NUM_UNIFORMS,INDEX ); |
|
66 | 65 |
} |
67 | 66 |
|
68 | 67 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
88 | 87 |
|
89 | 88 |
if( mEffects[i].compute(mUniforms, NUM_UNIFORMS*i, mCurrentDuration[i], step) ) |
90 | 89 |
{ |
91 |
for(int j=0; j<mNumListeners; j++) |
|
92 |
EffectMessageSender.newMessage( mListeners.get(j), EffectMessage.EFFECT_FINISHED, mEffects[i].getID(), mDistortedEffectsID); |
|
90 |
EffectMessageSender.newMessage(mEffects[i]); |
|
93 | 91 |
} |
94 | 92 |
|
95 | 93 |
halo = (int)mUniforms[NUM_UNIFORMS*i]; |
src/main/java/org/distorted/library/effectqueue/EffectQueueVertex.java | ||
---|---|---|
23 | 23 |
|
24 | 24 |
import org.distorted.library.effect.EffectType; |
25 | 25 |
import org.distorted.library.effect.VertexEffect; |
26 |
import org.distorted.library.message.EffectMessage; |
|
27 | 26 |
import org.distorted.library.message.EffectMessageSender; |
28 | 27 |
|
29 | 28 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
40 | 39 |
|
41 | 40 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
42 | 41 |
|
43 |
EffectQueueVertex(long id)
|
|
42 |
EffectQueueVertex() |
|
44 | 43 |
{ |
45 |
super(id,NUM_UNIFORMS,INDEX);
|
|
44 |
super(NUM_UNIFORMS,INDEX); |
|
46 | 45 |
} |
47 | 46 |
|
48 | 47 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
69 | 68 |
|
70 | 69 |
if( mEffects[i].compute(mUniforms, NUM_UNIFORMS*i, mCurrentDuration[i], step) ) |
71 | 70 |
{ |
72 |
for(int j=0; j<mNumListeners; j++) |
|
73 |
EffectMessageSender.newMessage( mListeners.get(j), EffectMessage.EFFECT_FINISHED, mEffects[i].getID(), mDistortedEffectsID); |
|
71 |
EffectMessageSender.newMessage(mEffects[i]); |
|
74 | 72 |
} |
75 | 73 |
|
76 | 74 |
mUniforms[NUM_UNIFORMS*i+5] -= halfX; |
src/main/java/org/distorted/library/main/DistortedEffects.java | ||
---|---|---|
23 | 23 |
import org.distorted.library.effect.EffectName; |
24 | 24 |
import org.distorted.library.effectqueue.EffectQueue; |
25 | 25 |
import org.distorted.library.effect.EffectType; |
26 |
import org.distorted.library.message.EffectListener; |
|
27 | 26 |
|
28 | 27 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
29 | 28 |
/** |
... | ... | |
63 | 62 |
{ |
64 | 63 |
mID = ++mNextID; |
65 | 64 |
mQueues = new EffectQueue[EffectType.LENGTH]; |
66 |
EffectQueue.allocateQueues(mQueues,null,0,mID);
|
|
65 |
EffectQueue.allocateQueues(mQueues,null,0); |
|
67 | 66 |
} |
68 | 67 |
|
69 | 68 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
80 | 79 |
{ |
81 | 80 |
mID = ++mNextID; |
82 | 81 |
mQueues = new EffectQueue[EffectType.LENGTH]; |
83 |
EffectQueue.allocateQueues(mQueues,dc.getQueues(),flags,mID);
|
|
82 |
EffectQueue.allocateQueues(mQueues,dc.getQueues(),flags); |
|
84 | 83 |
} |
85 | 84 |
|
86 | 85 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
94 | 93 |
return mID; |
95 | 94 |
} |
96 | 95 |
|
97 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
98 |
/** |
|
99 |
* Adds the calling class to the list of Listeners that get notified each time some event happens |
|
100 |
* to one of the Effects in our queues. Nothing will happen if 'el' is already in the list. |
|
101 |
* |
|
102 |
* @param el A class implementing the EffectListener interface that wants to get notifications. |
|
103 |
*/ |
|
104 |
public void registerForMessages(EffectListener el) |
|
105 |
{ |
|
106 |
for( int i=0; i<EffectType.LENGTH; i++) |
|
107 |
{ |
|
108 |
mQueues[i].registerForMessages(el); |
|
109 |
} |
|
110 |
} |
|
111 |
|
|
112 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
113 |
/** |
|
114 |
* Removes the calling class from the list of Listeners that get notified if something happens to Effects in our queue. |
|
115 |
* |
|
116 |
* @param el A class implementing the EffectListener interface that no longer wants to get notifications. |
|
117 |
*/ |
|
118 |
public void deregisterForMessages(EffectListener el) |
|
119 |
{ |
|
120 |
for( int i=0; i<EffectType.LENGTH; i++) |
|
121 |
{ |
|
122 |
mQueues[i].deregisterForMessages(el); |
|
123 |
} |
|
124 |
} |
|
125 |
|
|
126 | 96 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
127 | 97 |
/** |
128 | 98 |
* Aborts all Effects. |
src/main/java/org/distorted/library/message/EffectListener.java | ||
---|---|---|
21 | 21 |
|
22 | 22 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
23 | 23 |
|
24 |
import org.distorted.library.main.DistortedEffects;
|
|
24 |
import org.distorted.library.effect.Effect;
|
|
25 | 25 |
|
26 | 26 |
/** |
27 |
* This interface lets users of the DistortedLibrary library get notified when something happens to one of the effects. |
|
28 |
* To receive the notifications, we first have to register with a call to {@link DistortedEffects#registerForMessages(EffectListener)}. |
|
29 |
* List of all possible events that can happen is defined in {@link EffectMessage} |
|
27 |
* This interface lets users of the DistortedLibrary library get notified when a given effect finishes. |
|
28 |
* To receive the notifications, we first have to register with a call to {@link Effect#notifyWhenFinished(EffectListener)}. |
|
30 | 29 |
*/ |
31 | 30 |
|
32 | 31 |
public interface EffectListener |
33 | 32 |
{ |
34 | 33 |
/** |
35 |
* Gets called when event of type 'eventType' happens to effect 'effectID'.
|
|
34 |
* Gets called when Effect 'effectID' finishes execution (i.e. the Dynamic inside it reaches its final point).
|
|
36 | 35 |
* |
37 |
* @param eventType Type of event that happened. |
|
38 |
* @param effectID ID of the effect the event happened to, as returned by {@link org.distorted.library.effect.Effect#getID() } |
|
39 |
* @param objectID the ID of the DistortedEffects object, as returned by {@link org.distorted.library.main.DistortedEffects#getID()}, |
|
40 |
* this event happened to. |
|
41 |
* @see EffectMessage |
|
36 |
* @param effectID ID of the finished effect, as returned by {@link org.distorted.library.effect.Effect#getID() } |
|
42 | 37 |
*/ |
43 | 38 |
|
44 |
void effectMessage(final EffectMessage eventType, final long effectID, final long objectID);
|
|
39 |
void effectFinished(final long effectID);
|
|
45 | 40 |
} |
46 | 41 |
|
47 | 42 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/library/message/EffectMessage.java | ||
---|---|---|
1 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
2 |
// Copyright 2016 Leszek Koltunski // |
|
3 |
// // |
|
4 |
// This file is part of Distorted. // |
|
5 |
// // |
|
6 |
// Distorted is free software: you can redistribute it and/or modify // |
|
7 |
// it under the terms of the GNU General Public License as published by // |
|
8 |
// the Free Software Foundation, either version 2 of the License, or // |
|
9 |
// (at your option) any later version. // |
|
10 |
// // |
|
11 |
// Distorted is distributed in the hope that it will be useful, // |
|
12 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of // |
|
13 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // |
|
14 |
// GNU General Public License for more details. // |
|
15 |
// // |
|
16 |
// You should have received a copy of the GNU General Public License // |
|
17 |
// along with Distorted. If not, see <http://www.gnu.org/licenses/>. // |
|
18 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
19 |
|
|
20 |
package org.distorted.library.message; |
|
21 |
|
|
22 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
23 |
|
|
24 |
import org.distorted.library.main.DistortedEffects; |
|
25 |
|
|
26 |
/** |
|
27 |
* Defines all possible events a class implementing the {@link EffectListener} interface can receive. |
|
28 |
*/ |
|
29 |
|
|
30 |
public enum EffectMessage |
|
31 |
{ |
|
32 |
/** |
|
33 |
* The effect has been removed. This can happen if someone explicitly removed the effect with a call to |
|
34 |
* {@link DistortedEffects#abortById(long)} (or one of the other 'abort' methods) |
|
35 |
*/ |
|
36 |
EFFECT_REMOVED, |
|
37 |
|
|
38 |
/** |
|
39 |
* Interpolation of the effect has finished. |
|
40 |
* <p> |
|
41 |
* If you set up an interpolated effect and set its Dynamic to do 3.5 interpolations of 1000 ms each |
|
42 |
* with calls to {@link org.distorted.library.type.Dynamic#setCount(float)} and {@link org.distorted.library.type.Dynamic#makeRunNowFor(long)}, |
|
43 |
* then you are going to get this message exactly once after 3.5*1000 = 3500 milliseconds when the interpolation |
|
44 |
* finishes. You will never get this message if you set the effect to go on indefinitely with a call to |
|
45 |
* {@link org.distorted.library.type.Dynamic#setCount(float)} where float=0.0f. |
|
46 |
* <p> |
|
47 |
* If then the end effect is equal to the effect's unity, then immediately after this message you |
|
48 |
* will also get a EFFECT_REMOVED message. |
|
49 |
*/ |
|
50 |
EFFECT_FINISHED |
|
51 |
} |
|
52 |
|
|
53 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/library/message/EffectMessageSender.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
package org.distorted.library.message; |
21 | 21 |
|
22 |
import org.distorted.library.effect.Effect; |
|
23 |
|
|
22 | 24 |
import java.util.Vector; |
23 | 25 |
|
24 | 26 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
32 | 34 |
private class Message |
33 | 35 |
{ |
34 | 36 |
EffectListener mListener; |
35 |
EffectMessage mMessage; |
|
36 | 37 |
long mEffectID; |
37 |
long mObjectID; |
|
38 | 38 |
|
39 |
Message(EffectListener l, EffectMessage m, long effID, long objID)
|
|
39 |
Message(EffectListener listener, long effectID)
|
|
40 | 40 |
{ |
41 |
mListener = l; |
|
42 |
mMessage = m; |
|
43 |
mEffectID = effID; |
|
44 |
mObjectID = objID; |
|
41 |
mListener = listener; |
|
42 |
mEffectID = effectID; |
|
45 | 43 |
} |
46 | 44 |
} |
47 | 45 |
|
... | ... | |
104 | 102 |
while( mList.size()>0 ) |
105 | 103 |
{ |
106 | 104 |
tmp = mList.remove(0); |
107 |
tmp.mListener.effectMessage(tmp.mMessage, tmp.mEffectID, tmp.mObjectID);
|
|
105 |
tmp.mListener.effectFinished(tmp.mEffectID);
|
|
108 | 106 |
} |
109 | 107 |
|
110 | 108 |
synchronized(mThis) |
... | ... | |
124 | 122 |
|
125 | 123 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
126 | 124 |
|
127 |
public static void newMessage(EffectListener l, EffectMessage m, long effID, long objID)
|
|
125 |
public static void newMessage(Effect effect)
|
|
128 | 126 |
{ |
129 |
Message msg = mThis.new Message(l,m,effID,objID); |
|
130 |
mList.add(msg); |
|
127 |
int numListeners = effect.getNumListeners(); |
|
131 | 128 |
|
132 |
synchronized(mThis)
|
|
129 |
if( numListeners>0 )
|
|
133 | 130 |
{ |
134 |
mNotify = true; |
|
135 |
mThis.notify(); |
|
131 |
long id = effect.getID(); |
|
132 |
|
|
133 |
for(int i=0; i<numListeners; i++) |
|
134 |
{ |
|
135 |
Message msg = mThis.new Message(effect.removeFirstListener(), id); |
|
136 |
mList.add(msg); |
|
137 |
} |
|
138 |
|
|
139 |
synchronized(mThis) |
|
140 |
{ |
|
141 |
mNotify = true; |
|
142 |
mThis.notify(); |
|
143 |
} |
|
136 | 144 |
} |
137 | 145 |
} |
138 | 146 |
} |
Also available in: Unified diff
Simplify the way applications can get notifications when an effect finishes.
Now, instead of the 'DistortedEffects.(de)registerForNotifications()' 2 APIs, we call a single 'Effect.notifyWhenFinished()'.