Merge pull request #69735 from clayjohn/Particles2D-sdf
Detect and report if 2D particles use the screen SDF
This commit is contained in:
commit
60d7525d84
|
@ -454,7 +454,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
|
||||||
update_skeletons = false;
|
update_skeletons = false;
|
||||||
}
|
}
|
||||||
// Canvas group begins here, render until before this item
|
// Canvas group begins here, render until before this item
|
||||||
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, false);
|
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, r_sdf_used);
|
||||||
item_count = 0;
|
item_count = 0;
|
||||||
|
|
||||||
if (ci->canvas_group_owner->canvas_group->mode != RS::CANVAS_GROUP_MODE_TRANSPARENT) {
|
if (ci->canvas_group_owner->canvas_group->mode != RS::CANVAS_GROUP_MODE_TRANSPARENT) {
|
||||||
|
@ -485,7 +485,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
|
||||||
mesh_storage->update_mesh_instances();
|
mesh_storage->update_mesh_instances();
|
||||||
update_skeletons = false;
|
update_skeletons = false;
|
||||||
}
|
}
|
||||||
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, true);
|
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, r_sdf_used, true);
|
||||||
item_count = 0;
|
item_count = 0;
|
||||||
|
|
||||||
if (ci->canvas_group->blur_mipmaps) {
|
if (ci->canvas_group->blur_mipmaps) {
|
||||||
|
@ -504,7 +504,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
|
||||||
}
|
}
|
||||||
//render anything pending, including clearing if no items
|
//render anything pending, including clearing if no items
|
||||||
|
|
||||||
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, false);
|
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, r_sdf_used);
|
||||||
item_count = 0;
|
item_count = 0;
|
||||||
|
|
||||||
texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps);
|
texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps);
|
||||||
|
@ -530,7 +530,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
|
||||||
mesh_storage->update_mesh_instances();
|
mesh_storage->update_mesh_instances();
|
||||||
update_skeletons = false;
|
update_skeletons = false;
|
||||||
}
|
}
|
||||||
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, false);
|
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, r_sdf_used);
|
||||||
//then reset
|
//then reset
|
||||||
item_count = 0;
|
item_count = 0;
|
||||||
}
|
}
|
||||||
|
@ -549,7 +549,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
|
||||||
state.current_buffer = (state.current_buffer + 1) % state.canvas_instance_data_buffers.size();
|
state.current_buffer = (state.current_buffer + 1) % state.canvas_instance_data_buffers.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, uint32_t &r_last_index, bool p_to_backbuffer) {
|
void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, uint32_t &r_last_index, bool &r_sdf_used, bool p_to_backbuffer) {
|
||||||
GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();
|
GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();
|
||||||
|
|
||||||
canvas_begin(p_to_render_target, p_to_backbuffer);
|
canvas_begin(p_to_render_target, p_to_backbuffer);
|
||||||
|
@ -617,7 +617,7 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou
|
||||||
|
|
||||||
GLES3::CanvasShaderData::BlendMode blend_mode = shader_data_cache ? shader_data_cache->blend_mode : GLES3::CanvasShaderData::BLEND_MODE_MIX;
|
GLES3::CanvasShaderData::BlendMode blend_mode = shader_data_cache ? shader_data_cache->blend_mode : GLES3::CanvasShaderData::BLEND_MODE_MIX;
|
||||||
|
|
||||||
_record_item_commands(ci, p_to_render_target, p_canvas_transform_inverse, current_clip, blend_mode, p_lights, index, batch_broken);
|
_record_item_commands(ci, p_to_render_target, p_canvas_transform_inverse, current_clip, blend_mode, p_lights, index, batch_broken, r_sdf_used);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
|
@ -749,7 +749,7 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou
|
||||||
r_last_index += index;
|
r_last_index += index;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_render_target, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, GLES3::CanvasShaderData::BlendMode p_blend_mode, Light *p_lights, uint32_t &r_index, bool &r_batch_broken) {
|
void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_render_target, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, GLES3::CanvasShaderData::BlendMode p_blend_mode, Light *p_lights, uint32_t &r_index, bool &r_batch_broken, bool &r_sdf_used) {
|
||||||
RenderingServer::CanvasItemTextureFilter texture_filter = p_item->texture_filter == RS::CANVAS_ITEM_TEXTURE_FILTER_DEFAULT ? state.default_filter : p_item->texture_filter;
|
RenderingServer::CanvasItemTextureFilter texture_filter = p_item->texture_filter == RS::CANVAS_ITEM_TEXTURE_FILTER_DEFAULT ? state.default_filter : p_item->texture_filter;
|
||||||
|
|
||||||
if (texture_filter != state.canvas_instance_batches[state.current_batch_index].filter) {
|
if (texture_filter != state.canvas_instance_batches[state.current_batch_index].filter) {
|
||||||
|
@ -1145,6 +1145,7 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend
|
||||||
} else {
|
} else {
|
||||||
particles_storage->particles_set_canvas_sdf_collision(pt->particles, false, Transform2D(), Rect2(), 0);
|
particles_storage->particles_set_canvas_sdf_collision(pt->particles, false, Transform2D(), Rect2(), 0);
|
||||||
}
|
}
|
||||||
|
r_sdf_used |= particles_storage->particles_has_collision(particles);
|
||||||
}
|
}
|
||||||
|
|
||||||
state.canvas_instance_batches[state.current_batch_index].command = c;
|
state.canvas_instance_batches[state.current_batch_index].command = c;
|
||||||
|
|
|
@ -351,8 +351,8 @@ public:
|
||||||
void _prepare_canvas_texture(RID p_texture, RS::CanvasItemTextureFilter p_base_filter, RS::CanvasItemTextureRepeat p_base_repeat, uint32_t &r_index, Size2 &r_texpixel_size);
|
void _prepare_canvas_texture(RID p_texture, RS::CanvasItemTextureFilter p_base_filter, RS::CanvasItemTextureRepeat p_base_repeat, uint32_t &r_index, Size2 &r_texpixel_size);
|
||||||
|
|
||||||
void canvas_render_items(RID p_to_render_target, Item *p_item_list, const Color &p_modulate, Light *p_light_list, Light *p_directional_list, const Transform2D &p_canvas_transform, RS::CanvasItemTextureFilter p_default_filter, RS::CanvasItemTextureRepeat p_default_repeat, bool p_snap_2d_vertices_to_pixel, bool &r_sdf_used) override;
|
void canvas_render_items(RID p_to_render_target, Item *p_item_list, const Color &p_modulate, Light *p_light_list, Light *p_directional_list, const Transform2D &p_canvas_transform, RS::CanvasItemTextureFilter p_default_filter, RS::CanvasItemTextureRepeat p_default_repeat, bool p_snap_2d_vertices_to_pixel, bool &r_sdf_used) override;
|
||||||
void _render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, uint32_t &r_last_index, bool p_to_backbuffer = false);
|
void _render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, uint32_t &r_last_index, bool &r_sdf_used, bool p_to_backbuffer = false);
|
||||||
void _record_item_commands(const Item *p_item, RID p_render_target, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, GLES3::CanvasShaderData::BlendMode p_blend_mode, Light *p_lights, uint32_t &r_index, bool &r_break_batch);
|
void _record_item_commands(const Item *p_item, RID p_render_target, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, GLES3::CanvasShaderData::BlendMode p_blend_mode, Light *p_lights, uint32_t &r_index, bool &r_break_batch, bool &r_sdf_used);
|
||||||
void _render_batch(Light *p_lights, uint32_t p_index);
|
void _render_batch(Light *p_lights, uint32_t p_index);
|
||||||
bool _bind_material(GLES3::CanvasMaterialData *p_material_data, CanvasShaderGLES3::ShaderVariant p_variant, uint64_t p_specialization);
|
bool _bind_material(GLES3::CanvasMaterialData *p_material_data, CanvasShaderGLES3::ShaderVariant p_variant, uint64_t p_specialization);
|
||||||
void _new_batch(bool &r_batch_broken, uint32_t &r_index);
|
void _new_batch(bool &r_batch_broken, uint32_t &r_index);
|
||||||
|
|
|
@ -398,7 +398,7 @@ void RendererCanvasRenderRD::_bind_canvas_texture(RD::DrawListID p_draw_list, RI
|
||||||
r_last_texture = p_texture;
|
r_last_texture = p_texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RendererCanvasRenderRD::_render_item(RD::DrawListID p_draw_list, RID p_render_target, const Item *p_item, RD::FramebufferFormatID p_framebuffer_format, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, Light *p_lights, PipelineVariants *p_pipeline_variants) {
|
void RendererCanvasRenderRD::_render_item(RD::DrawListID p_draw_list, RID p_render_target, const Item *p_item, RD::FramebufferFormatID p_framebuffer_format, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, Light *p_lights, PipelineVariants *p_pipeline_variants, bool &r_sdf_used) {
|
||||||
//create an empty push constant
|
//create an empty push constant
|
||||||
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
|
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
|
||||||
RendererRD::MeshStorage *mesh_storage = RendererRD::MeshStorage::get_singleton();
|
RendererRD::MeshStorage *mesh_storage = RendererRD::MeshStorage::get_singleton();
|
||||||
|
@ -833,6 +833,9 @@ void RendererCanvasRenderRD::_render_item(RD::DrawListID p_draw_list, RID p_rend
|
||||||
} else {
|
} else {
|
||||||
particles_storage->particles_set_canvas_sdf_collision(pt->particles, false, Transform2D(), Rect2(), RID());
|
particles_storage->particles_set_canvas_sdf_collision(pt->particles, false, Transform2D(), Rect2(), RID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Signal that SDF texture needs to be updated.
|
||||||
|
r_sdf_used |= particles_storage->particles_has_collision(pt->particles);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mesh.is_null()) {
|
if (mesh.is_null()) {
|
||||||
|
@ -1045,7 +1048,7 @@ RID RendererCanvasRenderRD::_create_base_uniform_set(RID p_to_render_target, boo
|
||||||
return uniform_set;
|
return uniform_set;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RendererCanvasRenderRD::_render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool p_to_backbuffer) {
|
void RendererCanvasRenderRD::_render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool &r_sdf_used, bool p_to_backbuffer) {
|
||||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||||
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
|
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
|
||||||
|
|
||||||
|
@ -1142,7 +1145,7 @@ void RendererCanvasRenderRD::_render_items(RID p_to_render_target, int p_item_co
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_render_item(draw_list, p_to_render_target, ci, fb_format, canvas_transform_inverse, current_clip, p_lights, pipeline_variants);
|
_render_item(draw_list, p_to_render_target, ci, fb_format, canvas_transform_inverse, current_clip, p_lights, pipeline_variants, r_sdf_used);
|
||||||
|
|
||||||
prev_material = material;
|
prev_material = material;
|
||||||
}
|
}
|
||||||
|
@ -1440,7 +1443,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
|
||||||
update_skeletons = false;
|
update_skeletons = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list);
|
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used);
|
||||||
item_count = 0;
|
item_count = 0;
|
||||||
|
|
||||||
if (ci->canvas_group_owner->canvas_group->mode != RS::CANVAS_GROUP_MODE_TRANSPARENT) {
|
if (ci->canvas_group_owner->canvas_group->mode != RS::CANVAS_GROUP_MODE_TRANSPARENT) {
|
||||||
|
@ -1472,7 +1475,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
|
||||||
update_skeletons = false;
|
update_skeletons = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, true);
|
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, true);
|
||||||
item_count = 0;
|
item_count = 0;
|
||||||
|
|
||||||
if (ci->canvas_group->blur_mipmaps) {
|
if (ci->canvas_group->blur_mipmaps) {
|
||||||
|
@ -1491,7 +1494,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
|
||||||
update_skeletons = false;
|
update_skeletons = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list);
|
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used);
|
||||||
item_count = 0;
|
item_count = 0;
|
||||||
|
|
||||||
texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps);
|
texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps);
|
||||||
|
@ -1517,7 +1520,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
|
||||||
update_skeletons = false;
|
update_skeletons = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list);
|
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, false);
|
||||||
//then reset
|
//then reset
|
||||||
item_count = 0;
|
item_count = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -421,8 +421,8 @@ class RendererCanvasRenderRD : public RendererCanvasRender {
|
||||||
RID _create_base_uniform_set(RID p_to_render_target, bool p_backbuffer);
|
RID _create_base_uniform_set(RID p_to_render_target, bool p_backbuffer);
|
||||||
|
|
||||||
inline void _bind_canvas_texture(RD::DrawListID p_draw_list, RID p_texture, RS::CanvasItemTextureFilter p_base_filter, RS::CanvasItemTextureRepeat p_base_repeat, RID &r_last_texture, PushConstant &push_constant, Size2 &r_texpixel_size); //recursive, so regular inline used instead.
|
inline void _bind_canvas_texture(RD::DrawListID p_draw_list, RID p_texture, RS::CanvasItemTextureFilter p_base_filter, RS::CanvasItemTextureRepeat p_base_repeat, RID &r_last_texture, PushConstant &push_constant, Size2 &r_texpixel_size); //recursive, so regular inline used instead.
|
||||||
void _render_item(RenderingDevice::DrawListID p_draw_list, RID p_render_target, const Item *p_item, RenderingDevice::FramebufferFormatID p_framebuffer_format, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, Light *p_lights, PipelineVariants *p_pipeline_variants);
|
void _render_item(RenderingDevice::DrawListID p_draw_list, RID p_render_target, const Item *p_item, RenderingDevice::FramebufferFormatID p_framebuffer_format, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, Light *p_lights, PipelineVariants *p_pipeline_variants, bool &r_sdf_used);
|
||||||
void _render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool p_to_backbuffer = false);
|
void _render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool &r_sdf_used, bool p_to_backbuffer = false);
|
||||||
|
|
||||||
_FORCE_INLINE_ void _update_transform_2d_to_mat2x4(const Transform2D &p_transform, float *p_mat2x4);
|
_FORCE_INLINE_ void _update_transform_2d_to_mat2x4(const Transform2D &p_transform, float *p_mat2x4);
|
||||||
_FORCE_INLINE_ void _update_transform_2d_to_mat2x3(const Transform2D &p_transform, float *p_mat2x3);
|
_FORCE_INLINE_ void _update_transform_2d_to_mat2x3(const Transform2D &p_transform, float *p_mat2x3);
|
||||||
|
|
Loading…
Reference in New Issue