@@ -344,128 +344,136 @@ namespace SCIRun {
344344
345345 // Add index buffer objects.
346346 nameIndex = 0 ;
347- for (auto it = obj->mIBOs .cbegin (); it != obj->mIBOs .cend (); ++it, ++nameIndex)
348- {
349- const Core::Datatypes::GeometryObject::SpireIBO& ibo = *it;
350- GLenum primType = GL_UNSIGNED_SHORT;
351- switch (ibo.indexSize )
352- {
353- case 1 : // 8-bit
354- primType = GL_UNSIGNED_BYTE;
355- break ;
356-
357- case 2 : // 16-bit
358- primType = GL_UNSIGNED_SHORT;
359- break ;
360-
361- case 4 : // 32-bit
362- primType = GL_UNSIGNED_INT;
363- break ;
364-
365- default :
366- primType = GL_UNSIGNED_INT;
367- throw std::invalid_argument (" Unable to determine index buffer depth." );
368- break ;
369- }
347+ for (auto it = obj->mIBOs .cbegin (); it != obj->mIBOs .cend (); ++it, ++nameIndex)
348+ {
349+ const Core::Datatypes::GeometryObject::SpireIBO& ibo = *it;
350+ GLenum primType = GL_UNSIGNED_SHORT;
351+ switch (ibo.indexSize )
352+ {
353+ case 1 : // 8-bit
354+ primType = GL_UNSIGNED_BYTE;
355+ break ;
356+
357+ case 2 : // 16-bit
358+ primType = GL_UNSIGNED_SHORT;
359+ break ;
360+
361+ case 4 : // 32-bit
362+ primType = GL_UNSIGNED_INT;
363+ break ;
364+
365+ default :
366+ primType = GL_UNSIGNED_INT;
367+ throw std::invalid_argument (" Unable to determine index buffer depth." );
368+ break ;
369+ }
370370
371- GLenum primitive = GL_TRIANGLES;
372- switch (ibo.prim )
373- {
374- case Core::Datatypes::GeometryObject::SpireIBO::POINTS:
375- primitive = GL_POINTS;
376- break ;
377-
378- case Core::Datatypes::GeometryObject::SpireIBO::LINES:
379- primitive = GL_LINES;
380- break ;
381-
382- case Core::Datatypes::GeometryObject::SpireIBO::TRIANGLES:
383- default :
384- primitive = GL_TRIANGLES;
385- break ;
386- }
387- // / Create sorted lists of Buffers for transparency in each direction of the axis
388- uint32_t * ibo_buffer = reinterpret_cast <uint32_t *>(ibo.data ->getBuffer ());
389- size_t num_triangles = ibo.data ->getBufferSize () / (sizeof (uint32_t ) * 3 );
390- Core::Geometry::Vector dir (0.0 , 0.0 , 0.0 );
371+ GLenum primitive = GL_TRIANGLES;
372+ switch (ibo.prim )
373+ {
374+ case Core::Datatypes::GeometryObject::SpireIBO::POINTS:
375+ primitive = GL_POINTS;
376+ break ;
377+
378+ case Core::Datatypes::GeometryObject::SpireIBO::LINES:
379+ primitive = GL_LINES;
380+ break ;
381+
382+ case Core::Datatypes::GeometryObject::SpireIBO::TRIANGLES:
383+ default :
384+ primitive = GL_TRIANGLES;
385+ break ;
386+ }
391387
392- std::vector<DepthIndex> rel_depth (num_triangles);
393- for (int i = 0 ; i <= 6 ; ++i)
388+ if (mRenderSortType == RenderState::TransparencySortType::LISTS_SORT)
394389 {
395- std::string name = ibo.name ;
396-
397- if (i == 0 )
398- {
399- dir = Core::Geometry::Vector (1.0 , 0.0 , 0.0 );
400- name += " X" ;
401- }
402- if (i == 1 )
403- {
404- dir = Core::Geometry::Vector (0.0 , 1.0 , 0.0 );
405- name += " Y" ;
406- }
407- if (i == 2 )
408- {
409- dir = Core::Geometry::Vector (0.0 , 0.0 , 1.0 );
410- name += " Z" ;
411- }
412- if (i == 3 )
413- {
414- dir = Core::Geometry::Vector (-1.0 , 0.0 , 0.0 );
415- name += " NegX" ;
416- }
417- if (i == 4 )
418- {
419- dir = Core::Geometry::Vector (0.0 , -1.0 , 0.0 );
420- name += " NegY" ;
421- }
422- if (i == 5 )
423- {
424- dir = Core::Geometry::Vector (0.0 , 0.0 , -1.0 );
425- name += " NegZ" ;
426- }
427- if (i < 6 )
390+ // / Create sorted lists of Buffers for transparency in each direction of the axis
391+ uint32_t * ibo_buffer = reinterpret_cast <uint32_t *>(ibo.data ->getBuffer ());
392+ size_t num_triangles = ibo.data ->getBufferSize () / (sizeof (uint32_t ) * 3 );
393+ Core::Geometry::Vector dir (0.0 , 0.0 , 0.0 );
394+
395+ std::vector<DepthIndex> rel_depth (num_triangles);
396+ for (int i = 0 ; i <= 6 ; ++i)
428397 {
429- for (size_t j = 0 ; j < num_triangles; j++)
398+ std::string name = ibo.name ;
399+ if (i == 0 )
400+ {
401+ int numPrimitives = ibo.data ->getBufferSize () / ibo.indexSize ;
402+ iboMan.addInMemoryIBO (ibo.data ->getBuffer (), ibo.data ->getBufferSize (), primitive, primType, numPrimitives, ibo.name );
403+ }
404+ if (i == 1 )
430405 {
431- float * vertex1 = reinterpret_cast <float *>(vbo_buffer[nameIndex] + stride_vbo[nameIndex] * (ibo_buffer[j * 3 ]));
432- Core::Geometry::Point node1 (vertex1[0 ], vertex1[1 ], vertex1[2 ]);
406+ dir = Core::Geometry::Vector (1.0 , 0.0 , 0.0 );
407+ name += " X" ;
408+ }
409+ if (i == 2 )
410+ {
411+ dir = Core::Geometry::Vector (0.0 , 1.0 , 0.0 );
412+ name += " Y" ;
413+ }
414+ if (i == 3 )
415+ {
416+ dir = Core::Geometry::Vector (0.0 , 0.0 , 1.0 );
417+ name += " Z" ;
418+ }
419+ if (i == 4 )
420+ {
421+ dir = Core::Geometry::Vector (-1.0 , 0.0 , 0.0 );
422+ name += " NegX" ;
423+ }
424+ if (i == 5 )
425+ {
426+ dir = Core::Geometry::Vector (0.0 , -1.0 , 0.0 );
427+ name += " NegY" ;
428+ }
429+ if (i == 6 )
430+ {
431+ dir = Core::Geometry::Vector (0.0 , 0.0 , -1.0 );
432+ name += " NegZ" ;
433+ }
434+ if (i > 0 )
435+ {
436+ for (size_t j = 0 ; j < num_triangles; j++)
437+ {
438+ float * vertex1 = reinterpret_cast <float *>(vbo_buffer[nameIndex] + stride_vbo[nameIndex] * (ibo_buffer[j * 3 ]));
439+ Core::Geometry::Point node1 (vertex1[0 ], vertex1[1 ], vertex1[2 ]);
433440
434- float * vertex2 = reinterpret_cast <float *>(vbo_buffer[nameIndex] + stride_vbo[nameIndex] * (ibo_buffer[j * 3 + 1 ]));
435- Core::Geometry::Point node2 (vertex2[0 ], vertex2[1 ], vertex2[2 ]);
441+ float * vertex2 = reinterpret_cast <float *>(vbo_buffer[nameIndex] + stride_vbo[nameIndex] * (ibo_buffer[j * 3 + 1 ]));
442+ Core::Geometry::Point node2 (vertex2[0 ], vertex2[1 ], vertex2[2 ]);
436443
437- float * vertex3 = reinterpret_cast <float *>(vbo_buffer[nameIndex] + stride_vbo[nameIndex] * (ibo_buffer[j * 3 + 2 ]));
438- Core::Geometry::Point node3 (vertex3[0 ], vertex3[1 ], vertex3[2 ]);
444+ float * vertex3 = reinterpret_cast <float *>(vbo_buffer[nameIndex] + stride_vbo[nameIndex] * (ibo_buffer[j * 3 + 2 ]));
445+ Core::Geometry::Point node3 (vertex3[0 ], vertex3[1 ], vertex3[2 ]);
439446
440- rel_depth[j].mDepth = Core::Geometry::Dot (dir, node1) + Core::Geometry::Dot (dir, node2) + Core::Geometry::Dot (dir, node3);
441- rel_depth[j].mIndex = j;
442- }
447+ rel_depth[j].mDepth = Core::Geometry::Dot (dir, node1) + Core::Geometry::Dot (dir, node2) + Core::Geometry::Dot (dir, node3);
448+ rel_depth[j].mIndex = j;
449+ }
443450
444- std::sort (rel_depth.begin (), rel_depth.end ());
451+ std::sort (rel_depth.begin (), rel_depth.end ());
445452
446- int numPrimitives = ibo.data ->getBufferSize () / ibo.indexSize ;
453+ int numPrimitives = ibo.data ->getBufferSize () / ibo.indexSize ;
447454
448- std::vector<char > sorted_buffer (ibo.data ->getBufferSize ());
449- char * ibuffer = reinterpret_cast <char *>(ibo.data ->getBuffer ());
450- char * sbuffer = !sorted_buffer.empty () ? reinterpret_cast <char *>(&sorted_buffer[0 ]) : 0 ;
451-
452- if (sbuffer && num_triangles > 0 )
453- {
454- size_t tri_size = ibo.data ->getBufferSize () / num_triangles;
455- for (size_t j = 0 ; j < num_triangles; j++)
455+ std::vector<char > sorted_buffer (ibo.data ->getBufferSize ());
456+ char * ibuffer = reinterpret_cast <char *>(ibo.data ->getBuffer ());
457+ char * sbuffer = !sorted_buffer.empty () ? reinterpret_cast <char *>(&sorted_buffer[0 ]) : 0 ;
458+
459+ if (sbuffer && num_triangles > 0 )
456460 {
457- memcpy (sbuffer + j * tri_size, ibuffer + rel_depth[j].mIndex * tri_size, tri_size);
461+ size_t tri_size = ibo.data ->getBufferSize () / num_triangles;
462+ for (size_t j = 0 ; j < num_triangles; j++)
463+ {
464+ memcpy (sbuffer + j * tri_size, ibuffer + rel_depth[j].mIndex * tri_size, tri_size);
465+ }
466+ iboMan.addInMemoryIBO (sbuffer, ibo.data ->getBufferSize (), primitive, primType, numPrimitives, name);
458467 }
459- iboMan.addInMemoryIBO (sbuffer, ibo.data ->getBufferSize (), primitive, primType, numPrimitives, name);
460468 }
461469 }
462- else
463- {
464- int numPrimitives = ibo. data -> getBufferSize () / ibo. indexSize ;
465- iboMan. addInMemoryIBO (ibo. data -> getBuffer (), ibo.data ->getBufferSize (), primitive, primType, numPrimitives, ibo.name ) ;
466- }
467- }
468- }
470+ }
471+ else
472+ {
473+ int numPrimitives = ibo.data ->getBufferSize () / ibo.indexSize ;
474+ iboMan. addInMemoryIBO (ibo. data -> getBuffer (), ibo. data -> getBufferSize (), primitive, primType, numPrimitives, ibo. name );
475+ }
476+ }
469477
470478 // Add default identity transform to the object globally (instead of per-pass)
471479 glm::mat4 xform;
@@ -484,23 +492,30 @@ namespace SCIRun {
484492 if (pass.renderType == Core::Datatypes::GeometryObject::RENDER_VBO_IBO)
485493 {
486494 addVBOToEntity (entityID, pass.vboName );
487- for ( int i = 0 ; i <= 6 ; ++i )
495+ if ( mRenderSortType == RenderState::TransparencySortType::LISTS_SORT )
488496 {
489- std::string name = pass.iboName ;
490- if (i == 0 )
491- name += " X" ;
492- if (i == 1 )
493- name += " Y" ;
494- if (i == 2 )
495- name += " Z" ;
496- if (i == 3 )
497- name += " NegX" ;
498- if (i == 4 )
499- name += " NegY" ;
500- if (i == 5 )
501- name += " NegZ" ;
502-
503- addIBOToEntity (entityID, name);
497+ for (int i = 0 ; i <= 6 ; ++i)
498+ {
499+ std::string name = pass.iboName ;
500+ if (i == 1 )
501+ name += " X" ;
502+ if (i == 2 )
503+ name += " Y" ;
504+ if (i == 3 )
505+ name += " Z" ;
506+ if (i == 4 )
507+ name += " NegX" ;
508+ if (i == 5 )
509+ name += " NegY" ;
510+ if (i == 6 )
511+ name += " NegZ" ;
512+
513+ addIBOToEntity (entityID, name);
514+ }
515+ }
516+ else
517+ {
518+ addIBOToEntity (entityID, pass.iboName );
504519 }
505520 }
506521 else
0 commit comments