Ternary: Use shader based per vertex coloring effect

This commit is contained in:
Magne Sjaastad 2014-04-11 13:08:05 +02:00
parent b958d01540
commit 03ab3d0a34
2 changed files with 58 additions and 27 deletions

View File

@ -45,6 +45,11 @@
#include "cafProgressInfo.h"
#include "cvfRenderStatePolygonOffset.h"
#include "cvfRenderStateBlending.h"
#include "cvfShaderProgramGenerator.h"
#include "cvfShaderSourceRepository.h"
#include "cvfUniform.h"
#include "cvfShaderSourceProvider.h"
#include "cvfShaderProgram.h"
@ -328,32 +333,10 @@ void RivGridPartMgr::updateCellResultColor(size_t timeStepIndex, RimResultSlot*
dg->setColorArray(surfaceFacesColorArray.p());
}
cvf::ref<cvf::Effect> colorArrayEffect = new cvf::Effect;
cvf::ref<cvf::RenderStateMaterial_FF> mat = new cvf::RenderStateMaterial_FF(cvf::Color3::BLUE);
mat->setAlpha(m_opacityLevel);
mat->enableColorMaterial(true);
colorArrayEffect->setRenderState(mat.p());
cvf::ref<cvf::RenderStateLighting_FF> lighting = new cvf::RenderStateLighting_FF;
lighting->enableTwoSided(true);
colorArrayEffect->setRenderState(lighting.p());
// Simple transparency
if (m_opacityLevel < 1.0f)
{
cvf::ref<cvf::RenderStateBlending> blender = new cvf::RenderStateBlending;
blender->configureTransparencyBlending();
colorArrayEffect->setRenderState(blender.p());
}
caf::PolygonOffset polygonOffset = caf::PO_1;
cvf::ref<cvf::RenderStatePolygonOffset> polyOffset = caf::EffectGenerator::createAndConfigurePolygonOffsetRenderState(polygonOffset);
colorArrayEffect->setRenderState(polyOffset.p());
cvf::ref<cvf::Effect> perVertexColorEffect = createPerVertexColoringEffect();
m_surfaceFaces->setEffect(perVertexColorEffect.p());
m_surfaceFaces->setPriority(100);
m_surfaceFaces->setEffect(colorArrayEffect.p());
}
else
{
@ -485,6 +468,53 @@ RivGridPartMgr::~RivGridPartMgr()
#endif
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
cvf::ref<cvf::Effect> RivGridPartMgr::createPerVertexColoringEffect()
{
cvf::ref<cvf::Effect> colorArrayEffect = new cvf::Effect;
if (RiaApplication::instance()->useShaders())
{
cvf::ShaderProgramGenerator gen("PerVertexColor", cvf::ShaderSourceProvider::instance());
gen.addVertexCode(cvf::ShaderSourceRepository::vs_Standard);
gen.addFragmentCode(cvf::ShaderSourceRepository::src_VaryingColorGlobalAlpha);
gen.addFragmentCode(caf::CommonShaderSources::light_AmbientDiffuse());
gen.addFragmentCode(cvf::ShaderSourceRepository::fs_Standard);
cvf::ref<cvf::ShaderProgram> m_shaderProg = gen.generate();
m_shaderProg->setDefaultUniform(new cvf::UniformFloat("u_alpha", m_opacityLevel));
colorArrayEffect->setShaderProgram(m_shaderProg.p());
}
else
{
cvf::ref<cvf::RenderStateMaterial_FF> mat = new cvf::RenderStateMaterial_FF(cvf::Color3::BLUE);
mat->setAlpha(m_opacityLevel);
mat->enableColorMaterial(true);
colorArrayEffect->setRenderState(mat.p());
cvf::ref<cvf::RenderStateLighting_FF> lighting = new cvf::RenderStateLighting_FF;
lighting->enableTwoSided(true);
colorArrayEffect->setRenderState(lighting.p());
}
// Simple transparency
if (m_opacityLevel < 1.0f)
{
cvf::ref<cvf::RenderStateBlending> blender = new cvf::RenderStateBlending;
blender->configureTransparencyBlending();
colorArrayEffect->setRenderState(blender.p());
}
caf::PolygonOffset polygonOffset = caf::PO_1;
cvf::ref<cvf::RenderStatePolygonOffset> polyOffset = caf::EffectGenerator::createAndConfigurePolygonOffsetRenderState(polygonOffset);
colorArrayEffect->setRenderState(polyOffset.p());
return colorArrayEffect;
}
//--------------------------------------------------------------------------------------------------
///

View File

@ -29,6 +29,7 @@ namespace cvf
class ModelBasicList;
class Transform;
class Part;
class Effect;
}
class RimResultSlot;
@ -80,6 +81,7 @@ public:
void updateCellColor(cvf::Color4f color);
void updateCellResultColor(size_t timeStepIndex, RimResultSlot* cellResultSlot);
void updateCellEdgeResultColor(size_t timeStepIndex, RimResultSlot* cellResultSlot,
RimCellEdgeResultSlot* cellEdgeResultSlot);
@ -87,8 +89,7 @@ public:
private:
void generatePartGeometry(cvf::StructGridGeometryGenerator& geoBuilder, bool faultGeometry);
cvf::ref<cvf::Effect> createPerVertexColoringEffect();
private:
size_t m_gridIdx;