3b67efc1f5
fix: fixed issue when mounting empty zipfiles (likely to happen in computers with many cpu cores) (thanks @zpl-zak!) new: forked milestone in https://github.com/r-lyeh/FWK.2022 chg: update teal + gamecontrollerdb add: added tools/plugins/ stub folder brk: renamed `WITH_` > `ENABLE_` directives chg: updated docs |
||
---|---|---|
demos | ||
engine | ||
tools | ||
MAKE.bat | ||
README.md | ||
hello.c |
README.md
F·W·K
3D game framework in C.
Goals
C++. C.Fast. Naive.Modern. Simple.Full featured. Small.Rich build system. Single file.Royaltie fee. Free and unlicensed.
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.
- Script: Lua scripting, Luajit bindings.
- Network: downloads (HTTPS) and sockets (TCP/UDP).
- AI: Swarm/Boids.
- 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: PBR (metallic-roughness) workflow.
- 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: 2D Sprites, spritesheets, AA zooming and batching.
- Render: 2D Tilemaps and tilesets: TMX, TSX.
- 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.
- Disk cache.
- Scene handling.
- Profiler, stats and leaks finder.
- Editor (wip).
- Documentation (wip).
Roadmap ᕕ(ᐛ)ᕗ (in order of arrival; ✱: partial support)
- AI pass: actors, waypoints, pathfinding, behavior trees (h/fsm,goap), and navmesh generation.
- Render pass: reverse-Z, automatic LODs, impostors, decals.
- Materials: (colors✱, textures✱, matcaps✱, videos✱, shadertoys✱). Shadertoys as post-fx✱.
- Lighting: Hard/soft shadow mapping (VSM,CCSM). Baked lightmaps. Refl probes. Integrated PBR.
- Network/VM pass: Entity/component/systems and worlds.
- Message pipeline and replication.
- Digital signals, message buffering and event polling.
- World streaming and level loading.
- Scenegraphs and spatial partioning. BVH, PVS, occluders, frustum culling.
- Server/client architecture. Hybrid P2P.
- NAT traversal. Socketless API, message API and pub/sub wrappers (enet/websocket).
- Tools pass
- Extend shaders + bindings. Per-platform✱, per-type✱, per-asset options. GIF, PKM.
- Extend atlas (sprite/lightmaps). Fit packing (sprites).
- Extend bindings and messaging: parse C headers during cooking stage. <!-- msgs,docs,refl,meta,lua -- (*.c, *.h) as .proto/.pbc maybe, free reflection+automatic bindings -->
- API pass
- Discuss API and freeze it.
- Document everything.
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!");
}
}
#include "fwk.h" // Minimal HTML5 sample
void render(void *arg) {
if( !input(KEY_ESC) ) puts("hello FWK from HTML5!");
}
int main() {
window_create(75.0, 0); // 75% size, no extra flags
window_loop(render, NULL); // game loop
}
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
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 audiotoolbox
Cook
- Most asset types need to be cooked before being used in your application. Some other assets like
.png
do not. - Cooked assets will be written into .zipfiles close to your executable, and mounted before entering game loop.
- Cooked .zipfiles and your executable are the only required assets when releasing your game.
- Cook manually your assets by invoking supplied
tools/cook
standalone binary. - Cook automatically your assets by just playing your game: a runtime cook is already embedded into your binary.
- In order to achieve this, ensure the
tools/
folder is close to your executable. - This folder contains all the related binaries to perform any asset conversion plus the cookbook to do so.
- In order to achieve this, ensure the
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
split/
sources when debugging FWK. - Cook assets on demand, as opposed to cook all existing assets on depot, by using
--cook-on-demand
flag. - 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
split/fwk.h, fwk.c and fwk
files into it.
Credits (Artwork + demos)
- Nanofactory, for kgirls01 3D model (CC BY-NC-ND 4.0).
- RottingPixels, for castle-tileset (CC0).
- wwwtyro, for nicest rayleigh/mie scattering shader around (CC0).
Credits (Tools)
- Aaron Barany, for cuttlefish (APACHE2).
- Arseny Kapoulkine, for pugixml (MIT).
- Assimp authors, for assimp (BSD3).
- Bernhard Schelling, for tml.h (Zlib) and tsf.h (MIT).
- ffmpeg authors, for ffmpeg (LGPL21).
- Imagination, for pvrtextoolcli (ITL).
- Krzysztof Gabis, for split.py/join.py (MIT).
- Lee Salzman, for iqm.cpp (PD).
- Mattias Gustavsson, for mid.h (PD).
- Michael Schmoock, for lcpp (MIT).
- Olivier Lapicque, Konstanty Bialkowski, for libmodplug (PD).
- Polyglot Team, for polyglot gamedev (CC0).
- Tildearrow, for Furnace (GPL2).
- Tomas Pettersson, for sfxr (PD).
- Tor Andersson, for assiqe.c (BSD).
Credits (Runtime)
- Barerose, for swrap (CC0).
- Camilla Löwy, for glfw3 (Zlib).
- Dave Rand for ppp (PD).
- David Herberth, for glad generated code (PD).
- David Reid, for miniaudio (PD).
- Dominic Szablewski, for pl_mpeg (MIT).
- Dominik Madarász, for json5 parser (PD).
- Eduard Suica, for tlse (PD).
- Gargaj+cce/Peisik, for Foxotron/PBR shaders (UNLICENSE).
- Guillaume Vareille, for tinyfiledialogs (ZLIB).
- Haruhiko Okumura for lzss (PD).
- Igor Pavlov for LZMA (PD).
- Ilya Muravyov for bcm, balz, crush, ulz, lz4x (PD).
- Jon Olick, for jo_mp1 and jo_mpeg (PD).
- Joonas Pihlajamaa, for JUnzip library (PD).
- Juliette Focault, for the generated MD header (ZLIB).
- Lee Salzman, for IQM spec & player (PD).
- Lee Salzman, V.Hrytsenko, D.Madarász, for enet (MIT).
- Libtomcrypt, for libtomcrypt (Unlicense).
- Lua authors, for Lua language (MIT).
- Mārtiņš Možeiko, for A* pathfinding (PD).
- Mattias Gustavsson, for thread.h and https.h (PD).
- Micha Mettke, Chris Willcocks, Dmitry Hrabrov, for nuklear (PD).
- Michael Galetzka, for swarmz (UNLICENSE).
- Omar Cornut, vaiorabbit, for tables of unicode ranges (MIT-0).
- Rabia Alhaffar, for ice_batt.h (PD).
- Rich Geldreich, for miniz (PD).
- Ross Williams for lzrw3a (PD).
- Samuli Raivio, for bq_websocket (PD).
- Sean Barrett, for stb_image, stb_image_write, stb_sprintf, stb_truetype and stb_vorbis (PD).
- Sebastian Steinhauer, for sts_mixer (PD).
- Stan Melax, Cloud Wu, for polychop C algorithm (PD).
- Stefan Gustavson, for simplex noise (PD).
- Tor Andersson, for xml.c (PD).
- Vassvik, for mv_easy_font (Unlicense).
- Special thanks to @ands, @barerose, @datenwolf, @evanw, @glampert, @krig, @sgorsten and @vurtun for their math libraries (PD,CC0,WTFPL2,CC0,PD,CC0,Unlicense,PD).
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