Project

General

Profile

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

library / src / main / java / org / distorted / library / main / DistortedScreen.java @ 2301cb2f

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2018 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.GLES31;
28

    
29
import org.distorted.library.effect.MatrixEffectMove;
30
import org.distorted.library.type.Static3D;
31

    
32
/**
33
 * Class which represents the Screen.
34
 * <p>
35
 * User is able to render to it just like to a DistortedFramebuffer.
36
 */
37
public class DistortedScreen extends DistortedFramebuffer
38
  {
39
  ///// DEBUGGING ONLY /////////////////////////
40
  private boolean mShowFPS;
41

    
42
  private static final int NUM_FRAMES  = 100;
43

    
44
  private MeshObject fpsMesh;
45
  private DistortedTexture fpsTexture;
46
  private DistortedEffects fpsEffects;
47
  private Canvas fpsCanvas;
48
  private Bitmap fpsBitmap;
49
  private Paint mPaint;
50
  private int fpsH, fpsW;
51
  private String fpsString;
52
  private long lastTime=0;
53
  private long[] durations;
54
  private int currDuration;
55
  private static MatrixEffectMove mMoveEffect = new MatrixEffectMove( new Static3D(5,5,0) );
56
  ///// END DEBUGGING //////////////////////////
57

    
58
  private int mCurrFBO, mLastFBO;
59

    
60
///////////////////////////////////////////////////////////////////////////////////////////////////
61
// PUBLIC API
62
///////////////////////////////////////////////////////////////////////////////////////////////////
63
/**
64
 * Create a new Screen. Initially 1x1 in size.
65
 * <p>
66
 * Has to be followed by a 'resize()' to set the size.
67
 */
68
  public DistortedScreen()
69
    {
70
    super(Distorted.FBO_QUEUE_SIZE,1,BOTH_DEPTH_STENCIL, TYPE_SYST, 1,1);
71
    mShowFPS = false;
72
    mCurrFBO = 0;
73
    mLastFBO = 1;
74
    }
75

    
76
///////////////////////////////////////////////////////////////////////////////////////////////////
77
/**
78
 * Draws all the attached children to this OutputSurface.
79
 * <p>
80
 * Must be called from a thread holding OpenGL Context.
81
 *
82
 * @param time Current time, in milliseconds. This will be passed to all the Effects stored in the children Nodes.
83
 * @return Number of objects rendered.
84
 */
85
  public int render(long time)
86
    {
87
    if( ++mCurrFBO>=Distorted.FBO_QUEUE_SIZE ) mCurrFBO=0;
88
    if( ++mLastFBO>=Distorted.FBO_QUEUE_SIZE ) mLastFBO=0;
89

    
90
    if( mShowFPS )
91
      {
92
      if( lastTime==0 ) lastTime = time;
93

    
94
      currDuration++;
95
      if (currDuration >= NUM_FRAMES) currDuration = 0;
96
      durations[NUM_FRAMES] += ((time - lastTime) - durations[currDuration]);
97
      durations[currDuration] = time - lastTime;
98

    
99
      fpsString = "" + ((int)(10000.0f*NUM_FRAMES/durations[NUM_FRAMES]))/10.0f;
100

    
101
      mPaint.setColor(0xffffffff);
102
      fpsCanvas.drawRect(0, 0, fpsW, fpsH, mPaint);
103
      mPaint.setColor(0xff000000);
104
      fpsCanvas.drawText(fpsString, fpsW/2, 0.75f*fpsH, mPaint);
105
      fpsTexture.setTexture(fpsBitmap);
106

    
107
      lastTime = time;
108
      }
109

    
110
    int numrender = super.render(time,mCurrFBO);
111

    
112
    GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0);
113

    
114
    // workaround for the Mali issues: blit the framebuffer we have computed Distorted.FBO_QUEUE_SIZE
115
    // frames ago. Looks like FBO_QUEUE_SIZE=2 solves the issue already but I decided to play it safe and
116
    // make it equal to 3.
117
    // This of course introduces a delay and uses more memory, but it does not appear to have any effect
118
    // on speed. Maybe a slight positive effect if any!
119
    setAsInput(mLastFBO,0);
120

    
121
    GLES31.glColorMask(true,true,true,true);
122
    GLES31.glDepthMask(false);
123
    GLES31.glDisable(GLES31.GL_STENCIL_TEST);
124
    GLES31.glDisable(GLES31.GL_DEPTH_TEST);
125
    GLES31.glDisable(GLES31.GL_BLEND);
126

    
127
    DistortedEffects.blitPriv(this);
128

    
129
    if( mShowFPS && fpsTexture.setAsInput())
130
      {
131
      fpsEffects.drawPriv(fpsW / 2.0f, fpsH / 2.0f, fpsMesh, this, time, 0);
132
      }
133

    
134
    return numrender+1;
135
    }
136

    
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138
/**
139
 * Make the library show Frames Per Second in the upper-left corner.
140
 * <p>
141
 */
142
  public void showFPS()
143
    {
144
    if( !mShowFPS )
145
      {
146
      mShowFPS = true;
147

    
148
      fpsW = 120;
149
      fpsH = 70;
150

    
151
      fpsString = "";
152
      fpsBitmap = Bitmap.createBitmap(fpsW, fpsH, Bitmap.Config.ARGB_8888);
153
      fpsMesh = new MeshFlat(1, 1);
154
      fpsTexture = new DistortedTexture(fpsW, fpsH);
155
      fpsTexture.setTexture(fpsBitmap);
156
      fpsCanvas = new Canvas(fpsBitmap);
157
      fpsEffects = new DistortedEffects();
158
      fpsEffects.apply(mMoveEffect);
159

    
160
      mPaint = new Paint();
161
      mPaint.setAntiAlias(true);
162
      mPaint.setTextAlign(Paint.Align.CENTER);
163
      mPaint.setTextSize(0.7f * fpsH);
164

    
165
      durations = new long[NUM_FRAMES + 1];
166
      currDuration = 0;
167

    
168
      for (int i = 0; i < NUM_FRAMES + 1; i++) durations[i] = 16;  // Assume FPS will be
169
      durations[NUM_FRAMES] = NUM_FRAMES * 16;              // close to 1000/16 ~ 60
170
      }
171
    }
172
  }
(10-10/21)