Awesome
<h1 align="center"><a href="https://bit.ly/fwk2023">F·W·K</a></h1> <p align="center"> 3D game engine/framework in C.<br/> </p> <p align="center"> <img src="https://i.imgur.com/sInbRoA.gif"/><br/> <img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/01-font.png" width="204px"/> <img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/01-ui.png" width="204px"/> <img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/01-demo2d.png" width="204px"/> <img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/04-actor.png" width="204px"/> <img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/02-ddraw.png" width="204px"/> <img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/03-mesh.png" width="204px"/> <!--img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/99-sprite.png" width="204px"/> <img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/99-video.png" width="204px"/--> <!--img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/01-sprite.png" width="204px"/--> <!--img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/03-anims.png" width="204px"/--> <img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/09-cubemap.png" width="204px"/> <img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/09-shadows-scene.png" width="204px"/> <!--img src="https://raw.githubusercontent.com/zpl-zak/v4k-mirror/master/latest/tests/ref/editor/editor.png" width="204px"/--> </p>Goals
-
Rich build system, Royaltie fee, Full featured, Fast, Modern C++. - Single-file header, Unlicensed, Small, Naive, Simple C.
Features ᕦ(ᐛ)ᕤ
- Pipeline: configurable and integrated asset pipeline.
- Embedded: single-file header, all dependencies included.
- Compiler: MSVC, MINGW64, TCC, GCC, clang, clang-cl and emscripten.
- Linkage: Both static linkage and dynamic .dll/.so/.dylib support.
- Platform: Windows, Linux and OSX. Partial HTML5/Web support.
- DS: hash, sort, array/vector, map, set.
- Math: rand, noise, ease, vec2/3/4, mat33/34/44, quat.
- Geometry: ray, line, plane, aabb, sphere, capsule, triangle, poly and frustum.
- Window: windowed, soft/hard fullscreen, msaa, icon, cursor handling.
- Input: keyboard, mouse and gamepads. input bindings.
- Script: Lua scripting, Luajit/Python bindings.
- Network: downloads (HTTPS) and sockets (TCP/UDP).
- UI: button, list, slider, toggle, checkbox, editbox, dialog, color, image, menu, window, notify...
- Font: TTF, OTF and TTC. Basic syntax highlighter. Glyph ranges. Atlasing.
- Localization/I18N: XLSX and INI. Unicode.
- Image: JPG, PNG, BMP, PSD, PIC, PNM, ICO.
- Texture: KTX/2, PVR, DDS, ASTC, BASIS, HDR, TGA.
- Texel: Depth, R, RG, RGB, RGBA, BC1/2/3/4/5/6/7, PVRI/II, ETC1/2, ASTC.
- Audio: WAV/FLAC, OGG/MP1/MP3, FUR, MOD/XM/S3M/IT, SFXR and MID+SF2/SF3.
- Video: MP4, MPG, OGV, MKV, WMV and AVI. Also, MP4 recording with MPEG-1 fallback.
- Model: IQM/E, GLTF/2, GLB, FBX, OBJ, DAE, BLEND, MD3/5, MS3D, SMD, X, 3DS, BVH, DXF, LWO.
- Render: Renderstate driven rendering.
- Render: Global frustum culling and scene mesh render sorting.
- Render: Light probes. Environmental probe generation.
- Render: PBR (metallic-roughness) workflow. <!-- @todo: merge demo_pbr.c rendering code into v4k_render.c -->
- Render: Soft shadows, Cascaded shadowmaps, Variance shadowmaps.
- Render: Cubemaps, panoramas and spherical harmonics. Rayleigh/Mie scattering.
- Render: Post-effects (SSAO,FXAA1/3,CRT,Contrast,Grain,Outline,Vignette...).
- Render: 3D Anims, skeletal anims, hardware skinning and instanced rendering.
- Render: 3D Debugdraw, batching and vectorial font.
- Render: 3D Sprites, spritesheets, AA zooming and batching: ASE.
- Render: 3D Tilemaps and tilesets: TMX, TSX.
- Render: Geometry and Compute shaders. SSBO support.
- Social: Steam/Steamworks.
- Time: Hires timers, tweens, easings, constant-time spline/catmulls.
- AI: Swarm/Boids, pathfinding, behavior trees (wip).
- Compression: DEFLATE, LZMA, LZ4, ULZ, BALZ, BCM, CRUSH, LZW3, LZSS and PPP.
- Virtual filesystem: ZIP, PAK, TAR and DIR.
- Level data: JSON, JSON5, SJSON, XML, INI.
- Reflection and serialization: JSON5, INI.
- Object system.
- Disk cache.
- Scene handling.
- Profiler, stats and leaks finder.
- Editors (wip): scene, text editor.
- Documentation (wip).
Roadmap ᕕ(ᐛ)ᕗ
- Editor:
- 00 World: world/entity/component/systems (W/OCS). <!-- W/OCS, gameobj, serialization:diff/patch -->
- 01 World.BVH: 2D/3D spatial tree (grid? octree?), spatial queries.
- 02 Scene v2: scenegraph, toggleviews (billboards, materials, un/lit, cast shadows, wireframe, skybox/mie, collide, physics).
- 03 Editor: scene tree, property editor. <!-- node == gameobj -->
- 04 Editor.Core: load/save, undo/redo, copy/paste, on/off (vis,tick,ddraw,log). <!-- toggles on/off (billboards, materials, un/lit, cast shadows, wireframe, skybox/mie, fog/atmosphere, collide, physics).-->
- 05 Editor.Basic: volumes, collisions, triggers.
- 06 Editor.Debug: object singleton display, object console, object labels, object outlines.
- 07 Editor.SubMode: Node graphs. <!-- worthy: will be reused into materials, animgraphs and blueprints -->
- 08 Tools: Extend asset pipeline (per-platform, per-asset options). GIF, PKM.
- 09 Script: Pure Lua FFI bindings.
- 10 fwkPlugins/fwkModules: DLL (module->plugin/sys), Lua, Luajit, Teal and TypeScript.
- 11 fwkAnimation: playlists, blendshapes, additive, ik/bones, animgraph/controllers, track/events. Also 2D skeletal sprites (Spine).
- 12 fwkAI: h/fsm state, behavior trees, planning (goap), actors, navpaths/waypoints, navmesh generation.
- Renderer:
- 00 Render: integrate reii2 or any other renderstate abstraction. renderbuckets.
- 01 Render: glslcc + shader variants compilation
- 02 Material v2: colors, textures, matcaps, videos, shadertoys. Shadertoys as post-fx. <!-- material: fixed color, texture or script that returns colors. may be static (disk, procedural script) or change every frame (shadertoys, videos) -->
- 03 Lighting: hard/soft shadow mapping, spotlights (VSM), omnilights (VSMCube), CSM.
- 04 Lighting: baked lightmaps (xatlas). Refl probes.
- 05 Render: LODs, object instancing, billboards, impostors, reverse-z.
- 06 FX: particles and emitters (TLFX2json), trails, paths.
- Engine:
- 00 Audio: 3D audio, HRTF, FFT, filtering, sound effects (reverb etc) and sound occlusion.
- 01 Physics: immediate-mode physics wrapper API design
- 02 Collisions: collision improvements + (room for cols resolution maybe?)
- 03 Math: quat2, bezier, catmull
- 04 GUI: api improvements - new widgets, improved positioning etc
- 05 Netsync: improvements (data prediction, compression, encryption)
- 06 Platform: Mobile iOS/Android, Web/WASM/Emscripten, RaspberryPi, VR/AR.
- 07 OS: cpu usage, device orientation
- 08 Social: Achievements, Scores, Rankings, Friends, Invites, Store integrations.
- 09 Input: mouse clip, mouse wrap, touch input, touch gestures.
Hello FWK
#include "fwk.h" // Minimal C sample
int main() {
window_create(75.0, 0); // 75% size, no extra flags
while( window_swap() && !input(KEY_ESC) ) { // game loop
puts("hello FWK from C!");
}
}
local fwk = require("fwk") -- Minimal Lua sample
fwk.window_create(75.0,0) -- 75% size, no extra flags
while fwk.window_swap() and fwk.input(fwk.KEY_ESC) == 0 do -- game loop
print("hello FWK from Lua!")
end
Quickstart
- Double-click
MAKE.bat
(Win) orsh MAKE.bat
(Linux/OSX) to quick start. MAKE.bat all
(Win) orsh MAKE.bat all
(Linux/OSX) to build everything.MAKE.bat proj
(Win) orsh MAKE.bat proj
(Linux/OSX) to generate solutions/makefiles.MAKE.bat help
(Win) orsh MAKE.bat help
(Linux/OSX) for a bunch of options.MAKE.bat hello.c
(Win) orsh MAKE.bat hello.c
(Linux/OSX) to build a single executable.- Alternatively,
echo win/vc && cl hello.c
echo win/clang-cl && clang-cl hello.c
echo win/tcc && tools\tcc hello.c -m64
echo win/mingw && gcc hello.c -lws2_32 -lwinmm -ldbghelp -lole32 -luser32 -lgdi32 -lcomdlg32
echo win/clang && clang hello.c -lws2_32 -lwinmm -ldbghelp -lole32 -luser32 -lgdi32 -lcomdlg32
echo linux && cc hello.c -lm -ldl -lpthread -lX11
echo linux/tcc && tcc hello.c -lm -ldl -lpthread -lX11 -D__STDC_NO_VLA__
echo osx && cc -ObjC hello.c -framework cocoa -framework iokit -framework coreaudio -framework audiotoolbox
Cook
- Assets need to be cooked before being consumed in your application. The tools/ folder contains all the related binaries to perform any asset processing plus the cookbook to do so.
- Your game will cook your assets as long as the
tools/
folder is next to your executable. Alternatively, cook them all just by invoking suppliedtools/cook
standalone binary. - In both cases, assets will be cooked and packed into .zipfiles next to your executable, then mounted before entering game loop. These .zipfiles plus your executable are the only required files when releasing your game.
- Optionally, you could also run
MAKE.bat fuse
and merge your binaries and their .zipfiles all together. Redist ready.
Extra tips
- Any ico/png file named after the executable name will be automatically used as app icon.
- Similar to the ico/png case above, the cooked .zipfiles can be named after the main executable as well.
- Dropped files into game window will be imported & saved into
import/
folder. - Update the gamepad controller database by upgrading the
gamecontrollerdb.txt
file. - Depending on your IDE, you might need to browse to
engine/split/
sources when debugging FWK. - Enable cooking assets on demand, by using
--cook-on-demand=1
flag. Similarly,--vsync=0/1
can be toggled too. - Linux/OSX users can optionally install wine and use the Windows tools instead (by using
--cook-wine
flag). - Disable automatic cooking by using
--cook-jobs=0
flag (not recommended). - Generate a project solution by dropping
engine/fwk.h, fwk.c and fwk
files into it. - Auto-generated Luajit and Python bindings can be found in the
engine/
folder. - Windows Defender may tag as false positives some generated binaries with tcc. Use
make tcc static
instead.
Bindings
- Auto-generated LuaJIT and Python bindings can be found in this folder.
Credits
Artwork and demos Butch, David Lam, Dean Evans, Raijin, FMS_Cat, Goblin165cm, Nuulbee, Pixel Frog, Quaternius, Rotting Pixels, Tom Lewandowski, Rye Terrell, Rxi, Tools Aaron Barany, Andreas Mantler, Arseny Kapoulkine, Assimp authors, Bernhard Schelling, FFMPEG authors, Imagination, Krzysztof Gabis, Lee Salzman, Leon Bottou, Martín Lucas Golini, Mattias Gustavsson, Morgan McGuire, Olivier Lapicque, Konstanty Bialkowski, Polyglot Team, Randy Gaul, Rxi, Adam Harrison, Sean Barrett et al., Sepehr Taghdisian, Tildearrow, Tomas Pettersson, Tor Andersson, Wael El Oraiby, Runtime Andreas Mantler, Barerose, Camilla Löwy, Dave Rand, David Herberth, David Reid, Dominic Szablewski, Dominik Madarász, Eduard Suica, Evan Wallace, Gargaj+cce/Peisik, Guilherme Lampert, Guillaume Vareille, Haruhiko Okumura, Igor Pavlov, Ilya Muravyov, James R. McKaskill, Jon Olick, Joonas Pihlajamaa, Juliette Focault, Kristoffer Grönlund, Lee Salzman, Lee Salzman, V.Hrytsenko, D.Madarász, Libtomcrypt, Lua authors, Mattias Gustavsson, Mattias Jansson, Micha Mettke, Michael Galetzka, Morten Vassvik, Mārtiņš Možeiko, Omar Cornut, vaiorabbit, Peter Schulman, Chris Willcocks, Dmitry Hrabrov, Rabia Alhaffar, Randy Gaul, Rich Geldreich, Ross Williams, Samuli Raivio, Scott Lembcke, Sean Barrett, Sebastian Steinhauer, Stan Melax, Cloud Wu, Stefan Gustavson, Sterling Orsten, Tor Andersson, Werner Stoop, Wolfgang Draxinger,
<!-- - [Christian Collins](http://www.schristiancollins.com "for GeneralUser GS soundfont (PD)"), - [ID Software, David St-Louis](https://github.com/Daivuk/PureDOOM "for PureDOOM (Doom License)"), - [Miloslav Číž](https://codeberg.org/drummyfish/Anarch "for Anarch (CC0)"), -->Unlicense
This software is released into the public domain. Also dual-licensed as 0-BSD or MIT (No Attribution) for those countries where public domain is a concern (sigh). Any contribution to this repository is implicitly subjected to the same release conditions aforementioned.
Links
Still looking for alternatives? amulet, aroma, astera, blendelf, bullordengine, candle, cave, chickpea, corange, cute, dos-like, ejoy2d, exengine, gunslinger, hate, island, juno, l, lgf, limbus, love, lovr, mini3d, mintaro, mio, olive.c, opensource, ouzel, pez, pixie, punity, r96, ricotech, rizz, tigr, yourgamelib
<a href="https://github.com/r-lyeh/FWK/issues"><img alt="Issues" src="https://img.shields.io/github/issues-raw/r-lyeh/FWK.svg"/></a> <a href="https://discord.gg/UpB7nahEFU"><img alt="Discord" src="https://img.shields.io/discord/270565488365535232?color=5865F2&label=chat&logo=discord&logoColor=white"/></a>