mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
Merge pull request #63728 from MarcusElg/%v
Add %v for formatting vectors
This commit is contained in:
commit
08d8f884cd
2 changed files with 164 additions and 5 deletions
|
@ -4667,6 +4667,71 @@ String String::sprintf(const Array &values, bool *error) const {
|
|||
in_format = false;
|
||||
break;
|
||||
}
|
||||
case 'v': { // Vector2/3/4/2i/3i/4i
|
||||
if (value_index >= values.size()) {
|
||||
return "not enough arguments for format string";
|
||||
}
|
||||
|
||||
int count;
|
||||
switch (values[value_index].get_type()) {
|
||||
case Variant::VECTOR2:
|
||||
case Variant::VECTOR2I: {
|
||||
count = 2;
|
||||
} break;
|
||||
case Variant::VECTOR3:
|
||||
case Variant::VECTOR3I: {
|
||||
count = 3;
|
||||
} break;
|
||||
case Variant::VECTOR4:
|
||||
case Variant::VECTOR4I: {
|
||||
count = 4;
|
||||
} break;
|
||||
default: {
|
||||
return "%v requires a vector type (Vector2/3/4/2i/3i/4i)";
|
||||
}
|
||||
}
|
||||
|
||||
Vector4 vec = values[value_index];
|
||||
String str = "(";
|
||||
for (int i = 0; i < count; i++) {
|
||||
double val = vec[i];
|
||||
// Pad decimals out.
|
||||
String number_str = String::num(ABS(val), min_decimals).pad_decimals(min_decimals);
|
||||
|
||||
int initial_len = number_str.length();
|
||||
|
||||
// Padding. Leave room for sign later if required.
|
||||
int pad_chars_count = val < 0 ? min_chars - 1 : min_chars;
|
||||
String pad_char = pad_with_zeros ? String("0") : String(" ");
|
||||
if (left_justified) {
|
||||
number_str = number_str.rpad(pad_chars_count, pad_char);
|
||||
} else {
|
||||
number_str = number_str.lpad(pad_chars_count, pad_char);
|
||||
}
|
||||
|
||||
// Add sign if needed.
|
||||
if (val < 0) {
|
||||
if (left_justified) {
|
||||
number_str = number_str.insert(0, "-");
|
||||
} else {
|
||||
number_str = number_str.insert(pad_with_zeros ? 0 : number_str.length() - initial_len, "-");
|
||||
}
|
||||
}
|
||||
|
||||
// Add number to combined string
|
||||
str += number_str;
|
||||
|
||||
if (i < count - 1) {
|
||||
str += ", ";
|
||||
}
|
||||
}
|
||||
str += ")";
|
||||
|
||||
formatted += str;
|
||||
++value_index;
|
||||
in_format = false;
|
||||
break;
|
||||
}
|
||||
case 's': { // String
|
||||
if (value_index >= values.size()) {
|
||||
return "not enough arguments for format string";
|
||||
|
@ -4759,7 +4824,7 @@ String String::sprintf(const Array &values, bool *error) const {
|
|||
}
|
||||
break;
|
||||
}
|
||||
case '.': { // Float separator.
|
||||
case '.': { // Float/Vector separator.
|
||||
if (in_decimals) {
|
||||
return "too many decimal points in format";
|
||||
}
|
||||
|
@ -4773,8 +4838,12 @@ String String::sprintf(const Array &values, bool *error) const {
|
|||
return "not enough arguments for format string";
|
||||
}
|
||||
|
||||
if (!values[value_index].is_num()) {
|
||||
return "* wants number";
|
||||
Variant::Type value_type = values[value_index].get_type();
|
||||
if (!values[value_index].is_num() &&
|
||||
value_type != Variant::VECTOR2 && value_type != Variant::VECTOR2I &&
|
||||
value_type != Variant::VECTOR3 && value_type != Variant::VECTOR3I &&
|
||||
value_type != Variant::VECTOR4 && value_type != Variant::VECTOR4I) {
|
||||
return "* wants number or vector";
|
||||
}
|
||||
|
||||
int size = values[value_index];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue