@@ -300,6 +300,11 @@ namespace SCIRun {
300300 }
301301
302302 // Add vertex buffer objects.
303+ // -----------------------------------------------------------------
304+ char * vbo_buffer = 0 ;
305+ size_t stride_vbo = 0 ;
306+ // -----------------------------------------------------------------
307+
303308 int nameIndex = 0 ;
304309 for (auto it = obj->mVBOs .cbegin (); it != obj->mVBOs .cend (); ++it)
305310 {
@@ -317,7 +322,11 @@ namespace SCIRun {
317322 GLuint vboID = vboMan.addInMemoryVBO (vbo.data ->getBuffer (), vbo.data ->getBufferSize (),
318323 attributeData, vbo.name );
319324 }
320-
325+ // -----------------------------------------------------------------
326+ vbo_buffer = reinterpret_cast <char *>(vbo.data ->getBuffer ());
327+ for (auto a : vbo.attributes )
328+ stride_vbo += a.sizeInBytes ;
329+ // -----------------------------------------------------------------
321330 bbox.extend (vbo.boundingBox );
322331 }
323332
@@ -364,10 +373,74 @@ namespace SCIRun {
364373 break ;
365374 }
366375
367- int numPrimitives = ibo.data ->getBufferSize () / ibo.indexSize ;
376+ // ----------------------------------------------------------------
377+ uint32_t * ibo_buffer = reinterpret_cast <uint32_t *>(ibo.data ->getBuffer ());
378+ size_t num_triangles = ibo.data ->getBufferSize () / (sizeof (uint32_t ) * 3 );
379+ Core::Geometry::Vector dir (0.0 , 0.0 , 0.0 );
380+
381+ std::vector<DepthIndex> rel_depth (num_triangles);
382+ for (int i = 0 ; i <= 3 ; ++i)
383+ {
384+ std::string name = ibo.name ;
385+
386+ if (i == 0 )
387+ {
388+ dir = Core::Geometry::Vector (1.0 , 0.0 , 0.0 );
389+ name += " X" ;
390+ }
391+ else if (i == 1 )
392+ {
393+ dir = Core::Geometry::Vector (0.0 , 1.0 , 0.0 );
394+ name += " Y" ;
395+ }
396+ else if (i == 2 )
397+ {
398+ dir = Core::Geometry::Vector (0.0 , 0.0 , 1.0 );
399+ name += " Z" ;
400+ }
401+ else if (i == 3 )
402+ {
403+ int numPrimitives = ibo.data ->getBufferSize () / ibo.indexSize ;
404+ iboMan.addInMemoryIBO (ibo.data ->getBuffer (), ibo.data ->getBufferSize (), primitive, primType, numPrimitives, name);
405+ break ;
406+ }
407+
408+ for (size_t j = 0 ; j < num_triangles; j++)
409+ {
410+ float * vertex1 = reinterpret_cast <float *>(vbo_buffer + stride_vbo * (ibo_buffer[j * 3 ]));
411+ Core::Geometry::Point node1 (vertex1[0 ], vertex1[1 ], vertex1[2 ]);
412+
413+ float * vertex2 = reinterpret_cast <float *>(vbo_buffer + stride_vbo * (ibo_buffer[j * 3 + 1 ]));
414+ Core::Geometry::Point node2 (vertex2[0 ], vertex2[1 ], vertex2[2 ]);
415+
416+ float * vertex3 = reinterpret_cast <float *>(vbo_buffer + stride_vbo * (ibo_buffer[j * 3 + 2 ]));
417+ Core::Geometry::Point node3 (vertex3[0 ], vertex3[1 ], vertex3[2 ]);
368418
369- iboMan.addInMemoryIBO (ibo.data ->getBuffer (), ibo.data ->getBufferSize (), primitive, primType,
370- numPrimitives, ibo.name );
419+ rel_depth[j].mDepth = Core::Geometry::Dot (dir, node1) + Core::Geometry::Dot (dir, node2) + Core::Geometry::Dot (dir, node3);
420+ rel_depth[j].mIndex = j;
421+ }
422+
423+ std::sort (rel_depth.begin (), rel_depth.end ());
424+
425+ int numPrimitives = ibo.data ->getBufferSize () / ibo.indexSize ;
426+
427+ std::vector<char > sorted_buffer (ibo.data ->getBufferSize ());
428+ char * ibuffer = reinterpret_cast <char *>(ibo.data ->getBuffer ());
429+ char * sbuffer = reinterpret_cast <char *>(&sorted_buffer[0 ]);
430+ size_t tri_size = ibo.data ->getBufferSize () / num_triangles;
431+
432+ for (size_t j = 0 ; j < num_triangles; j++)
433+ {
434+ memcpy (sbuffer + j * tri_size, ibuffer + rel_depth[j].mIndex * tri_size, tri_size);
435+ }
436+
437+ iboMan.addInMemoryIBO (sbuffer, ibo.data ->getBufferSize (), primitive, primType, numPrimitives, name);
438+ }
439+ // ----------------------------------------------------------------
440+
441+ // int numPrimitives = ibo.data->getBufferSize() / ibo.indexSize;
442+
443+ // iboMan.addInMemoryIBO(ibo.data->getBuffer(), ibo.data->getBufferSize(), primitive, primType, numPrimitives, ibo.name);
371444 }
372445
373446 // Add default identity transform to the object globally (instead of per-pass)
@@ -386,9 +459,20 @@ namespace SCIRun {
386459
387460 if (pass.renderType == Core::Datatypes::GeometryObject::RENDER_VBO_IBO)
388461 {
389- reorderIBO (pass);
462+ // reorderIBO(pass);
390463 addVBOToEntity (entityID, pass.vboName );
391- addIBOToEntity (entityID, pass.iboName );
464+ for (int i = 0 ; i <= 3 ; ++i)
465+ {
466+ std::string name = pass.iboName ;
467+ if (i == 1 )
468+ name += " X" ;
469+ if (i == 2 )
470+ name += " Y" ;
471+ if (i == 3 )
472+ name += " Z" ;
473+
474+ addIBOToEntity (entityID, name);
475+ }
392476 }
393477 else
394478 {
@@ -547,7 +631,7 @@ namespace SCIRun {
547631 ibo.primType = iboData.primType ;
548632 ibo.primMode = iboData.primMode ;
549633 ibo.numPrims = iboData.numPrims ;
550-
634+
551635 mCore .addComponent (entityID, ibo);
552636 }
553637
@@ -563,7 +647,7 @@ namespace SCIRun {
563647
564648 std::vector<DepthIndex> rel_depth (num_triangles);
565649 Core::Geometry::Vector dir (mCamera ->getViewToWorld ()[0 ][2 ], mCamera ->getViewToWorld ()[1 ][2 ], mCamera ->getViewToWorld ()[2 ][2 ]);
566-
650+
567651 for (size_t j = 0 ; j < num_triangles; j++)
568652 {
569653 float * vertex1 = reinterpret_cast <float *>(vbo_buffer + stride_vbo * (ibo_buffer[j * 3 ]));
@@ -590,14 +674,14 @@ namespace SCIRun {
590674
591675 for (size_t j = 0 ; j < num_triangles; j++)
592676 {
593- memcpy (sbuffer + j * tri_size, ibuffer + rel_depth[j].mIndex * tri_size, tri_size);
677+ memcpy (sbuffer + j * tri_size, pass. ibo . data -> getBuffer () + rel_depth[j].mIndex * tri_size, tri_size);
594678 }
595679
596- ren::IBOMan& iboMan = *mCore .getStaticComponent <ren::StaticIBOMan>()->instance ;
680+ // ren::IBOMan& iboMan = *mCore.getStaticComponent<ren::StaticIBOMan>()->instance;
597681
598- auto iboData = iboMan.getIBOData (pass.iboName );
682+ // auto iboData = iboMan.getIBOData(pass.iboName);
599683
600- iboMan.addInMemoryIBO (sbuffer, pass.ibo .data ->getBufferSize (), iboData.primMode , iboData.primType , iboData.numPrims , pass.iboName );
684+ // iboMan.addInMemoryIBO(sbuffer, pass.ibo.data->getBufferSize(), iboData.primMode, iboData.primType, iboData.numPrims, pass.iboName);
601685 }
602686
603687 // ------------------------------------------------------------------------------
0 commit comments