//################################################################################################## // // Custom Visualization Core library // Copyright (C) 2011-2012 Ceetron AS // // This library 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. // // This library 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 "cvfObject.h" #include "cvfArray.h" #include "cvfStructGrid.h" #include "cvfCollection.h" namespace cvf { class DrawableGeo; class ScalarMapper; class StructGridScalarDataAccess; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- class CellRangeFilter { public: CellRangeFilter(); void addCellIncludeRange(size_t minI, size_t minJ, size_t minK, size_t maxI, size_t maxJ, size_t maxK); void addCellInclude(size_t i, size_t j, size_t k); void addCellExcludeRange(size_t minI, size_t minJ, size_t minK, size_t maxI, size_t maxJ, size_t maxK); bool isCellRejected(size_t i, size_t j, size_t k) const; enum CellStateType { INCLUDED, /// Cell is among the included cells NOT_INCLUDED, /// Cell is not among the included cells EXCLUDED /// Filter actively states that cell is to be hidden }; CellStateType cellState(size_t i, size_t j, size_t k) const; static CellStateType combine(CellStateType a, CellStateType b) ; private: class CellRange { public: CellRange() : m_min(cvf::Vec3st::ZERO), m_max(UNDEFINED_SIZE_T, UNDEFINED_SIZE_T, UNDEFINED_SIZE_T) { } CellRange(size_t minI, size_t minJ, size_t minK, size_t maxI, size_t maxJ, size_t maxK) : m_min(minI, minJ, minK), m_max(maxI, maxJ, maxK) { } bool isInRange(size_t i, size_t j, size_t k) const { cvf::Vec3st test(i, j, k); int idx; for (idx = 0; idx < 3; idx++) { if (test[idx] < m_min[idx] || m_max[idx] <= test[idx]) { return false; } } return true; } public: cvf::Vec3st m_min; cvf::Vec3st m_max; }; private: std::vector m_includeRanges; std::vector m_excludeRanges; }; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- class CellFaceVisibilityFilter { public: virtual bool isFaceVisible(size_t i, size_t j, size_t k, StructGridInterface::FaceType face, const UByteArray* cellVisibility) const = 0; }; //================================================================================================== // // // //================================================================================================== class StructGridGeometryGenerator : public Object { public: StructGridGeometryGenerator(const StructGridInterface* grid); ~StructGridGeometryGenerator(); // Setup methods void setCellVisibility(const UByteArray* cellVisibility); void addFaceVisibilityFilter(const CellFaceVisibilityFilter* cellVisibilityFilter); // Access, valid after generation is done const StructGridInterface* activeGrid() { return m_grid.p(); } void textureCoordinates(Vec2fArray* textureCoords, const StructGridScalarDataAccess* dataAccessObject, const ScalarMapper* mapper) const; // Mapping between cells and geometry ref > triangleToSourceGridCellMap() const; const std::vector& quadToGridCellIndices() const; const std::vector& quadToFace() const; // Generated geometry ref generateSurface(); ref createMeshDrawable(); ref createOutlineMeshDrawable(double creaseAngle); private: static ref lineIndicesFromQuadVertexArray(const Vec3fArray* vertexArray); bool isCellFaceVisible(size_t i, size_t j, size_t k, StructGridInterface::FaceType face) const; void computeArrays(); private: // Input cref m_grid; // The grid being processed std::vector m_cellVisibilityFilters; cref m_cellVisibility; // Created arrays cvf::ref m_vertices; // Mappings std::vector m_triangleIndexToGridCellIndex; std::vector m_quadsToGridCells; std::vector m_quadsToFace; }; }