Project

General

Profile

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

library / src / main / java / org / distorted / library / main / EffectQueueMatrix.java @ c41d046c

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