Project

General

Profile

« Previous | Next » 

Revision a0397f32

Added by Leszek Koltunski over 5 years ago

Make DistortedEffects oblivious of the effect types.

View differences:

src/main/java/org/distorted/library/main/DistortedChildrenList.java
99 99
  void addSortingByBuckets(DistortedNode newChild)
100 100
    {
101 101
    int i;
102
    long bucket = newChild.getEffects().getPostprocess().getID();
102
    EffectQueue queue = newChild.getEffects().getQueues()[3];
103
    long bucket = queue.getID();
103 104
    boolean sameBucket = false;
104 105

  
105 106
    for(i=0; i<mNumChildren; i++)
106 107
      {
107
      if( mChildren.get(i).getEffects().getPostprocess().getID() == bucket )
108
      queue = mChildren.get(i).getEffects().getQueues()[3];
109

  
110
      if( queue.getID() == bucket )
108 111
        {
109 112
        sameBucket=true;
110 113
        }
src/main/java/org/distorted/library/main/DistortedEffects.java
131 131
  private static long mNextID =0;
132 132
  private long mID;
133 133

  
134
  private EffectQueueMatrix mM;
135
  private EffectQueueFragment mF;
136
  private EffectQueueVertex mV;
137
  private EffectQueuePostprocess mP;
138

  
139
  private boolean matrixCloned, vertexCloned, fragmentCloned, postprocessCloned;
134
  private EffectQueue[] mQueues;
140 135

  
141 136
///////////////////////////////////////////////////////////////////////////////////////////////////
142 137

  
......
154 149
    String enabledEffectV= VertexEffect.getGLSL();
155 150
    String enabledEffectF= FragmentEffect.getGLSL();
156 151

  
157
    //android.util.Log.e("Effects", "vertHeader= "+mainVertHeader);
158
    //android.util.Log.e("Effects", "fragHeader= "+mainFragHeader);
159
    //android.util.Log.e("Effects", "enabledV= "+enabledEffectV);
160
    //android.util.Log.e("Effects", "enabledF= "+enabledEffectF);
161

  
162 152
    String[] feedback = { "v_Position", "v_endPosition" };
163 153

  
164 154
    try
......
173 163
      }
174 164

  
175 165
    int mainProgramH = mMainProgram.getProgramHandle();
176
    EffectQueueFragment.getUniforms(mainProgramH,0);
177
    EffectQueueVertex.getUniforms(mainProgramH,0);
178
    EffectQueueMatrix.getUniforms(mainProgramH,0);
166
    EffectQueue.getUniforms(mainProgramH,0);
179 167
    mMainTextureH= GLES31.glGetUniformLocation( mainProgramH, "u_Texture");
180 168

  
181 169
    // BLIT PROGRAM ////////////////////////////////////
......
267 255
      }
268 256

  
269 257
    int mainOITProgramH = mMainOITProgram.getProgramHandle();
270
    EffectQueueFragment.getUniforms(mainOITProgramH,1);
271
    EffectQueueVertex.getUniforms(mainOITProgramH,1);
272
    EffectQueueMatrix.getUniforms(mainOITProgramH,1);
258
    EffectQueue.getUniforms(mainOITProgramH,1);
273 259
    mMainOITTextureH    = GLES31.glGetUniformLocation( mainOITProgramH, "u_Texture");
274 260
    mMainOITSizeH       = GLES31.glGetUniformLocation( mainOITProgramH, "u_Size");
275 261
    mMainOITNumRecordsH = GLES31.glGetUniformLocation( mainOITProgramH, "u_numRecords");
......
357 343

  
358 344
///////////////////////////////////////////////////////////////////////////////////////////////////
359 345

  
360
  private void initializeEffectLists(DistortedEffects d, int flags)
346
  EffectQueue[] getQueues()
361 347
    {
362
    if( (flags & Distorted.CLONE_MATRIX) != 0 )
363
      {
364
      mM = d.mM;
365
      matrixCloned = true;
366
      }
367
    else
368
      {
369
      mM = new EffectQueueMatrix(mID);
370
      matrixCloned = false;
371
      }
372
    
373
    if( (flags & Distorted.CLONE_VERTEX) != 0 )
374
      {
375
      mV = d.mV;
376
      vertexCloned = true;
377
      }
378
    else
379
      {
380
      mV = new EffectQueueVertex(mID);
381
      vertexCloned = false;
382
      }
383
    
384
    if( (flags & Distorted.CLONE_FRAGMENT) != 0 )
385
      {
386
      mF = d.mF;
387
      fragmentCloned = true;
388
      }
389
    else
390
      {
391
      mF = new EffectQueueFragment(mID);
392
      fragmentCloned = false;
393
      }
394

  
395
    if( (flags & Distorted.CLONE_POSTPROCESS) != 0 )
396
      {
397
      mP = d.mP;
398
      postprocessCloned = true;
399
      }
400
    else
401
      {
402
      mP = new EffectQueuePostprocess(mID);
403
      postprocessCloned = false;
404
      }
405
    }
406
///////////////////////////////////////////////////////////////////////////////////////////////////
407

  
408
  EffectQueueMatrix getMatrix()
409
    {
410
    return mM;
411
    }
412

  
413
///////////////////////////////////////////////////////////////////////////////////////////////////
414

  
415
  EffectQueueVertex getVertex()
416
    {
417
    return mV;
418
    }
419

  
420
///////////////////////////////////////////////////////////////////////////////////////////////////
421

  
422
  EffectQueueFragment getFragment()
423
    {
424
    return mF;
425
    }
426

  
427
///////////////////////////////////////////////////////////////////////////////////////////////////
428

  
429
  EffectQueuePostprocess getPostprocess()
430
    {
431
    return mP;
348
    return mQueues;
432 349
    }
433 350

  
434 351
///////////////////////////////////////////////////////////////////////////////////////////////////
435 352

  
436 353
  void newNode(DistortedNode node)
437 354
    {
438
    mP.newNode(node);
355
    EffectQueue.newNode(mQueues,node);
439 356
    }
440 357

  
441 358
///////////////////////////////////////////////////////////////////////////////////////////////////
442 359

  
443 360
  void removeNode(DistortedNode node)
444 361
    {
445
    mP.removeNode(node);
362
    EffectQueue.removeNode(mQueues,node);
446 363
    }
447 364

  
448 365
///////////////////////////////////////////////////////////////////////////////////////////////////
......
461 378
    GLES31.glBindBufferBase(GLES31.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
462 379

  
463 380
    mNormalProgram.useProgram();
464
    GLES31.glUniformMatrix4fv(mNormalMVPMatrixH, 1, false, mM.getMVP() , 0);
381
    GLES31.glUniformMatrix4fv(mNormalMVPMatrixH, 1, false, EffectQueue.getMVP(mQueues) , 0);
465 382
    mesh.bindTransformAttribs(mNormalProgram);
466 383
    GLES31.glLineWidth(8.0f);
467 384
    GLES31.glDrawArrays(GLES31.GL_LINES, 0, 2*num);
......
473 390
    {
474 391
    float halfZ = halfW*mesh.getZFactor();
475 392

  
476
    mM.compute(currTime);
477
    mV.compute(currTime,halfW,halfH,halfZ);
478
    mF.compute(currTime,halfW,halfH,halfZ);
479
    mP.compute(currTime);
480

  
393
    EffectQueue.compute(mQueues, currTime, halfW, halfH, halfZ );
481 394
    GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
482 395

  
483 396
    mMainOITProgram.useProgram();
......
489 402

  
490 403
    float inflate = mesh.getInflate();
491 404

  
492
    mM.send(surface,halfW,halfH,halfZ,1);
493
    mV.send(inflate,1);
494
    mF.send(1);
495

  
405
    EffectQueue.send(mQueues, surface, inflate, halfW, halfH, halfZ, 1 );
496 406
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() );
497 407

  
498 408
    if( mesh.getShowNormals() )
499 409
      {
500 410
      mMainProgram.useProgram();
501
      mM.send(surface,halfW,halfH,halfZ,0);
502
      mV.send(inflate,0);
503
      mF.send(0);
411
      EffectQueue.send(mQueues, surface, inflate, halfW, halfH, halfZ, 0 );
504 412
      displayNormals(mesh);
505 413
      }
506 414
    }
......
511 419
    {
512 420
    float halfZ = halfW*mesh.getZFactor();
513 421

  
514
    mM.compute(currTime);
515
    mV.compute(currTime,halfW,halfH,halfZ);
516
    mF.compute(currTime,halfW,halfH,halfZ);
517
    mP.compute(currTime);
518

  
422
    EffectQueue.compute(mQueues, currTime, halfW, halfH, halfZ );
519 423
    GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
520

  
521 424
    mMainProgram.useProgram();
522 425
    GLES31.glUniform1i(mMainTextureH, 0);
523

  
524 426
    mesh.bindVertexAttribs(mMainProgram);
525

  
526
    mM.send(surface,halfW,halfH,halfZ,0);
527
    mV.send( mesh.getInflate(),0);
528
    mF.send(0);
529

  
427
    EffectQueue.send(mQueues, surface, mesh.getInflate(), halfW, halfH, halfZ, 0 );
530 428
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.getNumVertices() );
531 429

  
532 430
    if( mesh.getShowNormals() ) displayNormals(mesh);
......
729 627
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4);
730 628
    }
731 629

  
732
///////////////////////////////////////////////////////////////////////////////////////////////////
733

  
734
  private void releasePriv()
735
    {
736
    if( !matrixCloned      ) mM.abortAll(false);
737
    if( !vertexCloned      ) mV.abortAll(false);
738
    if( !fragmentCloned    ) mF.abortAll(false);
739
    if( !postprocessCloned ) mP.abortAll(false);
740

  
741
    mM = null;
742
    mV = null;
743
    mF = null;
744
    mP = null;
745
    }
746

  
747 630
///////////////////////////////////////////////////////////////////////////////////////////////////
748 631

  
749 632
  static void onPause()
......
776 659
  public DistortedEffects()
777 660
    {
778 661
    mID = ++mNextID;
779
    initializeEffectLists(this,0);
662
    mQueues = new EffectQueue[EffectType.LENGTH];
663
    EffectQueue.allocateQueues(mQueues,null,0,mID);
780 664
    }
781 665

  
782 666
///////////////////////////////////////////////////////////////////////////////////////////////////
......
792 676
  public DistortedEffects(DistortedEffects dc, int flags)
793 677
    {
794 678
    mID = ++mNextID;
795
    initializeEffectLists(dc,flags);
796
    }
797

  
798
///////////////////////////////////////////////////////////////////////////////////////////////////
799
/**
800
 * Releases all resources. After this call, the queue should not be used anymore.
801
 */
802
  @SuppressWarnings("unused")
803
  public synchronized void delete()
804
    {
805
    releasePriv();
679
    mQueues = new EffectQueue[EffectType.LENGTH];
680
    EffectQueue.allocateQueues(mQueues,dc.getQueues(),flags,mID);
806 681
    }
807 682

  
808 683
///////////////////////////////////////////////////////////////////////////////////////////////////
......
826 701
  @SuppressWarnings("unused")
827 702
  public void registerForMessages(EffectListener el)
828 703
    {
829
    mM.registerForMessages(el);
830
    mV.registerForMessages(el);
831
    mF.registerForMessages(el);
832
    mP.registerForMessages(el);
704
    for( int i=0; i<EffectType.LENGTH; i++)
705
      {
706
      mQueues[i].registerForMessages(el);
707
      }
833 708
    }
834 709

  
835 710
///////////////////////////////////////////////////////////////////////////////////////////////////
......
841 716
  @SuppressWarnings("unused")
842 717
  public void deregisterForMessages(EffectListener el)
843 718
    {
844
    mM.deregisterForMessages(el);
845
    mV.deregisterForMessages(el);
846
    mF.deregisterForMessages(el);
847
    mP.deregisterForMessages(el);
719
    for( int i=0; i<EffectType.LENGTH; i++)
720
      {
721
      mQueues[i].deregisterForMessages(el);
722
      }
848 723
    }
849 724

  
850 725
///////////////////////////////////////////////////////////////////////////////////////////////////
......
854 729
 */
855 730
  public int abortAllEffects()
856 731
    {
857
    return mM.abortAll(true) + mV.abortAll(true) + mF.abortAll(true) + mP.abortAll(true);
732
    int aborted = 0;
733

  
734
    for( int i=0; i<EffectType.LENGTH; i++)
735
      {
736
      aborted += mQueues[i].abortAll(true);
737
      }
738

  
739
    return aborted;
858 740
    }
859 741

  
860 742
///////////////////////////////////////////////////////////////////////////////////////////////////
......
866 748
 */
867 749
  public int abortByType(EffectType type)
868 750
    {
869
    switch(type)
870
      {
871
      case MATRIX     : return mM.abortAll(true);
872
      case VERTEX     : return mV.abortAll(true);
873
      case FRAGMENT   : return mF.abortAll(true);
874
      case POSTPROCESS: return mP.abortAll(true);
875
      default         : return 0;
876
      }
751
    int num = type.ordinal();
752
    return mQueues[num].abortAll(true);
877 753
    }
878 754

  
879 755
///////////////////////////////////////////////////////////////////////////////////////////////////
......
885 761
 */
886 762
  public int abortById(long id)
887 763
    {
888
    long type = id&EffectType.MASK;
889

  
890
    if( type == EffectType.MATRIX.ordinal()      ) return mM.removeById(id);
891
    if( type == EffectType.VERTEX.ordinal()      ) return mV.removeById(id);
892
    if( type == EffectType.FRAGMENT.ordinal()    ) return mF.removeById(id);
893
    if( type == EffectType.POSTPROCESS.ordinal() ) return mP.removeById(id);
894

  
895
    return 0;
764
    int num = (int)(id&EffectType.MASK);
765
    return mQueues[num].removeById(id);
896 766
    }
897 767

  
898 768
///////////////////////////////////////////////////////////////////////////////////////////////////
......
904 774
 */
905 775
  public int abortEffect(Effect effect)
906 776
    {
907
    switch(effect.getType())
908
      {
909
      case MATRIX     : return mM.removeEffect(effect);
910
      case VERTEX     : return mV.removeEffect(effect);
911
      case FRAGMENT   : return mF.removeEffect(effect);
912
      case POSTPROCESS: return mP.removeEffect(effect);
913
      default         : return 0;
914
      }
777
    int num = effect.getType().ordinal();
778
    return mQueues[num].removeEffect(effect);
915 779
    }
916 780

  
917 781
///////////////////////////////////////////////////////////////////////////////////////////////////
......
923 787
 */
924 788
  public int abortByName(EffectName name)
925 789
    {
926
    switch(name.getType())
927
      {
928
      case MATRIX     : return mM.removeByName(name);
929
      case VERTEX     : return mV.removeByName(name);
930
      case FRAGMENT   : return mF.removeByName(name);
931
      case POSTPROCESS: return mP.removeByName(name);
932
      default                : return 0;
933
      }
790
    int num = name.getType().ordinal();
791
    return mQueues[num].removeByName(name);
934 792
    }
935 793

  
936 794
///////////////////////////////////////////////////////////////////////////////////////////////////
......
979 837
 */
980 838
  public boolean apply(Effect effect)
981 839
    {
982
    switch(effect.getType())
983
      {
984
      case MATRIX      : return mM.add(effect);
985
      case VERTEX      : return mV.add(effect);
986
      case FRAGMENT    : return mF.add(effect);
987
      case POSTPROCESS : return mP.add(effect);
988
      }
989

  
990
    return false;
840
    int num = effect.getType().ordinal();
841
    return mQueues[num].add(effect);
991 842
    }
992 843
  }
src/main/java/org/distorted/library/main/DistortedOutputSurface.java
398 398
    for(int i=0; i<numChildren; i++)
399 399
      {
400 400
      child = children.getChild(i);
401
      currQueue = child.getEffects().getPostprocess();
401
      currQueue = (EffectQueuePostprocess)child.getEffects().getQueues()[3];
402 402
      currBucket= currQueue.getID();
403 403

  
404 404
      if( currBucket==0 )
src/main/java/org/distorted/library/main/EffectQueue.java
96 96
    DistortedMaster.newSlave(this);                     // of uniforms later, on first render.
97 97
    }
98 98

  
99
///////////////////////////////////////////////////////////////////////////////////////////////////
100
// queues - guaranteed to be an array of EffectType.LENGTH length.
101
// Change this when creating a new ty[e of effect!
102

  
103
  static void allocateQueues(EffectQueue[] queues, EffectQueue[] from, int flags, long id)
104
    {
105
    queues[0] = (flags & Distorted.CLONE_MATRIX     ) != 0 ? from[0] : new EffectQueueMatrix(id);
106
    queues[1] = (flags & Distorted.CLONE_VERTEX     ) != 0 ? from[1] : new EffectQueueVertex(id);
107
    queues[2] = (flags & Distorted.CLONE_FRAGMENT   ) != 0 ? from[2] : new EffectQueueFragment(id);
108
    queues[3] = (flags & Distorted.CLONE_POSTPROCESS) != 0 ? from[3] : new EffectQueuePostprocess(id);
109
    }
110

  
111
///////////////////////////////////////////////////////////////////////////////////////////////////
112
// queues - guaranteed to be an array of EffectType.LENGTH length.
113
// Change this when creating a new ty[e of effect!
114

  
115
  static void compute(EffectQueue[] queues, long currTime, float halfW, float halfH, float halfZ )
116
    {
117
    ((EffectQueueMatrix     )queues[0]).compute(currTime);
118
    ((EffectQueueVertex     )queues[1]).compute(currTime,halfW,halfH,halfZ);
119
    ((EffectQueueFragment   )queues[2]).compute(currTime,halfW,halfH,halfZ);
120
    ((EffectQueuePostprocess)queues[3]).compute(currTime);
121
    }
122

  
123
///////////////////////////////////////////////////////////////////////////////////////////////////
124
// queues - guaranteed to be an array of EffectType.LENGTH length.
125
// Change this when creating a new ty[e of effect!
126

  
127
  static void send(EffectQueue[] queues, DistortedOutputSurface surface, float inflate, float halfW, float halfH, float halfZ, int variant )
128
    {
129
    ((EffectQueueMatrix  )queues[0]).send(surface,halfW,halfH,halfZ, variant);
130
    ((EffectQueueVertex  )queues[1]).send(inflate, variant);
131
    ((EffectQueueFragment)queues[2]).send(variant);
132
    }
133

  
134
///////////////////////////////////////////////////////////////////////////////////////////////////
135
// queues - guaranteed to be an array of EffectType.LENGTH length.
136
// Change this when creating a new ty[e of effect!
137

  
138
  static float[] getMVP(EffectQueue[] queues)
139
    {
140
    return ((EffectQueueMatrix  )queues[0]).getMVP();
141
    }
142

  
143
///////////////////////////////////////////////////////////////////////////////////////////////////
144
// queues - guaranteed to be an array of EffectType.LENGTH length.
145
// Change this when creating a new ty[e of effect!
146

  
147
  static void newNode(EffectQueue[] queues, DistortedNode node)
148
    {
149
    queues[3].newNode(node);
150
    }
151

  
152
///////////////////////////////////////////////////////////////////////////////////////////////////
153
// queues - guaranteed to be an array of EffectType.LENGTH length.
154
// Change this when creating a new ty[e of effect!
155

  
156
  static void removeNode(EffectQueue[] queues, DistortedNode node)
157
    {
158
    queues[3].removeNode(node);
159
    }
160

  
161
///////////////////////////////////////////////////////////////////////////////////////////////////
162
// queues - guaranteed to be an array of EffectType.LENGTH length.
163
// Change this when creating a new ty[e of effect!
164

  
165
  static void getUniforms(int programH, int variant)
166
    {
167
    EffectQueueFragment.getUniforms(programH,variant);
168
    EffectQueueVertex  .getUniforms(programH,variant);
169
    EffectQueueMatrix  .getUniforms(programH,variant);
170
    }
171

  
99 172
///////////////////////////////////////////////////////////////////////////////////////////////////
100 173
// Every effect queue has an ID, which should be the same iff two queues hold the same effects.
101 174
// (this is a speedup: then both queues can be applied once, which seriously speeds up stuff -
......
130 203

  
131 204
///////////////////////////////////////////////////////////////////////////////////////////////////
132 205

  
133
  void newNode(DistortedNode node)
206
  private void newNode(DistortedNode node)
134 207
    {
135 208
    if( mNodes==null ) mNodes = new ArrayList<>();
136 209

  
......
139 212

  
140 213
///////////////////////////////////////////////////////////////////////////////////////////////////
141 214

  
142
  void removeNode(DistortedNode node)
215
  private void removeNode(DistortedNode node)
143 216
    {
144 217
    mNodes.remove(node);
145 218
    }
src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
170 170

  
171 171
      mesh.bindVertexAttribs(mPreProgram);
172 172

  
173
      DistortedEffects effects = node.getEffects();
174
      EffectQueueMatrix matrix = effects.getMatrix();
175
      EffectQueueVertex vertex = effects.getVertex();
173
      EffectQueue[] queues = node.getEffects().getQueues();
174
      EffectQueueMatrix matrix = (EffectQueueMatrix)queues[0];
175
      EffectQueueVertex vertex = (EffectQueueVertex)queues[1];
176 176

  
177 177
      float inflate=0.0f;
178 178

  

Also available in: Unified diff