diff --git a/src/Core/Algorithms/Visualization/RenderFieldState.h b/src/Core/Algorithms/Visualization/RenderFieldState.h index 30dac9dd76..a579e7a1e7 100644 --- a/src/Core/Algorithms/Visualization/RenderFieldState.h +++ b/src/Core/Algorithms/Visualization/RenderFieldState.h @@ -56,9 +56,11 @@ class RenderState // Node flags USE_SPHERE, + USE_TRANSPARENT_NODES, // Edge flags USE_CYLINDER, + USE_TRANSPARENT_EDGES, // Face flags USE_NORMALS, diff --git a/src/Interface/Modules/Render/ES/SRInterface.cc b/src/Interface/Modules/Render/ES/SRInterface.cc index d7badb172b..5ab3828ead 100644 --- a/src/Interface/Modules/Render/ES/SRInterface.cc +++ b/src/Interface/Modules/Render/ES/SRInterface.cc @@ -344,128 +344,136 @@ namespace SCIRun { // Add index buffer objects. nameIndex = 0; - for (auto it = obj->mIBOs.cbegin(); it != obj->mIBOs.cend(); ++it, ++nameIndex) - { - const Core::Datatypes::GeometryObject::SpireIBO& ibo = *it; - GLenum primType = GL_UNSIGNED_SHORT; - switch (ibo.indexSize) - { - case 1: // 8-bit - primType = GL_UNSIGNED_BYTE; - break; - - case 2: // 16-bit - primType = GL_UNSIGNED_SHORT; - break; - - case 4: // 32-bit - primType = GL_UNSIGNED_INT; - break; - - default: - primType = GL_UNSIGNED_INT; - throw std::invalid_argument("Unable to determine index buffer depth."); - break; - } + for (auto it = obj->mIBOs.cbegin(); it != obj->mIBOs.cend(); ++it, ++nameIndex) + { + const Core::Datatypes::GeometryObject::SpireIBO& ibo = *it; + GLenum primType = GL_UNSIGNED_SHORT; + switch (ibo.indexSize) + { + case 1: // 8-bit + primType = GL_UNSIGNED_BYTE; + break; + + case 2: // 16-bit + primType = GL_UNSIGNED_SHORT; + break; + + case 4: // 32-bit + primType = GL_UNSIGNED_INT; + break; + + default: + primType = GL_UNSIGNED_INT; + throw std::invalid_argument("Unable to determine index buffer depth."); + break; + } - GLenum primitive = GL_TRIANGLES; - switch (ibo.prim) - { - case Core::Datatypes::GeometryObject::SpireIBO::POINTS: - primitive = GL_POINTS; - break; - - case Core::Datatypes::GeometryObject::SpireIBO::LINES: - primitive = GL_LINES; - break; - - case Core::Datatypes::GeometryObject::SpireIBO::TRIANGLES: - default: - primitive = GL_TRIANGLES; - break; - } - /// Create sorted lists of Buffers for transparency in each direction of the axis - uint32_t* ibo_buffer = reinterpret_cast(ibo.data->getBuffer()); - size_t num_triangles = ibo.data->getBufferSize() / (sizeof(uint32_t) * 3); - Core::Geometry::Vector dir(0.0, 0.0, 0.0); + GLenum primitive = GL_TRIANGLES; + switch (ibo.prim) + { + case Core::Datatypes::GeometryObject::SpireIBO::POINTS: + primitive = GL_POINTS; + break; + + case Core::Datatypes::GeometryObject::SpireIBO::LINES: + primitive = GL_LINES; + break; + + case Core::Datatypes::GeometryObject::SpireIBO::TRIANGLES: + default: + primitive = GL_TRIANGLES; + break; + } - std::vector rel_depth(num_triangles); - for (int i = 0; i <= 6; ++i) + if (mRenderSortType == RenderState::TransparencySortType::LISTS_SORT) { - std::string name = ibo.name; - - if (i == 0) - { - dir = Core::Geometry::Vector(1.0, 0.0, 0.0); - name += "X"; - } - if (i == 1) - { - dir = Core::Geometry::Vector(0.0, 1.0, 0.0); - name += "Y"; - } - if (i == 2) - { - dir = Core::Geometry::Vector(0.0, 0.0, 1.0); - name += "Z"; - } - if (i == 3) - { - dir = Core::Geometry::Vector(-1.0, 0.0, 0.0); - name += "NegX"; - } - if (i == 4) - { - dir = Core::Geometry::Vector(0.0, -1.0, 0.0); - name += "NegY"; - } - if (i == 5) - { - dir = Core::Geometry::Vector(0.0, 0.0, -1.0); - name += "NegZ"; - } - if (i < 6) + /// Create sorted lists of Buffers for transparency in each direction of the axis + uint32_t* ibo_buffer = reinterpret_cast(ibo.data->getBuffer()); + size_t num_triangles = ibo.data->getBufferSize() / (sizeof(uint32_t) * 3); + Core::Geometry::Vector dir(0.0, 0.0, 0.0); + + std::vector rel_depth(num_triangles); + for (int i = 0; i <= 6; ++i) { - for (size_t j = 0; j < num_triangles; j++) + std::string name = ibo.name; + if (i == 0) + { + int numPrimitives = ibo.data->getBufferSize() / ibo.indexSize; + iboMan.addInMemoryIBO(ibo.data->getBuffer(), ibo.data->getBufferSize(), primitive, primType, numPrimitives, ibo.name); + } + if (i == 1) { - float* vertex1 = reinterpret_cast(vbo_buffer[nameIndex] + stride_vbo[nameIndex] * (ibo_buffer[j * 3])); - Core::Geometry::Point node1(vertex1[0], vertex1[1], vertex1[2]); + dir = Core::Geometry::Vector(1.0, 0.0, 0.0); + name += "X"; + } + if (i == 2) + { + dir = Core::Geometry::Vector(0.0, 1.0, 0.0); + name += "Y"; + } + if (i == 3) + { + dir = Core::Geometry::Vector(0.0, 0.0, 1.0); + name += "Z"; + } + if (i == 4) + { + dir = Core::Geometry::Vector(-1.0, 0.0, 0.0); + name += "NegX"; + } + if (i == 5) + { + dir = Core::Geometry::Vector(0.0, -1.0, 0.0); + name += "NegY"; + } + if (i == 6) + { + dir = Core::Geometry::Vector(0.0, 0.0, -1.0); + name += "NegZ"; + } + if (i > 0) + { + for (size_t j = 0; j < num_triangles; j++) + { + float* vertex1 = reinterpret_cast(vbo_buffer[nameIndex] + stride_vbo[nameIndex] * (ibo_buffer[j * 3])); + Core::Geometry::Point node1(vertex1[0], vertex1[1], vertex1[2]); - float* vertex2 = reinterpret_cast(vbo_buffer[nameIndex] + stride_vbo[nameIndex] * (ibo_buffer[j * 3 + 1])); - Core::Geometry::Point node2(vertex2[0], vertex2[1], vertex2[2]); + float* vertex2 = reinterpret_cast(vbo_buffer[nameIndex] + stride_vbo[nameIndex] * (ibo_buffer[j * 3 + 1])); + Core::Geometry::Point node2(vertex2[0], vertex2[1], vertex2[2]); - float* vertex3 = reinterpret_cast(vbo_buffer[nameIndex] + stride_vbo[nameIndex] * (ibo_buffer[j * 3 + 2])); - Core::Geometry::Point node3(vertex3[0], vertex3[1], vertex3[2]); + float* vertex3 = reinterpret_cast(vbo_buffer[nameIndex] + stride_vbo[nameIndex] * (ibo_buffer[j * 3 + 2])); + Core::Geometry::Point node3(vertex3[0], vertex3[1], vertex3[2]); - rel_depth[j].mDepth = Core::Geometry::Dot(dir, node1) + Core::Geometry::Dot(dir, node2) + Core::Geometry::Dot(dir, node3); - rel_depth[j].mIndex = j; - } + rel_depth[j].mDepth = Core::Geometry::Dot(dir, node1) + Core::Geometry::Dot(dir, node2) + Core::Geometry::Dot(dir, node3); + rel_depth[j].mIndex = j; + } - std::sort(rel_depth.begin(), rel_depth.end()); + std::sort(rel_depth.begin(), rel_depth.end()); - int numPrimitives = ibo.data->getBufferSize() / ibo.indexSize; + int numPrimitives = ibo.data->getBufferSize() / ibo.indexSize; - std::vector sorted_buffer(ibo.data->getBufferSize()); - char* ibuffer = reinterpret_cast(ibo.data->getBuffer()); - char* sbuffer = !sorted_buffer.empty() ? reinterpret_cast(&sorted_buffer[0]) : 0; - - if (sbuffer && num_triangles > 0) - { - size_t tri_size = ibo.data->getBufferSize() / num_triangles; - for (size_t j = 0; j < num_triangles; j++) + std::vector sorted_buffer(ibo.data->getBufferSize()); + char* ibuffer = reinterpret_cast(ibo.data->getBuffer()); + char* sbuffer = !sorted_buffer.empty() ? reinterpret_cast(&sorted_buffer[0]) : 0; + + if (sbuffer && num_triangles > 0) { - memcpy(sbuffer + j * tri_size, ibuffer + rel_depth[j].mIndex * tri_size, tri_size); + size_t tri_size = ibo.data->getBufferSize() / num_triangles; + for (size_t j = 0; j < num_triangles; j++) + { + memcpy(sbuffer + j * tri_size, ibuffer + rel_depth[j].mIndex * tri_size, tri_size); + } + iboMan.addInMemoryIBO(sbuffer, ibo.data->getBufferSize(), primitive, primType, numPrimitives, name); } - iboMan.addInMemoryIBO(sbuffer, ibo.data->getBufferSize(), primitive, primType, numPrimitives, name); } } - else - { - int numPrimitives = ibo.data->getBufferSize() / ibo.indexSize; - iboMan.addInMemoryIBO(ibo.data->getBuffer(), ibo.data->getBufferSize(), primitive, primType, numPrimitives, ibo.name); - } - } - } + } + else + { + int numPrimitives = ibo.data->getBufferSize() / ibo.indexSize; + iboMan.addInMemoryIBO(ibo.data->getBuffer(), ibo.data->getBufferSize(), primitive, primType, numPrimitives, ibo.name); + } + } // Add default identity transform to the object globally (instead of per-pass) glm::mat4 xform; @@ -484,23 +492,30 @@ namespace SCIRun { if (pass.renderType == Core::Datatypes::GeometryObject::RENDER_VBO_IBO) { addVBOToEntity(entityID, pass.vboName); - for (int i = 0; i <= 6; ++i) + if (mRenderSortType == RenderState::TransparencySortType::LISTS_SORT) { - std::string name = pass.iboName; - if (i == 0) - name += "X"; - if (i == 1) - name += "Y"; - if (i == 2) - name += "Z"; - if (i == 3) - name += "NegX"; - if (i == 4) - name += "NegY"; - if (i == 5) - name += "NegZ"; - - addIBOToEntity(entityID, name); + for (int i = 0; i <= 6; ++i) + { + std::string name = pass.iboName; + if (i == 1) + name += "X"; + if (i == 2) + name += "Y"; + if (i == 3) + name += "Z"; + if (i == 4) + name += "NegX"; + if (i == 5) + name += "NegY"; + if (i == 6) + name += "NegZ"; + + addIBOToEntity(entityID, name); + } + } + else + { + addIBOToEntity(entityID, pass.iboName); } } else diff --git a/src/Interface/Modules/Render/ES/systems/RenderBasicSys.cc b/src/Interface/Modules/Render/ES/systems/RenderBasicSys.cc index 6af3c39c33..e6ee8ccf16 100644 --- a/src/Interface/Modules/Render/ES/systems/RenderBasicSys.cc +++ b/src/Interface/Modules/Render/ES/systems/RenderBasicSys.cc @@ -98,20 +98,15 @@ class RenderBasicSys : return; } - if (srstate.front().state.get(RenderState::USE_TRANSPARENCY)) + if (srstate.front().state.get(RenderState::USE_TRANSPARENCY) || + srstate.front().state.get(RenderState::USE_TRANSPARENT_EDGES) || + srstate.front().state.get(RenderState::USE_TRANSPARENT_NODES)) { return; } GLuint iboID = ibo.front().glid; - int index = 0; - for (auto it = ibo.begin(); it != ibo.end(); ++it, ++index) - { - if (index == 6) - iboID = it->glid; - } - // Setup *everything*. We don't want to enter multiple conditional // statements if we can avoid it. So we assume everything has not been // setup (including uniforms) if the simple geom hasn't been setup. diff --git a/src/Interface/Modules/Render/ES/systems/RenderColorMapSys.cc b/src/Interface/Modules/Render/ES/systems/RenderColorMapSys.cc index 18db7054ea..a9fd66faeb 100644 --- a/src/Interface/Modules/Render/ES/systems/RenderColorMapSys.cc +++ b/src/Interface/Modules/Render/ES/systems/RenderColorMapSys.cc @@ -98,20 +98,15 @@ class RenderColorMapSys : return; } - if (srstate.front().state.get(RenderState::USE_TRANSPARENCY)) + if (srstate.front().state.get(RenderState::USE_TRANSPARENCY) || + srstate.front().state.get(RenderState::USE_TRANSPARENT_EDGES) || + srstate.front().state.get(RenderState::USE_TRANSPARENT_NODES)) { return; } GLuint iboID = ibo.front().glid; - - int index = 0; - for (auto it = ibo.begin(); it != ibo.end(); ++it, ++index) - { - if (index == 6) - iboID = it->glid; - } - + // Setup *everything*. We don't want to enter multiple conditional // statements if we can avoid it. So we assume everything has not been // setup (including uniforms) if the simple geom hasn't been setup. diff --git a/src/Interface/Modules/Render/ES/systems/RenderTransBasicSys.cc b/src/Interface/Modules/Render/ES/systems/RenderTransBasicSys.cc index 94e67ee70d..160c6eede5 100644 --- a/src/Interface/Modules/Render/ES/systems/RenderTransBasicSys.cc +++ b/src/Interface/Modules/Render/ES/systems/RenderTransBasicSys.cc @@ -78,8 +78,25 @@ class RenderBasicSysTrans : } private: + class SortedObject + { + public: + std::string mName; + GLuint mSortedID; + + SortedObject() : + mName(""), + mSortedID(NULL) + {} + + SortedObject(std::string name, GLuint ID) : + mName(name), + mSortedID(ID) + {} + }; + Core::Geometry::Vector prevDir = Core::Geometry::Vector(0.0); - GLuint sortedID = NULL; + std::vector sortedObjects; class DepthIndex { public: @@ -140,18 +157,23 @@ class RenderBasicSysTrans : std::vector sorted_buffer(pass.front().ibo.data->getBufferSize()); char* ibuffer = reinterpret_cast(pass.front().ibo.data->getBuffer()); - char* sbuffer = reinterpret_cast(&sorted_buffer[0]); - size_t tri_size = pass.front().ibo.data->getBufferSize() / num_triangles; - - for (size_t j = 0; j < num_triangles; j++) + char* sbuffer = !sorted_buffer.empty() ? reinterpret_cast(&sorted_buffer[0]) : 0; + GLuint result = ibo.front().glid; + if (sbuffer && num_triangles > 0) { - memcpy(sbuffer + j * tri_size, ibuffer + rel_depth[j].mIndex * tri_size, tri_size); - } + size_t tri_size = pass.front().ibo.data->getBufferSize() / num_triangles; - std::string transIBOName = pass.front().ibo.name + "trans"; + for (size_t j = 0; j < num_triangles; j++) + { + memcpy(sbuffer + j * tri_size, ibuffer + rel_depth[j].mIndex * tri_size, tri_size); + } - return iboMan.front().instance->addInMemoryIBO(sbuffer, pass.front().ibo.data->getBufferSize(), ibo.front().primMode, ibo.front().primType, - numPrimitives, transIBOName); + std::string transIBOName = pass.front().ibo.name + "trans"; + result = iboMan.front().instance->addInMemoryIBO(sbuffer, pass.front().ibo.data->getBufferSize(), ibo.front().primMode, ibo.front().primType, + numPrimitives, transIBOName); + } + + return result; } void groupExecute( @@ -182,60 +204,26 @@ class RenderBasicSysTrans : return; } - if (!srstate.front().state.get(RenderState::USE_TRANSPARENCY)) + if (!srstate.front().state.get(RenderState::USE_TRANSPARENCY) && + !srstate.front().state.get(RenderState::USE_TRANSPARENT_EDGES) && + !srstate.front().state.get(RenderState::USE_TRANSPARENT_NODES)) { return; } - bool drawLines = (ibo.front().primMode == Core::Datatypes::GeometryObject::SpireIBO::LINES); GLuint iboID = ibo.front().glid; - GLuint iboXID = ibo.front().glid; - GLuint iboYID = ibo.front().glid; - GLuint iboZID = ibo.front().glid; - GLuint iboNegXID = ibo.front().glid; - GLuint iboNegYID = ibo.front().glid; - GLuint iboNegZID = ibo.front().glid; - GLuint iboLinesID = ibo.front().glid; - - - int index = 0; - for (auto it = ibo.begin(); it != ibo.end(); ++it, ++index) - { - - if (index == 0) - iboXID = it->glid; - if (index == 1) - iboYID = it->glid; - if (index == 2) - iboZID = it->glid; - if (index == 3) - iboNegXID = it->glid; - if (index == 4) - iboNegYID = it->glid; - if (index == 5) - iboNegZID = it->glid; - if (index == 6) - iboLinesID = it->glid; - } - Core::Geometry::Vector dir(camera.front().data.worldToView[0][2], - camera.front().data.worldToView[1][2], - camera.front().data.worldToView[2][2]); - + camera.front().data.worldToView[1][2], + camera.front().data.worldToView[2][2]); - if (sortedID == NULL) + if (sortedObjects.size() <= 0) { prevDir = dir; } - if (drawLines) - { - iboID = iboLinesID; - } - - else + if (!drawLines) { switch (pass.front().renderState.mSortType) { @@ -247,37 +235,75 @@ class RenderBasicSysTrans : } case RenderState::TransparencySortType::UPDATE_SORT: { + unsigned int index = 0; + bool indexed = false; + for (int i = 0; i < sortedObjects.size(); ++i) + { + if (sortedObjects[i].mName == pass.front().ibo.name) + { + indexed = true; + index = i; + } + } + if (!indexed) + { + index = sortedObjects.size(); + sortedObjects.push_back(SortedObject(pass.front().ibo.name, NULL)); + } + Core::Geometry::Vector diff = prevDir - dir; float distance = sqrtf(Core::Geometry::Dot(diff, diff)); - if (distance >= 1.23 || sortedID == NULL) + if (distance >= 1.23 || sortedObjects[index].mSortedID == NULL) { - if (sortedID != NULL) + if (sortedObjects[index].mSortedID != NULL) { - iboMan.front().instance->removeInMemoryIBO(sortedID); + iboMan.front().instance->removeInMemoryIBO(sortedObjects[index].mSortedID); } prevDir = dir; - sortedID = sortObjects(dir, ibo, pass, iboMan); + sortedObjects[index].mSortedID = sortObjects(dir, ibo, pass, iboMan); } - iboID = sortedID; - //std::cout << "update" << std::endl; + iboID = sortedObjects[index].mSortedID; + //::cout << "update" << std::endl; break; } case RenderState::TransparencySortType::LISTS_SORT: { + GLuint iboXID = ibo.front().glid; + GLuint iboYID = ibo.front().glid; + GLuint iboZID = ibo.front().glid; + GLuint iboNegXID = ibo.front().glid; + GLuint iboNegYID = ibo.front().glid; + GLuint iboNegZID = ibo.front().glid; + + int index = 0; + for (auto it = ibo.begin(); it != ibo.end(); ++it, ++index) + { + if (index == 1) + iboXID = it->glid; + if (index == 2) + iboYID = it->glid; + if (index == 3) + iboZID = it->glid; + if (index == 4) + iboNegXID = it->glid; + if (index == 5) + iboNegYID = it->glid; + if (index == 6) + iboNegZID = it->glid; + } + Core::Geometry::Vector currentDir(camera.front().data.worldToView[0][2], - camera.front().data.worldToView[1][2], - camera.front().data.worldToView[2][2]); + camera.front().data.worldToView[1][2], + camera.front().data.worldToView[2][2]); Core::Geometry::Vector absDir(abs(camera.front().data.worldToView[0][2]), - abs(camera.front().data.worldToView[1][2]), - abs(camera.front().data.worldToView[2][2])); - + abs(camera.front().data.worldToView[1][2]), + abs(camera.front().data.worldToView[2][2])); double xORy = absDir.x() > absDir.y() ? absDir.x() : absDir.y(); double orZ = absDir.z() > xORy ? absDir.z() : xORy; - if (orZ == absDir.x()) { iboID = currentDir.x() < orZ ? iboNegXID : iboXID; @@ -296,7 +322,6 @@ class RenderBasicSysTrans : } } - // Setup *everything*. We don't want to enter multiple conditional // statements if we can avoid it. So we assume everything has not been // setup (including uniforms) if the simple geom hasn't been setup. diff --git a/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc b/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc index e702bb4035..142c37c126 100644 --- a/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc +++ b/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc @@ -75,8 +75,25 @@ class RenderColorMapSysTrans : } private: + class SortedObject + { + public: + std::string mName; + GLuint mSortedID; + + SortedObject() : + mName(""), + mSortedID(NULL) + {} + + SortedObject(std::string name, GLuint ID) : + mName(name), + mSortedID(ID) + {} + }; + Core::Geometry::Vector prevDir = Core::Geometry::Vector(0.0); - GLuint sortedID = NULL; + std::vector sortedObjects; class DepthIndex { public: @@ -137,18 +154,23 @@ class RenderColorMapSysTrans : std::vector sorted_buffer(pass.front().ibo.data->getBufferSize()); char* ibuffer = reinterpret_cast(pass.front().ibo.data->getBuffer()); - char* sbuffer = reinterpret_cast(&sorted_buffer[0]); - size_t tri_size = pass.front().ibo.data->getBufferSize() / num_triangles; - - for (size_t j = 0; j < num_triangles; j++) + char* sbuffer = !sorted_buffer.empty() ? reinterpret_cast(&sorted_buffer[0]) : 0; + GLuint result = ibo.front().glid; + if (sbuffer && num_triangles > 0) { - memcpy(sbuffer + j * tri_size, ibuffer + rel_depth[j].mIndex * tri_size, tri_size); - } + size_t tri_size = pass.front().ibo.data->getBufferSize() / num_triangles; - std::string transIBOName = pass.front().ibo.name + "trans"; + for (size_t j = 0; j < num_triangles; j++) + { + memcpy(sbuffer + j * tri_size, ibuffer + rel_depth[j].mIndex * tri_size, tri_size); + } - return iboMan.front().instance->addInMemoryIBO(sbuffer, pass.front().ibo.data->getBufferSize(), ibo.front().primMode, ibo.front().primType, - numPrimitives, transIBOName); + std::string transIBOName = pass.front().ibo.name + "trans"; + result = iboMan.front().instance->addInMemoryIBO(sbuffer, pass.front().ibo.data->getBufferSize(), ibo.front().primMode, ibo.front().primType, + numPrimitives, transIBOName); + } + + return result; } void groupExecute( @@ -180,59 +202,26 @@ class RenderColorMapSysTrans : return; } - if (!srstate.front().state.get(RenderState::USE_TRANSPARENCY)) + if (!srstate.front().state.get(RenderState::USE_TRANSPARENCY) && + !srstate.front().state.get(RenderState::USE_TRANSPARENT_EDGES) && + !srstate.front().state.get(RenderState::USE_TRANSPARENT_NODES)) { return; } - bool drawLines = (ibo.front().primMode == Core::Datatypes::GeometryObject::SpireIBO::LINES); - GLuint iboID = ibo.front().glid; - GLuint iboXID = ibo.front().glid; - GLuint iboYID = ibo.front().glid; - GLuint iboZID = ibo.front().glid; - GLuint iboNegXID = ibo.front().glid; - GLuint iboNegYID = ibo.front().glid; - GLuint iboNegZID = ibo.front().glid; - GLuint iboLinesID = ibo.front().glid; - - - - int index = 0; - for (auto it = ibo.begin(); it != ibo.end(); ++it, ++index) - { - if (index == 0) - iboXID = it->glid; - if (index == 1) - iboYID = it->glid; - if (index == 2) - iboZID = it->glid; - if (index == 3) - iboNegXID = it->glid; - if (index == 4) - iboNegYID = it->glid; - if (index == 5) - iboNegZID = it->glid; - if (index == 6) - iboLinesID = it->glid; - } - + GLuint iboID = ibo.front().glid; Core::Geometry::Vector dir(camera.front().data.worldToView[0][2], camera.front().data.worldToView[1][2], camera.front().data.worldToView[2][2]); - - - if (sortedID == NULL) + + if (sortedObjects.size() <=0) { prevDir = dir; } - if (drawLines) - { - iboID = iboLinesID; - } - else + if (!drawLines) { switch (pass.front().renderState.mSortType) { @@ -244,37 +233,75 @@ class RenderColorMapSysTrans : } case RenderState::TransparencySortType::UPDATE_SORT: { + unsigned int index = 0; + bool indexed = false; + for (int i = 0; i < sortedObjects.size(); ++i) + { + if (sortedObjects[i].mName == pass.front().ibo.name) + { + indexed = true; + index = i; + } + } + if (!indexed) + { + index = sortedObjects.size(); + sortedObjects.push_back(SortedObject(pass.front().ibo.name, NULL)); + } + Core::Geometry::Vector diff = prevDir - dir; float distance = sqrtf(Core::Geometry::Dot(diff, diff)); - if (distance >= 1.23 || sortedID == NULL) + if (distance >= 1.23 || sortedObjects[index].mSortedID == NULL) { - if (sortedID != NULL) + if (sortedObjects[index].mSortedID != NULL) { - iboMan.front().instance->removeInMemoryIBO(sortedID); + iboMan.front().instance->removeInMemoryIBO(sortedObjects[index].mSortedID); } prevDir = dir; - sortedID = sortObjects(dir, ibo, pass, iboMan); + sortedObjects[index].mSortedID = sortObjects(dir, ibo, pass, iboMan); } - iboID = sortedID; + iboID = sortedObjects[index].mSortedID; //::cout << "update" << std::endl; break; } case RenderState::TransparencySortType::LISTS_SORT: { + GLuint iboXID = ibo.front().glid; + GLuint iboYID = ibo.front().glid; + GLuint iboZID = ibo.front().glid; + GLuint iboNegXID = ibo.front().glid; + GLuint iboNegYID = ibo.front().glid; + GLuint iboNegZID = ibo.front().glid; + + int index = 0; + for (auto it = ibo.begin(); it != ibo.end(); ++it, ++index) + { + if (index == 1) + iboXID = it->glid; + if (index == 2) + iboYID = it->glid; + if (index == 3) + iboZID = it->glid; + if (index == 4) + iboNegXID = it->glid; + if (index == 5) + iboNegYID = it->glid; + if (index == 6) + iboNegZID = it->glid; + } + Core::Geometry::Vector currentDir(camera.front().data.worldToView[0][2], - camera.front().data.worldToView[1][2], - camera.front().data.worldToView[2][2]); + camera.front().data.worldToView[1][2], + camera.front().data.worldToView[2][2]); Core::Geometry::Vector absDir(abs(camera.front().data.worldToView[0][2]), - abs(camera.front().data.worldToView[1][2]), - abs(camera.front().data.worldToView[2][2])); - + abs(camera.front().data.worldToView[1][2]), + abs(camera.front().data.worldToView[2][2])); double xORy = absDir.x() > absDir.y() ? absDir.x() : absDir.y(); double orZ = absDir.z() > xORy ? absDir.z() : xORy; - if (orZ == absDir.x()) { iboID = currentDir.x() < orZ ? iboNegXID : iboXID; @@ -293,7 +320,6 @@ class RenderColorMapSysTrans : } } - // Setup *everything*. We don't want to enter multiple conditional // statements if we can avoid it. So we assume everything has not been // setup (including uniforms) if the simple geom hasn't been setup. @@ -512,7 +538,6 @@ class RenderColorMapSysTrans : } } - if (depthMask) { GL(glDepthMask(GL_TRUE)); diff --git a/src/Modules/Visualization/ShowField.cc b/src/Modules/Visualization/ShowField.cc index 580fed11ad..319057dfe7 100644 --- a/src/Modules/Visualization/ShowField.cc +++ b/src/Modules/Visualization/ShowField.cc @@ -73,7 +73,7 @@ void ShowFieldModule::setStateDefaults() state->setValue(NodeTransparency, false); state->setValue(EdgeTransparency, false); state->setValue(FaceTransparency, false); - state->setValue(DefaultMeshColor, ColorRGB(1.0, 1.0, 1.0).toString()); + state->setValue(DefaultMeshColor, ColorRGB(0.5, 0.5, 0.5).toString()); //state->setValue(NodeAsPoints, true); //not used state->setValue(NodeAsSpheres, 0); @@ -118,7 +118,7 @@ RenderState ShowFieldModule::getNodeRenderState( RenderState renState; renState.set(RenderState::IS_ON, state->getValue(ShowFieldModule::ShowNodes).toBool()); - renState.set(RenderState::USE_TRANSPARENCY, state->getValue(ShowFieldModule::NodeTransparency).toBool()); + renState.set(RenderState::USE_TRANSPARENT_NODES, state->getValue(ShowFieldModule::NodeTransparency).toBool()); renState.set(RenderState::USE_SPHERE, state->getValue(ShowFieldModule::NodeAsSpheres).toInt() == 1); @@ -156,7 +156,7 @@ RenderState ShowFieldModule::getEdgeRenderState( RenderState renState; renState.set(RenderState::IS_ON, state->getValue(ShowFieldModule::ShowEdges).toBool()); - renState.set(RenderState::USE_TRANSPARENCY, state->getValue(ShowFieldModule::EdgeTransparency).toBool()); + renState.set(RenderState::USE_TRANSPARENT_EDGES, state->getValue(ShowFieldModule::EdgeTransparency).toBool()); renState.set(RenderState::USE_CYLINDER, state->getValue(ShowFieldModule::EdgesAsCylinders).toInt() == 1); renState.defaultColor = ColorRGB(state->getValue(ShowFieldModule::DefaultMeshColor).toString()); @@ -1303,7 +1303,7 @@ void ShowFieldModule::renderNodes( } attribs.push_back(GeometryObject::SpireVBO::AttributeData("aFieldData", 1 * sizeof(float))); - if (state.get(RenderState::USE_TRANSPARENCY)) + if (state.get(RenderState::USE_TRANSPARENT_NODES)) { uniforms.push_back(GeometryObject::SpireSubPass::Uniform("uTransparency", (float)(0.75f))); } @@ -1330,7 +1330,7 @@ void ShowFieldModule::renderNodes( glm::vec4(0.1f, 0.1f, 0.1f, 0.1f))); uniforms.push_back(GeometryObject::SpireSubPass::Uniform("uSpecularPower", 32.0f)); - if (state.get(RenderState::USE_TRANSPARENCY)) + if (state.get(RenderState::USE_TRANSPARENT_NODES)) { uniforms.push_back(GeometryObject::SpireSubPass::Uniform( "uDiffuseColor", glm::vec4(defaultColor.r(), defaultColor.g(), defaultColor.b(), 0.7f))); @@ -1345,7 +1345,7 @@ void ShowFieldModule::renderNodes( { shader = "Shaders/UniformColor"; - if (state.get(RenderState::USE_TRANSPARENCY)) + if (state.get(RenderState::USE_TRANSPARENT_NODES)) { /// \todo Add transparency slider. uniforms.push_back(GeometryObject::SpireSubPass::Uniform( @@ -1463,7 +1463,7 @@ void ShowFieldModule::renderEdges( std::vector uniforms; //transparency - if (state.get(RenderState::USE_TRANSPARENCY)) + if (state.get(RenderState::USE_TRANSPARENT_EDGES)) uniforms.push_back(GeometryObject::SpireSubPass::Uniform("uTransparency", (float)(edgeTransparencyValue_))); //coloring if (colorScheme == GeometryObject::COLOR_MAP) {