CGL (C Graphics Library) is a multipurpose library mainly for recreational coding / demo scenes / prototyping / small games / experimentation. This has a lot of utilities for graphics. And best of all all of it is inside a single header file cgl.h
. Also CGL is made purely in C but is also compatible with C++.
NOTE: Do not think that header only means its going to increase compile time as the implementation needs be enabled only for 1 file using #define CGL_IMPLEMENTATION
- Windows
- Linux
- MacOS (untested)
- WebAssembly (Beta)
- Android (Comming soon...)
-
Windowing library (Optional)
- You can completely disable it by
#define CGL_EXCLUDE_WINDOW_API
- This windowing library is primarily a wrapper GLFW along with a few extra functionalities. For example in case you are using some library like
nuklear
for GUI it will mess up allglfw
callbacks so with CGL you can restore the CGL callbacks with a call toCGL_window_resecure_callbacks
- You can completely disable it by
-
Utility functionalities
- Reading/Writing files
- Random float/int/bool/vec2/vec3/color generation
- CRC32/CRC64
- ROT13 encryption
- General Purpose Hashing Functions refer here
- Colored printf (red, green, blue, gray/yellow)
- Point/Triangle intersection check
- TODO: [ MD5 / SHA 256 / SHA 128 / AES ]
-
Data structures
- List(dynamic array) + Stack (implemented together)
- Hashtable -> This hastable is general purpose. Key can be string or a n-bit buffer. The value can be anything int, string, float, custom types, ...
- Hashtable Iterator -> Iterate through the hashtable using a simple API
-
Logger
- Can be enabled/disabled by
#define CGL_DISABLE_LOGGER
- Log to multiple log files simultaneously
- Log to console with colored output for seperate log levels
- Logger with auto timestamps
- Can be enabled/disabled by
-
Cross Platform Networking (Optional)
- You can disable all networking by
#define CGL_EXCLUDE_NETWORKING
- Low-level sockets
- SSL sockets (optional) (requires OpenSSL)
- HTTP/HTTPS request (beta)
- You can disable all networking by
-
General Purpose Markov Chains (Optional) Example
- Can work with any type of data ( text / image / etc. )
- Train/Generate with 3 - 4 lines of code
- Trainer implemented for text generation (n-gram based)
- Custom trainer API for custom scenarios
-
Cross Platform Threading
- Threads
- Mutex
- Condition Variables (TODO)
- NOTE: Implemented using
Win32 Threads
on Windows andpthread
on Linux. (on Linux you need to linkpthread
to build)
-
Bloom
- Apply bloom to any tuxtures with just 1 line of code
- Implementation based of Unity's bloom
- Custom thresholding
- Custom downsample/upsample passes
- Entirely done in Compute Shaders
-
2D Collision Detection
- Detect collisions between 2D polygons
- Generate Seperating Axes for polygons
- Get Overlap distance
-
CGL Ray Cast
- Fast 2D Ray Cast
- Custom Walls
- Bake to Triangle Mesh
- Public ray cast functions
-
CGL Node Editor
- Very fast as its powered by CGL Widgets
- Custom nodes, pins, links
- Minimal & Powerful
- Render your own nodes & links type API
- Zoom In/Out
- Global Offsets
-
CGL Widgets (Optional)
- You can disable it by
#define CGL_EXCLUDE_WIDGETS
- API Like p5.js
- Text widgets (render high quality crisp text without loading or baking any font)
- Batch Renderer backend (very fast even for a large number of widgets)
- draw (filled or stroked) :
- triangle [
CGL_widgets_add_triangle
] - general quad [
CGL_widgets_add_quad
] - rectangle [
CGL_widgets_add_rect
CGL_widgets_add_rect2f
] - line [
CGL_widgets_add_line
] - circle [
CGL_widgets_add_circle
CGL_widgets_add_circle2f
] - oval [
CGL_widgets_add_oval
,CGL_widgets_add_oval2f
]
- triangle [
- Add individual vertices
- Adjust stroke color/thickness
- Customize Batch renderer max vertices capacity (for low memory systems)
- You can disable it by
-
Math library
- vec2/vec3/vec4
- mat3/mat4
- add/sub/mul/div/scale/length/normalize/lerp/min/max/equal for vec2/vec3/vec4
- rotate_x/rotate_y/rotate_z for vec3
- scale/translate/rotate_x/rotate_y/rotate_z/add/sub/mul for mat4
- perspective for mat4
- transpose for mat4/(mat3 TODO)
- look_at matrix
- Quaternion math
- NOTE: Most of math functions are implemented via macros so will be totally inclined and quite fast without any unnecessary function calls
-
High Level OpenGL API for (Optional)
- You can completely disable it by
#define CGL_EXCLUDE_GRAPHICS_API
- Texture (2D / 2D Array / Cube map)
- Framebuffers
- SSBO (Shader Storage Buffer Object)
- Shaders
- Vertex & Fragment (Geometry Shader not included as its not very widely used)
- Compute Shader API
- You can completely disable it by
-
CGL Mesh API
- CGL has a high level API for handling meshes
- 2 types of meshes are there
- CPU mesh -> stores the data also used for mesh operations like
- generate triangle
- generate quad
- load OBJ (beta)
- generate cube
- generate sphere
- generate mesh out of any parametric surface function refer here
- calculate normals (TODO)
- GPU mesh -> the pointer to the data stored on GPU side (internally handles the Vertex buffer, Index buffer, Vertex Array) and can used for
- render
- render instanced
- render wireframe
- render wireframe instanced
- CPU mesh -> stores the data also used for mesh operations like
-
CGL camera
- CGL provides a proper camera abstraction
- Perspective & Orthographic
- It internally handles all matrix calculations (just input the position and rotation)
- Auto calculates the Up, Right, Front vectors
-
Text Rendering (Optional) (Requires FreeType2)
- You can completely disable it with
#define CGL_EXCLUDE_TEXT_RENDER
- Load Fonts from
.ttf
files - Bake bitmaps for characters
- Bake textures from strings
- You can completely disable it with
-
Sky Renderer (Optional)
- You can completely disable it with
#define CGL_EXCLUDE_SKY_RENDERER
- Supports both a Sky Box (cube mesh) and Sky Sphere/Dome (sphere mesh)
- Supports Cube map Textured Sky
- Supports Realtime Procedurally Generated Sky ( + procedural clouds)
- Render a beautiful sky with just 3 - 5 lines of code
- You can completely disable it with
-
Phong Renderer (Optional)
- You can disable it via
#define CGL_EXCLUDE_PHONG_RENDERER
- It has:
- Phone Pipeline -> it is the pipeline holding shader data and global engine data. Options available are
- enable/disable blinn correction
- enable/disable depth test
- enable/disable gamma correction
- setup ambient lighting
- add/remove lights
- Phong Light -> It can be of 3 types:
- Directional -> it takes (direction, color, intensity)
- Point -> it takes (position, color, itensity, constant, linear, quadratic)
- Spot (TODO)
- Phong Material
- dissuse texture/color
- specular texture/color
- shininess
- normal maps (TODO)
- Phone Pipeline -> it is the pipeline holding shader data and global engine data. Options available are
- You can disable it via
-
Tilemap Renderer (Optional)
- You can disable it with
#define CGL_EXCLUDE_TILEMAP_RENDERER
- Renders a NxN tilemap with a single line of code
- Each tile can have following states
- clear (transparent or disabled)
- solid color
- texture -> Texture can be supplied via:
- texture 2d array -> you need to provide depth for each tile
- tileset or texture atlas -> you have to provide bounds (normalized 0.0-1.0) of the area of the alas to be used on tile
- NOTE: this tile render renders only 4 vertices and has only 1 draw call (not a instanced call so its quite fast
- You can disable it with
- PBR renderer (optional)
- IBL (optional)
- GLFW
- Glad