From 0326eb9c816a2f4fdf74f9bb4205d0abfafe0535 Mon Sep 17 00:00:00 2001 From: Alexander Klingenbeck Date: Mon, 19 Jun 2023 09:25:44 +0200 Subject: [PATCH] Fix lightmapper integration --- .gitignore | 1 + src/lightmapper_example.c | 89 +++++++++++++++++++++++---------------- 2 files changed, 54 insertions(+), 36 deletions(-) diff --git a/.gitignore b/.gitignore index dc7681b..d471748 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ lightmapper_example lightmapper_example.exe result.png monkey.obj +my_result.png diff --git a/src/lightmapper_example.c b/src/lightmapper_example.c index e16447f..799312e 100644 --- a/src/lightmapper_example.c +++ b/src/lightmapper_example.c @@ -113,17 +113,30 @@ void UnloadLightmapper(Lightmapper lm){ lmDestroy((lm_context *)lm.lm_handle); } +static Matrix mProjection; +static Matrix mModelview; + void BeginLightmap() { rlEnableDepthTest(); rlDisableColorBlend(); rlDisableBackfaceCulling(); + mProjection = rlGetMatrixProjection(); + mModelview = rlGetMatrixModelview(); } void EndLightmap(){ - rlDisableDepthTest(); + //rlDisableDepthTest(); rlEnableColorBlend(); rlEnableBackfaceCulling(); + int w = GetScreenWidth() * GetWindowScaleDPI().x; + int h = GetScreenHeight() * GetWindowScaleDPI().y; + rlViewport(0, 0, w, h); + rlDisableFramebuffer(); + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + rlSetMatrixModelview(mModelview); + rlSetMatrixProjection(mProjection); } static int vp[4]; @@ -147,8 +160,8 @@ bool BeginLightmapFragment(Lightmapper * lm){ } void EndLightmapFragment(Lightmapper * lm){ - lmEnd((lm_context *)lm->lm_handle); lm->progress = lmProgress((lm_context *)lm->lm_handle); + lmEnd((lm_context *)lm->lm_handle); } Image LoadImageFromLightmapper(Lightmapper lm){ @@ -177,7 +190,7 @@ Image LoadImageFromLightmapper(Lightmapper lm){ im.format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8; im.height = lm.w; im.width = lm.h; - + im.mipmaps = 1; return im; } @@ -318,46 +331,50 @@ int main(int argc, char* argv[]) camera.projection = CAMERA_PERSPECTIVE; // Camera mode type scene.camera = camera; - bake(&scene); - // Lightmapper lm = LoadLightmapper(scene.w, scene.h, scene.raylib_model.meshes[0], GetDefaultLightmapperConfig()); - // double lastUpdateTime = 0; - - // BeginLightmap(); - // while(BeginLightmapFragment(&lm)){ - // float intensity = 1.0f; - // SetShaderValue(scene.shader, scene.u_intensity, &intensity, SHADER_UNIFORM_FLOAT); - // drawScene(&scene); - // EndLightmapFragment(&lm); - // // display progress every second (printf is expensive) - // double time = GetTime(); - // if (time - lastUpdateTime > 0.05) - // { - // lastUpdateTime = time; - // printf("\r%6.2f%%", lm.progress * 100.0f); - // fflush(stdout); - // } - // } - // EndLightmap(); - // Image img = LoadImageFromLightmapper(lm); - // //ExportImage(img, "my_result.png"); - // UnloadTexture(scene.raylib_texture); - // scene.raylib_texture = LoadTextureFromImage(img); - // scene.raylib_model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = scene.raylib_texture; + Lightmapper lm = LoadLightmapper(scene.w, scene.h, scene.raylib_model.meshes[0], GetDefaultLightmapperConfig()); while (!WindowShouldClose()) { - int w = GetScreenWidth() * GetWindowScaleDPI().x; - int h = GetScreenHeight() * GetWindowScaleDPI().y; - - rlViewport(0, 0, w, h); - - BeginDrawing(); - BeginMode3D(scene.camera); - ClearBackground(BLUE); + if(lm.progress < 1.0f){ + double startTime = GetTime(); + BeginLightmap(); + while(BeginLightmapFragment(&lm)){ float intensity = 1.0f; SetShaderValue(scene.shader, scene.u_intensity, &intensity, SHADER_UNIFORM_FLOAT); drawScene(&scene); + EndLightmapFragment(&lm); + // display progress every second (printf is expensive) + double time = GetTime(); + if (GetTime() - startTime > 0.03) + { + printf("\r%6.2f%%", lm.progress * 100.0f); + fflush(stdout); + break; + } + } + EndLightmap(); + if(lm.progress == 1.0f){ + Image img = LoadImageFromLightmapper(lm); + ExportImage(img, "my_result.png"); + //UnloadTexture(scene.raylib_texture); + scene.raylib_texture = LoadTextureFromImage(img); + scene.raylib_model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = scene.raylib_texture; + UnloadLightmapper(lm); + } + } + + BeginDrawing(); + ClearBackground(BLUE); + BeginMode3D(scene.camera); + float intensity = 1.0f; + SetShaderValue(scene.shader, scene.u_intensity, &intensity, SHADER_UNIFORM_FLOAT); + drawScene(&scene); EndMode3D(); + // printf("%d\n",(int)(lm.progress*GetScreenWidth())); + if(lm.progress < 1.0f){ + DrawRectangle(0,0,GetScreenWidth(),20, Fade(GREEN,0.5)); + DrawRectangle(0,0,GetScreenWidth()*lm.progress,20, GREEN); + } EndDrawing(); }