3838
3939bool MeshLibrary::_set (const StringName &p_name, const Variant &p_value) {
4040 String prop_name = p_name;
41- if (prop_name.begins_with (" item/" )) {
42- int idx = prop_name.get_slicec (' /' , 1 ).to_int ();
43- String what = prop_name.get_slicec (' /' , 2 );
44- if (!item_map.has (idx)) {
45- create_item (idx);
46- }
41+ if (!prop_name.begins_with (" item/" )) {
42+ return false ;
43+ }
44+
45+ int idx = prop_name.get_slicec (' /' , 1 ).to_int ();
46+ String what = prop_name.get_slicec (' /' , 2 );
47+ if (!item_map.has (idx)) {
48+ create_item (idx);
49+ }
4750
48- if (what == " name" ) {
49- set_item_name (idx, p_value);
50- } else if (what == " mesh" ) {
51- set_item_mesh (idx, p_value);
52- } else if (what == " mesh_transform" ) {
53- set_item_mesh_transform (idx, p_value);
54- } else if (what == " mesh_cast_shadow" ) {
55- switch ((int )p_value) {
56- case 0 : {
57- set_item_mesh_cast_shadow (idx, RS::ShadowCastingSetting::SHADOW_CASTING_SETTING_OFF);
58- } break ;
59- case 1 : {
60- set_item_mesh_cast_shadow (idx, RS::ShadowCastingSetting::SHADOW_CASTING_SETTING_ON);
61- } break ;
62- case 2 : {
63- set_item_mesh_cast_shadow (idx, RS::ShadowCastingSetting::SHADOW_CASTING_SETTING_DOUBLE_SIDED);
64- } break ;
65- case 3 : {
66- set_item_mesh_cast_shadow (idx, RS::ShadowCastingSetting::SHADOW_CASTING_SETTING_SHADOWS_ONLY);
67- } break ;
68- default : {
69- set_item_mesh_cast_shadow (idx, RS::ShadowCastingSetting::SHADOW_CASTING_SETTING_ON);
70- } break ;
71- }
7251#ifndef PHYSICS_3D_DISABLED
73- } else if (what == " shape" ) {
74- Vector<ShapeData> shapes;
75- ShapeData sd;
76- sd.shape = p_value;
77- shapes.push_back (sd);
78- set_item_shapes (idx, shapes);
79- } else if (what == " shapes " ) {
80- _set_item_shapes (idx, p_value);
52+ if (what == " shape" ) {
53+ Vector<ShapeData> shapes;
54+ ShapeData sd;
55+ sd.shape = p_value;
56+ shapes.push_back (sd);
57+ set_item_shapes (idx, shapes);
58+ return true ;
59+ }
8160#endif // PHYSICS_3D_DISABLED
82- } else if (what == " preview" ) {
83- set_item_preview (idx, p_value);
84- } else if (what == " navigation_mesh" ) {
85- set_item_navigation_mesh (idx, p_value);
86- } else if (what == " navigation_mesh_transform" ) {
87- set_item_navigation_mesh_transform (idx, p_value);
88- #ifndef DISABLE_DEPRECATED
89- } else if (what == " navmesh" ) { // Renamed in 4.0 beta 9.
90- set_item_navigation_mesh (idx, p_value);
91- } else if (what == " navmesh_transform" ) { // Renamed in 4.0 beta 9.
92- set_item_navigation_mesh_transform (idx, p_value);
93- #endif // DISABLE_DEPRECATED
94- } else if (what == " navigation_layers" ) {
95- set_item_navigation_layers (idx, p_value);
96- } else {
97- return false ;
98- }
9961
62+ #ifndef DISABLE_DEPRECATED
63+ if (what == " navmesh" ) { // Renamed in 4.0 beta 9.
64+ set_item_navigation_mesh (idx, p_value);
10065 return true ;
10166 }
67+ if (what == " navmesh_transform" ) { // Renamed in 4.0 beta 9.
68+ set_item_navigation_mesh_transform (idx, p_value);
69+ return true ;
70+ }
71+ #endif // DISABLE_DEPRECATED
10272
103- return false ;
73+ return property_helper. property_set_value (p_name, p_value) ;
10474}
10575
10676bool MeshLibrary::_get (const StringName &p_name, Variant &r_ret) const {
@@ -109,52 +79,18 @@ bool MeshLibrary::_get(const StringName &p_name, Variant &r_ret) const {
10979 ERR_FAIL_COND_V (!item_map.has (idx), false );
11080 String what = prop_name.get_slicec (' /' , 2 );
11181
112- if (what == " name" ) {
113- r_ret = get_item_name (idx);
114- } else if (what == " mesh" ) {
115- r_ret = get_item_mesh (idx);
116- } else if (what == " mesh_transform" ) {
117- r_ret = get_item_mesh_transform (idx);
118- } else if (what == " mesh_cast_shadow" ) {
119- r_ret = (int )get_item_mesh_cast_shadow (idx);
120- #ifndef PHYSICS_3D_DISABLED
121- } else if (what == " shapes" ) {
122- r_ret = _get_item_shapes (idx);
123- #endif // PHYSICS_3D_DISABLED
124- } else if (what == " navigation_mesh" ) {
125- r_ret = get_item_navigation_mesh (idx);
126- } else if (what == " navigation_mesh_transform" ) {
127- r_ret = get_item_navigation_mesh_transform (idx);
12882#ifndef DISABLE_DEPRECATED
129- } else if (what == " navmesh" ) { // Renamed in 4.0 beta 9.
83+ if (what == " navmesh" ) { // Renamed in 4.0 beta 9.
13084 r_ret = get_item_navigation_mesh (idx);
131- } else if (what == " navmesh_transform" ) { // Renamed in 4.0 beta 9.
85+ return true ;
86+ }
87+ if (what == " navmesh_transform" ) { // Renamed in 4.0 beta 9.
13288 r_ret = get_item_navigation_mesh_transform (idx);
133- #endif // DISABLE_DEPRECATED
134- } else if (what == " navigation_layers" ) {
135- r_ret = get_item_navigation_layers (idx);
136- } else if (what == " preview" ) {
137- r_ret = get_item_preview (idx);
138- } else {
139- return false ;
89+ return true ;
14090 }
91+ #endif // DISABLE_DEPRECATED
14192
142- return true ;
143- }
144-
145- void MeshLibrary::_get_property_list (List<PropertyInfo> *p_list) const {
146- for (const KeyValue<int , Item> &E : item_map) {
147- String prop_name = vformat (" %s/%d/" , PNAME (" item" ), E.key );
148- p_list->push_back (PropertyInfo (Variant::STRING, prop_name + PNAME (" name" )));
149- p_list->push_back (PropertyInfo (Variant::OBJECT, prop_name + PNAME (" mesh" ), PROPERTY_HINT_RESOURCE_TYPE, Mesh::get_class_static ()));
150- p_list->push_back (PropertyInfo (Variant::TRANSFORM3D, prop_name + PNAME (" mesh_transform" ), PROPERTY_HINT_NONE, " suffix:m" ));
151- p_list->push_back (PropertyInfo (Variant::INT, prop_name + PNAME (" mesh_cast_shadow" ), PROPERTY_HINT_ENUM, " Off,On,Double-Sided,Shadows Only" ));
152- p_list->push_back (PropertyInfo (Variant::ARRAY, prop_name + PNAME (" shapes" )));
153- p_list->push_back (PropertyInfo (Variant::OBJECT, prop_name + PNAME (" navigation_mesh" ), PROPERTY_HINT_RESOURCE_TYPE, NavigationMesh::get_class_static ()));
154- p_list->push_back (PropertyInfo (Variant::TRANSFORM3D, prop_name + PNAME (" navigation_mesh_transform" ), PROPERTY_HINT_NONE, " suffix:m" ));
155- p_list->push_back (PropertyInfo (Variant::INT, prop_name + PNAME (" navigation_layers" ), PROPERTY_HINT_LAYERS_3D_NAVIGATION));
156- p_list->push_back (PropertyInfo (Variant::OBJECT, prop_name + PNAME (" preview" ), PROPERTY_HINT_RESOURCE_TYPE, Texture2D::get_class_static (), PROPERTY_USAGE_DEFAULT));
157- }
93+ return property_helper.property_get_value (prop_name, r_ret);
15894}
15995
16096void MeshLibrary::create_item (int p_item) {
@@ -222,6 +158,28 @@ void MeshLibrary::set_item_preview(int p_item, const Ref<Texture2D> &p_preview)
222158 emit_changed ();
223159}
224160
161+ void MeshLibrary::set_item_count (int p_count) {
162+ ERR_FAIL_COND (p_count < 0 );
163+ int prev_size = item_map.size ();
164+ if (prev_size == p_count) {
165+ return ;
166+ }
167+
168+ if (prev_size < p_count) {
169+ for (int i = prev_size; i < p_count; i++) {
170+ item_map[i] = Item ();
171+ }
172+ } else {
173+ while (prev_size > p_count) {
174+ item_map.remove (item_map.back ());
175+ prev_size--;
176+ }
177+ }
178+
179+ emit_changed ();
180+ notify_property_list_changed ();
181+ }
182+
225183String MeshLibrary::get_item_name (int p_item) const {
226184 ERR_FAIL_COND_V_MSG (!item_map.has (p_item), " " , " Requested for nonexistent MeshLibrary item '" + itos (p_item) + " '." );
227185 return item_map[p_item].name ;
@@ -269,6 +227,10 @@ Ref<Texture2D> MeshLibrary::get_item_preview(int p_item) const {
269227 return item_map[p_item].preview ;
270228}
271229
230+ int MeshLibrary::get_item_count () const {
231+ return item_map.size ();
232+ }
233+
272234bool MeshLibrary::has_item (int p_item) const {
273235 return item_map.has (p_item);
274236}
@@ -382,6 +344,7 @@ void MeshLibrary::_bind_methods() {
382344 ClassDB::bind_method (D_METHOD (" set_item_shapes" , " id" , " shapes" ), &MeshLibrary::_set_item_shapes);
383345#endif // PHYSICS_3D_DISABLED
384346 ClassDB::bind_method (D_METHOD (" set_item_preview" , " id" , " texture" ), &MeshLibrary::set_item_preview);
347+ ClassDB::bind_method (D_METHOD (" set_item_count" , " count" ), &MeshLibrary::set_item_count);
385348 ClassDB::bind_method (D_METHOD (" get_item_name" , " id" ), &MeshLibrary::get_item_name);
386349 ClassDB::bind_method (D_METHOD (" get_item_mesh" , " id" ), &MeshLibrary::get_item_mesh);
387350 ClassDB::bind_method (D_METHOD (" get_item_mesh_transform" , " id" ), &MeshLibrary::get_item_mesh_transform);
@@ -393,15 +356,38 @@ void MeshLibrary::_bind_methods() {
393356 ClassDB::bind_method (D_METHOD (" get_item_shapes" , " id" ), &MeshLibrary::_get_item_shapes);
394357#endif // PHYSICS_3D_DISABLED
395358 ClassDB::bind_method (D_METHOD (" get_item_preview" , " id" ), &MeshLibrary::get_item_preview);
359+ ClassDB::bind_method (D_METHOD (" get_item_count" ), &MeshLibrary::get_item_count);
396360 ClassDB::bind_method (D_METHOD (" remove_item" , " id" ), &MeshLibrary::remove_item);
397361 ClassDB::bind_method (D_METHOD (" find_item_by_name" , " name" ), &MeshLibrary::find_item_by_name);
398362
399363 ClassDB::bind_method (D_METHOD (" clear" ), &MeshLibrary::clear);
400364 ClassDB::bind_method (D_METHOD (" get_item_list" ), &MeshLibrary::get_item_list);
401365 ClassDB::bind_method (D_METHOD (" get_last_unused_item_id" ), &MeshLibrary::get_last_unused_item_id);
366+
367+ ADD_ARRAY_COUNT (" Items" , " item_count" , " set_item_count" , " get_item_count" , " item/" );
368+
369+ base_property_helper.set_prefix (" item/" );
370+ base_property_helper.set_array_length_getter (&MeshLibrary::get_item_count);
371+
372+ Item defaults;
373+
374+ base_property_helper.register_property (PropertyInfo (Variant::STRING, " name" ), defaults.name , &MeshLibrary::set_item_name, &MeshLibrary::get_item_name);
375+ base_property_helper.register_property (PropertyInfo (Variant::OBJECT, " mesh" , PROPERTY_HINT_RESOURCE_TYPE, Mesh::get_class_static ()), defaults.mesh , &MeshLibrary::set_item_mesh, &MeshLibrary::get_item_mesh);
376+ base_property_helper.register_property (PropertyInfo (Variant::TRANSFORM3D, " mesh_transform" , PROPERTY_HINT_NONE, " suffix:m" ), defaults.mesh_transform , &MeshLibrary::set_item_mesh_transform, &MeshLibrary::get_item_mesh_transform);
377+ base_property_helper.register_property (PropertyInfo (Variant::INT, " mesh_cast_shadow" , PROPERTY_HINT_ENUM, " Off,On,Double-Sided,Shadows Only" ), defaults.mesh_cast_shadow , &MeshLibrary::set_item_mesh_cast_shadow, &MeshLibrary::get_item_mesh_cast_shadow);
378+ #ifndef PHYSICS_3D_DISABLED
379+ base_property_helper.register_property (PropertyInfo (Variant::ARRAY, " shapes" ), Array (), &MeshLibrary::_set_item_shapes, &MeshLibrary::_get_item_shapes);
380+ #endif // PHYSICS_3D_DISABLED
381+ base_property_helper.register_property (PropertyInfo (Variant::OBJECT, " navigation_mesh" , PROPERTY_HINT_RESOURCE_TYPE, NavigationMesh::get_class_static ()), defaults.navigation_mesh , &MeshLibrary::set_item_navigation_mesh, &MeshLibrary::get_item_navigation_mesh);
382+ base_property_helper.register_property (PropertyInfo (Variant::TRANSFORM3D, " navigation_mesh_transform" , PROPERTY_HINT_NONE, " suffix:m" ), defaults.navigation_mesh_transform , &MeshLibrary::set_item_navigation_mesh_transform, &MeshLibrary::get_item_navigation_mesh_transform);
383+ base_property_helper.register_property (PropertyInfo (Variant::INT, " navigation_layers" , PROPERTY_HINT_LAYERS_3D_NAVIGATION), defaults.navigation_layers , &MeshLibrary::set_item_navigation_layers, &MeshLibrary::get_item_navigation_layers);
384+ base_property_helper.register_property (PropertyInfo (Variant::OBJECT, " preview" , PROPERTY_HINT_RESOURCE_TYPE, Texture2D::get_class_static (), PROPERTY_USAGE_DEFAULT), defaults.preview , &MeshLibrary::set_item_preview, &MeshLibrary::get_item_preview);
385+
386+ PropertyListHelper::register_base_helper (&base_property_helper);
402387}
403388
404389MeshLibrary::MeshLibrary () {
390+ property_helper.setup_for_instance (base_property_helper, this );
405391}
406392
407393MeshLibrary::~MeshLibrary () {
0 commit comments