Allow some non-integer built-in constants in gdscript
This commit is contained in:
parent
4e4702e386
commit
ba974b8d1e
8 changed files with 104 additions and 18 deletions
|
@ -398,9 +398,9 @@ public:
|
|||
|
||||
void static_assign(const Variant &p_variant);
|
||||
static void get_constructor_list(Variant::Type p_type, List<MethodInfo> *p_list);
|
||||
static void get_numeric_constants_for_type(Variant::Type p_type, List<StringName> *p_constants);
|
||||
static bool has_numeric_constant(Variant::Type p_type, const StringName &p_value);
|
||||
static int get_numeric_constant_value(Variant::Type p_type, const StringName &p_value, bool *r_valid = NULL);
|
||||
static void get_constants_for_type(Variant::Type p_type, List<StringName> *p_constants);
|
||||
static bool has_constant(Variant::Type p_type, const StringName &p_value);
|
||||
static Variant get_constant_value(Variant::Type p_type, const StringName &p_value, bool *r_valid = NULL);
|
||||
|
||||
typedef String (*ObjectDeConstruct)(const Variant &p_object, void *ud);
|
||||
typedef void (*ObjectConstruct)(const String &p_text, void *ud, Variant &r_value);
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
#include "variant.h"
|
||||
|
||||
#include "core/color_names.inc"
|
||||
#include "core_string_names.h"
|
||||
#include "io/compression.h"
|
||||
#include "object.h"
|
||||
|
@ -991,6 +992,7 @@ struct _VariantCall {
|
|||
#ifdef DEBUG_ENABLED
|
||||
List<StringName> value_ordered;
|
||||
#endif
|
||||
Map<StringName, Variant> variant_value;
|
||||
};
|
||||
|
||||
static ConstantData *constant_data;
|
||||
|
@ -1002,6 +1004,11 @@ struct _VariantCall {
|
|||
constant_data[p_type].value_ordered.push_back(p_constant_name);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void add_variant_constant(int p_type, StringName p_constant_name, const Variant &p_constant_value) {
|
||||
|
||||
constant_data[p_type].variant_value[p_constant_name] = p_constant_value;
|
||||
}
|
||||
};
|
||||
|
||||
_VariantCall::TypeFunc *_VariantCall::type_funcs = NULL;
|
||||
|
@ -1354,7 +1361,7 @@ void Variant::get_constructor_list(Variant::Type p_type, List<MethodInfo> *p_lis
|
|||
}
|
||||
}
|
||||
|
||||
void Variant::get_numeric_constants_for_type(Variant::Type p_type, List<StringName> *p_constants) {
|
||||
void Variant::get_constants_for_type(Variant::Type p_type, List<StringName> *p_constants) {
|
||||
|
||||
ERR_FAIL_INDEX(p_type, Variant::VARIANT_MAX);
|
||||
|
||||
|
@ -1370,16 +1377,21 @@ void Variant::get_numeric_constants_for_type(Variant::Type p_type, List<StringNa
|
|||
p_constants->push_back(E->key());
|
||||
#endif
|
||||
}
|
||||
|
||||
for (Map<StringName, Variant>::Element *E = cd.variant_value.front(); E; E = E->next()) {
|
||||
|
||||
p_constants->push_back(E->key());
|
||||
}
|
||||
}
|
||||
|
||||
bool Variant::has_numeric_constant(Variant::Type p_type, const StringName &p_value) {
|
||||
bool Variant::has_constant(Variant::Type p_type, const StringName &p_value) {
|
||||
|
||||
ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, false);
|
||||
_VariantCall::ConstantData &cd = _VariantCall::constant_data[p_type];
|
||||
return cd.value.has(p_value);
|
||||
return cd.value.has(p_value) || cd.variant_value.has(p_value);
|
||||
}
|
||||
|
||||
int Variant::get_numeric_constant_value(Variant::Type p_type, const StringName &p_value, bool *r_valid) {
|
||||
Variant Variant::get_constant_value(Variant::Type p_type, const StringName &p_value, bool *r_valid) {
|
||||
|
||||
if (r_valid)
|
||||
*r_valid = false;
|
||||
|
@ -1389,7 +1401,14 @@ int Variant::get_numeric_constant_value(Variant::Type p_type, const StringName &
|
|||
|
||||
Map<StringName, int>::Element *E = cd.value.find(p_value);
|
||||
if (!E) {
|
||||
return -1;
|
||||
Map<StringName, Variant>::Element *E = cd.variant_value.find(p_value);
|
||||
if (E) {
|
||||
if (r_valid)
|
||||
*r_valid = true;
|
||||
return E->get();
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
if (r_valid)
|
||||
*r_valid = true;
|
||||
|
@ -1858,9 +1877,62 @@ void register_variant_methods() {
|
|||
|
||||
/* REGISTER CONSTANTS */
|
||||
|
||||
_populate_named_colors();
|
||||
for (Map<String, Color>::Element *color = _named_colors.front(); color; color = color->next()) {
|
||||
_VariantCall::add_variant_constant(Variant::COLOR, color->key(), color->value());
|
||||
}
|
||||
|
||||
_VariantCall::add_constant(Variant::VECTOR3, "AXIS_X", Vector3::AXIS_X);
|
||||
_VariantCall::add_constant(Variant::VECTOR3, "AXIS_Y", Vector3::AXIS_Y);
|
||||
_VariantCall::add_constant(Variant::VECTOR3, "AXIS_Z", Vector3::AXIS_Z);
|
||||
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR3, "ZERO", Vector3(0, 0, 0));
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR3, "INF", Vector3(Math_INF, Math_INF, Math_INF));
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR3, "LEFT", Vector3(-1, 0, 0));
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR3, "RIGHT", Vector3(1, 0, 0));
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR3, "UP", Vector3(0, 1, 0));
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR3, "DOWN", Vector3(0, -1, 0));
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR3, "FORWARD", Vector3(0, 0, -1));
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR3, "BACK", Vector3(0, 0, 1));
|
||||
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR2, "ZERO", Vector2(0, 0));
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR2, "INF", Vector2(Math_INF, Math_INF));
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR2, "LEFT", Vector2(-1, 0));
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR2, "RIGHT", Vector2(1, 0));
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR2, "UP", Vector2(0, -1));
|
||||
_VariantCall::add_variant_constant(Variant::VECTOR2, "DOWN", Vector2(0, 1));
|
||||
|
||||
_VariantCall::add_variant_constant(Variant::TRANSFORM2D, "IDENTITY", Transform2D(1, 0, 0, 1, 0, 0));
|
||||
_VariantCall::add_variant_constant(Variant::TRANSFORM2D, "FLIP_X", Transform2D(-1, 0, 0, 1, 0, 0));
|
||||
_VariantCall::add_variant_constant(Variant::TRANSFORM2D, "FLIP_Y", Transform2D(1, 0, 0, -1, 0, 0));
|
||||
|
||||
Transform identity_transform, transform_x, transform_y, transform_z;
|
||||
identity_transform.set(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0);
|
||||
_VariantCall::add_variant_constant(Variant::TRANSFORM, "IDENTITY", identity_transform);
|
||||
transform_x.set(-1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0);
|
||||
_VariantCall::add_variant_constant(Variant::TRANSFORM, "FLIP_X", transform_x);
|
||||
transform_x.set(1, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0);
|
||||
_VariantCall::add_variant_constant(Variant::TRANSFORM, "FLIP_Y", transform_y);
|
||||
transform_x.set(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0);
|
||||
_VariantCall::add_variant_constant(Variant::TRANSFORM, "FLIP_Z", transform_z);
|
||||
|
||||
_VariantCall::add_variant_constant(Variant::PLANE, "X", Plane(Vector3(1, 0, 0), 0));
|
||||
_VariantCall::add_variant_constant(Variant::PLANE, "Y", Plane(Vector3(0, 1, 0), 0));
|
||||
_VariantCall::add_variant_constant(Variant::PLANE, "Z", Plane(Vector3(0, 0, 1), 0));
|
||||
|
||||
_VariantCall::add_variant_constant(Variant::QUAT, "IDENTITY", Quat(0, 0, 0, 1));
|
||||
|
||||
CharType black_circle[2] = { 0x25CF, 0 };
|
||||
_VariantCall::add_variant_constant(Variant::STRING, "BLACK_CIRCLE", String(black_circle));
|
||||
CharType white_circle[2] = { 0x25CB, 0 };
|
||||
_VariantCall::add_variant_constant(Variant::STRING, "WHITE_CIRCLE", String(white_circle));
|
||||
CharType black_diamond[2] = { 0x25C6, 0 };
|
||||
_VariantCall::add_variant_constant(Variant::STRING, "BLACK_DIAMOND", String(black_diamond));
|
||||
CharType white_diamond[2] = { 0x25C7, 0 };
|
||||
_VariantCall::add_variant_constant(Variant::STRING, "WHITE_DIAMOND", String(white_diamond));
|
||||
|
||||
_VariantCall::add_variant_constant(Variant::NODE_PATH, "CURRENT", String("."));
|
||||
_VariantCall::add_variant_constant(Variant::NODE_PATH, "PARENT", String(".."));
|
||||
}
|
||||
|
||||
void unregister_variant_methods() {
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
</brief_description>
|
||||
<description>
|
||||
A color is represented as red, green and blue (r,g,b) components. Additionally, "a" represents the alpha component, often used for transparency. Values are in floating point and usually range from 0 to 1. Some methods (such as set_modulate(color)) may accept values > 1.
|
||||
You can also create a color from standardised color names with [method @GDScript.ColorN].
|
||||
You can also create a color from standardised color names with Color.ColorN (e.g. Color.green) or [method @GDScript.ColorN].
|
||||
</description>
|
||||
<tutorials>
|
||||
</tutorials>
|
||||
|
|
|
@ -535,13 +535,14 @@ void DocData::generate(bool p_basic_types) {
|
|||
}
|
||||
|
||||
List<StringName> constants;
|
||||
Variant::get_numeric_constants_for_type(Variant::Type(i), &constants);
|
||||
Variant::get_constants_for_type(Variant::Type(i), &constants);
|
||||
|
||||
for (List<StringName>::Element *E = constants.front(); E; E = E->next()) {
|
||||
|
||||
ConstantDoc constant;
|
||||
constant.name = E->get();
|
||||
constant.value = itos(Variant::get_numeric_constant_value(Variant::Type(i), E->get()));
|
||||
Variant value = Variant::get_constant_value(Variant::Type(i), E->get());
|
||||
constant.value = value.get_type() == Variant::INT ? itos(value) : value.get_construct_string();
|
||||
c.constants.push_back(constant);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1214,6 +1214,18 @@ Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) {
|
|||
|
||||
constant_line[constants[i].name] = class_desc->get_line_count() - 2;
|
||||
class_desc->push_font(doc_code_font);
|
||||
|
||||
if (constants[i].value.begins_with("Color(") && constants[i].value.ends_with(")")) {
|
||||
String stripped = constants[i].value.replace(" ", "").replace("Color(", "").replace(")", "");
|
||||
Vector<float> color = stripped.split_floats(",");
|
||||
if (color.size() >= 3) {
|
||||
class_desc->push_color(Color(color[0], color[1], color[2]));
|
||||
static const CharType prefix[3] = { 0x25CF /* filled circle */, ' ', 0 };
|
||||
class_desc->add_text(String(prefix));
|
||||
class_desc->pop();
|
||||
}
|
||||
}
|
||||
|
||||
class_desc->push_color(headline_color);
|
||||
_add_text(constants[i].name);
|
||||
class_desc->pop();
|
||||
|
@ -1223,6 +1235,7 @@ Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) {
|
|||
class_desc->push_color(value_color);
|
||||
_add_text(constants[i].value);
|
||||
class_desc->pop();
|
||||
|
||||
class_desc->pop();
|
||||
if (constants[i].description != "") {
|
||||
class_desc->push_font(doc_font);
|
||||
|
|
|
@ -2442,7 +2442,7 @@ Error GDScriptLanguage::complete_code(const String &p_code, const String &p_base
|
|||
} break;
|
||||
case GDScriptParser::COMPLETION_BUILT_IN_TYPE_CONSTANT: {
|
||||
List<StringName> constants;
|
||||
Variant::get_numeric_constants_for_type(parser.get_completion_built_in_constant(), &constants);
|
||||
Variant::get_constants_for_type(parser.get_completion_built_in_constant(), &constants);
|
||||
for (List<StringName>::Element *E = constants.front(); E; E = E->next()) {
|
||||
options.insert(E->get().operator String());
|
||||
}
|
||||
|
@ -3065,7 +3065,7 @@ static Error _lookup_symbol_from_base(const GDScriptParser::DataType &p_base, co
|
|||
case GDScriptParser::DataType::BUILTIN: {
|
||||
base_type.has_type = false;
|
||||
|
||||
if (Variant::has_numeric_constant(base_type.builtin_type, p_symbol)) {
|
||||
if (Variant::has_constant(base_type.builtin_type, p_symbol)) {
|
||||
r_result.type = ScriptLanguage::LookupResult::RESULT_CLASS_CONSTANT;
|
||||
r_result.class_name = Variant::get_type_name(base_type.builtin_type);
|
||||
r_result.class_member = p_symbol;
|
||||
|
|
|
@ -607,7 +607,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
|
|||
_set_error("Built-in type constant or static function expected after '.'");
|
||||
return NULL;
|
||||
}
|
||||
if (!Variant::has_numeric_constant(bi_type, identifier)) {
|
||||
if (!Variant::has_constant(bi_type, identifier)) {
|
||||
|
||||
if (tokenizer->get_token() == GDScriptTokenizer::TK_PARENTHESIS_OPEN &&
|
||||
Variant::is_method_const(bi_type, identifier) &&
|
||||
|
@ -642,7 +642,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
|
|||
} else {
|
||||
|
||||
ConstantNode *cn = alloc_node<ConstantNode>();
|
||||
cn->value = Variant::get_numeric_constant_value(bi_type, identifier);
|
||||
cn->value = Variant::get_constant_value(bi_type, identifier);
|
||||
cn->datatype = _type_from_variant(cn->value);
|
||||
expr = cn;
|
||||
}
|
||||
|
|
|
@ -1663,7 +1663,7 @@ Variant::Type VisualScriptBasicTypeConstant::get_basic_type() const {
|
|||
|
||||
class VisualScriptNodeInstanceBasicTypeConstant : public VisualScriptNodeInstance {
|
||||
public:
|
||||
int value;
|
||||
Variant value;
|
||||
bool valid;
|
||||
//virtual int get_working_memory_size() const { return 0; }
|
||||
|
||||
|
@ -1682,7 +1682,7 @@ public:
|
|||
VisualScriptNodeInstance *VisualScriptBasicTypeConstant::instance(VisualScriptInstance *p_instance) {
|
||||
|
||||
VisualScriptNodeInstanceBasicTypeConstant *instance = memnew(VisualScriptNodeInstanceBasicTypeConstant);
|
||||
instance->value = Variant::get_numeric_constant_value(type, name, &instance->valid);
|
||||
instance->value = Variant::get_constant_value(type, name, &instance->valid);
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
@ -1691,7 +1691,7 @@ void VisualScriptBasicTypeConstant::_validate_property(PropertyInfo &property) c
|
|||
if (property.name == "constant") {
|
||||
|
||||
List<StringName> constants;
|
||||
Variant::get_numeric_constants_for_type(type, &constants);
|
||||
Variant::get_constants_for_type(type, &constants);
|
||||
|
||||
if (constants.size() == 0) {
|
||||
property.usage = 0;
|
||||
|
|
Loading…
Reference in a new issue