Project

General

Profile

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

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

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
import android.opengl.GLES20;
23
24 e458a4ba Leszek Koltunski
import org.distorted.library.message.EffectMessage;
25 f2fe7e28 Leszek Koltunski
import org.distorted.library.type.Data1D;
26
import org.distorted.library.type.Data2D;
27
import org.distorted.library.type.Data3D;
28
import org.distorted.library.type.Data4D;
29 568b29d8 Leszek Koltunski
import org.distorted.library.type.Dynamic;
30 f2fe7e28 Leszek Koltunski
import org.distorted.library.type.Dynamic1D;
31 568b29d8 Leszek Koltunski
import org.distorted.library.type.Dynamic2D;
32 f2fe7e28 Leszek Koltunski
import org.distorted.library.type.Dynamic4D;
33
import org.distorted.library.type.Static1D;
34 568b29d8 Leszek Koltunski
import org.distorted.library.type.Static2D;
35
import org.distorted.library.type.Static4D;
36 a4835695 Leszek Koltunski
37 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
38
39 d07f2950 Leszek Koltunski
class EffectQueueVertex extends EffectQueue
40 6a06a912 Leszek Koltunski
  { 
41 1e438fc7 Leszek Koltunski
  private static final int NUM_UNIFORMS = 9;
42
  private static final int INDEX = EffectTypes.VERTEX.ordinal();
43 6a06a912 Leszek Koltunski
  private static int mNumEffectsH;
44
  private static int mTypeH;
45
  private static int mUniformsH;
46
  
47
///////////////////////////////////////////////////////////////////////////////////////////////////
48
   
49 d07f2950 Leszek Koltunski
  public EffectQueueVertex(DistortedObject obj)
50 6a06a912 Leszek Koltunski
    { 
51 1e438fc7 Leszek Koltunski
    super(obj,NUM_UNIFORMS,INDEX);
52 6a06a912 Leszek Koltunski
    }
53
54
///////////////////////////////////////////////////////////////////////////////////////////////////
55
56
  static void getUniforms(int mProgramH)
57
    {
58
    mNumEffectsH= GLES20.glGetUniformLocation( mProgramH, "vNumEffects");
59
    mTypeH      = GLES20.glGetUniformLocation( mProgramH, "vType");
60
    mUniformsH  = GLES20.glGetUniformLocation( mProgramH, "vUniforms");
61
    }
62
63
///////////////////////////////////////////////////////////////////////////////////////////////////
64
  
65
  synchronized void compute(long currTime) 
66
    {
67
    if( currTime==mTime ) return;
68
    if( mTime==0 ) mTime = currTime;
69
    long step = (currTime-mTime);
70
   
71
    for(int i=0; i<mNumEffects; i++)
72
      {
73
      if( mInterI[i]==null ) continue;    
74
      
75
      if( mInterP[i]!=null ) 
76
        {
77
        mInterP[i].interpolateMain(mUniforms, NUM_UNIFORMS*i+7, mCurrentDuration[i]);
78
      
79
        mUniforms[NUM_UNIFORMS*i+7] = mUniforms[NUM_UNIFORMS*i+7]-mObjHalfX;
80
        mUniforms[NUM_UNIFORMS*i+8] =-mUniforms[NUM_UNIFORMS*i+8]+mObjHalfY;
81
        }
82
        
83
      if( mInterI[i].interpolateMain(mUniforms ,NUM_UNIFORMS*i, mCurrentDuration[i], step) )      
84
        {
85
        for(int j=0; j<mNumListeners; j++)   
86
          EffectMessageSender.newMessage( mListeners.elementAt(j),
87 e458a4ba Leszek Koltunski
                                          EffectMessage.EFFECT_FINISHED,
88 1e438fc7 Leszek Koltunski
                                         (mID[i]<<EffectTypes.LENGTH)+EffectTypes.VERTEX.type,
89 6a06a912 Leszek Koltunski
                                          mType[i], 
90 c6e1c219 Leszek Koltunski
                                          mBitmapID,
91
                                          null);
92 6a06a912 Leszek Koltunski
      
93
        if( EffectNames.isUnity(mType[i], mUniforms, NUM_UNIFORMS*i) )
94
          {
95
          remove(i);
96
          i--;
97
          continue;
98
          }
99
        }
100
     
101
      mCurrentDuration[i] += step;
102
      }
103
     
104
    mTime = currTime;  
105
    }  
106
  
107
///////////////////////////////////////////////////////////////////////////////////////////////////
108
109
  protected void moveEffect(int index)
110
    {
111
    mUniforms[NUM_UNIFORMS*index  ] = mUniforms[NUM_UNIFORMS*(index+1)  ];
112
    mUniforms[NUM_UNIFORMS*index+1] = mUniforms[NUM_UNIFORMS*(index+1)+1];
113
    mUniforms[NUM_UNIFORMS*index+2] = mUniforms[NUM_UNIFORMS*(index+1)+2];
114
    mUniforms[NUM_UNIFORMS*index+3] = mUniforms[NUM_UNIFORMS*(index+1)+3];
115
    mUniforms[NUM_UNIFORMS*index+4] = mUniforms[NUM_UNIFORMS*(index+1)+4];
116
    mUniforms[NUM_UNIFORMS*index+5] = mUniforms[NUM_UNIFORMS*(index+1)+5];
117
    mUniforms[NUM_UNIFORMS*index+6] = mUniforms[NUM_UNIFORMS*(index+1)+6];
118
    mUniforms[NUM_UNIFORMS*index+7] = mUniforms[NUM_UNIFORMS*(index+1)+7];
119
    mUniforms[NUM_UNIFORMS*index+8] = mUniforms[NUM_UNIFORMS*(index+1)+8];
120
    }
121
   
122
///////////////////////////////////////////////////////////////////////////////////////////////////
123
124
  synchronized void send() 
125
    {
126
    GLES20.glUniform1i( mNumEffectsH, mNumEffects);
127
      
128
    if( mNumEffects>0 )
129
      {     
130
      GLES20.glUniform1iv( mTypeH    ,  mNumEffects, mType    ,0);
131
      GLES20.glUniform3fv( mUniformsH,3*mNumEffects, mUniforms,0);
132
      }
133
    }
134
135
///////////////////////////////////////////////////////////////////////////////////////////////////
136
137
  synchronized void sendZero() 
138
    {
139
    GLES20.glUniform1i( mNumEffectsH, 0);
140
    }
141
  
142
///////////////////////////////////////////////////////////////////////////////////////////////////
143
// Do various post-processing on already computed effects.
144
// 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.
145
// 2) in case of swirl, pre-compute the sine and cosine of its rotation angle
146
  
147
  void postprocess()
148
    {
149
    double d;  
150
     
151
    for(int i=0; i<mNumEffects; i++)
152
      {      
153
      if( mType[i]==EffectNames.SWIRL.ordinal() )
154
        {
155
        d = Math.PI*mUniforms[NUM_UNIFORMS*i]/180;  
156
        mUniforms[NUM_UNIFORMS*i+1] = (float)Math.sin(d);
157
        mUniforms[NUM_UNIFORMS*i+2] = (float)Math.cos(d);
158
        }
159
      }
160
    }
161
  
162
///////////////////////////////////////////////////////////////////////////////////////////////////
163
  
164 f2fe7e28 Leszek Koltunski
  synchronized long add(EffectNames eln, Data3D data, Data2D center, Data4D region)
165 6a06a912 Leszek Koltunski
    {
166 1e438fc7 Leszek Koltunski
    if( mMax[INDEX]>mNumEffects )
167 6a06a912 Leszek Koltunski
      {
168
      EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects);    
169
      
170
      mInterI[mNumEffects] = inter;
171
      mInterP[mNumEffects] = point;
172
173
      return addPriv(eln,region);
174
      }
175
      
176
    return -1;
177
    }
178
   
179
///////////////////////////////////////////////////////////////////////////////////////////////////
180
  
181 f2fe7e28 Leszek Koltunski
  synchronized long add(EffectNames eln, Data3D data, Data2D center)
182 6a06a912 Leszek Koltunski
    {
183 1e438fc7 Leszek Koltunski
    if( mMax[INDEX]>mNumEffects )
184 6a06a912 Leszek Koltunski
      {
185
      EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects);    
186
      
187
      mInterI[mNumEffects] = inter;
188
      mInterP[mNumEffects] = null;
189 a4835695 Leszek Koltunski
      mUniforms[NUM_UNIFORMS*mNumEffects+7] = point.getX()-mObjHalfX;
190
      mUniforms[NUM_UNIFORMS*mNumEffects+8] =-point.getY()+mObjHalfY;
191 6a06a912 Leszek Koltunski
     
192 f2fe7e28 Leszek Koltunski
      return addPriv(eln,null);
193 6a06a912 Leszek Koltunski
      }
194
      
195
    return -1;
196
    }
197
 
198
///////////////////////////////////////////////////////////////////////////////////////////////////
199
  
200 f2fe7e28 Leszek Koltunski
  synchronized long add(EffectNames eln, Data1D data, Data2D center, Data4D region)
201 6a06a912 Leszek Koltunski
    {
202 1e438fc7 Leszek Koltunski
    if( mMax[INDEX]>mNumEffects )
203 6a06a912 Leszek Koltunski
      {
204
      EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects); 
205
      mUniforms[NUM_UNIFORMS*mNumEffects  ] = v1;
206
      mUniforms[NUM_UNIFORMS*mNumEffects+1] = v2;  
207
      mUniforms[NUM_UNIFORMS*mNumEffects+2] = v3;  
208
     
209
      mInterI[mNumEffects] = null;
210
      mInterP[mNumEffects] = null;
211 a4835695 Leszek Koltunski
      mUniforms[NUM_UNIFORMS*mNumEffects+7] = point.getX()-mObjHalfX;
212
      mUniforms[NUM_UNIFORMS*mNumEffects+8] =-point.getY()+mObjHalfY;
213 6a06a912 Leszek Koltunski
      
214
      return addPriv(eln,region);    
215
      }
216
      
217
    return -1;
218
    }
219 f2fe7e28 Leszek Koltunski
220
///////////////////////////////////////////////////////////////////////////////////////////////////
221
// sink, swirl
222
223
  synchronized long add(EffectNames eln, Data1D data, Data2D center)
224
    {
225
    if( mMax[INDEX]>mNumEffects )
226
      {
227
      EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects);
228
229
      if( data instanceof Dynamic1D)
230
        mInterI[mNumEffects] = (Dynamic1D)data;
231
      else if( data instanceof Static1D)
232
        {
233
        mInterI[mNumEffects] = null;
234
        mUniforms[NUM_UNIFORMS*mNumEffects] = ((Static1D)data).getX();
235
        }
236
237
      mUniforms[NUM_UNIFORMS*mNumEffects+7] = point.getX()-mObjHalfX;
238
      mUniforms[NUM_UNIFORMS*mNumEffects+8] =-point.getY()+mObjHalfY;
239
240
      return addPriv(eln,null);
241
      }
242
243
    return -1;
244
    }
245
246 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
247
  
248 f2fe7e28 Leszek Koltunski
  private long addPriv(EffectNames eln, Data4D region)
249 6a06a912 Leszek Koltunski
    {    
250
    if( region!=null )
251
      {
252 f2fe7e28 Leszek Koltunski
      if( region instanceof Dynamic4D)
253
        {
254
        mInterP[mNumEffects] = (Dynamic4D)region;
255
        }
256
      else if ( region instanceof Static4D)
257
        {
258
        Static4D tmp = (Static4D)region;
259
260
        float z = tmp.getZ();
261 a4835695 Leszek Koltunski
262 f2fe7e28 Leszek Koltunski
        mUniforms[NUM_UNIFORMS*mNumEffects+3] = tmp.getX();
263
        mUniforms[NUM_UNIFORMS*mNumEffects+4] =-tmp.getY();   // invert y already
264
        mUniforms[NUM_UNIFORMS*mNumEffects+5] = z<=0.0f ? 1000*mObjHalfX : z;
265
        mUniforms[NUM_UNIFORMS*mNumEffects+6] = tmp.getW();
266
        }
267
      else return -1;
268 6a06a912 Leszek Koltunski
      }
269
    else
270
      {
271
      mUniforms[NUM_UNIFORMS*mNumEffects+3] = 0.0f;
272
      mUniforms[NUM_UNIFORMS*mNumEffects+4] = 0.0f;
273
      mUniforms[NUM_UNIFORMS*mNumEffects+5] = 1000*mObjHalfX;
274
      mUniforms[NUM_UNIFORMS*mNumEffects+6] = 0.0f;
275
      }
276
    
277
    return addBase(eln);
278
    }
279
280
///////////////////////////////////////////////////////////////////////////////////////////////////
281
// end of VertexEffect  
282
  }