From eebe5238f6772be116b09ff8cecf23528c2413aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Madar=C3=A1sz?= Date: Sun, 10 Dec 2023 17:08:22 +0100 Subject: [PATCH] update demos --- demos/01-demo2d.c | 6 +- demos/99-geom.c | 2 +- demos/99-gizmo.c | 59 +++++++++++++ demos/99-gui.c | 38 ++++++--- demos/99-lmap.c | 24 +++--- demos/99-sponza.c | 2 +- demos/art/fonts/lilita_one_regular.license | 94 +++++++++++++++++++++ demos/art/fonts/lilita_one_regular.ttf | Bin 0 -> 28076 bytes 8 files changed, 195 insertions(+), 30 deletions(-) create mode 100644 demos/99-gizmo.c create mode 100644 demos/art/fonts/lilita_one_regular.license create mode 100644 demos/art/fonts/lilita_one_regular.ttf diff --git a/demos/01-demo2d.c b/demos/01-demo2d.c index 854280b..d474c66 100644 --- a/demos/01-demo2d.c +++ b/demos/01-demo2d.c @@ -29,9 +29,9 @@ void demo_kids(vec3 offs) { float position[3] = {pos[i].x,pos[i].y,pos[i].y}, offset[2]={0,0}, scale[2]={0.5,0.5}; float spritesheet[3]={num_frame,4,4}; sprite_sheet(kids, - spritesheet, // num_frame in a 4x4 spritesheet - position, 0, // position(x,y,depth:sort-by-Y), angle - offset, scale, // offset(x,y), scale(x,y) + spritesheet, // num_frame in a 4x4 spritesheet + position, 0, // position(x,y,depth:sort-by-Y), angle + offset, scale, // offset(x,y), scale(x,y) WHITE, 0 // tint_color, no flags ); } diff --git a/demos/99-geom.c b/demos/99-geom.c index bb62f64..db18312 100644 --- a/demos/99-geom.c +++ b/demos/99-geom.c @@ -5,7 +5,7 @@ int main() { window_create(25, WINDOW_SQUARE); window_title(__FILE__); - unsigned program = shader_geom(vfs_read("shaders/geom-test/line.glsl"), vfs_read("shaders/geom-test/line-vs.glsl"), vfs_read("shaders/geom-test/line-fs.glsl"), "aPos", "FragColor", NULL ); + unsigned program = shader_geom(vfs_read("shaders/geom-test/line.glsl"), vfs_read("shaders/geom-test/line-vs.glsl"), vfs_read("shaders/geom-test/line-fs.glsl"), "aPos", "FragColor", NULL); float points[] = { -0.5f, 0.5f, // top-left diff --git a/demos/99-gizmo.c b/demos/99-gizmo.c new file mode 100644 index 0000000..09a227d --- /dev/null +++ b/demos/99-gizmo.c @@ -0,0 +1,59 @@ +#include "v4k.h" + +void gizmo2(float *pos, float *rot, float *sca, float *pivot) { + vec3 p = ptr3(pos); + vec3 r = ptr3(rot); + vec3 s = ptr3(sca); + gizmo(&p, &r, &s); + if(pivot) compose44(pivot, p, eulerq(r), s); + memcpy(pos, &p, sizeof(p)); + memcpy(rot, &r, sizeof(r)); + memcpy(sca, &s, sizeof(s)); +} + +int main() { + argvadd("--cook-on-demand"); + window_create(0.75, 0); + + // setup cam + camera_t cam = camera(); + cam.fov = 60; + cam.position = vec3(10,10,10); + camera_enable(&cam); + + while( window_swap() ) { + + // fps camera + 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 ); + + static vec3 min = {0,0,0}, max = {1,1,1}; + ddraw_aabb( min, max ); + ddraw_ground(0); + ddraw_flush(); + + static model_t mdl; + do_once mdl = model("meshes/gizmo.fbx", 0); + shader_bind(mdl.program); + vec3 color = {0,0,0}; + vec3 coeff[9] = { color,color,color,color,color,color,color,color,color, }; + shader_vec3v("u_coefficients_sh", 9, coeff); + shader_int("u_textured", false); + model_render(mdl, cam.proj, cam.view, mdl.pivot, 0); + + static mat44 pivot = {0}; + static int do_showgizmo = 1; + if( do_showgizmo ) { + static vec3 p = {0,0,0}, r = {0,-90,0}, s = {1,1,1}; + gizmo2(&p.x, &r.x, &s.x, mdl.pivot); + } + + // debug + font_print(va(FONT_RIGHT "%d(%d)", gizmo_active(), gizmo_hover())); + } +} diff --git a/demos/99-gui.c b/demos/99-gui.c index ddae7d4..32012d1 100644 --- a/demos/99-gui.c +++ b/demos/99-gui.c @@ -1,10 +1,10 @@ #include "v4k.h" int main() { - window_create(65.0, 0 ); + window_create(75.0, 0 ); - gui_pushskin(gui_skinned("golden.ase", 4.0f)); - skinned_t *skinned = C_CAST(skinned_t*, gui_userdata()); + gui_pushskin(gui_skinned("golden.ase", 3.0f)); // x3 scale + skinned_t *skinned = (skinned_t*)gui_userdata(); vec4 pos = vec4(400,400,100, 30); @@ -12,8 +12,7 @@ int main() { float testval2=7.5f; while( window_swap() && !input(KEY_ESC) ) { // game loop - vec4 panel_pos = vec4(0, 0, window_width(), window_height()); - + if (ui_panel("Atlas", 0)) { ui_atlas(&skinned->atlas); ui_panel_end(); @@ -25,6 +24,12 @@ int main() { ui_panel_end(); } + if (ui_panel("Fonts", 0)) { + ui_font(); + + ui_panel_end(); + } + if (input_down(MOUSE_R)) { pos.x = input(MOUSE_X); pos.y = input(MOUSE_Y); @@ -34,26 +39,37 @@ int main() { pos.w = input(MOUSE_Y)-pos.y; } - // + // font + do_once font_face(FONT_FACE2, "lilita_one_regular.ttf", 48.0f, FONT_EU | FONT_2048); + do_once font_color(FONT_COLOR9, WHITE); + font_print(va(FONT_MIDDLE FONT_CENTER FONT_FACE2 FONT_COLOR9 "%s", "Hello")); + + // background + vec4 panel_pos = vec4(0, 0, window_width(), window_height()); gui_panel(panel_pos, "panel"); - if (gui_button_label(FONT_H1 "PRESS", pos, 0)) { + + // button + if (gui_button_label(FONT_FACE2 "PRESS", pos, 0)) { printf("%s\n", "Button pressed!"); } + // vials gui_rect(vec4(40,140, 320, 20*skinned->scale), "vial"); gui_rect(vec4(40,140, 200, 14*skinned->scale), "hp"); gui_rect(vec4(40,240, 240, 20*skinned->scale), "vial"); gui_rect(vec4(40,240, 160, 14*skinned->scale), "mp"); - vec2 badge_size = gui_getskinsize("badge", 0); + // buttons + vec2 badge_size = gui_getskinsize("badge", NULL); badge_size.x += 2; // padding gui_rect(vec4(60+badge_size.x*0,320, 1, 1), "badge"); gui_rect(vec4(60+badge_size.x*1,320, 1, 1), "badge"); gui_rect(vec4(60+badge_size.x*2,320, 1, 1), "badge_empty"); - vec2 slider_size = gui_getskinsize("slider", 0); - gui_slider(vec4(60, 480, 80*skinned->scale, 1), 0, 0.0f, 15.0f, 1.0f, &testval); - gui_slider_label(va(FONT_H1 "%.02f", testval2), vec4(60, 480+slider_size.y+10, 120*skinned->scale, 1), 0, -5.0f, 20.0f, 0.0f, &testval2); + // sliders + vec2 slider_size = gui_getskinsize("slider", NULL); + gui_slider(vec4(60, 420, 80*skinned->scale, 1), 0, 0.0f, 15.0f, 1.0f, &testval); + gui_slider_label(va(FONT_FACE2 "%.02f", testval2), vec4(60, 420+slider_size.y+10, 120*skinned->scale, 1), 0, -5.0f, 20.0f, 0.0f, &testval2); gui_panel_end(); } diff --git a/demos/99-lmap.c b/demos/99-lmap.c index 14740f6..0739412 100644 --- a/demos/99-lmap.c +++ b/demos/99-lmap.c @@ -1,13 +1,11 @@ #include "v4k.h" -skybox_t sky; model_t litm; -lightmap_t baker; void bakedrawmodel(lightmap_t *lm, model_t *m, float *view, float *proj, void *userdata) { shader_bind(lm->shader); model_render(*m, proj, view, m->pivot, lm->shader); - shader_float("u_litboost", 8.0); + shader_float("u_litboost", 4.0); model_render(litm, proj, view, litm.pivot, lm->shader); } @@ -26,13 +24,11 @@ int main() window_create(0.5, 0); window_title(__FILE__); camera_t cam = camera(); - sky = skybox(0, 0); skybox_mie_calc_sh(&sky, 2.0f); - model_t mdl = model("gazebo.obj", 0); - litm = model("kgirls01.fbx", 0); + skybox_t sky = skybox(0, 0); skybox_mie_calc_sh(&sky, 2.0f); + model_t mdl = model(option("--model","gazebo.obj"), 0); + litm = model("cube.obj", MODEL_MATCAPS); { - mat44 lp; id44(lp); - // scaling44(lp, 10, 10, 10); - translate44(lp, 0,2,0); + mat44 lp; scaling44(lp, 0.3, 0.3, 0.3); translate44(lp, 8,4,0); copy44(litm.pivot, lp); } rotate44(mdl.pivot, -90, 1, 0, 0); @@ -41,11 +37,11 @@ int main() shader_vec3v("u_coefficients_sh", 9, sky.cubemap.sh); // shader_bool("u_texmod", 0); - // unsigned char emissive[] = { 255, 180, 0, 255 }; - // texture_t emission = texture_create(1,1,4,emissive,TEXTURE_LINEAR); - // model_set_texture(litm, emission); + unsigned char emissive[] = { 255, 180, 0, 255 }; + texture_t emission = texture_create(1,1,4,emissive,TEXTURE_LINEAR); + model_set_texture(litm, emission); - baker = lightmap(64, 0.01, 100, vec3(0,0,0), 2, 0.01, -1.0); + lightmap_t baker = lightmap(64, 0.01, 100, vec3(0,0,0), 2, 0.01, 0.0); lightmap_setup(&baker, 512, 512); array_push(baker.models, &mdl); @@ -69,7 +65,7 @@ int main() ui_label2("Freecam", "Mouse + W/A/S/D/E/Q keys"); ui_label("Warning " ICON_MD_WARNING "@This will take a few seconds and bake a lightmap illuminated by: The mesh itself (initially black) + A white sky (1.0f, 1.0f, 1.0f)"); ui_int("Bounces", &b); - if( ui_button(va("Bake %d light bounce", b)) ) { + if( ui_button(va("Bake %d light bounce(s)", b)) ) { do_bake=1; } ui_panel_end(); diff --git a/demos/99-sponza.c b/demos/99-sponza.c index 533e190..7ba2694 100644 --- a/demos/99-sponza.c +++ b/demos/99-sponza.c @@ -15,7 +15,7 @@ int main() { // load static scene model_t sponza; - sponza = model("sponza.obj", 0); // MODEL_NO_TEXTURES); + sponza = model(option("--model","sponza.obj"), 0); // MODEL_NO_TEXTURES); translation44(sponza.pivot, 0,-1,0); rotate44(sponza.pivot, -90,1,0,0); scale44(sponza.pivot, 10,10,10); diff --git a/demos/art/fonts/lilita_one_regular.license b/demos/art/fonts/lilita_one_regular.license new file mode 100644 index 0000000..d78a38d --- /dev/null +++ b/demos/art/fonts/lilita_one_regular.license @@ -0,0 +1,94 @@ +Copyright (c) 2011 Juan Montoreano (juan@remolacha.biz), +with Reserved Font Name Lilita + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/demos/art/fonts/lilita_one_regular.ttf b/demos/art/fonts/lilita_one_regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ee26a09e54f69d2a75ed81c3979fc54c91a37492 GIT binary patch literal 28076 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 X`DAc0|Kqen-v8ap@R$1k_SpXeH1@S7 literal 0 HcmV?d00001