diff --git a/CMakeLists.txt b/CMakeLists.txt index 161ae90..c4a7b0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,7 +44,7 @@ add_library(fennec STATIC # MEMORY =============================================================================================================== include/fennec/memory/allocator.h - include/fennec/memory/bits.h + include/fennec/lang/bits.h include/fennec/memory/memory.h include/fennec/memory/new.h source/memory/new.cpp include/fennec/memory/pointers.h diff --git a/PLANNING.md b/PLANNING.md new file mode 100644 index 0000000..9d56c51 --- /dev/null +++ b/PLANNING.md @@ -0,0 +1,203 @@ + + +# Planning Documentation for fennec + +## Table of Contents + + 1. [Introduction](#introduction) + 2. [C++ Language](#c-language) + 3. [Math Library](#math-library) + + +## Introduction + +This file serves as a general planning document for engine structure, systems, pipelines, and implementation. + + +Implementations of core engine systems should strive to be `O(1)` in implementations, +both in terms of runtime and memory performance. This is obviously not a realistic goal, +so rather than the entire engine striving to be `O(1)` we should more specifically look +at achieving `O(1)` performance on hot paths. + +Functions should be highly verbose, and in debug mode any bugprone or erroneous behaviour should throw +assertions. **DO NOT USE EXCEPTIONS**. + +System implementations should be independent of architecture or platforms. i.e. the code of the graphics system should +not care if OpenGL or Vulkan is used and should not use any direct calls to OpenGL or Vulkan. + + +## C++ Language Library (`lang`) + +Implement header files for standard functions relating to the C++ Language. +So far this is implemented on an as-needed basis. + + +## Math Library (`math`) + +Implement math functions according to the [OpenGL 4.6 Shading Language Specification](https://registry.khronos.org/OpenGL/specs/gl/GLSLangSpec.4.60.pdf). + +Additional extensions should be implemented to provide standard definitions for functions predominantly related +to Linear Algebra, Mathematical Analysis, and Discrete Analysis. Additional extensions will be implemented on a +as-needed basis. + + +## Memory Library (`memory`) + +Implement headers related to memory allocation in C++. + + * Smart Pointers + - Memory Allocation + + +## Language Processing (`proclang`) + +Pronounced [pɹˈɒkh,læŋ](https://itinerarium.github.io/phoneme-synthesis/?w=pɹˈɒkh,læŋ) + +No, this won't include Machine Learning, it will mostly include tools for processing human-readable files. +fennec should be able to use Doxygen and LaTeX externally. Consider including binaries with releases. + + * String Analysis (`proclang/strings`) + * Search + * Manipulation + * Delimiting + * Regex + + - File Formats (`proclang/formats`) + - Serialization + - JSON + - HTML + - XML + - YAML + - Configuration + - INI + - TOML + - Documents + - ODF + - Markdown + - PDF + - Spreadsheets & Tables + - ODS + - CSV + +**MAYBE** + * Compilation (`proclang/code`) + * Lexical Analysis + * Syntax Analysis + * Semantic Analysis + * Intermediate Code Generation + * Optimization + * Target Code Generation + + +## Core (`core`) + +This will be the core of the engine. + + - Event System + - Core Engine Loop + - System Manager + +The priority sequence of the main systems is as follows: + +**3D Systems will apply *before* their 2D Variants** + + - **Update** + - Scripts + - AI + - **Physics** + - Newtonian Commit + - Apply Forces (Updates Acceleration and Torque) + - Apply Torque & Acceleration (Updates Velocities) + - Apply Velocities (Updates Position and Rotation) + - Constraint Resolution + - Collision Detection + - Collision Resolution (Adjust for Clipping) + - Soft Bodies resolve before Rigid Bodies + - Collision Response + - Calculate Forces + - + - **Graphics** + +## 3D Scene (`scene3d`) + +* In-Array Directed Tree + * Elegant method for providing `O(1)` insertions and `O(log(n))` deletions. +* Bounding Volume Hierarchy + * Octree + + +## 3D Graphics (`gfx3d`) + +Links: + - https://en.wikipedia.org/wiki/Octree + - https://www.adriancourreges.com/blog/2015/11/02/gta-v-graphics-study/ + - https://learnopengl.com/PBR/Lighting + - https://learnopengl.com/PBR/IBL/Diffuse-irradiance + - https://en.wikipedia.org/wiki/Schlick%27s_approximation + - https://pixelandpoly.com/ior.html + - https://developer.download.nvidia.com/SDK/10/opengl/screenshots/samples/dual_depth_peeling.html + +**DirectX will never have official support.** If you would like to make a fork, have at it, but know I will hold a deep disdain for you. + +This is the set of stages for the graphics pipeline that runs every frame: + + - LOD Selection + - Visibility Buffer & Culling + + * G-Buffer Pass + * Depth - Stencil + * 24-Bit Depth Buffer + * 8-Bit Stencil Buffer, used to represent the lighting model. + * Diffuse - RGB8 + * Emission - RGB8 + * Normal - RGB8 + * Specular - RGB8 + * R → Roughness + * G → Specularity (sometimes called metallicism) + * B → Index of Refraction (IOR) + + - Lighting Buffer - RGB16 + - Lighting Pass + - Generate Dynamic Shadows + - Generate Dynamic Reflections (Optional) + - SSAO (Optional) + - Apply Lighting Model + + * Forward Pass + * Translucent Materials + * Materials with Forward Shading enabled. + + - Post Processing + - Depth of Field (Optional) + - Bloom (Optional) + - Tonemapping (Optional) + - HDR Correction + +## 3D Physics `(physics3d)` + +Links: + - https://www.researchgate.net/publication/264839743_Simulating_Ocean_Water + - https://arxiv.org/pdf/2109.00104 + - https://www.youtube.com/watch?v=rSKMYc1CQHE + +Systems + + * Rigid Body System + - Particle Physics + * Soft Body Physics + * Elastics → Finite Element Simulation + * Cloth → Position-Based Dynamics + * Water + * Oceans → iWave + * Reasoning: iWave provides interactive lightweight fluid dynamics suitable for flat planes of water. +

+ + * 3D Fluid Dynamics → Smoothed-Particle Hydrodynamics + * Reasoning: This is the simplest method for simulating 3D bodies of water. This should exclusively be + used for small scale simulations where self-interactive fluids are necessary. I.E. pouring water into + a glass. +

+ + * 2D Fluid Dynamics → Force-Based Dynamics + * Reasoning: This model, like iWave, provides lightweight interactive fluid dynamics, but is more easily + adapted to flowing surfaces such as streams and rivers. \ No newline at end of file diff --git a/README.md b/README.md index 2b9f76a..23e86e8 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ fennec Standards: In the case of global functions, helpers should be placed in a similarly named file in a subdirectory and namespace called `detail`. Helper functions should be documented with C-Style comments, however it is not necessary to provide Doxygen documentation. + - **DO NOT USE C++ EXCEPTIONS** they will not be supported because they are shit. No, I won't elaborate. +
The C++ stdlib is reimplemented in the fennec engine. diff --git a/include/fennec/memory/bits.h b/include/fennec/lang/bits.h similarity index 94% rename from include/fennec/memory/bits.h rename to include/fennec/lang/bits.h index db1881e..e9794b7 100644 --- a/include/fennec/memory/bits.h +++ b/include/fennec/lang/bits.h @@ -17,8 +17,8 @@ // ===================================================================================================================== -#ifndef FENNEC_MEMORY_BITS_H -#define FENNEC_MEMORY_BITS_H +#ifndef FENNEC_LANG_BITS_H +#define FENNEC_LANG_BITS_H #include #include @@ -48,4 +48,4 @@ constexpr ToT bit_cast(const FromT& from) } -#endif // FENNEC_MEMORY_BITS_H +#endif // FENNEC_LANG_BITS_H diff --git a/include/fennec/lang/float.h b/include/fennec/lang/float.h index 6cce568..96c5fa1 100644 --- a/include/fennec/lang/float.h +++ b/include/fennec/lang/float.h @@ -30,7 +30,7 @@ #ifndef FENNEC_LANG_FLOAT_H #define FENNEC_LANG_FLOAT_H -#include +#include #define FLT_HAS_INFINITY 1 #define FLT_HAS_QUIET_NAN 1 diff --git a/include/fennec/math/common.h b/include/fennec/math/common.h index eee217d..4654b2c 100644 --- a/include/fennec/math/common.h +++ b/include/fennec/math/common.h @@ -276,7 +276,7 @@ #include #include -#include +#include <../lang/bits.h> namespace fennec {