Project

General

Profile

Download (11.1 KB) Statistics
| Branch: | Revision:

library / src / main / java / org / distorted / library / EffectQueue.java @ 3a35681a

1 d333eb6b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 6a06a912 Leszek Koltunski
package org.distorted.library;
21
22 e458a4ba Leszek Koltunski
import org.distorted.library.message.EffectListener;
23
import org.distorted.library.message.EffectMessage;
24 568b29d8 Leszek Koltunski
import org.distorted.library.type.Dynamic;
25 a4835695 Leszek Koltunski
26 6a06a912 Leszek Koltunski
import java.util.Vector;
27
28
///////////////////////////////////////////////////////////////////////////////////////////////////
29
30 d07f2950 Leszek Koltunski
abstract class EffectQueue
31 6a06a912 Leszek Koltunski
  {
32
  protected byte mNumEffects;   // number of effects at the moment
33
  protected long mTotalEffects; // total number of effects ever created
34
  
35
  protected int[] mType;
36
  protected float[] mUniforms;
37 d425545a Leszek Koltunski
  protected Dynamic[][] mInter;  // center of the effect
38 6a06a912 Leszek Koltunski
  protected long[] mCurrentDuration;
39
  protected byte[] mFreeIndexes;
40
  protected byte[] mIDIndex;
41
  protected long[] mID;
42
  
43
  protected long mTime=0;
44
  protected float mObjHalfX, mObjHalfY, mObjHalfZ;
45
  
46 1e438fc7 Leszek Koltunski
  protected static int[] mMax = new int[EffectTypes.LENGTH];
47 6a06a912 Leszek Koltunski
  protected int mMaxIndex;
48 71887484 Leszek Koltunski
49 6a06a912 Leszek Koltunski
  protected Vector<EffectListener> mListeners =null;
50
  protected int mNumListeners=0;  // ==mListeners.length(), but we only create mListeners if the first one gets added
51
  protected long mBitmapID;
52 71887484 Leszek Koltunski
53
  private static boolean mCreated;
54
55 6a06a912 Leszek Koltunski
  static
56
    {
57 1e438fc7 Leszek Koltunski
    reset();
58 6a06a912 Leszek Koltunski
    }
59
  
60
///////////////////////////////////////////////////////////////////////////////////////////////////
61
   
62 d07f2950 Leszek Koltunski
  public EffectQueue(DistortedObject obj, int numUniforms, int index)
63 6a06a912 Leszek Koltunski
    {
64
    mNumEffects   = 0;
65
    mTotalEffects = 0;
66
    mMaxIndex     = index;
67
68 1e438fc7 Leszek Koltunski
    if( obj!=null )
69
      {
70
      mObjHalfX = obj.getWidth() / 2.0f;
71
      mObjHalfY = obj.getHeight() / 2.0f;
72
      mObjHalfZ = obj.getDepth() / 2.0f;
73
74
      mBitmapID = obj.getID();
75
      }
76
77 6a06a912 Leszek Koltunski
    if( mMax[mMaxIndex]>0 )
78
      {
79
      mType            = new int[mMax[mMaxIndex]];
80
      mUniforms        = new float[numUniforms*mMax[mMaxIndex]];
81 d425545a Leszek Koltunski
      mInter           = new Dynamic[3][mMax[mMaxIndex]];
82 6a06a912 Leszek Koltunski
      mCurrentDuration = new long[mMax[mMaxIndex]];
83
      mID              = new long[mMax[mMaxIndex]];
84
      mIDIndex         = new byte[mMax[mMaxIndex]];
85
      mFreeIndexes     = new byte[mMax[mMaxIndex]];
86
     
87
      for(byte i=0; i<mMax[mMaxIndex]; i++) mFreeIndexes[i] = i;
88
      }
89
   
90
    mCreated = true;  
91
    }
92
93
///////////////////////////////////////////////////////////////////////////////////////////////////
94
95
  int getNumEffects()
96
    {
97
    return mNumEffects;  
98
    }
99
100 71887484 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
101
// Only max Byte.MAX_VALUE concurrent effects per DistortedObject.
102
// If you want more, change type of the mNumEffects, mIDIndex and mFreeIndexes variables to shorts.
103
104
  static boolean setMax(int index, int m)
105
    {
106
    if( (mCreated==false && !Distorted.isInitialized()) || m<=mMax[index] )
107
      {
108
      if( m<0              ) m = 0;
109
      else if( m>Byte.MAX_VALUE ) m = Byte.MAX_VALUE;
110
111
      mMax[index] = m;
112
      return true;
113
      }
114
115
    return false;
116
    }
117
118
///////////////////////////////////////////////////////////////////////////////////////////////////
119
120
  static int getMax(int index)
121
    {
122
    return mMax[index];
123
    }
124
125 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
126
127
  void addListener(EffectListener el)
128
    {
129 b3618cb5 Leszek Koltunski
    if( mListeners==null ) mListeners = new Vector<>(2,2);
130 6a06a912 Leszek Koltunski
   
131
    mListeners.add(el);
132
    mNumListeners++;
133
    }
134
 
135
///////////////////////////////////////////////////////////////////////////////////////////////////
136
137
  void removeListener(EffectListener el)
138
    {
139
    if( mNumListeners>0 )  
140
      {
141
      mListeners.remove(el);
142
      mNumListeners--;
143
      }
144
    }
145
146
///////////////////////////////////////////////////////////////////////////////////////////////////
147
148
  static void reset()
149
    {
150 1e438fc7 Leszek Koltunski
    EffectTypes.reset(mMax);
151 6a06a912 Leszek Koltunski
    mCreated = false;  
152
    }
153
 
154
///////////////////////////////////////////////////////////////////////////////////////////////////
155
156 476bbc81 Leszek Koltunski
  synchronized int removeByID(long id)
157 6a06a912 Leszek Koltunski
    {
158
    int i = getEffectIndex(id);
159
   
160
    if( i>=0 ) 
161
      {
162
      remove(i);
163 476bbc81 Leszek Koltunski
      return 1;
164 6a06a912 Leszek Koltunski
      }
165
   
166 476bbc81 Leszek Koltunski
    return 0;
167 6a06a912 Leszek Koltunski
    }
168
169
///////////////////////////////////////////////////////////////////////////////////////////////////
170
171 476bbc81 Leszek Koltunski
  synchronized int removeByType(EffectNames effect)
172 6a06a912 Leszek Koltunski
    {
173 476bbc81 Leszek Koltunski
    int ret = 0;
174 6a06a912 Leszek Koltunski
    int ord = effect.ordinal();  
175
     
176
    for(int i=0; i<mNumEffects; i++)
177
      {
178
      if( mType[i]==ord )
179
        {
180
        remove(i);
181 476bbc81 Leszek Koltunski
        i--;
182
        ret++;
183 6a06a912 Leszek Koltunski
        }
184
      }
185
   
186
    return ret;
187
    }
188
  
189
///////////////////////////////////////////////////////////////////////////////////////////////////
190
  
191 2e18813f Leszek Koltunski
  private synchronized int getEffectIndex(long id)
192 6a06a912 Leszek Koltunski
    {
193
    int index = mIDIndex[(int)(id%mMax[mMaxIndex])];
194
    return (index<mNumEffects && mID[index]==id ? index : -1);
195
    }
196
197
///////////////////////////////////////////////////////////////////////////////////////////////////
198
  
199 d07f2950 Leszek Koltunski
  synchronized int abortAll()
200 6a06a912 Leszek Koltunski
    {
201 d07f2950 Leszek Koltunski
    int ret = mNumEffects;
202 3a35681a Leszek Koltunski
    long removedID;
203
    int removedType;
204 d07f2950 Leszek Koltunski
205
    for(int i=0; i<ret; i++ )
206 6a06a912 Leszek Koltunski
      {
207 d425545a Leszek Koltunski
      mInter[0][i] = null;
208
      mInter[1][i] = null;
209
      mInter[2][i] = null;
210 3a35681a Leszek Koltunski
211
      removedID = mID[i];
212
      removedType= mType[i];
213
214
      for(int j=0; j<mNumListeners; j++)
215
        EffectMessageSender.newMessage( mListeners.elementAt(j),
216
                                        EffectMessage.EFFECT_REMOVED,
217
                                        (removedID<<EffectTypes.LENGTH)+EffectNames.getType(removedType).type,
218
                                        removedType,
219
                                        mBitmapID,
220
                                        null);
221 d07f2950 Leszek Koltunski
      }
222
223
    mNumEffects= 0;
224
225
    return ret;
226 6a06a912 Leszek Koltunski
    }
227
228
///////////////////////////////////////////////////////////////////////////////////////////////////
229
// this assumes 0<=effect<mNumEffects
230
  
231
  protected void remove(int effect)
232
    {
233
    mNumEffects--;     
234
    
235
    byte removedIndex = (byte)(mID[effect]%mMax[mMaxIndex]);
236
    byte removedPosition = mIDIndex[removedIndex];
237
    mFreeIndexes[mNumEffects] = removedIndex;
238
    
239
    long removedID = mID[effect];
240
    int removedType= mType[effect];
241
    
242
    for(int j=0; j<mMax[mMaxIndex]; j++)
243
      {
244
      if( mIDIndex[j] > removedPosition ) mIDIndex[j]--; 
245
      }
246
         
247
    for(int j=effect; j<mNumEffects; j++ ) 
248
      {
249
      mType[j]            = mType[j+1];
250 a595ee16 Leszek Koltunski
      mInter[0][j]        = mInter[0][j+1];
251
      mInter[1][j]        = mInter[1][j+1];
252
      mInter[2][j]        = mInter[2][j+1];
253 6a06a912 Leszek Koltunski
      mCurrentDuration[j] = mCurrentDuration[j+1];
254
      mID[j]              = mID[j+1];
255
    
256
      moveEffect(j);
257
      }
258
   
259 d425545a Leszek Koltunski
    mInter[0][mNumEffects] = null;
260
    mInter[1][mNumEffects] = null;
261
    mInter[2][mNumEffects] = null;
262
263 6a06a912 Leszek Koltunski
    for(int i=0; i<mNumListeners; i++) 
264
      EffectMessageSender.newMessage( mListeners.elementAt(i),
265 e458a4ba Leszek Koltunski
                                      EffectMessage.EFFECT_REMOVED,
266 1e438fc7 Leszek Koltunski
                                      (removedID<<EffectTypes.LENGTH)+EffectNames.getType(removedType).type,
267 6a06a912 Leszek Koltunski
                                      removedType,
268 c6e1c219 Leszek Koltunski
                                      mBitmapID,
269
                                      null);
270 6a06a912 Leszek Koltunski
    }
271
  
272
///////////////////////////////////////////////////////////////////////////////////////////////////
273
  
274
  protected long addBase(EffectNames eln)
275
    {    
276
    mType[mNumEffects]  = eln.ordinal();  
277
    mCurrentDuration[mNumEffects] = 0;
278
    
279
    int index = mFreeIndexes[mNumEffects];
280
    long id = mTotalEffects*mMax[mMaxIndex] + index;
281
    mID[mNumEffects] = id;
282
    mIDIndex[index] = mNumEffects;  
283
   
284
    mNumEffects++; 
285
    mTotalEffects++;
286
   
287 1e438fc7 Leszek Koltunski
    return (id<<EffectTypes.LENGTH)+eln.getType().type;
288 6a06a912 Leszek Koltunski
    }
289
    
290
///////////////////////////////////////////////////////////////////////////////////////////////////
291
// used only for debugging
292
  
293
  protected String printEffects(int max)
294
    {
295
    long[] indexes = new long[mMax[mMaxIndex]];
296
   
297
    for(int g=0; g<mMax[mMaxIndex]; g++)
298
      {
299
      indexes[g] = -1;  
300
      }
301
   
302 b329f352 Leszek Koltunski
    String ret="(";
303 6a06a912 Leszek Koltunski
    int f;
304
   
305
    for(int g=0; g<max; g++) 
306
      {
307
      f = getEffectIndex(g);
308
      if( f>=0 ) indexes[f] = g;
309
      }
310
   
311
    for(int g=0; g<mMax[mMaxIndex]; g++)
312
      {
313
      ret += (g>0 ? ",":"")+(indexes[g]>=0 ? indexes[g] : " ");   
314
      }
315
   
316
    ret += ")";
317
   
318
    return ret;
319
    }
320
321
///////////////////////////////////////////////////////////////////////////////////////////////////
322
// Only used for debugging
323
  
324
  protected boolean printByID(long id)
325
    {
326
    int index = getEffectIndex(id);
327
   
328
    if( index>=0 ) 
329
      {
330 d425545a Leszek Koltunski
      boolean inter0 = mInter[0][index]==null;
331
      boolean inter1 = mInter[1][index]==null;
332
      boolean inter2 = mInter[2][index]==null;
333
334
      android.util.Log.e("EffectQueue", "numEffects="+mNumEffects+" effect id="+id+" index="+index+
335
                         " duration="+mCurrentDuration[index]+" inter[0] null="+inter0+" inter[1] null="+inter1+" inter[2] null="+inter2);
336 6a06a912 Leszek Koltunski
      
337 d425545a Leszek Koltunski
      if( inter0==false )
338 6a06a912 Leszek Koltunski
        {
339 d425545a Leszek Koltunski
        android.util.Log.e("EffectQueue","inter[0]: "+mInter[0][index].print());
340 6a06a912 Leszek Koltunski
        }
341 d425545a Leszek Koltunski
      if( inter1==false )
342 6a06a912 Leszek Koltunski
        {
343 d425545a Leszek Koltunski
        android.util.Log.e("EffectQueue","inter[1]: "+mInter[1][index].print());
344 6a06a912 Leszek Koltunski
        }
345 d425545a Leszek Koltunski
      if( inter2==false )
346
        {
347
        android.util.Log.e("EffectQueue","inter[2]: "+mInter[2][index].print());
348
        }
349
350 6a06a912 Leszek Koltunski
      return true;
351
      }
352
   
353 d07f2950 Leszek Koltunski
    android.util.Log.e("EffectQueue", "effect id="+id+" not found");
354 6a06a912 Leszek Koltunski
355
    return false;  
356
    }
357
 
358
///////////////////////////////////////////////////////////////////////////////////////////////////
359
360
  abstract void moveEffect(int index);
361
  }
362
///////////////////////////////////////////////////////////////////////////////////////////////////