Project

General

Profile

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

library / src / main / java / org / distorted / library / EffectQueueFragment.java @ 50642a86

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 194ab46f Leszek Koltunski
import android.opengl.GLES30;
23 6a06a912 Leszek Koltunski
24 e458a4ba Leszek Koltunski
import org.distorted.library.message.EffectMessage;
25 2fce34f4 Leszek Koltunski
import org.distorted.library.type.Data1D;
26 8c893ffc Leszek Koltunski
import org.distorted.library.type.Data3D;
27 2fce34f4 Leszek Koltunski
import org.distorted.library.type.Data4D;
28 568b29d8 Leszek Koltunski
import org.distorted.library.type.Dynamic1D;
29 8c893ffc Leszek Koltunski
import org.distorted.library.type.Dynamic3D;
30 2fce34f4 Leszek Koltunski
import org.distorted.library.type.Dynamic4D;
31
import org.distorted.library.type.Static1D;
32 568b29d8 Leszek Koltunski
import org.distorted.library.type.Static3D;
33
import org.distorted.library.type.Static4D;
34 a4835695 Leszek Koltunski
35 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
36
37 d07f2950 Leszek Koltunski
class EffectQueueFragment extends EffectQueue
38 6a06a912 Leszek Koltunski
  {
39 2fce34f4 Leszek Koltunski
  private static final int NUM_UNIFORMS = 8;
40 0a046359 Leszek Koltunski
  private static final int NUM_CACHE    = 4;
41 1e438fc7 Leszek Koltunski
  private static final int INDEX = EffectTypes.FRAGMENT.ordinal();
42 6a06a912 Leszek Koltunski
  private static int mNumEffectsH;
43
  private static int mTypeH;
44
  private static int mUniformsH;
45
  
46
///////////////////////////////////////////////////////////////////////////////////////////////////
47
   
48 0a046359 Leszek Koltunski
  EffectQueueFragment(long id)
49 6a06a912 Leszek Koltunski
    { 
50 0a046359 Leszek Koltunski
    super(id,NUM_UNIFORMS,NUM_CACHE,INDEX);
51 6a06a912 Leszek Koltunski
    }
52
53
///////////////////////////////////////////////////////////////////////////////////////////////////
54
55
  static void getUniforms(int mProgramH)
56
    {
57 194ab46f Leszek Koltunski
    mNumEffectsH= GLES30.glGetUniformLocation( mProgramH, "fNumEffects");
58
    mTypeH      = GLES30.glGetUniformLocation( mProgramH, "fType");
59
    mUniformsH  = GLES30.glGetUniformLocation( mProgramH, "fUniforms");
60 6a06a912 Leszek Koltunski
    }
61
62
///////////////////////////////////////////////////////////////////////////////////////////////////
63
  
64
  synchronized void compute(long currTime) 
65
    { 
66
    if( currTime==mTime ) return;
67
    if( mTime==0 ) mTime = currTime;
68
    long step = (currTime-mTime);
69
   
70
    for(int i=0; i<mNumEffects; i++)
71
      {
72 3a70bd6d leszek
      mCurrentDuration[i] += step;
73
74 a595ee16 Leszek Koltunski
      if( mInter[0][i]!=null && mInter[0][i].interpolateMain(mUniforms ,NUM_UNIFORMS*i, mCurrentDuration[i], step) )
75 6a06a912 Leszek Koltunski
        {
76
        for(int j=0; j<mNumListeners; j++)   
77
          EffectMessageSender.newMessage( mListeners.elementAt(j),
78 e458a4ba Leszek Koltunski
                                          EffectMessage.EFFECT_FINISHED,
79 1e438fc7 Leszek Koltunski
                                          (mID[i]<<EffectTypes.LENGTH)+EffectTypes.FRAGMENT.type,
80 e8c81a8e Leszek Koltunski
                                          mName[i],
81 cacc63de Leszek Koltunski
                                          mObjectID);
82 6a06a912 Leszek Koltunski
      
83 e8c81a8e Leszek Koltunski
        if( EffectNames.isUnity(mName[i], mUniforms, NUM_UNIFORMS*i) )
84 6a06a912 Leszek Koltunski
          {
85
          remove(i);
86
          i--;
87
          continue;
88
          }
89 e8c81a8e Leszek Koltunski
        else mInter[0][i] = null;
90 6a06a912 Leszek Koltunski
        }
91 a595ee16 Leszek Koltunski
92 0a046359 Leszek Koltunski
      if( mInter[1][i]!=null ) mInter[1][i].interpolateMain( mCache   , NUM_CACHE*i     , mCurrentDuration[i], step);
93
      if( mInter[2][i]!=null ) mInter[2][i].interpolateMain( mUniforms, NUM_UNIFORMS*i+1, mCurrentDuration[i], step);
94 6a06a912 Leszek Koltunski
      }
95
   
96
    mTime = currTime;  
97
    }
98
99
///////////////////////////////////////////////////////////////////////////////////////////////////
100
101
  protected void moveEffect(int index)
102
    {
103
    mUniforms[NUM_UNIFORMS*index  ] = mUniforms[NUM_UNIFORMS*(index+1)  ];
104
    mUniforms[NUM_UNIFORMS*index+1] = mUniforms[NUM_UNIFORMS*(index+1)+1];
105 77fcb24d Leszek Koltunski
    mUniforms[NUM_UNIFORMS*index+2] = mUniforms[NUM_UNIFORMS*(index+1)+2];
106
    mUniforms[NUM_UNIFORMS*index+3] = mUniforms[NUM_UNIFORMS*(index+1)+3];
107
108 0a046359 Leszek Koltunski
    mCache[NUM_CACHE*index  ] = mCache[NUM_CACHE*(index+1)  ];
109
    mCache[NUM_CACHE*index+1] = mCache[NUM_CACHE*(index+1)+1];
110
    mCache[NUM_CACHE*index+2] = mCache[NUM_CACHE*(index+1)+2];
111
    mCache[NUM_CACHE*index+3] = mCache[NUM_CACHE*(index+1)+3];
112 6a06a912 Leszek Koltunski
    }
113
  
114
///////////////////////////////////////////////////////////////////////////////////////////////////
115
  
116 881652a7 Leszek Koltunski
  synchronized void send(float halfX, float halfY)
117 6a06a912 Leszek Koltunski
    {
118 194ab46f Leszek Koltunski
    GLES30.glUniform1i( mNumEffectsH, mNumEffects);
119 0a046359 Leszek Koltunski
120 6a06a912 Leszek Koltunski
    if( mNumEffects>0 )
121 0a046359 Leszek Koltunski
      {
122
      for(int i=0; i<mNumEffects; i++)
123
        {
124
        mUniforms[NUM_UNIFORMS*i+4] = mCache[NUM_CACHE*i  ]-halfX;
125
        mUniforms[NUM_UNIFORMS*i+5] =-mCache[NUM_CACHE*i+1]+halfY;
126
        mUniforms[NUM_UNIFORMS*i+6] = mCache[NUM_CACHE*i+2];
127
        mUniforms[NUM_UNIFORMS*i+7] = mCache[NUM_CACHE*i+3];
128
        }
129
130 194ab46f Leszek Koltunski
      GLES30.glUniform1iv( mTypeH    ,                 mNumEffects, mName    ,0);
131
      GLES30.glUniform4fv( mUniformsH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
132 6a06a912 Leszek Koltunski
      }  
133
    }
134
135
///////////////////////////////////////////////////////////////////////////////////////////////////
136 42e08626 Leszek Koltunski
// alpha, brightness, contrast, saturation
137 2fce34f4 Leszek Koltunski
138
  synchronized long add(EffectNames eln, Data1D data)
139 6a06a912 Leszek Koltunski
    {
140 1e438fc7 Leszek Koltunski
    if( mMax[INDEX]>mNumEffects )
141 6a06a912 Leszek Koltunski
      {
142
      EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects); 
143 a4835695 Leszek Koltunski
144 2fce34f4 Leszek Koltunski
      if( data instanceof Dynamic1D)
145 bdb341bc Leszek Koltunski
        {
146 d425545a Leszek Koltunski
        mInter[0][mNumEffects] = (Dynamic1D)data;
147 bdb341bc Leszek Koltunski
        }
148 2fce34f4 Leszek Koltunski
      else if( data instanceof Static1D )
149 a4835695 Leszek Koltunski
        {
150 d425545a Leszek Koltunski
        mInter[0][mNumEffects] = null;
151 2fce34f4 Leszek Koltunski
        mUniforms[NUM_UNIFORMS*mNumEffects] = ((Static1D)data).getX();
152 a4835695 Leszek Koltunski
        }
153 2fce34f4 Leszek Koltunski
      else return -1;
154 a4835695 Leszek Koltunski
155 d425545a Leszek Koltunski
      mInter[1][mNumEffects] = null;
156 0a046359 Leszek Koltunski
      mCache[NUM_CACHE*mNumEffects+2] = Float.MAX_VALUE;
157
      mCache[NUM_CACHE*mNumEffects+3] = Float.MAX_VALUE;
158 a4835695 Leszek Koltunski
159 8c893ffc Leszek Koltunski
      mInter[2][mNumEffects] = null;
160
161 6a06a912 Leszek Koltunski
      return addBase(eln); 
162
      }
163
      
164
    return -1;
165
    }
166
  
167
///////////////////////////////////////////////////////////////////////////////////////////////////
168 42e08626 Leszek Koltunski
// alpha, brightness, contrast, saturation
169 6a06a912 Leszek Koltunski
170 2fce34f4 Leszek Koltunski
  synchronized long add(EffectNames eln, Data1D data, Data4D region)
171 6a06a912 Leszek Koltunski
    {
172 1e438fc7 Leszek Koltunski
    if( mMax[INDEX]>mNumEffects )
173 6a06a912 Leszek Koltunski
      {
174 2fce34f4 Leszek Koltunski
      EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects);
175 a4835695 Leszek Koltunski
176 2fce34f4 Leszek Koltunski
      if( data instanceof Dynamic1D)
177 bdb341bc Leszek Koltunski
        {
178 d425545a Leszek Koltunski
        mInter[0][mNumEffects] = (Dynamic1D)data;
179 bdb341bc Leszek Koltunski
        }
180 2fce34f4 Leszek Koltunski
      else if( data instanceof Static1D )
181 a4835695 Leszek Koltunski
        {
182 d425545a Leszek Koltunski
        mInter[0][mNumEffects] = null;
183 2fce34f4 Leszek Koltunski
        mUniforms[NUM_UNIFORMS*mNumEffects] = ((Static1D)data).getX();
184 a4835695 Leszek Koltunski
        }
185 2fce34f4 Leszek Koltunski
      else return -1;
186 a4835695 Leszek Koltunski
187 2fce34f4 Leszek Koltunski
      if( region instanceof Dynamic4D)
188 bdb341bc Leszek Koltunski
        {
189 d425545a Leszek Koltunski
        mInter[1][mNumEffects] = (Dynamic4D)region;
190 bdb341bc Leszek Koltunski
        }
191 2fce34f4 Leszek Koltunski
      else if( region instanceof Static4D )
192
        {
193 d425545a Leszek Koltunski
        mInter[1][mNumEffects]  = null;
194 0a046359 Leszek Koltunski
        mCache[NUM_CACHE*mNumEffects  ] = ((Static4D)region).getX();
195
        mCache[NUM_CACHE*mNumEffects+1] = ((Static4D)region).getY();
196
        mCache[NUM_CACHE*mNumEffects+2] = ((Static4D)region).getZ();
197
        mCache[NUM_CACHE*mNumEffects+3] = ((Static4D)region).getW();
198 a4835695 Leszek Koltunski
        }
199 2fce34f4 Leszek Koltunski
      else return -1;
200 a4835695 Leszek Koltunski
201 8c893ffc Leszek Koltunski
      mInter[2][mNumEffects] = null;
202
203 6a06a912 Leszek Koltunski
      return addBase(eln);
204
      }
205
      
206
    return -1;
207
    }
208
  
209
///////////////////////////////////////////////////////////////////////////////////////////////////
210 2fce34f4 Leszek Koltunski
// chroma
211
212 8c893ffc Leszek Koltunski
  synchronized long add(EffectNames eln, Data1D level, Data3D color, Data4D region)
213 6a06a912 Leszek Koltunski
    {
214 1e438fc7 Leszek Koltunski
    if( mMax[INDEX]>mNumEffects )
215 6a06a912 Leszek Koltunski
      {
216 2fce34f4 Leszek Koltunski
      EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects);
217 a4835695 Leszek Koltunski
218 2fce34f4 Leszek Koltunski
      if( level instanceof Dynamic1D)
219 bdb341bc Leszek Koltunski
        {
220 d425545a Leszek Koltunski
        mInter[0][mNumEffects] = (Dynamic1D)level;
221 bdb341bc Leszek Koltunski
        }
222 2fce34f4 Leszek Koltunski
      else if( level instanceof Static1D )
223 a4835695 Leszek Koltunski
        {
224 d425545a Leszek Koltunski
        mInter[0][mNumEffects] = null;
225 2fce34f4 Leszek Koltunski
        mUniforms[NUM_UNIFORMS*mNumEffects] = ((Static1D)level).getX();
226 a4835695 Leszek Koltunski
        }
227 2fce34f4 Leszek Koltunski
      else return -1;
228 a4835695 Leszek Koltunski
229 8c893ffc Leszek Koltunski
      if( color instanceof Dynamic3D)
230
        {
231
        mInter[2][mNumEffects] = (Dynamic3D)color;
232
        }
233
      else if( color instanceof Static3D )
234
        {
235
        mInter[2][mNumEffects] = null;
236
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static3D)color).getX();
237
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static3D)color).getY();
238
        mUniforms[NUM_UNIFORMS*mNumEffects+3] = ((Static3D)color).getZ();
239
        }
240
      else return -1;
241 2fce34f4 Leszek Koltunski
242
      if( region instanceof Dynamic4D)
243 bdb341bc Leszek Koltunski
        {
244 d425545a Leszek Koltunski
        mInter[1][mNumEffects] = (Dynamic4D)region;
245 bdb341bc Leszek Koltunski
        }
246 2fce34f4 Leszek Koltunski
      else if( region instanceof Static4D )
247
        {
248 d425545a Leszek Koltunski
        mInter[1][mNumEffects]  = null;
249 0a046359 Leszek Koltunski
        mCache[NUM_CACHE*mNumEffects  ] = ((Static4D)region).getX();
250
        mCache[NUM_CACHE*mNumEffects+1] = ((Static4D)region).getY();
251
        mCache[NUM_CACHE*mNumEffects+2] = ((Static4D)region).getZ();
252
        mCache[NUM_CACHE*mNumEffects+3] = ((Static4D)region).getW();
253 a4835695 Leszek Koltunski
        }
254 2fce34f4 Leszek Koltunski
      else return -1;
255 a4835695 Leszek Koltunski
256 6a06a912 Leszek Koltunski
      return addBase(eln); 
257
      }
258
      
259
    return -1;
260
    }
261
  
262
///////////////////////////////////////////////////////////////////////////////////////////////////
263 2fce34f4 Leszek Koltunski
// chroma
264 6a06a912 Leszek Koltunski
265 8c893ffc Leszek Koltunski
  synchronized long add(EffectNames eln, Data1D level, Data3D color)
266 6a06a912 Leszek Koltunski
    {
267 1e438fc7 Leszek Koltunski
    if( mMax[INDEX]>mNumEffects )
268 6a06a912 Leszek Koltunski
      {
269 2fce34f4 Leszek Koltunski
      EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects);
270 a4835695 Leszek Koltunski
271 2fce34f4 Leszek Koltunski
      if( level instanceof Dynamic1D)
272 bdb341bc Leszek Koltunski
        {
273 d425545a Leszek Koltunski
        mInter[0][mNumEffects] = (Dynamic1D)level;
274 bdb341bc Leszek Koltunski
        }
275 2fce34f4 Leszek Koltunski
      else if( level instanceof Static1D )
276 a4835695 Leszek Koltunski
        {
277 d425545a Leszek Koltunski
        mInter[0][mNumEffects] = null;
278 2fce34f4 Leszek Koltunski
        mUniforms[NUM_UNIFORMS*mNumEffects] = ((Static1D)level).getX();
279 a4835695 Leszek Koltunski
        }
280 2fce34f4 Leszek Koltunski
      else return -1;
281 a4835695 Leszek Koltunski
282 8c893ffc Leszek Koltunski
      if( color instanceof Dynamic3D)
283 a4835695 Leszek Koltunski
        {
284 8c893ffc Leszek Koltunski
        mInter[2][mNumEffects] = (Dynamic3D)color;
285 a4835695 Leszek Koltunski
        }
286 8c893ffc Leszek Koltunski
      else if( color instanceof Static3D )
287 a4835695 Leszek Koltunski
        {
288 8c893ffc Leszek Koltunski
        mInter[2][mNumEffects] = null;
289
        mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static3D)color).getX();
290
        mUniforms[NUM_UNIFORMS*mNumEffects+2] = ((Static3D)color).getY();
291
        mUniforms[NUM_UNIFORMS*mNumEffects+3] = ((Static3D)color).getZ();
292 a4835695 Leszek Koltunski
        }
293 2fce34f4 Leszek Koltunski
      else return -1;
294 a4835695 Leszek Koltunski
295 77fcb24d Leszek Koltunski
      mInter[1][mNumEffects]  = null;
296 0a046359 Leszek Koltunski
      mCache[NUM_CACHE*mNumEffects+2] = Float.MAX_VALUE;
297
      mCache[NUM_CACHE*mNumEffects+3] = Float.MAX_VALUE;
298 a4835695 Leszek Koltunski
299 6a06a912 Leszek Koltunski
      return addBase(eln);
300
      }
301 8c893ffc Leszek Koltunski
       
302 6a06a912 Leszek Koltunski
    return -1;
303
    }
304 8c893ffc Leszek Koltunski
305 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
306
// end of FragmentEffect   
307
  }