diff --git a/PLANNING.md b/PLANNING.md
index 9d56c51..a1258be 100644
--- a/PLANNING.md
+++ b/PLANNING.md
@@ -5,8 +5,20 @@
## Table of Contents
1. [Introduction](#introduction)
- 2. [C++ Language](#c-language)
- 3. [Math Library](#math-library)
+ 2. [TODO](#todo)
+ 3. [C++ Language](#c-language-library-lang)
+ 4. [Math Library](#math-library-math)
+ 5. [Memory Library](#memory-library-memory)
+ 6. [Containers Library](#containers-containers)
+ 7. [Language Processing](#language-processing-proclang)
+ 8. [Core](#core-core)
+ 1. [Tick](#tick)
+ 2. [Frame](#frame)
+ 9. [Scene](#scene-scene)
+ 10. [3D Graphics](#3d-graphics-gfx3d)
+ 11. [3D Physics](#3d-physics-physics3d)
+ 12. [Artificial Intelligence](#artificial-intelligence-ai)
+
## Introduction
@@ -26,10 +38,26 @@ System implementations should be independent of architecture or platforms. i.e.
not care if OpenGL or Vulkan is used and should not use any direct calls to OpenGL or Vulkan.
+
+
+
+## TODO
+
+ - 2D Graphics (`gfx2d`)
+ - 2D Physics (`physics2d`)
+ - 2D & 3D Audio (`audio`)
+
+
+
+
+
## 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.
+So far this is implemented on an as-needed basis. A full implementation should be worked on continuously.
+
+
+
## Math Library (`math`)
@@ -41,6 +69,9 @@ to Linear Algebra, Mathematical Analysis, and Discrete Analysis. Additional exte
as-needed basis.
+
+
+
## Memory Library (`memory`)
Implement headers related to memory allocation in C++.
@@ -49,6 +80,22 @@ Implement headers related to memory allocation in C++.
- Memory Allocation
+
+
+## Containers (`containers`)
+
+All containers of the [C++ Standard Library](https://cppreference.com/w/cpp/container.html) should be implemented.
+
+Here are essential data-structures not specified in the C++ stdlib:
+ - Graph → AI `graph`
+ - Necessary for 2D and 3D navigation.
+ - Rooted Directed Tree `rd_tree`
+ - Defines the scene structure.
+
+
+
+
+
## Language Processing (`proclang`)
Pronounced [pɹˈɒkh,læŋ](https://itinerarium.github.io/phoneme-synthesis/?w=pɹˈɒkh,læŋ)
@@ -78,6 +125,14 @@ fennec should be able to use Doxygen and LaTeX externally. Consider including bi
- Spreadsheets & Tables
- ODS
- CSV
+ - Graphics Formats
+ - BMP
+ - JPG
+ - PNG
+ - TIFF
+ - DDS
+ - Wavefront OBJ
+ - FBX
**MAYBE**
* Compilation (`proclang/code`)
@@ -89,6 +144,9 @@ fennec should be able to use Doxygen and LaTeX externally. Consider including bi
* Target Code Generation
+
+
+
## Core (`core`)
This will be the core of the engine.
@@ -96,12 +154,17 @@ This will be the core of the engine.
- Event System
- Core Engine Loop
- System Manager
+ - Ticks vs. Frames
-The priority sequence of the main systems is as follows:
+The following systems are not essential to the core engine, but are instead major systems that should be defined
+in their operation order:
-**3D Systems will apply *before* their 2D Variants**
+**3D Systems will apply *before* their 2D Variants**
+
+### Tick
- **Update**
+ - Events
- Scripts
- AI
- **Physics**
@@ -115,10 +178,28 @@ The priority sequence of the main systems is as follows:
- Soft Bodies resolve before Rigid Bodies
- Collision Response
- Calculate Forces
- -
- - **Graphics**
-## 3D Scene (`scene3d`)
+
+### Frame
+ - **Graphics**
+ - See [Stages](#stages-gfx3d)
+ - **Audio**
+
+
+
+
+
+## Application Layer (`app`)
+
+This is the core windowing system of fennec. The implementation will initially be an SDL3 wrapper.
+Custom implementation may be further down the roadmap, however this is extremely complicated and there are better
+implementations than I could write.
+
+
+
+
+
+## Scene (`scene`)
* In-Array Directed Tree
* Elegant method for providing `O(1)` insertions and `O(log(n))` deletions.
@@ -126,78 +207,185 @@ The priority sequence of the main systems is as follows:
* Octree
+
+
+
+## 2D Graphics (`gfx2d`)
+
+
+
+
+
+
+
## 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
+- 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.
+**DirectX will never have official support.**
+If you would like to make a fork, have at it, but know that I will hold a deep disdain for you.
+
+The graphics pipeline will have a buffer with a list of objects and their rendering data.
+This will be referred to as the Object Buffer. There will be two, for both the Deferred and Forward Passes.
+
+The buffers will be optimized by scene prediction. This involves tracking the meshes directly and indirectly used by a scene.
+
+Materials and Lighting models will be run via a shader metaprogram to make the pipeline independent of this aspect.
+This allows the GPU to draw every single deferred rendered mesh in a single draw call for each stage of the renderer.
+
+Specifications for debugging views via early breaks are included in the stages.
+
+
+### Stages (`gfx3d`)
This is the set of stages for the graphics pipeline that runs every frame:
+Unless otherwise specified, each stage will be run on the GPU.
- - LOD Selection
- - Visibility Buffer & Culling
+ - BVH
+ - Octree
+ - Leaf Size and Tree Depth should be calculated by the scene, constraints are as follows:
+ - Min Object Size
+ - Max Object Size
+ - Scene Center
+ - Scene Edge
+ - Insertions and Updates are done on the CPU
+ - Nodes
+ - ID 16-bits
+ - Start Index 32-bits
+ - Object Count 16-bits
+ - Objects
+ - Buffer of Object IDs grouped by Octree Node
+ - Culling
+ - Starting at each Octree Leaf, traverse upwards.
+ - Insert Visible Leaf IDs
+ - Track using atomic buffer
+ - Output: Buffer of Visible Leaves
- * 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)
+* LOD Selection
+ * Generate the Command Buffer for Culled Mesh LODs from the Visible Leaf Buffer
+ * Track counts using atomic buffers
+ * To avoid double counting due to the structure of the Octree output, we have some options
+ * Ignore Leaf Instances based on occurrences of the mesh in the surrounding 16 Octree Leaves. This would require
+ a bias towards a specific corner of the filter.
+ * Perform a preprocessing step on the CPU to erase duplicate elements and fix the buffer continuity.
+ * Let the duplicates be rendered.
+ * Generate the Culled Object Buffer by copying objects from the Object Buffer
+ * Adjust Buffer Size using the counts
+ * Insert using another atomic buffer
+
+Debug View: Object ID, Mesh ID, LOD
+
+- Visibility
+ - Buffer - RGB32I w/ Depth24
+ - G = Object ID
+ - B = Mesh ID
+ - Regenerate the Command Buffer for Visible Mesh LODs
+ - Regenerate the Culled Object Buffer
+
+Debug View: Visibility Buffer
+
+* 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)
+
+Debug View: Depth, Stencil, Diffuse, Emission, Normal, Specularity
+
+- Lighting Pass
+ - Generate Dynamic Shadows
+ - Generate Dynamic Reflections (Optional)
+ - SSAO (Optional)
+ - Apply Lighting Model
+ - Output → RGB16
+
+Debug View: Shadows, Reflections, SSAO, Deferred Lighting
+
+* Forward Pass
+ * BVH, Same as Above
+ * LOD Selection, Same as Above
+ * Translucent Materials
+ * Dual Depth Peeling
+
+Debug View: Deferred and Forward Mask
+
+- Post Processing
+ - Depth of Field (Optional) → Poisson Sampling
+ - Bloom (Optional) → Mipmap Blurring
+ - Tonemapping (Optional)
+ - HDR Correction
- - 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
+- https://www.researchgate.net/publication/264839743_Simulating_Ocean_Water
+- https://arxiv.org/pdf/2109.00104
+- https://www.youtube.com/watch?v=rSKMYc1CQHE
+- https://tflsguoyu.github.io/webpage/pdf/2013ICIA.pdf
+- https://animation.rwth-aachen.de/publication/0557/
+- https://github.com/InteractiveComputerGraphics/PositionBasedDynamics?tab=readme-ov-file
+- https://www.cs.umd.edu/class/fall2019/cmsc828X/LEC/PBD.pdf
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.
-
+* Rigid Body Physics
+ * Newtonian Physics and Collision Resolution
+ * Articulated Skeletal Systems
+ * Inverse Kinematics
+ * Stiff Rods
+- 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. Simulat
+
- * 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.
-
+ * 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
+ * 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.
+
+
+
+
+
+## Artificial Intelligence (`ai`)
+
+This artificial intelligence method only differs in static generation between 2D and 3D.
+The solvers are dimension independent since they work on a graph.
+
+The general process is;
+
+Static:
+ - generate a static navigation graph (sometimes called a NavMesh)
+
+Update:
+ * resolve dynamic blockers
+ * update paths using dijkstra's algorithm
+ * apply rigid-body forces with constraints
+
+The update loop for artificial intelligence should only update every `n` ticks. Where `n <= k`, with `k` being the
+tick rate of the physics engine.
\ No newline at end of file
diff --git a/include/fennec/lang/float.h b/include/fennec/lang/float.h
index 96c5fa1..6cce568 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