Skip to content

Commit c73c532

Browse files
Add TileProperties, TileSet meta properties.
1 parent b514188 commit c73c532

4 files changed

Lines changed: 145 additions & 0 deletions

File tree

editor/plugins/tile_set_editor_plugin.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3424,6 +3424,13 @@ bool TilesetEditorContext::_set(const StringName &p_name, const Variant &p_value
34243424
}
34253425
}
34263426
return false;
3427+
} else if (name == "tileset_meta") {
3428+
tileset->set_meta_properties(p_value);
3429+
return true;
3430+
} else if (name.left(8) == "tileset_") {
3431+
bool v = false;
3432+
tileset->set(name.right(8), p_value, &v);
3433+
return v;
34273434
}
34283435

34293436
tileset_editor->err_dialog->set_text(TTR("This property can't be changed."));
@@ -3494,6 +3501,11 @@ bool TilesetEditorContext::_get(const StringName &p_name, Variant &r_ret) const
34943501
} else if (name == "tileset_script") {
34953502
r_ret = tileset->get_script();
34963503
v = true;
3504+
} else if (name == "tileset_meta") {
3505+
r_ret = tileset->get_meta_properties();
3506+
v = true;
3507+
} else if (name.left(8) == "tileset_") {
3508+
r_ret = tileset->get(name.substr(8, name.length()), &v);
34973509
}
34983510
return v;
34993511
}
@@ -3505,6 +3517,23 @@ void TilesetEditorContext::_get_property_list(List<PropertyInfo> *p_list) const
35053517
p_list->push_back(PropertyInfo(Variant::VECTOR2, "options_step"));
35063518
p_list->push_back(PropertyInfo(Variant::VECTOR2, "options_separation"));
35073519
}
3520+
if (tileset.is_valid()) {
3521+
p_list->push_back(PropertyInfo(Variant::NIL, "TileSet", PROPERTY_HINT_NONE, "tileset_", PROPERTY_USAGE_GROUP));
3522+
p_list->push_back(PropertyInfo(Variant::OBJECT, "tileset_script", PROPERTY_HINT_RESOURCE_TYPE, "Script"));
3523+
p_list->push_back(PropertyInfo(Variant::DICTIONARY, "tileset_meta_properties", PROPERTY_HINT_NONE, String()));
3524+
List<PropertyInfo> tp_list;
3525+
tileset->get_property_list(&tp_list);
3526+
if (tp_list.size()) {
3527+
for (List<PropertyInfo>::Element *E = tp_list.front(); E; E = E->next()) {
3528+
if ((E->get().usage & PROPERTY_USAGE_SCRIPT_VARIABLE)) {
3529+
PropertyInfo &pi = E->get();
3530+
pi.name = "tileset_" + pi.name;
3531+
p_list->push_back(pi);
3532+
}
3533+
}
3534+
}
3535+
}
3536+
35083537
if (tileset_editor->get_current_tile() >= 0 && !tileset.is_null()) {
35093538
int id = tileset_editor->get_current_tile();
35103539
p_list->push_back(PropertyInfo(Variant::NIL, "Selected Tile", PROPERTY_HINT_NONE, "tile_", PROPERTY_USAGE_GROUP));
@@ -3527,6 +3556,8 @@ void TilesetEditorContext::_get_property_list(List<PropertyInfo> *p_list) const
35273556
p_list->push_back(PropertyInfo(Variant::VECTOR2, "tile_shape_offset", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR));
35283557
p_list->push_back(PropertyInfo(Variant::VECTOR2, "tile_shape_transform", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR));
35293558
p_list->push_back(PropertyInfo(Variant::INT, "tile_z_index", PROPERTY_HINT_RANGE, itos(RS::CANVAS_ITEM_Z_MIN) + "," + itos(RS::CANVAS_ITEM_Z_MAX) + ",1"));
3559+
p_list->push_back(PropertyInfo(Variant::OBJECT, "tile_properties", PROPERTY_HINT_RESOURCE_TYPE, "TileProperties", PROPERTY_USAGE_DEFAULT, "TileProperties"));
3560+
p_list->push_back(PropertyInfo(Variant::OBJECT, "tile_properties_script", PROPERTY_HINT_RESOURCE_TYPE, "Script", PROPERTY_USAGE_DEFAULT, "Script"));
35303561
}
35313562
if (tileset_editor->edit_mode == TileSetEditor::EDITMODE_COLLISION && tileset_editor->edited_collision_shape.is_valid()) {
35323563
p_list->push_back(PropertyInfo(Variant::OBJECT, "selected_collision", PROPERTY_HINT_RESOURCE_TYPE, tileset_editor->edited_collision_shape->get_class()));

scene/register_scene_types.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,7 @@ void register_scene_types() {
609609
ClassDB::register_class<PinJoint2D>();
610610
ClassDB::register_class<GrooveJoint2D>();
611611
ClassDB::register_class<DampedSpringJoint2D>();
612+
ClassDB::register_class<TileProperties>();
612613
ClassDB::register_class<TileSet>();
613614
ClassDB::register_class<TileMap>();
614615
ClassDB::register_class<ParallaxBackground>();

scene/resources/tile_set.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
#include "core/engine.h"
3535
#include "core/math/geometry_2d.h"
3636

37+
void TileProperties::_bind_methods() {}
38+
39+
TileProperties::TileProperties() {}
40+
3741
bool TileSet::_set(const StringName &p_name, const Variant &p_value) {
3842
String n = p_name;
3943
int slash = n.find("/");
@@ -203,6 +207,14 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) {
203207
tile_set_navigation_polygon_offset(id, p_value);
204208
} else if (what == "z_index") {
205209
tile_set_z_index(id, p_value);
210+
} else if (what == "properties") {
211+
tile_set_properties(id, p_value);
212+
} else if (what == "properties_script") {
213+
Ref<TileProperties> properties = tile_get_properties(id);
214+
if (properties.is_valid()) {
215+
Ref<Script> script = p_value;
216+
properties->set_script(script.ptr());
217+
}
206218
} else {
207219
return false;
208220
}
@@ -318,6 +330,13 @@ bool TileSet::_get(const StringName &p_name, Variant &r_ret) const {
318330
r_ret = tile_get_navigation_polygon_offset(id);
319331
} else if (what == "z_index") {
320332
r_ret = tile_get_z_index(id);
333+
} else if (what == "properties") {
334+
r_ret = tile_get_properties(id);
335+
} else if (what == "properties_script") {
336+
RES properties = tile_get_properties(id);
337+
if (properties.is_valid()) {
338+
r_ret = properties->get_script();
339+
}
321340
} else {
322341
return false;
323342
}
@@ -367,17 +386,48 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const {
367386
p_list->push_back(PropertyInfo(Variant::FLOAT, pre + "shape_one_way_margin", PROPERTY_HINT_RANGE, "0,128,0.01", PROPERTY_USAGE_NOEDITOR));
368387
p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "shapes", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
369388
p_list->push_back(PropertyInfo(Variant::INT, pre + "z_index", PROPERTY_HINT_RANGE, itos(RS::CANVAS_ITEM_Z_MIN) + "," + itos(RS::CANVAS_ITEM_Z_MAX) + ",1", PROPERTY_USAGE_NOEDITOR));
389+
p_list->push_back(PropertyInfo(Variant::OBJECT, pre + "properties", PROPERTY_HINT_RESOURCE_TYPE, "TileProperties"));
390+
p_list->push_back(PropertyInfo(Variant::OBJECT, pre + "properties_script", PROPERTY_HINT_RESOURCE_TYPE, "Script"));
370391
}
371392
}
372393

373394
void TileSet::create_tile(int p_id) {
374395
ERR_FAIL_COND(tile_map.has(p_id));
375396
tile_map[p_id] = TileData();
376397
tile_map[p_id].autotile_data = AutotileData();
398+
if (tile_properties_script.is_valid()) {
399+
tile_map[p_id].properties = Ref<TileProperties>(memnew(TileProperties));
400+
tile_map[p_id].properties->set_script(tile_properties_script.ptr());
401+
}
377402
_change_notify("");
378403
emit_changed();
379404
}
380405

406+
void TileSet::set_tile_properties_script(const Ref<Script> &p_script) {
407+
if (tile_properties_script == p_script)
408+
return;
409+
if (tile_properties_script.is_null()) {
410+
for (Map<int, TileSet::TileData>::Element *E = tile_map.front(); E; E = E->next()) {
411+
Ref<TileProperties> tp = memnew(TileProperties());
412+
tp->set_script(p_script.ptr());
413+
E->value().properties = tp;
414+
}
415+
} else {
416+
for (Map<int, TileSet::TileData>::Element *E = tile_map.front(); E; E = E->next()) {
417+
Ref<TileProperties> p = E->value().properties;
418+
ERR_CONTINUE(p.is_valid());
419+
Ref<Script> s = p->get_script();
420+
if (s != p_script)
421+
E->value().properties->set_script(p_script.ptr());
422+
}
423+
}
424+
tile_properties_script = p_script;
425+
}
426+
427+
Ref<Script> TileSet::get_tile_properties_script() const {
428+
return tile_properties_script;
429+
}
430+
381431
void TileSet::autotile_set_bitmask_mode(int p_id, BitmaskMode p_mode) {
382432
ERR_FAIL_COND(!tile_map.has(p_id));
383433
tile_map[p_id].autotile_data.bitmask_mode = p_mode;
@@ -907,6 +957,17 @@ Vector2 TileSet::tile_get_occluder_offset(int p_id) const {
907957
return tile_map[p_id].occluder_offset;
908958
}
909959

960+
Ref<TileProperties> TileSet::tile_get_properties(int p_id) const {
961+
ERR_FAIL_COND_V(!tile_map.has(p_id), 0);
962+
return tile_map[p_id].properties;
963+
}
964+
965+
void TileSet::tile_set_properties(int p_id, const Ref<TileProperties> &p_properties) {
966+
ERR_FAIL_COND(!tile_map.has(p_id));
967+
tile_map[p_id].properties = p_properties;
968+
emit_changed();
969+
}
970+
910971
void TileSet::tile_set_shapes(int p_id, const Vector<ShapeData> &p_shapes) {
911972
ERR_FAIL_COND(!tile_map.has(p_id));
912973
tile_map[p_id].shapes_data = p_shapes;
@@ -1049,6 +1110,14 @@ void TileSet::_decompose_convex_shape(Ref<Shape2D> p_shape) {
10491110
}
10501111
}
10511112

1113+
void TileSet::set_meta_properties(Dictionary p_dict) {
1114+
meta_properties = p_dict;
1115+
}
1116+
1117+
Dictionary TileSet::get_meta_properties() const {
1118+
return meta_properties;
1119+
}
1120+
10521121
void TileSet::get_tile_list(List<int> *p_tiles) const {
10531122
for (Map<int, TileData>::Element *E = tile_map.front(); E; E = E->next()) {
10541123
p_tiles->push_back(E->key());
@@ -1164,12 +1233,24 @@ void TileSet::_bind_methods() {
11641233
ClassDB::bind_method(D_METHOD("tile_get_occluder_offset", "id"), &TileSet::tile_get_occluder_offset);
11651234
ClassDB::bind_method(D_METHOD("tile_set_z_index", "id", "z_index"), &TileSet::tile_set_z_index);
11661235
ClassDB::bind_method(D_METHOD("tile_get_z_index", "id"), &TileSet::tile_get_z_index);
1236+
ClassDB::bind_method(D_METHOD("tile_set_properties", "id", "properties"), &TileSet::tile_set_properties);
1237+
ClassDB::bind_method(D_METHOD("tile_get_properties", "id"), &TileSet::tile_get_properties);
11671238

11681239
ClassDB::bind_method(D_METHOD("remove_tile", "id"), &TileSet::remove_tile);
11691240
ClassDB::bind_method(D_METHOD("clear"), &TileSet::clear);
11701241
ClassDB::bind_method(D_METHOD("get_last_unused_tile_id"), &TileSet::get_last_unused_tile_id);
11711242
ClassDB::bind_method(D_METHOD("find_tile_by_name", "name"), &TileSet::find_tile_by_name);
11721243
ClassDB::bind_method(D_METHOD("get_tiles_ids"), &TileSet::_get_tiles_ids);
1244+
ClassDB::bind_method(D_METHOD("set_tile_properties_script", "script"), &TileSet::set_tile_properties_script);
1245+
ClassDB::bind_method(D_METHOD("get_tile_properties_script"), &TileSet::get_tile_properties_script);
1246+
1247+
ClassDB::bind_method(D_METHOD("set_meta_properties", "dict"), &TileSet::set_meta_properties);
1248+
ClassDB::bind_method(D_METHOD("get_meta_properties"), &TileSet::get_meta_properties);
1249+
1250+
ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "meta_properties", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT, "Script"), "set_meta_properties", "get_meta_properties");
1251+
1252+
ADD_GROUP("Tiles", "tiles_");
1253+
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "tiles_default_script", PROPERTY_HINT_RESOURCE_TYPE, "Script", PROPERTY_USAGE_DEFAULT, "Script"), "set_tile_properties_script", "get_tile_properties_script");
11731254

11741255
BIND_VMETHOD(MethodInfo(Variant::BOOL, "_is_tile_bound", PropertyInfo(Variant::INT, "drawn_id"), PropertyInfo(Variant::INT, "neighbor_id")));
11751256
BIND_VMETHOD(MethodInfo(Variant::VECTOR2, "_forward_subtile_selection", PropertyInfo(Variant::INT, "autotile_id"), PropertyInfo(Variant::INT, "bitmask"), PropertyInfo(Variant::OBJECT, "tilemap", PROPERTY_HINT_NONE, "TileMap"), PropertyInfo(Variant::VECTOR2, "tile_location")));

scene/resources/tile_set.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,24 @@
3939
#include "scene/resources/shape_2d.h"
4040
#include "scene/resources/texture.h"
4141

42+
class TileSet;
43+
44+
class TileProperties : public Resource {
45+
GDCLASS(TileProperties, Resource);
46+
47+
friend class TileSet;
48+
49+
private:
50+
int id;
51+
Ref<TileSet> tileset;
52+
53+
protected:
54+
static void _bind_methods();
55+
56+
public:
57+
TileProperties();
58+
};
59+
4260
class TileSet : public Resource {
4361
GDCLASS(TileSet, Resource);
4462

@@ -120,16 +138,21 @@ class TileSet : public Resource {
120138
Color modulate = Color(1, 1, 1);
121139
AutotileData autotile_data;
122140
int z_index = 0;
141+
Ref<TileProperties> properties;
123142

124143
explicit TileData() {}
125144
};
126145

127146
Map<int, TileData> tile_map;
128147

148+
Ref<Script> tile_properties_script;
149+
Dictionary meta_properties;
150+
129151
protected:
130152
bool _set(const StringName &p_name, const Variant &p_value);
131153
bool _get(const StringName &p_name, Variant &r_ret) const;
132154
void _get_property_list(List<PropertyInfo> *p_list) const;
155+
void _get_tile_property_list(int p_id, List<PropertyInfo> *p_list) const;
133156
void _tile_set_shapes(int p_id, const Array &p_shapes);
134157
Array _tile_get_shapes(int p_id) const;
135158
Array _get_tiles_ids() const;
@@ -140,6 +163,12 @@ class TileSet : public Resource {
140163
public:
141164
void create_tile(int p_id);
142165

166+
void set_meta_properties(Dictionary p_dict);
167+
Dictionary get_meta_properties() const;
168+
169+
void set_tile_properties_script(const Ref<Script> &p_script);
170+
Ref<Script> get_tile_properties_script() const;
171+
143172
void autotile_set_bitmask_mode(int p_id, BitmaskMode p_mode);
144173
BitmaskMode autotile_get_bitmask_mode(int p_id) const;
145174

@@ -236,6 +265,9 @@ class TileSet : public Resource {
236265
void tile_set_z_index(int p_id, int p_z_index);
237266
int tile_get_z_index(int p_id) const;
238267

268+
void tile_set_properties(int p_id, const Ref<TileProperties> &p_meta);
269+
Ref<TileProperties> tile_get_properties(int p_id) const;
270+
239271
void remove_tile(int p_id);
240272

241273
bool has_tile(int p_id) const;

0 commit comments

Comments
 (0)