Merge pull request #72441 from bruvzg/lbl3d_aaa
[Sprite3D/Label3D] Expose alpha antialiasing properties.
This commit is contained in:
commit
d14d6033a5
8 changed files with 97 additions and 5 deletions
|
@ -32,6 +32,12 @@
|
|||
</method>
|
||||
</methods>
|
||||
<members>
|
||||
<member name="alpha_antialiasing_edge" type="float" setter="set_alpha_antialiasing_edge" getter="get_alpha_antialiasing_edge" default="0.0">
|
||||
Threshold at which antialiasing will be applied on the alpha channel.
|
||||
</member>
|
||||
<member name="alpha_antialiasing_mode" type="int" setter="set_alpha_antialiasing" getter="get_alpha_antialiasing" enum="BaseMaterial3D.AlphaAntiAliasing" default="0">
|
||||
The type of alpha antialiasing to apply. See [enum BaseMaterial3D.AlphaAntiAliasing].
|
||||
</member>
|
||||
<member name="alpha_cut" type="int" setter="set_alpha_cut_mode" getter="get_alpha_cut_mode" enum="Label3D.AlphaCutMode" default="0">
|
||||
The alpha cutting mode to use for the sprite. See [enum AlphaCutMode] for possible values.
|
||||
</member>
|
||||
|
|
|
@ -38,6 +38,12 @@
|
|||
</method>
|
||||
</methods>
|
||||
<members>
|
||||
<member name="alpha_antialiasing_edge" type="float" setter="set_alpha_antialiasing_edge" getter="get_alpha_antialiasing_edge" default="0.0">
|
||||
Threshold at which antialiasing will be applied on the alpha channel.
|
||||
</member>
|
||||
<member name="alpha_antialiasing_mode" type="int" setter="set_alpha_antialiasing" getter="get_alpha_antialiasing" enum="BaseMaterial3D.AlphaAntiAliasing" default="0">
|
||||
The type of alpha antialiasing to apply. See [enum BaseMaterial3D.AlphaAntiAliasing].
|
||||
</member>
|
||||
<member name="alpha_cut" type="int" setter="set_alpha_cut_mode" getter="get_alpha_cut_mode" enum="SpriteBase3D.AlphaCutMode" default="0">
|
||||
The alpha cutting mode to use for the sprite. See [enum AlphaCutMode] for possible values.
|
||||
</member>
|
||||
|
|
|
@ -112,6 +112,12 @@ void Label3D::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_alpha_hash_scale", "threshold"), &Label3D::set_alpha_hash_scale);
|
||||
ClassDB::bind_method(D_METHOD("get_alpha_hash_scale"), &Label3D::get_alpha_hash_scale);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_alpha_antialiasing", "alpha_aa"), &Label3D::set_alpha_antialiasing);
|
||||
ClassDB::bind_method(D_METHOD("get_alpha_antialiasing"), &Label3D::get_alpha_antialiasing);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_alpha_antialiasing_edge", "edge"), &Label3D::set_alpha_antialiasing_edge);
|
||||
ClassDB::bind_method(D_METHOD("get_alpha_antialiasing_edge"), &Label3D::get_alpha_antialiasing_edge);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_texture_filter", "mode"), &Label3D::set_texture_filter);
|
||||
ClassDB::bind_method(D_METHOD("get_texture_filter"), &Label3D::get_texture_filter);
|
||||
|
||||
|
@ -133,6 +139,8 @@ void Label3D::_bind_methods() {
|
|||
ADD_PROPERTY(PropertyInfo(Variant::INT, "alpha_cut", PROPERTY_HINT_ENUM, "Disabled,Discard,Opaque Pre-Pass,Alpha Hash"), "set_alpha_cut_mode", "get_alpha_cut_mode");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "alpha_scissor_threshold", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_alpha_scissor_threshold", "get_alpha_scissor_threshold");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "alpha_hash_scale", PROPERTY_HINT_RANGE, "0,2,0.01"), "set_alpha_hash_scale", "get_alpha_hash_scale");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "alpha_antialiasing_mode", PROPERTY_HINT_ENUM, "Disabled,Alpha Edge Blend,Alpha Edge Clip"), "set_alpha_antialiasing", "get_alpha_antialiasing");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "alpha_antialiasing_edge", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_alpha_antialiasing_edge", "get_alpha_antialiasing_edge");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_filter", PROPERTY_HINT_ENUM, "Nearest,Linear,Nearest Mipmap,Linear Mipmap,Nearest Mipmap Anisotropic,Linear Mipmap Anisotropic"), "set_texture_filter", "get_texture_filter");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "render_priority", PROPERTY_HINT_RANGE, itos(RS::MATERIAL_RENDER_PRIORITY_MIN) + "," + itos(RS::MATERIAL_RENDER_PRIORITY_MAX) + ",1"), "set_render_priority", "get_render_priority");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "outline_render_priority", PROPERTY_HINT_RANGE, itos(RS::MATERIAL_RENDER_PRIORITY_MIN) + "," + itos(RS::MATERIAL_RENDER_PRIORITY_MAX) + ",1"), "set_outline_render_priority", "get_outline_render_priority");
|
||||
|
@ -356,6 +364,7 @@ void Label3D::_generate_glyph_surfaces(const Glyph &p_glyph, Vector2 &r_offset,
|
|||
RS::get_singleton()->material_set_param(surf.material, "uv2_scale", Vector3(1, 1, 1));
|
||||
RS::get_singleton()->material_set_param(surf.material, "alpha_scissor_threshold", alpha_scissor_threshold);
|
||||
RS::get_singleton()->material_set_param(surf.material, "alpha_hash_scale", alpha_hash_scale);
|
||||
RS::get_singleton()->material_set_param(surf.material, "alpha_antialiasing_edge", alpha_antialiasing_edge);
|
||||
if (msdf) {
|
||||
RS::get_singleton()->material_set_param(surf.material, "msdf_pixel_range", TS->font_get_msdf_pixel_range(p_glyph.font_rid));
|
||||
RS::get_singleton()->material_set_param(surf.material, "msdf_outline_size", p_outline_size);
|
||||
|
@ -371,7 +380,7 @@ void Label3D::_generate_glyph_surfaces(const Glyph &p_glyph, Vector2 &r_offset,
|
|||
}
|
||||
|
||||
RID shader_rid;
|
||||
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, msdf, get_draw_flag(FLAG_DISABLE_DEPTH_TEST), get_draw_flag(FLAG_FIXED_SIZE), texture_filter, &shader_rid);
|
||||
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, msdf, get_draw_flag(FLAG_DISABLE_DEPTH_TEST), get_draw_flag(FLAG_FIXED_SIZE), texture_filter, alpha_antialiasing_mode, &shader_rid);
|
||||
|
||||
RS::get_singleton()->material_set_shader(surf.material, shader_rid);
|
||||
RS::get_singleton()->material_set_param(surf.material, "texture_albedo", tex);
|
||||
|
@ -966,6 +975,28 @@ float Label3D::get_alpha_scissor_threshold() const {
|
|||
return alpha_scissor_threshold;
|
||||
}
|
||||
|
||||
void Label3D::set_alpha_antialiasing(BaseMaterial3D::AlphaAntiAliasing p_alpha_aa) {
|
||||
if (alpha_antialiasing_mode != p_alpha_aa) {
|
||||
alpha_antialiasing_mode = p_alpha_aa;
|
||||
_queue_update();
|
||||
}
|
||||
}
|
||||
|
||||
BaseMaterial3D::AlphaAntiAliasing Label3D::get_alpha_antialiasing() const {
|
||||
return alpha_antialiasing_mode;
|
||||
}
|
||||
|
||||
void Label3D::set_alpha_antialiasing_edge(float p_edge) {
|
||||
if (alpha_antialiasing_edge != p_edge) {
|
||||
alpha_antialiasing_edge = p_edge;
|
||||
_queue_update();
|
||||
}
|
||||
}
|
||||
|
||||
float Label3D::get_alpha_antialiasing_edge() const {
|
||||
return alpha_antialiasing_edge;
|
||||
}
|
||||
|
||||
Label3D::Label3D() {
|
||||
for (int i = 0; i < FLAG_MAX; i++) {
|
||||
flags[i] = (i == FLAG_DOUBLE_SIDED);
|
||||
|
|
|
@ -62,6 +62,8 @@ private:
|
|||
AlphaCutMode alpha_cut = ALPHA_CUT_DISABLED;
|
||||
float alpha_scissor_threshold = 0.5;
|
||||
float alpha_hash_scale = 1.0;
|
||||
StandardMaterial3D::AlphaAntiAliasing alpha_antialiasing_mode = StandardMaterial3D::ALPHA_ANTIALIASING_OFF;
|
||||
float alpha_antialiasing_edge = 0.0f;
|
||||
|
||||
AABB aabb;
|
||||
|
||||
|
@ -234,6 +236,12 @@ public:
|
|||
void set_alpha_hash_scale(float p_hash_scale);
|
||||
float get_alpha_hash_scale() const;
|
||||
|
||||
void set_alpha_antialiasing(BaseMaterial3D::AlphaAntiAliasing p_alpha_aa);
|
||||
BaseMaterial3D::AlphaAntiAliasing get_alpha_antialiasing() const;
|
||||
|
||||
void set_alpha_antialiasing_edge(float p_edge);
|
||||
float get_alpha_antialiasing_edge() const;
|
||||
|
||||
void set_billboard_mode(StandardMaterial3D::BillboardMode p_mode);
|
||||
StandardMaterial3D::BillboardMode get_billboard_mode() const;
|
||||
|
||||
|
|
|
@ -247,6 +247,7 @@ void SpriteBase3D::draw_texture_rect(Ref<Texture2D> p_texture, Rect2 p_dst_rect,
|
|||
|
||||
RS::get_singleton()->material_set_param(get_material(), "alpha_scissor_threshold", alpha_scissor_threshold);
|
||||
RS::get_singleton()->material_set_param(get_material(), "alpha_hash_scale", alpha_hash_scale);
|
||||
RS::get_singleton()->material_set_param(get_material(), "alpha_antialiasing_edge", alpha_antialiasing_edge);
|
||||
|
||||
BaseMaterial3D::Transparency mat_transparency = BaseMaterial3D::Transparency::TRANSPARENCY_DISABLED;
|
||||
if (get_draw_flag(FLAG_TRANSPARENT)) {
|
||||
|
@ -262,7 +263,7 @@ void SpriteBase3D::draw_texture_rect(Ref<Texture2D> p_texture, Rect2 p_dst_rect,
|
|||
}
|
||||
|
||||
RID shader_rid;
|
||||
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(), &shader_rid);
|
||||
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);
|
||||
|
||||
if (last_shader != shader_rid) {
|
||||
RS::get_singleton()->material_set_shader(get_material(), shader_rid);
|
||||
|
@ -481,6 +482,28 @@ float SpriteBase3D::get_alpha_scissor_threshold() const {
|
|||
return alpha_scissor_threshold;
|
||||
}
|
||||
|
||||
void SpriteBase3D::set_alpha_antialiasing(BaseMaterial3D::AlphaAntiAliasing p_alpha_aa) {
|
||||
if (alpha_antialiasing_mode != p_alpha_aa) {
|
||||
alpha_antialiasing_mode = p_alpha_aa;
|
||||
_queue_redraw();
|
||||
}
|
||||
}
|
||||
|
||||
BaseMaterial3D::AlphaAntiAliasing SpriteBase3D::get_alpha_antialiasing() const {
|
||||
return alpha_antialiasing_mode;
|
||||
}
|
||||
|
||||
void SpriteBase3D::set_alpha_antialiasing_edge(float p_edge) {
|
||||
if (alpha_antialiasing_edge != p_edge) {
|
||||
alpha_antialiasing_edge = p_edge;
|
||||
_queue_redraw();
|
||||
}
|
||||
}
|
||||
|
||||
float SpriteBase3D::get_alpha_antialiasing_edge() const {
|
||||
return alpha_antialiasing_edge;
|
||||
}
|
||||
|
||||
void SpriteBase3D::set_billboard_mode(StandardMaterial3D::BillboardMode p_mode) {
|
||||
ERR_FAIL_INDEX(p_mode, 3); // Cannot use BILLBOARD_PARTICLES.
|
||||
billboard_mode = p_mode;
|
||||
|
@ -539,6 +562,12 @@ void SpriteBase3D::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_alpha_hash_scale", "threshold"), &SpriteBase3D::set_alpha_hash_scale);
|
||||
ClassDB::bind_method(D_METHOD("get_alpha_hash_scale"), &SpriteBase3D::get_alpha_hash_scale);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_alpha_antialiasing", "alpha_aa"), &SpriteBase3D::set_alpha_antialiasing);
|
||||
ClassDB::bind_method(D_METHOD("get_alpha_antialiasing"), &SpriteBase3D::get_alpha_antialiasing);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_alpha_antialiasing_edge", "edge"), &SpriteBase3D::set_alpha_antialiasing_edge);
|
||||
ClassDB::bind_method(D_METHOD("get_alpha_antialiasing_edge"), &SpriteBase3D::get_alpha_antialiasing_edge);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_billboard_mode", "mode"), &SpriteBase3D::set_billboard_mode);
|
||||
ClassDB::bind_method(D_METHOD("get_billboard_mode"), &SpriteBase3D::get_billboard_mode);
|
||||
|
||||
|
@ -567,6 +596,8 @@ void SpriteBase3D::_bind_methods() {
|
|||
ADD_PROPERTY(PropertyInfo(Variant::INT, "alpha_cut", PROPERTY_HINT_ENUM, "Disabled,Discard,Opaque Pre-Pass,Alpha Hash"), "set_alpha_cut_mode", "get_alpha_cut_mode");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "alpha_scissor_threshold", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_alpha_scissor_threshold", "get_alpha_scissor_threshold");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "alpha_hash_scale", PROPERTY_HINT_RANGE, "0,2,0.01"), "set_alpha_hash_scale", "get_alpha_hash_scale");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "alpha_antialiasing_mode", PROPERTY_HINT_ENUM, "Disabled,Alpha Edge Blend,Alpha Edge Clip"), "set_alpha_antialiasing", "get_alpha_antialiasing");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "alpha_antialiasing_edge", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_alpha_antialiasing_edge", "get_alpha_antialiasing_edge");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_filter", PROPERTY_HINT_ENUM, "Nearest,Linear,Nearest Mipmap,Linear Mipmap,Nearest Mipmap Anisotropic,Linear Mipmap Anisotropic"), "set_texture_filter", "get_texture_filter");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "render_priority", PROPERTY_HINT_RANGE, itos(RS::MATERIAL_RENDER_PRIORITY_MIN) + "," + itos(RS::MATERIAL_RENDER_PRIORITY_MAX) + ",1"), "set_render_priority", "get_render_priority");
|
||||
|
||||
|
|
|
@ -89,6 +89,8 @@ private:
|
|||
AlphaCutMode alpha_cut = ALPHA_CUT_DISABLED;
|
||||
float alpha_scissor_threshold = 0.5;
|
||||
float alpha_hash_scale = 1.0;
|
||||
StandardMaterial3D::AlphaAntiAliasing alpha_antialiasing_mode = StandardMaterial3D::ALPHA_ANTIALIASING_OFF;
|
||||
float alpha_antialiasing_edge = 0.0f;
|
||||
StandardMaterial3D::BillboardMode billboard_mode = StandardMaterial3D::BILLBOARD_DISABLED;
|
||||
StandardMaterial3D::TextureFilter texture_filter = StandardMaterial3D::TEXTURE_FILTER_LINEAR_WITH_MIPMAPS;
|
||||
bool pending_update = false;
|
||||
|
@ -153,6 +155,12 @@ public:
|
|||
void set_alpha_hash_scale(float p_hash_scale);
|
||||
float get_alpha_hash_scale() const;
|
||||
|
||||
void set_alpha_antialiasing(BaseMaterial3D::AlphaAntiAliasing p_alpha_aa);
|
||||
BaseMaterial3D::AlphaAntiAliasing get_alpha_antialiasing() const;
|
||||
|
||||
void set_alpha_antialiasing_edge(float p_edge);
|
||||
float get_alpha_antialiasing_edge() const;
|
||||
|
||||
void set_billboard_mode(StandardMaterial3D::BillboardMode p_mode);
|
||||
StandardMaterial3D::BillboardMode get_billboard_mode() const;
|
||||
|
||||
|
|
|
@ -2316,7 +2316,7 @@ BaseMaterial3D::TextureChannel BaseMaterial3D::get_refraction_texture_channel()
|
|||
return refraction_texture_channel;
|
||||
}
|
||||
|
||||
Ref<Material> BaseMaterial3D::get_material_for_2d(bool p_shaded, Transparency p_transparency, bool p_double_sided, bool p_billboard, bool p_billboard_y, bool p_msdf, bool p_no_depth, bool p_fixed_size, TextureFilter p_filter, RID *r_shader_rid) {
|
||||
Ref<Material> BaseMaterial3D::get_material_for_2d(bool p_shaded, Transparency p_transparency, bool p_double_sided, bool p_billboard, bool p_billboard_y, bool p_msdf, bool p_no_depth, bool p_fixed_size, TextureFilter p_filter, AlphaAntiAliasing p_alpha_antialiasing_mode, RID *r_shader_rid) {
|
||||
uint64_t key = 0;
|
||||
key |= ((int8_t)p_shaded & 0x01) << 0;
|
||||
key |= ((int8_t)p_transparency & 0x07) << 1; // Bits 1-3.
|
||||
|
@ -2326,7 +2326,8 @@ Ref<Material> BaseMaterial3D::get_material_for_2d(bool p_shaded, Transparency p_
|
|||
key |= ((int8_t)p_msdf & 0x01) << 7;
|
||||
key |= ((int8_t)p_no_depth & 0x01) << 8;
|
||||
key |= ((int8_t)p_fixed_size & 0x01) << 9;
|
||||
key |= ((int8_t)p_filter & 0x07) << 10; // Bits 10-13.
|
||||
key |= ((int8_t)p_filter & 0x07) << 10; // Bits 10-12.
|
||||
key |= ((int8_t)p_alpha_antialiasing_mode & 0x07) << 13; // Bits 13-15.
|
||||
|
||||
if (materials_for_2d.has(key)) {
|
||||
if (r_shader_rid) {
|
||||
|
@ -2346,6 +2347,7 @@ Ref<Material> BaseMaterial3D::get_material_for_2d(bool p_shaded, Transparency p_
|
|||
material->set_flag(FLAG_ALBEDO_TEXTURE_MSDF, p_msdf);
|
||||
material->set_flag(FLAG_DISABLE_DEPTH_TEST, p_no_depth);
|
||||
material->set_flag(FLAG_FIXED_SIZE, p_fixed_size);
|
||||
material->set_alpha_antialiasing(p_alpha_antialiasing_mode);
|
||||
material->set_texture_filter(p_filter);
|
||||
if (p_billboard || p_billboard_y) {
|
||||
material->set_flag(FLAG_BILLBOARD_KEEP_SCALE, true);
|
||||
|
|
|
@ -760,7 +760,7 @@ public:
|
|||
static void finish_shaders();
|
||||
static void flush_changes();
|
||||
|
||||
static Ref<Material> get_material_for_2d(bool p_shaded, Transparency p_transparency, bool p_double_sided, bool p_billboard = false, bool p_billboard_y = false, bool p_msdf = false, bool p_no_depth = false, bool p_fixed_size = false, TextureFilter p_filter = TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RID *r_shader_rid = nullptr);
|
||||
static Ref<Material> get_material_for_2d(bool p_shaded, Transparency p_transparency, bool p_double_sided, bool p_billboard = false, bool p_billboard_y = false, bool p_msdf = false, bool p_no_depth = false, bool p_fixed_size = false, TextureFilter p_filter = TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, AlphaAntiAliasing p_alpha_antialiasing_mode = ALPHA_ANTIALIASING_OFF, RID *r_shader_rid = nullptr);
|
||||
|
||||
virtual RID get_shader_rid() const override;
|
||||
|
||||
|
|
Loading…
Reference in a new issue