Project

General

Profile

« Previous | Next » 

Revision 8a6898dc

Added by Leszek Koltunski about 2 months ago

Make it possible to apply Postprocessing effects to only an arbitrary subset of components.

View differences:

src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java
133 133
    mainVertHeader += "#define MAX_COMPON " + MeshBase.getMaxEffComponents() + "\n";
134 134
    if( MeshBase.getUseCenters() )      mainVertHeader += "#define COMP_CENTERS\n";
135 135
    if( DistortedLibrary.isUBOBuggy() ) mainVertHeader += "#define BUGGY_UBOS\n";
136
    mainVertHeader += "#define POSTPROCESS\n";
136 137

  
137 138
    String enabledEffectV= VertexEffect.getGLSL();
138 139

  
src/main/java/org/distorted/library/mesh/DeferredJobs.java
46 46
  private static final int JOB_TYPE_ASSOC        = 7;
47 47
  private static final int JOB_TYPE_CENTER       = 8;
48 48
  private static final int JOB_TYPE_ADD_EMPTY_TEX= 9;
49
  private static final int JOB_TYPE_NOT_AFFECTED = 10;
49 50

  
50 51
  private static final ArrayList<JobNode> mJobs = new ArrayList<>();
51 52

  
......
60 61
    private final Static4D[] mMaps;
61 62
    private final int mComp, mAndAssoc, mEquAssoc;
62 63
    private final float mX,mY,mZ;
64
    private final int[] mComps;
63 65

  
64 66
    private EffectQueueVertex mVertexEffects;
65 67

  
66 68
    Job(int type, MeshBase target, MeshBase[] source, VertexEffect vEff, MatrixEffect mEff,
67
        Static4D[] maps, int comp, int and, int equ, float x, float y, float z)
69
        Static4D[] maps, int comp, int and, int equ, float x, float y, float z, int[] comps)
68 70
      {
69 71
      mType     = type;
70 72
      mTarget   = target;
......
76 78
      mX        = x;
77 79
      mY        = y;
78 80
      mZ        = z;
81
      mComps    = comps;
79 82

  
80 83
      if( vEff!=null )
81 84
        {
......
115 118
                                     break;
116 119
        case JOB_TYPE_ADD_EMPTY_TEX: mTarget.addEmptyTexComponentNow();
117 120
                                     break;
121
        case JOB_TYPE_NOT_AFFECTED:  mTarget.setNotAffectedComponentsNow(mComps);
118 122
        }
119 123
      }
120 124

  
......
137 141
        case JOB_TYPE_ASSOC        : return "ASSOC";
138 142
        case JOB_TYPE_CENTER       : return "CENTER";
139 143
        case JOB_TYPE_ADD_EMPTY_TEX: return "ADD_EMPTY_TEX";
144
        case JOB_TYPE_NOT_AFFECTED : return "POSTPROC COMPS";
140 145
        }
141 146

  
142 147
      return null;
......
243 248

  
244 249
    if( jn==null )
245 250
      {
246
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
251
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0,null);
247 252
      JobNode node = new JobNode(job);
248 253
      mJobs.add(node);
249 254
      return node;
......
257 262
        }
258 263
      else
259 264
        {
260
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
265
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0,null);
261 266
        JobNode node = new JobNode(job);
262 267
        node.mPrevJobs.add(jn);
263 268
        jn.mNextJobs.add(node);
......
272 277
  static JobNode matrix(MeshBase target, MatrixEffect effect, int andAssoc, int ecuAssoc)
273 278
    {
274 279
    JobNode jn = target.mJobNode[0];
275
    Job job = new Job(JOB_TYPE_MATRIX,target,null,null,effect,null,0,andAssoc,ecuAssoc,0,0,0);
280
    Job job = new Job(JOB_TYPE_MATRIX,target,null,null,effect,null,0,andAssoc,ecuAssoc,0,0,0,null);
276 281
    JobNode node = new JobNode(job);
277 282
    node.mPrevJobs.add(jn);
278 283
    jn.mNextJobs.add(node);
......
285 290
  static JobNode mergeTex(MeshBase target)
286 291
    {
287 292
    JobNode jn = target.mJobNode[0];
288
    Job job = new Job(JOB_TYPE_MERGE_TEX,target,null,null,null,null,0,0,0,0,0,0);
293
    Job job = new Job(JOB_TYPE_MERGE_TEX,target,null,null,null,null,0,0,0,0,0,0,null);
289 294
    JobNode node = new JobNode(job);
290 295
    node.mPrevJobs.add(jn);
291 296
    jn.mNextJobs.add(node);
......
298 303
  static JobNode addEmptyTex(MeshBase target)
299 304
    {
300 305
    JobNode jn = target.mJobNode[0];
301
    Job job = new Job(JOB_TYPE_ADD_EMPTY_TEX,target,null,null,null,null,0,0,0,0,0,0);
306
    Job job = new Job(JOB_TYPE_ADD_EMPTY_TEX,target,null,null,null,null,0,0,0,0,0,0,null);
302 307
    JobNode node = new JobNode(job);
303 308
    node.mPrevJobs.add(jn);
304 309
    jn.mNextJobs.add(node);
......
311 316
  static JobNode mergeEff(MeshBase target)
312 317
    {
313 318
    JobNode jn = target.mJobNode[0];
314
    Job job = new Job(JOB_TYPE_MERGE_EFF,target,null,null,null,null,0,0,0,0,0,0);
319
    Job job = new Job(JOB_TYPE_MERGE_EFF,target,null,null,null,null,0,0,0,0,0,0,null);
315 320
    JobNode node = new JobNode(job);
316 321
    node.mPrevJobs.add(jn);
317 322
    jn.mNextJobs.add(node);
......
325 330
    {
326 331
    JobNode jn;
327 332

  
328
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null,null,0,0,0,0,0,0);
333
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null,null,0,0,0,0,0,0,null);
329 334
    JobNode node = new JobNode(job);
330 335

  
331 336
    for (MeshBase mesh : meshes)
......
350 355
    JobNode jn = mesh.mJobNode[0];
351 356
    MeshBase[] meshes = new MeshBase[1];
352 357
    meshes[0] = mesh;
353
    Job job = new Job(JOB_TYPE_COPY,target,meshes,null,null,null,0,0,0,0,0,0);
358
    Job job = new Job(JOB_TYPE_COPY,target,meshes,null,null,null,0,0,0,0,0,0,null);
354 359
    JobNode node = new JobNode(job);
355 360
    node.mPrevJobs.add(jn);
356 361
    jn.mNextJobs.add(node);
......
363 368
  static JobNode textureMap(MeshBase target, Static4D[] maps, int comp)
364 369
    {
365 370
    JobNode jn = target.mJobNode[0];
366
    Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,null,maps,comp,0,0,0,0,0);
371
    Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,null,maps,comp,0,0,0,0,0,null);
367 372
    JobNode node = new JobNode(job);
368 373
    node.mPrevJobs.add(jn);
369 374
    jn.mNextJobs.add(node);
......
376 381
  static JobNode effectAssoc(MeshBase target, int comp, int andAssoc, int equAssoc)
377 382
    {
378 383
    JobNode jn = target.mJobNode[0];
379
    Job job = new Job(JOB_TYPE_ASSOC,target,null,null,null,null,comp,andAssoc,equAssoc,0,0,0);
384
    Job job = new Job(JOB_TYPE_ASSOC,target,null,null,null,null,comp,andAssoc,equAssoc,0,0,0,null);
380 385
    JobNode node = new JobNode(job);
381 386
    node.mPrevJobs.add(jn);
382 387
    jn.mNextJobs.add(node);
......
389 394
  static JobNode componentCenter(MeshBase target, int comp, float x, float y, float z)
390 395
    {
391 396
    JobNode jn = target.mJobNode[0];
392
    Job job = new Job(JOB_TYPE_CENTER,target,null,null,null,null,comp,0,0,x,y,z);
397
    Job job = new Job(JOB_TYPE_CENTER,target,null,null,null,null,comp,0,0,x,y,z,null);
398
    JobNode node = new JobNode(job);
399
    node.mPrevJobs.add(jn);
400
    jn.mNextJobs.add(node);
401
    mJobs.add(node);
402
    return node;
403
    }
404

  
405
///////////////////////////////////////////////////////////////////////////////////////////////////
406

  
407
  static JobNode setNotAffected(MeshBase target, int[] comps)
408
    {
409
    JobNode jn = target.mJobNode[0];
410
    Job job = new Job(JOB_TYPE_NOT_AFFECTED,target,null,null,null,null,0,0,0,0,0,0,comps);
393 411
    JobNode node = new JobNode(job);
394 412
    node.mPrevJobs.add(jn);
395 413
    jn.mNextJobs.add(node);
src/main/java/org/distorted/library/mesh/MeshBase.java
328 328
     mUBA.setEffectAssociationNow(component, andAssociation, equAssociation);
329 329
     }
330 330

  
331
///////////////////////////////////////////////////////////////////////////////////////////////////
332

  
333
   void setNotAffectedComponentsNow(int[] components)
334
     {
335
     mUBA.setNotAffectedComponentsNow(components);
336
     }
337

  
331 338
///////////////////////////////////////////////////////////////////////////////////////////////////
332 339

  
333 340
   void setComponentCenterNow(int component, float x, float y, float z)
......
1334 1341
 * (see main_vertex_shader)
1335 1342
 * The point: this way we can configure the system so that each Vertex Effect acts only on a certain
1336 1343
 * subset of a Mesh, thus potentially significantly reducing the number of render calls.
1344
 * <p>
1345
 * Only the bottom 31 bits of the 'andAssociation' are possible, the top one is taken by Postprocessing
1346
 * Association [i.e. marking which components are disabled when we postprocess]
1337 1347
 */
1338 1348
   public void setEffectAssociation(int component, int andAssociation, int equAssociation)
1339 1349
     {
1340 1350
     if( component>=0 && component<mMaxComponents )
1341 1351
       {
1352
       andAssociation &= 0x7fff;
1353

  
1342 1354
       if( mJobNode[0]==null )
1343 1355
         {
1344 1356
         setEffectAssociationNow(component, andAssociation, equAssociation);
......
1350 1362
       }
1351 1363
     }
1352 1364

  
1365
///////////////////////////////////////////////////////////////////////////////////////////////////
1366
/**
1367
 * Set certain components to be not affected by any subsequent postprocessing.
1368
 * Calling this the second time resets the list. Calling this with null makes all components
1369
 * affected again.
1370
 *
1371
 * @param components list of components which will not be not affected by any Postprocessing.
1372
 */
1373
  public void setComponentsNotAffectedByPostprocessing(int[] components)
1374
    {
1375
    if( mJobNode[0]==null )
1376
      {
1377
      setNotAffectedComponentsNow(components);
1378
      }
1379
    else
1380
      {
1381
      mJobNode[0] = DeferredJobs.setNotAffected(this,components);
1382
      }
1383
    }
1384

  
1353 1385
///////////////////////////////////////////////////////////////////////////////////////////////////
1354 1386
/**
1355 1387
 * Set center of a Component.
src/main/java/org/distorted/library/uniformblock/UniformBlockAssociation.java
112 112
    mUBO.invalidate();
113 113
    }
114 114

  
115
///////////////////////////////////////////////////////////////////////////////////////////////////
116

  
117
  public void setNotAffectedComponentsNow(int[] components)
118
    {
119
    for(int c=0; c<mMax; c++) mAssociations[mStride*c+LOC_AND] &= 0x7fff;
120

  
121
    if( components!=null )
122
      {
123
      for(int c : components) mAssociations[mStride*c+LOC_AND] |= 0x8000;
124
      }
125

  
126
    mUBO.invalidate();
127
    }
128

  
115 129
///////////////////////////////////////////////////////////////////////////////////////////////////
116 130

  
117 131
  public int getIndex()
src/main/res/raw/main_vertex_shader.glsl
130 130
  vec3 v = a_Position + u_Inflate*a_Position;
131 131
#endif
132 132

  
133
#ifdef POSTPROCESS
134
  if( (vComAssoc[component].x & 0x8000) != 0 )
135
    {
136
    v = vec3(0.0, 0.0, 0.0);
137
    }
138
#endif
139

  
133 140
#if NUM_VERTEX>0
134 141
  int effect=0;
142
  int andC = vComAssoc[component].x & 0x7fff;
143
  int equC = vComAssoc[component].y;
135 144

  
136 145
  for(int i=0; i<vNumEffects; i++)
137 146
    {
138
    if( ((vComAssoc[component].x & vProperties[i].y) != 0) || (vComAssoc[component].y == vProperties[i].w) )
147
    if( ((andC & vProperties[i].y) != 0) || (equC == vProperties[i].w) )
139 148
      {
140 149
      // ENABLED EFFECTS WILL BE INSERTED HERE
141 150

  

Also available in: Unified diff