From d2bb972930cb45bb907fe23270381aa55688e905 Mon Sep 17 00:00:00 2001 From: Ivan 'provod' Avdeev Date: Fri, 27 May 2022 11:16:15 -0700 Subject: [PATCH] rt: assoc dyn polylights w/ render model fix #355 --- ref_vk/vk_brush.c | 29 ++++++++++------------------- ref_vk/vk_light.h | 2 +- ref_vk/vk_ray_model.c | 7 +++++++ ref_vk/vk_render.h | 3 +++ 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/ref_vk/vk_brush.c b/ref_vk/vk_brush.c index 6934aca2..d5bf3366 100644 --- a/ref_vk/vk_brush.c +++ b/ref_vk/vk_brush.c @@ -22,9 +22,6 @@ typedef struct vk_brush_model_s { vk_render_model_t render_model; int num_water_surfaces; - - rt_light_add_polygon_t *polylights; - int polylights_count; } vk_brush_model_t; static struct { @@ -345,13 +342,6 @@ void VK_BrushModelDraw( const cl_entity_t *ent, int render_mode, const matrix4x4 if (bmodel->render_model.num_geometries == 0) return; - for (int i = 0; i < bmodel->polylights_count; ++i) { - rt_light_add_polygon_t *polylight = bmodel->polylights + i; - polylight->transform_row = (const matrix3x4*)model; - polylight->dynamic = true; - RT_LightAddPolygon(polylight); - } - for (int i = 0; i < bmodel->render_model.num_geometries; ++i) { vk_render_geometry_t *geom = bmodel->render_model.geometries + i; const int surface_index = geom->surf - mod->surfaces; @@ -531,9 +521,9 @@ static qboolean loadBrushSurfaces( model_sizes_t sizes, const model_t *mod ) { } if (is_emissive) { - if (bmodel->polylights) { - ASSERT(bmodel->polylights_count < sizes.emissive_surfaces); - bmodel->polylights[bmodel->polylights_count++] = loadPolyLight(mod, surface_index, surf, emissive); + if (bmodel->render_model.polylights) { + ASSERT(bmodel->render_model.polylights_count < sizes.emissive_surfaces); + bmodel->render_model.polylights[bmodel->render_model.polylights_count++] = loadPolyLight(mod, surface_index, surf, emissive); } else { polylight = loadPolyLight(mod, surface_index, surf, emissive); RT_LightAddPolygon(&polylight); @@ -635,10 +625,11 @@ static qboolean loadBrushSurfaces( model_sizes_t sizes, const model_t *mod ) { R_GeometryBufferUnlock( &buffer ); - if (bmodel->polylights) { - gEngine.Con_Reportf("WHAT %d %d \n", sizes.emissive_surfaces, bmodel->polylights_count); - ASSERT(sizes.emissive_surfaces == bmodel->polylights_count); + if (bmodel->render_model.polylights) { + gEngine.Con_Reportf("Dynamic polylights %d %d \n", sizes.emissive_surfaces, bmodel->render_model.polylights_count); + ASSERT(sizes.emissive_surfaces == bmodel->render_model.polylights_count); } + ASSERT(sizes.num_surfaces == num_geometries); bmodel->render_model.num_geometries = num_geometries; @@ -673,7 +664,7 @@ qboolean VK_BrushModelLoad( VkCommandBuffer cmdbuf, model_t *mod, qboolean map ) bmodel->render_model.geometries = (vk_render_geometry_t*)((char*)(bmodel + 1)); if (!map && sizes.emissive_surfaces) - bmodel->polylights = Mem_Malloc(vk_core.pool, sizeof(bmodel->polylights[0]) * sizes.emissive_surfaces); + bmodel->render_model.polylights = Mem_Malloc(vk_core.pool, sizeof(bmodel->render_model.polylights[0]) * sizes.emissive_surfaces); if (!loadBrushSurfaces(sizes, mod) || !VK_RenderModelInit(cmdbuf, &bmodel->render_model)) { gEngine.Con_Printf(S_ERROR "Could not load model %s\n", mod->name); @@ -698,8 +689,8 @@ void VK_BrushModelDestroy( model_t *mod ) { return; VK_RenderModelDestroy(&bmodel->render_model); - if (bmodel->polylights) - Mem_Free(bmodel->polylights); + if (bmodel->render_model.polylights) + Mem_Free(bmodel->render_model.polylights); Mem_Free(bmodel); mod->cache.data = NULL; } diff --git a/ref_vk/vk_light.h b/ref_vk/vk_light.h index 648b3564..545f3b97 100644 --- a/ref_vk/vk_light.h +++ b/ref_vk/vk_light.h @@ -111,7 +111,7 @@ struct cl_entity_s; void R_LightAddFlashlight( const struct cl_entity_s *ent, qboolean local_player ); struct msurface_s; -typedef struct { +typedef struct rt_light_add_polygon_s { int num_vertices; vec3_t vertices[7]; diff --git a/ref_vk/vk_ray_model.c b/ref_vk/vk_ray_model.c index 4d305330..53b27454 100644 --- a/ref_vk/vk_ray_model.c +++ b/ref_vk/vk_ray_model.c @@ -416,6 +416,13 @@ void VK_RayFrameAddModel( vk_ray_model_t *model, const vk_render_model_t *render kusok->uv_speed[0] = kusok->uv_speed[1] = 0.f; } } + + for (int i = 0; i < render_model->polylights_count; ++i) { + rt_light_add_polygon_t *const polylight = render_model->polylights + i; + polylight->transform_row = (const matrix3x4*)model; + polylight->dynamic = true; + RT_LightAddPolygon(polylight); + } } void XVK_RayModel_ClearForNextFrame( void ) diff --git a/ref_vk/vk_render.h b/ref_vk/vk_render.h index 4a446dbb..8c0d7e81 100644 --- a/ref_vk/vk_render.h +++ b/ref_vk/vk_render.h @@ -120,6 +120,7 @@ struct vk_ray_model_s; #define MAX_MODEL_NAME_LENGTH 64 +struct rt_light_add_polygon_s; typedef struct vk_render_model_s { char debug_name[MAX_MODEL_NAME_LENGTH]; int render_mode; @@ -134,6 +135,8 @@ typedef struct vk_render_model_s { // Non-NULL only for ray tracing struct vk_ray_model_s *ray_model; + struct rt_light_add_polygon_s *polylights; + int polylights_count; } vk_render_model_t; qboolean VK_RenderModelInit( VkCommandBuffer cmdbuf, vk_render_model_t* model );