Go to file
Dominik Madarász 86e129e210 add NETWORK_BUF_CLEAR_ON_JOIN option 2023-08-21 20:23:43 +02:00
demos refactor netsync polling 2023-08-21 18:07:45 +02:00
engine add NETWORK_BUF_CLEAR_ON_JOIN option 2023-08-21 20:23:43 +02:00
tools add network event handling 2023-08-21 14:24:47 +02:00
.gitignore add sublime-project 2023-08-10 18:19:39 +02:00
MAKE.bat make git now runs make prep 2023-08-14 19:43:07 +02:00
README.md Merge remote-tracking branch 'fwk/main' 2023-08-11 00:09:38 +02:00
hello.c v4k initial commit 2023-08-10 16:30:56 +02:00
v4k.sublime-project ass2iqe: animlist support + sample anim file 2023-08-14 18:30:52 +02:00

README.md

V·4·K

3D game engine/framework in C, with Luajit and Python bindings.

Goals

  • Full featured, Fast, Modern C++. Small, Naive, Simple C.
  • Rich build system, Royaltie fee. Single file, Freely 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.
  • Network/VM pass: Entity/component/systems and worlds.
    • Core pass: struct serialization.
    • 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).
  • Editor pass = netbased + offline rendering + virtual input.
    • Basic: Gizmos✱, scene tree, property editor✱, load/save✱, undo/redo✱, copy/paste, on/off (vis,tick,ddraw,log), vcs.
    • Scenenode: node singleton display, node console, node labels, node outlines✱.
    • Debug: toggles on/off (billboards✱, materials, un/lit, cast shadows, wireframe, skybox✱/mie✱, fog/atmosphere, collide✱, physics).
    • Level: volumes, triggers, platforms, level streaming.
    • Sub-editor: timeline and data tracks, node graphs.
    • Sub-editor: Procedural content, brushes, noise and CSG.
    • Sub-editor: blendshapes, additive anims, head/foot/hand IKs.
    • Script pass: DLL✱ (module->plugin/sys), Lua✱, Luajit✱, Teal✱ and TypeScript.
  • 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.
  • 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
    • Extend math: quat2, bezier, catmull.
    • Discuss API and freeze it.
    • Document everything.

Hello V4K

#include "v4k.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 V4K from C!");
    }
}
local v4k = require("v4k") -- Minimal Lua sample
v4k.window_create(75.0,0) -- 75% size, no extra flags
while v4k.window_swap() and v4k.input(v4k.KEY_ESC) == 0 do -- game loop
    print("hello V4K from Lua!")
end

Quickstart

  • Double-click MAKE.bat (Win) or sh MAKE.bat (Linux/OSX) to quick start.
  • MAKE.bat all (Win) or sh MAKE.bat all (Linux/OSX) to build everything.
  • MAKE.bat proj (Win) or sh MAKE.bat proj (Linux/OSX) to generate solutions/makefiles.
  • MAKE.bat help (Win) or sh MAKE.bat help (Linux/OSX) for a bunch of options.
  • MAKE.bat hello.c (Win) or sh 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 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 all your assets as long as the tools/ folder is next to your executable. Alternatively, cook them all just by invoking supplied tools/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.

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.
  • 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 engine/v4k.h, v4k.c and v4k files into it.
  • Auto-generated Luajit and Python bindings can be found in the engine/bind/ folder.

Credits

Artwork Dean Evans, Raijin, FMS_Cat, Goblin165cm, Nuulbee, Quaternius, Rotting Pixels, Tom Lewandowski, Rye Terrell, Tools Aaron Barany, Arseny Kapoulkine, Assimp authors, Bernhard Schelling, Christian Collins, FFMPEG authors, Imagination, Krzysztof Gabis, Lee Salzman, Martín Lucas Golini, Mattias Gustavsson, Michael Schmoock, Morgan McGuire, Olivier Lapicque, Konstanty Bialkowski, Polyglot Team, Tildearrow, Tomas Pettersson, Tor Andersson, 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, Jon Olick, Joonas Pihlajamaa, Juliette Focault, Kristoffer Grönlund, Lee Salzman, Lee Salzman, V.Hrytsenko, D.Madarász, Libtomcrypt, Lua authors, Mattias Gustavsson, Micha Mettke, Micha Mettke, Chris Willcocks, Dmitry Hrabrov, Michael Galetzka, Morten Vassvik, Mārtiņš Možeiko, Omar Cornut, vaiorabbit, Rabia Alhaffar, Rich Geldreich, Ross Williams, Samuli Raivio, Sean Barrett, Sebastian Steinhauer, Stan Melax, Cloud Wu, Stefan Gustavson, Sterling Orsten, Tor Andersson, Wolfgang Draxinger,

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.