// =====================================================================================================================
//  fennec, a free and open source game engine
//  Copyright © 2025 - 2026  Medusa Slockbower
//
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This 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 <https://www.gnu.org/licenses/>.
// =====================================================================================================================

///
/// \file fennec/math/math.h
/// \brief fennec Math Library
///
///
/// \details This header includes the following modules of \ref fennec_math :
///           - \ref fennec_math_scalar
///           - \ref fennec_math_vector
///           - \ref fennec_math_trigonometric
///
/// \author Medusa Slockbower
///
/// \copyright Copyright © 2025 - 2026 Medusa Slockbower ([GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html))
///
///


#ifndef FENNEC_MATH_H
#define FENNEC_MATH_H

///
///
///
/// \page fennec_math Math Library
///
/// \brief The fennec Math Library.
///        Includes various types and functions related to mathematics, predominantly linear algebra.
///
/// \code #include <fennec/math/math.h> \endcode
///
/// The fennecMath Library is composed of the modules listed in below.
/// The overarching goal of this math library is to implement the math types and functions of the
/// [OpenGL 4.6 Shading Language Specification](https://registry.khronos.org/OpenGL/specs/gl/GLSLangSpec.4.60.pdf).
///
/// The data types are influenced by the GLM and CxxSwizzle implementations. The resulting structures were optimized
/// to decrease compilation times and allow the compiler to more easily optimize the resulting binary code.
///
/// - \subpage fennec_math_topics "Topics"
///		- \ref fennec_math_set_theory
///		- \ref fennec_math_swizzle
/// - \subpage fennec_math_data_types "Data Types"
/// 	- \ref fennec_math_scalar
/// 	- \ref fennec_math_vector
/// 	- \ref fennec_math_matrix
/// - \subpage fennec_math_functions "Functions"
/// 	- \ref fennec_math_common
/// 	- \ref fennec_math_exponential
/// 	- \ref fennec_math_geometric
/// 	- \ref fennec_math_relational
/// 	- \ref fennec_math_trigonometric
/// - \subpage fennec_math_extensions "Extensions"
///     - \ref fennec_math_ext_constants
///
///

///
/// \page fennec_math_topics Topics
/// - \subpage fennec_math_set_theory
/// - \subpage fennec_math_swizzle
///

///
/// \page fennec_math_data_types Data Types
/// - \subpage fennec_math_scalar
/// - \subpage fennec_math_vector
/// - \subpage fennec_math_matrix
///

///
/// \page fennec_math_functions Functions
/// - \subpage fennec_math_common
/// - \subpage fennec_math_exponential
/// - \subpage fennec_math_geometric
/// - \subpage fennec_math_relational
/// - \subpage fennec_math_trigonometric
///

///
/// \page fennec_math_extensions Extensions
/// - \subpage fennec_math_ext_constants
///

///
///
///
/// \page fennec_math_set_theory Set Theory
///
/// Binary Mathematics, like most branches of Mathematics, is built upon Set Theory. Set Theory is
/// the branch of Mathematics that studies Sets. Sets contain a collection of elements which may be numbers, as well as other
/// mathematical structures, types, or values.
///
/// Set definitions for all mathematical structures in the \ref fennec_math "Fennec Math Library"  are present in
/// their respective pages.
///
///

// Base Scalar Types
#include <fennec/math/scalar.h>

// Vector Types
#include <fennec/math/vector.h>
#include <fennec/math/vector_traits.h>
#include <fennec/math/swizzle.h>

// Matrix Types
#include <fennec/math/matrix.h>

// Built-in Functions
#include <fennec/math/common.h>
#include <fennec/math/exponential.h>
#include <fennec/math/geometric.h>
#include <fennec/math/relational.h>
#include <fennec/math/trigonometric.h>

// Common Extensions
#include <fennec/math/ext/constants.h>


#endif // FENNEC_MATH_H
