Project

General

Profile

« Previous | Next » 

Revision a436ccc5

Added by Leszek Koltunski about 7 years ago

1. Make it possible to enable/disable DEPTH test when rendering to a Screen
2. Using this, remove the 'Root' Node from StarWars.

View differences:

src/main/java/org/distorted/library/DistortedFramebuffer.java
30 30
 */
31 31
public class DistortedFramebuffer extends DistortedOutputSurface implements DistortedInputSurface
32 32
  {
33
  private int[] mDepthH = new int[1];
34
  private int[] mFBOH   = new int[1];
35
  private boolean mDepthEnabled;
36 33

  
37 34
///////////////////////////////////////////////////////////////////////////////////////////////////
38 35
// Must be called from a thread holding OpenGL Context
......
160 157
// create 'system' Framebuffers, i.e. those that are used internally by the library.
161 158
// Those do not get removed in onDestroy();
162 159

  
163
  public DistortedFramebuffer(boolean depthEnabled, int width, int height)
160
  DistortedFramebuffer(boolean depthEnabled, int width, int height)
164 161
    {
165
    super(width,height,NOT_CREATED_YET,true);
166
    mDepthEnabled= depthEnabled;
167
    mFBOH[0]     = NOT_CREATED_YET;
168
    mDepthH[0]   = NOT_CREATED_YET;
162
    super(width,height,NOT_CREATED_YET,NOT_CREATED_YET,true, depthEnabled);
169 163
    }
170 164

  
171 165
///////////////////////////////////////////////////////////////////////////////////////////////////
......
181 175
  @SuppressWarnings("unused")
182 176
  public DistortedFramebuffer(int width, int height, boolean depthEnabled)
183 177
    {
184
    super(width,height,NOT_CREATED_YET,false);
185
    mDepthEnabled= depthEnabled;
186
    mFBOH[0]     = NOT_CREATED_YET;
187
    mDepthH[0]   = NOT_CREATED_YET;
178
    super(width,height,NOT_CREATED_YET,NOT_CREATED_YET,false, depthEnabled);
188 179
    }
189 180

  
190 181
///////////////////////////////////////////////////////////////////////////////////////////////////
......
198 189
  @SuppressWarnings("unused")
199 190
  public DistortedFramebuffer(int width, int height)
200 191
    {
201
    super(width,height,NOT_CREATED_YET,false);
202
    mDepthEnabled= false;
203
    mFBOH[0]     = NOT_CREATED_YET;
204
    mDepthH[0]   = NOT_CREATED_YET;
192
    super(width,height,NOT_CREATED_YET,NOT_CREATED_YET,false,false);
205 193
    }
206 194

  
207 195
///////////////////////////////////////////////////////////////////////////////////////////////////
208 196
/**
209 197
 * Bind the underlying rectangle of pixels as a OpenGL Texture.
210 198
 *
211
 * @returns <code>true</code> if successful.
199
 * @return <code>true</code> if successful.
212 200
 */
213 201
  public boolean setAsInput()
214 202
    {
......
221 209
    return false;
222 210
    }
223 211

  
224
///////////////////////////////////////////////////////////////////////////////////////////////////
225
/**
226
 * Bind this Surface as a Framebuffer we can render to.
227
 */
228
  public void setAsOutput()
229
    {
230
    GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, mFBOH[0]);
231

  
232
    if( mDepthH[0]!=NOT_CREATED_YET )
233
      {
234
      GLES30.glEnable(GLES30.GL_DEPTH_TEST);
235
      GLES30.glDepthMask(true);
236
      }
237
    else
238
      {
239
      GLES30.glDisable(GLES30.GL_DEPTH_TEST);
240
      GLES30.glDepthMask(false);
241
      }
242
    }
243

  
244
///////////////////////////////////////////////////////////////////////////////////////////////////
245
/**
246
 * Create a new DEPTH buffer and attach it or (param=false) detach an existing DEPTh attachment and recreate it.
247
 *
248
 * @param enable <bold>true</bold> if we want to attach a new DEPTH buffer to the FBO.<br>
249
 *               <bold>false</bold> if we want to detach the DEPTH attachment.
250
 */
251
  public void enableDepthAttachment(boolean enable)
252
    {
253
    if( mDepthEnabled!=enable )
254
      {
255
      mDepthEnabled = enable;
256
      moveToToDo();
257
      }
258
    }
259

  
260 212
///////////////////////////////////////////////////////////////////////////////////////////////////
261 213
/**
262 214
 * Return the ID of the Texture (COLOR attachment 0) that's backing this FBO.
......
272 224
    {
273 225
    return mColorH[0];
274 226
    }
275

  
276
///////////////////////////////////////////////////////////////////////////////////////////////////
277
/**
278
 * Return true if the FBO contains a DEPTH attachment.
279
 *
280
 * @return <bold>true</bold> if the FBO contains a DEPTH attachment.
281
 */
282
  public boolean hasDepth()
283
    {
284
    return mDepthEnabled;
285
    }
286 227
  }
src/main/java/org/distorted/library/DistortedOutputSurface.java
19 19

  
20 20
package org.distorted.library;
21 21

  
22
import android.opengl.GLES30;
22 23
import android.opengl.Matrix;
23 24
import java.util.ArrayList;
24 25

  
......
34 35
  float mDistance;
35 36
  float[] mProjectionMatrix;
36 37

  
38
  boolean mDepthEnabled;
39
  int[] mDepthH = new int[1];
40
  int[] mFBOH   = new int[1];
41

  
37 42
///////////////////////////////////////////////////////////////////////////////////////////////////
38 43

  
39
  DistortedOutputSurface(int width, int height, int color, boolean system)
44
  DistortedOutputSurface(int width, int height, int color, int fbo, boolean system, boolean depth)
40 45
    {
41 46
    super(width,height,color,system);
42 47

  
......
49 54
    mX   =  0.0f;
50 55
    mY   =  0.0f;
51 56

  
57
    mDepthEnabled= depth;
58
    mFBOH[0]     = fbo;
59
    mDepthH[0]   = color;
60

  
52 61
    createProjection();
53 62
    }
54 63

  
......
136 145
/**
137 146
 * Bind this Surface as a Framebuffer we can render to.
138 147
 */
139
  public abstract void setAsOutput();
148
  public void setAsOutput()
149
    {
150
    GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, mFBOH[0]);
151

  
152
    if( mDepthEnabled && mDepthH[0]!=NOT_CREATED_YET )
153
      {
154
      GLES30.glEnable(GLES30.GL_DEPTH_TEST);
155
      GLES30.glDepthMask(true);
156
      }
157
    else
158
      {
159
      GLES30.glDisable(GLES30.GL_DEPTH_TEST);
160
      GLES30.glDepthMask(false);
161
      }
162
    }
140 163

  
141 164
///////////////////////////////////////////////////////////////////////////////////////////////////
142 165
/**
......
181 204
      }
182 205
    }
183 206

  
207
///////////////////////////////////////////////////////////////////////////////////////////////////
208
/**
209
 * Create a new DEPTH buffer and attach it or (param=false) detach an existing DEPTH attachment and recreate it.
210
 *
211
 * @param enable <bold>true</bold> if we want to attach a new DEPTH buffer to the FBO.<br>
212
 *               <bold>false</bold> if we want to detach the DEPTH attachment.
213
 */
214
  public void enableDepth(boolean enable)
215
    {
216
    if( mDepthEnabled!=enable )
217
      {
218
      mDepthEnabled = enable;
219
      moveToToDo();
220
      }
221
    }
222

  
223
///////////////////////////////////////////////////////////////////////////////////////////////////
224
/**
225
 * Return true if the Surface contains a DEPTH attachment.
226
 *
227
 * @return <bold>true</bold> if the FBO contains a DEPTH attachment.
228
 */
229
  public boolean hasDepth()
230
    {
231
    return mDepthEnabled;
232
    }
233

  
184 234
///////////////////////////////////////////////////////////////////////////////////////////////////
185 235
/**
186 236
 * Adds a new child to the last position in the list of our Surface's children.
src/main/java/org/distorted/library/DistortedScreen.java
19 19

  
20 20
package org.distorted.library;
21 21

  
22
import android.opengl.GLES30;
23

  
24 22
///////////////////////////////////////////////////////////////////////////////////////////////////
25 23
/**
26 24
 * Class which represents the Screen.
......
32 30
///////////////////////////////////////////////////////////////////////////////////////////////////
33 31
// here we don't manage underlying OpenGL assets ourselves
34 32

  
35
  void create()  {}
36
  void delete()  {}
33
  void create()   {}
34
  void delete()   {}
37 35
  void recreate() {}
38 36

  
39 37
///////////////////////////////////////////////////////////////////////////////////////////////////
......
46 44
 */
47 45
  public DistortedScreen()
48 46
    {
49
    super(0,0,DONT_CREATE,false);
50
    }
51

  
52
///////////////////////////////////////////////////////////////////////////////////////////////////
53
/**
54
 * Bind this Surface as a Framebuffer we can render to.
55
 */
56
  public void setAsOutput()
57
    {
58
    GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, 0);
59
    GLES30.glEnable(GLES30.GL_DEPTH_TEST);
60
    GLES30.glDepthMask(true);
47
    super(0,0,DONT_CREATE,0,false,true);
61 48
    }
62 49
  }

Also available in: Unified diff