Skip to content

Commit 6457c73

Browse files
committed
Merge pull request #875 from SCIInstitute/fix-transparency
Fix transparency
2 parents 1cebadb + 97f17c7 commit 6457c73

File tree

7 files changed

+331
-274
lines changed

7 files changed

+331
-274
lines changed

src/Core/Algorithms/Visualization/RenderFieldState.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,11 @@ class RenderState
5656

5757
// Node flags
5858
USE_SPHERE,
59+
USE_TRANSPARENT_NODES,
5960

6061
// Edge flags
6162
USE_CYLINDER,
63+
USE_TRANSPARENT_EDGES,
6264

6365
// Face flags
6466
USE_NORMALS,

src/Interface/Modules/Render/ES/SRInterface.cc

Lines changed: 138 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/Interface/Modules/Render/ES/systems/RenderBasicSys.cc

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,20 +98,15 @@ class RenderBasicSys :
9898
return;
9999
}
100100

101-
if (srstate.front().state.get(RenderState::USE_TRANSPARENCY))
101+
if (srstate.front().state.get(RenderState::USE_TRANSPARENCY) ||
102+
srstate.front().state.get(RenderState::USE_TRANSPARENT_EDGES) ||
103+
srstate.front().state.get(RenderState::USE_TRANSPARENT_NODES))
102104
{
103105
return;
104106
}
105107

106108
GLuint iboID = ibo.front().glid;
107109

108-
int index = 0;
109-
for (auto it = ibo.begin(); it != ibo.end(); ++it, ++index)
110-
{
111-
if (index == 6)
112-
iboID = it->glid;
113-
}
114-
115110
// Setup *everything*. We don't want to enter multiple conditional
116111
// statements if we can avoid it. So we assume everything has not been
117112
// setup (including uniforms) if the simple geom hasn't been setup.

src/Interface/Modules/Render/ES/systems/RenderColorMapSys.cc

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,20 +98,15 @@ class RenderColorMapSys :
9898
return;
9999
}
100100

101-
if (srstate.front().state.get(RenderState::USE_TRANSPARENCY))
101+
if (srstate.front().state.get(RenderState::USE_TRANSPARENCY) ||
102+
srstate.front().state.get(RenderState::USE_TRANSPARENT_EDGES) ||
103+
srstate.front().state.get(RenderState::USE_TRANSPARENT_NODES))
102104
{
103105
return;
104106
}
105107

106108
GLuint iboID = ibo.front().glid;
107-
108-
int index = 0;
109-
for (auto it = ibo.begin(); it != ibo.end(); ++it, ++index)
110-
{
111-
if (index == 6)
112-
iboID = it->glid;
113-
}
114-
109+
115110
// Setup *everything*. We don't want to enter multiple conditional
116111
// statements if we can avoid it. So we assume everything has not been
117112
// setup (including uniforms) if the simple geom hasn't been setup.

0 commit comments

Comments
 (0)