Project

General

Profile

« Previous | Next » 

Revision 406e2f6b

Added by Leszek Koltunski almost 6 years ago

Give users API to render OutputSerfaces and attached Nodes in either the 'normal' way of OIT way.

View differences:

src/main/java/org/distorted/library/main/DistortedNode.java
63 63
  private static HashMap<ArrayList<Long>,NodeData> mMapNodeID = new HashMap<>();
64 64
  private static long mNextNodeID =0;
65 65

  
66
  private boolean mRenderWayOIT;
66 67
  private DistortedNode mParent;
67 68
  private DistortedOutputSurface mSurfaceParent;
68 69
  private MeshObject mMesh;
......
340 341
        DistortedEffects.blitPriv(mData.mFBO);
341 342
        }
342 343

  
343
      numRenders += mData.mFBO.renderChildren(currTime,mNumChildren[0],mChildren,0);
344
      numRenders += mData.mFBO.renderChildren(currTime,mNumChildren[0],mChildren,0, mRenderWayOIT);
344 345
      }
345 346

  
346 347
    return numRenders;
......
403 404
    mNumChildren[0]= 0;
404 405
    mParent        = null;
405 406
    mSurfaceParent = null;
407
    mRenderWayOIT  = false;
406 408

  
407 409
    mFboW            = 0;  // i.e. take this from
408 410
    mFboH            = 0;  // mSurface's dimensions
......
444 446
    mState        = new DistortedRenderState();
445 447
    mParent       = null;
446 448
    mSurfaceParent= null;
449
    mRenderWayOIT = false;
447 450

  
448 451
    mFboW            = node.mFboW;
449 452
    mFboH            = node.mFboH;
......
509 512
    mEffects.newNode(this);
510 513
    }
511 514

  
515
///////////////////////////////////////////////////////////////////////////////////////////////////
516
  /**
517
   * When rendering this Node, should we use the Order Independent Transparency render more?
518
   * <p>
519
   * There are two modes of rendering: the fast 'normal' way, which however renders transparent
520
   * fragments in different ways depending on which fragments get rendered first, or the slower
521
   * 'oit' way, which renders transparent fragments correctly regardless of their order.
522
   *
523
   * @param oit True if we want to render more slowly, but in a way which accounts for transparency.
524
   */
525
  public void setOrderIndependentTransparency(boolean oit)
526
    {
527
    mRenderWayOIT = oit;
528
    }
529

  
512 530
///////////////////////////////////////////////////////////////////////////////////////////////////
513 531
/**
514 532
 * Adds a new child to the last position in the list of our Node's children.
src/main/java/org/distorted/library/main/DistortedOutputSurface.java
54 54

  
55 55
  private ArrayList<DistortedNode> mChildren;
56 56
  private int mNumChildren;   // ==mChildren.length(), but we only create mChildren if the first one gets added
57
  private boolean mRenderWayOIT;
57 58

  
58 59
  private class Job
59 60
    {
......
99 100
    {
100 101
    super(width,height,createColor,numfbos,numcolors,type);
101 102

  
103
    mRenderWayOIT = false;
104

  
102 105
    mDepthStencilH = new int[numfbos];
103 106
    mFBOH          = new int[numfbos];
104 107

  
......
379 382
// Otherwise, render to a buffer and on each change of Postprocessing Bucket, apply the postprocessing
380 383
// to a whole buffer (lastQueue.postprocess) and merge it (this.oitBuild).
381 384

  
382
  int renderChildren(long time, int numChildren, ArrayList<DistortedNode> children, int fbo)
385
  int renderChildren(long time, int numChildren, ArrayList<DistortedNode> children, int fbo, boolean oit)
383 386
    {
384 387
    int quality=0, internalQuality = 0, numRenders = 0, bucketChange = 0;
385 388
    DistortedNode child1, child2;
......
406 409
          if( lastBucket==0 )
407 410
            {
408 411
            clonePostprocessingViewport(this);
409
            oitClear(this);
412

  
413
            if( oit )
414
              {
415
              oitClear(this);
416
              }
410 417
            }
411 418
          else
412 419
            {
......
418 425
              }
419 426

  
420 427
            numRenders += lastQueue.postprocess(mBuffer,fbo);
421
            numRenders += oitBuild(time,mBuffer[quality],fbo);
422
            GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT|GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
428

  
429
            if( oit )
430
              {
431
              numRenders += oitBuild(time, mBuffer[quality], fbo);
432
              GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT | GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
433
              }
434
            else
435
              {
436
              numRenders += blitWithDepth(time, mBuffer[quality],fbo);
437
              }
423 438
            mBuffer[quality].clearBuffer(fbo);
424 439
            }
425 440

  
......
441 456
            }
442 457

  
443 458
          numRenders += currQueue.postprocess(mBuffer,fbo);
444
          numRenders += oitBuild(time,mBuffer[quality],fbo);
445
          GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT|GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
446
          numRenders += oitRender(time,fbo);  // merge the OIT linked list
447
          mBuffer[quality].clearBuffer(fbo);
459

  
460
          if( oit )
461
            {
462
            numRenders += oitBuild(time, mBuffer[quality], fbo);
463
            GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT | GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
464
            numRenders += oitRender(time, fbo);  // merge the OIT linked list
465
            mBuffer[quality].clearBuffer(fbo);
466
            }
467
          else
468
            {
469
            numRenders += blitWithDepth(time, mBuffer[quality],fbo);
470
            }
448 471
          }
449 472
        } // end else (postprocessed child)
450 473

  
......
610 633
      numRenders += mChildren.get(i).renderRecursive(time);
611 634
      }
612 635

  
613
    numRenders += renderChildren(time,mNumChildren,mChildren,fbo);
636
    numRenders += renderChildren(time,mNumChildren,mChildren,fbo, mRenderWayOIT);
614 637

  
615 638
    return numRenders;
616 639
    }
......
824 847
    return (mDepthStencilCreated==CREATED && mDepthStencil==BOTH_DEPTH_STENCIL);
825 848
    }
826 849

  
850
///////////////////////////////////////////////////////////////////////////////////////////////////
851
/**
852
 * When rendering this Node, should we use the Order Independent Transparency render more?
853
 * <p>
854
 * There are two modes of rendering: the fast 'normal' way, which however renders transparent
855
 * fragments in different ways depending on which fragments get rendered first, or the slower
856
 * 'oit' way, which renders transparent fragments correctly regardless of their order.
857
 *
858
 * @param oit True if we want to render more slowly, but in a way which accounts for transparency.
859
 */
860
  public void setOrderIndependentTransparency(boolean oit)
861
    {
862
    mRenderWayOIT = oit;
863
    }
864

  
827 865
///////////////////////////////////////////////////////////////////////////////////////////////////
828 866
/**
829 867
 * Adds a new child to the last position in the list of our Surface's children.

Also available in: Unified diff