From 4b43fcf0a791a94250b47ebede760831546ab395 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 12 Mar 2026 17:31:56 +0100 Subject: [PATCH] Revert ContourMap texture-based rendering changes Reverts: - ContourMap: Smooth texture edges with weighted alpha blending (2dc7123d8) - ContourMap: Increase texture resolution with bilinear interpolation (2e1e99602) - ContourMap: Add texture-based rendering as default rendering mode (87ef7a01b) --- .../RivContourMapProjectionPartMgr.cpp | 221 ------------------ .../RivContourMapProjectionPartMgr.h | 14 -- .../ContourMap/RimContourMapProjection.cpp | 37 +-- .../ContourMap/RimContourMapProjection.h | 4 - .../ContourMap/RimEclipseContourMapView.cpp | 24 +- .../GeoMech/RimGeoMechContourMapView.cpp | 24 +- 6 files changed, 19 insertions(+), 305 deletions(-) diff --git a/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp index cee615e038..9a6661c5d9 100644 --- a/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp @@ -22,7 +22,6 @@ #include "RiaFontCache.h" #include "ContourMap/RigContourMapGrid.h" -#include "ContourMap/RigContourMapProjection.h" #include "ContourMap/RigContourPolygonsTools.h" #include "RivMeshLinesSourceInfo.h" @@ -40,19 +39,10 @@ #include "cvfPart.h" #include "cvfPrimitiveSetIndexedUInt.h" #include "cvfRay.h" -#include "cvfRenderStateBlending.h" -#include "cvfRenderStateTextureBindings.h" -#include "cvfSampler.h" #include "cvfScalarMapper.h" -#include "cvfShaderProgram.h" -#include "cvfShaderProgramGenerator.h" -#include "cvfShaderSourceProvider.h" -#include "cvfTexture.h" -#include "cvfTextureImage.h" #include "cvfViewport.h" #include "cvfqtUtils.h" -#include #include #include @@ -66,12 +56,6 @@ RivContourMapProjectionPartMgr::RivContourMapProjectionPartMgr( caf::PdmObject* m_pdmObject = pdmObject; m_labelEffect = new cvf::Effect; - - cvf::ShaderProgramGenerator gen( "Texturing", cvf::ShaderSourceProvider::instance() ); - gen.addVertexCode( cvf::ShaderSourceRepository::vs_Standard ); - gen.addFragmentCode( cvf::ShaderSourceRepository::src_Texture ); - gen.addFragmentCode( cvf::ShaderSourceRepository::fs_Unlit ); - m_textureShaderProg = gen.generate(); } //-------------------------------------------------------------------------------------------------- @@ -601,208 +585,3 @@ bool RivContourMapProjectionPartMgr::lineOverlapsWithPreviousContourLevel( const { return RigContourPolygonsTools::lineOverlapsWithContourPolygons( lineCenter, previousLevel, tolerance ); } - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RivContourMapProjectionPartMgr::appendProjectionAsTexturedQuad( cvf::ModelBasicList* model, - const caf::DisplayCoordTransform* displayCoordTransform, - cvf::ScalarMapper* scalarMapper, - const RigContourMapProjection& contourMapProjection, - const RigContourMapGrid& contourMapGrid ) -{ - auto expandedBB = contourMapGrid.expandedBoundingBox(); - - cvf::Vec3dArray domainCoords; - domainCoords.reserve( 4 ); - domainCoords.add( expandedBB.min() ); - domainCoords.add( cvf::Vec3d( expandedBB.max().x(), expandedBB.min().y(), expandedBB.min().z() ) ); - domainCoords.add( expandedBB.max() ); - domainCoords.add( cvf::Vec3d( expandedBB.min().x(), expandedBB.max().y(), expandedBB.min().z() ) ); - - double zValueForContourMap = contourMapGrid.origin3d().z(); - zValueForContourMap += 0.3 * zValueForContourMap; - - cvf::Vec3dArray displayCoords; - displayCoords.reserve( 4 ); - for ( int i = 0; i < 4; i++ ) - { - auto displayCoord = displayCoordTransform->transformToDisplayCoord( domainCoords[i] ); - displayCoord.z() = zValueForContourMap; - displayCoords.add( displayCoord ); - } - - auto textureImage = RivContourMapProjectionPartMgr::createTexture( &contourMapProjection, scalarMapper ); - - bool transparent = true; - auto part = createSingleTexturedQuadPart( displayCoords, textureImage, transparent ); - part->setSourceInfo( new RivObjectSourceInfo( m_pdmObject.p() ) ); - part->setPriority( RivPartPriority::BaseLevel ); - - model->addPart( part.p() ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -cvf::ref RivContourMapProjectionPartMgr::createXYPlaneQuadGeoWithTexCoords( const cvf::Vec3dArray& cornerPoints ) -{ - cvf::ref vertices = new cvf::Vec3fArray; - vertices->reserve( 4 ); - for ( const auto& v : cornerPoints ) - { - vertices->add( cvf::Vec3f( v ) ); - } - - cvf::ref texCoords = new cvf::Vec2fArray; - texCoords->reserve( 4 ); - texCoords->add( cvf::Vec2f( 0, 0 ) ); - texCoords->add( cvf::Vec2f( 1, 0 ) ); - texCoords->add( cvf::Vec2f( 1, 1 ) ); - texCoords->add( cvf::Vec2f( 0, 1 ) ); - - cvf::ref geo = new cvf::DrawableGeo; - geo->setVertexArray( vertices.p() ); - geo->setTextureCoordArray( texCoords.p() ); - - cvf::ref indices = new cvf::UIntArray; - indices->reserve( 6 ); - for ( uint i : { 0u, 1u, 2u, 0u, 2u, 3u } ) - { - indices->add( i ); - } - - cvf::ref primSet = new cvf::PrimitiveSetIndexedUInt( cvf::PT_TRIANGLES ); - primSet->setIndices( indices.p() ); - geo->addPrimitiveSet( primSet.p() ); - geo->computeNormals(); - - return geo; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -cvf::ref RivContourMapProjectionPartMgr::createSingleTexturedQuadPart( const cvf::Vec3dArray& cornerPoints, - cvf::ref image, - bool transparent ) -{ - cvf::ref part = new cvf::Part; - - cvf::ref geo = createXYPlaneQuadGeoWithTexCoords( cornerPoints ); - - cvf::ref texture = new cvf::Texture( image.p() ); - cvf::ref sampler = new cvf::Sampler; - sampler->setMinFilter( cvf::Sampler::LINEAR ); - sampler->setMagFilter( cvf::Sampler::NEAREST ); - sampler->setWrapModeS( cvf::Sampler::CLAMP_TO_EDGE ); - sampler->setWrapModeT( cvf::Sampler::CLAMP_TO_EDGE ); - - cvf::ref textureBindings = new cvf::RenderStateTextureBindings; - textureBindings->addBinding( texture.p(), sampler.p(), "u_texture2D" ); - - cvf::ref eff = new cvf::Effect; - eff->setRenderState( textureBindings.p() ); - eff->setShaderProgram( m_textureShaderProg.p() ); - - if ( transparent ) - { - part->setPriority( RivPartPriority::PartType::TransparentSeismic ); - cvf::ref blending = new cvf::RenderStateBlending; - blending->configureTransparencyBlending(); - eff->setRenderState( blending.p() ); - } - - part->setDrawable( geo.p() ); - part->updateBoundingBox(); - part->setEffect( eff.p() ); - - return part; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -cvf::TextureImage* RivContourMapProjectionPartMgr::createTexture( const RigContourMapProjection* contourMapProjection, - cvf::ScalarMapper* scalarMapper ) -{ - if ( !contourMapProjection || !scalarMapper ) return nullptr; - - auto vertexSizeIJ = contourMapProjection->numberOfVerticesIJ(); - int vertWidth = static_cast( vertexSizeIJ.x() ); - int vertHeight = static_cast( vertexSizeIJ.y() ); - - // Scale up the texture and bilinearly interpolate to reduce block artefacts. - constexpr int scale = 4; - int width = vertWidth * scale; - int height = vertHeight * scale; - - cvf::TextureImage* textureImage = new cvf::TextureImage(); - textureImage->allocate( width, height ); - - auto dataValues = contourMapProjection->aggregatedVertexResultsFiltered(); - - for ( int py = 0; py < height; ++py ) - { - for ( int px = 0; px < width; ++px ) - { - // Map pixel centre to fractional vertex-space coordinates. - double fx = ( px + 0.5 ) / scale - 0.5; - double fy = ( py + 0.5 ) / scale - 0.5; - - int x0 = static_cast( std::floor( fx ) ); - int y0 = static_cast( std::floor( fy ) ); - int x1 = x0 + 1; - int y1 = y0 + 1; - - double tx = fx - x0; - double ty = fy - y0; - - x0 = std::clamp( x0, 0, vertWidth - 1 ); - x1 = std::clamp( x1, 0, vertWidth - 1 ); - y0 = std::clamp( y0, 0, vertHeight - 1 ); - y1 = std::clamp( y1, 0, vertHeight - 1 ); - - double v00 = dataValues[contourMapProjection->vertexIndex( x0, y0 )]; - double v10 = dataValues[contourMapProjection->vertexIndex( x1, y0 )]; - double v01 = dataValues[contourMapProjection->vertexIndex( x0, y1 )]; - double v11 = dataValues[contourMapProjection->vertexIndex( x1, y1 )]; - - // Bilinear weights for each corner. - double w00 = ( 1.0 - tx ) * ( 1.0 - ty ); - double w10 = tx * ( 1.0 - ty ); - double w01 = ( 1.0 - tx ) * ty; - double w11 = tx * ty; - - // Accumulate only valid (non-infinity) corners. The sum of their weights - // becomes the alpha, giving a smooth anti-aliased edge. - double validWeight = 0.0; - double weightedValue = 0.0; - auto accumulate = [&]( double v, double w ) - { - if ( !std::isinf( v ) ) - { - validWeight += w; - weightedValue += v * w; - } - }; - accumulate( v00, w00 ); - accumulate( v10, w10 ); - accumulate( v01, w01 ); - accumulate( v11, w11 ); - - if ( validWeight < 1e-10 ) - { - textureImage->setPixel( px, py, cvf::Color4ub( 0, 0, 0, 0 ) ); - continue; - } - - double value = weightedValue / validWeight; - auto color = scalarMapper->mapToColor( value ); - int alpha = static_cast( validWeight * 255.0 + 0.5 ); - textureImage->setPixel( px, py, cvf::Color4ub( color, alpha ) ); - } - } - - return textureImage; -} diff --git a/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.h b/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.h index 5566810f57..e2b2dc0e07 100644 --- a/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.h +++ b/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.h @@ -32,7 +32,6 @@ #include "cvfVector4.h" class RigContourMapGrid; -class RigContourMapProjection; namespace cvf { @@ -41,7 +40,6 @@ class ScalarMapper; class Color3f; class ModelBasicList; class Part; -class TextureImage; } // namespace cvf class RivContourMapProjectionPartMgr : public cvf::Object @@ -72,12 +70,6 @@ public: const cvf::Vec2d& pickPoint, const RigContourMapGrid& contourMapGrid ) const; - void appendProjectionAsTexturedQuad( cvf::ModelBasicList* model, - const caf::DisplayCoordTransform* displayCoordTransform, - cvf::ScalarMapper* mapper, - const RigContourMapProjection& contourMapProjection, - const RigContourMapGrid& contourMapGrid ); - cvf::ref createTextureCoords( const std::vector& values, cvf::ScalarMapper* scalarMapper ) const; private: @@ -112,15 +104,9 @@ private: const RigContourPolygonsTools::ContourPolygons& previousLevel, double tolerance ); - cvf::ref createSingleTexturedQuadPart( const cvf::Vec3dArray& cornerPoints, cvf::ref image, bool transparent ); - static cvf::ref createXYPlaneQuadGeoWithTexCoords( const cvf::Vec3dArray& cornerPoints ); - static cvf::TextureImage* createTexture( const RigContourMapProjection* contourMapProjection, cvf::ScalarMapper* scalarMapper ); - private: caf::PdmPointer m_pdmObject; std::vector> m_labelBoundingBoxes; cvf::ref m_labelEffect; - - cvf::ref m_textureShaderProg; }; diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.cpp b/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.cpp index abc7c2aa0b..11df856670 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.cpp +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.cpp @@ -109,8 +109,6 @@ RimContourMapProjection::RimContourMapProjection() CAF_PDM_InitField( &m_showContourLines, "ContourLines", true, "Show Contour Lines" ); CAF_PDM_InitField( &m_showContourLabels, "ContourLabels", true, "Show Contour Labels" ); CAF_PDM_InitField( &m_smoothContourLines, "SmoothContourLines", true, "Smooth Contour Lines" ); - CAF_PDM_InitField( &m_showTextureImage, "ShowImage", true, "Show Texture Image" ); - CAF_PDM_InitField( &m_showTrianglesWithColor, "ShowTrianglesWithColor", false, "Show Triangles with Color" ); auto defaultValue = caf::AppEnum( RimIntersectionFilterEnum::INTERSECT_FILTER_NONE ); CAF_PDM_InitField( &m_valueFilterType, "ValueFilterType", defaultValue, "Value Filter" ); @@ -210,16 +208,13 @@ void RimContourMapProjection::generateGeometryIfNecessary() } } - if ( showTrianglesWithColor() ) - { - m_trianglesWithVertexValues = RigContourMapTrianglesGenerator::generateTrianglesWithVertexValues( *m_contourMapGrid, - *m_contourMapProjection, - m_contourPolygons, - contourLevels, - m_contourLevelCumulativeAreas, - discrete, - sampleSpacing() ); - } + m_trianglesWithVertexValues = RigContourMapTrianglesGenerator::generateTrianglesWithVertexValues( *m_contourMapGrid, + *m_contourMapProjection, + m_contourPolygons, + contourLevels, + m_contourLevelCumulativeAreas, + discrete, + sampleSpacing() ); } progress.setProgress( 100 ); } @@ -273,22 +268,6 @@ bool RimContourMapProjection::showContourLabels() const return m_showContourLabels(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimContourMapProjection::showImage() const -{ - return m_showTextureImage(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimContourMapProjection::showTrianglesWithColor() const -{ - return m_showTrianglesWithColor(); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -636,8 +615,6 @@ void RimContourMapProjection::defineUiOrdering( QString uiConfigName, caf::PdmUi legendConfig()->uiOrdering( "NumLevelsOnly", *mainGroup ); mainGroup->add( &m_resolution ); - mainGroup->add( &m_showTextureImage ); - mainGroup->add( &m_showTrianglesWithColor ); mainGroup->add( &m_showContourLines ); mainGroup->add( &m_showContourLabels ); m_showContourLabels.uiCapability()->setUiReadOnly( !m_showContourLines() ); diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.h b/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.h index b2258198ad..5a1aa7d5c5 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.h +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimContourMapProjection.h @@ -68,8 +68,6 @@ public: bool showContourLines() const; bool showContourLabels() const; - bool showImage() const; - bool showTrianglesWithColor() const; // k layer filter, only consider kLayers in the given set (0-based index) void useKLayers( std::set kLayers ); @@ -152,8 +150,6 @@ protected: caf::PdmField m_showContourLines; caf::PdmField m_showContourLabels; caf::PdmField m_smoothContourLines; - caf::PdmField m_showTextureImage; - caf::PdmField m_showTrianglesWithColor; caf::PdmField m_oilFloodingType; caf::PdmField m_gasFloodingType; diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimEclipseContourMapView.cpp b/ApplicationLibCode/ProjectDataModel/ContourMap/RimEclipseContourMapView.cpp index c6f6c8b497..1427da563a 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimEclipseContourMapView.cpp +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimEclipseContourMapView.cpp @@ -345,24 +345,12 @@ void RimEclipseContourMapView::appendContourMapProjectionToModel() cvf::ref transForm = displayCoordTransform(); - if ( m_contourMapProjection->showTrianglesWithColor() ) - { - m_contourMapProjectionPartMgr->appendProjectionToModel( contourMapProjectionModelBasicList.p(), - transForm.p(), - m_contourMapProjection->trianglesWithVertexValues(), - *m_contourMapProjection->mapGrid(), - backgroundColor(), - m_contourMapProjection->legendConfig()->scalarMapper() ); - } - - if ( m_contourMapProjection->showImage() ) - { - m_contourMapProjectionPartMgr->appendProjectionAsTexturedQuad( contourMapProjectionModelBasicList.p(), - transForm.p(), - m_contourMapProjection->legendConfig()->scalarMapper(), - *m_contourMapProjection->mapProjection(), - *m_contourMapProjection->mapGrid() ); - } + m_contourMapProjectionPartMgr->appendProjectionToModel( contourMapProjectionModelBasicList.p(), + transForm.p(), + m_contourMapProjection->trianglesWithVertexValues(), + *m_contourMapProjection->mapGrid(), + backgroundColor(), + m_contourMapProjection->legendConfig()->scalarMapper() ); contourMapProjectionModelBasicList->updateBoundingBoxesRecursive(); frameScene->addModel( contourMapProjectionModelBasicList.p() ); diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapView.cpp b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapView.cpp index 99722f2c9e..3c5a7a803a 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapView.cpp +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapView.cpp @@ -313,24 +313,12 @@ void RimGeoMechContourMapView::appendContourMapProjectionToModel() cvf::ref transForm = displayCoordTransform(); - if ( m_contourMapProjection->showTrianglesWithColor() ) - { - m_contourMapProjectionPartMgr->appendProjectionToModel( contourMapProjectionModelBasicList.p(), - transForm.p(), - m_contourMapProjection->trianglesWithVertexValues(), - *m_contourMapProjection->mapGrid(), - backgroundColor(), - m_contourMapProjection->legendConfig()->scalarMapper() ); - } - - if ( m_contourMapProjection->showImage() ) - { - m_contourMapProjectionPartMgr->appendProjectionAsTexturedQuad( contourMapProjectionModelBasicList.p(), - transForm.p(), - m_contourMapProjection->legendConfig()->scalarMapper(), - *m_contourMapProjection->mapProjection(), - *m_contourMapProjection->mapGrid() ); - } + m_contourMapProjectionPartMgr->appendProjectionToModel( contourMapProjectionModelBasicList.p(), + transForm.p(), + m_contourMapProjection->trianglesWithVertexValues(), + *m_contourMapProjection->mapGrid(), + backgroundColor(), + m_contourMapProjection->legendConfig()->scalarMapper() ); contourMapProjectionModelBasicList->updateBoundingBoxesRecursive(); frameScene->addModel( contourMapProjectionModelBasicList.p() );