///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) Statoil ASA // Copyright (C) Ceetron Solutions AS // Copyright (C) 2011-2012 Ceetron AS // // 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 // for more details. // ///////////////////////////////////////////////////////////////////////////////// #pragma once #include "cvfArray.h" #include "cvfColor3.h" #include "cvfPart.h" #include "cvfVector3.h" #include namespace cvf { class DrawableGeo; class ScalarMapper; } // namespace cvf class RivObjectSourceInfo; class RivPipeGeometryGenerator : public cvf::Object { public: RivPipeGeometryGenerator(); ~RivPipeGeometryGenerator() override; // Coordinates and orientations void setPipeCenterCoords( const cvf::Vec3dArray* coords ); cvf::cref pipeCenterCoords() const; // Appearance void setRadius( double radius ); void setCrossSectionVertexCount( size_t vertexCount ); cvf::ref createPipeSurface(); cvf::ref createCenterLine(); void pipeSurfaceTextureCoords( cvf::Vec2fArray* textureCoords, const std::vector& segmentResults, const cvf::ScalarMapper* mapper ) const; void centerlineTextureCoords( cvf::Vec2fArray* textureCoords, const std::vector& segmentResults, const cvf::ScalarMapper* mapper ) const; void setFirstVisibleSegmentIndex( size_t segmentIndex ); size_t segmentIndexFromTriangleIndex( size_t triangleIndex ) const; static void cylinderWithCenterLineParts( cvf::Collection* destinationParts, const std::vector& centerCoords, const cvf::Color3f& color, double radius ); static void tubeWithCenterLinePartsAndVariableWidth( cvf::Collection* destinationParts, const std::vector& centerCoords, const std::vector& radii, const cvf::Color3f& color ); private: void clearComputedData(); void updateFilteredPipeCenterCoords(); size_t findFirstSegmentWithLength( double squareDistanceTolerance ); static void computeCircle( double radius, size_t tesselationCount, const cvf::Vec3d& center, const cvf::Vec3d& orient1, const cvf::Vec3d& orient2, std::vector* nodes ); static cvf::ref generateLine( const cvf::Vec3dArray* coords ); static cvf::ref generateExtrudedCylinder( double radius, size_t crossSectionNodeCount, const cvf::Vec3dArray* cylinderCenterCoords ); static cvf::ref generateVariableRadiusTube( size_t crossSectionNodeCount, const cvf::Vec3dArray* cylinderCenterCoords, const std::vector& radii ); static void computeExtrudedCoordsAndNormals( cvf::Vec3d intersectionCoord, cvf::Vec3d intersectionPlaneNormal, cvf::Vec3d segmentDirection, size_t crossSectionNodeCount, std::vector* extrudedNodes, std::vector* crossSectionVertices, std::vector* cylinderSegmentNormals ); private: cvf::cref m_originalPipeCenterCoords; // Based on m_originalPipeCenterCoords, produce list of coords where coords at the same location is removed // When a bend is detected, extra bend coordinates are inserted std::vector m_filteredPipeCenterCoords; // Map from generated cylinder segments to pipe result indices std::vector m_filteredPipeSegmentToResult; size_t m_firstVisibleSegmentIndex; double m_radius; // Pipe bends with a opening angle below given angle is modified with extra bend coordinates double m_minimumBendAngle; // Scaling factor used to control how far from original pipe position the extra bend coordinates are located // This will affect how sharp or smooth bend will appear double m_bendScalingFactor; size_t m_crossSectionNodeCount; };