@@ -87,6 +87,14 @@ void SpriteBase3D::_notification(int p_what) {
8787 }
8888}
8989
90+ void SpriteBase3D::_validate_property (PropertyInfo &p_property) const {
91+ if (get_material_override ().is_valid ()) {
92+ if (p_property.name == " billboard" || p_property.name == " transparent" || p_property.name == " shaded" || p_property.name == " double_sided" || p_property.name == " no_depth_test" || p_property.name == " fixed_size" || p_property.name == " alpha_cut" || p_property.name == " alpha_scissor_threshold" || p_property.name == " alpha_hash_scale" || p_property.name == " alpha_antialiasing_mode" || p_property.name == " alpha_antialiasing_edge" || p_property.name == " texture_filter" || p_property.name == " render_priority" ) {
93+ p_property.usage = PROPERTY_USAGE_NO_EDITOR;
94+ }
95+ }
96+ }
97+
9098void SpriteBase3D::draw_texture_rect (Ref<Texture2D> p_texture, Rect2 p_dst_rect, Rect2 p_src_rect) {
9199 ERR_FAIL_COND (p_texture.is_null ());
92100
@@ -250,38 +258,46 @@ void SpriteBase3D::draw_texture_rect(Ref<Texture2D> p_texture, Rect2 p_dst_rect,
250258 RS::get_singleton ()->mesh_set_custom_aabb (mesh_new, aabb_new);
251259 set_aabb (aabb_new);
252260
253- RS::get_singleton ()->material_set_param (get_material (), " alpha_scissor_threshold" , alpha_scissor_threshold);
254- RS::get_singleton ()->material_set_param (get_material (), " alpha_hash_scale" , alpha_hash_scale);
255- RS::get_singleton ()->material_set_param (get_material (), " alpha_antialiasing_edge" , alpha_antialiasing_edge);
256-
257- BaseMaterial3D::Transparency mat_transparency = BaseMaterial3D::Transparency::TRANSPARENCY_DISABLED;
258- if (get_draw_flag (FLAG_TRANSPARENT)) {
259- if (get_alpha_cut_mode () == ALPHA_CUT_DISCARD) {
260- mat_transparency = BaseMaterial3D::Transparency::TRANSPARENCY_ALPHA_SCISSOR;
261- } else if (get_alpha_cut_mode () == ALPHA_CUT_OPAQUE_PREPASS) {
262- mat_transparency = BaseMaterial3D::Transparency::TRANSPARENCY_ALPHA_DEPTH_PRE_PASS;
263- } else if (get_alpha_cut_mode () == ALPHA_CUT_HASH) {
264- mat_transparency = BaseMaterial3D::Transparency::TRANSPARENCY_ALPHA_HASH;
265- } else {
266- mat_transparency = BaseMaterial3D::Transparency::TRANSPARENCY_ALPHA;
261+ if (get_material_override ().is_null ()) {
262+ RS::get_singleton ()->material_set_param (get_material (), " alpha_scissor_threshold" , alpha_scissor_threshold);
263+ RS::get_singleton ()->material_set_param (get_material (), " alpha_hash_scale" , alpha_hash_scale);
264+ RS::get_singleton ()->material_set_param (get_material (), " alpha_antialiasing_edge" , alpha_antialiasing_edge);
265+
266+ BaseMaterial3D::Transparency mat_transparency = BaseMaterial3D::Transparency::TRANSPARENCY_DISABLED;
267+ if (get_draw_flag (FLAG_TRANSPARENT)) {
268+ if (get_alpha_cut_mode () == ALPHA_CUT_DISCARD) {
269+ mat_transparency = BaseMaterial3D::Transparency::TRANSPARENCY_ALPHA_SCISSOR;
270+ } else if (get_alpha_cut_mode () == ALPHA_CUT_OPAQUE_PREPASS) {
271+ mat_transparency = BaseMaterial3D::Transparency::TRANSPARENCY_ALPHA_DEPTH_PRE_PASS;
272+ } else if (get_alpha_cut_mode () == ALPHA_CUT_HASH) {
273+ mat_transparency = BaseMaterial3D::Transparency::TRANSPARENCY_ALPHA_HASH;
274+ } else {
275+ mat_transparency = BaseMaterial3D::Transparency::TRANSPARENCY_ALPHA;
276+ }
267277 }
268- }
269278
270- RID shader_rid;
271- StandardMaterial3D::get_material_for_2d (get_draw_flag (FLAG_SHADED), mat_transparency, get_draw_flag (FLAG_DOUBLE_SIDED), get_billboard_mode () == StandardMaterial3D::BILLBOARD_ENABLED, get_billboard_mode () == StandardMaterial3D::BILLBOARD_FIXED_Y, false , get_draw_flag (FLAG_DISABLE_DEPTH_TEST), get_draw_flag (FLAG_FIXED_SIZE), get_texture_filter (), alpha_antialiasing_mode, &shader_rid);
279+ RID shader_rid;
280+ StandardMaterial3D::get_material_for_2d (get_draw_flag (FLAG_SHADED), mat_transparency, get_draw_flag (FLAG_DOUBLE_SIDED), get_billboard_mode () == StandardMaterial3D::BILLBOARD_ENABLED, get_billboard_mode () == StandardMaterial3D::BILLBOARD_FIXED_Y, false , get_draw_flag (FLAG_DISABLE_DEPTH_TEST), get_draw_flag (FLAG_FIXED_SIZE), get_texture_filter (), alpha_antialiasing_mode, &shader_rid);
272281
273- if (last_shader != shader_rid) {
274- RS::get_singleton ()->material_set_shader (get_material (), shader_rid);
275- last_shader = shader_rid;
276- }
277- if (last_texture != p_texture->get_rid ()) {
278- RS::get_singleton ()->material_set_param (get_material (), " texture_albedo" , p_texture->get_rid ());
279- RS::get_singleton ()->material_set_param (get_material (), " albedo_texture_size" , Vector2i (p_texture->get_width (), p_texture->get_height ()));
280- last_texture = p_texture->get_rid ();
281- }
282- if (get_alpha_cut_mode () == ALPHA_CUT_DISABLED) {
283- RS::get_singleton ()->material_set_render_priority (get_material (), get_render_priority ());
284- RS::get_singleton ()->mesh_surface_set_material (mesh, 0 , get_material ());
282+ if (last_shader != shader_rid) {
283+ RS::get_singleton ()->material_set_shader (get_material (), shader_rid);
284+ last_shader = shader_rid;
285+ }
286+ if (last_texture != p_texture->get_rid ()) {
287+ RS::get_singleton ()->material_set_param (get_material (), " texture_albedo" , p_texture->get_rid ());
288+ RS::get_singleton ()->material_set_param (get_material (), " albedo_texture_size" , Vector2i (p_texture->get_width (), p_texture->get_height ()));
289+ last_texture = p_texture->get_rid ();
290+ }
291+ if (get_alpha_cut_mode () == ALPHA_CUT_DISABLED) {
292+ RS::get_singleton ()->material_set_render_priority (get_material (), get_render_priority ());
293+ RS::get_singleton ()->mesh_surface_set_material (mesh, 0 , get_material ());
294+ }
295+ } else {
296+ if (last_texture != p_texture->get_rid ()) {
297+ RS::get_singleton ()->material_set_param (get_material_override ()->get_rid (), " texture_albedo" , p_texture->get_rid ());
298+ RS::get_singleton ()->material_set_param (get_material_override ()->get_rid (), " albedo_texture_size" , Vector2i (p_texture->get_width (), p_texture->get_height ()));
299+ last_texture = p_texture->get_rid ();
300+ }
285301 }
286302}
287303
@@ -477,6 +493,37 @@ Ref<TriangleMesh> SpriteBase3D::generate_triangle_mesh() const {
477493 return triangle_mesh;
478494}
479495
496+ PackedStringArray SpriteBase3D::get_configuration_warnings () const {
497+ PackedStringArray warnings = GeometryInstance3D::get_configuration_warnings ();
498+ Ref<Material> mat_override = get_material_override ();
499+ if (mat_override.is_valid ()) {
500+ RID shader = mat_override->get_shader_rid ();
501+ if (shader.is_null ()) {
502+ warnings.push_back (RTR (" Material Override must be assigned a shader in order to work correctly." ));
503+ } else {
504+ List<PropertyInfo> parameters;
505+ RS::get_singleton ()->get_shader_parameter_list (shader, ¶meters);
506+ bool found_texture_albedo = false ;
507+ bool found_albedo_texture_size = false ;
508+ for (const PropertyInfo ¶meter : parameters) {
509+ if (!found_texture_albedo && parameter.name == " texture_albedo" && parameter.type == Variant::OBJECT && parameter.hint_string == " Texture2D" ) {
510+ found_texture_albedo = true ;
511+ } else if (!found_albedo_texture_size && parameter.name == " albedo_texture_size" && parameter.type == Variant::VECTOR2I) {
512+ found_albedo_texture_size = true ;
513+ }
514+ }
515+
516+ if (!found_texture_albedo) {
517+ warnings.push_back (RTR (" Sprite shaders must contain uniform \" texture_albedo\" of type: sampler2D." ));
518+ }
519+ if (!found_albedo_texture_size) {
520+ warnings.push_back (RTR (" Sprite shaders must contain uniform \" albedo_texture_size\" of type: ivec2." ));
521+ }
522+ }
523+ }
524+ return warnings;
525+ }
526+
480527void SpriteBase3D::set_draw_flag (DrawFlags p_flag, bool p_enable) {
481528 ERR_FAIL_INDEX (p_flag, FLAG_MAX);
482529
@@ -747,6 +794,8 @@ SpriteBase3D::SpriteBase3D() {
747794 RS::get_singleton ()->mesh_surface_make_offsets_from_format (sd.format , sd.vertex_count , sd.index_count , mesh_surface_offsets, vertex_stride, normal_tangent_stride, attrib_stride, skin_stride);
748795 RS::get_singleton ()->mesh_add_surface (mesh, sd);
749796 set_base (mesh);
797+
798+ connect (CoreStringName (property_list_changed), callable_mp ((Node *)this , &Node::update_configuration_warnings));
750799}
751800
752801SpriteBase3D::~SpriteBase3D () {
0 commit comments