diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/etc/image_etc.cpp | 7 | ||||
-rw-r--r-- | modules/gdnative/gdnative/gdnative.cpp | 13 | ||||
-rw-r--r-- | modules/gdnative/gdnative_api.json | 15 | ||||
-rw-r--r-- | modules/gdnative/include/gdnative/gdnative.h | 4 | ||||
-rw-r--r-- | modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs | 70 | ||||
-rw-r--r-- | modules/mono/glue/GodotSharp/GodotSharp/Core/Mathf.cs | 6 |
6 files changed, 112 insertions, 3 deletions
diff --git a/modules/etc/image_etc.cpp b/modules/etc/image_etc.cpp index 7cd5e2eb12..f0b95c893d 100644 --- a/modules/etc/image_etc.cpp +++ b/modules/etc/image_etc.cpp @@ -139,6 +139,13 @@ static void _compress_etc(Image *p_img, float p_lossy_quality, bool force_etc1_f return; } + if (img_format >= Image::FORMAT_RGBA8 && force_etc1_format) { + // If VRAM compression is using ETC, but image has alpha, convert to RGBA4444 + // This saves space while maintaining the alpha channel + p_img->convert(Image::FORMAT_RGBA4444); + return; + } + uint32_t imgw = p_img->get_width(), imgh = p_img->get_height(); Image::Format etc_format = force_etc1_format ? Image::FORMAT_ETC : _get_etc2_mode(detected_channels); diff --git a/modules/gdnative/gdnative/gdnative.cpp b/modules/gdnative/gdnative/gdnative.cpp index 174ef14ec2..6ef1f2f4b9 100644 --- a/modules/gdnative/gdnative/gdnative.cpp +++ b/modules/gdnative/gdnative/gdnative.cpp @@ -170,6 +170,19 @@ bool GDAPI godot_is_instance_valid(const godot_object *p_object) { return ObjectDB::instance_validate((Object *)p_object); } +void *godot_get_class_tag(const godot_string_name *p_class) { + StringName class_name = *(StringName *)p_class; + ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(class_name); + return class_info ? class_info->class_ptr : NULL; +} + +godot_object *godot_object_cast_to(const godot_object *p_object, void *p_class_tag) { + if (!p_object) return NULL; + Object *o = (Object *)p_object; + + return o->is_class_ptr(p_class_tag) ? (godot_object *)o : NULL; +} + #ifdef __cplusplus } #endif diff --git a/modules/gdnative/gdnative_api.json b/modules/gdnative/gdnative_api.json index 9e5295a936..7e2ca49f8d 100644 --- a/modules/gdnative/gdnative_api.json +++ b/modules/gdnative/gdnative_api.json @@ -140,6 +140,21 @@ "arguments": [ ["const godot_pool_color_array *", "p_self"] ] + }, + { + "name": "godot_get_class_tag", + "return_type": "void *", + "arguments": [ + ["const godot_string_name *", "p_class"] + ] + }, + { + "name": "godot_object_cast_to", + "return_type": "godot_object *", + "arguments": [ + ["const godot_object *", "p_object"], + ["void *", "p_class_tag"] + ] } ] }, diff --git a/modules/gdnative/include/gdnative/gdnative.h b/modules/gdnative/include/gdnative/gdnative.h index 5a6333e814..2fe59b8a73 100644 --- a/modules/gdnative/include/gdnative/gdnative.h +++ b/modules/gdnative/include/gdnative/gdnative.h @@ -286,6 +286,10 @@ void GDAPI godot_print(const godot_string *p_message); bool GDAPI godot_is_instance_valid(const godot_object *p_object); +//tags used for safe dynamic casting +void GDAPI *godot_get_class_tag(const godot_string_name *p_class); +godot_object GDAPI *godot_object_cast_to(const godot_object *p_object, void *p_class_tag); + #ifdef __cplusplus } #endif diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs index df817e47e9..0462ef1125 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs @@ -541,7 +541,7 @@ namespace Godot return true; } - public static Color Color8(byte r8, byte g8, byte b8, byte a8) + public static Color Color8(byte r8, byte g8, byte b8, byte a8 = 255) { return new Color(r8 / 255f, g8 / 255f, b8 / 255f, a8 / 255f); } @@ -605,6 +605,74 @@ namespace Godot throw new ArgumentOutOfRangeException("Invalid color code. Blue part is not valid hexadecimal: " + rgba); } + public static Color operator +(Color left, Color right) + { + left.r += right.r; + left.g += right.g; + left.b += right.b; + left.a += right.a; + return left; + } + + public static Color operator -(Color left, Color right) + { + left.r -= right.r; + left.g -= right.g; + left.b -= right.b; + left.a -= right.a; + return left; + } + + public static Color operator -(Color color) + { + return Colors.White - color; + } + + public static Color operator *(Color color, float scale) + { + color.r *= scale; + color.g *= scale; + color.b *= scale; + color.a *= scale; + return color; + } + + public static Color operator *(float scale, Color color) + { + color.r *= scale; + color.g *= scale; + color.b *= scale; + color.a *= scale; + return color; + } + + public static Color operator *(Color left, Color right) + { + left.r *= right.r; + left.g *= right.g; + left.b *= right.b; + left.a *= right.a; + return left; + } + + public static Color operator /(Color color, float scale) + { + color.r /= scale; + color.g /= scale; + color.b /= scale; + color.a /= scale; + return color; + } + + public static Color operator /(Color left, Color right) + { + left.r /= right.r; + left.g /= right.g; + left.b /= right.b; + left.a /= right.a; + return left; + } + public static bool operator ==(Color left, Color right) { return left.Equals(right); diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Mathf.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Mathf.cs index 54821fe790..ddfed180b5 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Mathf.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Mathf.cs @@ -266,12 +266,14 @@ namespace Godot public static int Sign(int s) { + if (s == 0) return 0; return s < 0 ? -1 : 1; } - public static real_t Sign(real_t s) + public static int Sign(real_t s) { - return s < 0f ? -1f : 1f; + if (s == 0) return 0; + return s < 0 ? -1 : 1; } public static real_t Sin(real_t s) |