From f7fec695dd1024d19a02d18808b1315f489b4441 Mon Sep 17 00:00:00 2001 From: cbrightsci Date: Thu, 12 Feb 2015 15:25:18 -0700 Subject: [PATCH 1/3] Closes #868 --- .../Visualization/RenderFieldState.h | 2 + .../Modules/Render/ES/SRInterface.cc | 35 +++-- .../Render/ES/systems/RenderBasicSys.cc | 11 +- .../Render/ES/systems/RenderColorMapSys.cc | 13 +- .../Render/ES/systems/RenderTransBasicSys.cc | 83 +++++------- .../ES/systems/RenderTransColorMapSys.cc | 128 ++++++++++-------- src/Modules/Visualization/ShowField.cc | 14 +- 7 files changed, 143 insertions(+), 143 deletions(-) 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 663fdf1323..fadec5ac6d 100644 --- a/src/Interface/Modules/Render/ES/SRInterface.cc +++ b/src/Interface/Modules/Render/ES/SRInterface.cc @@ -393,38 +393,42 @@ namespace SCIRun { for (int i = 0; i <= 6; ++i) { 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) { dir = Core::Geometry::Vector(1.0, 0.0, 0.0); name += "X"; } - if (i == 1) + if (i == 2) { dir = Core::Geometry::Vector(0.0, 1.0, 0.0); name += "Y"; } - if (i == 2) + if (i == 3) { dir = Core::Geometry::Vector(0.0, 0.0, 1.0); name += "Z"; } - if (i == 3) + if (i == 4) { dir = Core::Geometry::Vector(-1.0, 0.0, 0.0); name += "NegX"; } - if (i == 4) + if (i == 5) { dir = Core::Geometry::Vector(0.0, -1.0, 0.0); name += "NegY"; } - if (i == 5) + if (i == 6) { dir = Core::Geometry::Vector(0.0, 0.0, -1.0); name += "NegZ"; } - if (i < 6) + if (i > 0) { for (size_t j = 0; j < num_triangles; j++) { @@ -457,11 +461,6 @@ namespace SCIRun { 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); - } } } @@ -485,17 +484,17 @@ namespace SCIRun { for (int i = 0; i <= 6; ++i) { std::string name = pass.iboName; - if (i == 0) - name += "X"; if (i == 1) - name += "Y"; + name += "X"; if (i == 2) - name += "Z"; + name += "Y"; if (i == 3) - name += "NegX"; + name += "Z"; if (i == 4) - name += "NegY"; + name += "NegX"; if (i == 5) + name += "NegY"; + if (i == 6) name += "NegZ"; addIBOToEntity(entityID, name); 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..a1df00d956 100644 --- a/src/Interface/Modules/Render/ES/systems/RenderTransBasicSys.cc +++ b/src/Interface/Modules/Render/ES/systems/RenderTransBasicSys.cc @@ -182,60 +182,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) { prevDir = dir; } - if (drawLines) - { - iboID = iboLinesID; - } - - else + if (!drawLines) { switch (pass.front().renderState.mSortType) { @@ -259,25 +225,47 @@ class RenderBasicSysTrans : sortedID = sortObjects(dir, ibo, pass, iboMan); } iboID = sortedID; - //std::cout << "update" << std::endl; + //::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 +284,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..0f0c99883e 100644 --- a/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc +++ b/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc @@ -75,7 +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); + std::vector sortedObjects; GLuint sortedID = NULL; class DepthIndex { @@ -180,59 +198,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 +229,76 @@ 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); + std::cout << "remove from mem" << std::endl; + 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 +317,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 +535,6 @@ class RenderColorMapSysTrans : } } - if (depthMask) { GL(glDepthMask(GL_TRUE)); diff --git a/src/Modules/Visualization/ShowField.cc b/src/Modules/Visualization/ShowField.cc index fb7f9ee15a..e59769256c 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); @@ -148,7 +148,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()); @@ -1279,7 +1279,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))); } @@ -1306,7 +1306,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))); @@ -1321,7 +1321,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( @@ -1439,7 +1439,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) { From cfabe6e575da6d647c926be7c7bba6333d8dc16d Mon Sep 17 00:00:00 2001 From: cbrightsci Date: Thu, 12 Feb 2015 15:56:07 -0700 Subject: [PATCH 2/3] Closes #874 --- .../Render/ES/systems/RenderTransBasicSys.cc | 47 ++++++++++++++++--- .../ES/systems/RenderTransColorMapSys.cc | 2 - 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/Interface/Modules/Render/ES/systems/RenderTransBasicSys.cc b/src/Interface/Modules/Render/ES/systems/RenderTransBasicSys.cc index a1df00d956..bc49f5bb8e 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: @@ -196,7 +213,7 @@ class RenderBasicSysTrans : camera.front().data.worldToView[1][2], camera.front().data.worldToView[2][2]); - if (sortedID == NULL) + if (sortedObjects.size() <= 0) { prevDir = dir; } @@ -213,18 +230,34 @@ 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; + iboID = sortedObjects[index].mSortedID; //::cout << "update" << std::endl; break; } diff --git a/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc b/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc index 0f0c99883e..b1297b3ee3 100644 --- a/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc +++ b/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc @@ -94,7 +94,6 @@ class RenderColorMapSysTrans : Core::Geometry::Vector prevDir = Core::Geometry::Vector(0.0); std::vector sortedObjects; - GLuint sortedID = NULL; class DepthIndex { public: @@ -251,7 +250,6 @@ class RenderColorMapSysTrans : { if (sortedObjects[index].mSortedID != NULL) { - std::cout << "remove from mem" << std::endl; iboMan.front().instance->removeInMemoryIBO(sortedObjects[index].mSortedID); } prevDir = dir; From c30c310c234ff304f79d5a270ded6f97418b34ec Mon Sep 17 00:00:00 2001 From: cbrightsci Date: Thu, 12 Feb 2015 16:28:52 -0700 Subject: [PATCH 3/3] Fixed so lists aren't created unless that rendering type is selected --- .../Modules/Render/ES/SRInterface.cc | 178 ++++++++++-------- .../Render/ES/systems/RenderTransBasicSys.cc | 23 ++- .../ES/systems/RenderTransColorMapSys.cc | 23 ++- 3 files changed, 125 insertions(+), 99 deletions(-) diff --git a/src/Interface/Modules/Render/ES/SRInterface.cc b/src/Interface/Modules/Render/ES/SRInterface.cc index fadec5ac6d..deb23377d7 100644 --- a/src/Interface/Modules/Render/ES/SRInterface.cc +++ b/src/Interface/Modules/Render/ES/SRInterface.cc @@ -384,84 +384,93 @@ namespace SCIRun { 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); - 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) - { - int numPrimitives = ibo.data->getBufferSize() / ibo.indexSize; - iboMan.addInMemoryIBO(ibo.data->getBuffer(), ibo.data->getBufferSize(), primitive, primType, numPrimitives, ibo.name); - } - if (i == 1) - { - 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) + /// 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) + { + 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) { - 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(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 = reinterpret_cast(&sorted_buffer[0]); - size_t tri_size = ibo.data->getBufferSize() / num_triangles; + std::vector sorted_buffer(ibo.data->getBufferSize()); + char* ibuffer = reinterpret_cast(ibo.data->getBuffer()); + char* sbuffer = reinterpret_cast(&sorted_buffer[0]); + 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); - } + 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); + } } // Add default identity transform to the object globally (instead of per-pass) @@ -481,23 +490,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 == 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); + 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/RenderTransBasicSys.cc b/src/Interface/Modules/Render/ES/systems/RenderTransBasicSys.cc index bc49f5bb8e..160c6eede5 100644 --- a/src/Interface/Modules/Render/ES/systems/RenderTransBasicSys.cc +++ b/src/Interface/Modules/Render/ES/systems/RenderTransBasicSys.cc @@ -157,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); + } + + 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 iboMan.front().instance->addInMemoryIBO(sbuffer, pass.front().ibo.data->getBufferSize(), ibo.front().primMode, ibo.front().primType, - numPrimitives, transIBOName); + return result; } void groupExecute( diff --git a/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc b/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc index b1297b3ee3..142c37c126 100644 --- a/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc +++ b/src/Interface/Modules/Render/ES/systems/RenderTransColorMapSys.cc @@ -154,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(