Project

General

Profile

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

library / src / main / java / org / distorted / library / EffectQueueVertex.java @ 57dc1301

1
package org.distorted.library;
2

    
3
import android.opengl.GLES20;
4

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

    
7
class EffectQueueVertex extends EffectQueue
8
  { 
9
  private static final int NUM_UNIFORMS = 9;
10
  private static final int INDEX = EffectTypes.VERTEX.ordinal();
11
  private static int mNumEffectsH;
12
  private static int mTypeH;
13
  private static int mUniformsH;
14
  
15
///////////////////////////////////////////////////////////////////////////////////////////////////
16
   
17
  public EffectQueueVertex(DistortedObject obj)
18
    { 
19
    super(obj,NUM_UNIFORMS,INDEX);
20
    }
21

    
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23

    
24
  static void getUniforms(int mProgramH)
25
    {
26
    mNumEffectsH= GLES20.glGetUniformLocation( mProgramH, "vNumEffects");
27
    mTypeH      = GLES20.glGetUniformLocation( mProgramH, "vType");
28
    mUniformsH  = GLES20.glGetUniformLocation( mProgramH, "vUniforms");
29
    }
30

    
31
///////////////////////////////////////////////////////////////////////////////////////////////////
32
  
33
  synchronized void compute(long currTime) 
34
    {
35
    if( currTime==mTime ) return;
36
    if( mTime==0 ) mTime = currTime;
37
    long step = (currTime-mTime);
38
   
39
    for(int i=0; i<mNumEffects; i++)
40
      {
41
      if( mInterI[i]==null ) continue;    
42
      
43
      if( mInterP[i]!=null ) 
44
        {
45
        mInterP[i].interpolateMain(mUniforms, NUM_UNIFORMS*i+7, mCurrentDuration[i]);
46
      
47
        mUniforms[NUM_UNIFORMS*i+7] = mUniforms[NUM_UNIFORMS*i+7]-mObjHalfX;
48
        mUniforms[NUM_UNIFORMS*i+8] =-mUniforms[NUM_UNIFORMS*i+8]+mObjHalfY;
49
        }
50
        
51
      if( mInterI[i].interpolateMain(mUniforms ,NUM_UNIFORMS*i, mCurrentDuration[i], step) )      
52
        {
53
        for(int j=0; j<mNumListeners; j++)   
54
          EffectMessageSender.newMessage( mListeners.elementAt(j),
55
                                          EffectMessage.EFFECT_FINISHED, 
56
                                         (mID[i]<<EffectTypes.LENGTH)+EffectTypes.VERTEX.type,
57
                                          mType[i], 
58
                                          mBitmapID); 
59
      
60
        if( EffectNames.isUnity(mType[i], mUniforms, NUM_UNIFORMS*i) )
61
          {
62
          remove(i);
63
          i--;
64
          continue;
65
          }
66
        }
67
     
68
      mCurrentDuration[i] += step;
69
      }
70
     
71
    mTime = currTime;  
72
    }  
73
  
74
///////////////////////////////////////////////////////////////////////////////////////////////////
75

    
76
  protected void moveEffect(int index)
77
    {
78
    mUniforms[NUM_UNIFORMS*index  ] = mUniforms[NUM_UNIFORMS*(index+1)  ];
79
    mUniforms[NUM_UNIFORMS*index+1] = mUniforms[NUM_UNIFORMS*(index+1)+1];
80
    mUniforms[NUM_UNIFORMS*index+2] = mUniforms[NUM_UNIFORMS*(index+1)+2];
81
    mUniforms[NUM_UNIFORMS*index+3] = mUniforms[NUM_UNIFORMS*(index+1)+3];
82
    mUniforms[NUM_UNIFORMS*index+4] = mUniforms[NUM_UNIFORMS*(index+1)+4];
83
    mUniforms[NUM_UNIFORMS*index+5] = mUniforms[NUM_UNIFORMS*(index+1)+5];
84
    mUniforms[NUM_UNIFORMS*index+6] = mUniforms[NUM_UNIFORMS*(index+1)+6];
85
    mUniforms[NUM_UNIFORMS*index+7] = mUniforms[NUM_UNIFORMS*(index+1)+7];
86
    mUniforms[NUM_UNIFORMS*index+8] = mUniforms[NUM_UNIFORMS*(index+1)+8];
87
    }
88
   
89
///////////////////////////////////////////////////////////////////////////////////////////////////
90

    
91
  synchronized void send() 
92
    {
93
    GLES20.glUniform1i( mNumEffectsH, mNumEffects);
94
      
95
    if( mNumEffects>0 )
96
      {     
97
      GLES20.glUniform1iv( mTypeH    ,  mNumEffects, mType    ,0);
98
      GLES20.glUniform3fv( mUniformsH,3*mNumEffects, mUniforms,0);
99
      }
100
    }
101

    
102
///////////////////////////////////////////////////////////////////////////////////////////////////
103

    
104
  synchronized void sendZero() 
105
    {
106
    GLES20.glUniform1i( mNumEffectsH, 0);
107
    }
108
  
109
///////////////////////////////////////////////////////////////////////////////////////////////////
110
// Do various post-processing on already computed effects.
111
// 1) here unlike in the fragment queue, we don't have to multiply the points by ModelView matrix because that gets done in the shader.
112
// 2) in case of swirl, pre-compute the sine and cosine of its rotation angle
113
  
114
  void postprocess()
115
    {
116
    double d;  
117
     
118
    for(int i=0; i<mNumEffects; i++)
119
      {      
120
      if( mType[i]==EffectNames.SWIRL.ordinal() )
121
        {
122
        d = Math.PI*mUniforms[NUM_UNIFORMS*i]/180;  
123
        mUniforms[NUM_UNIFORMS*i+1] = (float)Math.sin(d);
124
        mUniforms[NUM_UNIFORMS*i+2] = (float)Math.cos(d);
125
        }
126
      }
127
    }
128
  
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130
  
131
  synchronized long add(EffectNames eln, Interpolator inter, Float4D region, Interpolator2D point)
132
    {
133
    if( mMax[INDEX]>mNumEffects )
134
      {
135
      EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects);    
136
      
137
      mInterI[mNumEffects] = inter;
138
      mInterP[mNumEffects] = point;
139

    
140
      return addPriv(eln,region);
141
      }
142
      
143
    return -1;
144
    }
145
   
146
///////////////////////////////////////////////////////////////////////////////////////////////////
147
  
148
  synchronized long add(EffectNames eln, Interpolator inter, Float4D region, float x, float y)
149
    {
150
    if( mMax[INDEX]>mNumEffects )
151
      {
152
      EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects);    
153
      
154
      mInterI[mNumEffects] = inter;
155
      mInterP[mNumEffects] = null;
156
      mUniforms[NUM_UNIFORMS*mNumEffects+7] = x-mObjHalfX;
157
      mUniforms[NUM_UNIFORMS*mNumEffects+8] =-y+mObjHalfY;  
158
     
159
      return addPriv(eln,region);
160
      }
161
      
162
    return -1;
163
    }
164
 
165
///////////////////////////////////////////////////////////////////////////////////////////////////
166
  
167
  synchronized long add(EffectNames eln, float v1, float v2, float v3, Float4D region, float x, float y)
168
    {
169
    if( mMax[INDEX]>mNumEffects )
170
      {
171
      EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects); 
172
      mUniforms[NUM_UNIFORMS*mNumEffects  ] = v1;
173
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = v2;  
174
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = v3;  
175
     
176
      mInterI[mNumEffects] = null;
177
      mInterP[mNumEffects] = null;
178
      mUniforms[NUM_UNIFORMS*mNumEffects+7] = x-mObjHalfX;
179
      mUniforms[NUM_UNIFORMS*mNumEffects+8] =-y+mObjHalfY;  
180
      
181
      return addPriv(eln,region);    
182
      }
183
      
184
    return -1;
185
    }
186
  
187
///////////////////////////////////////////////////////////////////////////////////////////////////
188
  
189
  private long addPriv(EffectNames eln, Float4D region)
190
    {    
191
    if( region!=null )
192
      {
193
      mUniforms[NUM_UNIFORMS*mNumEffects+3] = region.x;
194
      mUniforms[NUM_UNIFORMS*mNumEffects+4] =-region.y;   // invert y already
195
      mUniforms[NUM_UNIFORMS*mNumEffects+5] = region.z<=0.0f ? 1000*mObjHalfX : region.z;
196
      mUniforms[NUM_UNIFORMS*mNumEffects+6] = region.w;
197
      }
198
    else
199
      {
200
      mUniforms[NUM_UNIFORMS*mNumEffects+3] = 0.0f;
201
      mUniforms[NUM_UNIFORMS*mNumEffects+4] = 0.0f;
202
      mUniforms[NUM_UNIFORMS*mNumEffects+5] = 1000*mObjHalfX;
203
      mUniforms[NUM_UNIFORMS*mNumEffects+6] = 0.0f;
204
      }
205
    
206
    return addBase(eln);
207
    }
208

    
209
///////////////////////////////////////////////////////////////////////////////////////////////////
210
// end of VertexEffect  
211
  }
(16-16/30)