diff --git a/ApplicationCode/ModelVisualization/RivFaultPartMgr.cpp b/ApplicationCode/ModelVisualization/RivFaultPartMgr.cpp index 34132a1029..244c2f02a4 100644 --- a/ApplicationCode/ModelVisualization/RivFaultPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivFaultPartMgr.cpp @@ -45,6 +45,7 @@ #include "cvfPrimitiveSetIndexedUInt.h" #include "cvfPrimitiveSetDirect.h" #include "RivGridPartMgr.h" +#include "cvfRenderStateDepth.h" @@ -223,6 +224,10 @@ void RivFaultPartMgr::updateCellEdgeResultColor(size_t timeStepIndex, RimResultS //-------------------------------------------------------------------------------------------------- void RivFaultPartMgr::generatePartGeometry() { + const int priFaultGeo = 1; + const int priNncGeo = 2; + const int priMesh = 3; + bool useBufferObjects = true; // Surface geometry { @@ -246,6 +251,7 @@ void RivFaultPartMgr::generatePartGeometry() part->updateBoundingBox(); part->setEnableMask(faultBit); + part->setPriority(priFaultGeo); m_nativeFaultFaces = part; } @@ -267,6 +273,7 @@ void RivFaultPartMgr::generatePartGeometry() part->updateBoundingBox(); part->setEnableMask(meshFaultBit); + part->setPriority(priMesh); m_nativeFaultGridLines = part; } @@ -295,6 +302,7 @@ void RivFaultPartMgr::generatePartGeometry() part->updateBoundingBox(); part->setEnableMask(faultBit); + part->setPriority(priFaultGeo); m_oppositeFaultFaces = part; } @@ -316,6 +324,7 @@ void RivFaultPartMgr::generatePartGeometry() part->updateBoundingBox(); part->setEnableMask(meshFaultBit); + part->setPriority(priMesh); m_oppositeFaultGridLines = part; } @@ -342,6 +351,7 @@ void RivFaultPartMgr::generatePartGeometry() part->updateBoundingBox(); part->setEnableMask(faultBit); + part->setPriority(priNncGeo); m_NNCFaces = part; } @@ -407,8 +417,19 @@ void RivFaultPartMgr::updatePartEffect() nncColor.g() += (1.0 - nncColor.g()) * 0.2; nncColor.g() += (1.0 - nncColor.b()) * 0.2; - caf::SurfaceEffectGenerator nncEffgen(nncColor, caf::PO_NONE); - cvf::ref nncEffect = nncEffgen.generateEffect(); + cvf::ref nncEffect; + + if (m_rimFaultCollection->showFaultFaces || m_rimFaultCollection->showOppositeFaultFaces) + { + caf::SurfaceEffectGenerator nncEffgen(nncColor, caf::PO_NEG_LARGE); + nncEffgen.enableDepthWrite(false); + nncEffect = nncEffgen.generateEffect(); + } + else + { + caf::SurfaceEffectGenerator nncEffgen(nncColor, caf::PO_1); + nncEffect = nncEffgen.generateEffect(); + } if (m_NNCFaces.notNull()) { @@ -434,6 +455,9 @@ void RivFaultPartMgr::updatePartEffect() if (m_opacityLevel < 1.0f) { + // Must be fixed since currently fault drawing relies on internal priorities of the parts + CVF_FAIL_MSG("Not implemented"); + // Set priority to make sure this transparent geometry are rendered last if (m_nativeFaultFaces.notNull()) m_nativeFaultFaces->setPriority(100); if (m_oppositeFaultFaces.notNull()) m_oppositeFaultFaces->setPriority(100); diff --git a/Fwk/AppFwk/CommonCode/cafEffectGenerator.cpp b/Fwk/AppFwk/CommonCode/cafEffectGenerator.cpp index 64010d1a46..f0508f9ac2 100644 --- a/Fwk/AppFwk/CommonCode/cafEffectGenerator.cpp +++ b/Fwk/AppFwk/CommonCode/cafEffectGenerator.cpp @@ -116,13 +116,12 @@ static cvf::ref CreateAngConfigurePolygonOffsetRe } rs->enableFillMode(true); - rs->setFactor(1.0f); - + switch (polygonOffset) { - case PO_1: rs->setUnits(1.0f); break; - case PO_2: rs->setUnits(2.0f); break; - case PO_3: rs->setUnits(3.0f); break; + case PO_1: rs->setFactor(1.0f); rs->setUnits(1.0f); break; + case PO_2: rs->setFactor(2.0f); rs->setUnits(2.0f); break; + case PO_NEG_LARGE: rs->setFactor(-1.0f); rs->setUnits(-30.0f); break; default: CVF_FAIL_MSG("Unhandled polygon offset enum"); } @@ -239,6 +238,7 @@ SurfaceEffectGenerator::SurfaceEffectGenerator(const cvf::Color4f& color, Polygo m_color = color; m_polygonOffset = polygonOffset; m_cullBackfaces = FC_NONE; + m_enableDepthWrite = true; } //-------------------------------------------------------------------------------------------------- @@ -249,6 +249,7 @@ SurfaceEffectGenerator::SurfaceEffectGenerator(const cvf::Color3f& color, Polygo m_color = cvf::Color4f(color, 1.0f); m_polygonOffset = polygonOffset; m_cullBackfaces = FC_NONE; + m_enableDepthWrite = true; } @@ -331,6 +332,13 @@ void SurfaceEffectGenerator::updateCommonEffect(cvf::Effect* effect) const effect->setRenderState(faceCulling.p()); } + + if (!m_enableDepthWrite) + { + cvf::ref depth = new cvf::RenderStateDepth; + depth->enableDepthWrite(false); + effect->setRenderState(depth.p()); + } } //-------------------------------------------------------------------------------------------------- @@ -344,6 +352,7 @@ bool SurfaceEffectGenerator::isEqual(const EffectGenerator* other) const { if (m_color == otherSurfaceEffect->m_color && m_polygonOffset == otherSurfaceEffect->m_polygonOffset + && m_enableDepthWrite == otherSurfaceEffect->m_enableDepthWrite && m_cullBackfaces == otherSurfaceEffect->m_cullBackfaces) { return true; @@ -360,6 +369,7 @@ EffectGenerator* SurfaceEffectGenerator::copy() const { SurfaceEffectGenerator* effGen = new SurfaceEffectGenerator(m_color, m_polygonOffset); effGen->m_cullBackfaces = m_cullBackfaces; + effGen->m_enableDepthWrite = m_enableDepthWrite; return effGen; } diff --git a/Fwk/AppFwk/CommonCode/cafEffectGenerator.h b/Fwk/AppFwk/CommonCode/cafEffectGenerator.h index 4346f60df8..ceee32439e 100644 --- a/Fwk/AppFwk/CommonCode/cafEffectGenerator.h +++ b/Fwk/AppFwk/CommonCode/cafEffectGenerator.h @@ -58,10 +58,10 @@ public: // Enumerates different levels of polygon offsetting enum PolygonOffset { - PO_NONE = 0, // No polygon offset - PO_1 = 1, // 'Normal' polygon offset, equal to configurePolygonPositiveOffset(), ie factor=unit=1.0 - PO_2 = 2, // More offset - PO_3 = 3 // Even more offset + PO_NONE, // No polygon offset + PO_1, // 'Normal' positive polygon offset, equal to configurePolygonPositiveOffset(), ie factor=unit=1.0 + PO_2, // More positive offset + PO_NEG_LARGE // Currently, a large negative offset }; // Enumerates face culling @@ -125,6 +125,7 @@ public: SurfaceEffectGenerator(const cvf::Color3f& color, PolygonOffset polygonOffset); void setCullBackfaces(FaceCulling cullBackFaces) { m_cullBackfaces = cullBackFaces; } + void enableDepthWrite(bool enableWrite) { m_enableDepthWrite = enableWrite; } protected: virtual bool isEqual(const EffectGenerator* other) const; @@ -140,7 +141,7 @@ private: cvf::Color4f m_color; PolygonOffset m_polygonOffset; FaceCulling m_cullBackfaces; - + bool m_enableDepthWrite; };