Project

General

Profile

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

library / src / main / java / org / distorted / library / EffectQueueVertex.java @ c6e1c219

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
                                          null);
60
      
61
        if( EffectNames.isUnity(mType[i], mUniforms, NUM_UNIFORMS*i) )
62
          {
63
          remove(i);
64
          i--;
65
          continue;
66
          }
67
        }
68
     
69
      mCurrentDuration[i] += step;
70
      }
71
     
72
    mTime = currTime;  
73
    }  
74
  
75
///////////////////////////////////////////////////////////////////////////////////////////////////
76

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

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

    
103
///////////////////////////////////////////////////////////////////////////////////////////////////
104

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

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

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