#1440 Split fracture coloring from geometry generation

This commit is contained in:
Jacob Støren
2017-06-22 14:55:16 +02:00
parent deedb6a90e
commit 63cf1e91b3
2 changed files with 82 additions and 78 deletions

View File

@@ -66,7 +66,7 @@ RivWellFracturePartMgr::~RivWellFracturePartMgr()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RivWellFracturePartMgr::updatePartGeometry(const caf::DisplayCoordTransform* displayCoordTransform) void RivWellFracturePartMgr::generateSurfacePart(const caf::DisplayCoordTransform* displayCoordTransform)
{ {
if (m_part.notNull()) return; if (m_part.notNull()) return;
if (!displayCoordTransform) return; if (!displayCoordTransform) return;
@@ -91,16 +91,27 @@ void RivWellFracturePartMgr::updatePartGeometry(const caf::DisplayCoordTransform
return; return;
} }
cvf::ref<cvf::DrawableGeo> geo = createGeo(triangleIndices, displayCoords); cvf::ref<cvf::DrawableGeo> geo = buildDrawableGeoFromTriangles(triangleIndices, displayCoords);
CVF_ASSERT(geo.notNull()); CVF_ASSERT(geo.notNull());
m_part = new cvf::Part; m_part = new cvf::Part(0, "FractureSurfacePart");
m_part->setDrawable(geo.p()); m_part->setDrawable(geo.p());
m_part->setSourceInfo(new RivObjectSourceInfo(m_rimFracture));
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RivWellFracturePartMgr::applyFractureUniformColor()
{
if ( m_part.notNull() )
{
cvf::Color4f fractureColor = cvf::Color4f(cvf::Color3f(cvf::Color3::BROWN)); cvf::Color4f fractureColor = cvf::Color4f(cvf::Color3f(cvf::Color3::BROWN));
RimEclipseView* activeView = dynamic_cast<RimEclipseView*>(RiaApplication::instance()->activeReservoirView()); RimEclipseView* activeView = dynamic_cast<RimEclipseView*>(RiaApplication::instance()->activeReservoirView());
if (activeView) if ( activeView )
{ {
fractureColor = cvf::Color4f(activeView->stimPlanColors->defaultColor()); fractureColor = cvf::Color4f(activeView->stimPlanColors->defaultColor());
} }
@@ -108,18 +119,15 @@ void RivWellFracturePartMgr::updatePartGeometry(const caf::DisplayCoordTransform
caf::SurfaceEffectGenerator surfaceGen(fractureColor, caf::PO_1); caf::SurfaceEffectGenerator surfaceGen(fractureColor, caf::PO_1);
cvf::ref<cvf::Effect> eff = surfaceGen.generateCachedEffect(); cvf::ref<cvf::Effect> eff = surfaceGen.generateCachedEffect();
m_part->setEffect(eff.p()); m_part->setEffect(eff.p());
m_part->setSourceInfo(new RivObjectSourceInfo(m_rimFracture));
} }
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RivWellFracturePartMgr::updatePartGeometryTexture(const caf::DisplayCoordTransform* displayCoordTransform) void RivWellFracturePartMgr::applyResultTextureColor()
{ {
if (m_part.notNull()) return; if (m_part.isNull()) return;
if (!displayCoordTransform) return;
if (m_rimFracture) if (m_rimFracture)
{ {
@@ -140,44 +148,18 @@ void RivWellFracturePartMgr::updatePartGeometryTexture(const caf::DisplayCoordTr
return; return;
} }
std::vector<cvf::Vec3f> nodeCoords;
std::vector<cvf::uint> triangleIndices;
m_rimFracture->triangleGeometry(&triangleIndices, &nodeCoords);
std::vector<cvf::Vec3f> displayCoords;
for (size_t i = 0; i < nodeCoords.size(); i++)
{
cvf::Vec3d nodeCoordsDouble = static_cast<cvf::Vec3d>(nodeCoords[i]);
cvf::Vec3d displayCoordsDouble = displayCoordTransform->transformToDisplayCoord(nodeCoordsDouble);
displayCoords.push_back(static_cast<cvf::Vec3f>(displayCoordsDouble));
}
if (triangleIndices.size() == 0 || displayCoords.size() == 0)
{
return;
}
cvf::ref<cvf::DrawableGeo> geo = createGeo(triangleIndices, displayCoords);
CVF_ASSERT(geo.notNull());
m_part = new cvf::Part;
m_part->setDrawable(geo.p());
generateFractureOutlinePolygonPart(displayCoordTransform);
generateStimPlanMeshPart(displayCoordTransform);
float opacityLevel = activeView->stimPlanColors->opacityLevel(); float opacityLevel = activeView->stimPlanColors->opacityLevel();
if (legendConfig) if (legendConfig)
{ {
cvf::ScalarMapper* scalarMapper = legendConfig->scalarMapper(); cvf::ScalarMapper* scalarMapper = legendConfig->scalarMapper();
cvf::DrawableGeo* geo = dynamic_cast<cvf::DrawableGeo*> (m_part->drawable());
cvf::ref<cvf::Vec2fArray> textureCoords = new cvf::Vec2fArray; cvf::ref<cvf::Vec2fArray> textureCoords = new cvf::Vec2fArray;
textureCoords->resize(nodeCoords.size()); textureCoords->resize(geo->vertexCount());
int timeStepIndex = m_rimFracture->stimPlanTimeIndexToPlot; int timeStepIndex = m_rimFracture->stimPlanTimeIndexToPlot;
std::vector<std::vector<double> > dataToPlot = stimPlanFracTemplate->resultValues(activeView->stimPlanColors->resultName(), activeView->stimPlanColors->unit(), timeStepIndex); std::vector<std::vector<double> > dataToPlot = stimPlanFracTemplate->resultValues(activeView->stimPlanColors->resultName(),
activeView->stimPlanColors->unit(),
timeStepIndex);
int i = 0; int i = 0;
for (std::vector<double> depthData : dataToPlot) for (std::vector<double> depthData : dataToPlot)
@@ -213,18 +195,12 @@ void RivWellFracturePartMgr::updatePartGeometryTexture(const caf::DisplayCoordTr
cvf::ref<cvf::Effect> eff = effGen.generateCachedEffect(); cvf::ref<cvf::Effect> eff = effGen.generateCachedEffect();
m_part->setEffect(eff.p()); m_part->setEffect(eff.p());
m_part->setPriority(RivPartPriority::PartType::Transparent);
} }
else else
{ {
cvf::Color4f fractureColor = cvf::Color4f(activeView->stimPlanColors->defaultColor(), 1.0); applyFractureUniformColor();
caf::SurfaceEffectGenerator surfaceGen(fractureColor, caf::PO_1);
cvf::ref<cvf::Effect> eff = surfaceGen.generateCachedEffect();
m_part->setEffect(eff.p());
} }
m_part->setPriority(RivPartPriority::PartType::Transparent);
m_part->setSourceInfo(new RivObjectSourceInfo(m_rimFracture));
} }
} }
@@ -239,7 +215,7 @@ void RivWellFracturePartMgr::generateFractureOutlinePolygonPart(const caf::Displ
if (polygonGeo.notNull()) if (polygonGeo.notNull())
{ {
m_polygonPart = new cvf::Part; m_polygonPart = new cvf::Part(0, "FractureOutline");
m_polygonPart->setDrawable(polygonGeo.p()); m_polygonPart->setDrawable(polygonGeo.p());
m_polygonPart->updateBoundingBox(); m_polygonPart->updateBoundingBox();
@@ -268,7 +244,7 @@ void RivWellFracturePartMgr::generateStimPlanMeshPart(const caf::DisplayCoordTra
cvf::ref<cvf::DrawableGeo> stimPlanMeshGeo = createStimPlanMeshDrawable(stimPlanFracTemplate, displayCoordTransform); cvf::ref<cvf::DrawableGeo> stimPlanMeshGeo = createStimPlanMeshDrawable(stimPlanFracTemplate, displayCoordTransform);
if (stimPlanMeshGeo.notNull()) if (stimPlanMeshGeo.notNull())
{ {
m_stimPlanMeshPart = new cvf::Part; m_stimPlanMeshPart = new cvf::Part(0, "StimPlanMesh");
m_stimPlanMeshPart->setDrawable(stimPlanMeshGeo.p()); m_stimPlanMeshPart->setDrawable(stimPlanMeshGeo.p());
m_stimPlanMeshPart->updateBoundingBox(); m_stimPlanMeshPart->updateBoundingBox();
@@ -398,7 +374,9 @@ cvf::ref<cvf::DrawableGeo> RivWellFracturePartMgr::createPolygonDrawable(const c
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
std::vector<cvf::Vec3f> RivWellFracturePartMgr::transfromToFractureDisplayCoords(std::vector<cvf::Vec3f> coordinatesVector, cvf::Mat4f m, const caf::DisplayCoordTransform* displayCoordTransform) std::vector<cvf::Vec3f> RivWellFracturePartMgr::transfromToFractureDisplayCoords(std::vector<cvf::Vec3f> coordinatesVector,
cvf::Mat4f m,
const caf::DisplayCoordTransform* displayCoordTransform)
{ {
std::vector<cvf::Vec3f> polygonInDisplayCoords; std::vector<cvf::Vec3f> polygonInDisplayCoords;
for (cvf::Vec3f v : coordinatesVector) for (cvf::Vec3f v : coordinatesVector)
@@ -438,23 +416,28 @@ void RivWellFracturePartMgr::appendGeometryPartsToModel(cvf::ModelBasicList* mod
if (!m_rimFracture->isChecked()) return; if (!m_rimFracture->isChecked()) return;
RimStimPlanFractureTemplate* stimPlanFracTemplate = dynamic_cast<RimStimPlanFractureTemplate*>(m_rimFracture->fractureTemplate());
if (m_part.isNull()) if (m_part.isNull())
{ {
if (m_rimFracture->fractureTemplate()) if (m_rimFracture->fractureTemplate())
{ {
if (dynamic_cast<RimStimPlanFractureTemplate*>(m_rimFracture->fractureTemplate())) if (stimPlanFracTemplate)
{ {
updatePartGeometryTexture(displayCoordTransform); generateSurfacePart(displayCoordTransform);
generateFractureOutlinePolygonPart(displayCoordTransform);
RimStimPlanFractureTemplate* stimPlanFracTemplate = dynamic_cast<RimStimPlanFractureTemplate*>(m_rimFracture->fractureTemplate()); applyResultTextureColor();
if (stimPlanFracTemplate->showStimPlanMesh() && m_stimPlanMeshPart.notNull())
if (stimPlanFracTemplate->showStimPlanMesh())
{ {
model->addPart(m_stimPlanMeshPart.p()); generateStimPlanMeshPart(displayCoordTransform);
} }
} }
else else // Ellipse
{ {
updatePartGeometry(displayCoordTransform); generateSurfacePart(displayCoordTransform);
applyFractureUniformColor();
} }
} }
} }
@@ -464,7 +447,13 @@ void RivWellFracturePartMgr::appendGeometryPartsToModel(cvf::ModelBasicList* mod
model->addPart(m_part.p()); model->addPart(m_part.p());
} }
if (dynamic_cast<RimStimPlanFractureTemplate*>(m_rimFracture->fractureTemplate()) if (m_stimPlanMeshPart.notNull()
&& stimPlanFracTemplate->showStimPlanMesh())
{
model->addPart(m_stimPlanMeshPart.p());
}
if (stimPlanFracTemplate
&& m_rimFracture->showPolygonFractureOutline() && m_rimFracture->showPolygonFractureOutline()
&& m_polygonPart.notNull()) && m_polygonPart.notNull())
{ {
@@ -485,7 +474,7 @@ void RivWellFracturePartMgr::clearGeometryCache()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
cvf::ref<cvf::DrawableGeo> RivWellFracturePartMgr::createGeo(const std::vector<cvf::uint>& triangleIndices, const std::vector<cvf::Vec3f>& nodeCoords) cvf::ref<cvf::DrawableGeo> RivWellFracturePartMgr::buildDrawableGeoFromTriangles(const std::vector<cvf::uint>& triangleIndices, const std::vector<cvf::Vec3f>& nodeCoords)
{ {
CVF_ASSERT(triangleIndices.size() > 0); CVF_ASSERT(triangleIndices.size() > 0);
CVF_ASSERT(nodeCoords.size() > 0); CVF_ASSERT(nodeCoords.size() > 0);

View File

@@ -51,28 +51,43 @@ public:
RivWellFracturePartMgr(RimFracture* well); RivWellFracturePartMgr(RimFracture* well);
~RivWellFracturePartMgr(); ~RivWellFracturePartMgr();
void appendGeometryPartsToModel(cvf::ModelBasicList* model, const caf::DisplayCoordTransform* displayCoordTransform); void appendGeometryPartsToModel(cvf::ModelBasicList* model,
const caf::DisplayCoordTransform* displayCoordTransform);
void clearGeometryCache(); void clearGeometryCache();
static std::vector<double> mirrorDataAtSingleDepth(std::vector<double> depthData); static std::vector<double> mirrorDataAtSingleDepth(std::vector<double> depthData);
private: private:
void updatePartGeometry(const caf::DisplayCoordTransform* displayCoordTransform); void generateSurfacePart(const caf::DisplayCoordTransform* displayCoordTransform);
void updatePartGeometryTexture(const caf::DisplayCoordTransform* displayCoordTransform);
void applyFractureUniformColor();
void applyResultTextureColor();
void generateFractureOutlinePolygonPart(const caf::DisplayCoordTransform* displayCoordTransform); void generateFractureOutlinePolygonPart(const caf::DisplayCoordTransform* displayCoordTransform);
void generateStimPlanMeshPart(const caf::DisplayCoordTransform* displayCoordTransform); void generateStimPlanMeshPart(const caf::DisplayCoordTransform* displayCoordTransform);
cvf::ref<cvf::DrawableGeo> createPolygonDrawable(const caf::DisplayCoordTransform* displayCoordTransform); cvf::ref<cvf::DrawableGeo> createPolygonDrawable(const caf::DisplayCoordTransform* displayCoordTransform);
cvf::ref<cvf::DrawableGeo> createStimPlanMeshDrawable(RimStimPlanFractureTemplate* stimPlanFracTemplate, const caf::DisplayCoordTransform* displayCoordTransform); cvf::ref<cvf::DrawableGeo> createStimPlanMeshDrawable(RimStimPlanFractureTemplate* stimPlanFracTemplate,
const caf::DisplayCoordTransform* displayCoordTransform);
void getPolygonBB(float &polygonXmin, float &polygonXmax, float &polygonYmin, float &polygonYmax); void getPolygonBB(float &polygonXmin, float &polygonXmax, float &polygonYmin, float &polygonYmax);
std::vector<cvf::Vec3f> transfromToFractureDisplayCoords(std::vector<cvf::Vec3f> polygon, cvf::Mat4f m, const caf::DisplayCoordTransform* displayCoordTransform); std::vector<cvf::Vec3f> transfromToFractureDisplayCoords(std::vector<cvf::Vec3f> polygon,
bool stimPlanCellTouchesPolygon(const std::vector<cvf::Vec3f>& polygon, double xMin, double xMax, double yMin, double yMax, float polygonXmin, float polygonXmax, float polygonYmin, float polygonYmax); cvf::Mat4f m,
const caf::DisplayCoordTransform* displayCoordTransform);
static cvf::ref<cvf::DrawableGeo> createGeo(const std::vector<cvf::uint>& triangleIndices, const std::vector<cvf::Vec3f>& nodeCoords); bool stimPlanCellTouchesPolygon(const std::vector<cvf::Vec3f>& polygon,
double xMin,
double xMax,
double yMin,
double yMax,
float polygonXmin,
float polygonXmax,
float polygonYmin,
float polygonYmax);
static cvf::ref<cvf::DrawableGeo> buildDrawableGeoFromTriangles(const std::vector<cvf::uint>& triangleIndices,
const std::vector<cvf::Vec3f>& nodeCoords);
private: private:
caf::PdmPointer<RimFracture> m_rimFracture; caf::PdmPointer<RimFracture> m_rimFracture;