Project

General

Profile

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

library / src / main / java / org / distorted / library / EffectList.java @ b3618cb5

1
package org.distorted.library;
2

    
3
import java.util.Vector;
4

    
5
///////////////////////////////////////////////////////////////////////////////////////////////////
6

    
7
abstract class EffectList
8
  {
9
  protected static final int DEFAULT_NUM_EFFECTS = 5;
10
  
11
  protected static final int PRESHADER =0;
12
  protected static final int VERTEX    =1;
13
  protected static final int FRAGMENT  =2;
14

    
15
  protected byte mNumEffects;   // number of effects at the moment
16
  protected long mTotalEffects; // total number of effects ever created
17
  
18
  protected int[] mType;
19
  protected float[] mUniforms;
20
  protected Interpolator[] mInterP;  // center of the effect
21
  protected Interpolator[] mInterI;  // all other interpolated values
22
  protected long[] mCurrentDuration;
23
  protected byte[] mFreeIndexes;
24
  protected byte[] mIDIndex;
25
  protected long[] mID;
26
  
27
  protected long mTime=0;
28
  protected float mObjHalfX, mObjHalfY, mObjHalfZ;
29
  
30
  protected static int[] mMax = new int[3];
31
  protected int mMaxIndex;
32
  protected static boolean mCreated = false;
33
 
34
  protected Vector<EffectListener> mListeners =null;
35
  protected int mNumListeners=0;  // ==mListeners.length(), but we only create mListeners if the first one gets added
36
  protected long mBitmapID;
37
  
38
  static
39
    {
40
    mMax[PRESHADER]= DEFAULT_NUM_EFFECTS;
41
    mMax[VERTEX]   = DEFAULT_NUM_EFFECTS;
42
    mMax[FRAGMENT] = DEFAULT_NUM_EFFECTS;
43
    }
44
  
45
///////////////////////////////////////////////////////////////////////////////////////////////////
46
   
47
  public EffectList(DistortedObject obj, int numUniforms, int index) 
48
    {
49
    mNumEffects   = 0;
50
    mTotalEffects = 0;
51
    mMaxIndex     = index;
52
    
53
    mObjHalfX = obj.getWidth() /2.0f;
54
    mObjHalfY = obj.getHeight()/2.0f;
55
    mObjHalfZ = obj.getDepth() /2.0f;
56

    
57
    mBitmapID = obj.getID();
58
    
59
    if( mMax[mMaxIndex]>0 )
60
      {
61
      mType            = new int[mMax[mMaxIndex]];
62
      mUniforms        = new float[numUniforms*mMax[mMaxIndex]];
63
      mInterI          = new Interpolator[mMax[mMaxIndex]];
64
      mInterP          = new Interpolator2D[mMax[mMaxIndex]];
65
      mCurrentDuration = new long[mMax[mMaxIndex]];
66
      mID              = new long[mMax[mMaxIndex]];
67
      mIDIndex         = new byte[mMax[mMaxIndex]];
68
      mFreeIndexes     = new byte[mMax[mMaxIndex]];
69
     
70
      for(byte i=0; i<mMax[mMaxIndex]; i++) mFreeIndexes[i] = i;
71
      }
72
   
73
    mCreated = true;  
74
    }
75

    
76
///////////////////////////////////////////////////////////////////////////////////////////////////
77

    
78
  int getNumEffects()
79
    {
80
    return mNumEffects;  
81
    }
82

    
83
///////////////////////////////////////////////////////////////////////////////////////////////////
84

    
85
  void addListener(EffectListener el)
86
    {
87
    if( mListeners==null ) mListeners = new Vector<>(2,2);
88
   
89
    mListeners.add(el);
90
    mNumListeners++;
91
    }
92
 
93
///////////////////////////////////////////////////////////////////////////////////////////////////
94

    
95
  void removeListener(EffectListener el)
96
    {
97
    if( mNumListeners>0 )  
98
      {
99
      mListeners.remove(el);
100
      mNumListeners--;
101
      }
102
    }
103

    
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105

    
106
  static void reset()
107
    {
108
    mMax[PRESHADER]= DEFAULT_NUM_EFFECTS;
109
    mMax[VERTEX]   = DEFAULT_NUM_EFFECTS;
110
    mMax[FRAGMENT] = DEFAULT_NUM_EFFECTS;
111
   
112
    mCreated = false;  
113
    }
114
 
115
///////////////////////////////////////////////////////////////////////////////////////////////////
116

    
117
  synchronized boolean removeByID(long id)
118
    {
119
    int i = getEffectIndex(id);
120
   
121
    if( i>=0 ) 
122
      {
123
      remove(i);
124
      return true;
125
      }
126
   
127
    return false; 
128
    }
129

    
130
///////////////////////////////////////////////////////////////////////////////////////////////////
131

    
132
  synchronized boolean removeByType(EffectNames effect)
133
    {
134
    boolean ret = false;  
135
    int ord = effect.ordinal();  
136
     
137
    for(int i=0; i<mNumEffects; i++)
138
      {
139
      if( mType[i]==ord )
140
        {
141
        remove(i);
142
        ret = true;
143
        }
144
      }
145
   
146
    return ret;
147
    }
148
  
149
///////////////////////////////////////////////////////////////////////////////////////////////////
150
  
151
  protected synchronized int getEffectIndex(long id)
152
    {
153
    int index = mIDIndex[(int)(id%mMax[mMaxIndex])];
154
    return (index<mNumEffects && mID[index]==id ? index : -1);
155
    }
156

    
157
///////////////////////////////////////////////////////////////////////////////////////////////////
158
  
159
  synchronized void abortAll()
160
    {
161
    for(int i=0; i<mNumEffects; i++ )
162
      {
163
      mInterI[i] = null;
164
      mInterP[i] = null;
165
      } 
166
   
167
    mNumEffects= 0;  
168
    }
169

    
170
///////////////////////////////////////////////////////////////////////////////////////////////////
171
// this assumes 0<=effect<mNumEffects
172
  
173
  protected void remove(int effect)
174
    {
175
    mNumEffects--;     
176
    
177
    byte removedIndex = (byte)(mID[effect]%mMax[mMaxIndex]);
178
    byte removedPosition = mIDIndex[removedIndex];
179
    mFreeIndexes[mNumEffects] = removedIndex;
180
    
181
    long removedID = mID[effect];
182
    int removedType= mType[effect];
183
    
184
    for(int j=0; j<mMax[mMaxIndex]; j++)
185
      {
186
      if( mIDIndex[j] > removedPosition ) mIDIndex[j]--; 
187
      }
188
         
189
    for(int j=effect; j<mNumEffects; j++ ) 
190
      {
191
      mType[j]            = mType[j+1];
192
      mInterI[j]          = mInterI[j+1];
193
      mInterP[j]          = mInterP[j+1];
194
      mCurrentDuration[j] = mCurrentDuration[j+1];
195
      mID[j]              = mID[j+1];
196
    
197
      moveEffect(j);
198
      }
199
   
200
    mInterI[mNumEffects] = null;
201
    mInterP[mNumEffects] = null;
202
   
203
    for(int i=0; i<mNumListeners; i++) 
204
      EffectMessageSender.newMessage( mListeners.elementAt(i),
205
                                      EffectMessage.EFFECT_REMOVED, 
206
                                      (removedID<<DistortedObject.TYPE_NUM)+EffectNames.getType(removedType), 
207
                                      removedType,
208
                                      mBitmapID);  
209
    }
210
  
211
///////////////////////////////////////////////////////////////////////////////////////////////////
212
  
213
  protected long addBase(EffectNames eln)
214
    {    
215
    mType[mNumEffects]  = eln.ordinal();  
216
    mCurrentDuration[mNumEffects] = 0;
217
    
218
    int index = mFreeIndexes[mNumEffects];
219
    long id = mTotalEffects*mMax[mMaxIndex] + index;
220
    mID[mNumEffects] = id;
221
    mIDIndex[index] = mNumEffects;  
222
   
223
    mNumEffects++; 
224
    mTotalEffects++;
225
   
226
    return (id<<DistortedObject.TYPE_NUM)+eln.getType();
227
    }
228
    
229
///////////////////////////////////////////////////////////////////////////////////////////////////
230
// used only for debugging
231
  
232
  protected String printEffects(int max)
233
    {
234
    long[] indexes = new long[mMax[mMaxIndex]];
235
   
236
    for(int g=0; g<mMax[mMaxIndex]; g++)
237
      {
238
      indexes[g] = -1;  
239
      }
240
   
241
    String ret="(";
242
    int f;
243
   
244
    for(int g=0; g<max; g++) 
245
      {
246
      f = getEffectIndex(g);
247
      if( f>=0 ) indexes[f] = g;
248
      }
249
   
250
    for(int g=0; g<mMax[mMaxIndex]; g++)
251
      {
252
      ret += (g>0 ? ",":"")+(indexes[g]>=0 ? indexes[g] : " ");   
253
      }
254
   
255
    ret += ")";
256
   
257
    return ret;
258
    }
259

    
260
///////////////////////////////////////////////////////////////////////////////////////////////////
261
// Only used for debugging
262
  
263
  protected boolean printByID(long id)
264
    {
265
    int index = getEffectIndex(id);
266
   
267
    if( index>=0 ) 
268
      {
269
      boolean interI = mInterI[index]==null; 
270
      boolean interP = mInterP[index]==null; 
271
      
272
      android.util.Log.e("EffectList", "numEffects="+mNumEffects+" effect id="+id+" index="+index+" duration="+mCurrentDuration[index]+" interI null="+interI+" interP null="+interP);
273
      
274
      if( interI==false )
275
        {
276
        android.util.Log.e("EffectList","interI: "+mInterI[index].print());  
277
        }
278
      if( interP==false )
279
        {
280
        android.util.Log.e("EffectList","interP: "+mInterP[index].print());  
281
        }
282
     
283
      return true;
284
      }
285
   
286
    android.util.Log.e("EffectList", "effect id="+id+" not found");
287

    
288
    return false;  
289
    }
290
 
291
///////////////////////////////////////////////////////////////////////////////////////////////////
292

    
293
  abstract void moveEffect(int index);
294
  }
295
///////////////////////////////////////////////////////////////////////////////////////////////////
(8-8/29)