2013-12-03 13:30:32 -06:00
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
2013-12-04 02:39:50 -06:00
|
|
|
// Copyright (C) Statoil ASA, Ceetron Solutions AS
|
2013-12-03 13:30:32 -06:00
|
|
|
//
|
|
|
|
// ResInsight is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
|
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
// FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
//
|
|
|
|
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
|
|
|
|
// for more details.
|
|
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#include "RivFaultPartMgr.h"
|
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
#include "RiaApplication.h"
|
|
|
|
#include "RiaPreferences.h"
|
2013-12-03 13:30:32 -06:00
|
|
|
|
2014-08-11 07:28:32 -05:00
|
|
|
#include "RigCaseCellResultsData.h"
|
|
|
|
#include "RigCaseData.h"
|
2014-08-08 09:44:21 -05:00
|
|
|
#include "RigResultAccessor.h"
|
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
#include "RimCase.h"
|
2014-07-24 03:11:43 -05:00
|
|
|
#include "RimFaultCollection.h"
|
2014-08-11 07:28:32 -05:00
|
|
|
#include "RimReservoirView.h"
|
|
|
|
#include "RimResultSlot.h"
|
|
|
|
#include "RimTernaryLegendConfig.h"
|
2013-12-10 00:56:58 -06:00
|
|
|
|
2014-08-08 09:44:21 -05:00
|
|
|
#include "RivResultToTextureMapper.h"
|
2014-08-11 07:28:32 -05:00
|
|
|
#include "RivScalarMapperUtils.h"
|
|
|
|
#include "RivSourceInfo.h"
|
|
|
|
#include "RivTernaryScalarMapper.h"
|
|
|
|
#include "RivTernaryTextureCoordsCreator.h"
|
|
|
|
#include "RivTextureCoordsCreator.h"
|
2013-12-03 13:30:32 -06:00
|
|
|
|
2014-08-11 07:28:32 -05:00
|
|
|
#include "cvfDrawableGeo.h"
|
|
|
|
#include "cvfDrawableText.h"
|
|
|
|
#include "cvfModelBasicList.h"
|
|
|
|
#include "cvfPart.h"
|
|
|
|
#include "cvfPrimitiveSetDirect.h"
|
|
|
|
#include "cvfqtUtils.h"
|
2013-12-03 13:30:32 -06:00
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
2013-12-18 02:13:13 -06:00
|
|
|
RivFaultPartMgr::RivFaultPartMgr(const RigGridBase* grid, const RimFaultCollection* rimFaultCollection, const RimFault* rimFault)
|
2013-12-10 00:56:58 -06:00
|
|
|
: m_grid(grid),
|
2013-12-18 02:13:13 -06:00
|
|
|
m_rimFaultCollection(rimFaultCollection),
|
2013-12-10 00:56:58 -06:00
|
|
|
m_rimFault(rimFault),
|
|
|
|
m_opacityLevel(1.0f),
|
2013-12-16 04:31:06 -06:00
|
|
|
m_defaultColor(cvf::Color3::WHITE)
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-14 02:45:25 -06:00
|
|
|
cvf::ref< cvf::Array<size_t> > connIdxes = new cvf::Array<size_t>;
|
|
|
|
connIdxes->assign(rimFault->faultGeometry()->connectionIndices());
|
|
|
|
|
2013-12-16 04:31:06 -06:00
|
|
|
m_nativeFaultGenerator = new RivFaultGeometryGenerator(grid, rimFault->faultGeometry(), true);
|
|
|
|
m_oppositeFaultGenerator = new RivFaultGeometryGenerator(grid, rimFault->faultGeometry(), false);
|
|
|
|
|
2013-12-14 02:45:25 -06:00
|
|
|
m_NNCGenerator = new RivNNCGeometryGenerator(grid->mainGrid()->nncData(), grid->mainGrid()->displayModelOffset(), connIdxes.p());
|
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
m_nativeFaultFacesTextureCoords = new cvf::Vec2fArray;
|
|
|
|
m_oppositeFaultFacesTextureCoords = new cvf::Vec2fArray;
|
2013-12-14 02:45:25 -06:00
|
|
|
m_NNCTextureCoords = new cvf::Vec2fArray;
|
2013-12-03 13:30:32 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
2013-12-10 00:56:58 -06:00
|
|
|
void RivFaultPartMgr::setCellVisibility(cvf::UByteArray* cellVisibilities)
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-16 04:31:06 -06:00
|
|
|
m_nativeFaultGenerator->setCellVisibility(cellVisibilities);
|
|
|
|
m_oppositeFaultGenerator->setCellVisibility(cellVisibilities);
|
2013-12-18 03:15:35 -06:00
|
|
|
m_NNCGenerator->setCellVisibility(cellVisibilities, m_grid.p());
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
generatePartGeometry();
|
2013-12-03 13:30:32 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
2013-12-10 00:56:58 -06:00
|
|
|
void RivFaultPartMgr::applySingleColorEffect()
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
m_defaultColor = m_rimFault->faultColor();
|
2013-12-16 04:31:06 -06:00
|
|
|
this->updatePartEffect();
|
2013-12-03 13:30:32 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
2013-12-10 00:56:58 -06:00
|
|
|
void RivFaultPartMgr::updateCellResultColor(size_t timeStepIndex, RimResultSlot* cellResultSlot)
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
CVF_ASSERT(cellResultSlot);
|
|
|
|
|
2013-12-19 02:08:08 -06:00
|
|
|
updateNNCColors(cellResultSlot);
|
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
size_t scalarSetIndex = cellResultSlot->gridScalarIndex();
|
|
|
|
|
|
|
|
// If the result is static, only read that.
|
|
|
|
size_t resTimeStepIdx = timeStepIndex;
|
|
|
|
if (cellResultSlot->hasStaticResult()) resTimeStepIdx = 0;
|
|
|
|
|
|
|
|
RifReaderInterface::PorosityModelResultType porosityModel = RigCaseCellResultsData::convertFromProjectModelPorosityModel(cellResultSlot->porosityModel());
|
|
|
|
|
|
|
|
RigCaseData* eclipseCase = cellResultSlot->reservoirView()->eclipseCase()->reservoirData();
|
|
|
|
|
|
|
|
// Faults
|
|
|
|
if (m_nativeFaultFaces.notNull())
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2014-04-29 03:13:19 -05:00
|
|
|
if (cellResultSlot->isTernarySaturationSelected())
|
|
|
|
{
|
2014-08-11 07:28:32 -05:00
|
|
|
RivTernaryTextureCoordsCreator texturer(cellResultSlot, cellResultSlot->ternaryLegendConfig(),
|
|
|
|
timeStepIndex,
|
|
|
|
m_grid->gridIndex(),
|
|
|
|
m_nativeFaultGenerator->cellFromQuadMapper());
|
2014-04-29 03:13:19 -05:00
|
|
|
|
2014-08-11 07:28:32 -05:00
|
|
|
texturer.createTextureCoords(m_nativeFaultFacesTextureCoords.p());
|
|
|
|
|
|
|
|
const RivTernaryScalarMapper* mapper = cellResultSlot->ternaryLegendConfig()->scalarMapper();
|
|
|
|
RivScalarMapperUtils::applyTernaryTextureResultsToPart(m_nativeFaultFaces.p(), m_nativeFaultFacesTextureCoords.p(), mapper, m_opacityLevel);
|
|
|
|
}
|
2013-12-17 01:07:14 -06:00
|
|
|
else
|
|
|
|
{
|
2014-08-08 09:44:21 -05:00
|
|
|
RivTextureCoordsCreator texturer(cellResultSlot,
|
|
|
|
timeStepIndex,
|
|
|
|
m_grid->gridIndex(),
|
|
|
|
m_nativeFaultGenerator->cellFromQuadMapper());
|
2013-12-10 00:56:58 -06:00
|
|
|
|
2014-08-11 04:02:16 -05:00
|
|
|
if (!texturer.isValid())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-08-08 09:44:21 -05:00
|
|
|
texturer.createTextureCoords(m_nativeFaultFacesTextureCoords.p());
|
2013-12-10 00:56:58 -06:00
|
|
|
|
2014-08-11 07:28:32 -05:00
|
|
|
const cvf::ScalarMapper* mapper = cellResultSlot->legendConfig()->scalarMapper();
|
|
|
|
RivScalarMapperUtils::applyTextureResultsToPart(m_nativeFaultFaces.p(), m_nativeFaultFacesTextureCoords.p(), mapper, m_opacityLevel);
|
2014-04-29 03:13:19 -05:00
|
|
|
}
|
2013-12-03 13:30:32 -06:00
|
|
|
}
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
if (m_oppositeFaultFaces.notNull())
|
|
|
|
{
|
2014-08-11 07:28:32 -05:00
|
|
|
if (cellResultSlot->isTernarySaturationSelected())
|
|
|
|
{
|
|
|
|
RivTernaryTextureCoordsCreator texturer(cellResultSlot, cellResultSlot->ternaryLegendConfig(),
|
|
|
|
timeStepIndex,
|
|
|
|
m_grid->gridIndex(),
|
|
|
|
m_oppositeFaultGenerator->cellFromQuadMapper());
|
|
|
|
|
|
|
|
texturer.createTextureCoords(m_oppositeFaultFacesTextureCoords.p());
|
|
|
|
|
|
|
|
const RivTernaryScalarMapper* mapper = cellResultSlot->ternaryLegendConfig()->scalarMapper();
|
|
|
|
RivScalarMapperUtils::applyTernaryTextureResultsToPart(m_oppositeFaultFaces.p(), m_oppositeFaultFacesTextureCoords.p(), mapper, m_opacityLevel);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
RivTextureCoordsCreator texturer(cellResultSlot,
|
|
|
|
timeStepIndex,
|
|
|
|
m_grid->gridIndex(),
|
|
|
|
m_oppositeFaultGenerator->cellFromQuadMapper());
|
2013-12-10 00:56:58 -06:00
|
|
|
|
2014-08-11 04:02:16 -05:00
|
|
|
if (!texturer.isValid())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-08-11 07:28:32 -05:00
|
|
|
texturer.createTextureCoords(m_oppositeFaultFacesTextureCoords.p());
|
2013-12-10 00:56:58 -06:00
|
|
|
|
2014-08-11 07:28:32 -05:00
|
|
|
const cvf::ScalarMapper* mapper = cellResultSlot->legendConfig()->scalarMapper();
|
|
|
|
RivScalarMapperUtils::applyTextureResultsToPart(m_oppositeFaultFaces.p(), m_oppositeFaultFacesTextureCoords.p(), mapper, m_opacityLevel);
|
|
|
|
}
|
|
|
|
}
|
2013-12-03 13:30:32 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
2013-12-10 00:56:58 -06:00
|
|
|
void RivFaultPartMgr::updateCellEdgeResultColor(size_t timeStepIndex, RimResultSlot* cellResultSlot, RimCellEdgeResultSlot* cellEdgeResultSlot)
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-06 05:02:04 -06:00
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
}
|
2013-12-03 13:30:32 -06:00
|
|
|
|
2014-07-01 07:28:06 -05:00
|
|
|
const int priFaultGeo = 1;
|
|
|
|
const int priNncGeo = 2;
|
|
|
|
const int priMesh = 3;
|
2013-12-03 13:30:32 -06:00
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RivFaultPartMgr::generatePartGeometry()
|
|
|
|
{
|
2013-12-18 05:13:44 -06:00
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
bool useBufferObjects = true;
|
|
|
|
// Surface geometry
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-16 04:31:06 -06:00
|
|
|
cvf::ref<cvf::DrawableGeo> geo = m_nativeFaultGenerator->generateSurface();
|
2013-12-10 00:56:58 -06:00
|
|
|
if (geo.notNull())
|
2013-12-06 05:02:04 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
geo->computeNormals();
|
2013-12-09 14:13:02 -06:00
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
if (useBufferObjects)
|
2013-12-09 14:13:02 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
geo->setRenderMode(cvf::DrawableGeo::BUFFER_OBJECT);
|
2013-12-09 14:13:02 -06:00
|
|
|
}
|
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
cvf::ref<cvf::Part> part = new cvf::Part;
|
|
|
|
part->setName("Grid " + cvf::String(static_cast<int>(m_grid->gridIndex())));
|
|
|
|
part->setId(m_grid->gridIndex()); // !! For now, use grid index as part ID (needed for pick info)
|
|
|
|
part->setDrawable(geo.p());
|
|
|
|
|
|
|
|
// Set mapping from triangle face index to cell index
|
2013-12-20 03:57:53 -06:00
|
|
|
cvf::ref<RivSourceInfo> si = new RivSourceInfo;
|
2014-06-24 10:19:30 -05:00
|
|
|
si->m_cellFaceFromTriangleMapper = m_nativeFaultGenerator->cellFromTriangleMapper();
|
2013-12-20 03:57:53 -06:00
|
|
|
part->setSourceInfo(si.p());
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
part->updateBoundingBox();
|
|
|
|
part->setEnableMask(faultBit);
|
2013-12-18 05:13:44 -06:00
|
|
|
part->setPriority(priFaultGeo);
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
m_nativeFaultFaces = part;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Mesh geometry
|
|
|
|
{
|
2013-12-16 04:31:06 -06:00
|
|
|
cvf::ref<cvf::DrawableGeo> geoMesh = m_nativeFaultGenerator->createMeshDrawable();
|
2013-12-10 00:56:58 -06:00
|
|
|
if (geoMesh.notNull())
|
|
|
|
{
|
|
|
|
if (useBufferObjects)
|
2013-12-09 14:13:02 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
geoMesh->setRenderMode(cvf::DrawableGeo::BUFFER_OBJECT);
|
2013-12-09 14:13:02 -06:00
|
|
|
}
|
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
cvf::ref<cvf::Part> part = new cvf::Part;
|
|
|
|
part->setName("Grid mesh" + cvf::String(static_cast<int>(m_grid->gridIndex())));
|
|
|
|
part->setDrawable(geoMesh.p());
|
|
|
|
|
|
|
|
part->updateBoundingBox();
|
|
|
|
part->setEnableMask(meshFaultBit);
|
2013-12-18 05:13:44 -06:00
|
|
|
part->setPriority(priMesh);
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
m_nativeFaultGridLines = part;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Surface geometry
|
|
|
|
{
|
2013-12-16 04:31:06 -06:00
|
|
|
cvf::ref<cvf::DrawableGeo> geo = m_oppositeFaultGenerator->generateSurface();
|
2013-12-10 00:56:58 -06:00
|
|
|
if (geo.notNull())
|
|
|
|
{
|
|
|
|
geo->computeNormals();
|
|
|
|
|
|
|
|
if (useBufferObjects)
|
2013-12-09 14:13:02 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
geo->setRenderMode(cvf::DrawableGeo::BUFFER_OBJECT);
|
2013-12-09 14:13:02 -06:00
|
|
|
}
|
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
cvf::ref<cvf::Part> part = new cvf::Part;
|
|
|
|
part->setName("Grid " + cvf::String(static_cast<int>(m_grid->gridIndex())));
|
|
|
|
part->setId(m_grid->gridIndex()); // !! For now, use grid index as part ID (needed for pick info)
|
|
|
|
part->setDrawable(geo.p());
|
|
|
|
|
|
|
|
// Set mapping from triangle face index to cell index
|
2013-12-20 03:57:53 -06:00
|
|
|
cvf::ref<RivSourceInfo> si = new RivSourceInfo;
|
2014-06-24 10:19:30 -05:00
|
|
|
si->m_cellFaceFromTriangleMapper = m_oppositeFaultGenerator->cellFromTriangleMapper();
|
2013-12-20 03:57:53 -06:00
|
|
|
part->setSourceInfo(si.p());
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
part->updateBoundingBox();
|
|
|
|
part->setEnableMask(faultBit);
|
2013-12-18 05:13:44 -06:00
|
|
|
part->setPriority(priFaultGeo);
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
m_oppositeFaultFaces = part;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Mesh geometry
|
|
|
|
{
|
2013-12-16 04:31:06 -06:00
|
|
|
cvf::ref<cvf::DrawableGeo> geoMesh = m_oppositeFaultGenerator->createMeshDrawable();
|
2013-12-10 00:56:58 -06:00
|
|
|
if (geoMesh.notNull())
|
|
|
|
{
|
|
|
|
if (useBufferObjects)
|
|
|
|
{
|
|
|
|
geoMesh->setRenderMode(cvf::DrawableGeo::BUFFER_OBJECT);
|
|
|
|
}
|
|
|
|
|
|
|
|
cvf::ref<cvf::Part> part = new cvf::Part;
|
|
|
|
part->setName("Grid mesh" + cvf::String(static_cast<int>(m_grid->gridIndex())));
|
|
|
|
part->setDrawable(geoMesh.p());
|
|
|
|
|
|
|
|
part->updateBoundingBox();
|
|
|
|
part->setEnableMask(meshFaultBit);
|
2013-12-18 05:13:44 -06:00
|
|
|
part->setPriority(priMesh);
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
m_oppositeFaultGridLines = part;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-14 02:45:25 -06:00
|
|
|
{
|
|
|
|
cvf::ref<cvf::DrawableGeo> geo = m_NNCGenerator->generateSurface();
|
|
|
|
if (geo.notNull())
|
|
|
|
{
|
|
|
|
geo->computeNormals();
|
|
|
|
|
|
|
|
if (useBufferObjects)
|
|
|
|
{
|
|
|
|
geo->setRenderMode(cvf::DrawableGeo::BUFFER_OBJECT);
|
|
|
|
}
|
|
|
|
|
|
|
|
cvf::ref<cvf::Part> part = new cvf::Part;
|
|
|
|
part->setName("NNC in Fault. Grid " + cvf::String(static_cast<int>(m_grid->gridIndex())));
|
|
|
|
part->setId(m_grid->gridIndex()); // !! For now, use grid index as part ID (needed for pick info)
|
|
|
|
part->setDrawable(geo.p());
|
|
|
|
|
|
|
|
// Set mapping from triangle face index to cell index
|
2013-12-20 03:57:53 -06:00
|
|
|
cvf::ref<RivSourceInfo> si = new RivSourceInfo;
|
|
|
|
si->m_NNCIndices = m_NNCGenerator->triangleToNNCIndex().p();
|
|
|
|
part->setSourceInfo(si.p());
|
2013-12-14 02:45:25 -06:00
|
|
|
|
|
|
|
part->updateBoundingBox();
|
|
|
|
part->setEnableMask(faultBit);
|
2013-12-18 05:13:44 -06:00
|
|
|
part->setPriority(priNncGeo);
|
2013-12-14 02:45:25 -06:00
|
|
|
|
|
|
|
m_NNCFaces = part;
|
|
|
|
}
|
|
|
|
}
|
2013-12-10 00:56:58 -06:00
|
|
|
|
2013-12-18 05:16:03 -06:00
|
|
|
createLabelWithAnchorLine(m_nativeFaultFaces.p());
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
updatePartEffect();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RivFaultPartMgr::updatePartEffect()
|
|
|
|
{
|
|
|
|
// Set default effect
|
2013-12-19 02:08:08 -06:00
|
|
|
caf::SurfaceEffectGenerator geometryEffgen(m_defaultColor, caf::PO_1);
|
2013-12-19 01:48:36 -06:00
|
|
|
geometryEffgen.setCullBackfaces(faceCullingMode());
|
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
cvf::ref<cvf::Effect> geometryOnlyEffect = geometryEffgen.generateEffect();
|
|
|
|
|
|
|
|
if (m_nativeFaultFaces.notNull())
|
|
|
|
{
|
|
|
|
m_nativeFaultFaces->setEffect(geometryOnlyEffect.p());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_oppositeFaultFaces.notNull())
|
|
|
|
{
|
|
|
|
m_oppositeFaultFaces->setEffect(geometryOnlyEffect.p());
|
|
|
|
}
|
|
|
|
|
2013-12-19 02:08:08 -06:00
|
|
|
updateNNCColors(NULL);
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
// Update mesh colors as well, in case of change
|
|
|
|
RiaPreferences* prefs = RiaApplication::instance()->preferences();
|
|
|
|
|
|
|
|
cvf::ref<cvf::Effect> eff;
|
|
|
|
caf::MeshEffectGenerator faultEffGen(prefs->defaultFaultGridLineColors());
|
|
|
|
eff = faultEffGen.generateEffect();
|
|
|
|
|
|
|
|
if (m_nativeFaultGridLines.notNull())
|
|
|
|
{
|
|
|
|
m_nativeFaultGridLines->setEffect(eff.p());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_oppositeFaultGridLines.notNull())
|
|
|
|
{
|
|
|
|
m_oppositeFaultGridLines->setEffect(eff.p());
|
|
|
|
}
|
2013-12-16 04:31:06 -06:00
|
|
|
|
|
|
|
if (m_opacityLevel < 1.0f)
|
|
|
|
{
|
|
|
|
// Set priority to make sure this transparent geometry are rendered last
|
2014-07-01 07:28:06 -05:00
|
|
|
if (m_nativeFaultFaces.notNull()) m_nativeFaultFaces->setPriority(100 + priFaultGeo);
|
|
|
|
if (m_oppositeFaultFaces.notNull()) m_oppositeFaultFaces->setPriority(100 + priFaultGeo);
|
|
|
|
if (m_NNCFaces.notNull()) m_NNCFaces->setPriority(100 + priNncGeo);
|
|
|
|
|
|
|
|
if (m_nativeFaultGridLines.notNull())
|
|
|
|
{
|
|
|
|
m_nativeFaultGridLines->setPriority(100 + priMesh);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_oppositeFaultGridLines.notNull())
|
|
|
|
{
|
|
|
|
m_oppositeFaultGridLines->setPriority(100 + priMesh);
|
|
|
|
}
|
2013-12-16 04:31:06 -06:00
|
|
|
}
|
2013-12-10 00:56:58 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RivFaultPartMgr::createLabelWithAnchorLine(const cvf::Part* part)
|
|
|
|
{
|
2013-12-18 05:16:03 -06:00
|
|
|
m_faultLabelPart = NULL;
|
|
|
|
m_faultLabelLinePart = NULL;
|
|
|
|
|
|
|
|
if (!part) return;
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
cvf::BoundingBox bb = part->boundingBox();
|
|
|
|
|
|
|
|
cvf::Vec3d bbTopCenter = bb.center();
|
|
|
|
bbTopCenter.z() = bb.max().z();
|
|
|
|
|
|
|
|
const cvf::DrawableGeo* geo = dynamic_cast<const cvf::DrawableGeo*>(part->drawable());
|
|
|
|
|
|
|
|
// Find closest vertex to top of bounding box.
|
|
|
|
// Will be recomputed when filter changes, to make sure the label is always visible
|
|
|
|
// for any filter combination
|
|
|
|
cvf::Vec3f faultVertexToAttachLabel = findClosestVertex(cvf::Vec3f(bbTopCenter), geo->vertexArray());
|
|
|
|
|
|
|
|
cvf::Vec3f labelPosition = faultVertexToAttachLabel;
|
|
|
|
labelPosition.z() += bb.extent().z() / 2;
|
|
|
|
|
|
|
|
// Fault label
|
|
|
|
{
|
|
|
|
cvf::Font* standardFont = RiaApplication::instance()->standardFont();
|
|
|
|
|
|
|
|
cvf::ref<cvf::DrawableText> drawableText = new cvf::DrawableText;
|
|
|
|
drawableText->setFont(standardFont);
|
|
|
|
drawableText->setCheckPosVisible(false);
|
|
|
|
drawableText->setDrawBorder(false);
|
|
|
|
drawableText->setDrawBackground(false);
|
|
|
|
drawableText->setVerticalAlignment(cvf::TextDrawer::CENTER);
|
|
|
|
|
|
|
|
cvf::Color3f defWellLabelColor = RiaApplication::instance()->preferences()->defaultWellLabelColor();
|
|
|
|
{
|
|
|
|
std::vector<RimFaultCollection*> parentObjects;
|
|
|
|
m_rimFault->parentObjectsOfType(parentObjects);
|
|
|
|
|
|
|
|
if (parentObjects.size() > 0)
|
2013-12-09 14:13:02 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
defWellLabelColor = parentObjects[0]->faultLabelColor();;
|
2013-12-09 14:13:02 -06:00
|
|
|
}
|
2013-12-06 05:02:04 -06:00
|
|
|
}
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
drawableText->setTextColor(defWellLabelColor);
|
|
|
|
|
|
|
|
cvf::String cvfString = cvfqt::Utils::toString(m_rimFault->name());
|
|
|
|
|
|
|
|
cvf::Vec3f textCoord(labelPosition);
|
|
|
|
double characteristicCellSize = bb.extent().z() / 20;
|
|
|
|
textCoord.z() += characteristicCellSize;
|
|
|
|
|
|
|
|
drawableText->addText(cvfString, textCoord);
|
|
|
|
|
|
|
|
cvf::ref<cvf::Part> part = new cvf::Part;
|
|
|
|
part->setName("RivFaultPart : text " + cvfString);
|
|
|
|
part->setDrawable(drawableText.p());
|
|
|
|
|
|
|
|
cvf::ref<cvf::Effect> eff = new cvf::Effect;
|
|
|
|
|
|
|
|
part->setEffect(eff.p());
|
|
|
|
part->setPriority(1000);
|
|
|
|
|
|
|
|
m_faultLabelPart = part;
|
2013-12-03 13:30:32 -06:00
|
|
|
}
|
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
|
|
|
|
// Line from fault geometry to label
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
cvf::ref<cvf::Vec3fArray> vertices = new cvf::Vec3fArray;
|
|
|
|
vertices->reserve(2);
|
|
|
|
vertices->add(faultVertexToAttachLabel);
|
|
|
|
vertices->add(labelPosition);
|
|
|
|
|
|
|
|
cvf::ref<cvf::DrawableGeo> geo = new cvf::DrawableGeo;
|
|
|
|
geo->setVertexArray(vertices.p());
|
|
|
|
|
|
|
|
cvf::ref<cvf::PrimitiveSetDirect> primSet = new cvf::PrimitiveSetDirect(cvf::PT_LINES);
|
|
|
|
primSet->setStartIndex(0);
|
|
|
|
primSet->setIndexCount(vertices->size());
|
|
|
|
geo->addPrimitiveSet(primSet.p());
|
|
|
|
|
|
|
|
m_faultLabelLinePart = new cvf::Part;
|
|
|
|
m_faultLabelLinePart->setName("Anchor line for label" + cvf::String(static_cast<int>(m_grid->gridIndex())));
|
|
|
|
m_faultLabelLinePart->setDrawable(geo.p());
|
|
|
|
|
|
|
|
m_faultLabelLinePart->updateBoundingBox();
|
|
|
|
|
|
|
|
caf::MeshEffectGenerator gen(m_rimFault->faultColor());
|
|
|
|
cvf::ref<cvf::Effect> eff = gen.generateEffect();
|
2013-12-03 13:30:32 -06:00
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
m_faultLabelLinePart->setEffect(eff.p());
|
2013-12-03 13:30:32 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
2013-12-10 00:56:58 -06:00
|
|
|
cvf::Vec3f RivFaultPartMgr::findClosestVertex(const cvf::Vec3f& point, const cvf::Vec3fArray* vertices)
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
CVF_ASSERT(vertices);
|
|
|
|
|
|
|
|
if (!vertices) return cvf::Vec3f::UNDEFINED;
|
|
|
|
|
|
|
|
float closestDiff(HUGE_VAL);
|
2013-12-09 14:13:02 -06:00
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
size_t closestIndex = cvf::UNDEFINED_SIZE_T;
|
2013-12-09 14:13:02 -06:00
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
for (size_t i = 0; i < vertices->size(); i++)
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
float diff = point.pointDistance(vertices->get(i));
|
|
|
|
|
|
|
|
if (diff < closestDiff)
|
|
|
|
{
|
|
|
|
closestDiff = diff;
|
|
|
|
closestIndex = i;
|
|
|
|
}
|
2013-12-03 13:30:32 -06:00
|
|
|
}
|
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
if (closestIndex != cvf::UNDEFINED_SIZE_T)
|
|
|
|
{
|
|
|
|
return vertices->get(closestIndex);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return cvf::Vec3f::UNDEFINED;
|
|
|
|
}
|
2013-12-03 13:30:32 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
2013-12-10 00:56:58 -06:00
|
|
|
void RivFaultPartMgr::appendNativeFaultFacesToModel(cvf::ModelBasicList* model)
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
if (m_nativeFaultFaces.notNull())
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
model->addPart(m_nativeFaultFaces.p());
|
2013-12-03 13:30:32 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
2013-12-10 00:56:58 -06:00
|
|
|
void RivFaultPartMgr::appendOppositeFaultFacesToModel(cvf::ModelBasicList* model)
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
if (m_oppositeFaultFaces.notNull())
|
2013-12-03 13:30:32 -06:00
|
|
|
{
|
2013-12-10 00:56:58 -06:00
|
|
|
model->addPart(m_oppositeFaultFaces.p());
|
2013-12-03 13:30:32 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-10 00:56:58 -06:00
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RivFaultPartMgr::appendLabelPartsToModel(cvf::ModelBasicList* model)
|
|
|
|
{
|
|
|
|
if (m_faultLabelPart.notNull()) model->addPart(m_faultLabelPart.p());
|
|
|
|
if (m_faultLabelLinePart.notNull()) model->addPart(m_faultLabelLinePart.p());
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RivFaultPartMgr::appendMeshLinePartsToModel(cvf::ModelBasicList* model)
|
|
|
|
{
|
|
|
|
if (m_nativeFaultGridLines.notNull()) model->addPart(m_nativeFaultGridLines.p());
|
|
|
|
if (m_oppositeFaultGridLines.notNull()) model->addPart(m_oppositeFaultGridLines.p());
|
|
|
|
}
|
|
|
|
|
2013-12-14 02:45:25 -06:00
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RivFaultPartMgr::appendNNCFacesToModel(cvf::ModelBasicList* model)
|
|
|
|
{
|
|
|
|
if (m_NNCFaces.notNull()) model->addPart(m_NNCFaces.p());
|
|
|
|
}
|
|
|
|
|
2013-12-18 06:21:03 -06:00
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
2013-12-19 01:48:36 -06:00
|
|
|
caf::FaceCulling RivFaultPartMgr::faceCullingMode() const
|
|
|
|
{
|
2013-12-18 06:35:44 -06:00
|
|
|
bool isShowingGrid = m_rimFaultCollection->isGridVisualizationMode();
|
|
|
|
if (!isShowingGrid )
|
2013-12-18 02:21:35 -06:00
|
|
|
{
|
2014-01-02 08:24:07 -06:00
|
|
|
if (m_rimFaultCollection->faultResult() == RimFaultCollection::FAULT_BACK_FACE_CULLING)
|
2013-12-18 06:35:44 -06:00
|
|
|
{
|
2013-12-19 01:48:36 -06:00
|
|
|
if (m_grid->mainGrid()->faceNormalsIsOutwards())
|
|
|
|
{
|
|
|
|
return caf::FC_BACK;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return caf::FC_FRONT;
|
|
|
|
}
|
2013-12-18 06:35:44 -06:00
|
|
|
}
|
2014-01-02 08:24:07 -06:00
|
|
|
else if (m_rimFaultCollection->faultResult() == RimFaultCollection::FAULT_FRONT_FACE_CULLING)
|
2013-12-18 06:35:44 -06:00
|
|
|
{
|
2013-12-19 01:48:36 -06:00
|
|
|
if (m_grid->mainGrid()->faceNormalsIsOutwards())
|
|
|
|
{
|
|
|
|
return caf::FC_FRONT;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return caf::FC_BACK;
|
|
|
|
}
|
2013-12-18 06:35:44 -06:00
|
|
|
}
|
2014-01-03 01:38:09 -06:00
|
|
|
else
|
|
|
|
{
|
|
|
|
return caf::FC_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2014-01-08 03:47:41 -06:00
|
|
|
// Do not perform face culling in grid mode to make sure the displayed grid is watertight
|
|
|
|
return caf::FC_NONE;
|
2013-12-18 02:21:35 -06:00
|
|
|
}
|
2013-12-18 06:21:03 -06:00
|
|
|
}
|
2013-12-19 02:08:08 -06:00
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
///
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
void RivFaultPartMgr::updateNNCColors(RimResultSlot* cellResultSlot)
|
|
|
|
{
|
|
|
|
if (m_NNCFaces.isNull()) return;
|
|
|
|
|
|
|
|
if (cellResultSlot && cellResultSlot->resultVariable() == RimDefines::combinedTransmissibilityResultName())
|
|
|
|
{
|
|
|
|
const cvf::ScalarMapper* mapper = cellResultSlot->legendConfig()->scalarMapper();
|
|
|
|
|
|
|
|
m_NNCGenerator->textureCoordinates(m_NNCTextureCoords.p(), mapper);
|
|
|
|
|
|
|
|
cvf::ref<cvf::Effect> nncEffect;
|
|
|
|
|
|
|
|
if (m_rimFaultCollection->showFaultFaces || m_rimFaultCollection->showOppositeFaultFaces)
|
|
|
|
{
|
2014-01-22 06:17:05 -06:00
|
|
|
// Move NNC closer to camera to avoid z-fighting with grid surface
|
2013-12-19 02:08:08 -06:00
|
|
|
caf::ScalarMapperEffectGenerator nncEffgen(mapper, caf::PO_NEG_LARGE);
|
|
|
|
nncEffect = nncEffgen.generateEffect();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2014-01-22 06:17:05 -06:00
|
|
|
// If no grid is present, use same offset as grid geometry to be able to see mesh lines
|
|
|
|
caf::ScalarMapperEffectGenerator nncEffgen(mapper, caf::PO_1);
|
2013-12-19 02:08:08 -06:00
|
|
|
nncEffect = nncEffgen.generateEffect();
|
|
|
|
}
|
|
|
|
|
|
|
|
cvf::DrawableGeo* dg = dynamic_cast<cvf::DrawableGeo*>(m_NNCFaces->drawable());
|
|
|
|
if (dg) dg->setTextureCoordArray(m_NNCTextureCoords.p());
|
|
|
|
|
|
|
|
m_NNCFaces->setEffect(nncEffect.p());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// NNC faces a bit lighter than the fault for now
|
|
|
|
cvf::Color3f nncColor = m_defaultColor;
|
|
|
|
nncColor.r() += (1.0 - nncColor.r()) * 0.2;
|
|
|
|
nncColor.g() += (1.0 - nncColor.g()) * 0.2;
|
|
|
|
nncColor.g() += (1.0 - nncColor.b()) * 0.2;
|
|
|
|
|
|
|
|
cvf::ref<cvf::Effect> nncEffect;
|
|
|
|
|
|
|
|
if (m_rimFaultCollection->showFaultFaces || m_rimFaultCollection->showOppositeFaultFaces)
|
|
|
|
{
|
2014-01-22 06:17:05 -06:00
|
|
|
// Move NNC closer to camera to avoid z-fighting with grid surface
|
2013-12-19 02:08:08 -06:00
|
|
|
caf::SurfaceEffectGenerator nncEffgen(nncColor, caf::PO_NEG_LARGE);
|
|
|
|
nncEffect = nncEffgen.generateEffect();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2014-01-22 06:17:05 -06:00
|
|
|
// If no grid is present, use same offset as grid geometry to be able to see mesh lines
|
2013-12-19 02:08:08 -06:00
|
|
|
caf::SurfaceEffectGenerator nncEffgen(nncColor, caf::PO_1);
|
|
|
|
nncEffect = nncEffgen.generateEffect();
|
|
|
|
}
|
|
|
|
|
|
|
|
m_NNCFaces->setEffect(nncEffect.p());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|