Project

General

Profile

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

library / src / main / java / org / distorted / library / main / EffectQueueMatrix.java @ 9a3607b3

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 e6519ac8 Leszek Koltunski
import android.opengl.GLES31;
23 6a06a912 Leszek Koltunski
import android.opengl.Matrix;
24
25 da9b3f07 Leszek Koltunski
import org.distorted.library.effect.EffectType;
26 fe82a979 Leszek Koltunski
import org.distorted.library.effect.MatrixEffect;
27 e458a4ba Leszek Koltunski
import org.distorted.library.message.EffectMessage;
28 ed06301f Leszek Koltunski
import org.distorted.library.message.EffectMessageSender;
29 a4835695 Leszek Koltunski
30 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
31
32 d07f2950 Leszek Koltunski
class EffectQueueMatrix extends EffectQueue
33 6a06a912 Leszek Koltunski
  {   
34 15aa7d94 Leszek Koltunski
  private static final int NUM_UNIFORMS = MatrixEffect.NUM_UNIFORMS;
35 da9b3f07 Leszek Koltunski
  private static final int INDEX = EffectType.MATRIX.ordinal();
36 1a940548 Leszek Koltunski
37
  private static float[] mMVPMatrix = new float[16];
38
  private static float[] mViewMatrix= new float[16];
39 03aa6c3b Leszek Koltunski
  private static float[] mTmpMatrix = new float[16];
40
  private static float[] mTmpResult = new float[4];
41
  private static float[] mTmpPoint  = new float[4];
42
  private static float mMinx;
43
  private static float mMaxx;
44
  private static float mMiny;
45
  private static float mMaxy;
46 1a940548 Leszek Koltunski
47 86c352e0 Leszek Koltunski
  private static int[] mObjDH      = new int[Distorted.MAIN_VARIANTS];
48
  private static int[] mMVPMatrixH = new int[Distorted.MAIN_VARIANTS];
49
  private static int[] mMVMatrixH  = new int[Distorted.MAIN_VARIANTS];
50 bed13bea leszek
51 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
52
   
53 0a046359 Leszek Koltunski
  EffectQueueMatrix(long id)
54 6a06a912 Leszek Koltunski
    { 
55 15aa7d94 Leszek Koltunski
    super(id,NUM_UNIFORMS,INDEX );
56 6a06a912 Leszek Koltunski
    }
57
58 a8162df9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
59
60 03aa6c3b Leszek Koltunski
  private void magnifyDir()
61
    {
62
    Matrix.multiplyMV(mTmpResult,0,mTmpMatrix,0,mTmpPoint,0);
63
    float nx = mTmpResult[0]/mTmpResult[3];
64
    float ny = mTmpResult[1]/mTmpResult[3];
65
66
    if( nx<mMinx ) mMinx = nx;
67
    if( nx>mMaxx ) mMaxx = nx;
68
    if( ny<mMiny ) mMiny = ny;
69
    if( ny>mMaxy ) mMaxy = ny;
70
    }
71
72
///////////////////////////////////////////////////////////////////////////////////////////////////
73
// modify the ModelView matrix so that the object drawn appears to be (about) 'marginInPixels' pixels
74 bed13bea leszek
// larger in each direction when rendered. Used in Postprocessing.
75 03aa6c3b Leszek Koltunski
76 270c27bc Leszek Koltunski
  private void magnify(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels)
77 a8162df9 Leszek Koltunski
    {
78 03aa6c3b Leszek Koltunski
    mMinx = Integer.MAX_VALUE;
79
    mMaxx = Integer.MIN_VALUE;
80
    mMiny = Integer.MAX_VALUE;
81
    mMaxy = Integer.MIN_VALUE;
82
83
    mTmpPoint[3] = 1.0f;
84
85
    Matrix.multiplyMM(mTmpMatrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0);
86
87
    mTmpPoint[0] = +halfX; mTmpPoint[1] = +halfY; mTmpPoint[2] = +halfZ; magnifyDir();
88
    mTmpPoint[0] = +halfX; mTmpPoint[1] = +halfY; mTmpPoint[2] = -halfZ; magnifyDir();
89
    mTmpPoint[0] = +halfX; mTmpPoint[1] = -halfY; mTmpPoint[2] = +halfZ; magnifyDir();
90
    mTmpPoint[0] = +halfX; mTmpPoint[1] = -halfY; mTmpPoint[2] = -halfZ; magnifyDir();
91
    mTmpPoint[0] = -halfX; mTmpPoint[1] = +halfY; mTmpPoint[2] = +halfZ; magnifyDir();
92
    mTmpPoint[0] = -halfX; mTmpPoint[1] = +halfY; mTmpPoint[2] = -halfZ; magnifyDir();
93
    mTmpPoint[0] = -halfX; mTmpPoint[1] = -halfY; mTmpPoint[2] = +halfZ; magnifyDir();
94
    mTmpPoint[0] = -halfX; mTmpPoint[1] = -halfY; mTmpPoint[2] = -halfZ; magnifyDir();
95
96
    float xlen = projection.mWidth *(mMaxx-mMinx)/2;
97
    float ylen = projection.mHeight*(mMaxy-mMiny)/2;
98 bed13bea leszek
    float scale = 1.0f + 2*marginInPixels/( xlen>ylen ? ylen:xlen );
99 a15631bc leszek
100 a8162df9 Leszek Koltunski
    Matrix.scaleM(mViewMatrix, 0, scale, scale, scale);
101
    }
102
103 02de77c9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
104
105 86c352e0 Leszek Koltunski
  static void getUniforms(int mProgramH, int variant)
106 c1a38ba3 Leszek Koltunski
    {
107 86c352e0 Leszek Koltunski
    mObjDH[variant]     = GLES31.glGetUniformLocation(mProgramH, "u_objD");
108
    mMVPMatrixH[variant]= GLES31.glGetUniformLocation(mProgramH, "u_MVPMatrix");
109
    mMVMatrixH[variant] = GLES31.glGetUniformLocation(mProgramH, "u_MVMatrix");
110 c1a38ba3 Leszek Koltunski
    }
111
112 02de77c9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
113
114 735a8757 Leszek Koltunski
  void compute(long currTime)
115 02de77c9 Leszek Koltunski
    {
116
    if( currTime==mTime ) return;
117
    if( mTime==0 ) mTime = currTime;
118
    long step = (currTime-mTime);
119 15aa7d94 Leszek Koltunski
120 02de77c9 Leszek Koltunski
    for(int i=0; i<mNumEffects; i++)
121
      {
122 3a70bd6d leszek
      mCurrentDuration[i] += step;
123
124 15aa7d94 Leszek Koltunski
      if( mEffects[i].compute(mUniforms, NUM_UNIFORMS*i, mCurrentDuration[i], step) )
125 02de77c9 Leszek Koltunski
        {
126
        for(int j=0; j<mNumListeners; j++)
127 26a4e5f6 leszek
          EffectMessageSender.newMessage( mListeners.get(j), EffectMessage.EFFECT_FINISHED, mEffects[i].getID(), mDistortedEffectsID);
128 02de77c9 Leszek Koltunski
129 da9b3f07 Leszek Koltunski
        if( mEffects[i].isUnity( mUniforms, NUM_UNIFORMS*i) )
130 6b0b4f60 leszek
          {
131 15aa7d94 Leszek Koltunski
          remove(i--);
132 6b0b4f60 leszek
          mNumEffectsToBe--;
133
          }
134 02de77c9 Leszek Koltunski
        }
135
      }
136
     
137
    mTime = currTime;  
138
    }  
139
140 3fc9327a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
141
142
  float[] getMVP()
143
    {
144
    return mMVPMatrix;
145
    }
146
147 02de77c9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
148
149 86c352e0 Leszek Koltunski
  void send(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels, int variant)
150 c1a38ba3 Leszek Koltunski
    {
151
    Matrix.setIdentityM(mViewMatrix, 0);
152
    Matrix.translateM(mViewMatrix, 0, -projection.mWidth/2, projection.mHeight/2, -projection.mDistance);
153
    float mipmap = projection.mMipmap;
154
    if( mipmap!=1 ) Matrix.scaleM(mViewMatrix, 0, mipmap, mipmap, mipmap);
155
156
    for(int i=0; i<mNumEffects; i++) ((MatrixEffect)mEffects[i]).apply(mViewMatrix,mUniforms,i);
157
158
    Matrix.translateM(mViewMatrix, 0, halfX,-halfY,-halfZ);
159
    if( marginInPixels!=0 ) magnify(projection,halfX,halfY,halfZ, marginInPixels);
160
    Matrix.multiplyMM(mMVPMatrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0);
161
162 86c352e0 Leszek Koltunski
    GLES31.glUniform3f( mObjDH[variant] , halfX, halfY, halfZ);
163
    GLES31.glUniformMatrix4fv(mMVMatrixH[variant] , 1, false, mViewMatrix, 0);
164
    GLES31.glUniformMatrix4fv(mMVPMatrixH[variant], 1, false, mMVPMatrix , 0);
165 c1a38ba3 Leszek Koltunski
    }
166 6a06a912 Leszek Koltunski
  }