79 |
79 |
|
80 |
80 |
private ArrayList<Job> mJobs = new ArrayList<>();
|
81 |
81 |
|
82 |
|
// buffers used for postprocessing.
|
83 |
|
private DistortedOutputSurface[] mBuffer;
|
|
82 |
// Global buffers used for postprocessing.
|
|
83 |
private static DistortedOutputSurface[] mBuffer = new DistortedOutputSurface[1+EffectQuality.LENGTH];
|
84 |
84 |
|
85 |
85 |
private long mTime;
|
86 |
86 |
private float mFOV;
|
... | ... | |
170 |
170 |
mClearStencil = 0;
|
171 |
171 |
mClear = GLES31.GL_DEPTH_BUFFER_BIT | GLES31.GL_COLOR_BUFFER_BIT;
|
172 |
172 |
|
173 |
|
mBuffer = new DistortedOutputSurface[1+EffectQuality.LENGTH];
|
174 |
|
|
175 |
173 |
mMipmap = 1.0f;
|
176 |
174 |
|
177 |
175 |
createProjection();
|
... | ... | |
289 |
287 |
|
290 |
288 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
291 |
289 |
|
292 |
|
private void createBuffers()
|
|
290 |
private static void createBuffers(int width, int height, float near)
|
293 |
291 |
{
|
294 |
292 |
float mipmap=1.0f;
|
295 |
293 |
|
296 |
294 |
for(int j=0; j<EffectQuality.LENGTH; j++)
|
297 |
295 |
{
|
298 |
|
mBuffer[j] = new DistortedFramebuffer(2,BOTH_DEPTH_STENCIL,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
|
|
296 |
mBuffer[j] = new DistortedFramebuffer(2,BOTH_DEPTH_STENCIL,TYPE_SYST, (int)(width*mipmap), (int)(height*mipmap) );
|
299 |
297 |
mBuffer[j].mMipmap = mipmap;
|
300 |
|
mBuffer[j].mNear = mNear; // copy mNear as well (for blitting- see PostprocessEffect.apply() )
|
|
298 |
mBuffer[j].mNear = near; // copy mNear as well (for blitting- see PostprocessEffect.apply() )
|
301 |
299 |
mBuffer[j].glClearColor(1.0f,1.0f,1.0f,0.0f);
|
302 |
300 |
|
303 |
301 |
mipmap *= EffectQuality.MULTIPLIER;
|
304 |
302 |
}
|
305 |
303 |
|
306 |
|
mBuffer[EffectQuality.LENGTH] = this;
|
307 |
|
|
308 |
304 |
DistortedObject.toDo(); // create the FBOs immediately. This is safe as we must be holding the OpenGL context now.
|
309 |
305 |
|
310 |
306 |
GLES31.glStencilMask(0xff);
|
... | ... | |
326 |
322 |
|
327 |
323 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
328 |
324 |
|
329 |
|
private void cloneSize(DistortedOutputSurface from)
|
|
325 |
static synchronized void onDestroy()
|
330 |
326 |
{
|
331 |
|
mWidth = from.mWidth;
|
332 |
|
mHeight= from.mHeight;
|
333 |
|
|
334 |
|
createProjection();
|
|
327 |
for(int j=0; j<=EffectQuality.LENGTH; j++)
|
|
328 |
{
|
|
329 |
mBuffer[j] = null;
|
|
330 |
}
|
|
331 |
}
|
335 |
332 |
|
336 |
|
int maxw = mWidth >mRealWidth ? mWidth :mRealWidth ;
|
337 |
|
int maxh = mHeight>mRealHeight ? mHeight:mRealHeight;
|
|
333 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
338 |
334 |
|
339 |
|
if( maxw>mRealWidth || maxh>mRealHeight )
|
|
335 |
private static void cloneViewport(DistortedOutputSurface from)
|
|
336 |
{
|
|
337 |
if( mBuffer[EffectQuality.LENGTH] != from )
|
340 |
338 |
{
|
341 |
|
mRealWidth = maxw;
|
342 |
|
mRealHeight= maxh;
|
|
339 |
mBuffer[EffectQuality.LENGTH]=from;
|
|
340 |
DistortedOutputSurface surface;
|
|
341 |
|
|
342 |
for(int i=0; i<EffectQuality.LENGTH; i++)
|
|
343 |
{
|
|
344 |
surface = mBuffer[i];
|
|
345 |
|
|
346 |
surface.mWidth = (int)(from.mWidth *surface.mMipmap);
|
|
347 |
surface.mHeight = (int)(from.mHeight*surface.mMipmap);
|
|
348 |
|
|
349 |
surface.mNear = from.mNear; // Near plane is independent of the mipmap level
|
|
350 |
|
|
351 |
surface.createProjection();
|
|
352 |
|
|
353 |
int maxw = surface.mWidth > surface.mRealWidth ? surface.mWidth : surface.mRealWidth;
|
|
354 |
int maxh = surface.mHeight > surface.mRealHeight ? surface.mHeight : surface.mRealHeight;
|
343 |
355 |
|
344 |
|
recreateSurface();
|
345 |
|
createSurface();
|
|
356 |
if (maxw > surface.mRealWidth || maxh > surface.mRealHeight)
|
|
357 |
{
|
|
358 |
surface.mRealWidth = maxw;
|
|
359 |
surface.mRealHeight = maxh;
|
|
360 |
|
|
361 |
surface.recreateSurface();
|
|
362 |
surface.createSurface();
|
|
363 |
}
|
|
364 |
}
|
346 |
365 |
}
|
347 |
366 |
}
|
348 |
367 |
|
... | ... | |
404 |
423 |
if( currBucket==0 ) numRenders += child1.draw(time,this);
|
405 |
424 |
else
|
406 |
425 |
{
|
407 |
|
if( mBuffer[0]==null ) createBuffers();
|
|
426 |
if( mBuffer[0]==null ) createBuffers(mWidth,mHeight,mNear);
|
408 |
427 |
|
409 |
428 |
if( lastBucket!=currBucket )
|
410 |
429 |
{
|
... | ... | |
423 |
442 |
internalQuality = currQueue.getInternalQuality();
|
424 |
443 |
quality = currQueue.getQuality();
|
425 |
444 |
bucketChange = i;
|
|
445 |
|
|
446 |
cloneViewport(this);
|
426 |
447 |
}
|
427 |
448 |
|
428 |
449 |
child1.draw(time,mBuffer[quality]);
|
... | ... | |
565 |
586 |
{
|
566 |
587 |
android.util.Log.d("surface", "id " + mSurfaceID +
|
567 |
588 |
(mType == TYPE_USER ? " USER" : (mType == TYPE_SYST ? " SYST" : " TREE")) +
|
568 |
|
"viewport: (" + mWidth + "x" + mHeight + ") last frame: " + (value - mLastValue[mLastIndex])
|
|
589 |
" viewport: (" + mWidth + "x" + mHeight + ") last frame: " + (value - mLastValue[mLastIndex])
|
569 |
590 |
+ " avg: " + (mAvgSum/RUNNING_AVERAGE)
|
570 |
591 |
);
|
571 |
592 |
}
|
Make the postprocessing buffers static.