Project

General

Profile

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

library / src / main / java / org / distorted / library / main / DistortedScreen.java @ 5f35f1cb

1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
package org.distorted.library.main;
21

    
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23

    
24
import android.graphics.Bitmap;
25
import android.graphics.Canvas;
26
import android.graphics.Paint;
27
import android.opengl.GLES30;
28

    
29
import org.distorted.library.effect.MatrixEffectMove;
30
import org.distorted.library.effect.MatrixEffectScale;
31
import org.distorted.library.mesh.MeshQuad;
32
import org.distorted.library.type.Static3D;
33

    
34
/**
35
 * Class which represents the Screen.
36
 * <p>
37
 * User is able to render to it just like to a DistortedFramebuffer.
38
 */
39
public class DistortedScreen extends DistortedFramebuffer
40
  {
41
  ///// DEBUGGING ONLY /////////////////////////
42
  private static final int NUM_FRAMES  = 100;
43
  private static final int DEBUG_W     = 150;
44
  private static final int DEBUG_H     =  70;
45

    
46
  private static final int DEBUG_MODE_NONE = 0;
47
  private static final int DEBUG_MODE_FPS  = 1;
48
  private static final int DEBUG_MODE_FRAME= 2;
49

    
50
  private int mDebugMode;
51
  private boolean mDebugAllocated;
52

    
53
  private MeshQuad debugMesh;
54
  private DistortedTexture debugTexture;
55
  private DistortedEffects debugEffects;
56
  private Canvas debugCanvas;
57
  private Bitmap debugBitmap;
58
  private Paint mPaint;
59
  private String debugString;
60
  private long lastTime=0;
61
  private long[] durations;
62
  private int currDuration;
63
  private int frameNumber;
64
  private static Static3D mMoveVector = new Static3D(0,0,0);
65
  private static MatrixEffectMove mMoveEffect = new MatrixEffectMove(mMoveVector);
66
  ///// END DEBUGGING //////////////////////////
67

    
68
  private int mQueueSize;
69
  private int mCurRenderedFBO;    // During the first FBO_QUEUE_SIZE frames, we blit the very first
70
  private int mToBeBlittedFBO;    // FBO one we have rendered. Then, we keep blitting the one we
71
  private boolean mFirstCircle;   // rendered FBO_QUEUE_SIZE ago.
72

    
73
///////////////////////////////////////////////////////////////////////////////////////////////////
74
// PUBLIC API
75
///////////////////////////////////////////////////////////////////////////////////////////////////
76
/**
77
 * Create a new Screen. Initially 1x1 in size.
78
 * <p>
79
 * Has to be followed by a 'resizeFBO()' to set the size.
80
 */
81
  public DistortedScreen()
82
    {
83
    super(DistortedLibrary.WAIT_FOR_FBO_QUEUE_SIZE,1,BOTH_DEPTH_STENCIL, TYPE_SYST, 1,1);
84
    mDebugMode = DEBUG_MODE_NONE;
85
    mCurRenderedFBO = 0;
86
    mToBeBlittedFBO = 0;
87
    mFirstCircle = true;
88
    mDebugAllocated = false;
89
    mQueueSize = -1;
90
    }
91

    
92
///////////////////////////////////////////////////////////////////////////////////////////////////
93

    
94
   private void allocateDebug()
95
     {
96
     if( !mDebugAllocated )
97
       {
98
       mDebugAllocated = true;
99

    
100
       debugString = "";
101
       debugBitmap = Bitmap.createBitmap(DEBUG_W, DEBUG_H, Bitmap.Config.ARGB_8888);
102
       debugMesh = new MeshQuad();
103
       debugTexture = new DistortedTexture();
104
       debugTexture.setTexture(debugBitmap);
105
       debugCanvas = new Canvas(debugBitmap);
106
       debugEffects = new DistortedEffects();
107
       debugEffects.apply( new MatrixEffectScale( new Static3D(DEBUG_W,DEBUG_H,1) ) );
108
       debugEffects.apply(mMoveEffect);
109

    
110
       mPaint = new Paint();
111
       mPaint.setAntiAlias(true);
112
       mPaint.setTextAlign(Paint.Align.CENTER);
113
       mPaint.setTextSize(0.7f * DEBUG_H);
114
       }
115
     }
116

    
117
///////////////////////////////////////////////////////////////////////////////////////////////////
118
/**
119
 * Draws all the attached children to this OutputSurface.
120
 * <p>
121
 * Must be called from a thread holding OpenGL Context.
122
 *
123
 * @param time Current time, in milliseconds. This will be passed to all the Effects stored in the children Nodes.
124
 * @return Number of objects rendered.
125
 */
126
  public int render(long time)
127
    {
128
    if( mDebugMode!=DEBUG_MODE_NONE )
129
      {
130
      if( lastTime==0 ) lastTime = time;
131

    
132
      if( mDebugMode==DEBUG_MODE_FPS )
133
        {
134
        currDuration++;
135
        if (currDuration >= NUM_FRAMES) currDuration = 0;
136
        durations[NUM_FRAMES] += ((time - lastTime) - durations[currDuration]);
137
        durations[currDuration] = time - lastTime;
138

    
139
        debugString = "" + ((int)(10000.0f*NUM_FRAMES/durations[NUM_FRAMES]))/10.0f;
140
        }
141
      else if( mDebugMode==DEBUG_MODE_FRAME )
142
        {
143
        debugString = "" + frameNumber;
144
        frameNumber++;
145
        }
146

    
147
      mPaint.setColor(0xffffffff);
148
      debugCanvas.drawRect(0, 0, DEBUG_W, DEBUG_H, mPaint);
149
      mPaint.setColor(0xff000000);
150
      debugCanvas.drawText(debugString, 0.5f*DEBUG_W, 0.75f*DEBUG_H, mPaint);
151
      debugTexture.setTexture(debugBitmap);
152

    
153
      mMoveVector.set( (-mWidth+DEBUG_W)/2 +5, (mHeight-DEBUG_H)/2 -5, 0);
154

    
155
      lastTime = time;
156
      }
157

    
158
    int numrender = super.render(time,mCurRenderedFBO);
159

    
160
    GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, 0);
161

    
162
    // workaround for the Mali issues: blit the framebuffer we have computed DistortedLibrary.FBO_QUEUE_SIZE
163
    // frames ago. Looks like FBO_QUEUE_SIZE=2 solves the issue already but I decided to play it safe and
164
    // make it equal to 3.
165
    // This of course introduces a delay and uses more memory, but it does not appear to have any effect
166
    // on speed. Maybe a slight positive effect if any!
167
    setAsInput(mToBeBlittedFBO,0);
168

    
169
    GLES30.glColorMask(true,true,true,true);
170
    GLES30.glDepthMask(false);
171
    GLES30.glDisable(GLES30.GL_STENCIL_TEST);
172
    GLES30.glDisable(GLES30.GL_DEPTH_TEST);
173
    GLES30.glDisable(GLES30.GL_BLEND);
174

    
175
    DistortedLibrary.blitPriv(this);
176

    
177
    if( mDebugMode!=DEBUG_MODE_NONE && debugTexture.setAsInput())
178
      {
179
      DistortedLibrary.drawPriv(debugEffects, debugMesh, this, time);
180
      }
181

    
182
    if( mQueueSize<=0 )
183
      {
184
      mQueueSize = DistortedLibrary.getQueueSize();
185
      }
186

    
187
    if( ++mCurRenderedFBO>=mQueueSize )
188
      {
189
      mCurRenderedFBO = 0;
190
      if (mFirstCircle) mFirstCircle = false;
191
      }
192
    if( !mFirstCircle && ++mToBeBlittedFBO>=mQueueSize )
193
      {
194
      mToBeBlittedFBO=0;
195
      }
196

    
197
    return numrender+1;
198
    }
199

    
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201
/**
202
 * Make the library show Frames Per Second in the upper-left corner.
203
 * <p>
204
 */
205
  public void showFPS()
206
    {
207
    if( mDebugMode!=DEBUG_MODE_FPS )
208
      {
209
      allocateDebug();
210
      mDebugMode = DEBUG_MODE_FPS;
211

    
212
      durations = new long[NUM_FRAMES + 1];
213
      currDuration = 0;
214

    
215
      for (int i=0; i<NUM_FRAMES+1; i++) durations[i] = 16;  // Assume FPS will be
216
      durations[NUM_FRAMES] = NUM_FRAMES * 16;               // close to 1000/16 ~ 60
217
      }
218
    }
219

    
220
///////////////////////////////////////////////////////////////////////////////////////////////////
221
/**
222
 * Make the library show current frame number in the upper-left corner.
223
 * <p>
224
 */
225
  public void showFrameNumber()
226
    {
227
    if( mDebugMode!=DEBUG_MODE_FRAME )
228
      {
229
      allocateDebug();
230
      mDebugMode = DEBUG_MODE_FRAME;
231
      frameNumber = 0;
232
      }
233
    }
234
  }
(5-5/14)