Revision 7a9edb92
Added by Leszek Koltunski over 4 years ago
src/main/java/org/distorted/library/mesh/DeferredJobs.java | ||
---|---|---|
45 | 45 |
private static final int JOB_TYPE_COPY = 5; |
46 | 46 |
private static final int JOB_TYPE_TEXTURE = 6; |
47 | 47 |
private static final int JOB_TYPE_ASSOC = 7; |
48 |
private static final int JOB_TYPE_CENTER = 8; |
|
48 | 49 |
|
49 | 50 |
private static ArrayList<JobNode> mJobs = new ArrayList<>(); |
50 | 51 |
|
... | ... | |
59 | 60 |
private MatrixEffect mMatrixEffect; |
60 | 61 |
private Static4D[] mMaps; |
61 | 62 |
private int mComp, mAndAssoc, mEquAssoc; |
63 |
private float mX,mY,mZ; |
|
62 | 64 |
|
63 |
Job(int type, MeshBase target, MeshBase[] source, VertexEffect vEff, MatrixEffect mEff, Static4D[] maps, int comp, int and, int equ) |
|
65 |
Job(int type, MeshBase target, MeshBase[] source, VertexEffect vEff, MatrixEffect mEff, Static4D[] maps, int comp, int and, int equ, float x, float y, float z)
|
|
64 | 66 |
{ |
65 | 67 |
mType = type; |
66 | 68 |
mTarget = target; |
... | ... | |
69 | 71 |
mComp = comp; |
70 | 72 |
mAndAssoc = and; |
71 | 73 |
mEquAssoc = equ; |
74 |
mX = x; |
|
75 |
mY = y; |
|
76 |
mZ = z; |
|
72 | 77 |
|
73 | 78 |
if( vEff!=null ) |
74 | 79 |
{ |
... | ... | |
104 | 109 |
break; |
105 | 110 |
case JOB_TYPE_ASSOC : mTarget.setEffectAssociationNow(mComp,mAndAssoc,mEquAssoc); |
106 | 111 |
break; |
112 |
case JOB_TYPE_CENTER : mTarget.setComponentCenterNow(mComp,mX,mY,mZ); |
|
113 |
break; |
|
107 | 114 |
} |
108 | 115 |
/* |
109 | 116 |
Log.e("jobs", "executing "+print()+" job"); |
... | ... | |
128 | 135 |
case JOB_TYPE_COPY : return "COPY"; |
129 | 136 |
case JOB_TYPE_TEXTURE : return "TEXTURE"; |
130 | 137 |
case JOB_TYPE_ASSOC : return "ASSOC"; |
138 |
case JOB_TYPE_CENTER : return "CENTER"; |
|
131 | 139 |
} |
132 | 140 |
|
133 | 141 |
return null; |
... | ... | |
231 | 239 |
|
232 | 240 |
if( jn==null ) |
233 | 241 |
{ |
234 |
Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0); |
|
242 |
Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
|
|
235 | 243 |
JobNode node = new JobNode(job); |
236 | 244 |
mJobs.add(node); |
237 | 245 |
return node; |
... | ... | |
245 | 253 |
} |
246 | 254 |
else |
247 | 255 |
{ |
248 |
Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0); |
|
256 |
Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
|
|
249 | 257 |
JobNode node = new JobNode(job); |
250 | 258 |
node.mPrevJobs.add(jn); |
251 | 259 |
jn.mNextJobs.add(node); |
... | ... | |
260 | 268 |
static JobNode matrix(MeshBase target, MatrixEffect effect, int andAssoc, int ecuAssoc) |
261 | 269 |
{ |
262 | 270 |
JobNode jn = target.mJobNode[0]; |
263 |
Job job = new Job(JOB_TYPE_MATRIX,target,null,null,effect,null,0,andAssoc,ecuAssoc); |
|
271 |
Job job = new Job(JOB_TYPE_MATRIX,target,null,null,effect,null,0,andAssoc,ecuAssoc,0,0,0);
|
|
264 | 272 |
JobNode node = new JobNode(job); |
265 | 273 |
node.mPrevJobs.add(jn); |
266 | 274 |
jn.mNextJobs.add(node); |
... | ... | |
273 | 281 |
static JobNode mergeTex(MeshBase target) |
274 | 282 |
{ |
275 | 283 |
JobNode jn = target.mJobNode[0]; |
276 |
Job job = new Job(JOB_TYPE_MERGE_TEX,target,null,null,null,null,0,0,0); |
|
284 |
Job job = new Job(JOB_TYPE_MERGE_TEX,target,null,null,null,null,0,0,0,0,0,0);
|
|
277 | 285 |
JobNode node = new JobNode(job); |
278 | 286 |
node.mPrevJobs.add(jn); |
279 | 287 |
jn.mNextJobs.add(node); |
... | ... | |
286 | 294 |
static JobNode mergeEff(MeshBase target) |
287 | 295 |
{ |
288 | 296 |
JobNode jn = target.mJobNode[0]; |
289 |
Job job = new Job(JOB_TYPE_MERGE_EFF,target,null,null,null,null,0,0,0); |
|
297 |
Job job = new Job(JOB_TYPE_MERGE_EFF,target,null,null,null,null,0,0,0,0,0,0);
|
|
290 | 298 |
JobNode node = new JobNode(job); |
291 | 299 |
node.mPrevJobs.add(jn); |
292 | 300 |
jn.mNextJobs.add(node); |
... | ... | |
300 | 308 |
{ |
301 | 309 |
JobNode jn; |
302 | 310 |
|
303 |
Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null,null,0,0,0); |
|
311 |
Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null,null,0,0,0,0,0,0);
|
|
304 | 312 |
JobNode node = new JobNode(job); |
305 | 313 |
|
306 | 314 |
for (MeshBase mesh : meshes) |
... | ... | |
325 | 333 |
JobNode jn = mesh.mJobNode[0]; |
326 | 334 |
MeshBase[] meshes = new MeshBase[1]; |
327 | 335 |
meshes[0] = mesh; |
328 |
Job job = new Job(JOB_TYPE_COPY,target,meshes,null,null,null,0,0,0); |
|
336 |
Job job = new Job(JOB_TYPE_COPY,target,meshes,null,null,null,0,0,0,0,0,0);
|
|
329 | 337 |
JobNode node = new JobNode(job); |
330 | 338 |
node.mPrevJobs.add(jn); |
331 | 339 |
jn.mNextJobs.add(node); |
... | ... | |
338 | 346 |
static JobNode textureMap(MeshBase target, Static4D[] maps, int comp) |
339 | 347 |
{ |
340 | 348 |
JobNode jn = target.mJobNode[0]; |
341 |
Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,null,maps,comp,0,0); |
|
349 |
Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,null,maps,comp,0,0,0,0,0);
|
|
342 | 350 |
JobNode node = new JobNode(job); |
343 | 351 |
node.mPrevJobs.add(jn); |
344 | 352 |
jn.mNextJobs.add(node); |
... | ... | |
351 | 359 |
static JobNode effectAssoc(MeshBase target, int comp, int andAssoc, int equAssoc) |
352 | 360 |
{ |
353 | 361 |
JobNode jn = target.mJobNode[0]; |
354 |
Job job = new Job(JOB_TYPE_ASSOC,target,null,null,null,null,comp,andAssoc,equAssoc); |
|
362 |
Job job = new Job(JOB_TYPE_ASSOC,target,null,null,null,null,comp,andAssoc,equAssoc,0,0,0); |
|
363 |
JobNode node = new JobNode(job); |
|
364 |
node.mPrevJobs.add(jn); |
|
365 |
jn.mNextJobs.add(node); |
|
366 |
mJobs.add(node); |
|
367 |
return node; |
|
368 |
} |
|
369 |
|
|
370 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
371 |
|
|
372 |
static JobNode componentCenter(MeshBase target, int comp, float x, float y, float z) |
|
373 |
{ |
|
374 |
JobNode jn = target.mJobNode[0]; |
|
375 |
Job job = new Job(JOB_TYPE_CENTER,target,null,null,null,null,comp,0,0,x,y,z); |
|
355 | 376 |
JobNode node = new JobNode(job); |
356 | 377 |
node.mPrevJobs.add(jn); |
357 | 378 |
jn.mNextJobs.add(node); |
src/main/java/org/distorted/library/mesh/MeshBase.java | ||
---|---|---|
312 | 312 |
|
313 | 313 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
314 | 314 |
|
315 |
void setEffectCenterNow(int component, float x, float y, float z)
|
|
315 |
void setComponentCenterNow(int component, float x, float y, float z)
|
|
316 | 316 |
{ |
317 | 317 |
mUBC.setEffectCenterNow(component, x, y, z); |
318 | 318 |
} |
... | ... | |
702 | 702 |
try |
703 | 703 |
{ |
704 | 704 |
String name = "/sdcard/"+mNumVertices+".dmesh"; |
705 |
DataOutputStream dos = new DataOutputStream(new FileOutputStream(name)); |
|
705 |
DataOutputStream dos = new DataOutputStream(new java.io.FileOutputStream(name));
|
|
706 | 706 |
write(dos); |
707 | 707 |
android.util.Log.e("mesh", "file written: "+name); |
708 | 708 |
} |
709 |
catch(FileNotFoundException ex) |
|
709 |
catch(java.io.FileNotFoundException ex)
|
|
710 | 710 |
{ |
711 | 711 |
android.util.Log.e("mesh", "file not found exception: "+ex.toString()); |
712 | 712 |
} |
... | ... | |
770 | 770 |
byte[] buffer = new byte[BYTES_PER_FLOAT*4]; |
771 | 771 |
int version, numEff, numTex; |
772 | 772 |
|
773 |
////////////////////////////////////////////////////////////////////////////////////////// |
|
774 |
// read version, number of vertices, number of tex components, number of effect components |
|
775 |
////////////////////////////////////////////////////////////////////////////////////////// |
|
776 |
|
|
773 | 777 |
try |
774 | 778 |
{ |
775 | 779 |
stream.read(buffer); |
... | ... | |
795 | 799 |
return 0; |
796 | 800 |
} |
797 | 801 |
|
802 |
////////////////////////////////////////////////////////////////////////////////////////// |
|
803 |
// read contents of all texture and effect components |
|
804 |
////////////////////////////////////////////////////////////////////////////////////////// |
|
805 |
|
|
798 | 806 |
if( mNumVertices>0 && numEff>0 && numTex>0 ) |
799 | 807 |
{ |
800 | 808 |
int size = numEff+TEX_COMP_SIZE*numTex; |
... | ... | |
803 | 811 |
mVertAttribs2 = new float[VERT2_ATTRIBS*mNumVertices]; |
804 | 812 |
|
805 | 813 |
// version 1 had extra 3 floats (the 'inflate' vector) in its vert1 array |
806 |
int vert1InFile = version==1 ? VERT1_ATTRIBS+3 : VERT1_ATTRIBS; |
|
814 |
int vert1InFile = version==2 ? VERT1_ATTRIBS : VERT1_ATTRIBS+3; |
|
815 |
// ... and there was no center. |
|
816 |
int centerSize = version==2 ? 3*numEff : 0; |
|
807 | 817 |
|
808 |
buffer = new byte[BYTES_PER_FLOAT*(size + mNumVertices*(vert1InFile+VERT2_ATTRIBS))]; |
|
818 |
buffer = new byte[BYTES_PER_FLOAT*(size + centerSize + mNumVertices*(vert1InFile+VERT2_ATTRIBS))];
|
|
809 | 819 |
|
810 | 820 |
try |
811 | 821 |
{ |
... | ... | |
822 | 832 |
|
823 | 833 |
floatBuf.get(tmp,0,size); |
824 | 834 |
|
825 |
switch(version) |
|
826 |
{ |
|
827 |
case 1 : int index = floatBuf.position(); |
|
828 |
|
|
829 |
for(int vert=0; vert<mNumVertices; vert++) |
|
830 |
{ |
|
831 |
mVertAttribs1[VERT1_ATTRIBS*vert+POS_ATTRIB ] = floatBuf.get(index+POS_ATTRIB ); |
|
832 |
mVertAttribs1[VERT1_ATTRIBS*vert+POS_ATTRIB+1] = floatBuf.get(index+POS_ATTRIB+1); |
|
833 |
mVertAttribs1[VERT1_ATTRIBS*vert+POS_ATTRIB+2] = floatBuf.get(index+POS_ATTRIB+2); |
|
834 |
mVertAttribs1[VERT1_ATTRIBS*vert+NOR_ATTRIB ] = floatBuf.get(index+NOR_ATTRIB ); |
|
835 |
mVertAttribs1[VERT1_ATTRIBS*vert+NOR_ATTRIB+1] = floatBuf.get(index+NOR_ATTRIB+1); |
|
836 |
mVertAttribs1[VERT1_ATTRIBS*vert+NOR_ATTRIB+2] = floatBuf.get(index+NOR_ATTRIB+2); |
|
837 |
index+=vert1InFile; |
|
838 |
} |
|
839 |
floatBuf.position(index); |
|
840 |
break; |
|
841 |
case 2 : floatBuf.get(mVertAttribs1, 0, VERT1_ATTRIBS*mNumVertices); |
|
842 |
break; |
|
843 |
default: android.util.Log.e("mesh", "Error: unknown mesh file version "+String.format("0x%08X", version)); |
|
844 |
return 0; |
|
845 |
} |
|
846 |
|
|
847 |
floatBuf.get(mVertAttribs2, 0, VERT2_ATTRIBS*mNumVertices); |
|
848 |
|
|
849 | 835 |
TexComponent tex; |
850 | 836 |
int index, texComp; |
851 | 837 |
float x, y, z, w; |
... | ... | |
870 | 856 |
index = (int)tmp[TEX_COMP_SIZE*texComp + effComp ]; |
871 | 857 |
mEffComponent.add(index); |
872 | 858 |
} |
859 |
|
|
860 |
////////////////////////////////////////////////////////////////////////////////////////// |
|
861 |
// read vert1 array, vert2 array and (if version>1) the component centers. |
|
862 |
////////////////////////////////////////////////////////////////////////////////////////// |
|
863 |
|
|
864 |
switch(version) |
|
865 |
{ |
|
866 |
case 1 : index = floatBuf.position(); |
|
867 |
|
|
868 |
for(int vert=0; vert<mNumVertices; vert++) |
|
869 |
{ |
|
870 |
mVertAttribs1[VERT1_ATTRIBS*vert+POS_ATTRIB ] = floatBuf.get(index+POS_ATTRIB ); |
|
871 |
mVertAttribs1[VERT1_ATTRIBS*vert+POS_ATTRIB+1] = floatBuf.get(index+POS_ATTRIB+1); |
|
872 |
mVertAttribs1[VERT1_ATTRIBS*vert+POS_ATTRIB+2] = floatBuf.get(index+POS_ATTRIB+2); |
|
873 |
mVertAttribs1[VERT1_ATTRIBS*vert+NOR_ATTRIB ] = floatBuf.get(index+NOR_ATTRIB ); |
|
874 |
mVertAttribs1[VERT1_ATTRIBS*vert+NOR_ATTRIB+1] = floatBuf.get(index+NOR_ATTRIB+1); |
|
875 |
mVertAttribs1[VERT1_ATTRIBS*vert+NOR_ATTRIB+2] = floatBuf.get(index+NOR_ATTRIB+2); |
|
876 |
index+=vert1InFile; |
|
877 |
} |
|
878 |
floatBuf.position(index); |
|
879 |
break; |
|
880 |
case 2 : float[] centers = new float[3*numEff]; |
|
881 |
floatBuf.get(centers,0,3*numEff); |
|
882 |
|
|
883 |
for(int eff=0; eff<numEff; eff++) |
|
884 |
{ |
|
885 |
mUBC.setEffectCenterNow(eff, centers[3*eff], centers[3*eff+1], centers[3*eff+2]); |
|
886 |
} |
|
887 |
|
|
888 |
floatBuf.get(mVertAttribs1, 0, VERT1_ATTRIBS*mNumVertices); |
|
889 |
break; |
|
890 |
default: android.util.Log.e("mesh", "Error: unknown mesh file version "+String.format("0x%08X", version)); |
|
891 |
return 0; |
|
892 |
} |
|
893 |
|
|
894 |
floatBuf.get(mVertAttribs2, 0, VERT2_ATTRIBS*mNumVertices); |
|
873 | 895 |
} |
874 | 896 |
|
875 | 897 |
return BYTES_PER_FLOAT*( 4 + numEff+TEX_COMP_SIZE*numTex + VERT1_ATTRIBS*mNumVertices + VERT2_ATTRIBS*mNumVertices ); |
... | ... | |
939 | 961 |
stream.writeFloat((float)mEffComponent.get(i)); |
940 | 962 |
} |
941 | 963 |
|
964 |
float[] centers = mUBC.getBackingArray(); |
|
965 |
|
|
966 |
for(int i=0; i<numEff; i++) |
|
967 |
{ |
|
968 |
stream.writeFloat(centers[4*i ]); |
|
969 |
stream.writeFloat(centers[4*i+1]); |
|
970 |
stream.writeFloat(centers[4*i+2]); |
|
971 |
} |
|
972 |
|
|
942 | 973 |
ByteBuffer vertBuf1 = ByteBuffer.allocate(VERT1_SIZE*mNumVertices); |
943 | 974 |
vertBuf1.asFloatBuffer().put(mVertAttribs1); |
944 | 975 |
ByteBuffer vertBuf2 = ByteBuffer.allocate(VERT2_SIZE*mNumVertices); |
... | ... | |
1139 | 1170 |
} |
1140 | 1171 |
} |
1141 | 1172 |
|
1173 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
1174 |
/** |
|
1175 |
* Set center of a Component. |
|
1176 |
* |
|
1177 |
* A 'center' of a (effect) component is a 3D point in space. The array of centers gets sent to |
|
1178 |
* the vertex shader as a Uniform Buffer Object; in the vertex shader we can then use it to compute |
|
1179 |
* the 'Inflation' of the whole Mesh per-component. 'Inflation' is needed by postprocess effects to |
|
1180 |
* add the 'halo' around an object. |
|
1181 |
* |
|
1182 |
* This is all 'per-component' so that a user has a chance to make the halo look right in case of |
|
1183 |
* non-convex meshes: then we need to ensure that each component of such a mesh is a convex |
|
1184 |
* sub-mesh with its center being more-or-less the center of gravity of the sub-mesh. |
|
1185 |
*/ |
|
1186 |
public void setComponentCenter(int component, float centerX, float centerY, float centerZ) |
|
1187 |
{ |
|
1188 |
if( component>=0 && component<MAX_EFFECT_COMPONENTS ) |
|
1189 |
{ |
|
1190 |
if( mJobNode[0]==null ) |
|
1191 |
{ |
|
1192 |
setComponentCenterNow(component, centerX, centerY, centerZ); |
|
1193 |
} |
|
1194 |
else |
|
1195 |
{ |
|
1196 |
mJobNode[0] = DeferredJobs.componentCenter(this,component,centerX, centerY, centerZ); |
|
1197 |
} |
|
1198 |
} |
|
1199 |
} |
|
1200 |
|
|
1142 | 1201 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
1143 | 1202 |
/** |
1144 | 1203 |
* Return the number of texture components, i.e. individual subsets of the whole set of vertices |
src/main/java/org/distorted/library/mesh/UniformBlockCenter.java | ||
---|---|---|
55 | 55 |
|
56 | 56 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
57 | 57 |
|
58 |
void setEffectCenterNow(int comp, float x, float y, float z)
|
|
59 |
{
|
|
60 |
mCenter[4*comp ] = x;
|
|
61 |
mCenter[4*comp+1] = y;
|
|
62 |
mCenter[4*comp+2] = z;
|
|
58 |
void setEffectCenterNow(int comp, float x, float y, float z) |
|
59 |
{ |
|
60 |
mCenter[4*comp ] = x; |
|
61 |
mCenter[4*comp+1] = y; |
|
62 |
mCenter[4*comp+2] = z; |
|
63 | 63 |
|
64 |
mUBO.invalidate();
|
|
65 |
}
|
|
64 |
mUBO.invalidate(); |
|
65 |
} |
|
66 | 66 |
|
67 | 67 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
68 | 68 |
|
69 |
int getIndex()
|
|
70 |
{
|
|
71 |
return mUBO.createImmediatelyFloat( BLOCK_SIZE, mCenter);
|
|
72 |
}
|
|
69 |
int getIndex() |
|
70 |
{ |
|
71 |
return mUBO.createImmediatelyFloat( BLOCK_SIZE, mCenter); |
|
72 |
} |
|
73 | 73 |
|
74 | 74 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
75 | 75 |
|
76 |
void copy(int compTo, UniformBlockCenter blockFrom, int compFrom) |
|
77 |
{ |
|
78 |
mCenter[4*compTo ] = blockFrom.mCenter[4*compFrom ]; |
|
79 |
mCenter[4*compTo+1] = blockFrom.mCenter[4*compFrom+1]; |
|
80 |
mCenter[4*compTo+2] = blockFrom.mCenter[4*compFrom+2]; |
|
81 |
} |
|
76 |
void copy(int compTo, UniformBlockCenter blockFrom, int compFrom) |
|
77 |
{ |
|
78 |
mCenter[4*compTo ] = blockFrom.mCenter[4*compFrom ]; |
|
79 |
mCenter[4*compTo+1] = blockFrom.mCenter[4*compFrom+1]; |
|
80 |
mCenter[4*compTo+2] = blockFrom.mCenter[4*compFrom+2]; |
|
81 |
} |
|
82 |
|
|
83 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
84 |
|
|
85 |
float[] getBackingArray() |
|
86 |
{ |
|
87 |
return mCenter; |
|
88 |
} |
|
82 | 89 |
} |
Also available in: Unified diff
Add component centers to dmesh version 2.