Merge pull request #18282 from aaronfranke/better-mathf
[Core] [Mono] Fix Color missing int export methods, added 64-bit
This commit is contained in:
commit
47a7dc7b3c
|
@ -49,6 +49,7 @@ uint32_t Color::to_argb32() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Color::to_abgr32() const {
|
uint32_t Color::to_abgr32() const {
|
||||||
|
|
||||||
uint32_t c = (uint8_t)Math::round(a * 255);
|
uint32_t c = (uint8_t)Math::round(a * 255);
|
||||||
c <<= 8;
|
c <<= 8;
|
||||||
c |= (uint8_t)Math::round(b * 255);
|
c |= (uint8_t)Math::round(b * 255);
|
||||||
|
@ -73,6 +74,45 @@ uint32_t Color::to_rgba32() const {
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t Color::to_abgr64() const {
|
||||||
|
|
||||||
|
uint64_t c = (uint16_t)Math::round(a * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)Math::round(b * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)Math::round(g * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)Math::round(r * 65535);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t Color::to_argb64() const {
|
||||||
|
|
||||||
|
uint64_t c = (uint16_t)Math::round(a * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)Math::round(r * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)Math::round(g * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)Math::round(b * 65535);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t Color::to_rgba64() const {
|
||||||
|
|
||||||
|
uint64_t c = (uint16_t)Math::round(r * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)Math::round(g * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)Math::round(b * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)Math::round(a * 65535);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
float Color::get_h() const {
|
float Color::get_h() const {
|
||||||
|
|
||||||
float min = MIN(r, g);
|
float min = MIN(r, g);
|
||||||
|
@ -200,6 +240,19 @@ Color Color::hex(uint32_t p_hex) {
|
||||||
return Color(r, g, b, a);
|
return Color(r, g, b, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Color Color::hex64(uint64_t p_hex) {
|
||||||
|
|
||||||
|
float a = (p_hex & 0xFFFF) / 65535.0;
|
||||||
|
p_hex >>= 16;
|
||||||
|
float b = (p_hex & 0xFFFF) / 65535.0;
|
||||||
|
p_hex >>= 16;
|
||||||
|
float g = (p_hex & 0xFFFF) / 65535.0;
|
||||||
|
p_hex >>= 16;
|
||||||
|
float r = (p_hex & 0xFFFF) / 65535.0;
|
||||||
|
|
||||||
|
return Color(r, g, b, a);
|
||||||
|
}
|
||||||
|
|
||||||
static float _parse_col(const String &p_str, int p_ofs) {
|
static float _parse_col(const String &p_str, int p_ofs) {
|
||||||
|
|
||||||
int ig = 0;
|
int ig = 0;
|
||||||
|
|
|
@ -55,6 +55,9 @@ struct Color {
|
||||||
uint32_t to_rgba32() const;
|
uint32_t to_rgba32() const;
|
||||||
uint32_t to_argb32() const;
|
uint32_t to_argb32() const;
|
||||||
uint32_t to_abgr32() const;
|
uint32_t to_abgr32() const;
|
||||||
|
uint64_t to_rgba64() const;
|
||||||
|
uint64_t to_argb64() const;
|
||||||
|
uint64_t to_abgr64() const;
|
||||||
float gray() const;
|
float gray() const;
|
||||||
float get_h() const;
|
float get_h() const;
|
||||||
float get_s() const;
|
float get_s() const;
|
||||||
|
@ -186,6 +189,7 @@ struct Color {
|
||||||
}
|
}
|
||||||
|
|
||||||
static Color hex(uint32_t p_hex);
|
static Color hex(uint32_t p_hex);
|
||||||
|
static Color hex64(uint64_t p_hex);
|
||||||
static Color html(const String &p_color);
|
static Color html(const String &p_color);
|
||||||
static bool html_is_valid(const String &p_color);
|
static bool html_is_valid(const String &p_color);
|
||||||
static Color named(const String &p_name);
|
static Color named(const String &p_name);
|
||||||
|
|
|
@ -446,8 +446,12 @@ struct _VariantCall {
|
||||||
VCALL_LOCALMEM1(Quat, set_euler);
|
VCALL_LOCALMEM1(Quat, set_euler);
|
||||||
VCALL_LOCALMEM2(Quat, set_axis_angle);
|
VCALL_LOCALMEM2(Quat, set_axis_angle);
|
||||||
|
|
||||||
VCALL_LOCALMEM0R(Color, to_rgba32);
|
|
||||||
VCALL_LOCALMEM0R(Color, to_argb32);
|
VCALL_LOCALMEM0R(Color, to_argb32);
|
||||||
|
VCALL_LOCALMEM0R(Color, to_abgr32);
|
||||||
|
VCALL_LOCALMEM0R(Color, to_rgba32);
|
||||||
|
VCALL_LOCALMEM0R(Color, to_argb64);
|
||||||
|
VCALL_LOCALMEM0R(Color, to_abgr64);
|
||||||
|
VCALL_LOCALMEM0R(Color, to_rgba64);
|
||||||
VCALL_LOCALMEM0R(Color, gray);
|
VCALL_LOCALMEM0R(Color, gray);
|
||||||
VCALL_LOCALMEM0R(Color, inverted);
|
VCALL_LOCALMEM0R(Color, inverted);
|
||||||
VCALL_LOCALMEM0R(Color, contrasted);
|
VCALL_LOCALMEM0R(Color, contrasted);
|
||||||
|
@ -1613,8 +1617,12 @@ void register_variant_methods() {
|
||||||
ADDFUNC1(QUAT, NIL, Quat, set_euler, VECTOR3, "euler", varray());
|
ADDFUNC1(QUAT, NIL, Quat, set_euler, VECTOR3, "euler", varray());
|
||||||
ADDFUNC2(QUAT, NIL, Quat, set_axis_angle, VECTOR3, "axis", REAL, "angle", varray());
|
ADDFUNC2(QUAT, NIL, Quat, set_axis_angle, VECTOR3, "axis", REAL, "angle", varray());
|
||||||
|
|
||||||
ADDFUNC0R(COLOR, INT, Color, to_rgba32, varray());
|
|
||||||
ADDFUNC0R(COLOR, INT, Color, to_argb32, varray());
|
ADDFUNC0R(COLOR, INT, Color, to_argb32, varray());
|
||||||
|
ADDFUNC0R(COLOR, INT, Color, to_abgr32, varray());
|
||||||
|
ADDFUNC0R(COLOR, INT, Color, to_rgba32, varray());
|
||||||
|
ADDFUNC0R(COLOR, INT, Color, to_argb64, varray());
|
||||||
|
ADDFUNC0R(COLOR, INT, Color, to_abgr64, varray());
|
||||||
|
ADDFUNC0R(COLOR, INT, Color, to_rgba64, varray());
|
||||||
ADDFUNC0R(COLOR, REAL, Color, gray, varray());
|
ADDFUNC0R(COLOR, REAL, Color, gray, varray());
|
||||||
ADDFUNC0R(COLOR, COLOR, Color, inverted, varray());
|
ADDFUNC0R(COLOR, COLOR, Color, inverted, varray());
|
||||||
ADDFUNC0R(COLOR, COLOR, Color, contrasted, varray());
|
ADDFUNC0R(COLOR, COLOR, Color, contrasted, varray());
|
||||||
|
|
|
@ -187,17 +187,6 @@
|
||||||
[/codeblock]
|
[/codeblock]
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="to_argb32">
|
|
||||||
<return type="int">
|
|
||||||
</return>
|
|
||||||
<description>
|
|
||||||
Returns the color's 32-bit integer in ARGB format (each byte represents a component of the ARGB profile). More compatible with DirectX.
|
|
||||||
[codeblock]
|
|
||||||
var c = Color(1, .5, .2)
|
|
||||||
print(str(c.to_32())) # prints 4294934323
|
|
||||||
[/codeblock]
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="to_html">
|
<method name="to_html">
|
||||||
<return type="String">
|
<return type="String">
|
||||||
</return>
|
</return>
|
||||||
|
@ -213,16 +202,70 @@
|
||||||
[/codeblock]
|
[/codeblock]
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="to_argb32">
|
||||||
|
<return type="int">
|
||||||
|
</return>
|
||||||
|
<description>
|
||||||
|
Returns the color's 32-bit integer in ARGB format (each byte represents a component of the ARGB profile). ARGB is more compatible with DirectX.
|
||||||
|
[codeblock]
|
||||||
|
var c = Color(1, .5, .2)
|
||||||
|
print(c.to_argb32()) # Prints 4294934323
|
||||||
|
[/codeblock]
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="to_abgr32">
|
||||||
|
<return type="int">
|
||||||
|
</return>
|
||||||
|
<description>
|
||||||
|
Returns the color's 32-bit integer in ABGR format (each byte represents a component of the ABGR profile). ABGR is the reversed version of the default format.
|
||||||
|
[codeblock]
|
||||||
|
var c = Color(1, .5, .2)
|
||||||
|
print(c.to_abgr32()) # Prints 4281565439
|
||||||
|
[/codeblock]
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="to_rgba32">
|
<method name="to_rgba32">
|
||||||
<return type="int">
|
<return type="int">
|
||||||
</return>
|
</return>
|
||||||
<description>
|
<description>
|
||||||
Returns the color's 32-bit integer in ARGB format (each byte represents a component of the ARGB profile).
|
Returns the color's 32-bit integer in RGBA format (each byte represents a component of the RGBA profile). RGBA is the format that Godot uses by default.
|
||||||
[codeblock]
|
[codeblock]
|
||||||
var c = Color(1, .5, .2)
|
var c = Color(1, .5, .2)
|
||||||
print(str(c.to_32())) # prints 4294934323
|
print(c.to_rgba32()) # Prints 4286526463
|
||||||
|
[/codeblock]
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="to_argb64">
|
||||||
|
<return type="int">
|
||||||
|
</return>
|
||||||
|
<description>
|
||||||
|
Returns the color's 64-bit integer in ARGB format (each word represents a component of the ARGB profile). ARGB is more compatible with DirectX.
|
||||||
|
[codeblock]
|
||||||
|
var c = Color(1, .5, .2)
|
||||||
|
print(c.to_argb64()) # Prints -2147470541
|
||||||
|
[/codeblock]
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="to_abgr64">
|
||||||
|
<return type="int">
|
||||||
|
</return>
|
||||||
|
<description>
|
||||||
|
Returns the color's 64-bit integer in ABGR format (each word represents a component of the ABGR profile). ABGR is the reversed version of the default format.
|
||||||
|
[codeblock]
|
||||||
|
var c = Color(1, .5, .2)
|
||||||
|
print(c.to_abgr64()) # Prints -225178692812801
|
||||||
|
[/codeblock]
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="to_rgba64">
|
||||||
|
<return type="int">
|
||||||
|
</return>
|
||||||
|
<description>
|
||||||
|
Returns the color's 64-bit integer in RGBA format (each word represents a component of the RGBA profile). RGBA is the format that Godot uses by default.
|
||||||
|
[codeblock]
|
||||||
|
var c = Color(1, .5, .2)
|
||||||
|
print(c.to_rgba64()) # Prints -140736629309441
|
||||||
[/codeblock]
|
[/codeblock]
|
||||||
[i]This is same as [method to_argb32] but may be changed later to support RGBA format instead[/i].
|
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
</methods>
|
</methods>
|
||||||
|
|
|
@ -293,28 +293,80 @@ namespace Godot
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int ToRgba32()
|
public int ToAbgr32()
|
||||||
{
|
{
|
||||||
int c = (byte)(r * 255);
|
int c = (byte)Math.Round(a * 255);
|
||||||
c <<= 8;
|
c <<= 8;
|
||||||
c |= (byte)(g * 255);
|
c |= (byte)Math.Round(b * 255);
|
||||||
c <<= 8;
|
c <<= 8;
|
||||||
c |= (byte)(b * 255);
|
c |= (byte)Math.Round(g * 255);
|
||||||
c <<= 8;
|
c <<= 8;
|
||||||
c |= (byte)(a * 255);
|
c |= (byte)Math.Round(r * 255);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long ToAbgr64()
|
||||||
|
{
|
||||||
|
long c = (ushort)Math.Round(a * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (ushort)Math.Round(b * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (ushort)Math.Round(g * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (ushort)Math.Round(r * 65535);
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int ToArgb32()
|
public int ToArgb32()
|
||||||
{
|
{
|
||||||
int c = (byte)(a * 255);
|
int c = (byte)Math.Round(a * 255);
|
||||||
c <<= 8;
|
c <<= 8;
|
||||||
c |= (byte)(r * 255);
|
c |= (byte)Math.Round(r * 255);
|
||||||
c <<= 8;
|
c <<= 8;
|
||||||
c |= (byte)(g * 255);
|
c |= (byte)Math.Round(g * 255);
|
||||||
c <<= 8;
|
c <<= 8;
|
||||||
c |= (byte)(b * 255);
|
c |= (byte)Math.Round(b * 255);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long ToArgb64()
|
||||||
|
{
|
||||||
|
long c = (ushort)Math.Round(a * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (ushort)Math.Round(r * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (ushort)Math.Round(g * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (ushort)Math.Round(b * 65535);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int ToRgba32()
|
||||||
|
{
|
||||||
|
int c = (byte)Math.Round(r * 255);
|
||||||
|
c <<= 8;
|
||||||
|
c |= (byte)Math.Round(g * 255);
|
||||||
|
c <<= 8;
|
||||||
|
c |= (byte)Math.Round(b * 255);
|
||||||
|
c <<= 8;
|
||||||
|
c |= (byte)Math.Round(a * 255);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long ToRgba64()
|
||||||
|
{
|
||||||
|
long c = (ushort)Math.Round(r * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (ushort)Math.Round(g * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (ushort)Math.Round(b * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (ushort)Math.Round(a * 65535);
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
@ -353,6 +405,17 @@ namespace Godot
|
||||||
r = (rgba & 0xFF) / 255.0f;
|
r = (rgba & 0xFF) / 255.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Color(long rgba)
|
||||||
|
{
|
||||||
|
a = (rgba & 0xFFFF) / 65535.0f;
|
||||||
|
rgba >>= 16;
|
||||||
|
b = (rgba & 0xFFFF) / 65535.0f;
|
||||||
|
rgba >>= 16;
|
||||||
|
g = (rgba & 0xFFFF) / 65535.0f;
|
||||||
|
rgba >>= 16;
|
||||||
|
r = (rgba & 0xFFFF) / 65535.0f;
|
||||||
|
}
|
||||||
|
|
||||||
private static int _parse_col(string str, int ofs)
|
private static int _parse_col(string str, int ofs)
|
||||||
{
|
{
|
||||||
int ig = 0;
|
int ig = 0;
|
||||||
|
@ -392,7 +455,7 @@ namespace Godot
|
||||||
|
|
||||||
private String _to_hex(float val)
|
private String _to_hex(float val)
|
||||||
{
|
{
|
||||||
var v = (int) Mathf.Clamp(val * 255.0f, 0, 255);
|
int v = Mathf.RoundToInt(Mathf.Clamp(val * 255, 0, 255));
|
||||||
|
|
||||||
var ret = string.Empty;
|
var ret = string.Empty;
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
5
|
6
|
||||||
|
|
Loading…
Reference in New Issue