Project

General

Profile

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

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

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 fe82a979 Leszek Koltunski
package org.distorted.library.main;
21 6a06a912 Leszek Koltunski
22 194ab46f Leszek Koltunski
import android.opengl.GLES30;
23 6a06a912 Leszek Koltunski
24 fe82a979 Leszek Koltunski
import org.distorted.library.effect.Effect;
25
import org.distorted.library.effect.VertexEffect;
26 e458a4ba Leszek Koltunski
import org.distorted.library.message.EffectMessage;
27 d425545a Leszek Koltunski
import org.distorted.library.type.Dynamic3D;
28 f2fe7e28 Leszek Koltunski
import org.distorted.library.type.Dynamic4D;
29 310e14fb leszek
import org.distorted.library.type.Static;
30 f2fe7e28 Leszek Koltunski
import org.distorted.library.type.Static1D;
31 82ee855a Leszek Koltunski
import org.distorted.library.type.Static2D;
32 d425545a Leszek Koltunski
import org.distorted.library.type.Static3D;
33 568b29d8 Leszek Koltunski
import org.distorted.library.type.Static4D;
34 350cc2f5 Leszek Koltunski
import org.distorted.library.type.Static5D;
35 a4835695 Leszek Koltunski
36 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
37
38 d07f2950 Leszek Koltunski
class EffectQueueVertex extends EffectQueue
39 6a06a912 Leszek Koltunski
  { 
40 4fde55a0 Leszek Koltunski
  private static final int NUM_UNIFORMS = 12;
41 0a046359 Leszek Koltunski
  private static final int NUM_CACHE    =  3;
42 310e14fb leszek
  private static final int INDEX = Effect.VERTEX;
43 1aedf874 leszek
  private static int mNumEffectsH;
44
  private static int mTypeH;
45
  private static int mUniformsH;
46 6a06a912 Leszek Koltunski
  
47
///////////////////////////////////////////////////////////////////////////////////////////////////
48
   
49 0a046359 Leszek Koltunski
  EffectQueueVertex(long id)
50 6a06a912 Leszek Koltunski
    { 
51 0a046359 Leszek Koltunski
    super(id,NUM_UNIFORMS,NUM_CACHE,INDEX);
52 6a06a912 Leszek Koltunski
    }
53
54
///////////////////////////////////////////////////////////////////////////////////////////////////
55
56 1aedf874 leszek
  static void getUniforms(int mProgramH)
57 6a06a912 Leszek Koltunski
    {
58 1aedf874 leszek
    mNumEffectsH= GLES30.glGetUniformLocation( mProgramH, "vNumEffects");
59
    mTypeH      = GLES30.glGetUniformLocation( mProgramH, "vType");
60
    mUniformsH  = GLES30.glGetUniformLocation( mProgramH, "vUniforms");
61 6a06a912 Leszek Koltunski
    }
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 3a70bd6d leszek
      mCurrentDuration[i] += step;
74
75 6ddda212 Leszek Koltunski
      if( mInter[0][i]!=null )
76 6a06a912 Leszek Koltunski
        {
77 6ddda212 Leszek Koltunski
        if( mInter[0][i].interpolateMain(mUniforms ,NUM_UNIFORMS*i, mCurrentDuration[i], step) )
78 6a06a912 Leszek Koltunski
          {
79 65d5505f Leszek Koltunski
          postprocess(i);
80
81 6ddda212 Leszek Koltunski
          for(int j=0; j<mNumListeners; j++)
82
            EffectMessageSender.newMessage( mListeners.elementAt(j),
83
                                            EffectMessage.EFFECT_FINISHED,
84 310e14fb leszek
                                           (mID[i]<<Effect.LENGTH)+Effect.VERTEX,
85 6ddda212 Leszek Koltunski
                                            mName[i],
86 cacc63de Leszek Koltunski
                                            mObjectID);
87 6ddda212 Leszek Koltunski
88 310e14fb leszek
          if( VertexEffect.isUnity(mName[i], mUniforms, NUM_UNIFORMS*i) )
89 6ddda212 Leszek Koltunski
            {
90
            remove(i);
91
            i--;
92
            continue;
93
            }
94
          else mInter[0][i] = null;
95
          }
96
        else
97
          {
98
          postprocess(i);
99 6a06a912 Leszek Koltunski
          }
100
        }
101 a595ee16 Leszek Koltunski
102 0a046359 Leszek Koltunski
      if( mInter[1][i]!=null ) mInter[1][i].interpolateMain(mUniforms, NUM_UNIFORMS*i+8, mCurrentDuration[i], step);
103
      if( mInter[2][i]!=null ) mInter[2][i].interpolateMain(mCache   , NUM_CACHE*i     , mCurrentDuration[i], step);
104 6a06a912 Leszek Koltunski
      }
105
     
106
    mTime = currTime;  
107
    }  
108
  
109
///////////////////////////////////////////////////////////////////////////////////////////////////
110
111
  protected void moveEffect(int index)
112
    {
113 4fde55a0 Leszek Koltunski
    mUniforms[NUM_UNIFORMS*index   ] = mUniforms[NUM_UNIFORMS*(index+1)   ];
114
    mUniforms[NUM_UNIFORMS*index+ 1] = mUniforms[NUM_UNIFORMS*(index+1)+ 1];
115
    mUniforms[NUM_UNIFORMS*index+ 2] = mUniforms[NUM_UNIFORMS*(index+1)+ 2];
116
    mUniforms[NUM_UNIFORMS*index+ 3] = mUniforms[NUM_UNIFORMS*(index+1)+ 3];
117
    mUniforms[NUM_UNIFORMS*index+ 4] = mUniforms[NUM_UNIFORMS*(index+1)+ 4];
118 0a046359 Leszek Koltunski
119
    mCache[NUM_CACHE*index  ] = mCache[NUM_CACHE*(index+1)  ];
120
    mCache[NUM_CACHE*index+1] = mCache[NUM_CACHE*(index+1)+1];
121
    mCache[NUM_CACHE*index+2] = mCache[NUM_CACHE*(index+1)+2];
122
123 4fde55a0 Leszek Koltunski
    mUniforms[NUM_UNIFORMS*index+ 8] = mUniforms[NUM_UNIFORMS*(index+1)+ 8];
124
    mUniforms[NUM_UNIFORMS*index+ 9] = mUniforms[NUM_UNIFORMS*(index+1)+ 9];
125
    mUniforms[NUM_UNIFORMS*index+10] = mUniforms[NUM_UNIFORMS*(index+1)+10];
126
    mUniforms[NUM_UNIFORMS*index+11] = mUniforms[NUM_UNIFORMS*(index+1)+11];
127 6a06a912 Leszek Koltunski
    }
128
   
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130
131 1aedf874 leszek
  synchronized void send(float halfX, float halfY, float halfZ)
132 6a06a912 Leszek Koltunski
    {
133 1aedf874 leszek
    GLES30.glUniform1i( mNumEffectsH, mNumEffects);
134 6a06a912 Leszek Koltunski
      
135
    if( mNumEffects>0 )
136 0a046359 Leszek Koltunski
      {
137
      for(int i=0; i<mNumEffects; i++)
138
        {
139
        mUniforms[NUM_UNIFORMS*i+5] = mCache[NUM_CACHE*i  ]-halfX;
140
        mUniforms[NUM_UNIFORMS*i+6] =-mCache[NUM_CACHE*i+1]+halfY;
141
        mUniforms[NUM_UNIFORMS*i+7] = mCache[NUM_CACHE*i+2]-halfZ;
142
        }
143
144 1aedf874 leszek
      GLES30.glUniform1iv( mTypeH    ,                 mNumEffects, mName    ,0);
145
      GLES30.glUniform4fv( mUniformsH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
146 6a06a912 Leszek Koltunski
      }
147
    }
148
149
///////////////////////////////////////////////////////////////////////////////////////////////////
150
// Do various post-processing on already computed effects.
151
// 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.
152 350cc2f5 Leszek Koltunski
// 2) in case of SWIRL, switch the angles from degrees to radians
153 82ee855a Leszek Koltunski
// 3) likewise in case of WAVE and PINCH
154 5b1c0f47 Leszek Koltunski
// 4) In case of DISTORT, invert the Y-axis
155 6a06a912 Leszek Koltunski
  
156 350cc2f5 Leszek Koltunski
  private void postprocess(int effect)
157 6a06a912 Leszek Koltunski
    {
158 310e14fb leszek
    if( mName[effect]==VertexEffect.SWIRL )
159 6ddda212 Leszek Koltunski
      {
160 5b1c0f47 Leszek Koltunski
      mUniforms[NUM_UNIFORMS*effect  ] = (float)(Math.PI*mUniforms[NUM_UNIFORMS*effect  ]/180);
161 6ddda212 Leszek Koltunski
      }
162 310e14fb leszek
    if( mName[effect]==VertexEffect.PINCH )
163 82ee855a Leszek Koltunski
      {
164
      mUniforms[NUM_UNIFORMS*effect+1] = (float)(Math.PI*mUniforms[NUM_UNIFORMS*effect+1]/180);
165
      }
166 310e14fb leszek
    if( mName[effect]==VertexEffect.WAVE )
167 6ddda212 Leszek Koltunski
      {
168 d0c902b8 Leszek Koltunski
      mUniforms[NUM_UNIFORMS*effect+2] = (float)(Math.PI*mUniforms[NUM_UNIFORMS*effect+2]/180);
169 5b1c0f47 Leszek Koltunski
      mUniforms[NUM_UNIFORMS*effect+3] = (float)(Math.PI*mUniforms[NUM_UNIFORMS*effect+3]/180);
170 350cc2f5 Leszek Koltunski
      mUniforms[NUM_UNIFORMS*effect+4] = (float)(Math.PI*mUniforms[NUM_UNIFORMS*effect+4]/180);
171 6a06a912 Leszek Koltunski
      }
172 310e14fb leszek
    if( mName[effect]==VertexEffect.DISTORT )
173 a7067deb Leszek Koltunski
      {
174
      mUniforms[NUM_UNIFORMS*effect+1] =-mUniforms[NUM_UNIFORMS*effect+1];
175
      }
176 6a06a912 Leszek Koltunski
    }
177 02ef26bc Leszek Koltunski
178 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
179 d425545a Leszek Koltunski
180 310e14fb leszek
  synchronized long add(VertexEffect ve)
181 6a06a912 Leszek Koltunski
    {
182 1e438fc7 Leszek Koltunski
    if( mMax[INDEX]>mNumEffects )
183 6a06a912 Leszek Koltunski
      {
184 310e14fb leszek
      if( ve.mDynamic0 != null )
185 bdb341bc Leszek Koltunski
        {
186 310e14fb leszek
        mInter[0][mNumEffects] = ve.mDynamic0;
187 bdb341bc Leszek Koltunski
        }
188 310e14fb leszek
      else
189 d425545a Leszek Koltunski
        {
190
        mInter[0][mNumEffects] = null;
191 02ef26bc Leszek Koltunski
192 310e14fb leszek
        if( ve.mStatic0 != null )
193
          {
194
          Static s = ve.mStatic0;
195 350cc2f5 Leszek Koltunski
196 310e14fb leszek
          switch( s.getDimension() )
197
            {
198
            case 5 : mUniforms[NUM_UNIFORMS*mNumEffects + 4] = ((Static5D)s).getV();
199
            case 4 : mUniforms[NUM_UNIFORMS*mNumEffects + 3] = ((Static4D)s).getW();
200
            case 3 : mUniforms[NUM_UNIFORMS*mNumEffects + 2] = ((Static3D)s).getZ();
201
            case 2 : mUniforms[NUM_UNIFORMS*mNumEffects + 1] = ((Static2D)s).getY();
202
            case 1 : mUniforms[NUM_UNIFORMS*mNumEffects    ] = ((Static1D)s).getX();
203
            }
204
          }
205 d425545a Leszek Koltunski
        }
206
207 310e14fb leszek
      if( ve.mRegion!=null )
208 bdb341bc Leszek Koltunski
        {
209 310e14fb leszek
        if( ve.mRegion instanceof Dynamic4D)
210
          {
211
          mInter[1][mNumEffects] = (Dynamic4D)ve.mRegion;
212
          }
213
        else if ( ve.mRegion instanceof Static4D)
214
          {
215
          Static4D tmp = (Static4D)ve.mRegion;
216 f2fe7e28 Leszek Koltunski
217 310e14fb leszek
          float z = tmp.getZ();
218 f2fe7e28 Leszek Koltunski
219 310e14fb leszek
          mUniforms[NUM_UNIFORMS*mNumEffects+ 8] = tmp.getX();
220
          mUniforms[NUM_UNIFORMS*mNumEffects+ 9] =-tmp.getY();   // invert y already
221
          mUniforms[NUM_UNIFORMS*mNumEffects+10] = z<=0.0f ? Float.MAX_VALUE : z;
222
          mUniforms[NUM_UNIFORMS*mNumEffects+11] = tmp.getW();
223
          mInter[1][mNumEffects] = null;
224
          }
225
        else return -1;
226 bdb341bc Leszek Koltunski
        }
227 310e14fb leszek
      else
228 f2fe7e28 Leszek Koltunski
        {
229 310e14fb leszek
        mUniforms[NUM_UNIFORMS*mNumEffects+ 8] = 0.0f;
230
        mUniforms[NUM_UNIFORMS*mNumEffects+ 9] = 0.0f;
231
        mUniforms[NUM_UNIFORMS*mNumEffects+10] = Float.MAX_VALUE;
232
        mUniforms[NUM_UNIFORMS*mNumEffects+11] = 0.0f;
233
        mInter[1][mNumEffects] = null;
234 f2fe7e28 Leszek Koltunski
        }
235
236 310e14fb leszek
      if( ve.mCenter instanceof Dynamic3D)
237 82ee855a Leszek Koltunski
        {
238 310e14fb leszek
        mInter[2][mNumEffects] = (Dynamic3D)ve.mCenter;
239 82ee855a Leszek Koltunski
        }
240 310e14fb leszek
      else if( ve.mCenter instanceof Static3D)
241 82ee855a Leszek Koltunski
        {
242 310e14fb leszek
        mInter[2][mNumEffects] = null;
243
        mCache[NUM_CACHE*mNumEffects  ] = ((Static3D)ve.mCenter).getX();
244
        mCache[NUM_CACHE*mNumEffects+1] = ((Static3D)ve.mCenter).getY();
245
        mCache[NUM_CACHE*mNumEffects+2] = ((Static3D)ve.mCenter).getZ();
246 82ee855a Leszek Koltunski
        }
247
248 310e14fb leszek
      long ret= addBase(ve);
249 82ee855a Leszek Koltunski
250 310e14fb leszek
      postprocess(mNumEffects-1); //addBase just incremented mNumEffects
251 82ee855a Leszek Koltunski
252 310e14fb leszek
      return ret;
253 82ee855a Leszek Koltunski
      }
254
255
    return -1;
256
    }
257 6a06a912 Leszek Koltunski
  }