rt: assoc dyn polylights w/ render model

fix #355
This commit is contained in:
Ivan 'provod' Avdeev 2022-05-27 11:16:15 -07:00 committed by Ivan Avdeev
parent 4e1982815c
commit d2bb972930
4 changed files with 21 additions and 20 deletions

View File

@ -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;
}

View File

@ -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];

View File

@ -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 )

View File

@ -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 );