From c370f308f59667b58e38644c0f58102b3c0f7408 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Mon, 29 May 2023 10:20:32 +0200 Subject: [PATCH 01/42] libigl.Cmake added --- cmake/GeneratorSpecific.cmake | 99 ++++++++++++++++++----------------- cmake/deps/libigl.cmake | 28 ++++++++++ 2 files changed, 78 insertions(+), 49 deletions(-) create mode 100644 cmake/deps/libigl.cmake diff --git a/cmake/GeneratorSpecific.cmake b/cmake/GeneratorSpecific.cmake index 8a3d31cfdc..e240607b07 100644 --- a/cmake/GeneratorSpecific.cmake +++ b/cmake/GeneratorSpecific.cmake @@ -8,52 +8,53 @@ #/implementation, ...) # #------------------------------------------------------------------------------ -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.dox) -add_custom_target(doxygen SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.md) -add_custom_target(markdown SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/cmake/*.cmake) -add_custom_target(cmake SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/cmake/*.cmake.in) -add_custom_target(cmake.in SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") - -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//base/*h) -add_custom_target(_base SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//math/*h) -add_custom_target(_math SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//kernel/*h) -add_custom_target(_kernel SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//topology/*h) -add_custom_target(_topology SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//geometry/*h) -add_custom_target(_geometry SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//io/*h) -add_custom_target(_io SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//images/*h) -add_custom_target(_images SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//shapes/*h) -add_custom_target(_shapes SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//arithmetic/*h) -add_custom_target(_arithmetic SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//graph/*h) -add_custom_target(_graph SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//helpers/*h) -add_custom_target(_helpers SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") -FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//dec/*h) -add_custom_target(_dec SOURCES ${DGTAL_MYHEADERS}) -set(DGTAL_MYHEADERS "") +if (BUILD_TESTING) + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.dox) + add_custom_target(doxygen SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.md) + add_custom_target(markdown SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/cmake/*.cmake) + add_custom_target(cmake SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/cmake/*.cmake.in) + add_custom_target(cmake.in SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//base/*h) + add_custom_target(_base SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//math/*h) + add_custom_target(_math SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//kernel/*h) + add_custom_target(_kernel SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//topology/*h) + add_custom_target(_topology SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//geometry/*h) + add_custom_target(_geometry SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//io/*h) + add_custom_target(_io SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//images/*h) + add_custom_target(_images SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//shapes/*h) + add_custom_target(_shapes SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//arithmetic/*h) + add_custom_target(_arithmetic SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//graph/*h) + add_custom_target(_graph SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//helpers/*h) + add_custom_target(_helpers SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") + FILE(GLOB_RECURSE DGTAL_MYHEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/DGtal//dec/*h) + add_custom_target(_dec SOURCES ${DGTAL_MYHEADERS}) + set(DGTAL_MYHEADERS "") +endif() \ No newline at end of file diff --git a/cmake/deps/libigl.cmake b/cmake/deps/libigl.cmake new file mode 100644 index 0000000000..1fc19541b5 --- /dev/null +++ b/cmake/deps/libigl.cmake @@ -0,0 +1,28 @@ +# +# Copyright 2019 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. +# +if(TARGET igl::core) + return() +endif() + +message(STATUS "Third-party (external): creating target 'igl::core'") + +include(eigen) +option(LIBIGL_INSTALL "Enable installation of libigl targets" ON) + +include(CPM) +CPMAddPackage( + NAME libigl + GITHUB_REPOSITORY libigl/libigl + GIT_TAG 3ea7f9480967fcf6bf02ce9b993c0ea6d2fc45f6 +) + +set_target_properties(igl_core PROPERTIES FOLDER third_party/libigl) From 13f43aa6b26ebb00eb3f06a93932b8bb05148036 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Wed, 14 Jun 2023 21:00:43 +0200 Subject: [PATCH 02/42] LibIGL Test file --- cmake/CheckDGtalOptionalDependencies.cmake | 21 ++++++++ tests/shapes/CMakeLists.txt | 7 +++ tests/shapes/testlibigl.cpp | 58 ++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 tests/shapes/testlibigl.cpp diff --git a/cmake/CheckDGtalOptionalDependencies.cmake b/cmake/CheckDGtalOptionalDependencies.cmake index fb7569cb35..160f8a5ba4 100644 --- a/cmake/CheckDGtalOptionalDependencies.cmake +++ b/cmake/CheckDGtalOptionalDependencies.cmake @@ -21,6 +21,7 @@ option(WITH_HDF5 "With HDF5." OFF) option(WITH_QGLVIEWER "With LibQGLViewer for 3D visualization (Qt5 required)." OFF) option(WITH_PATATE "With Patate library for geometry processing (Eigen required)." OFF) option(WITH_FFTW3 "With FFTW3 discrete Fourier Transform library." OFF) +option(WITH_LIBIGL "With libIGL." OFF) #---------------------------------- # Removing -frounding-math compile flag for clang @@ -96,6 +97,14 @@ else (WITH_FFTW3) message(STATUS " WITH_FFTW3 false (FFTW3 discrete Fourier transform library)") endif() + +if (WITH_LIBIGL) + set(LIST_OPTION ${LIST_OPTION} [FFTW3]\ ) + message(STATUS " WITH_LIBIGL true (libIGL)") +else (WITH_LIBIGL) + message(STATUS " WITH_LIBIGL false (libIGL)") +endif() + message(STATUS "") message(STATUS "Checking the dependencies: ") @@ -406,4 +415,16 @@ if(WITH_FFTW3) endif() +# ----------------------------------------------------------------------------- +# Look for libigl. +# (They are not compulsory). +# ----------------------------------------------------------------------------- +if(WITH_LIBIGL) + + include(cmake/deps/libigl.cmake) + set(DGtalLibDependencies ${DGtalLibDependencies} igl::core) + +endif() + + message(STATUS "-------------------------------------------------------------------------------") diff --git a/tests/shapes/CMakeLists.txt b/tests/shapes/CMakeLists.txt index b8259b465e..28ac925cb0 100644 --- a/tests/shapes/CMakeLists.txt +++ b/tests/shapes/CMakeLists.txt @@ -35,6 +35,13 @@ set(DGTAL_TESTS_SRC testLemniscate2D ) + +if (WITH_LIBIGL) + set(DGTAL_TESTS_SRC ${DGTAL_TESTS_SRC} + testlibigl +) +endif() + foreach(FILE ${DGTAL_TESTS_SRC}) DGtal_add_test(${FILE}) endforeach() diff --git a/tests/shapes/testlibigl.cpp b/tests/shapes/testlibigl.cpp new file mode 100644 index 0000000000..cf4267323a --- /dev/null +++ b/tests/shapes/testlibigl.cpp @@ -0,0 +1,58 @@ +/** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + **/ + +/** + * @file testlibigl.cpp + * @ingroup Tests + * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr ) + * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France + * + * @date 2023/06/14 + * + * Functions for testing class PolygonalCalculus. + * + * This file is part of the DGtal library. + */ + +/////////////////////////////////////////////////////////////////////////////// +#include +#include "DGtal/base/Common.h" +#include "ConfigTest.h" +#include "DGtalCatch.h" +#include "DGtal/helpers/StdDefs.h" + + +/////////////////////////////////////////////////////////////////////////////// + +using namespace std; +using namespace DGtal; +using namespace Z3i; + +/////////////////////////////////////////////////////////////////////////////// +// Functions for testing class PolygonalCalculus. +/////////////////////////////////////////////////////////////////////////////// + +TEST_CASE( "Testing LibIGL" ) +{ + + SECTION("Simple test") + { + + REQUIRE( 1== 1); + } +}; + +/** @ingroup Tests **/ From e873fb35719e6db0dce15193dc42dce26230c3e6 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Thu, 15 Jun 2023 09:09:04 +0200 Subject: [PATCH 03/42] Unit test for libigl deps --- tests/shapes/testlibigl.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/shapes/testlibigl.cpp b/tests/shapes/testlibigl.cpp index cf4267323a..9d72196171 100644 --- a/tests/shapes/testlibigl.cpp +++ b/tests/shapes/testlibigl.cpp @@ -34,6 +34,7 @@ #include "DGtalCatch.h" #include "DGtal/helpers/StdDefs.h" +#include /////////////////////////////////////////////////////////////////////////////// @@ -47,11 +48,14 @@ using namespace Z3i; TEST_CASE( "Testing LibIGL" ) { + Eigen::MatrixXd V; + Eigen::MatrixXi F; - SECTION("Simple test") + SECTION("Simple test with OBJ IO") { - - REQUIRE( 1== 1); + igl::readOBJ(testPath + "samples/testObj.obj", V, F); + REQUIRE( V.rows() == 10); + REQUIRE( F.rows() == 6); } }; From 7ac7f0f1b2dc4a34860066b37cbf7a64e5865a51 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Thu, 15 Jun 2023 10:20:17 +0200 Subject: [PATCH 04/42] files --- src/DGtal/shapes/WindingNumbersShape.h | 98 ++++++++++++++++++++++++ tests/shapes/CMakeLists.txt | 1 + tests/shapes/testWindingNumbersShape.cpp | 61 +++++++++++++++ tests/shapes/testlibigl.cpp | 1 - 4 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 src/DGtal/shapes/WindingNumbersShape.h create mode 100644 tests/shapes/testWindingNumbersShape.cpp diff --git a/src/DGtal/shapes/WindingNumbersShape.h b/src/DGtal/shapes/WindingNumbersShape.h new file mode 100644 index 0000000000..cb70cf0005 --- /dev/null +++ b/src/DGtal/shapes/WindingNumbersShape.h @@ -0,0 +1,98 @@ +/** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + **/ + +#pragma once + +/** + * @file WindingNumbersShape.h + * @brief CEuclideanOrientedShape model using libIGL Winding numbers + * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr ) + * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France + * + * @date 2023/06/14 + + * + * This file is part of the DGtal library. + */ + +#if !defined WindingNumbersShape_h +/** Prevents repeated inclusion of headers. */ +#define WindingNumbersShape_h + +#include +#include +#include +#include +#include +namespace DGtal +{ + + ///////////////////////////////////////////////////////////////////////////// + /** + Description of template class 'WindingNumbersShape' + + \brief Aim: + + @see + + @tparam TDimension dimension of the intersection target + */ + template + struct WindingNumbersShape + { + + ///Types + using Space = TSpace; + using RealPoint = typename Space::RealPoint; + using RealVector = typename Space::RealVector; + using Orientation = DGtal::Orientation; + + //Removing Default constructor + WindingNumbersShape() = delete; + + WindingNumbersShape(Eigen::MatrixXd &points, Eigen::MatrixXd &normals) + { + // Build octree + std::vector > O_PI; + Eigen::MatrixXi O_CH; + Eigen::MatrixXd O_CN; + Eigen::VectorXd O_W; + igl::octree(P,O_PI,O_CH,O_CN,O_W); + Eigen::VectorXd A; + { + Eigen::MatrixXi I; + igl::knn(points,20,O_PI,O_CH,O_CN,O_W,I); + // CGAL is only used to help get point areas + igl::copyleft::cgal::point_areas(points,I,N,A); + } + } + + + /// Orientation of a point using the winding number value from + /// an oriented pointcloud. + /// + /// @param aPoint [in] a point in space + /// @return a DGtal::Orientation value + Orientation orientation(const RealPoint aPoint) const + { + return DGtal::OUTSIDE; + } + + + }; +} + +#endif // !defined WindingNumbersShape_h diff --git a/tests/shapes/CMakeLists.txt b/tests/shapes/CMakeLists.txt index 28ac925cb0..a6f781216e 100644 --- a/tests/shapes/CMakeLists.txt +++ b/tests/shapes/CMakeLists.txt @@ -39,6 +39,7 @@ set(DGTAL_TESTS_SRC if (WITH_LIBIGL) set(DGTAL_TESTS_SRC ${DGTAL_TESTS_SRC} testlibigl + testWindingNumbersShape ) endif() diff --git a/tests/shapes/testWindingNumbersShape.cpp b/tests/shapes/testWindingNumbersShape.cpp new file mode 100644 index 0000000000..24c582323c --- /dev/null +++ b/tests/shapes/testWindingNumbersShape.cpp @@ -0,0 +1,61 @@ +/** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + **/ + +/** + * @file testlibigl.cpp + * @ingroup Tests + * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr ) + * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France + * + * @date 2023/06/14 + * + * Functions for testing class PolygonalCalculus. + * + * This file is part of the DGtal library. + */ + +/////////////////////////////////////////////////////////////////////////////// +#include +#include "DGtal/base/Common.h" +#include "ConfigTest.h" +#include "DGtalCatch.h" +#include "DGtal/helpers/StdDefs.h" + +#include + +/////////////////////////////////////////////////////////////////////////////// + +using namespace std; +using namespace DGtal; +using namespace Z3i; + +/////////////////////////////////////////////////////////////////////////////// +// Functions for testing class PolygonalCalculus. +/////////////////////////////////////////////////////////////////////////////// + +TEST_CASE( "Testing WindingNumbersShape" ) +{ + using WNShape = WindingNumbersShape; + SECTION("Checking concept") + { + BOOST_CONCEPT_ASSERT( (DGtal::concepts::CEuclideanOrientedShape) ); + } + + + +}; + +/** @ingroup Tests **/ diff --git a/tests/shapes/testlibigl.cpp b/tests/shapes/testlibigl.cpp index 9d72196171..78238542c5 100644 --- a/tests/shapes/testlibigl.cpp +++ b/tests/shapes/testlibigl.cpp @@ -35,7 +35,6 @@ #include "DGtal/helpers/StdDefs.h" #include - /////////////////////////////////////////////////////////////////////////////// using namespace std; From f64625806d863f2f5bc4e67f3f826d18fea6c6bc Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Thu, 15 Jun 2023 08:58:26 +0000 Subject: [PATCH 05/42] Fixing libIGL + cgal + DGtal deps --- cmake/CheckDGtalOptionalDependencies.cmake | 8 ++++++-- cmake/deps/libigl.cmake | 1 + src/DGtal/shapes/WindingNumbersShape.h | 1 + tests/shapes/CMakeLists.txt | 7 +++++-- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/cmake/CheckDGtalOptionalDependencies.cmake b/cmake/CheckDGtalOptionalDependencies.cmake index 160f8a5ba4..e4464bd860 100644 --- a/cmake/CheckDGtalOptionalDependencies.cmake +++ b/cmake/CheckDGtalOptionalDependencies.cmake @@ -21,7 +21,7 @@ option(WITH_HDF5 "With HDF5." OFF) option(WITH_QGLVIEWER "With LibQGLViewer for 3D visualization (Qt5 required)." OFF) option(WITH_PATATE "With Patate library for geometry processing (Eigen required)." OFF) option(WITH_FFTW3 "With FFTW3 discrete Fourier Transform library." OFF) -option(WITH_LIBIGL "With libIGL." OFF) +option(WITH_LIBIGL "With libIGL (with copyleft/CGAL included)." OFF) #---------------------------------- # Removing -frounding-math compile flag for clang @@ -421,9 +421,13 @@ endif() # ----------------------------------------------------------------------------- if(WITH_LIBIGL) + if (WITH_CGAL) + message(STATUS "DGtal/CGAL enabled.") + else() + message(FATAL_ERROR "LIBIGL requires CGAL. Please if the `WITH_CGAL=true` cmake flag.") + endif() include(cmake/deps/libigl.cmake) set(DGtalLibDependencies ${DGtalLibDependencies} igl::core) - endif() diff --git a/cmake/deps/libigl.cmake b/cmake/deps/libigl.cmake index 1fc19541b5..494a70d0b6 100644 --- a/cmake/deps/libigl.cmake +++ b/cmake/deps/libigl.cmake @@ -23,6 +23,7 @@ CPMAddPackage( NAME libigl GITHUB_REPOSITORY libigl/libigl GIT_TAG 3ea7f9480967fcf6bf02ce9b993c0ea6d2fc45f6 + OPTIONS LIBIGL_WITH_CGAL ) set_target_properties(igl_core PROPERTIES FOLDER third_party/libigl) diff --git a/src/DGtal/shapes/WindingNumbersShape.h b/src/DGtal/shapes/WindingNumbersShape.h index cb70cf0005..af5c18d7d4 100644 --- a/src/DGtal/shapes/WindingNumbersShape.h +++ b/src/DGtal/shapes/WindingNumbersShape.h @@ -37,6 +37,7 @@ #include #include #include +#include namespace DGtal { diff --git a/tests/shapes/CMakeLists.txt b/tests/shapes/CMakeLists.txt index a6f781216e..8db169eadd 100644 --- a/tests/shapes/CMakeLists.txt +++ b/tests/shapes/CMakeLists.txt @@ -37,10 +37,13 @@ set(DGTAL_TESTS_SRC if (WITH_LIBIGL) - set(DGTAL_TESTS_SRC ${DGTAL_TESTS_SRC} + set(DGTAL_TESTS_SRC_LIBIGL testlibigl testWindingNumbersShape -) + ) + foreach(test_file ${DGTAL_TESTS_SRC_LIBIGL}) + DGtal_add_test(${test_file}) + endforeach() endif() foreach(FILE ${DGTAL_TESTS_SRC}) From 13a00c925d4f540c5bba744e291ea84bf429ddc5 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Thu, 15 Jun 2023 10:07:30 +0000 Subject: [PATCH 06/42] Adding test --- src/DGtal/shapes/WindingNumbersShape.h | 60 +++++++++++++++++++----- tests/shapes/testWindingNumbersShape.cpp | 21 ++++++++- 2 files changed, 68 insertions(+), 13 deletions(-) diff --git a/src/DGtal/shapes/WindingNumbersShape.h b/src/DGtal/shapes/WindingNumbersShape.h index af5c18d7d4..0d3e062102 100644 --- a/src/DGtal/shapes/WindingNumbersShape.h +++ b/src/DGtal/shapes/WindingNumbersShape.h @@ -64,20 +64,17 @@ namespace DGtal //Removing Default constructor WindingNumbersShape() = delete; - WindingNumbersShape(Eigen::MatrixXd &points, Eigen::MatrixXd &normals) + WindingNumbersShape(const Eigen::MatrixXd &points, const Eigen::MatrixXd &normals) { - // Build octree - std::vector > O_PI; - Eigen::MatrixXi O_CH; - Eigen::MatrixXd O_CN; - Eigen::VectorXd O_W; - igl::octree(P,O_PI,O_CH,O_CN,O_W); - Eigen::VectorXd A; + myPoints = points; + myNormals = normals; + // Build octree, from libIGL tutorials + igl::octree(myPoints,myO_PI,myO_CH,myO_CN,myO_W); { Eigen::MatrixXi I; - igl::knn(points,20,O_PI,O_CH,O_CN,O_W,I); + igl::knn(myPoints,20,myO_PI,myO_CH,myO_CN,myO_W,I); // CGAL is only used to help get point areas - igl::copyleft::cgal::point_areas(points,I,N,A); + igl::copyleft::cgal::point_areas(myPoints,I,myNormals,myPointAreas); } } @@ -87,11 +84,50 @@ namespace DGtal /// /// @param aPoint [in] a point in space /// @return a DGtal::Orientation value - Orientation orientation(const RealPoint aPoint) const + Orientation orientation(const RealPoint aPoint, const double threshold = 0.5) const { - return DGtal::OUTSIDE; + Eigen::MatrixXd queries(3,1); + queries << aPoint(0) , aPoint(1) , aPoint(2); + auto singlePoint = orientationBatch(queries, threshold); + return singlePoint[0]; } + /// + std::vector orientationBatch(const Eigen::MatrixXd & queries, + const double threshold = 0.5) const + { + Eigen::VectorXd W; + std::vector results( queries.rows() ); + Eigen::MatrixXd O_CM; + Eigen::VectorXd O_R; + Eigen::MatrixXd O_EC; + igl::fast_winding_number(myPoints,myNormals,myPointAreas,myO_PI,myO_CH,2,O_CM,O_R,O_EC); + igl::fast_winding_number(myPoints,myNormals,myPointAreas,myO_PI,myO_CH,O_CM,O_R,O_EC,queries,2,W); + + //Reformating the output + for(auto i=0u; i < queries.rows(); ++i) + if (queries(i) < threshold ) + results[i] = DGtal::OUTSIDE; + else + if (queries(i) > threshold) + results[i] = DGtal::INSIDE; + else + results[i] = DGtal::ON; + return results; + } + + ///Copy of the points + Eigen::MatrixXd myPoints; + ///Copy of the normals + Eigen::MatrixXd myNormals; + + //libIGL octree for fast queries + std::vector > myO_PI; + Eigen::MatrixXi myO_CH; + Eigen::MatrixXd myO_CN; + Eigen::VectorXd myO_W; + Eigen::VectorXd myPointAreas; + }; } diff --git a/tests/shapes/testWindingNumbersShape.cpp b/tests/shapes/testWindingNumbersShape.cpp index 24c582323c..06a9300dfb 100644 --- a/tests/shapes/testWindingNumbersShape.cpp +++ b/tests/shapes/testWindingNumbersShape.cpp @@ -49,12 +49,31 @@ using namespace Z3i; TEST_CASE( "Testing WindingNumbersShape" ) { using WNShape = WindingNumbersShape; + SECTION("Checking concept") { BOOST_CONCEPT_ASSERT( (DGtal::concepts::CEuclideanOrientedShape) ); } - + SECTION("Simple testof the API") + { + Eigen::MatrixXd points(4,3); + points << 0,0,0, + 1,1,0, + 0,1,0, + 1,1,1; + Eigen::MatrixXd normals(4,3); + normals << 0,0,-1, + 0,0,-1, + 0,0,-1, + 0,0,1; + + WNShape wnshape(points,normals); + + RealPoint p(1.0,1.0,1.0); + DGtal::Orientation ori = wnshape.orientation(p); + std::cout< Date: Tue, 25 Jul 2023 15:33:21 +0200 Subject: [PATCH 07/42] winding test --- examples/polyscope-examples/CMakeLists.txt | 1 + src/DGtal/shapes/WindingNumbersShape.h | 39 ++++++++++++++-------- tests/shapes/testWindingNumbersShape.cpp | 15 +++++++-- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/examples/polyscope-examples/CMakeLists.txt b/examples/polyscope-examples/CMakeLists.txt index 64020d5ed8..0eb44c4c62 100644 --- a/examples/polyscope-examples/CMakeLists.txt +++ b/examples/polyscope-examples/CMakeLists.txt @@ -39,6 +39,7 @@ set(POLYSCOPE_SRCS exampleBunnyHead tangency-explorer tangency-reconstruction + windingNumbersShape ) if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") diff --git a/src/DGtal/shapes/WindingNumbersShape.h b/src/DGtal/shapes/WindingNumbersShape.h index 0d3e062102..c10265ac03 100644 --- a/src/DGtal/shapes/WindingNumbersShape.h +++ b/src/DGtal/shapes/WindingNumbersShape.h @@ -32,6 +32,8 @@ /** Prevents repeated inclusion of headers. */ #define WindingNumbersShape_h +#include +#include #include #include #include @@ -67,26 +69,36 @@ namespace DGtal WindingNumbersShape(const Eigen::MatrixXd &points, const Eigen::MatrixXd &normals) { myPoints = points; - myNormals = normals; + myNormals = normals; + myPointAreas =Eigen::VectorXd::Ones(myPoints.rows()); // Build octree, from libIGL tutorials igl::octree(myPoints,myO_PI,myO_CH,myO_CN,myO_W); - { + /*{ Eigen::MatrixXi I; - igl::knn(myPoints,20,myO_PI,myO_CH,myO_CN,myO_W,I); + igl::knn(myPoints,std::min(20, (int)points.rows()),myO_PI,myO_CH,myO_CN,myO_W,I); // CGAL is only used to help get point areas igl::copyleft::cgal::point_areas(myPoints,I,myNormals,myPointAreas); - } + }*/ } + WindingNumbersShape(const Eigen::MatrixXd &points, + const Eigen::MatrixXd &normals, + const Eigen::MatrixXd &areas) + { + myPoints = points; + myNormals = normals; + myPointAreas = areas; + igl::octree(myPoints,myO_PI,myO_CH,myO_CN,myO_W); + } /// Orientation of a point using the winding number value from /// an oriented pointcloud. /// /// @param aPoint [in] a point in space /// @return a DGtal::Orientation value - Orientation orientation(const RealPoint aPoint, const double threshold = 0.5) const + Orientation orientation(const RealPoint aPoint, const double threshold = 0.3) const { - Eigen::MatrixXd queries(3,1); + Eigen::MatrixXd queries(1,3); queries << aPoint(0) , aPoint(1) , aPoint(2); auto singlePoint = orientationBatch(queries, threshold); return singlePoint[0]; @@ -94,7 +106,7 @@ namespace DGtal /// std::vector orientationBatch(const Eigen::MatrixXd & queries, - const double threshold = 0.5) const + const double threshold = 0.3) const { Eigen::VectorXd W; std::vector results( queries.rows() ); @@ -106,13 +118,15 @@ namespace DGtal //Reformating the output for(auto i=0u; i < queries.rows(); ++i) - if (queries(i) < threshold ) + { + if (std::abs(W(i)) < threshold ) results[i] = DGtal::OUTSIDE; else - if (queries(i) > threshold) - results[i] = DGtal::INSIDE; - else - results[i] = DGtal::ON; + if (std::abs(W(i)) > threshold) + results[i] = DGtal::INSIDE; + else + results[i] = DGtal::ON; + } return results; } @@ -128,7 +142,6 @@ namespace DGtal Eigen::VectorXd myO_W; Eigen::VectorXd myPointAreas; - }; } diff --git a/tests/shapes/testWindingNumbersShape.cpp b/tests/shapes/testWindingNumbersShape.cpp index 06a9300dfb..cda89acf0b 100644 --- a/tests/shapes/testWindingNumbersShape.cpp +++ b/tests/shapes/testWindingNumbersShape.cpp @@ -59,8 +59,8 @@ TEST_CASE( "Testing WindingNumbersShape" ) { Eigen::MatrixXd points(4,3); points << 0,0,0, - 1,1,0, 0,1,0, + 1,0,0, 1,1,1; Eigen::MatrixXd normals(4,3); normals << 0,0,-1, @@ -70,9 +70,18 @@ TEST_CASE( "Testing WindingNumbersShape" ) WNShape wnshape(points,normals); - RealPoint p(1.0,1.0,1.0); + RealPoint p(-2.0,-2.0,-2.0); DGtal::Orientation ori = wnshape.orientation(p); - std::cout< Date: Wed, 25 Oct 2023 17:12:09 +0200 Subject: [PATCH 08/42] Cleaning up the cmake script. Adding the polyscope example file for winding numbers. --- .../windingNumbersShape.cpp | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 examples/polyscope-examples/windingNumbersShape.cpp diff --git a/examples/polyscope-examples/windingNumbersShape.cpp b/examples/polyscope-examples/windingNumbersShape.cpp new file mode 100644 index 0000000000..5c1ddeb7b9 --- /dev/null +++ b/examples/polyscope-examples/windingNumbersShape.cpp @@ -0,0 +1,132 @@ +/** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +/** + * @file + * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr ) + * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France + * + * @date 2023/06/15 + * + * This file is part of the DGtal library. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "ConfigExamples.h" + +using namespace DGtal; +using namespace Z3i; + +// Using standard 3D digital space. +typedef Shortcuts SH3; +typedef ShortcutsGeometry SHG3; +// The following typedefs are useful +typedef SurfaceMesh< RealPoint, RealVector > SurfMesh; + + +void myCallback() +{ + +} + +int main() +{ + auto params = SH3::defaultParameters() | SHG3::defaultParameters() | SHG3::parametersGeometryEstimation(); + params("surfaceComponents", "All")( "gridstep", 1. )("r-radius" , 2.0); + + std::string filename = examplesPath + std::string("/samples/bunny-32.vol"); + auto binary_image = SH3::makeBinaryImage(filename, params ); + auto K = SH3::getKSpace( binary_image, params ); + auto surface = SH3::makeDigitalSurface( binary_image, K, params ); + SH3::Cell2Index c2i; + auto primalSurface = SH3::makePrimalSurfaceMesh(surface); + auto surfels = SH3::getSurfelRange( surface, params); + auto embedder = SH3::getSCellEmbedder( K ); + + + //Need to convert the faces + std::vector> faces; + std::vector positions; + + for(auto face= 0 ; face < primalSurface->nbFaces(); ++face) + faces.push_back(primalSurface->incidentVertices( face )); + + //Recasting to vector of vertices + positions = primalSurface->positions(); + + auto surfmesh = SurfMesh(positions.begin(), + positions.end(), + faces.begin(), + faces.end()); + + // Initialize polyscope + polyscope::init(); + + auto iinormals = SHG3::getIINormalVectors(binary_image, surfels, params); + auto psMesh = polyscope::registerSurfaceMesh("digital surface", positions, faces); + psMesh->addFaceVectorQuantity("normals", iinormals); + + // + Eigen::MatrixXd points(surfels.size(),3); + Eigen::MatrixXd normals(surfels.size(),3); + + for(auto i=0; i< surfels.size(); ++i) + { + auto p = embedder(surfels[i]); + auto n = iinormals[i]; + points(i,0) = p(0); + points(i,1) = p(1); + points(i,2) = p(2); + normals(i,0) = n(0); + normals(i,1) = n(1); + normals(i,2) = n(2); + + } + auto pc= polyscope::registerPointCloud("Points", points); + pc->addVectorQuantity("normals", normals); + WindingNumbersShape wnshape(points,normals); + + trace.info() << binary_image->domain() << std::endl; + double step = 0.5; + auto width=33+2; + Eigen::MatrixXd queries(width*width*width,3); + auto cpt=0; + for(auto z=-2; z < 33; ++z) + for(auto y=-2; y < 33; ++y) + for(auto x=-2; x < 33; ++x) + { + Eigen::RowVector3 p(x,y,z); + queries.row(cpt) = p; + ++cpt; + } + + auto orientations = wnshape.orientationBatch(queries); + polyscope::registerPointCloud("probes",queries)->addScalarQuantity("orientati on",orientations); + + // Set the callback function + polyscope::state::userCallback = myCallback; + polyscope::show(); + return EXIT_SUCCESS; +} From 63ce11388c6c29a370992632e87453fc75c4dee8 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Wed, 25 Oct 2023 17:13:34 +0200 Subject: [PATCH 09/42] Cleaning up --- ChangeLog.md | 5 +++++ cmake/CheckDGtalOptionalDependencies.cmake | 15 +++++---------- src/DGtal/shapes/WindingNumbersShape.h | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 039eb86f23..c8b973a196 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -11,6 +11,9 @@ - Faster build using CPM for dependency download and ccache with the cmake `USE_CCACHE=YES`option (ccache must be installed). (David Coeurjolly, [#1696](https://github.com/DGtal-team/DGtal/pull/1696)) +- *Geometry* + - New implicit shape from point cloud using LibIGL Winding Numbers. (David Coeurjolly, + [#1697](https://github.com/DGtal-team/DGtal/pull/1697)) ## Changes - *General* @@ -58,6 +61,8 @@ [#1691](https://github.com/DGtal-team/DGtal/pull/1691)) - Cleanup of cmake targets when BUILD_TESTING is disabled (David Coeurjolly [#1698](https://github.com/DGtal-team/DGtal/pull/1698)) + - Cleanup of the cmake script for dependency discovery (David Coeurjolly, + [#1697](https://github.com/DGtal-team/DGtal/pull/1697)) - *Topology package* - Fix KhalimskySpaceND to get it work with BigInteger (Tristan Roussillon, diff --git a/cmake/CheckDGtalOptionalDependencies.cmake b/cmake/CheckDGtalOptionalDependencies.cmake index e4464bd860..ec71696294 100644 --- a/cmake/CheckDGtalOptionalDependencies.cmake +++ b/cmake/CheckDGtalOptionalDependencies.cmake @@ -19,7 +19,7 @@ option(WITH_ITK "With Insight Toolkit ITK." OFF) option(WITH_CAIRO "With CairoGraphics." OFF) option(WITH_HDF5 "With HDF5." OFF) option(WITH_QGLVIEWER "With LibQGLViewer for 3D visualization (Qt5 required)." OFF) -option(WITH_PATATE "With Patate library for geometry processing (Eigen required)." OFF) +option(WITH_PATATE "With Patate library for geometry processing." OFF) option(WITH_FFTW3 "With FFTW3 discrete Fourier Transform library." OFF) option(WITH_LIBIGL "With libIGL (with copyleft/CGAL included)." OFF) @@ -100,9 +100,9 @@ endif() if (WITH_LIBIGL) set(LIST_OPTION ${LIST_OPTION} [FFTW3]\ ) - message(STATUS " WITH_LIBIGL true (libIGL)") + message(STATUS " WITH_LIBIGL true (libIGL)") else (WITH_LIBIGL) - message(STATUS " WITH_LIBIGL false (libIGL)") + message(STATUS " WITH_LIBIGL false (libIGL)") endif() message(STATUS "") @@ -336,10 +336,10 @@ endif() # ----------------------------------------------------------------------------- set(CGAL_FOUND_DGTAL 0) if(WITH_CGAL) - if(WITH_GMP AND WITH_EIGEN) + if(WITH_GMP) message(STATUS "GMP and Eigen3 detected for CGAL.") else() - message(FATAL_ERROR "CGAL needs GMP and Eigen3. You must activate WITH_GMP and WITH_EIGEN flags and have the associated package installed.") + message(FATAL_ERROR "CGAL needs GMP. You must activate the WITH_GMP flag and have the associated package installed.") endif() find_package(CGAL COMPONENTS Core) @@ -363,11 +363,6 @@ endif() # ----------------------------------------------------------------------------- set(PATATE_FOUND_DGTAL 0) if(WITH_PATATE) - if(WITH_EIGEN) - message(STATUS "Eigen3 detected for PATATE.") - else() - message(FATAL_ERROR "PATATE needs Eigen3. You must activate WITH_EIGEN flags and have the associated package installed.") - endif() find_package(Patate) if(PATATE_FOUND) target_include_directories(DGtal PUBLIC ${PATATE_INCLUDE_DIR}) diff --git a/src/DGtal/shapes/WindingNumbersShape.h b/src/DGtal/shapes/WindingNumbersShape.h index c10265ac03..4627102739 100644 --- a/src/DGtal/shapes/WindingNumbersShape.h +++ b/src/DGtal/shapes/WindingNumbersShape.h @@ -12,7 +12,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - **/ + **/ #pragma once From 957c4076f7b49e2940167ba4de0e17031bcbb68e Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Wed, 25 Oct 2023 17:38:39 +0200 Subject: [PATCH 10/42] Cleaning up --- .../windingNumbersShape.cpp | 57 +++++++++++++------ 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/examples/polyscope-examples/windingNumbersShape.cpp b/examples/polyscope-examples/windingNumbersShape.cpp index 5c1ddeb7b9..8f2be00bd9 100644 --- a/examples/polyscope-examples/windingNumbersShape.cpp +++ b/examples/polyscope-examples/windingNumbersShape.cpp @@ -85,7 +85,7 @@ int main() polyscope::init(); auto iinormals = SHG3::getIINormalVectors(binary_image, surfels, params); - auto psMesh = polyscope::registerSurfaceMesh("digital surface", positions, faces); + auto psMesh = polyscope::registerSurfaceMesh("input digital surface", positions, faces); psMesh->addFaceVectorQuantity("normals", iinormals); // @@ -104,26 +104,49 @@ int main() normals(i,2) = n(2); } - auto pc= polyscope::registerPointCloud("Points", points); + auto pc= polyscope::registerPointCloud("input boundary points", points); pc->addVectorQuantity("normals", normals); WindingNumbersShape wnshape(points,normals); - trace.info() << binary_image->domain() << std::endl; - double step = 0.5; - auto width=33+2; - Eigen::MatrixXd queries(width*width*width,3); - auto cpt=0; - for(auto z=-2; z < 33; ++z) - for(auto y=-2; y < 33; ++y) - for(auto x=-2; x < 33; ++x) - { - Eigen::RowVector3 p(x,y,z); - queries.row(cpt) = p; - ++cpt; - } + auto lower = binary_image->domain().lowerBound(); + auto upper = binary_image->domain().upperBound(); + auto extend = (upper-lower); + + { + double step = 1.0; + size_t size = (size_t)std::floor(extend[0]*step * extend[1]*step * extend[2] * step); + Eigen::MatrixXd queries(size,3); + auto cpt=0; + for(double x= lower[0] ; x < upper[0] ; x+= step) + for(double y= lower[1] ; y < upper[1] ; y+= step) + for(double z= lower[2] ; z < upper[2] ; z+= step) + { + Eigen::RowVector3 p(x,y,z); + queries.row(cpt) = p; + ++cpt; + } + trace.info()<<"Cpt= "<addScalarQuantity("orientation",orientations); + } - auto orientations = wnshape.orientationBatch(queries); - polyscope::registerPointCloud("probes",queries)->addScalarQuantity("orientati on",orientations); + { + double step = 2; + size_t size = (size_t)std::floor(extend[0]*step * extend[1]*step * extend[2] * step); + Eigen::MatrixXd queries(size,3); + auto cpt=0; + for(double x= lower[0] ; x < upper[0] ; x+= step) + for(double y= lower[1] ; y < upper[1] ; y+= step) + for(double z= lower[2] ; z < upper[2] ; z+= step) + { + Eigen::RowVector3 p(x,y,z); + queries.row(cpt) = p; + ++cpt; + } + trace.info()<<"Cpt= "<addScalarQuantity("orientation",orientations); + } // Set the callback function polyscope::state::userCallback = myCallback; From a76486a82cc2edc122da022721af4bbb564745e6 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Thu, 26 Oct 2023 18:00:49 +0200 Subject: [PATCH 11/42] Fixing the example --- .../windingNumbersShape.cpp | 227 ++++++++++-------- src/DGtal/doc/global.bib | 11 + src/DGtal/shapes/WindingNumbersShape.h | 128 +++++----- tests/shapes/testWindingNumbersShape.cpp | 27 ++- 4 files changed, 232 insertions(+), 161 deletions(-) diff --git a/examples/polyscope-examples/windingNumbersShape.cpp b/examples/polyscope-examples/windingNumbersShape.cpp index 8f2be00bd9..599cdaccf6 100644 --- a/examples/polyscope-examples/windingNumbersShape.cpp +++ b/examples/polyscope-examples/windingNumbersShape.cpp @@ -33,6 +33,7 @@ #include #include +#include #include "ConfigExamples.h" @@ -48,108 +49,140 @@ typedef SurfaceMesh< RealPoint, RealVector > SurfMesh; void myCallback() { - + } int main() { - auto params = SH3::defaultParameters() | SHG3::defaultParameters() | SHG3::parametersGeometryEstimation(); - params("surfaceComponents", "All")( "gridstep", 1. )("r-radius" , 2.0); - - std::string filename = examplesPath + std::string("/samples/bunny-32.vol"); - auto binary_image = SH3::makeBinaryImage(filename, params ); - auto K = SH3::getKSpace( binary_image, params ); - auto surface = SH3::makeDigitalSurface( binary_image, K, params ); - SH3::Cell2Index c2i; - auto primalSurface = SH3::makePrimalSurfaceMesh(surface); - auto surfels = SH3::getSurfelRange( surface, params); - auto embedder = SH3::getSCellEmbedder( K ); - - - //Need to convert the faces - std::vector> faces; - std::vector positions; - - for(auto face= 0 ; face < primalSurface->nbFaces(); ++face) - faces.push_back(primalSurface->incidentVertices( face )); - - //Recasting to vector of vertices - positions = primalSurface->positions(); - - auto surfmesh = SurfMesh(positions.begin(), - positions.end(), - faces.begin(), - faces.end()); - - // Initialize polyscope - polyscope::init(); - - auto iinormals = SHG3::getIINormalVectors(binary_image, surfels, params); - auto psMesh = polyscope::registerSurfaceMesh("input digital surface", positions, faces); - psMesh->addFaceVectorQuantity("normals", iinormals); - - // - Eigen::MatrixXd points(surfels.size(),3); - Eigen::MatrixXd normals(surfels.size(),3); - - for(auto i=0; i< surfels.size(); ++i) - { - auto p = embedder(surfels[i]); - auto n = iinormals[i]; - points(i,0) = p(0); - points(i,1) = p(1); - points(i,2) = p(2); - normals(i,0) = n(0); - normals(i,1) = n(1); - normals(i,2) = n(2); + auto params = SH3::defaultParameters() | SHG3::defaultParameters() | SHG3::parametersGeometryEstimation(); + params("surfaceComponents", "All")( "gridstep", 1. )("r-radius" , 2.0); - } - auto pc= polyscope::registerPointCloud("input boundary points", points); - pc->addVectorQuantity("normals", normals); - WindingNumbersShape wnshape(points,normals); - - auto lower = binary_image->domain().lowerBound(); - auto upper = binary_image->domain().upperBound(); - auto extend = (upper-lower); - - { - double step = 1.0; - size_t size = (size_t)std::floor(extend[0]*step * extend[1]*step * extend[2] * step); - Eigen::MatrixXd queries(size,3); - auto cpt=0; - for(double x= lower[0] ; x < upper[0] ; x+= step) - for(double y= lower[1] ; y < upper[1] ; y+= step) - for(double z= lower[2] ; z < upper[2] ; z+= step) - { - Eigen::RowVector3 p(x,y,z); - queries.row(cpt) = p; - ++cpt; - } - trace.info()<<"Cpt= "<addScalarQuantity("orientation",orientations); - } - - { - double step = 2; - size_t size = (size_t)std::floor(extend[0]*step * extend[1]*step * extend[2] * step); - Eigen::MatrixXd queries(size,3); - auto cpt=0; - for(double x= lower[0] ; x < upper[0] ; x+= step) - for(double y= lower[1] ; y < upper[1] ; y+= step) - for(double z= lower[2] ; z < upper[2] ; z+= step) + std::string filename = examplesPath + std::string("/samples/bunny-32.vol"); + auto binary_image = SH3::makeBinaryImage(filename, params ); + auto K = SH3::getKSpace( binary_image, params ); + auto surface = SH3::makeDigitalSurface( binary_image, K, params ); + SH3::Cell2Index c2i; + auto primalSurface = SH3::makePrimalSurfaceMesh(surface); + auto surfels = SH3::getSurfelRange( surface, params); + auto embedder = SH3::getSCellEmbedder( K ); + + + //Need to convert the faces + std::vector> faces; + std::vector positions; + + for(auto face= 0 ; face < primalSurface->nbFaces(); ++face) + faces.push_back(primalSurface->incidentVertices( face )); + + //Recasting to vector of vertices + positions = primalSurface->positions(); + + auto surfmesh = SurfMesh(positions.begin(), + positions.end(), + faces.begin(), + faces.end()); + + // Initialize polyscope + polyscope::init(); + + auto iinormals = SHG3::getIINormalVectors(binary_image, surfels, params); + auto psMesh = polyscope::registerSurfaceMesh("input digital surface", positions, faces); + psMesh->addFaceVectorQuantity("normals", iinormals); + + // + Eigen::MatrixXd points(surfels.size(),3); + Eigen::MatrixXd normals(surfels.size(),3); + + for(auto i=0; i< surfels.size(); ++i) + { + auto p = embedder(surfels[i]); + auto n = iinormals[i]; + points(i,0) = p(0); + points(i,1) = p(1); + points(i,2) = p(2); + normals(i,0) = n(0); + normals(i,1) = n(1); + normals(i,2) = n(2); + + } + auto pc= polyscope::registerPointCloud("input boundary points", points); + pc->addVectorQuantity("normals", normals); + WindingNumbersShape wnshape(points,normals); + + auto lower = binary_image->domain().lowerBound(); + auto upper = binary_image->domain().upperBound(); + auto extend = (upper-lower); + + auto exec_h = [&](double h){ + + RegularPointEmbedder pointEmbedder; + pointEmbedder.init( h ); + Z3i::Point lowerPoint = pointEmbedder.floor( lower ); + Z3i::Point upperPoint = pointEmbedder.ceil( upper ); + Z3i::Domain domain(lowerPoint,upperPoint); + trace.info() <<"Digital domain = "< p(vox[0],vox[1],vox[2]); + p *= h; + queries.row(cpt) = p; + ++cpt; + } + trace.info()<<"Cpt= "<addScalarQuantity("orientation",orientations); + + //Binary Predicate + Z3i::DigitalSet voxels(domain); + cpt=0; + for(const auto &voxel: domain) { - Eigen::RowVector3 p(x,y,z); - queries.row(cpt) = p; - ++cpt; + if (orientations[cpt]==INSIDE) + voxels.insertNew(voxel); + ++cpt; } - trace.info()<<"Cpt= "<addScalarQuantity("orientation",orientations); - } - - // Set the callback function - polyscope::state::userCallback = myCallback; - polyscope::show(); - return EXIT_SUCCESS; + trace.info() <<"Number of voxels = "< MySetOfSurfels; + typedef DigitalSurface< MySetOfSurfels > MyDigitalSurface; + typedef SurfelAdjacency MySurfelAdjacency; + + MySurfelAdjacency surfAdj( true ); // interior in all directions. + MySetOfSurfels theSetOfSurfels( kspace, surfAdj ); + Surfaces::sMakeBoundary(theSetOfSurfels.surfelSet(), + kspace, + voxels, + lowerPoint, + upperPoint); + trace.info()<<"Surfel set size= "<>(new MyDigitalSurface(theSetOfSurfels)); + auto primalSurfaceReco = SH3::makePrimalSurfaceMesh(surfPtr); + + std::vector positionsReco = primalSurfaceReco->positions(); + + std::vector> facesReco; + for(auto face= 0 ; face < primalSurfaceReco->nbFaces(); ++face) + facesReco.push_back(primalSurfaceReco->incidentVertices( face )); + auto psMesh = polyscope::registerSurfaceMesh("Reconstruction "+std::to_string(h), positionsReco, facesReco); + }; + + exec_h(1.0); + exec_h(2.0); + exec_h(0.06); + + // Set the callback function + polyscope::state::userCallback = myCallback; + polyscope::show(); + return EXIT_SUCCESS; } diff --git a/src/DGtal/doc/global.bib b/src/DGtal/doc/global.bib index e6615a2bf8..a9d2262286 100644 --- a/src/DGtal/doc/global.bib +++ b/src/DGtal/doc/global.bib @@ -314,6 +314,17 @@ @article{barber1996 publisher={ACM New York, NY, USA} } +@article{barill2018fast, + title={Fast winding numbers for soups and clouds}, + author={Barill, Gavin and Dickson, Neil G and Schmidt, Ryan and Levin, David IW and Jacobson, Alec}, + journal={ACM Transactions on Graphics (TOG)}, + volume={37}, + number={4}, + pages={1--12}, + year={2018}, + publisher={ACM New York, NY, USA} +} + %% END Geometry/tools %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/DGtal/shapes/WindingNumbersShape.h b/src/DGtal/shapes/WindingNumbersShape.h index 4627102739..eae5ec390a 100644 --- a/src/DGtal/shapes/WindingNumbersShape.h +++ b/src/DGtal/shapes/WindingNumbersShape.h @@ -12,7 +12,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - **/ + **/ #pragma once @@ -23,7 +23,7 @@ * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France * * @date 2023/06/14 - + * * This file is part of the DGtal library. */ @@ -40,22 +40,26 @@ #include #include #include + namespace DGtal { - - ///////////////////////////////////////////////////////////////////////////// - /** - Description of template class 'WindingNumbersShape' - - \brief Aim: - - @see - - @tparam TDimension dimension of the intersection target - */ - template - struct WindingNumbersShape - { +///////////////////////////////////////////////////////////////////////////// +/** + Description of template class 'WindingNumbersShape' + + \brief Aim: model of a CEuclideanShape from an implicit + function from an oriented point cloud. The implicit function is given by the + generalized winding number of the oriented point cloud @cite barill2018fast . + We use the libIGL implementation . + + + @see testWindingNumberShape, windingNumberShape + + @tparam TSPace the digital space type (a model of CSpace) + */ +template +struct WindingNumbersShape +{ ///Types using Space = TSpace; @@ -65,31 +69,31 @@ namespace DGtal //Removing Default constructor WindingNumbersShape() = delete; - + WindingNumbersShape(const Eigen::MatrixXd &points, const Eigen::MatrixXd &normals) { - myPoints = points; - myNormals = normals; - myPointAreas =Eigen::VectorXd::Ones(myPoints.rows()); - // Build octree, from libIGL tutorials - igl::octree(myPoints,myO_PI,myO_CH,myO_CN,myO_W); - /*{ - Eigen::MatrixXi I; - igl::knn(myPoints,std::min(20, (int)points.rows()),myO_PI,myO_CH,myO_CN,myO_W,I); - // CGAL is only used to help get point areas - igl::copyleft::cgal::point_areas(myPoints,I,myNormals,myPointAreas); - }*/ + myPoints = points; + myNormals = normals; + myPointAreas =Eigen::VectorXd::Ones(myPoints.rows()); + // Build octree, from libIGL tutorials + igl::octree(myPoints,myO_PI,myO_CH,myO_CN,myO_W); + /*{ + Eigen::MatrixXi I; + igl::knn(myPoints,std::min(20, (int)points.rows()),myO_PI,myO_CH,myO_CN,myO_W,I); + // CGAL is only used to help get point areas + igl::copyleft::cgal::point_areas(myPoints,I,myNormals,myPointAreas); + }*/ } WindingNumbersShape(const Eigen::MatrixXd &points, const Eigen::MatrixXd &normals, const Eigen::MatrixXd &areas) { - myPoints = points; - myNormals = normals; - myPointAreas = areas; - igl::octree(myPoints,myO_PI,myO_CH,myO_CN,myO_W); - } + myPoints = points; + myNormals = normals; + myPointAreas = areas; + igl::octree(myPoints,myO_PI,myO_CH,myO_CN,myO_W); + } /// Orientation of a point using the winding number value from /// an oriented pointcloud. @@ -98,51 +102,51 @@ namespace DGtal /// @return a DGtal::Orientation value Orientation orientation(const RealPoint aPoint, const double threshold = 0.3) const { - Eigen::MatrixXd queries(1,3); - queries << aPoint(0) , aPoint(1) , aPoint(2); - auto singlePoint = orientationBatch(queries, threshold); - return singlePoint[0]; + Eigen::MatrixXd queries(1,3); + queries << aPoint(0) , aPoint(1) , aPoint(2); + auto singlePoint = orientationBatch(queries, threshold); + return singlePoint[0]; } /// - std::vector orientationBatch(const Eigen::MatrixXd & queries, + std::vector orientationBatch(const Eigen::MatrixXd & queries, const double threshold = 0.3) const { - Eigen::VectorXd W; - std::vector results( queries.rows() ); - Eigen::MatrixXd O_CM; - Eigen::VectorXd O_R; - Eigen::MatrixXd O_EC; - igl::fast_winding_number(myPoints,myNormals,myPointAreas,myO_PI,myO_CH,2,O_CM,O_R,O_EC); - igl::fast_winding_number(myPoints,myNormals,myPointAreas,myO_PI,myO_CH,O_CM,O_R,O_EC,queries,2,W); - - //Reformating the output - for(auto i=0u; i < queries.rows(); ++i) - { - if (std::abs(W(i)) < threshold ) - results[i] = DGtal::OUTSIDE; - else - if (std::abs(W(i)) > threshold) - results[i] = DGtal::INSIDE; - else - results[i] = DGtal::ON; - } - return results; + Eigen::VectorXd W; + std::vector results( queries.rows() ); + Eigen::MatrixXd O_CM; + Eigen::VectorXd O_R; + Eigen::MatrixXd O_EC; + igl::fast_winding_number(myPoints,myNormals,myPointAreas,myO_PI,myO_CH,2,O_CM,O_R,O_EC); + igl::fast_winding_number(myPoints,myNormals,myPointAreas,myO_PI,myO_CH,O_CM,O_R,O_EC,queries,2,W); + + //Reformating the output + for(auto i=0u; i < queries.rows(); ++i) + { + if (std::abs(W(i)) < threshold ) + results[i] = DGtal::OUTSIDE; + else + if (std::abs(W(i)) > threshold) + results[i] = DGtal::INSIDE; + else + results[i] = DGtal::ON; + } + return results; } - + ///Copy of the points Eigen::MatrixXd myPoints; ///Copy of the normals Eigen::MatrixXd myNormals; - + //libIGL octree for fast queries std::vector > myO_PI; Eigen::MatrixXi myO_CH; Eigen::MatrixXd myO_CN; Eigen::VectorXd myO_W; Eigen::VectorXd myPointAreas; - - }; + +}; } #endif // !defined WindingNumbersShape_h diff --git a/tests/shapes/testWindingNumbersShape.cpp b/tests/shapes/testWindingNumbersShape.cpp index cda89acf0b..76c7752f79 100644 --- a/tests/shapes/testWindingNumbersShape.cpp +++ b/tests/shapes/testWindingNumbersShape.cpp @@ -35,6 +35,7 @@ #include "DGtal/helpers/StdDefs.h" #include +#include /////////////////////////////////////////////////////////////////////////////// @@ -81,9 +82,31 @@ TEST_CASE( "Testing WindingNumbersShape" ) RealPoint q= RealPoint(.2,.2,.2); auto ori2 = wnshape.orientation(q); REQUIRE( ori2 == DGtal::INSIDE); - } - + + SECTION("Tesing with the GaussDigitizer") + { + Eigen::MatrixXd points(4,3); + points << 0,0,0, + 0,1,0, + 1,0,0, + 1,1,1; + Eigen::MatrixXd normals(4,3); + normals << 0,0,-1, + 0,0,-1, + 0,0,-1, + 0,0,1; + + WNShape wnshape(points,normals); + GaussDigitizer gauss; + gauss.attach(wnshape); + gauss.init(Z3i::RealPoint(0,0,0),Z3i::RealPoint(1.5,1.5,1.5), 0.5); + auto cpt=0; + for(auto p: gauss.getDomain()) + if (gauss.orientation(p) == DGtal::INSIDE) + ++cpt; + REQUIRE( cpt == 8); + } }; /** @ingroup Tests **/ From 19782b5f57c2fe122e97764b4a9596c87599e97d Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Thu, 26 Oct 2023 18:25:57 +0200 Subject: [PATCH 12/42] Fixing the example --- .../windingNumbersShape.cpp | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/examples/polyscope-examples/windingNumbersShape.cpp b/examples/polyscope-examples/windingNumbersShape.cpp index 599cdaccf6..64904dd18b 100644 --- a/examples/polyscope-examples/windingNumbersShape.cpp +++ b/examples/polyscope-examples/windingNumbersShape.cpp @@ -24,6 +24,8 @@ */ #include #include +#include + #include #include #include @@ -55,7 +57,7 @@ void myCallback() int main() { auto params = SH3::defaultParameters() | SHG3::defaultParameters() | SHG3::parametersGeometryEstimation(); - params("surfaceComponents", "All")( "gridstep", 1. )("r-radius" , 2.0); + params("surfaceComponents", "All")( "gridstep", 1. )("r-radius" , 3.0); std::string filename = examplesPath + std::string("/samples/bunny-32.vol"); auto binary_image = SH3::makeBinaryImage(filename, params ); @@ -113,7 +115,7 @@ int main() auto upper = binary_image->domain().upperBound(); auto extend = (upper-lower); - auto exec_h = [&](double h){ + auto resample_h = [&](double h){ RegularPointEmbedder pointEmbedder; pointEmbedder.init( h ); @@ -127,12 +129,12 @@ int main() Eigen::MatrixXd queries(size,3); auto cpt=0; for(const auto &vox: domain) - { - Eigen::RowVector3 p(vox[0],vox[1],vox[2]); - p *= h; - queries.row(cpt) = p; - ++cpt; - } + { + Eigen::RowVector3 p(vox[0],vox[1],vox[2]); + p *= h; + queries.row(cpt) = p; + ++cpt; + } trace.info()<<"Cpt= "<addScalarQuantity("orientation",orientations); @@ -147,7 +149,7 @@ int main() ++cpt; } trace.info() <<"Number of voxels = "< positionsReco = primalSurfaceReco->positions(); + //Fixing the embedding + std::for_each(std::begin(positionsReco), std::end(positionsReco), [&](RealPoint &p){p=p*h;}); std::vector> facesReco; for(auto face= 0 ; face < primalSurfaceReco->nbFaces(); ++face) @@ -177,10 +181,11 @@ int main() auto psMesh = polyscope::registerSurfaceMesh("Reconstruction "+std::to_string(h), positionsReco, facesReco); }; - exec_h(1.0); - exec_h(2.0); - exec_h(0.06); - + resample_h(1.0); + resample_h(2.0); //downscaling + resample_h(0.5); //upscaling + //exec_h(0.06); //extreme upscaling, 2M vertices + // Set the callback function polyscope::state::userCallback = myCallback; polyscope::show(); From 1849c3ca5874339e11a5c0b9ed0b21ed93d961e8 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Fri, 27 Oct 2023 16:13:08 +0200 Subject: [PATCH 13/42] libigl in bots --- .../workflows/buildAndDocumentation-PR.yml | 4 +- cmake/CheckDGtalOptionalDependencies.cmake | 2 - .../windingNumbersShape.cpp | 12 +- src/DGtal/shapes/WindingNumbersShape.h | 158 +++++++++++------- tests/shapes/CMakeLists.txt | 2 - 5 files changed, 106 insertions(+), 72 deletions(-) diff --git a/.github/workflows/buildAndDocumentation-PR.yml b/.github/workflows/buildAndDocumentation-PR.yml index 58a828c844..f5b4796201 100644 --- a/.github/workflows/buildAndDocumentation-PR.yml +++ b/.github/workflows/buildAndDocumentation-PR.yml @@ -9,7 +9,7 @@ env: BUILD_TYPE: Debug TESTBLACKLIST: "(testLinearStructure|testIntegerConverter)" CONFIG_GLOBAL: -DBUILD_EXAMPLES=true -DBUILD_TESTING=true -DDGTAL_RANDOMIZED_TESTING_THRESHOLD=10 -DWITH_EIGEN=true - CONFIG_LINUX: -DUSE_CCACHE=YES -DWITH_OPENMP=true -DWITH_GMP=true -DWITH_FFTW3=true -DWARNING_AS_ERROR=ON -DWITH_HDF5=true -DWITH_QGLVIEWER=true -DWITH_CAIRO=true -DWITH_ITK=true -DDGTAL_ENABLE_FLOATING_POINT_EXCEPTIONS=true -DBUILD_POLYSCOPE_EXAMPLES=true + CONFIG_LINUX: -DUSE_CCACHE=YES -DWITH_OPENMP=true -DWITH_GMP=true -DWITH_CGAL=true -DWITH_LIBIGL=true -DWITH_FFTW3=true -DWARNING_AS_ERROR=ON -DWITH_HDF5=true -DWITH_QGLVIEWER=true -DWITH_CAIRO=true -DWITH_ITK=true -DDGTAL_ENABLE_FLOATING_POINT_EXCEPTIONS=true -DBUILD_POLYSCOPE_EXAMPLES=true CONFIG_MAC: -DUSE_CCACHE=YES -DWITH_GMP=true -DBUILD_POLYSCOPE_EXAMPLES=true CONFIG_WINDOWS: -DWITH_OPENMP=true -DENABLE_CONAN=true #-DWITH_FFTW3=true #-DWITH_CAIRO=true #-DWITH_ITK=true -DWITH_GMP=true @@ -31,7 +31,7 @@ jobs: if: matrix.os == 'ubuntu-latest' run: | sudo apt-get update - sudo apt-get install ccache zsh libqglviewer-dev-qt5 libboost-dev ninja-build libhdf5-serial-dev libboost-dev libcairo2-dev libgmp-dev libfftw3-dev libinsighttoolkit4-dev xorg-dev libglu1-mesa-dev freeglut3-dev mesa-common-dev + sudo apt-get install ccache zsh libqglviewer-dev-qt5 libcgal-dev libboost-dev ninja-build libhdf5-serial-dev libboost-dev libcairo2-dev libgmp-dev libfftw3-dev libinsighttoolkit4-dev xorg-dev libglu1-mesa-dev freeglut3-dev mesa-common-dev - name: Install macOS deps if: matrix.os == 'macOS-latest' diff --git a/cmake/CheckDGtalOptionalDependencies.cmake b/cmake/CheckDGtalOptionalDependencies.cmake index ec71696294..6e715034dc 100644 --- a/cmake/CheckDGtalOptionalDependencies.cmake +++ b/cmake/CheckDGtalOptionalDependencies.cmake @@ -415,7 +415,6 @@ endif() # (They are not compulsory). # ----------------------------------------------------------------------------- if(WITH_LIBIGL) - if (WITH_CGAL) message(STATUS "DGtal/CGAL enabled.") else() @@ -425,5 +424,4 @@ if(WITH_LIBIGL) set(DGtalLibDependencies ${DGtalLibDependencies} igl::core) endif() - message(STATUS "-------------------------------------------------------------------------------") diff --git a/examples/polyscope-examples/windingNumbersShape.cpp b/examples/polyscope-examples/windingNumbersShape.cpp index 64904dd18b..5d6f5b782a 100644 --- a/examples/polyscope-examples/windingNumbersShape.cpp +++ b/examples/polyscope-examples/windingNumbersShape.cpp @@ -49,6 +49,7 @@ typedef ShortcutsGeometry SHG3; typedef SurfaceMesh< RealPoint, RealVector > SurfMesh; + void myCallback() { @@ -72,10 +73,8 @@ int main() //Need to convert the faces std::vector> faces; std::vector positions; - for(auto face= 0 ; face < primalSurface->nbFaces(); ++face) faces.push_back(primalSurface->incidentVertices( face )); - //Recasting to vector of vertices positions = primalSurface->positions(); @@ -109,6 +108,8 @@ int main() } auto pc= polyscope::registerPointCloud("input boundary points", points); pc->addVectorQuantity("normals", normals); + + WindingNumbersShape wnshape(points,normals); auto lower = binary_image->domain().lowerBound(); @@ -125,7 +126,7 @@ int main() trace.info() <<"Digital domain = "<addScalarQuantity("orientation",orientations); - + //Binary Predicate Z3i::DigitalSet voxels(domain); cpt=0; @@ -184,7 +184,7 @@ int main() resample_h(1.0); resample_h(2.0); //downscaling resample_h(0.5); //upscaling - //exec_h(0.06); //extreme upscaling, 2M vertices + resample_h(0.07); //extreme upscaling, 2M vertices // Set the callback function polyscope::state::userCallback = myCallback; diff --git a/src/DGtal/shapes/WindingNumbersShape.h b/src/DGtal/shapes/WindingNumbersShape.h index eae5ec390a..5aa5b77a26 100644 --- a/src/DGtal/shapes/WindingNumbersShape.h +++ b/src/DGtal/shapes/WindingNumbersShape.h @@ -32,6 +32,10 @@ /** Prevents repeated inclusion of headers. */ #define WindingNumbersShape_h +#ifndef WITH_LIBIGL +#error You need to have activated LIBIGL (WITH_LIBIGL flag) to include this file. +#endif + #include #include #include @@ -43,24 +47,25 @@ namespace DGtal { -///////////////////////////////////////////////////////////////////////////// -/** - Description of template class 'WindingNumbersShape' - - \brief Aim: model of a CEuclideanShape from an implicit - function from an oriented point cloud. The implicit function is given by the - generalized winding number of the oriented point cloud @cite barill2018fast . - We use the libIGL implementation . - - - @see testWindingNumberShape, windingNumberShape - - @tparam TSPace the digital space type (a model of CSpace) - */ -template -struct WindingNumbersShape -{ - + ///////////////////////////////////////////////////////////////////////////// + /** + Description of template class 'WindingNumbersShape' + + \brief Aim: model of a CEuclideanShape from an implicit + function from an oriented point cloud. The implicit function is given by the + generalized winding number of the oriented point cloud @cite barill2018fast . + We use the libIGL implementation. + + + + + @see testWindingNumberShape, windingNumberShape + + @tparam TSPace the digital space type (a model of CSpace) + */ + template + struct WindingNumbersShape + { ///Types using Space = TSpace; using RealPoint = typename Space::RealPoint; @@ -70,68 +75,101 @@ struct WindingNumbersShape //Removing Default constructor WindingNumbersShape() = delete; + /// Construct a WindingNumberShape Euclidean shape from an oriented point cloud. + /// This constructor estimates the @a area @a of each point using CGAL. + /// + /// @param points a "nx3" matrix with the sample coordinates. + /// @param normals a "nx3" matrix for the normal vectors. WindingNumbersShape(const Eigen::MatrixXd &points, const Eigen::MatrixXd &normals) { - myPoints = points; - myNormals = normals; - myPointAreas =Eigen::VectorXd::Ones(myPoints.rows()); - // Build octree, from libIGL tutorials - igl::octree(myPoints,myO_PI,myO_CH,myO_CN,myO_W); - /*{ - Eigen::MatrixXi I; - igl::knn(myPoints,std::min(20, (int)points.rows()),myO_PI,myO_CH,myO_CN,myO_W,I); - // CGAL is only used to help get point areas - igl::copyleft::cgal::point_areas(myPoints,I,myNormals,myPointAreas); - }*/ + myPoints = points; + myNormals = normals; + myPointAreas =Eigen::VectorXd::Ones(myPoints.rows()); + // Build octree, from libIGL tutorials + igl::octree(myPoints,myO_PI,myO_CH,myO_CN,myO_W); + if (points.rows()> 20) + { + Eigen::MatrixXi I; + igl::knn(myPoints,(int)points.rows(),myO_PI,myO_CH,myO_CN,myO_W,I); + // CGAL is only used to help get point areas + igl::copyleft::cgal::point_areas(myPoints,I,myNormals,myPointAreas); + } + else + { + trace.warning()<<"[WindingNumberShape] Too few points to use CGAL point_areas. Using the constant area setting."< orientationBatch(const Eigen::MatrixXd & queries, const double threshold = 0.3) const { - Eigen::VectorXd W; - std::vector results( queries.rows() ); - Eigen::MatrixXd O_CM; - Eigen::VectorXd O_R; - Eigen::MatrixXd O_EC; - igl::fast_winding_number(myPoints,myNormals,myPointAreas,myO_PI,myO_CH,2,O_CM,O_R,O_EC); - igl::fast_winding_number(myPoints,myNormals,myPointAreas,myO_PI,myO_CH,O_CM,O_R,O_EC,queries,2,W); - - //Reformating the output - for(auto i=0u; i < queries.rows(); ++i) - { - if (std::abs(W(i)) < threshold ) - results[i] = DGtal::OUTSIDE; - else - if (std::abs(W(i)) > threshold) - results[i] = DGtal::INSIDE; - else - results[i] = DGtal::ON; - } - return results; + Eigen::VectorXd W; + std::vector results( queries.rows() ); + Eigen::MatrixXd O_CM; + Eigen::VectorXd O_R; + Eigen::MatrixXd O_EC; + igl::fast_winding_number(myPoints,myNormals,myPointAreas,myO_PI,myO_CH,2,O_CM,O_R,O_EC); + igl::fast_winding_number(myPoints,myNormals,myPointAreas,myO_PI,myO_CH,O_CM,O_R,O_EC,queries,2,W); + + //Reformating the output + for(auto i=0u; i < queries.rows(); ++i) + { + if (std::abs(W(i)) < threshold ) + results[i] = DGtal::OUTSIDE; + else + if (std::abs(W(i)) > threshold) + results[i] = DGtal::INSIDE; + else + results[i] = DGtal::ON; + } + return results; } ///Copy of the points @@ -146,7 +184,7 @@ struct WindingNumbersShape Eigen::VectorXd myO_W; Eigen::VectorXd myPointAreas; -}; + }; } #endif // !defined WindingNumbersShape_h diff --git a/tests/shapes/CMakeLists.txt b/tests/shapes/CMakeLists.txt index 8db169eadd..eb7e4ed7ce 100644 --- a/tests/shapes/CMakeLists.txt +++ b/tests/shapes/CMakeLists.txt @@ -6,7 +6,6 @@ set(QGLVIEWER_BASED_TESTS_SRC ) if ( WITH_VISU3D_QGLVIEWER ) - foreach(FILE ${QGLVIEWER_BASED_TESTS_SRC}) DGtal_add_test(${FILE} ONLY_ADD_EXECUTABLE) #not a test since IHM @@ -35,7 +34,6 @@ set(DGTAL_TESTS_SRC testLemniscate2D ) - if (WITH_LIBIGL) set(DGTAL_TESTS_SRC_LIBIGL testlibigl From 406ff0ccc9fc234b7d18d1e48e386db14084e1d4 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Fri, 27 Oct 2023 16:17:44 +0200 Subject: [PATCH 14/42] libigl in bots --- cmake/CheckDGtalOptionalDependencies.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/CheckDGtalOptionalDependencies.cmake b/cmake/CheckDGtalOptionalDependencies.cmake index 6e715034dc..0cb6632281 100644 --- a/cmake/CheckDGtalOptionalDependencies.cmake +++ b/cmake/CheckDGtalOptionalDependencies.cmake @@ -421,6 +421,7 @@ if(WITH_LIBIGL) message(FATAL_ERROR "LIBIGL requires CGAL. Please if the `WITH_CGAL=true` cmake flag.") endif() include(cmake/deps/libigl.cmake) + target_compile_definitions(DGtal PUBLIC -DWITH_LIBIGL) set(DGtalLibDependencies ${DGtalLibDependencies} igl::core) endif() From 551ca3d5ae283740d5343403575d70e99f3b96b5 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Fri, 27 Oct 2023 16:32:54 +0200 Subject: [PATCH 15/42] libigl in bots --- .github/workflows/build-master.yml | 8 ++++---- .github/workflows/buildAndDocumentation-PR.yml | 4 ++-- examples/polyscope-examples/CMakeLists.txt | 9 ++++++++- src/DGtal/shapes/WindingNumbersShape.h | 10 +++++----- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-master.yml b/.github/workflows/build-master.yml index 9b2f6ed0af..596017547c 100644 --- a/.github/workflows/build-master.yml +++ b/.github/workflows/build-master.yml @@ -9,8 +9,8 @@ env: BUILD_TYPE: Debug TESTBLACKLIST: "(testLinearStructure|testIntegerConverter)" CONFIG_GLOBAL: -DBUILD_EXAMPLES=true -DBUILD_TESTING=true -DDGTAL_RANDOMIZED_TESTING_THRESHOLD=10 -DWITH_EIGEN=true - CONFIG_LINUX: -DWITH_OPENMP=true -DWITH_GMP=true -DWITH_FFTW3=true -DWARNING_AS_ERROR=ON -DWITH_HDF5=true -DWITH_QGLVIEWER=true -DWITH_CAIRO=true -DWITH_ITK=true -DDGTAL_ENABLE_FLOATING_POINT_EXCEPTIONS=true -DBUILD_POLYSCOPE_EXAMPLES=true - CONFIG_MAC: -DWITH_GMP=true -DBUILD_POLYSCOPE_EXAMPLES=true + CONFIG_LINUX: -DWITH_OPENMP=true -DWITH_GMP=true -DWITH_FFTW3=true -DWITH_CGAL=true -DWITH_LIBIGL=true -DWARNING_AS_ERROR=ON -DWITH_HDF5=true -DWITH_QGLVIEWER=true -DWITH_CAIRO=true -DWITH_ITK=true -DDGTAL_ENABLE_FLOATING_POINT_EXCEPTIONS=true -DBUILD_POLYSCOPE_EXAMPLES=true + CONFIG_MAC: -DWITH_GMP=true -DBUILD_POLYSCOPE_EXAMPLES=true -DWITH_CGAL=true -DWITH_LIBIGL=true CONFIG_WINDOWS: -DWITH_OPENMP=true -DENABLE_CONAN=true #-DWITH_FFTW3=true #-DWITH_CAIRO=true #-DWITH_ITK=true -DWITH_GMP=true jobs: @@ -31,11 +31,11 @@ jobs: if: matrix.os == 'ubuntu-latest' run: | sudo apt-get update - sudo apt-get install zsh libqglviewer-dev-qt5 libboost-dev ninja-build libhdf5-serial-dev libboost-dev libcairo2-dev libgmp-dev libfftw3-dev libinsighttoolkit4-dev xorg-dev libglu1-mesa-dev freeglut3-dev mesa-common-dev + sudo apt-get install zsh libqglviewer-dev-qt5 libboost-dev libcgal-dev ninja-build libhdf5-serial-dev libboost-dev libcairo2-dev libgmp-dev libfftw3-dev libinsighttoolkit4-dev xorg-dev libglu1-mesa-dev freeglut3-dev mesa-common-dev - name: Install macOS deps if: matrix.os == 'macOS-latest' - run: brew install boost ninja gmp libomp + run: brew install boost ninja gmp libomp cgal - name: Install conan if: matrix.os == 'windows-latest' diff --git a/.github/workflows/buildAndDocumentation-PR.yml b/.github/workflows/buildAndDocumentation-PR.yml index f5b4796201..7cb2e6f024 100644 --- a/.github/workflows/buildAndDocumentation-PR.yml +++ b/.github/workflows/buildAndDocumentation-PR.yml @@ -10,7 +10,7 @@ env: TESTBLACKLIST: "(testLinearStructure|testIntegerConverter)" CONFIG_GLOBAL: -DBUILD_EXAMPLES=true -DBUILD_TESTING=true -DDGTAL_RANDOMIZED_TESTING_THRESHOLD=10 -DWITH_EIGEN=true CONFIG_LINUX: -DUSE_CCACHE=YES -DWITH_OPENMP=true -DWITH_GMP=true -DWITH_CGAL=true -DWITH_LIBIGL=true -DWITH_FFTW3=true -DWARNING_AS_ERROR=ON -DWITH_HDF5=true -DWITH_QGLVIEWER=true -DWITH_CAIRO=true -DWITH_ITK=true -DDGTAL_ENABLE_FLOATING_POINT_EXCEPTIONS=true -DBUILD_POLYSCOPE_EXAMPLES=true - CONFIG_MAC: -DUSE_CCACHE=YES -DWITH_GMP=true -DBUILD_POLYSCOPE_EXAMPLES=true + CONFIG_MAC: -DUSE_CCACHE=YES -DWITH_GMP=true -DBUILD_POLYSCOPE_EXAMPLES=true -DWITH_CGAL=true -DWITH_LIBIGL=true CONFIG_WINDOWS: -DWITH_OPENMP=true -DENABLE_CONAN=true #-DWITH_FFTW3=true #-DWITH_CAIRO=true #-DWITH_ITK=true -DWITH_GMP=true jobs: @@ -35,7 +35,7 @@ jobs: - name: Install macOS deps if: matrix.os == 'macOS-latest' - run: brew install boost ninja gmp libomp ccache + run: brew install boost ninja gmp libomp ccache cgal - name: Install conan if: matrix.os == 'windows-latest' diff --git a/examples/polyscope-examples/CMakeLists.txt b/examples/polyscope-examples/CMakeLists.txt index 0eb44c4c62..da0484cf0b 100644 --- a/examples/polyscope-examples/CMakeLists.txt +++ b/examples/polyscope-examples/CMakeLists.txt @@ -39,9 +39,16 @@ set(POLYSCOPE_SRCS exampleBunnyHead tangency-explorer tangency-reconstruction - windingNumbersShape ) +if(WITH_LIBIGL) + set(POLYSCOPE_SRCS + ${POLYSCOPE_SRCS} 1 + windingNumbersShape + ) +endif() + + if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(MY_DEBUG_OPTIONS "-w") endif() diff --git a/src/DGtal/shapes/WindingNumbersShape.h b/src/DGtal/shapes/WindingNumbersShape.h index 5aa5b77a26..a6763f971b 100644 --- a/src/DGtal/shapes/WindingNumbersShape.h +++ b/src/DGtal/shapes/WindingNumbersShape.h @@ -44,7 +44,6 @@ #include #include #include - namespace DGtal { ///////////////////////////////////////////////////////////////////////////// @@ -56,9 +55,6 @@ namespace DGtal generalized winding number of the oriented point cloud @cite barill2018fast . We use the libIGL implementation. - - - @see testWindingNumberShape, windingNumberShape @tparam TSPace the digital space type (a model of CSpace) @@ -177,11 +173,15 @@ namespace DGtal ///Copy of the normals Eigen::MatrixXd myNormals; - //libIGL octree for fast queries + ///libIGL octree for fast queries data structure std::vector > myO_PI; + ///libIGL octree for fast queries data structure Eigen::MatrixXi myO_CH; + ///libIGL octree for fast queries data structure Eigen::MatrixXd myO_CN; + ///libIGL octree for fast queries data structure Eigen::VectorXd myO_W; + ///libIGL octree for fast queries data structure Eigen::VectorXd myPointAreas; }; From 96e279c1fa471ac60706d55a528eee0d04149c33 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Fri, 27 Oct 2023 16:33:25 +0200 Subject: [PATCH 16/42] libigl in bots --- examples/polyscope-examples/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/polyscope-examples/CMakeLists.txt b/examples/polyscope-examples/CMakeLists.txt index da0484cf0b..81d4065344 100644 --- a/examples/polyscope-examples/CMakeLists.txt +++ b/examples/polyscope-examples/CMakeLists.txt @@ -43,7 +43,7 @@ set(POLYSCOPE_SRCS if(WITH_LIBIGL) set(POLYSCOPE_SRCS - ${POLYSCOPE_SRCS} 1 + ${POLYSCOPE_SRCS} windingNumbersShape ) endif() From c84bb312c69f6c8735f4adcdfb4e3de6ef2487cc Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Sat, 28 Oct 2023 15:06:53 +0200 Subject: [PATCH 17/42] Disabling a test --- .github/workflows/buildAndDocumentation-PR.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/buildAndDocumentation-PR.yml b/.github/workflows/buildAndDocumentation-PR.yml index 58a828c844..7343cb9068 100644 --- a/.github/workflows/buildAndDocumentation-PR.yml +++ b/.github/workflows/buildAndDocumentation-PR.yml @@ -7,7 +7,7 @@ on: env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) BUILD_TYPE: Debug - TESTBLACKLIST: "(testLinearStructure|testIntegerConverter)" + TESTBLACKLIST: "(testLinearStructure|testIntegerConverter|testArithmeticalDSSComputerOnSurfels)" CONFIG_GLOBAL: -DBUILD_EXAMPLES=true -DBUILD_TESTING=true -DDGTAL_RANDOMIZED_TESTING_THRESHOLD=10 -DWITH_EIGEN=true CONFIG_LINUX: -DUSE_CCACHE=YES -DWITH_OPENMP=true -DWITH_GMP=true -DWITH_FFTW3=true -DWARNING_AS_ERROR=ON -DWITH_HDF5=true -DWITH_QGLVIEWER=true -DWITH_CAIRO=true -DWITH_ITK=true -DDGTAL_ENABLE_FLOATING_POINT_EXCEPTIONS=true -DBUILD_POLYSCOPE_EXAMPLES=true CONFIG_MAC: -DUSE_CCACHE=YES -DWITH_GMP=true -DBUILD_POLYSCOPE_EXAMPLES=true From 8c9a64da975ff5d26165c1be97dbdc942ae21879 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Mon, 13 Nov 2023 08:49:05 +0100 Subject: [PATCH 18/42] Fixing DGtalConfig.cmake --- cmake/CheckDGtalOptionalDependencies.cmake | 2 + cmake/DGtalConfig.cmake.in | 8 +- cmake/DGtalConfigGenerator.cmake | 1 + .../windingNumbersShape.cpp | 248 +++++++++--------- 4 files changed, 133 insertions(+), 126 deletions(-) diff --git a/cmake/CheckDGtalOptionalDependencies.cmake b/cmake/CheckDGtalOptionalDependencies.cmake index 0cb6632281..149788f22e 100644 --- a/cmake/CheckDGtalOptionalDependencies.cmake +++ b/cmake/CheckDGtalOptionalDependencies.cmake @@ -423,6 +423,8 @@ if(WITH_LIBIGL) include(cmake/deps/libigl.cmake) target_compile_definitions(DGtal PUBLIC -DWITH_LIBIGL) set(DGtalLibDependencies ${DGtalLibDependencies} igl::core) + set(LIBIGL_FOUND_DGTAL 1) + endif() message(STATUS "-------------------------------------------------------------------------------") diff --git a/cmake/DGtalConfig.cmake.in b/cmake/DGtalConfig.cmake.in index fe1a28b6a9..984e0b1b0d 100644 --- a/cmake/DGtalConfig.cmake.in +++ b/cmake/DGtalConfig.cmake.in @@ -25,6 +25,11 @@ set(WITH_EIGEN 1) include(eigen) set(DGtalLibDependencies ${DGtalLibDependencies} Eigen3::Eigen) +if (@LIBIGL_FOUND_DGTAL@) + include(libigl) + set(WITH_LIBIGL 1) + set(DGtalLibDependencies ${DGtalLibDependencies} igl::core) +endif() if(@GMP_FOUND_DGTAL@) #if GMP_FOUND_DGTAL find_package(GMP REQUIRED @@ -105,9 +110,6 @@ if(@OPENMP_FOUND_DGTAL@) #if OPENMP_FOUND_DGTAL set(WITH_OPENMP 1) endif() - - - if(@CGAL_FOUND_DGTAL@) #if CGAL_FOUND_DGTAL find_dependency(CGAL COMPONENTS Core @CGAL_HINTS@ diff --git a/cmake/DGtalConfigGenerator.cmake b/cmake/DGtalConfigGenerator.cmake index 9e7023d9ec..ba1db6f9db 100644 --- a/cmake/DGtalConfigGenerator.cmake +++ b/cmake/DGtalConfigGenerator.cmake @@ -59,6 +59,7 @@ set(_find_cmake_files "${PROJECT_SOURCE_DIR}/cmake/FindQGLVIEWER.cmake" "${PROJECT_SOURCE_DIR}/cmake/FindGMP.cmake" "${PROJECT_SOURCE_DIR}/cmake/deps/eigen.cmake" + "${PROJECT_SOURCE_DIR}/cmake/deps/libigl.cmake" "${PROJECT_SOURCE_DIR}/cmake/CPM.cmake" ) file(COPY ${_find_cmake_files} diff --git a/examples/polyscope-examples/windingNumbersShape.cpp b/examples/polyscope-examples/windingNumbersShape.cpp index 5d6f5b782a..cc7d565e2d 100644 --- a/examples/polyscope-examples/windingNumbersShape.cpp +++ b/examples/polyscope-examples/windingNumbersShape.cpp @@ -52,142 +52,144 @@ typedef SurfaceMesh< RealPoint, RealVector > SurfMesh; void myCallback() { - + } int main() { - auto params = SH3::defaultParameters() | SHG3::defaultParameters() | SHG3::parametersGeometryEstimation(); - params("surfaceComponents", "All")( "gridstep", 1. )("r-radius" , 3.0); - - std::string filename = examplesPath + std::string("/samples/bunny-32.vol"); - auto binary_image = SH3::makeBinaryImage(filename, params ); - auto K = SH3::getKSpace( binary_image, params ); - auto surface = SH3::makeDigitalSurface( binary_image, K, params ); - SH3::Cell2Index c2i; - auto primalSurface = SH3::makePrimalSurfaceMesh(surface); - auto surfels = SH3::getSurfelRange( surface, params); - auto embedder = SH3::getSCellEmbedder( K ); - - - //Need to convert the faces - std::vector> faces; - std::vector positions; - for(auto face= 0 ; face < primalSurface->nbFaces(); ++face) - faces.push_back(primalSurface->incidentVertices( face )); - //Recasting to vector of vertices - positions = primalSurface->positions(); - - auto surfmesh = SurfMesh(positions.begin(), - positions.end(), - faces.begin(), - faces.end()); + auto params = SH3::defaultParameters() | SHG3::defaultParameters() | SHG3::parametersGeometryEstimation(); + params("surfaceComponents", "All")( "gridstep", 1. )("r-radius" , 3.0); + + std::string filename = examplesPath + std::string("/samples/bunny-32.vol"); + auto binary_image = SH3::makeBinaryImage(filename, params ); + auto K = SH3::getKSpace( binary_image, params ); + auto surface = SH3::makeDigitalSurface( binary_image, K, params ); + SH3::Cell2Index c2i; + auto primalSurface = SH3::makePrimalSurfaceMesh(surface); + auto surfels = SH3::getSurfelRange( surface, params); + auto embedder = SH3::getSCellEmbedder( K ); + + + //Need to convert the faces + std::vector> faces; + std::vector positions; + for(auto face= 0 ; face < primalSurface->nbFaces(); ++face) + faces.push_back(primalSurface->incidentVertices( face )); + //Recasting to vector of vertices + positions = primalSurface->positions(); + + auto surfmesh = SurfMesh(positions.begin(), + positions.end(), + faces.begin(), + faces.end()); + + + trace.info()<<"Got "<addFaceVectorQuantity("normals", iinormals); + + // + Eigen::MatrixXd points(surfels.size(),3); + Eigen::MatrixXd normals(surfels.size(),3); + + for(auto i=0; i< surfels.size(); ++i) + { + auto p = embedder(surfels[i]); + auto n = iinormals[i]; + points(i,0) = p(0); + points(i,1) = p(1); + points(i,2) = p(2); + normals(i,0) = n(0); + normals(i,1) = n(1); + normals(i,2) = n(2); - // Initialize polyscope - polyscope::init(); + } + auto pc= polyscope::registerPointCloud("input boundary points", points); + pc->addVectorQuantity("normals", normals); + + + WindingNumbersShape wnshape(points,normals); + + auto lower = binary_image->domain().lowerBound(); + auto upper = binary_image->domain().upperBound(); + + auto resample_h = [&](double h){ - auto iinormals = SHG3::getIINormalVectors(binary_image, surfels, params); - auto psMesh = polyscope::registerSurfaceMesh("input digital surface", positions, faces); - psMesh->addFaceVectorQuantity("normals", iinormals); + RegularPointEmbedder pointEmbedder; + pointEmbedder.init( h ); + Z3i::Point lowerPoint = pointEmbedder.floor( lower ); + Z3i::Point upperPoint = pointEmbedder.ceil( upper ); + Z3i::Domain domain(lowerPoint,upperPoint); + trace.info() <<"Digital domain = "< p(vox[0],vox[1],vox[2]); + p *= h; + queries.row(cpt) = p; + ++cpt; + } + trace.info()<<"Cpt= "<addVectorQuantity("normals", normals); - + trace.info() <<"Number of voxels = "< wnshape(points,normals); + //Digital surface + Z3i::KSpace kspace; + kspace.init(lowerPoint, upperPoint, true); + typedef KSpace::SurfelSet SurfelSet; + typedef SetOfSurfels< KSpace, SurfelSet > MySetOfSurfels; + typedef DigitalSurface< MySetOfSurfels > MyDigitalSurface; + typedef SurfelAdjacency MySurfelAdjacency; - auto lower = binary_image->domain().lowerBound(); - auto upper = binary_image->domain().upperBound(); - auto extend = (upper-lower); + MySurfelAdjacency surfAdj( true ); // interior in all directions. + MySetOfSurfels theSetOfSurfels( kspace, surfAdj ); + Surfaces::sMakeBoundary(theSetOfSurfels.surfelSet(), + kspace, + voxels, + lowerPoint, + upperPoint); + trace.info()<<"Surfel set size= "< pointEmbedder; - pointEmbedder.init( h ); - Z3i::Point lowerPoint = pointEmbedder.floor( lower ); - Z3i::Point upperPoint = pointEmbedder.ceil( upper ); - Z3i::Domain domain(lowerPoint,upperPoint); - trace.info() <<"Digital domain = "< p(vox[0],vox[1],vox[2]); - p *= h; - queries.row(cpt) = p; - ++cpt; - } - trace.info()<<"Cpt= "<>(new MyDigitalSurface(theSetOfSurfels)); + auto primalSurfaceReco = SH3::makePrimalSurfaceMesh(surfPtr); - resample_h(1.0); - resample_h(2.0); //downscaling - resample_h(0.5); //upscaling - resample_h(0.07); //extreme upscaling, 2M vertices + std::vector positionsReco = primalSurfaceReco->positions(); + //Fixing the embedding + std::for_each(std::begin(positionsReco), std::end(positionsReco), [&](RealPoint &p){p=p*h;}); - // Set the callback function - polyscope::state::userCallback = myCallback; - polyscope::show(); - return EXIT_SUCCESS; + std::vector> facesReco; + for(auto face= 0 ; face < primalSurfaceReco->nbFaces(); ++face) + facesReco.push_back(primalSurfaceReco->incidentVertices( face )); + auto psMesh = polyscope::registerSurfaceMesh("Reconstruction "+std::to_string(h), positionsReco, facesReco); + }; + + resample_h(1.0); + resample_h(2.0); //downscaling + resample_h(0.5); //upscaling + //resample_h(0.07); //extreme upscaling, 2M vertices + + // Set the callback function + polyscope::state::userCallback = myCallback; + polyscope::show(); + return EXIT_SUCCESS; } From 78dad6f96967f84ede8abc229681fb194f75018a Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Tue, 14 Nov 2023 14:15:37 +0100 Subject: [PATCH 19/42] upgrade of the documentation --- doc/doxy.config.dox.in | 854 +++-- doc/doxy.config.in | 20 +- .../.github/workflows/publish.yaml | 22 + doc/doxygen-awesome-css-main/.gitignore | 6 + doc/doxygen-awesome-css-main/.npmignore | 3 + doc/doxygen-awesome-css-main/Doxyfile | 2793 +++++++++++++++++ doc/doxygen-awesome-css-main/LICENSE | 21 + doc/doxygen-awesome-css-main/Makefile | 39 + doc/doxygen-awesome-css-main/README.md | 166 + .../docs/customization.md | 115 + .../docs/extensions.md | 236 ++ .../docs/img/darkmode_toggle.png | Bin 0 -> 11523 bytes .../docs/img/fancy_scrollbars_firefox.png | Bin 0 -> 37200 bytes .../docs/img/fancy_scrollbars_webkit.gif | Bin 0 -> 5614878 bytes .../docs/img/fragment_copy_button.png | Bin 0 -> 32871 bytes .../docs/img/interactive_toc_mobile.png | Bin 0 -> 16425 bytes .../docs/img/paragraph_link.png | Bin 0 -> 12629 bytes doc/doxygen-awesome-css-main/docs/tricks.md | 124 + .../doxygen-awesome-darkmode-toggle.js | 157 + .../doxygen-awesome-fragment-copy-button.js | 85 + .../doxygen-awesome-interactive-toc.js | 81 + .../doxygen-awesome-paragraph-link.js | 51 + ...n-awesome-sidebar-only-darkmode-toggle.css | 40 + .../doxygen-awesome-sidebar-only.css | 116 + .../doxygen-awesome-tabs.js | 70 + .../doxygen-awesome.css | 2530 +++++++++++++++ .../doxygen-custom/custom-alternative.css | 54 + .../doxygen-custom/custom.css | 101 + .../doxygen-custom/header.html | 90 + .../toggle-alternative-theme.js | 12 + .../img/screenshot.png | Bin 0 -> 216518 bytes .../img/testimage.png | Bin 0 -> 4792 bytes .../img/theme-variants.drawio.svg | 250 ++ .../include/MyLibrary/example.hpp | 156 + .../include/MyLibrary/subclass-example.hpp | 46 + doc/doxygen-awesome-css-main/logo.drawio.svg | 1 + doc/doxygen-awesome-css-main/package.json | 34 + 37 files changed, 7981 insertions(+), 292 deletions(-) create mode 100644 doc/doxygen-awesome-css-main/.github/workflows/publish.yaml create mode 100644 doc/doxygen-awesome-css-main/.gitignore create mode 100644 doc/doxygen-awesome-css-main/.npmignore create mode 100644 doc/doxygen-awesome-css-main/Doxyfile create mode 100644 doc/doxygen-awesome-css-main/LICENSE create mode 100644 doc/doxygen-awesome-css-main/Makefile create mode 100644 doc/doxygen-awesome-css-main/README.md create mode 100644 doc/doxygen-awesome-css-main/docs/customization.md create mode 100644 doc/doxygen-awesome-css-main/docs/extensions.md create mode 100644 doc/doxygen-awesome-css-main/docs/img/darkmode_toggle.png create mode 100644 doc/doxygen-awesome-css-main/docs/img/fancy_scrollbars_firefox.png create mode 100644 doc/doxygen-awesome-css-main/docs/img/fancy_scrollbars_webkit.gif create mode 100644 doc/doxygen-awesome-css-main/docs/img/fragment_copy_button.png create mode 100644 doc/doxygen-awesome-css-main/docs/img/interactive_toc_mobile.png create mode 100644 doc/doxygen-awesome-css-main/docs/img/paragraph_link.png create mode 100644 doc/doxygen-awesome-css-main/docs/tricks.md create mode 100644 doc/doxygen-awesome-css-main/doxygen-awesome-darkmode-toggle.js create mode 100644 doc/doxygen-awesome-css-main/doxygen-awesome-fragment-copy-button.js create mode 100644 doc/doxygen-awesome-css-main/doxygen-awesome-interactive-toc.js create mode 100644 doc/doxygen-awesome-css-main/doxygen-awesome-paragraph-link.js create mode 100644 doc/doxygen-awesome-css-main/doxygen-awesome-sidebar-only-darkmode-toggle.css create mode 100644 doc/doxygen-awesome-css-main/doxygen-awesome-sidebar-only.css create mode 100644 doc/doxygen-awesome-css-main/doxygen-awesome-tabs.js create mode 100644 doc/doxygen-awesome-css-main/doxygen-awesome.css create mode 100644 doc/doxygen-awesome-css-main/doxygen-custom/custom-alternative.css create mode 100644 doc/doxygen-awesome-css-main/doxygen-custom/custom.css create mode 100644 doc/doxygen-awesome-css-main/doxygen-custom/header.html create mode 100644 doc/doxygen-awesome-css-main/doxygen-custom/toggle-alternative-theme.js create mode 100644 doc/doxygen-awesome-css-main/img/screenshot.png create mode 100644 doc/doxygen-awesome-css-main/img/testimage.png create mode 100644 doc/doxygen-awesome-css-main/img/theme-variants.drawio.svg create mode 100644 doc/doxygen-awesome-css-main/include/MyLibrary/example.hpp create mode 100644 doc/doxygen-awesome-css-main/include/MyLibrary/subclass-example.hpp create mode 100644 doc/doxygen-awesome-css-main/logo.drawio.svg create mode 100644 doc/doxygen-awesome-css-main/package.json diff --git a/doc/doxy.config.dox.in b/doc/doxy.config.dox.in index c70ac1c6a7..ca61e1a5a0 100644 --- a/doc/doxy.config.dox.in +++ b/doc/doxy.config.dox.in @@ -1,4 +1,4 @@ -# Doxyfile 1.8.15 +# Doxyfile 1.9.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -12,6 +12,16 @@ # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options @@ -60,16 +70,28 @@ PROJECT_LOGO = OUTPUT_DIRECTORY = . -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes -# performance problems for the file system. +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = NO +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode @@ -81,26 +103,18 @@ ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English -# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all generated output in the proper direction. -# Possible values are: None, LTR, RTL and Context. -# The default value is: None. - -OUTPUT_TEXT_DIRECTION = None - # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. @@ -187,6 +201,16 @@ SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus @@ -207,6 +231,14 @@ QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. @@ -230,27 +262,21 @@ TAB_SIZE = 8 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:\n" +# "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines (in the resulting output). You can put ^^ in the value part of an -# alias to insert a newline as if a physical newline was in the original file. -# When you need a literal { or } or , in the value part of an alias you have to -# escape them by means of a backslash (\), this can lead to conflicts with the -# commands \{ and \} for these it is advised to use the version @{ and @} or use -# a double escape (\\{ and \\}) +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) ALIASES = "advanced=\par Advanced: ^^" \ "writers=\par Author(s) of this documentation: ^^" \ "managers=\par Package managers: ^^" -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all @@ -291,19 +317,22 @@ OPTIMIZE_OUTPUT_SLICE = NO # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, -# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is -# Fortran), use: inc=Fortran f=C. +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. EXTENSION_MAPPING = @@ -321,11 +350,22 @@ MARKDOWN_SUPPORT = YES # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 0. +# Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 3 +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN + # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or @@ -437,6 +477,27 @@ TYPEDEF_HIDES_STRUCT = NO LOOKUP_CACHE_SIZE = 0 +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = YES + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -457,6 +518,12 @@ EXTRACT_ALL = YES EXTRACT_PRIVATE = YES +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. @@ -494,6 +561,13 @@ EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation @@ -505,14 +579,15 @@ HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. +# declarations. If set to NO, these declarations will be included in the +# documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO @@ -531,12 +606,20 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. CASE_SENSE_NAMES = YES @@ -554,6 +637,12 @@ HIDE_SCOPE_NAMES = NO HIDE_COMPOUND_REFERENCE= NO +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -711,7 +800,8 @@ FILE_VERSION_FILTER = # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE @@ -757,24 +847,50 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. If -# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = NO +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. # The default value is: NO. WARN_AS_ERROR = NO @@ -785,13 +901,27 @@ WARN_AS_ERROR = NO # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). WARN_LOGFILE = @top_bindir@/doxygen.dox.log @@ -814,12 +944,23 @@ INPUT = @top_srcdir@/src \ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: https://www.gnu.org/software/libiconv/) for the list of -# possible encodings. +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. @@ -828,11 +969,15 @@ INPUT_ENCODING = UTF-8 # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, -# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, +# *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, *.php, +# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be +# provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.dox @@ -871,10 +1016,7 @@ EXCLUDE_PATTERNS = # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* +# ANamespace::AClass, ANamespace::*Test EXCLUDE_SYMBOLS = @@ -935,6 +1077,11 @@ IMAGE_PATH = @top_srcdir@/src/DGtal/doc/images \ # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. @@ -976,6 +1123,15 @@ FILTER_SOURCE_PATTERNS = USE_MDFILE_AS_MAINPAGE = +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- @@ -1073,17 +1229,11 @@ VERBATIM_HEADERS = YES ALPHABETICAL_INDEX = YES -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = @@ -1162,7 +1312,12 @@ HTML_STYLESHEET = # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = @top_srcdir@/doc/modern-doxygen-blue.css @@ -1177,9 +1332,22 @@ HTML_EXTRA_STYLESHEET = @top_srcdir@/doc/modern-doxygen-blue.css HTML_EXTRA_FILES = +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see +# this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. @@ -1189,7 +1357,7 @@ HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A +# in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1207,20 +1375,11 @@ HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that -# are dynamically created via Javascript. If disabled, the navigation index will +# are dynamically created via JavaScript. If disabled, the navigation index will # consists of multiple levels of tabs that are statically embedded in every HTML -# page. Disable this option to support browsers that do not have Javascript, +# page. Disable this option to support browsers that do not have JavaScript, # like the Qt help browser. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1235,6 +1394,13 @@ HTML_DYNAMIC_MENUS = YES HTML_DYNAMIC_SECTIONS = NO +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to @@ -1250,10 +1416,11 @@ HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: https://developer.apple.com/xcode/), introduced with OSX -# 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # genXcode/_index.html for more information. @@ -1270,6 +1437,13 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1295,8 +1469,12 @@ DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML @@ -1326,7 +1504,7 @@ CHM_FILE = HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). +# (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1353,6 +1531,16 @@ BINARY_TOC = NO TOC_EXPAND = NO +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help @@ -1371,7 +1559,8 @@ QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1379,8 +1568,8 @@ QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- -# folders). +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1388,30 +1577,30 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = @@ -1454,16 +1643,28 @@ DISABLE_INDEX = NO # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # @@ -1488,6 +1689,24 @@ TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML @@ -1497,19 +1716,14 @@ EXT_LINKS_IN_WINDOW = NO FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. -FORMULA_TRANSPARENT = YES +FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# https://www.mathjax.org) which uses client side Javascript for the rendering +# https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path @@ -1519,11 +1733,29 @@ FORMULA_TRANSPARENT = YES USE_MATHJAX = YES +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + # When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1536,15 +1768,21 @@ MATHJAX_FORMAT = HTML-CSS # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/MathJax.js?config=TeX-MML-AM_CHTML # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = TeX/AMSmath \ @@ -1552,7 +1790,8 @@ MATHJAX_EXTENSIONS = TeX/AMSmath \ # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1580,7 +1819,7 @@ MATHJAX_CODEFILE = SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. There +# implemented using a web server instead of a web client using JavaScript. There # are two flavors of web server based searching depending on the EXTERNAL_SEARCH # setting. When disabled, doxygen will generate a PHP script for searching and # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing @@ -1599,7 +1838,8 @@ SERVER_BASED_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). +# Xapian (see: +# https://xapian.org/). # # See the section "External Indexing and Searching" for details. # The default value is: NO. @@ -1612,8 +1852,9 @@ EXTERNAL_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). See the section "External Indexing and -# Searching" for details. +# Xapian (see: +# https://xapian.org/). See the section "External Indexing and Searching" for +# details. # This tag requires that the tag SEARCHENGINE is set to YES. SEARCHENGINE_URL = @@ -1722,29 +1963,31 @@ PAPER_TYPE = a4wide EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. +# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for +# the generated LaTeX document. The header should contain everything until the +# first chapter. If it is left blank doxygen will generate a standard header. It +# is highly recommended to start with a default header using +# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty +# and then modify the file new_header.tex. See also section "Doxygen usage" for +# information on how to generate the default header that doxygen normally uses. # -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. +# Note: Only use a user-defined header if you know what you are doing! +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. The following +# commands have a special meaning inside the header (and footer): For a +# description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See +# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for +# the generated LaTeX document. The footer should contain everything after the +# last chapter. If it is left blank doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! +# special commands can be used inside the footer. See also section "Doxygen +# usage" for information on how to generate the default footer that doxygen +# normally uses. Note: Only use a user-defined footer if you know what you are +# doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = @@ -1777,18 +2020,26 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = no -# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate -# the PDF file directly from the LaTeX files. Set this option to YES, to get a -# higher quality PDF documentation. +# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as +# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX +# files. Set this option to YES, to get a higher quality PDF documentation. +# +# See also section LATEX_CMD_NAME for selecting the engine. # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. USE_PDFLATEX = yes -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode -# command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. +# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error. +# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch +# mode nothing is printed on the terminal, errors are scrolled as if is +# hit at every error; missing files that TeX tries to input or request from +# keyboard input (\read on a not open input stream) cause the job to abort, +# NON_STOP In nonstop mode the diagnostic message will appear on the terminal, +# but there is no possibility of user interaction just like in batch mode, +# SCROLL In scroll mode, TeX will stop only for missing files to input or if +# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at +# each error, asking for user intervention. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1801,16 +2052,6 @@ LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = no -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See # https://en.wikipedia.org/wiki/BibTeX and \cite for more info. @@ -1819,14 +2060,6 @@ LATEX_SOURCE_CODE = NO LATEX_BIB_STYLE = alpha -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_TIMESTAMP = NO - # The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) # path from which the emoji images will be read. If a relative path is entered, # it will be relative to the LATEX_OUTPUT directory. If left blank the @@ -1891,16 +2124,6 @@ RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code -# with syntax highlighting in the RTF output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_SOURCE_CODE = NO - #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- @@ -1997,27 +2220,44 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the -# program listings (including syntax highlighting and cross-referencing -# information) to the DOCBOOK output. Note that enabling this will significantly -# increase the size of the DOCBOOK output. -# The default value is: NO. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_PROGRAMLISTING = NO - #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an -# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures +# AutoGen Definitions (see https://autogen.sourceforge.net/) file that captures # the structure of the code including all documentation. Note that this feature # is still experimental and incomplete at the moment. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# Configuration options related to Sqlite3 output +#--------------------------------------------------------------------------- + +# If the GENERATE_SQLITE3 tag is set to YES doxygen will generate a Sqlite3 +# database with symbols found by doxygen stored in tables. +# The default value is: NO. + +GENERATE_SQLITE3 = NO + +# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be +# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put +# in front of it. +# The default directory is: sqlite3. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_OUTPUT = sqlite3 + +# The SQLITE3_OVERWRITE_DB tag is set to YES, the existing doxygen_sqlite3.db +# database file will be recreated with each doxygen run. If set to NO, doxygen +# will warn if an a database file is already found and not modify it. +# The default value is: YES. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_RECREATE_DB = YES + #--------------------------------------------------------------------------- # Configuration options related to the Perl module output #--------------------------------------------------------------------------- @@ -2092,7 +2332,8 @@ SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the -# preprocessor. +# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of +# RECURSIVE has no effect here. # This tag requires that the tag SEARCH_INCLUDES is set to YES. INCLUDE_PATH = @@ -2160,15 +2401,15 @@ TAGFILES = Board-tagfile \ GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES, all external class will be listed in -# the class index. If set to NO, only the inherited external classes will be -# listed. +# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces +# will be listed in the class and namespace index. If set to NO, only the +# inherited external classes will be listed. # The default value is: NO. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will be +# in the topic index. If set to NO, only the current project's groups will be # listed. # The default value is: YES. @@ -2181,41 +2422,10 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of 'which perl'). -# The default file (with absolute path) is: /usr/bin/perl. - -PERL_PATH = /usr/bin/perl - #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to diagram generator tools #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = NO - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see: -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# You can include diagrams made with dia in doxygen documentation. Doxygen will -# then run dia to produce the diagram and insert it in the documentation. The -# DIA_PATH tag allows you to specify the directory where the dia binary resides. -# If left empty dia is assumed to be found in the default search path. - -DIA_PATH = - # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. # The default value is: YES. @@ -2224,7 +2434,7 @@ HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz (see: -# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. The other options in this section have no effect if this option is # set to NO # The default value is: NO. @@ -2241,49 +2451,73 @@ HAVE_DOT = @HAVE_DOT@ DOT_NUM_THREADS = 0 -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. +# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of +# subgraphs. When you want a differently looking font in the dot files that +# doxygen generates you can specify fontname, fontcolor and fontsize attributes. +# For details please see Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_COMMON_ATTR = "fontname=FreeSans,fontsize=10" + +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTNAME = FreeSans +DOT_EDGE_ATTR = "labelfontname=FreeSans,labelfontsize=10" -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTSIZE = 10 +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. # This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will +# generate a graph for each documented class showing the direct and indirect +# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and +# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case +# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the +# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used. +# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance +# relations will be shown as texts / links. +# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = NO # If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a # graph for each documented class showing the direct and indirect implementation # dependencies (inheritance, containment, and class references variables) of the -# class with other documented classes. +# class with other documented classes. Explicit enabling a collaboration graph, +# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the +# command \collaborationgraph. Disabling a collaboration graph can be +# accomplished by means of the command \hidecollaborationgraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. COLLABORATION_GRAPH = NO # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. +# groups, showing the direct groups dependencies. Explicit enabling a group +# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means +# of the command \groupgraph. Disabling a directory graph can be accomplished by +# means of the command \hidegroupgraph. See also the chapter Grouping in the +# manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2306,10 +2540,32 @@ UML_LOOK = NO # but if the number exceeds 15, the total amount of fields shown is limited to # 10. # Minimum value: 0, maximum value: 100, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. +# This tag requires that the tag UML_LOOK is set to YES. UML_LIMIT_NUM_FIELDS = 10 +# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will wrapped across multiple lines. Some heuristics are apply +# to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # collaboration graphs will show the relations between templates and their # instances. @@ -2321,7 +2577,9 @@ TEMPLATE_RELATIONS = NO # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to # YES then doxygen will generate a graph for each documented file showing the # direct and indirect include dependencies of the file with other documented -# files. +# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO, +# can be accomplished by means of the command \includegraph. Disabling an +# include graph can be accomplished by means of the command \hideincludegraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2330,7 +2588,10 @@ INCLUDE_GRAPH = NO # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are # set to YES then doxygen will generate a graph for each documented file showing # the direct and indirect include dependencies of the file with other documented -# files. +# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set +# to NO, can be accomplished by means of the command \includedbygraph. Disabling +# an included by graph can be accomplished by means of the command +# \hideincludedbygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2370,16 +2631,26 @@ GRAPHICAL_HIERARCHY = NO # If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the # dependencies a directory has on other directories in a graphical way. The # dependency relations are determined by the #include relations between the -# files in the directories. +# files in the directories. Explicit enabling a directory graph, when +# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command +# \directorygraph. Disabling a directory graph can be accomplished by means of +# the command \hidedirectorygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. DIRECTORY_GRAPH = NO +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: -# http://www.graphviz.org/)). +# https://www.graphviz.org/)). # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). @@ -2416,11 +2687,12 @@ DOT_PATH = DOTFILE_DIRS = -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the \mscfile -# command). +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. -MSCFILE_DIRS = +DIA_PATH = # The DIAFILE_DIRS tag can be used to specify one or more directories that # contain dia files that are included in the documentation (see the \diafile @@ -2429,10 +2701,10 @@ MSCFILE_DIRS = DIAFILE_DIRS = # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. PLANTUML_JAR_PATH = @@ -2470,18 +2742,6 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = NO - # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support @@ -2494,14 +2754,34 @@ DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = NO -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. +# +# Note: This setting is not only used for dot files but also for msc temporary +# files. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. DOT_CLEANUP = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. If the MSCGEN_TOOL tag is left empty (the default), then doxygen will +# use a built-in version of mscgen tool to produce the charts. Alternatively, +# the MSCGEN_TOOL tag can also specify the name an external tool. For instance, +# specifying prog as the value, doxygen will call the tool as prog -T +# -o . The external tool should support +# output file formats "png", "eps", "svg", and "ismap". + +MSCGEN_TOOL = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = diff --git a/doc/doxy.config.in b/doc/doxy.config.in index 01f0b1314a..ab41383fbf 100644 --- a/doc/doxy.config.in +++ b/doc/doxy.config.in @@ -326,7 +326,7 @@ MARKDOWN_SUPPORT = YES # Minimum value: 0, maximum value: 99, default value: 0. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. -TOC_INCLUDE_HEADINGS = 3 +TOC_INCLUDE_HEADINGS = 2 # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can @@ -1173,7 +1173,17 @@ HTML_STYLESHEET = # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = @top_srcdir@/doc/modern-doxygen-blue.css +HTML_EXTRA_STYLESHEET = @top_srcdir@/doc/modern-doxygen-blue.css @top_srcdir@/doc/doxygen-awesome.css + +GENERATE_TREEVIEW = YES # required! +DISABLE_INDEX = NO +FULL_SIDEBAR = NO +HTML_EXTRA_STYLESHEET = @top_srcdir@/doc/doxygen-awesome-css-main/doxygen-awesome.css \ + @top_srcdir@/doc/ddoxygen-awesome-css-main/oxygen-awesome-sidebar-only.css +HTML_COLORSTYLE = LIGHT # required with Doxygen >= 1.9.5 + +#@top_srcdir@/doc/modern-doxygen-blue.css \ + # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1202,7 +1212,7 @@ HTML_COLORSTYLE_HUE = 220 # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE_SAT = 100 +#HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 @@ -1213,7 +1223,7 @@ HTML_COLORSTYLE_SAT = 100 # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE_GAMMA = 80 +#HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this @@ -1470,7 +1480,7 @@ DISABLE_INDEX = NO # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_TREEVIEW = NO +#GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. diff --git a/doc/doxygen-awesome-css-main/.github/workflows/publish.yaml b/doc/doxygen-awesome-css-main/.github/workflows/publish.yaml new file mode 100644 index 0000000000..331822fd73 --- /dev/null +++ b/doc/doxygen-awesome-css-main/.github/workflows/publish.yaml @@ -0,0 +1,22 @@ +name: publish +on: + release: + types: [published] +jobs: + deploy: + runs-on: ubuntu-20.04 + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: set version + run: echo "PROJECT_NUMBER = `git describe --tags`" >> Doxyfile + - name: Generate Documentation + uses: mattnotmitt/doxygen-action@edge + - name: Publish generated content to GitHub Pages + uses: tsunematsu21/actions-publish-gh-pages@v1.0.2 + with: + dir: docs/html + branch: gh-pages + token: ${{ secrets.ACCESS_TOKEN }} \ No newline at end of file diff --git a/doc/doxygen-awesome-css-main/.gitignore b/doc/doxygen-awesome-css-main/.gitignore new file mode 100644 index 0000000000..60db5bc3c3 --- /dev/null +++ b/doc/doxygen-awesome-css-main/.gitignore @@ -0,0 +1,6 @@ +docs/html +.DS_Store +.idea + +node_modules +*.tgz diff --git a/doc/doxygen-awesome-css-main/.npmignore b/doc/doxygen-awesome-css-main/.npmignore new file mode 100644 index 0000000000..90eb4cae88 --- /dev/null +++ b/doc/doxygen-awesome-css-main/.npmignore @@ -0,0 +1,3 @@ +* +!doxygen-awesome* + diff --git a/doc/doxygen-awesome-css-main/Doxyfile b/doc/doxygen-awesome-css-main/Doxyfile new file mode 100644 index 0000000000..860e32f613 --- /dev/null +++ b/doc/doxygen-awesome-css-main/Doxyfile @@ -0,0 +1,2793 @@ +# Doxyfile 1.9.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "Doxygen Awesome" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Modern Doxygen theme" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = ./logo.drawio.svg + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:^^" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 5 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = include \ + README.md \ + docs/extensions.md \ + docs/customization.md \ + docs/tricks.md + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f18 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf \ + *.ice + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# ANamespace::AClass, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = img \ + docs/img + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = README.md + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which doxygen's built-in parser lacks the necessary type information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS +# tag is set to YES then doxygen will add the directory of each input to the +# include path. +# The default value is: YES. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_ADD_INC_PATHS = YES + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = doxygen-custom/header.html + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = doxygen-awesome.css \ + doxygen-custom/custom.css \ + doxygen-awesome-sidebar-only.css \ + doxygen-awesome-sidebar-only-darkmode-toggle.css \ + doxygen-custom/custom-alternative.css + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = doxygen-awesome-darkmode-toggle.js \ + doxygen-awesome-fragment-copy-button.js \ + doxygen-awesome-paragraph-link.js \ + doxygen-custom/toggle-alternative-theme.js \ + doxygen-awesome-interactive-toc.js \ + doxygen-awesome-tabs.js + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = LIGHT + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a color-wheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 209 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use gray-scales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 255 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 113 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 335 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see https://docs.mathjax.org/en/v2.7-latest/tex.html +# #tex-and-latex-extensions): +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /