Skip to content

Commit f7d6924

Browse files
committed
Merge pull request #100677 from clayjohn/light2d-cull
Properly transform light rect and occluder rect to perform Light2D culling in canvas space
2 parents 4b33387 + 30801af commit f7d6924

File tree

3 files changed

+11
-8
lines changed

3 files changed

+11
-8
lines changed

drivers/gles3/rasterizer_canvas_gles3.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -857,7 +857,7 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend
857857
Light *light = p_lights;
858858

859859
while (light) {
860-
if (light->render_index_cache >= 0 && p_item->light_mask & light->item_mask && p_item->z_final >= light->z_min && p_item->z_final <= light->z_max && p_item->global_rect_cache.intersects_transformed(light->xform_cache, light->rect_cache)) {
860+
if (light->render_index_cache >= 0 && p_item->light_mask & light->item_mask && p_item->z_final >= light->z_min && p_item->z_final <= light->z_max && p_item->global_rect_cache.intersects(light->rect_cache)) {
861861
uint32_t light_index = light->render_index_cache;
862862
lights[light_count >> 2] |= light_index << ((light_count & 3) * 8);
863863

servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -1035,14 +1035,14 @@ void RendererCanvasRenderRD::light_update_shadow(RID p_rid, int p_shadow_index,
10351035
while (instance) {
10361036
OccluderPolygon *co = occluder_polygon_owner.get_or_null(instance->occluder);
10371037

1038+
occluder_count++;
1039+
10381040
if (!co || co->index_array.is_null()) {
10391041
instance = instance->next;
10401042
continue;
10411043
}
10421044

1043-
occluder_count++;
1044-
1045-
if (!(p_light_mask & instance->light_mask) || !p_light_rect.intersects(instance->aabb_cache)) {
1045+
if (!(p_light_mask & instance->light_mask) || !p_light_rect.intersects_transformed(instance->xform_cache, instance->aabb_cache)) {
10461046
instance = instance->next;
10471047
continue;
10481048
}
@@ -2353,7 +2353,7 @@ void RendererCanvasRenderRD::_record_item_commands(const Item *p_item, RenderTar
23532353
Light *light = p_lights;
23542354

23552355
while (light) {
2356-
if (light->render_index_cache >= 0 && p_item->light_mask & light->item_mask && p_item->z_final >= light->z_min && p_item->z_final <= light->z_max && p_item->global_rect_cache.intersects_transformed(light->xform_cache, light->rect_cache)) {
2356+
if (light->render_index_cache >= 0 && p_item->light_mask & light->item_mask && p_item->z_final >= light->z_min && p_item->z_final <= light->z_max && p_item->global_rect_cache.intersects(light->rect_cache)) {
23572357
uint32_t light_index = light->render_index_cache;
23582358
lights[light_count >> 2] |= light_index << ((light_count & 3) * 8);
23592359

servers/rendering/renderer_viewport.cpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,9 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) {
413413
cl->xform_cache = xf * cl->xform_cache;
414414
}
415415

416-
if (clip_rect.intersects_transformed(cl->xform_cache, cl->rect_cache)) {
416+
Rect2 temp_rect = cl->xform_cache.xform(cl->rect_cache);
417+
418+
if (clip_rect.intersects(temp_rect)) {
417419
cl->filter_next_ptr = lights;
418420
lights = cl;
419421
Transform2D scale;
@@ -423,12 +425,13 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) {
423425
if (cl->use_shadow) {
424426
cl->shadows_next_ptr = lights_with_shadow;
425427
if (lights_with_shadow == nullptr) {
426-
shadow_rect = cl->xform_cache.xform(cl->rect_cache);
428+
shadow_rect = temp_rect;
427429
} else {
428-
shadow_rect = shadow_rect.merge(cl->xform_cache.xform(cl->rect_cache));
430+
shadow_rect = shadow_rect.merge(temp_rect);
429431
}
430432
lights_with_shadow = cl;
431433
cl->radius_cache = cl->rect_cache.size.length();
434+
cl->rect_cache = temp_rect;
432435
}
433436
}
434437
}

0 commit comments

Comments
 (0)