mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Added support for multi-level polygon offset
Allow effect generator to tak multiple levels of polygon offsetting.
This commit is contained in:
@@ -433,7 +433,7 @@ void CellEdgeEffectGenerator::updateForShaderBasedRendering(cvf::Effect* effect)
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void CellEdgeEffectGenerator::updateForFixedFunctionRendering(cvf::Effect* effect) const
|
||||
{
|
||||
caf::SurfaceEffectGenerator surfaceGen(cvf::Color4f(cvf::Color3f::CRIMSON), true);
|
||||
caf::SurfaceEffectGenerator surfaceGen(cvf::Color4f(cvf::Color3f::CRIMSON), caf::PO_1);
|
||||
|
||||
surfaceGen.updateEffect(effect);
|
||||
}
|
||||
|
||||
@@ -155,8 +155,8 @@ void RivFaultPartMgr::updateCellResultColor(size_t timeStepIndex, RimResultSlot*
|
||||
cvf::DrawableGeo* dg = dynamic_cast<cvf::DrawableGeo*>(m_nativeFaultFaces->drawable());
|
||||
if (dg) dg->setTextureCoordArray(m_nativeFaultFacesTextureCoords.p());
|
||||
|
||||
bool usePolygonOffset = true;
|
||||
caf::ScalarMapperEffectGenerator scalarEffgen(mapper, usePolygonOffset);
|
||||
caf::PolygonOffset polygonOffset = caf::PO_1;
|
||||
caf::ScalarMapperEffectGenerator scalarEffgen(mapper, polygonOffset);
|
||||
scalarEffgen.setCullBackfaces(true);
|
||||
|
||||
scalarEffgen.setOpacityLevel(m_opacityLevel);
|
||||
@@ -208,8 +208,8 @@ void RivFaultPartMgr::updateCellResultColor(size_t timeStepIndex, RimResultSlot*
|
||||
cvf::DrawableGeo* dg = dynamic_cast<cvf::DrawableGeo*>(m_oppositeFaultFaces->drawable());
|
||||
if (dg) dg->setTextureCoordArray(m_oppositeFaultFacesTextureCoords.p());
|
||||
|
||||
bool usePolygonOffset = true;
|
||||
caf::ScalarMapperEffectGenerator scalarEffgen(mapper, usePolygonOffset);
|
||||
caf::PolygonOffset polygonOffset = caf::PO_1;
|
||||
caf::ScalarMapperEffectGenerator scalarEffgen(mapper, polygonOffset);
|
||||
scalarEffgen.setCullBackfaces(true);
|
||||
|
||||
scalarEffgen.setOpacityLevel(m_opacityLevel);
|
||||
@@ -390,7 +390,7 @@ void RivFaultPartMgr::updatePartEffect()
|
||||
cvf::Color3f partColor = m_defaultColor;
|
||||
|
||||
// Set default effect
|
||||
caf::SurfaceEffectGenerator geometryEffgen(partColor, true);
|
||||
caf::SurfaceEffectGenerator geometryEffgen(partColor, caf::PO_1);
|
||||
cvf::ref<cvf::Effect> geometryOnlyEffect = geometryEffgen.generateEffect();
|
||||
|
||||
if (m_nativeFaultFaces.notNull())
|
||||
@@ -410,7 +410,7 @@ void RivFaultPartMgr::updatePartEffect()
|
||||
nncColor.g() += (1.0 - nncColor.g()) * 0.2;
|
||||
nncColor.g() += (1.0 - nncColor.b()) * 0.2;
|
||||
|
||||
caf::SurfaceEffectGenerator nncEffgen(nncColor, false);
|
||||
caf::SurfaceEffectGenerator nncEffgen(nncColor, caf::PO_NONE);
|
||||
cvf::ref<cvf::Effect> nncEffect = nncEffgen.generateEffect();
|
||||
|
||||
if (m_NNCFaces.notNull())
|
||||
|
||||
@@ -119,7 +119,7 @@ void RivGridPartMgr::generatePartGeometry(cvf::StructGridGeometryGenerator& geoB
|
||||
part->updateBoundingBox();
|
||||
|
||||
// Set default effect
|
||||
caf::SurfaceEffectGenerator geometryEffgen(cvf::Color4f(cvf::Color3f::WHITE), true);
|
||||
caf::SurfaceEffectGenerator geometryEffgen(cvf::Color4f(cvf::Color3f::WHITE), caf::PO_1);
|
||||
cvf::ref<cvf::Effect> geometryOnlyEffect = geometryEffgen.generateEffect();
|
||||
part->setEffect(geometryOnlyEffect.p());
|
||||
|
||||
@@ -205,7 +205,7 @@ void RivGridPartMgr::updateCellColor(cvf::Color4f color)
|
||||
if (m_surfaceFaces.isNull() && m_faultFaces.isNull()) return;
|
||||
|
||||
// Set default effect
|
||||
caf::SurfaceEffectGenerator geometryEffgen(color, true);
|
||||
caf::SurfaceEffectGenerator geometryEffgen(color, caf::PO_1);
|
||||
cvf::ref<cvf::Effect> geometryOnlyEffect = geometryEffgen.generateEffect();
|
||||
|
||||
if (m_surfaceFaces.notNull()) m_surfaceFaces->setEffect(geometryOnlyEffect.p());
|
||||
@@ -307,8 +307,8 @@ void RivGridPartMgr::updateCellResultColor(size_t timeStepIndex, RimResultSlot*
|
||||
cvf::DrawableGeo* dg = dynamic_cast<cvf::DrawableGeo*>(m_surfaceFaces->drawable());
|
||||
if (dg) dg->setTextureCoordArray(m_surfaceFacesTextureCoords.p());
|
||||
|
||||
bool usePolygonOffset = true;
|
||||
caf::ScalarMapperEffectGenerator scalarEffgen(mapper, usePolygonOffset);
|
||||
caf::PolygonOffset polygonOffset = caf::PO_1;
|
||||
caf::ScalarMapperEffectGenerator scalarEffgen(mapper, polygonOffset);
|
||||
|
||||
scalarEffgen.setOpacityLevel(m_opacityLevel);
|
||||
|
||||
@@ -358,8 +358,8 @@ void RivGridPartMgr::updateCellResultColor(size_t timeStepIndex, RimResultSlot*
|
||||
cvf::DrawableGeo* dg = dynamic_cast<cvf::DrawableGeo*>(m_faultFaces->drawable());
|
||||
if (dg) dg->setTextureCoordArray(m_faultFacesTextureCoords.p());
|
||||
|
||||
bool usePolygonOffset = true;
|
||||
caf::ScalarMapperEffectGenerator scalarEffgen(mapper, usePolygonOffset);
|
||||
caf::PolygonOffset polygonOffset = caf::PO_1;
|
||||
caf::ScalarMapperEffectGenerator scalarEffgen(mapper, polygonOffset);
|
||||
|
||||
scalarEffgen.setOpacityLevel(m_opacityLevel);
|
||||
|
||||
|
||||
@@ -177,7 +177,7 @@ void RivWellHeadPartMgr::buildWellHeadParts(size_t frameIndex)
|
||||
part->setName("RivWellHeadPartMgr: surface " + cvfqt::Utils::toString(well->name()));
|
||||
part->setDrawable(pipeSurface.p());
|
||||
|
||||
caf::SurfaceEffectGenerator surfaceGen(cvf::Color4f(well->wellPipeColor()), true);
|
||||
caf::SurfaceEffectGenerator surfaceGen(cvf::Color4f(well->wellPipeColor()), caf::PO_1);
|
||||
cvf::ref<cvf::Effect> eff = surfaceGen.generateEffect();
|
||||
|
||||
part->setEffect(eff.p());
|
||||
@@ -273,7 +273,7 @@ void RivWellHeadPartMgr::buildWellHeadParts(size_t frameIndex)
|
||||
}
|
||||
}
|
||||
|
||||
caf::SurfaceEffectGenerator surfaceGen(headColor, true);
|
||||
caf::SurfaceEffectGenerator surfaceGen(headColor, caf::PO_1);
|
||||
cvf::ref<cvf::Effect> eff = surfaceGen.generateEffect();
|
||||
|
||||
part->setEffect(eff.p());
|
||||
|
||||
@@ -75,7 +75,7 @@ RivWellPathPartMgr::RivWellPathPartMgr(RimWellPathCollection* wellPathCollection
|
||||
|
||||
m_scalarMapper = scalarMapper;
|
||||
|
||||
caf::ScalarMapperEffectGenerator surfEffGen(scalarMapper.p(), true);
|
||||
caf::ScalarMapperEffectGenerator surfEffGen(scalarMapper.p(), caf::PO_1);
|
||||
m_scalarMapperSurfaceEffect = surfEffGen.generateEffect();
|
||||
|
||||
caf::ScalarMapperMeshEffectGenerator meshEffGen(scalarMapper.p());
|
||||
@@ -161,7 +161,7 @@ void RivWellPathPartMgr::buildWellPathParts(cvf::Vec3d displayModelOffset, doubl
|
||||
pbd.m_surfacePart->setDrawable(pbd.m_surfaceDrawable.p());
|
||||
//printf("Well Path triangleCount = %i (%i points in well path)\n", pbd.m_surfaceDrawable->triangleCount(), wellPathGeometry->m_wellPathPoints.size());
|
||||
|
||||
caf::SurfaceEffectGenerator surfaceGen(cvf::Color4f(m_rimWellPath->wellPathColor()), true);
|
||||
caf::SurfaceEffectGenerator surfaceGen(cvf::Color4f(m_rimWellPath->wellPathColor()), caf::PO_1);
|
||||
cvf::ref<cvf::Effect> eff = surfaceGen.generateEffect();
|
||||
|
||||
pbd.m_surfacePart->setEffect(eff.p());
|
||||
|
||||
@@ -70,7 +70,7 @@ RivWellPipesPartMgr::RivWellPipesPartMgr(RimReservoirView* reservoirView, RimWel
|
||||
|
||||
m_scalarMapper = scalarMapper;
|
||||
|
||||
caf::ScalarMapperEffectGenerator surfEffGen(scalarMapper.p(), true);
|
||||
caf::ScalarMapperEffectGenerator surfEffGen(scalarMapper.p(), caf::PO_1);
|
||||
m_scalarMapperSurfaceEffect = surfEffGen.generateEffect();
|
||||
|
||||
caf::ScalarMapperMeshEffectGenerator meshEffGen(scalarMapper.p());
|
||||
@@ -139,7 +139,7 @@ void RivWellPipesPartMgr::buildWellPipeParts()
|
||||
pbd.m_surfacePart = new cvf::Part;
|
||||
pbd.m_surfacePart->setDrawable(pbd.m_surfaceDrawable.p());
|
||||
|
||||
caf::SurfaceEffectGenerator surfaceGen(cvf::Color4f(m_rimWell->wellPipeColor()), true);
|
||||
caf::SurfaceEffectGenerator surfaceGen(cvf::Color4f(m_rimWell->wellPipeColor()), caf::PO_1);
|
||||
cvf::ref<cvf::Effect> eff = surfaceGen.generateEffect();
|
||||
|
||||
pbd.m_surfacePart->setEffect(eff.p());
|
||||
|
||||
@@ -104,6 +104,35 @@ cvf::String CommonShaderSources::light_AmbientDiffuse()
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
/// Static helper to configure polygon offset render state from enum
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
static cvf::ref<cvf::RenderStatePolygonOffset> CreateAngConfigurePolygonOffsetRenderState(PolygonOffset polygonOffset)
|
||||
{
|
||||
cvf::ref<cvf::RenderStatePolygonOffset> rs = new cvf::RenderStatePolygonOffset;
|
||||
if (polygonOffset == PO_NONE)
|
||||
{
|
||||
return rs;
|
||||
}
|
||||
|
||||
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;
|
||||
default:
|
||||
CVF_FAIL_MSG("Unhandled polygon offset enum");
|
||||
}
|
||||
|
||||
return rs;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//==================================================================================================
|
||||
//
|
||||
// EffectGenerator Base class
|
||||
@@ -205,7 +234,7 @@ void EffectGenerator::releaseUnreferencedEffects()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
SurfaceEffectGenerator::SurfaceEffectGenerator(const cvf::Color4f& color, bool polygonOffset)
|
||||
SurfaceEffectGenerator::SurfaceEffectGenerator(const cvf::Color4f& color, PolygonOffset polygonOffset)
|
||||
{
|
||||
m_color = color;
|
||||
m_polygonOffset = polygonOffset;
|
||||
@@ -215,7 +244,7 @@ SurfaceEffectGenerator::SurfaceEffectGenerator(const cvf::Color4f& color, bool p
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
SurfaceEffectGenerator::SurfaceEffectGenerator(const cvf::Color3f& color, bool polygonOffset)
|
||||
SurfaceEffectGenerator::SurfaceEffectGenerator(const cvf::Color3f& color, PolygonOffset polygonOffset)
|
||||
{
|
||||
m_color = cvf::Color4f(color, 1.0f);
|
||||
m_polygonOffset = polygonOffset;
|
||||
@@ -269,10 +298,9 @@ void SurfaceEffectGenerator::updateForFixedFunctionRendering(cvf::Effect* effect
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void SurfaceEffectGenerator::updateCommonEffect(cvf::Effect* effect) const
|
||||
{
|
||||
if (m_polygonOffset)
|
||||
if (m_polygonOffset != PO_NONE)
|
||||
{
|
||||
cvf::ref<cvf::RenderStatePolygonOffset> polyOffset = new cvf::RenderStatePolygonOffset;
|
||||
polyOffset->configurePolygonPositiveOffset();
|
||||
cvf::ref<cvf::RenderStatePolygonOffset> polyOffset = CreateAngConfigurePolygonOffsetRenderState(m_polygonOffset);
|
||||
effect->setRenderState(polyOffset.p());
|
||||
}
|
||||
|
||||
@@ -337,7 +365,7 @@ EffectGenerator* SurfaceEffectGenerator::copy() const
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
ScalarMapperEffectGenerator::ScalarMapperEffectGenerator(const cvf::ScalarMapper* scalarMapper, bool polygonOffset)
|
||||
ScalarMapperEffectGenerator::ScalarMapperEffectGenerator(const cvf::ScalarMapper* scalarMapper, PolygonOffset polygonOffset)
|
||||
: m_undefinedColor(cvf::Color3::GRAY)
|
||||
{
|
||||
m_scalarMapper = scalarMapper;
|
||||
@@ -426,10 +454,9 @@ void ScalarMapperEffectGenerator::updateCommonEffect(cvf::Effect* effect) const
|
||||
{
|
||||
CVF_ASSERT(effect);
|
||||
|
||||
if (m_polygonOffset)
|
||||
if (m_polygonOffset != PO_NONE)
|
||||
{
|
||||
cvf::ref<cvf::RenderStatePolygonOffset> polyOffset = new cvf::RenderStatePolygonOffset;
|
||||
polyOffset->configurePolygonPositiveOffset();
|
||||
cvf::ref<cvf::RenderStatePolygonOffset> polyOffset = CreateAngConfigurePolygonOffsetRenderState(m_polygonOffset);
|
||||
effect->setRenderState(polyOffset.p());
|
||||
}
|
||||
|
||||
|
||||
@@ -54,6 +54,18 @@ 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
|
||||
};
|
||||
|
||||
|
||||
|
||||
//==================================================================================================
|
||||
//
|
||||
//
|
||||
@@ -92,6 +104,7 @@ private:
|
||||
};
|
||||
|
||||
|
||||
|
||||
//==================================================================================================
|
||||
//
|
||||
// SurfaceEffectGenerator
|
||||
@@ -100,8 +113,8 @@ private:
|
||||
class SurfaceEffectGenerator : public EffectGenerator
|
||||
{
|
||||
public:
|
||||
SurfaceEffectGenerator(const cvf::Color4f& color, bool polygonOffset);
|
||||
SurfaceEffectGenerator(const cvf::Color3f& color, bool polygonOffset);
|
||||
SurfaceEffectGenerator(const cvf::Color4f& color, PolygonOffset polygonOffset);
|
||||
SurfaceEffectGenerator(const cvf::Color3f& color, PolygonOffset polygonOffset);
|
||||
|
||||
void setCullBackfaces(bool cullBackFaces) { m_cullBackfaces = cullBackFaces; }
|
||||
|
||||
@@ -117,7 +130,7 @@ private:
|
||||
|
||||
private:
|
||||
cvf::Color4f m_color;
|
||||
bool m_polygonOffset;
|
||||
PolygonOffset m_polygonOffset;
|
||||
bool m_cullBackfaces;
|
||||
|
||||
};
|
||||
@@ -131,7 +144,7 @@ private:
|
||||
class ScalarMapperEffectGenerator : public EffectGenerator
|
||||
{
|
||||
public:
|
||||
ScalarMapperEffectGenerator(const cvf::ScalarMapper* scalarMapper, bool polygonOffset);
|
||||
ScalarMapperEffectGenerator(const cvf::ScalarMapper* scalarMapper, PolygonOffset polygonOffset);
|
||||
|
||||
void setOpacityLevel(float opacity) { m_opacityLevel = cvf::Math::clamp(opacity, 0.0f , 1.0f ); }
|
||||
void setUndefinedColor(cvf::Color3f color) { m_undefinedColor = color; }
|
||||
@@ -153,7 +166,7 @@ private:
|
||||
private:
|
||||
cvf::cref<cvf::ScalarMapper> m_scalarMapper;
|
||||
mutable cvf::ref<cvf::TextureImage> m_textureImage;
|
||||
bool m_polygonOffset;
|
||||
PolygonOffset m_polygonOffset;
|
||||
float m_opacityLevel;
|
||||
cvf::Color3f m_undefinedColor;
|
||||
bool m_cullBackfaces;
|
||||
|
||||
Reference in New Issue
Block a user