Revision 8a6898dc
Added by Leszek Koltunski 11 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.