Skip to content

Commit

Permalink
- Render: mesh-level sorting based on render pass (@zpl-zak)
Browse files Browse the repository at this point in the history
- Render: mesh-level frustum culling (@zpl-zak)
- Render: Added model_bsphere() (@zpl-zak)
- Render: Shadowmapping! VSM and CSM, soft shadows, directional/point/spot lights (@zpl-zak)
- Render: Model auto LOD generation (WIP!) (@zpl-zak)
- Render: Shader uniform caching (huge fps speedup) (@zpl-zak)
- Render: Reworked model instancing to avoid glBufferData() overhead for single-instance models (@zpl-zak)
- Render: added `model_get_bone_position()` (@zpl-zak)
- Render: Implemented VertexLit shading (for the cool PSX looks!) (@zpl-zak)
- Render: Improved vertex color support (@zpl-zak)
- Render: Fixed wrong axis order used during model import (BREAKING!) (@zpl-zak)
- Render: Revamped the model API (BREAKING!) (@zpl-zak)
- Render: Added fog support (WIP!) (@zpl-zak)
- Render: Revamped the shader system to be more flexible and modular (@zpl-zak)
- Render: Introduction of the shader library (see `engine/art/shaderlib/`) (@zpl-zak)
- Render: Improved transparency detection and support (@zpl-zak)
- Render: Reworked skybox and cubemap modules (@zpl-zak)
- Render: Added environment probes baking (@zpl-zak)
- Render: Added light probes and spherical harmonics weighting (@zpl-zak)
- Render: Dropped support for the lightmapper API (@zpl-zak)
- Scene: Integrated shadowmap support (@zpl-zak)
- Scene: Implemented renderbuckets (WIP!) (@zpl-zak)
- Scene/Render: Moved light to render module (@zpl-zak)
- Render: removed access to the model shader program (@zpl-zak)
- Render: introduced `model_uniform_t` a new approach to shader uniform management (@zpl-zak)
- Render: switched to PBR workflow as the default (@zpl-zak)
- Render: model shader now uses fixed uniform sampler slots. For user bound slots, use: `model_texture_unit(model_t-)` to generate a new ID on a rolling counter (@zpl-zak)
- Render: model uniforms are now cached (@zpl-zak)
- Render: shadow filter size raised to 6, maximum shadow lights raised to 4, max total lights raised to 96 (@zpl-zak)
- Render: UBO creation/binding api (@zpl-zak)
- Render: model shader now stores lights in an UBO resource (@zpl-zak)
- Render: improved fallback to non-PBR textures in PBR workflow (@zpl-zak)
- Render: model shader BRDF can now sample a cubemap for irradiance in IBL path (WIP!) (@zpl-zak)
- Render: PBR workflow is now the default for loaded models (@zpl-zak)
- Render: added model_sync() to update model data from CPU to GPU (WIP!) (@zpl-zak)
- Camera: added camera_freefly() and replaced all freefly camera code in demos (@zpl-zak)
- Render: cascaded shadow mapping has an improved bias (@zpl-zak)
- Platform: added alert_caption() and tweaked PANIC() to copy error to clipboard (@zpl-zak)
- Render: implemented parallax occlusion mapping and self-shadowing support (@zpl-zak)
- Render: introduced HAS_TEXTURE_QUERY_LOD to check for support at runtime (@zpl-zak)
- Window: added window_set_resolution(width, height) (@zpl-zak)
- Render: added renderstate_checksum() to check for render state changes (@zpl-zak)
- Render: dynamic batching support for models (@zpl-zak)

chg: add #include support (tools/cook)

chg: tools/ark renamed to tools/fuser
chg: tools/ass2iqe
chg: tools/iqe2iqm
chg: tools/file2hash
chg: update docs
  • Loading branch information
r-lyeh committed Sep 29, 2024
1 parent cd49fbd commit 61f0bb0
Show file tree
Hide file tree
Showing 175 changed files with 92,694 additions and 8,708 deletions.
84 changes: 47 additions & 37 deletions MAKE.bat
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ if [ "$(uname)" != "Darwin" ]; then
chmod +x tools/premake5.linux
chmod +x tools/ninja.linux
chmod +x tools/ase2ini.linux
chmod +x tools/ark.linux
chmod +x tools/fuser.linux
chmod +x demos/lua/luajit.linux

export args="-lm -ldl -lpthread -lX11 -w -Iengine/ $args"
Expand Down Expand Up @@ -230,7 +230,7 @@ if [ "$(uname)" = "Darwin" ]; then
chmod +x tools/ass2iqe.osx
chmod +x tools/ase2ini.osx
chmod +x tools/cook.osx
chmod +x tools/ark.osx
chmod +x tools/fuser.osx
chmod +x tools/cuttlefish.osx
chmod +x tools/ffmpeg.osx
chmod +x tools/furnace.osx
Expand Down Expand Up @@ -467,7 +467,7 @@ if "%1"=="fuse" (
setlocal enableDelayedExpansion
del *.zip 2> nul 1> nul & tools\cook --cook-jobs=1
md _fused 2> nul 1> nul
for %%i in (*.exe) do set "var=%%i" && ( copy /y !var! _fused\fused_!var! 2> nul 1> nul & tools\ark _fused\fused_!var! *.zip )
for %%i in (*.exe) do set "var=%%i" && ( copy /y !var! _fused\fused_!var! 2> nul 1> nul & tools\fuser _fused\fused_!var! *.zip )
)
exit /b
)
Expand Down Expand Up @@ -885,40 +885,50 @@ set edit=-DCOOK_ON_DEMAND -DUI_FONT_SMALL !edit! && REM -DUI_ICONS_SMALL -DUI_LE
rem demos
if "!demos!"=="yes" (
!echo! 00-loop && !cc! !o! 00-loop.exe demos\00-loop.c !import! !args! || set rc=1
!echo! 00-script && !cc! !o! 00-script.exe demos\00-script.c !import! !args! || set rc=1
!echo! 01-demo2d && !cc! !o! 01-demo2d.exe demos\01-demo2d.c !import! !args! || set rc=1
!echo! 01-ui && !cc! !o! 01-ui.exe demos\01-ui.c !import! !args! || set rc=1
!echo! 01-easing && !cc! !o! 01-easing.exe demos\01-easing.c !import! !args! || set rc=1
!echo! 01-font && !cc! !o! 01-font.exe demos\01-font.c !import! !args! || set rc=1
!echo! 02-ddraw && !cc! !o! 02-ddraw.exe demos\02-ddraw.c !import! !args! || set rc=1
!echo! 02-frustum && !cc! !o! 02-frustum.exe demos\02-frustum.c !import! !args! || set rc=1
!echo! 03-anims && !cc! !o! 03-anims.exe demos\03-anims.c !import! !args! || set rc=1
!echo! 04-actor && !cc! !o! 04-actor.exe demos\04-actor.c !import! !args! || set rc=1
!echo! 06-scene && !cc! !o! 06-scene.exe demos\06-scene.c !import! !args! || set rc=1
!echo! 06-material && !cc! !o! 06-material.exe demos\06-material.c !import! !args! || set rc=1
!echo! 07-network && !cc! !o! 07-network.exe demos\07-network.c !import! !args! || set rc=1
!echo! 07-netsync && !cc! !o! 07-netsync.exe demos\07-netsync.c !import! !args! || set rc=1
!echo! 08-audio && !cc! !o! 08-audio.exe demos\08-audio.c !import! !args! || set rc=1
!echo! 08-video && !cc! !o! 08-video.exe demos\08-video.c !import! !args! || set rc=1
!echo! 09-cubemap && !cc! !o! 09-cubemap.exe demos\09-cubemap.c !import! !args! || set rc=1
!echo! 09-shadertoy && !cc! !o! 09-shadertoy.exe demos\09-shadertoy.c !import! !args! || set rc=1
!echo! 99-bt && !cc! !o! 99-bt.exe demos\99-bt.c !import! !args! || set rc=1
!echo! 99-controller && !cc! !o! 99-controller.exe demos\99-controller.c !import! !args! || set rc=1
!echo! 99-demo && !cc! !o! 99-demo.exe demos\99-demo.c !import! !args! || set rc=1
!echo! 99-lod && !cc! !o! 99-lod.exe demos\99-lod.c !import! !args! || set rc=1
!echo! 99-pbr && !cc! !o! 99-pbr.exe demos\99-pbr.c !import! !args! || set rc=1
!echo! 99-spine && !cc! !o! 99-spine.exe demos\99-spine.c !import! !args! || set rc=1
!echo! 99-sprite && !cc! !o! 99-sprite.exe demos\99-sprite.c !import! !args! || set rc=1
!echo! 99-sprite3d && !cc! !o! 99-sprite3d.exe demos\99-sprite3d.c !import! !args! || set rc=1
!echo! 99-geom && !cc! !o! 99-geom.exe demos\99-geom.c !import! !args! || set rc=1
!echo! 99-compute && !cc! !o! 99-compute.exe demos\99-compute.c !import! !args! || set rc=1
!echo! 99-pathfind && !cc! !o! 99-pathfind.exe demos\99-pathfind.c !import! !args! || set rc=1
!echo! 99-sponza && !cc! !o! 99-sponza.exe demos\99-sponza.c !import! !args! || set rc=1
!echo! 99-gui && !cc! !o! 99-gui.exe demos\99-gui.c !import! !args! || set rc=1
!echo! 99-lmap && !cc! !o! 99-lmap.exe demos\99-lmap.c !import! !args! || set rc=1
!echo! 99-steam && !cc! !o! 99-steam.exe demos\99-steam.c !import! !args! || set rc=1
!echo! 00-loop && !cc! !o! 00-loop.exe demos\00-loop.c !import! !args! || set rc=1
!echo! 00-script && !cc! !o! 00-script.exe demos\00-script.c !import! !args! || set rc=1
!echo! 01-demo2d && !cc! !o! 01-demo2d.exe demos\01-demo2d.c !import! !args! || set rc=1
!echo! 01-easing && !cc! !o! 01-easing.exe demos\01-easing.c !import! !args! || set rc=1
!echo! 01-font && !cc! !o! 01-font.exe demos\01-font.c !import! !args! || set rc=1
!echo! 01-ui && !cc! !o! 01-ui.exe demos\01-ui.c !import! !args! || set rc=1
!echo! 02-ddraw && !cc! !o! 02-ddraw.exe demos\02-ddraw.c !import! !args! || set rc=1
!echo! 02-frustum && !cc! !o! 02-frustum.exe demos\02-frustum.c !import! !args! || set rc=1
!echo! 03-anims && !cc! !o! 03-anims.exe demos\03-anims.c !import! !args! || set rc=1
!echo! 03-batching && !cc! !o! 03-batching.exe demos\03-batching.c !import! !args! || set rc=1
!echo! 03-mesh && !cc! !o! 03-mesh.exe demos\03-mesh.c !import! !args! || set rc=1
!echo! 04-actor && !cc! !o! 04-actor.exe demos\04-actor.c !import! !args! || set rc=1
!echo! 06-material && !cc! !o! 06-material.exe demos\06-material.c !import! !args! || set rc=1
!echo! 06-parallax && !cc! !o! 06-parallax.exe demos\06-parallax.c !import! !args! || set rc=1
!echo! 06-scene && !cc! !o! 06-scene.exe demos\06-scene.c !import! !args! || set rc=1
!echo! 06-scene-sorting && !cc! !o! 06-scene-sorting.exe demos\06-scene-sorting.c !import! !args! || set rc=1
!echo! 06-sorting && !cc! !o! 06-sorting.exe demos\06-sorting.c !import! !args! || set rc=1
!echo! 07-netsync && !cc! !o! 07-netsync.exe demos\07-netsync.c !import! !args! || set rc=1
!echo! 07-network && !cc! !o! 07-network.exe demos\07-network.c !import! !args! || set rc=1
!echo! 08-audio && !cc! !o! 08-audio.exe demos\08-audio.c !import! !args! || set rc=1
!echo! 08-video && !cc! !o! 08-video.exe demos\08-video.c !import! !args! || set rc=1
!echo! 09-cubemap && !cc! !o! 09-cubemap.exe demos\09-cubemap.c !import! !args! || set rc=1
!echo! 09-envmap && !cc! !o! 09-envmap.exe demos\09-envmap.c !import! !args! || set rc=1
!echo! 09-lights && !cc! !o! 09-lights.exe demos\09-lights.c !import! !args! || set rc=1
!echo! 09-shadertoy && !cc! !o! 09-shadertoy.exe demos\09-shadertoy.c !import! !args! || set rc=1
!echo! 09-shadows && !cc! !o! 09-shadows.exe demos\09-shadows.c !import! !args! || set rc=1
!echo! 09-shadows-scene && !cc! !o! 09-shadows-scene.exe demos\09-shadows-scene.c !import! !args! || set rc=1
!echo! 99-bt && !cc! !o! 99-bt.exe demos\99-bt.c !import! !args! || set rc=1
!echo! 99-compute && !cc! !o! 99-compute.exe demos\99-compute.c !import! !args! || set rc=1
!echo! 99-controller && !cc! !o! 99-controller.exe demos\99-controller.c !import! !args! || set rc=1
!echo! 99-geom && !cc! !o! 99-geom.exe demos\99-geom.c !import! !args! || set rc=1
!echo! 99-gizmo && !cc! !o! 99-gizmo.exe demos\99-gizmo.c !import! !args! || set rc=1
!echo! 99-gui && !cc! !o! 99-gui.exe demos\99-gui.c !import! !args! || set rc=1
!echo! 99-lod && !cc! !o! 99-lod.exe demos\99-lod.c !import! !args! || set rc=1
!echo! 99-pathfind && !cc! !o! 99-pathfind.exe demos\99-pathfind.c !import! !args! || set rc=1
!echo! 99-spine && !cc! !o! 99-spine.exe demos\99-spine.c !import! !args! || set rc=1
!echo! 99-splines && !cc! !o! 99-splines.exe demos\99-splines.c !import! !args! || set rc=1
!echo! 99-sponza && !cc! !o! 99-sponza.exe demos\99-sponza.c !import! !args! || set rc=1
!echo! 99-sprite && !cc! !o! 99-sprite.exe demos\99-sprite.c !import! !args! || set rc=1
!echo! 99-sprite3d && !cc! !o! 99-sprite3d.exe demos\99-sprite3d.c !import! !args! || set rc=1
!echo! 99-steam && !cc! !o! 99-steam.exe demos\99-steam.c !import! !args! || set rc=1
rem !echo! 99-lmap && !cc! !o! 99-lmap.exe demos\99-lmap.c !import! !args! || set rc=1
)
rem hello
Expand Down
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,11 @@
- [x] Audio: WAV/FLAC, OGG/MP1/MP3, FUR, MOD/XM/S3M/IT, SFXR and MID+SF2/SF3.
- [x] Video: MP4, MPG, OGV, MKV, WMV and AVI. Also, MP4 recording with MPEG-1 fallback.
- [x] Model: IQM/E, GLTF/2, GLB, FBX, OBJ, DAE, BLEND, MD3/5, MS3D, SMD, X, 3DS, BVH, DXF, LWO.
- [x] Render: PBR (metallic-roughness) workflow. <!-- @todo: merge demo_pbr.c rendering code into fwk_render.c -->
- [x] Render: Renderstate driven rendering.
- [x] Render: Global frustum culling and scene mesh render sorting.
- [x] Render: Light probes. Environmental probe generation.
- [x] Render: PBR (metallic-roughness) workflow. <!-- @todo: merge demo_pbr.c rendering code into v4k_render.c -->
- [x] Render: Soft shadows, Cascaded shadowmaps, Variance shadowmaps.
- [x] Render: Cubemaps, panoramas and spherical harmonics. Rayleigh/Mie scattering.
- [x] Render: Post-effects (SSAO,FXAA1/3,CRT,Contrast,Grain,Outline,Vignette...).
- [x] Render: 3D Anims, skeletal anims, hardware skinning and instanced rendering.
Expand Down
8 changes: 4 additions & 4 deletions demos/02-ddraw.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,15 @@ int main() {
vec2 filtered_rpad = input_filter_deadzone(input2(GAMEPAD_RPAD), 0.15f/*do_gamepad_deadzone*/ + 1e-3 );
vec2 mouse = scale2(vec2(filtered_rpad.x, filtered_rpad.y), 1.0f);
vec3 wasdec = scale3(vec3(filtered_lpad.x, input(GAMEPAD_LT) - input(GAMEPAD_RT), filtered_lpad.y), 1.0f);
camera_moveby(&cam, wasdec);
camera_moveby(&cam, scale3(wasdec, window_delta() * 60));
camera_fps(&cam, mouse.x,mouse.y);
window_cursor( true );
} else {
bool active = ui_active() || ui_hover() || gizmo_active() ? false : input(MOUSE_L) || input(MOUSE_M) || input(MOUSE_R);
if( active ) cam.speed = clampf(cam.speed + input_diff(MOUSE_W) / 10, 0.05f, 5.0f);
vec2 mouse = scale2(vec2(input_diff(MOUSE_X), -input_diff(MOUSE_Y)), 0.2f * active);
vec3 wasdecq = scale3(vec3(input(KEY_D)-input(KEY_A),input(KEY_E)-(input(KEY_C)||input(KEY_Q)),input(KEY_W)-input(KEY_S)), cam.speed);
camera_moveby(&cam, wasdecq);
camera_moveby(&cam, scale3(wasdecq, window_delta() * 60));
camera_fps(&cam, mouse.x,mouse.y);
window_cursor( !active );
}
Expand All @@ -63,11 +63,11 @@ int main() {
do_once sw = swarm();
do_once array_push(sw.steering_targets, vec3(0,0,0));
do_once for(int i = 0; i < 100; ++i)
array_push(sw.boids, boid(scale3(rnd3(),10), rnd3())); // pos,vel
array_push(sw.boids, boid(scale3(rnd3(),10), scale3(rnd3(),.10))); // pos,vel

// move
sw.steering_targets[0] = cam.position;
swarm_update(&sw, window_delta());
swarm_update(&sw, window_delta()/60);

// draw
for (int j = 0, end = array_count(sw.boids); j < end; ++j) {
Expand Down
86 changes: 52 additions & 34 deletions demos/03-anims.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,37 +12,49 @@

array(mat44) M; // instanced transforms

typedef struct anims_t {
int inuse; // animation number in use
float speed; // x1.00
array(anim_t) anims; // [begin,end,flags] frames of every animation in set
} anims_t;

anims_t animations(const char *pathfile, int flags) {
anims_t a = {0};
a.anims = animlist(pathfile);
if(a.anims) a.speed = 1.0;
return a;
}

int main() {
bool do_showaabb = 0;
bool do_showbones = 0;
bool do_showmodel = 1;
bool do_showgizmo = 1;
bool do_anims = 1;
bool do_instancing = 1;

// 75% sized, MSAAx2
window_create(75, WINDOW_MSAA2);
window_create(75, 0);
window_title(__FILE__);
// window_fps_unlock();

camera_t cam = camera();
skybox_t sky = skybox("cubemaps/stardust", 0);
model_t mdl = model("George.fbx", MODEL_RIMLIGHT); // kgirls01.fbx
anims_t a = animations("George.fbx", 0); // kgirl/animlist.txt
model_t mdl = model("George.fbx", 0);
anims_t a = animations("George.fbx", 0);

// 32*32 max instances
int NUM_INSTANCES = 1;
array_resize(M, 32*32);
for(int z = 0, i = 0; z < 32; ++z) {
for(int x = 0; x < 32; ++x, ++i) {
array_resize(M, 128*128);
for(int z = 0, i = 0; z < 128; ++z) {
for(int x = 0; x < 128; ++x, ++i) {
vec3 pos = vec3(-x*3,0,-z*3);
vec3 rot = vec3(0,-90,0); // kgirl: 0,0,0
vec3 rot = vec3(0,0,0); // kgirl: 0,0,0
vec3 sca = vec3(1,1,1); // kgirl: 2,2,2
compose44(M[i], pos, eulerq(rot), sca);
}
}

// shader_bind(mdl.program);
// shader_vec3("u_rimcolor", vec3(0.12,0.23,0.34));
// shader_vec3("u_rimrange", vec3(0.06,0.74,0.5));

// load all postfx files in all subdirs
fx_load("fx**.fs");

Expand All @@ -53,25 +65,26 @@ int main() {
vec2 filtered_rpad = input_filter_deadzone(input2(GAMEPAD_RPAD), 0.15f/*do_gamepad_deadzone*/ + 1e-3 );
vec2 mouse = scale2(vec2(filtered_rpad.x, filtered_rpad.y), 1.0f);
vec3 wasdec = scale3(vec3(filtered_lpad.x, input(GAMEPAD_LT) - input(GAMEPAD_RT), filtered_lpad.y), 1.0f);
camera_moveby(&cam, wasdec);
camera_moveby(&cam, scale3(wasdec, window_delta() * 60));
camera_fps(&cam, mouse.x,mouse.y);
window_cursor( true );
} else {
bool active = ui_active() || ui_hover() || gizmo_active() ? false : input(MOUSE_L) || input(MOUSE_M) || input(MOUSE_R);
if( active ) cam.speed = clampf(cam.speed + input_diff(MOUSE_W) / 10, 0.05f, 5.0f);
vec2 mouse = scale2(vec2(input_diff(MOUSE_X), -input_diff(MOUSE_Y)), 0.2f * active);
vec3 wasdecq = scale3(vec3(input(KEY_D)-input(KEY_A),input(KEY_E)-(input(KEY_C)||input(KEY_Q)),input(KEY_W)-input(KEY_S)), cam.speed);
camera_moveby(&cam, wasdecq);
camera_fps(&cam, mouse.x,mouse.y);
window_cursor( !active );
camera_freefly(&cam);
}

static vec3 rim_color = {0.2,0.2,0.2};
static vec3 rim_range = {0.11,0.98,0.5};
static vec3 rim_pivot = {0,0,0};
static bool rim_ambient = true;

// skeletal update
static bool is_dragging_slider = 0;
vec2i anim = vec2i( a.anims[ a.inuse ].from, a.anims[ a.inuse ].to );
profile("Skeletal update") {
float delta = window_delta() * 30 * a.speed * !is_dragging_slider; // 30fps anim timer
if(!window_has_pause()) mdl.curframe = model_animate_clip(mdl, mdl.curframe + delta, anim.min, anim.max, a.anims[a.inuse].flags & ANIM_LOOP );
if (do_anims) {
profile("Skeletal update") {
float delta = window_delta() * 30 * a.speed * !is_dragging_slider; // 30fps anim timer
if(!window_has_pause()) mdl.curframe = model_animate_clip(mdl, mdl.curframe + delta, anim.min, anim.max, a.anims[a.inuse].flags & ANIM_LOOP );
}
}

// render
Expand All @@ -88,7 +101,16 @@ int main() {

// characters
profile("Skeletal render") {
if( do_showmodel ) model_render_instanced(mdl, cam.proj, cam.view, M /*mdl.pivot*/, 0, NUM_INSTANCES);
if( do_showmodel ) {
model_rimlight(&mdl, rim_range, rim_color, rim_pivot, rim_ambient);
if (do_instancing) {
model_render_instanced(mdl, cam.proj, cam.view, M /*mdl.pivot*/, NUM_INSTANCES);
} else {
for (int i = 0; i < NUM_INSTANCES; i++) {
model_render(mdl, cam.proj, cam.view, M[i] /*mdl.pivot*/);
}
}
}

if( do_showbones ) model_render_skeleton(mdl, M[0] /*mdl.pivot*/);

Expand All @@ -107,24 +129,20 @@ int main() {
fx_end();

if ( ui_panel("Rim lighting", 0) ) {
static vec3 rimcolor = {0.2,0.2,0.2};
static vec3 rimrange = {0.11,0.98,0.5};
ui_color3f("Color", &rimcolor.x);
ui_clampf("Low", &rimrange.x, 0, 1);
ui_clampf("High", &rimrange.y, 0, 1);
ui_clampf("Mix", &rimrange.z, 0, 1);
// ui_vec
shader_bind(mdl.program);
shader_vec3("u_rimcolor", rimcolor);
shader_vec3("u_rimrange", rimrange);
ui_color3f("Color", &rim_color.x);
ui_clampf("Low", &rim_range.x, 0, 1);
ui_clampf("High", &rim_range.y, 0, 1);
ui_clampf("Mix", &rim_range.z, 0, 1);
ui_panel_end();
}
if( ui_panel("Animation", PANEL_OPEN) ) {
if( ui_bool("Show aabb", &do_showaabb) );
if( ui_bool("Show bones", &do_showbones) );
if( ui_bool("Show models", &do_showmodel) );
if( ui_bool("Show gizmo", &do_showgizmo) );

if( ui_bool("Anims", &do_anims) );
if( ui_bool("Instancing", &do_instancing) );

ui_separator();
if( ui_int("Instances", &NUM_INSTANCES)) NUM_INSTANCES = clampi(NUM_INSTANCES, 1, array_count(M));
ui_separator();
Expand Down
Loading

0 comments on commit 61f0bb0

Please sign in to comment.