Bugfix: Apply face culling mode when creating effects

This commit is contained in:
Magne Sjaastad 2014-08-21 14:41:03 +02:00
parent ecfea98e20
commit b9a5d5b743
6 changed files with 50 additions and 29 deletions

View File

@ -44,7 +44,7 @@ CellEdgeEffectGenerator::CellEdgeEffectGenerator(const cvf::ScalarMapper* edgeSc
m_edgeScalarMapper = edgeScalarMapper; m_edgeScalarMapper = edgeScalarMapper;
m_cullBackfaces = false; m_cullBackfaces = caf::FC_NONE;
m_opacityLevel = 1.0f; m_opacityLevel = 1.0f;
m_defaultCellColor = cvf::Color3f(cvf::Color3::WHITE); m_defaultCellColor = cvf::Color3f(cvf::Color3::WHITE);
} }
@ -116,7 +116,7 @@ caf::EffectGenerator* CellEdgeEffectGenerator::copy() const
newEffect->m_cellTextureImage = m_cellTextureImage; newEffect->m_cellTextureImage = m_cellTextureImage;
newEffect->setOpacityLevel(m_opacityLevel); newEffect->setOpacityLevel(m_opacityLevel);
newEffect->setCullBackfaces(m_cullBackfaces); newEffect->setFaceCulling(m_cullBackfaces);
newEffect->setUndefinedColor(m_undefinedColor); newEffect->setUndefinedColor(m_undefinedColor);
newEffect->setDefaultCellColor(m_defaultCellColor); newEffect->setDefaultCellColor(m_defaultCellColor);
@ -237,15 +237,28 @@ void CellEdgeEffectGenerator::updateForShaderBasedRendering(cvf::Effect* effect)
eff->setRenderState(blender.p()); eff->setRenderState(blender.p());
} }
// Backface culling // Face culling
if (m_cullBackfaces != caf::FC_NONE)
if (m_cullBackfaces)
{ {
cvf::ref<cvf::RenderStateCullFace> faceCulling = new cvf::RenderStateCullFace; cvf::ref<cvf::RenderStateCullFace> faceCulling = new cvf::RenderStateCullFace;
eff->setRenderState(faceCulling.p()); if (m_cullBackfaces == caf::FC_BACK)
{
faceCulling->setMode(cvf::RenderStateCullFace::BACK);
}
else if (m_cullBackfaces == caf::FC_FRONT)
{
faceCulling->setMode(cvf::RenderStateCullFace::FRONT);
}
else if (m_cullBackfaces == caf::FC_FRONT_AND_BACK)
{
faceCulling->setMode(cvf::RenderStateCullFace::FRONT_AND_BACK);
}
effect->setRenderState(faceCulling.p());
} }
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -106,7 +106,7 @@ public:
void setOpacityLevel(float opacity) { m_opacityLevel = cvf::Math::clamp(opacity, 0.0f , 1.0f ); } void setOpacityLevel(float opacity) { m_opacityLevel = cvf::Math::clamp(opacity, 0.0f , 1.0f ); }
void setUndefinedColor(cvf::Color3f color) { m_undefinedColor = color; } void setUndefinedColor(cvf::Color3f color) { m_undefinedColor = color; }
void setCullBackfaces(bool cullBackFaces) { m_cullBackfaces = cullBackFaces; } void setFaceCulling(caf::FaceCulling faceCulling) { m_cullBackfaces = faceCulling; }
void setDefaultCellColor(cvf::Color3f color) { m_defaultCellColor = color; } void setDefaultCellColor(cvf::Color3f color) { m_defaultCellColor = color; }
protected: protected:
@ -125,7 +125,7 @@ private:
cvf::cref<RivTernaryScalarMapper> m_ternaryCellScalarMapper; cvf::cref<RivTernaryScalarMapper> m_ternaryCellScalarMapper;
float m_opacityLevel; float m_opacityLevel;
bool m_cullBackfaces; caf::FaceCulling m_cullBackfaces;
cvf::Color3f m_undefinedColor; cvf::Color3f m_undefinedColor;
cvf::Color3f m_defaultCellColor; cvf::Color3f m_defaultCellColor;
}; };

View File

@ -122,7 +122,7 @@ void RivFaultPartMgr::updateCellResultColor(size_t timeStepIndex, RimResultSlot*
texturer.createTextureCoords(m_nativeFaultFacesTextureCoords.p()); texturer.createTextureCoords(m_nativeFaultFacesTextureCoords.p());
const RivTernaryScalarMapper* mapper = cellResultSlot->ternaryLegendConfig()->scalarMapper(); const RivTernaryScalarMapper* mapper = cellResultSlot->ternaryLegendConfig()->scalarMapper();
RivScalarMapperUtils::applyTernaryTextureResultsToPart(m_nativeFaultFaces.p(), m_nativeFaultFacesTextureCoords.p(), mapper, m_opacityLevel); RivScalarMapperUtils::applyTernaryTextureResultsToPart(m_nativeFaultFaces.p(), m_nativeFaultFacesTextureCoords.p(), mapper, m_opacityLevel, this->faceCullingMode());
} }
else else
{ {
@ -139,7 +139,7 @@ void RivFaultPartMgr::updateCellResultColor(size_t timeStepIndex, RimResultSlot*
texturer.createTextureCoords(m_nativeFaultFacesTextureCoords.p()); texturer.createTextureCoords(m_nativeFaultFacesTextureCoords.p());
const cvf::ScalarMapper* mapper = cellResultSlot->legendConfig()->scalarMapper(); const cvf::ScalarMapper* mapper = cellResultSlot->legendConfig()->scalarMapper();
RivScalarMapperUtils::applyTextureResultsToPart(m_nativeFaultFaces.p(), m_nativeFaultFacesTextureCoords.p(), mapper, m_opacityLevel); RivScalarMapperUtils::applyTextureResultsToPart(m_nativeFaultFaces.p(), m_nativeFaultFacesTextureCoords.p(), mapper, m_opacityLevel, this->faceCullingMode());
} }
} }
@ -155,7 +155,7 @@ void RivFaultPartMgr::updateCellResultColor(size_t timeStepIndex, RimResultSlot*
texturer.createTextureCoords(m_oppositeFaultFacesTextureCoords.p()); texturer.createTextureCoords(m_oppositeFaultFacesTextureCoords.p());
const RivTernaryScalarMapper* mapper = cellResultSlot->ternaryLegendConfig()->scalarMapper(); const RivTernaryScalarMapper* mapper = cellResultSlot->ternaryLegendConfig()->scalarMapper();
RivScalarMapperUtils::applyTernaryTextureResultsToPart(m_oppositeFaultFaces.p(), m_oppositeFaultFacesTextureCoords.p(), mapper, m_opacityLevel); RivScalarMapperUtils::applyTernaryTextureResultsToPart(m_oppositeFaultFaces.p(), m_oppositeFaultFacesTextureCoords.p(), mapper, m_opacityLevel, this->faceCullingMode());
} }
else else
{ {
@ -172,7 +172,7 @@ void RivFaultPartMgr::updateCellResultColor(size_t timeStepIndex, RimResultSlot*
texturer.createTextureCoords(m_oppositeFaultFacesTextureCoords.p()); texturer.createTextureCoords(m_oppositeFaultFacesTextureCoords.p());
const cvf::ScalarMapper* mapper = cellResultSlot->legendConfig()->scalarMapper(); const cvf::ScalarMapper* mapper = cellResultSlot->legendConfig()->scalarMapper();
RivScalarMapperUtils::applyTextureResultsToPart(m_oppositeFaultFaces.p(), m_oppositeFaultFacesTextureCoords.p(), mapper, m_opacityLevel); RivScalarMapperUtils::applyTextureResultsToPart(m_oppositeFaultFaces.p(), m_oppositeFaultFacesTextureCoords.p(), mapper, m_opacityLevel, this->faceCullingMode());
} }
} }
} }
@ -189,7 +189,7 @@ void RivFaultPartMgr::updateCellEdgeResultColor(size_t timeStepIndex, RimResultS
{ {
cvf::ref<cvf::Effect> eff = RivScalarMapperUtils::createCellEdgeEffect(dg, m_nativeFaultGenerator->quadToCellFaceMapper(), cvf::ref<cvf::Effect> eff = RivScalarMapperUtils::createCellEdgeEffect(dg, m_nativeFaultGenerator->quadToCellFaceMapper(),
m_grid->gridIndex(), m_grid->gridIndex(),
timeStepIndex, cellResultSlot, cellEdgeResultSlot, m_opacityLevel, m_defaultColor); timeStepIndex, cellResultSlot, cellEdgeResultSlot, m_opacityLevel, m_defaultColor, this->faceCullingMode());
m_nativeFaultFaces->setEffect(eff.p()); m_nativeFaultFaces->setEffect(eff.p());
} }
@ -201,7 +201,7 @@ void RivFaultPartMgr::updateCellEdgeResultColor(size_t timeStepIndex, RimResultS
if (dg) if (dg)
{ {
cvf::ref<cvf::Effect> eff = RivScalarMapperUtils::createCellEdgeEffect(dg, m_oppositeFaultGenerator->quadToCellFaceMapper(), m_grid->gridIndex(), cvf::ref<cvf::Effect> eff = RivScalarMapperUtils::createCellEdgeEffect(dg, m_oppositeFaultGenerator->quadToCellFaceMapper(), m_grid->gridIndex(),
timeStepIndex, cellResultSlot, cellEdgeResultSlot, m_opacityLevel, m_defaultColor); timeStepIndex, cellResultSlot, cellEdgeResultSlot, m_opacityLevel, m_defaultColor, this->faceCullingMode());
m_oppositeFaultFaces->setEffect(eff.p()); m_oppositeFaultFaces->setEffect(eff.p());
} }

View File

@ -241,7 +241,7 @@ void RivGridPartMgr::updateCellResultColor(size_t timeStepIndex, RimResultSlot*
texturer.createTextureCoords(m_surfaceFacesTextureCoords.p()); texturer.createTextureCoords(m_surfaceFacesTextureCoords.p());
const RivTernaryScalarMapper* mapper = cellResultSlot->ternaryLegendConfig()->scalarMapper(); const RivTernaryScalarMapper* mapper = cellResultSlot->ternaryLegendConfig()->scalarMapper();
RivScalarMapperUtils::applyTernaryTextureResultsToPart(m_surfaceFaces.p(), m_surfaceFacesTextureCoords.p(), mapper, m_opacityLevel); RivScalarMapperUtils::applyTernaryTextureResultsToPart(m_surfaceFaces.p(), m_surfaceFacesTextureCoords.p(), mapper, m_opacityLevel, caf::FC_NONE);
} }
else else
{ {
@ -257,7 +257,7 @@ void RivGridPartMgr::updateCellResultColor(size_t timeStepIndex, RimResultSlot*
texturer.createTextureCoords(m_surfaceFacesTextureCoords.p()); texturer.createTextureCoords(m_surfaceFacesTextureCoords.p());
const cvf::ScalarMapper* mapper = cellResultSlot->legendConfig()->scalarMapper(); const cvf::ScalarMapper* mapper = cellResultSlot->legendConfig()->scalarMapper();
RivScalarMapperUtils::applyTextureResultsToPart(m_surfaceFaces.p(), m_surfaceFacesTextureCoords.p(), mapper, m_opacityLevel); RivScalarMapperUtils::applyTextureResultsToPart(m_surfaceFaces.p(), m_surfaceFacesTextureCoords.p(), mapper, m_opacityLevel, caf::FC_NONE);
} }
} }
} }
@ -273,7 +273,7 @@ void RivGridPartMgr::updateCellEdgeResultColor(size_t timeStepIndex, RimResultSl
if (dg) if (dg)
{ {
cvf::ref<cvf::Effect> eff = RivScalarMapperUtils::createCellEdgeEffect(dg, m_surfaceGenerator.quadToCellFaceMapper(), m_grid->gridIndex(), cvf::ref<cvf::Effect> eff = RivScalarMapperUtils::createCellEdgeEffect(dg, m_surfaceGenerator.quadToCellFaceMapper(), m_grid->gridIndex(),
timeStepIndex, cellResultSlot, cellEdgeResultSlot, m_opacityLevel, m_defaultColor); timeStepIndex, cellResultSlot, cellEdgeResultSlot, m_opacityLevel, m_defaultColor, caf::FC_NONE);
m_surfaceFaces->setEffect(eff.p()); m_surfaceFaces->setEffect(eff.p());
} }

View File

@ -38,28 +38,28 @@
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RivScalarMapperUtils::applyTextureResultsToPart(cvf::Part* part, cvf::Vec2fArray* textureCoords, const cvf::ScalarMapper* mapper, float opacityLevel) void RivScalarMapperUtils::applyTextureResultsToPart(cvf::Part* part, cvf::Vec2fArray* textureCoords, const cvf::ScalarMapper* mapper, float opacityLevel, caf::FaceCulling faceCulling)
{ {
CVF_ASSERT(part && textureCoords && mapper); CVF_ASSERT(part && textureCoords && mapper);
cvf::DrawableGeo* dg = dynamic_cast<cvf::DrawableGeo*>(part->drawable()); cvf::DrawableGeo* dg = dynamic_cast<cvf::DrawableGeo*>(part->drawable());
if (dg) dg->setTextureCoordArray(textureCoords); if (dg) dg->setTextureCoordArray(textureCoords);
cvf::ref<cvf::Effect> scalarEffect = RivScalarMapperUtils::createScalarMapperEffect(mapper, opacityLevel); cvf::ref<cvf::Effect> scalarEffect = RivScalarMapperUtils::createScalarMapperEffect(mapper, opacityLevel, faceCulling);
part->setEffect(scalarEffect.p()); part->setEffect(scalarEffect.p());
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RivScalarMapperUtils::applyTernaryTextureResultsToPart(cvf::Part* part, cvf::Vec2fArray* textureCoords, const RivTernaryScalarMapper* mapper, float opacityLevel) void RivScalarMapperUtils::applyTernaryTextureResultsToPart(cvf::Part* part, cvf::Vec2fArray* textureCoords, const RivTernaryScalarMapper* mapper, float opacityLevel, caf::FaceCulling faceCulling)
{ {
CVF_ASSERT(part && textureCoords && mapper); CVF_ASSERT(part && textureCoords && mapper);
cvf::DrawableGeo* dg = dynamic_cast<cvf::DrawableGeo*>(part->drawable()); cvf::DrawableGeo* dg = dynamic_cast<cvf::DrawableGeo*>(part->drawable());
if (dg) dg->setTextureCoordArray(textureCoords); if (dg) dg->setTextureCoordArray(textureCoords);
cvf::ref<cvf::Effect> scalarEffect = RivScalarMapperUtils::createTernaryScalarMapperEffect(mapper, opacityLevel); cvf::ref<cvf::Effect> scalarEffect = RivScalarMapperUtils::createTernaryScalarMapperEffect(mapper, opacityLevel, faceCulling);
part->setEffect(scalarEffect.p()); part->setEffect(scalarEffect.p());
} }
@ -73,7 +73,8 @@ cvf::ref<cvf::Effect> RivScalarMapperUtils::createCellEdgeEffect(cvf::DrawableGe
RimResultSlot* cellResultSlot, RimResultSlot* cellResultSlot,
RimCellEdgeResultSlot* cellEdgeResultSlot, RimCellEdgeResultSlot* cellEdgeResultSlot,
float opacityLevel, float opacityLevel,
cvf::Color3f defaultColor) cvf::Color3f defaultColor,
caf::FaceCulling faceCulling)
{ {
CellEdgeEffectGenerator cellFaceEffectGen(cellEdgeResultSlot->legendConfig()->scalarMapper()); CellEdgeEffectGenerator cellFaceEffectGen(cellEdgeResultSlot->legendConfig()->scalarMapper());
@ -99,6 +100,7 @@ cvf::ref<cvf::Effect> RivScalarMapperUtils::createCellEdgeEffect(cvf::DrawableGe
cellFaceEffectGen.setOpacityLevel(opacityLevel); cellFaceEffectGen.setOpacityLevel(opacityLevel);
cellFaceEffectGen.setDefaultCellColor(defaultColor); cellFaceEffectGen.setDefaultCellColor(defaultColor);
cellFaceEffectGen.setFaceCulling(faceCulling);
cvf::ref<cvf::Effect> eff = cellFaceEffectGen.generateEffect(); cvf::ref<cvf::Effect> eff = cellFaceEffectGen.generateEffect();
return eff; return eff;
@ -107,13 +109,15 @@ cvf::ref<cvf::Effect> RivScalarMapperUtils::createCellEdgeEffect(cvf::DrawableGe
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
cvf::ref<cvf::Effect> RivScalarMapperUtils::createScalarMapperEffect(const cvf::ScalarMapper* mapper, float opacityLevel) cvf::ref<cvf::Effect> RivScalarMapperUtils::createScalarMapperEffect(const cvf::ScalarMapper* mapper, float opacityLevel, caf::FaceCulling faceCulling)
{ {
CVF_ASSERT(mapper); CVF_ASSERT(mapper);
caf::PolygonOffset polygonOffset = caf::PO_1; caf::PolygonOffset polygonOffset = caf::PO_1;
caf::ScalarMapperEffectGenerator scalarEffgen(mapper, polygonOffset); caf::ScalarMapperEffectGenerator scalarEffgen(mapper, polygonOffset);
scalarEffgen.setOpacityLevel(opacityLevel); scalarEffgen.setOpacityLevel(opacityLevel);
scalarEffgen.setFaceCulling(faceCulling);
cvf::ref<cvf::Effect> scalarEffect = scalarEffgen.generateEffect(); cvf::ref<cvf::Effect> scalarEffect = scalarEffgen.generateEffect();
return scalarEffect; return scalarEffect;
@ -122,13 +126,14 @@ cvf::ref<cvf::Effect> RivScalarMapperUtils::createScalarMapperEffect(const cvf::
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
cvf::ref<cvf::Effect> RivScalarMapperUtils::createTernaryScalarMapperEffect(const RivTernaryScalarMapper* mapper, float opacityLevel) cvf::ref<cvf::Effect> RivScalarMapperUtils::createTernaryScalarMapperEffect(const RivTernaryScalarMapper* mapper, float opacityLevel, caf::FaceCulling faceCulling)
{ {
CVF_ASSERT(mapper); CVF_ASSERT(mapper);
caf::PolygonOffset polygonOffset = caf::PO_1; caf::PolygonOffset polygonOffset = caf::PO_1;
RivTernaryScalarMapperEffectGenerator scalarEffgen(mapper, polygonOffset); RivTernaryScalarMapperEffectGenerator scalarEffgen(mapper, polygonOffset);
scalarEffgen.setOpacityLevel(opacityLevel); scalarEffgen.setOpacityLevel(opacityLevel);
scalarEffgen.setFaceCulling(faceCulling);
cvf::ref<cvf::Effect> scalarEffect = scalarEffgen.generateEffect(); cvf::ref<cvf::Effect> scalarEffect = scalarEffgen.generateEffect();
return scalarEffect; return scalarEffect;

View File

@ -18,6 +18,8 @@
#pragma once #pragma once
#include "cafEffectGenerator.h"
#include "cvfBase.h" #include "cvfBase.h"
#include "cvfArray.h" #include "cvfArray.h"
@ -40,8 +42,8 @@ class RimCellEdgeResultSlot;
class RivScalarMapperUtils class RivScalarMapperUtils
{ {
public: public:
static void applyTextureResultsToPart(cvf::Part* part, cvf::Vec2fArray* textureCoords, const cvf::ScalarMapper* mapper, float opacityLevel); static void applyTextureResultsToPart(cvf::Part* part, cvf::Vec2fArray* textureCoords, const cvf::ScalarMapper* mapper, float opacityLevel, caf::FaceCulling faceCulling);
static void applyTernaryTextureResultsToPart(cvf::Part* part, cvf::Vec2fArray* textureCoords, const RivTernaryScalarMapper* mapper, float opacityLevel); static void applyTernaryTextureResultsToPart(cvf::Part* part, cvf::Vec2fArray* textureCoords, const RivTernaryScalarMapper* mapper, float opacityLevel, caf::FaceCulling faceCulling);
static cvf::ref<cvf::Effect> createCellEdgeEffect(cvf::DrawableGeo* dg, static cvf::ref<cvf::Effect> createCellEdgeEffect(cvf::DrawableGeo* dg,
const cvf::StructGridQuadToCellFaceMapper* quadToCellFaceMapper, const cvf::StructGridQuadToCellFaceMapper* quadToCellFaceMapper,
@ -50,10 +52,11 @@ public:
RimResultSlot* cellResultSlot, RimResultSlot* cellResultSlot,
RimCellEdgeResultSlot* cellEdgeResultSlot, RimCellEdgeResultSlot* cellEdgeResultSlot,
float opacityLevel, float opacityLevel,
cvf::Color3f defaultColor); cvf::Color3f defaultColor,
caf::FaceCulling faceCulling);
private: private:
static cvf::ref<cvf::Effect> createScalarMapperEffect(const cvf::ScalarMapper* mapper, float opacityLevel); static cvf::ref<cvf::Effect> createScalarMapperEffect(const cvf::ScalarMapper* mapper, float opacityLevel, caf::FaceCulling faceCulling);
static cvf::ref<cvf::Effect> createTernaryScalarMapperEffect(const RivTernaryScalarMapper* mapper, float opacityLevel); static cvf::ref<cvf::Effect> createTernaryScalarMapperEffect(const RivTernaryScalarMapper* mapper, float opacityLevel, caf::FaceCulling faceCulling);
}; };