Revision 8a6898dc
Added by Leszek Koltunski about 2 months ago
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
Make it possible to apply Postprocessing effects to only an arbitrary subset of components.