| 41 | 
  41 | 
  
      private static int[] mMVPMatrixH = new int[Distorted.MAIN_VARIANTS];
 
   | 
  | 42 | 
  42 | 
  
      private static int[] mMVMatrixH  = new int[Distorted.MAIN_VARIANTS];
 
   | 
  | 43 | 
  43 | 
  
    
 
   | 
   | 
  44 | 
  
      private static float[] mTmpMatrix = new float[16];
 
   | 
   | 
  45 | 
  
      private static float[] mTmpResult = new float[4];
 
   | 
   | 
  46 | 
  
      private static float[] mTmpPoint  = new float[4];
 
   | 
   | 
  47 | 
  
      private static float mMinX,mMaxX,mMinY,mMaxY;
 
   | 
   | 
  48 | 
  
    
 
   | 
  | 44 | 
  49 | 
  
    ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   | 
  | 45 | 
  50 | 
  
       
 
   | 
  | 46 | 
  51 | 
  
      EffectQueueMatrix(long id)
 
   | 
  | ... | ... |  | 
  | 57 | 
  62 | 
  
        mMVMatrixH[variant] = GLES31.glGetUniformLocation(mProgramH, "u_MVMatrix");
 
   | 
  | 58 | 
  63 | 
  
        }
 
   | 
  | 59 | 
  64 | 
  
    
 
   | 
   | 
  65 | 
  
    ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   | 
   | 
  66 | 
  
    
 
   | 
   | 
  67 | 
  
      private void magnifyDir()
 
   | 
   | 
  68 | 
  
        {
   | 
   | 
  69 | 
  
        Matrix.multiplyMV(mTmpResult,0,mTmpMatrix,0,mTmpPoint,0);
 
   | 
   | 
  70 | 
  
        float nx = mTmpResult[0]/mTmpResult[3];
 
   | 
   | 
  71 | 
  
        float ny = mTmpResult[1]/mTmpResult[3];
 
   | 
   | 
  72 | 
  
    
 
   | 
   | 
  73 | 
  
        if( nx<mMinX ) mMinX = nx;
 
   | 
   | 
  74 | 
  
        if( nx>mMaxX ) mMaxX = nx;
 
   | 
   | 
  75 | 
  
        if( ny<mMinY ) mMinY = ny;
 
   | 
   | 
  76 | 
  
        if( ny>mMaxY ) mMaxY = ny;
 
   | 
   | 
  77 | 
  
        }
 
   | 
   | 
  78 | 
  
    
 
   | 
   | 
  79 | 
  
    ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   | 
   | 
  80 | 
  
    // return a float which describes how much larger an object must be so that it appears to be (about)
 
   | 
   | 
  81 | 
  
    // 'marginInPixels' pixels larger in each direction. Used in Postprocessing.
 
   | 
   | 
  82 | 
  
    
 
   | 
   | 
  83 | 
  
      float magnify(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels)
 
   | 
   | 
  84 | 
  
        {
   | 
   | 
  85 | 
  
        mMinX = Integer.MAX_VALUE;
 
   | 
   | 
  86 | 
  
        mMaxX = Integer.MIN_VALUE;
 
   | 
   | 
  87 | 
  
        mMinY = Integer.MAX_VALUE;
 
   | 
   | 
  88 | 
  
        mMaxY = Integer.MIN_VALUE;
 
   | 
   | 
  89 | 
  
    
 
   | 
   | 
  90 | 
  
        mTmpPoint[3] = 1.0f;
 
   | 
   | 
  91 | 
  
    
 
   | 
   | 
  92 | 
  
        Matrix.multiplyMM(mTmpMatrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0);
 
   | 
   | 
  93 | 
  
    
 
   | 
   | 
  94 | 
  
        mTmpPoint[0] = +halfX; mTmpPoint[1] = +halfY; mTmpPoint[2] = +halfZ; magnifyDir();
 
   | 
   | 
  95 | 
  
        mTmpPoint[0] = +halfX; mTmpPoint[1] = +halfY; mTmpPoint[2] = -halfZ; magnifyDir();
 
   | 
   | 
  96 | 
  
        mTmpPoint[0] = +halfX; mTmpPoint[1] = -halfY; mTmpPoint[2] = +halfZ; magnifyDir();
 
   | 
   | 
  97 | 
  
        mTmpPoint[0] = +halfX; mTmpPoint[1] = -halfY; mTmpPoint[2] = -halfZ; magnifyDir();
 
   | 
   | 
  98 | 
  
        mTmpPoint[0] = -halfX; mTmpPoint[1] = +halfY; mTmpPoint[2] = +halfZ; magnifyDir();
 
   | 
   | 
  99 | 
  
        mTmpPoint[0] = -halfX; mTmpPoint[1] = +halfY; mTmpPoint[2] = -halfZ; magnifyDir();
 
   | 
   | 
  100 | 
  
        mTmpPoint[0] = -halfX; mTmpPoint[1] = -halfY; mTmpPoint[2] = +halfZ; magnifyDir();
 
   | 
   | 
  101 | 
  
        mTmpPoint[0] = -halfX; mTmpPoint[1] = -halfY; mTmpPoint[2] = -halfZ; magnifyDir();
 
   | 
   | 
  102 | 
  
    
 
   | 
   | 
  103 | 
  
        float xLenInPixels = projection.mWidth *(mMaxX-mMinX)/2;
 
   | 
   | 
  104 | 
  
        float yLenInPixels = projection.mHeight*(mMaxY-mMinY)/2;
 
   | 
   | 
  105 | 
  
    
 
   | 
   | 
  106 | 
  
        // already margin / min(xLen,yLen) is the size of the halo.
 
   | 
   | 
  107 | 
  
        // Here we need a bit more because we are marking not only the halo, but a little bit around
 
   | 
   | 
  108 | 
  
        // it as well so that the (blur for example) will be smooth on the edges. Thus the 2.0f.
 
   | 
   | 
  109 | 
  
        //
 
   | 
   | 
  110 | 
  
        // mMipmap ( 1.0 , 0.5, 0.25, 0.125 ) - we need to make the size of the halo independent
 
   | 
   | 
  111 | 
  
        // of postprocessing effect quality.
 
   | 
   | 
  112 | 
  
    
 
   | 
   | 
  113 | 
  
        return projection.mMipmap*2.0f*marginInPixels/( xLenInPixels>yLenInPixels ? yLenInPixels:xLenInPixels );
 
   | 
   | 
  114 | 
  
        }
 
   | 
   | 
  115 | 
  
    
 
   | 
  | 60 | 
  116 | 
  
    ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   | 
  | 61 | 
  117 | 
  
    
 
   | 
  | 62 | 
  118 | 
  
      void compute(long currTime)
 
   | 
 
Translate the size of the Halo around postprocessed objects from 'number pixels around the object' (as held in the Effects themselves) to a float suitable for Inflating the underlying Mesh with the per-vertex Inflate vectors.