Project

General

Profile

« Previous | Next » 

Revision a8dfedcc

Added by Leszek Koltunski almost 4 years ago

Progress with DeferredJobs (apply, copy, merge & join should be working now - untested)

View differences:

src/main/java/org/distorted/library/mesh/MeshBase.java
208 208
     mVBO1.invalidate();
209 209
     }
210 210

  
211
///////////////////////////////////////////////////////////////////////////////////////////////////
212

  
213
   void merge()
214
     {
215
     int num = mComponent.size();
216

  
217
     if( num>1 )
218
       {
219
       mComponent.clear();
220
       mComponent.add(new Component(mNumVertices-1));
221

  
222
       for(int index=0; index<mNumVertices; index++)
223
         {
224
         mVertAttribs2[VERT2_ATTRIBS*index+COM_ATTRIB] = 0;
225
         }
226

  
227
       mVBO2.invalidate();
228
       }
229
     }
230

  
211 231
///////////////////////////////////////////////////////////////////////////////////////////////////
212 232

  
213 233
   int numComponents()
......
231 251
     }
232 252

  
233 253
///////////////////////////////////////////////////////////////////////////////////////////////////
234
// called from MeshJoined
235 254

  
236
   void join(MeshBase[] meshes)
255
   void joinAttrib1(MeshBase[] meshes, int origVertices)
237 256
     {
238 257
     MeshBase mesh;
239
     Component comp;
240
     int origComponents=0, numComponents, numVertices, numMeshes = meshes.length;
241
     int origVertices = mNumVertices;
258
     int numMeshes = meshes.length;
259
     int numVertices = origVertices;
242 260

  
243
     // compute new numVertices; take care of Components
261
     float[] newAttribs1 = new float[VERT1_ATTRIBS*mNumVertices];
244 262

  
245 263
     if( origVertices>0 )
246 264
       {
247
       origComponents = mComponent.size();
248
       mNumVertices+= ( mNumVertices%2==1 ? 2:1 );
249
       mComponent.get(origComponents-1).mEndIndex = mNumVertices-1;
265
       System.arraycopy(mVertAttribs1,                              0, newAttribs1,                         0, VERT1_ATTRIBS*numVertices);
266
       System.arraycopy(mVertAttribs1, VERT1_ATTRIBS*(origVertices-1), newAttribs1, VERT1_ATTRIBS*origVertices, VERT1_ATTRIBS    );
267
       origVertices++;
268

  
269
       if( numVertices%2==1 )
270
         {
271
         System.arraycopy(mVertAttribs1, VERT1_ATTRIBS*(origVertices-1), newAttribs1, VERT1_ATTRIBS*origVertices, VERT1_ATTRIBS);
272
         origVertices++;
273
         }
250 274
       }
251 275

  
252 276
     for(int i=0; i<numMeshes; i++)
253 277
       {
254 278
       mesh = meshes[i];
255
       numComponents = mesh.mComponent.size();
256

  
257 279
       numVertices = mesh.mNumVertices;
258 280

  
259
       int extraVerticesBefore = mNumVertices==0 ? 0:1;
260
       int extraVerticesAfter  = (i==numMeshes-1) ? 0 : (numVertices%2==1 ? 2:1);
281
       if( origVertices>0 )
282
         {
283
         System.arraycopy(mesh.mVertAttribs1, 0, newAttribs1, VERT1_ATTRIBS*origVertices, VERT1_ATTRIBS    );
284
         origVertices++;
285
         }
286
       System.arraycopy(mesh.mVertAttribs1, 0, newAttribs1, VERT1_ATTRIBS*origVertices, VERT1_ATTRIBS*numVertices);
287
       origVertices+=numVertices;
261 288

  
262
       for(int j=0; j<numComponents; j++)
289
       if( i<numMeshes-1 )
263 290
         {
264
         comp = new Component(mesh.mComponent.get(j));
265
         comp.mEndIndex += (extraVerticesBefore+mNumVertices+extraVerticesAfter);
266
         mComponent.add(comp);
291
         System.arraycopy(mesh.mVertAttribs1, VERT1_ATTRIBS*(numVertices-1), newAttribs1, VERT1_ATTRIBS*origVertices, VERT1_ATTRIBS);
292
         origVertices++;
267 293

  
268
         if( origComponents<MAX_COMPONENTS )
294
         if( numVertices%2==1 )
269 295
           {
270
           mAssociation[origComponents] = mesh.mAssociation[j];
271
           origComponents++;
296
           System.arraycopy(mesh.mVertAttribs1, VERT1_ATTRIBS*(numVertices-1), newAttribs1, VERT1_ATTRIBS*origVertices, VERT1_ATTRIBS);
297
           origVertices++;
272 298
           }
273 299
         }
274

  
275
       mNumVertices += (extraVerticesBefore+numVertices+extraVerticesAfter);
276 300
       }
277 301

  
278
     // allocate new attrib array
279
     float[] newAttribs1 = new float[VERT1_ATTRIBS*mNumVertices];
302
     mVertAttribs1 = newAttribs1;
303
     mVBO1.invalidate();
304
     }
305

  
306
///////////////////////////////////////////////////////////////////////////////////////////////////
307

  
308
   private void joinAttrib2(MeshBase[] meshes, int origVertices)
309
     {
310
     MeshBase mesh;
311
     int numMeshes = meshes.length;
312
     int numVertices = origVertices;
313

  
280 314
     float[] newAttribs2 = new float[VERT2_ATTRIBS*mNumVertices];
281
     numVertices = origVertices;
282 315

  
283 316
     if( origVertices>0 )
284 317
       {
285
       System.arraycopy(mVertAttribs1,                              0, newAttribs1,                         0, VERT1_ATTRIBS*numVertices);
286 318
       System.arraycopy(mVertAttribs2,                              0, newAttribs2,                         0, VERT2_ATTRIBS*numVertices);
287
       System.arraycopy(mVertAttribs1, VERT1_ATTRIBS*(origVertices-1), newAttribs1, VERT1_ATTRIBS*origVertices, VERT1_ATTRIBS    );
288 319
       System.arraycopy(mVertAttribs2, VERT2_ATTRIBS*(origVertices-1), newAttribs2, VERT2_ATTRIBS*origVertices, VERT2_ATTRIBS    );
289 320
       origVertices++;
290 321

  
291 322
       if( numVertices%2==1 )
292 323
         {
293
         System.arraycopy(mVertAttribs1, VERT1_ATTRIBS*(origVertices-1), newAttribs1, VERT1_ATTRIBS*origVertices, VERT1_ATTRIBS);
294 324
         System.arraycopy(mVertAttribs2, VERT2_ATTRIBS*(origVertices-1), newAttribs2, VERT2_ATTRIBS*origVertices, VERT2_ATTRIBS);
295 325
         origVertices++;
296 326
         }
......
303 333

  
304 334
       if( origVertices>0 )
305 335
         {
306
         System.arraycopy(mesh.mVertAttribs1, 0, newAttribs1, VERT1_ATTRIBS*origVertices, VERT1_ATTRIBS    );
307 336
         System.arraycopy(mesh.mVertAttribs2, 0, newAttribs2, VERT2_ATTRIBS*origVertices, VERT2_ATTRIBS    );
308 337
         origVertices++;
309 338
         }
310
       System.arraycopy(mesh.mVertAttribs1, 0, newAttribs1, VERT1_ATTRIBS*origVertices, VERT1_ATTRIBS*numVertices);
311 339
       System.arraycopy(mesh.mVertAttribs2, 0, newAttribs2, VERT2_ATTRIBS*origVertices, VERT2_ATTRIBS*numVertices);
312 340
       origVertices+=numVertices;
313 341

  
314 342
       if( i<numMeshes-1 )
315 343
         {
316
         System.arraycopy(mesh.mVertAttribs1, VERT1_ATTRIBS*(numVertices-1), newAttribs1, VERT1_ATTRIBS*origVertices, VERT1_ATTRIBS);
317 344
         System.arraycopy(mesh.mVertAttribs2, VERT2_ATTRIBS*(numVertices-1), newAttribs2, VERT2_ATTRIBS*origVertices, VERT2_ATTRIBS);
318 345
         origVertices++;
319 346

  
320 347
         if( numVertices%2==1 )
321 348
           {
322
           System.arraycopy(mesh.mVertAttribs1, VERT1_ATTRIBS*(numVertices-1), newAttribs1, VERT1_ATTRIBS*origVertices, VERT1_ATTRIBS);
323 349
           System.arraycopy(mesh.mVertAttribs2, VERT2_ATTRIBS*(numVertices-1), newAttribs2, VERT2_ATTRIBS*origVertices, VERT2_ATTRIBS);
324 350
           origVertices++;
325 351
           }
......
340 366
       for( ; index<=endIndex; index++) newAttribs2[VERT2_ATTRIBS*index+COM_ATTRIB] = component;
341 367
       }
342 368

  
343
     mVertAttribs1 = newAttribs1;
344 369
     mVertAttribs2 = newAttribs2;
345

  
346
     mVBO1.invalidate();
347 370
     mVBO2.invalidate();
348 371
     }
349 372

  
373
///////////////////////////////////////////////////////////////////////////////////////////////////
374
// called from MeshJoined
375

  
376
   void join(MeshBase[] meshes)
377
     {
378
     MeshBase mesh;
379
     Component comp;
380
     int origComponents=0, numComponents, numVertices, numMeshes = meshes.length;
381
     int origVertices = mNumVertices;
382

  
383
     if( origVertices>0 )
384
       {
385
       origComponents = mComponent.size();
386
       mNumVertices+= ( mNumVertices%2==1 ? 2:1 );
387
       mComponent.get(origComponents-1).mEndIndex = mNumVertices-1;
388
       }
389

  
390
     for(int i=0; i<numMeshes; i++)
391
       {
392
       mesh = meshes[i];
393
       numComponents = mesh.mComponent.size();
394

  
395
       numVertices = mesh.mNumVertices;
396

  
397
       int extraVerticesBefore = mNumVertices==0 ? 0:1;
398
       int extraVerticesAfter  = (i==numMeshes-1) ? 0 : (numVertices%2==1 ? 2:1);
399

  
400
       for(int j=0; j<numComponents; j++)
401
         {
402
         comp = new Component(mesh.mComponent.get(j));
403
         comp.mEndIndex += (extraVerticesBefore+mNumVertices+extraVerticesAfter);
404
         mComponent.add(comp);
405

  
406
         if( origComponents<MAX_COMPONENTS )
407
           {
408
           mAssociation[origComponents] = mesh.mAssociation[j];
409
           origComponents++;
410
           }
411
         }
412

  
413
       mNumVertices += (extraVerticesBefore+numVertices+extraVerticesAfter);
414
       }
415

  
416
     if( mJobNode[0]!=null )
417
       {
418
       mJobNode[0] = DeferredJobs.join(this,meshes,origVertices);
419
       }
420
     else
421
       {
422
       joinAttrib1(meshes,origVertices);
423
       }
424

  
425
     joinAttrib2(meshes,origVertices);
426
     }
427

  
350 428
///////////////////////////////////////////////////////////////////////////////////////////////////
351 429
/**
352 430
 * Not part of public API, do not document (public only because has to be used from the main package)
......
494 572
     return mShowNormals;
495 573
     }
496 574

  
575
///////////////////////////////////////////////////////////////////////////////////////////////////
576
/**
577
 * Merge all components of this Mesh into a single one.
578
 */
579
   public void mergeComponents()
580
     {
581
     if( mJobNode==null )
582
       {
583
       merge();
584
       }
585
     else
586
       {
587
       mJobNode[0] = DeferredJobs.merge(this);
588
       }
589
     }
590

  
497 591
///////////////////////////////////////////////////////////////////////////////////////////////////
498 592
/**
499 593
 * Release all internal resources.

Also available in: Unified diff