
# 2D Graphics (`gfx2d`)

## Table of Contents

<!-- TOC -->
* [Home](./CONTENTS.md#planning-documentation-for-fennec)
* [2D Graphics (`gfx2d`)](#2d-graphics-gfx2d)
  * [Table of Contents](#table-of-contents)
  * [Introduction](#introduction)
    * [Structures (`gfx2d`)](#structures-gfx2d)
<!-- TOC -->


## Introduction

&ensp; This system handles the rendering of 2D meshes and textures.

Links:
- https://en.wikipedia.org/wiki/Quadtree
- https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-25-rendering-vector-art-gpu


### Structures (`gfx2d`)

For the 2d rendering framework, Materials need to be rendered independently because we have
no size constraints for images. This disallows us from using a meta-shader like in
the 3d rendering framework.

```c++
struct Object
{
    vec2 location, scale; // A matrix would be 36 bytes, this is instead 20 bytes
    float rotation;
}
```

- BVH
    - Quadtree
        - 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
            - Start Index 32-bits
            - Object Count 32-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
    - Generate the Command Buffer for Culled Meshes from the Visible Leaf Buffer
        - Count Materials
        - Count Meshes per Material
    - Generate the Culled Object Buffer by copying objects from the Object Buffer
        - Adjust Buffer Size using the counts
        - Insert using another atomic buffer

- Translucent objects will be sorted. We can cheat by using a z-index instead of a z-coordinate.
  This will allow us to sort objects as they are created. We can still bulk render each z-index,
  with meshes and objects being grouped by material.