v4k-git-backup/demos/99-lmap.c

80 lines
2.9 KiB
C

#include "v4k.h"
model_t litm;
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", 4.0);
model_render(litm, proj, view, litm.pivot, lm->shader);
}
void progressupdate(float progress) {
static double lastUpdateTime = 0.0;
double time = time_ss();
if (time - lastUpdateTime > 1.0) {
lastUpdateTime = time;
PRINTF("progress: %.02f%%", progress*100);
}
// window_swap();
}
int main()
{
window_create(0.5, 0);
window_title(__FILE__);
camera_t cam = camera();
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", 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);
scale44(mdl.pivot, 4,4,4);
shader_bind(mdl.program);
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);
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);
bool do_bake=0;
int b=1;
while (window_swap() && !input(KEY_ESC)) {
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 );
skybox_render(&sky, cam.proj, cam.view);
model_render(mdl, cam.proj, cam.view, mdl.pivot, 0);
model_render(litm, cam.proj, cam.view, litm.pivot, 0);
if( ui_panel("Lightmapper", PANEL_OPEN) ) {
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(s)", b)) ) {
do_bake=1;
}
ui_panel_end();
}
if (do_bake) {
do_bake=0;
lightmap_bake(&baker, b, bakedrawmodel, progressupdate, 0);
}
}
}