Browse Source

Merge pull request #64009 from KoBeWi/arrayy_lmao

Replace Array return types with TypedArray (part 2)
Rémi Verschelde 3 years ago
parent
commit
91e5f48ea7
75 changed files with 301 additions and 263 deletions
  1. 18 15
      core/core_bind.cpp
  2. 11 11
      core/core_bind.h
  3. 5 4
      core/input/input_map.cpp
  4. 5 2
      core/input/input_map.h
  5. 9 8
      core/io/ip.cpp
  6. 6 3
      core/io/ip.h
  7. 18 12
      core/object/object.cpp
  8. 9 6
      core/object/object.h
  9. 7 6
      core/object/script_language.cpp
  10. 5 3
      core/object/script_language.h
  11. 8 8
      doc/classes/Geometry2D.xml
  12. 3 3
      doc/classes/Geometry3D.xml
  13. 1 1
      doc/classes/GraphEdit.xml
  14. 3 3
      doc/classes/IP.xml
  15. 2 2
      doc/classes/InputMap.xml
  16. 2 2
      doc/classes/Mesh.xml
  17. 3 3
      doc/classes/NavigationServer2D.xml
  18. 3 3
      doc/classes/NavigationServer3D.xml
  19. 1 1
      doc/classes/Node.xml
  20. 1 1
      doc/classes/Node3D.xml
  21. 6 6
      doc/classes/Object.xml
  22. 1 1
      doc/classes/Performance.xml
  23. 4 4
      doc/classes/PhysicsDirectSpaceState2D.xml
  24. 4 4
      doc/classes/PhysicsDirectSpaceState3D.xml
  25. 1 1
      doc/classes/RDUniform.xml
  26. 1 1
      doc/classes/RenderingServer.xml
  27. 1 1
      doc/classes/RigidDynamicBody3D.xml
  28. 2 2
      doc/classes/SceneTree.xml
  29. 3 3
      doc/classes/Script.xml
  30. 2 2
      doc/classes/ScriptEditor.xml
  31. 2 2
      doc/classes/Shape2D.xml
  32. 1 1
      doc/classes/SoftDynamicBody3D.xml
  33. 1 1
      doc/classes/VisualShader.xml
  34. 4 4
      editor/plugins/script_editor_plugin.cpp
  35. 2 2
      editor/plugins/script_editor_plugin.h
  36. 4 3
      main/performance.cpp
  37. 4 1
      main/performance.h
  38. 2 2
      modules/gridmap/doc_classes/GridMap.xml
  39. 6 6
      modules/gridmap/grid_map.cpp
  40. 2 2
      modules/gridmap/grid_map.h
  41. 6 6
      modules/navigation/godot_navigation_server.cpp
  42. 3 3
      modules/navigation/godot_navigation_server.h
  43. 1 1
      scene/2d/physics_body_2d.cpp
  44. 2 2
      scene/3d/node_3d.cpp
  45. 1 1
      scene/3d/node_3d.h
  46. 3 3
      scene/3d/physics_body_3d.cpp
  47. 1 1
      scene/3d/physics_body_3d.h
  48. 2 2
      scene/3d/soft_dynamic_body_3d.cpp
  49. 2 1
      scene/3d/soft_dynamic_body_3d.h
  50. 2 2
      scene/gui/graph_edit.cpp
  51. 1 1
      scene/gui/graph_edit.h
  52. 2 2
      scene/main/node.cpp
  53. 1 1
      scene/main/node.h
  54. 4 4
      scene/main/scene_tree.cpp
  55. 2 2
      scene/main/scene_tree.h
  56. 2 2
      scene/resources/immediate_mesh.cpp
  57. 1 1
      scene/resources/immediate_mesh.h
  58. 5 5
      scene/resources/mesh.cpp
  59. 4 4
      scene/resources/mesh.h
  60. 2 2
      scene/resources/primitive_meshes.cpp
  61. 1 1
      scene/resources/primitive_meshes.h
  62. 10 10
      scene/resources/shape_2d.cpp
  63. 2 2
      scene/resources/shape_2d.h
  64. 2 2
      scene/resources/visual_shader.cpp
  65. 1 1
      scene/resources/visual_shader.h
  66. 3 3
      servers/navigation_server_2d.cpp
  67. 3 3
      servers/navigation_server_2d.h
  68. 3 3
      servers/navigation_server_3d.h
  69. 16 15
      servers/physics_server_2d.cpp
  70. 6 4
      servers/physics_server_2d.h
  71. 17 16
      servers/physics_server_3d.cpp
  72. 6 4
      servers/physics_server_3d.h
  73. 3 3
      servers/rendering/rendering_device_binds.h
  74. 4 3
      servers/rendering_server.cpp
  75. 4 1
      servers/rendering_server.h

+ 18 - 15
core/core_bind.cpp

@@ -819,7 +819,7 @@ Vector<Point2> Geometry2D::convex_hull(const Vector<Point2> &p_points) {
 	return ::Geometry2D::convex_hull(p_points);
 }
 
-Array Geometry2D::merge_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b) {
+TypedArray<PackedVector2Array> Geometry2D::merge_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b) {
 	Vector<Vector<Point2>> polys = ::Geometry2D::merge_polygons(p_polygon_a, p_polygon_b);
 
 	Array ret;
@@ -830,10 +830,10 @@ Array Geometry2D::merge_polygons(const Vector<Vector2> &p_polygon_a, const Vecto
 	return ret;
 }
 
-Array Geometry2D::clip_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b) {
+TypedArray<PackedVector2Array> Geometry2D::clip_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b) {
 	Vector<Vector<Point2>> polys = ::Geometry2D::clip_polygons(p_polygon_a, p_polygon_b);
 
-	Array ret;
+	TypedArray<PackedVector2Array> ret;
 
 	for (int i = 0; i < polys.size(); ++i) {
 		ret.push_back(polys[i]);
@@ -841,7 +841,7 @@ Array Geometry2D::clip_polygons(const Vector<Vector2> &p_polygon_a, const Vector
 	return ret;
 }
 
-Array Geometry2D::intersect_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b) {
+TypedArray<PackedVector2Array> Geometry2D::intersect_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b) {
 	Vector<Vector<Point2>> polys = ::Geometry2D::intersect_polygons(p_polygon_a, p_polygon_b);
 
 	Array ret;
@@ -852,7 +852,7 @@ Array Geometry2D::intersect_polygons(const Vector<Vector2> &p_polygon_a, const V
 	return ret;
 }
 
-Array Geometry2D::exclude_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b) {
+TypedArray<PackedVector2Array> Geometry2D::exclude_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b) {
 	Vector<Vector<Point2>> polys = ::Geometry2D::exclude_polygons(p_polygon_a, p_polygon_b);
 
 	Array ret;
@@ -863,7 +863,7 @@ Array Geometry2D::exclude_polygons(const Vector<Vector2> &p_polygon_a, const Vec
 	return ret;
 }
 
-Array Geometry2D::clip_polyline_with_polygon(const Vector<Vector2> &p_polyline, const Vector<Vector2> &p_polygon) {
+TypedArray<PackedVector2Array> Geometry2D::clip_polyline_with_polygon(const Vector<Vector2> &p_polyline, const Vector<Vector2> &p_polygon) {
 	Vector<Vector<Point2>> polys = ::Geometry2D::clip_polyline_with_polygon(p_polyline, p_polygon);
 
 	Array ret;
@@ -874,7 +874,7 @@ Array Geometry2D::clip_polyline_with_polygon(const Vector<Vector2> &p_polyline,
 	return ret;
 }
 
-Array Geometry2D::intersect_polyline_with_polygon(const Vector<Vector2> &p_polyline, const Vector<Vector2> &p_polygon) {
+TypedArray<PackedVector2Array> Geometry2D::intersect_polyline_with_polygon(const Vector<Vector2> &p_polyline, const Vector<Vector2> &p_polygon) {
 	Vector<Vector<Point2>> polys = ::Geometry2D::intersect_polyline_with_polygon(p_polyline, p_polygon);
 
 	Array ret;
@@ -885,7 +885,7 @@ Array Geometry2D::intersect_polyline_with_polygon(const Vector<Vector2> &p_polyl
 	return ret;
 }
 
-Array Geometry2D::offset_polygon(const Vector<Vector2> &p_polygon, real_t p_delta, PolyJoinType p_join_type) {
+TypedArray<PackedVector2Array> Geometry2D::offset_polygon(const Vector<Vector2> &p_polygon, real_t p_delta, PolyJoinType p_join_type) {
 	Vector<Vector<Point2>> polys = ::Geometry2D::offset_polygon(p_polygon, p_delta, ::Geometry2D::PolyJoinType(p_join_type));
 
 	Array ret;
@@ -896,7 +896,7 @@ Array Geometry2D::offset_polygon(const Vector<Vector2> &p_polygon, real_t p_delt
 	return ret;
 }
 
-Array Geometry2D::offset_polyline(const Vector<Vector2> &p_polygon, real_t p_delta, PolyJoinType p_join_type, PolyEndType p_end_type) {
+TypedArray<PackedVector2Array> Geometry2D::offset_polyline(const Vector<Vector2> &p_polygon, real_t p_delta, PolyJoinType p_join_type, PolyEndType p_end_type) {
 	Vector<Vector<Point2>> polys = ::Geometry2D::offset_polyline(p_polygon, p_delta, ::Geometry2D::PolyJoinType(p_join_type), ::Geometry2D::PolyEndType(p_end_type));
 
 	Array ret;
@@ -989,16 +989,19 @@ Geometry3D *Geometry3D::get_singleton() {
 	return singleton;
 }
 
-Vector<Plane> Geometry3D::build_box_planes(const Vector3 &p_extents) {
-	return ::Geometry3D::build_box_planes(p_extents);
+TypedArray<Plane> Geometry3D::build_box_planes(const Vector3 &p_extents) {
+	Variant ret = ::Geometry3D::build_box_planes(p_extents);
+	return ret;
 }
 
-Vector<Plane> Geometry3D::build_cylinder_planes(float p_radius, float p_height, int p_sides, Vector3::Axis p_axis) {
-	return ::Geometry3D::build_cylinder_planes(p_radius, p_height, p_sides, p_axis);
+TypedArray<Plane> Geometry3D::build_cylinder_planes(float p_radius, float p_height, int p_sides, Vector3::Axis p_axis) {
+	Variant ret = ::Geometry3D::build_cylinder_planes(p_radius, p_height, p_sides, p_axis);
+	return ret;
 }
 
-Vector<Plane> Geometry3D::build_capsule_planes(float p_radius, float p_height, int p_sides, int p_lats, Vector3::Axis p_axis) {
-	return ::Geometry3D::build_capsule_planes(p_radius, p_height, p_sides, p_lats, p_axis);
+TypedArray<Plane> Geometry3D::build_capsule_planes(float p_radius, float p_height, int p_sides, int p_lats, Vector3::Axis p_axis) {
+	Variant ret = ::Geometry3D::build_capsule_planes(p_radius, p_height, p_sides, p_lats, p_axis);
+	return ret;
 }
 
 Vector<Vector3> Geometry3D::get_closest_points_between_segments(const Vector3 &p1, const Vector3 &p2, const Vector3 &q1, const Vector3 &q2) {

+ 11 - 11
core/core_bind.h

@@ -303,14 +303,14 @@ public:
 		OPERATION_XOR
 	};
 	// 2D polygon boolean operations.
-	Array merge_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // Union (add).
-	Array clip_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // Difference (subtract).
-	Array intersect_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // Common area (multiply).
-	Array exclude_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // All but common area (xor).
+	TypedArray<PackedVector2Array> merge_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // Union (add).
+	TypedArray<PackedVector2Array> clip_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // Difference (subtract).
+	TypedArray<PackedVector2Array> intersect_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // Common area (multiply).
+	TypedArray<PackedVector2Array> exclude_polygons(const Vector<Vector2> &p_polygon_a, const Vector<Vector2> &p_polygon_b); // All but common area (xor).
 
 	// 2D polyline vs polygon operations.
-	Array clip_polyline_with_polygon(const Vector<Vector2> &p_polyline, const Vector<Vector2> &p_polygon); // Cut.
-	Array intersect_polyline_with_polygon(const Vector<Vector2> &p_polyline, const Vector<Vector2> &p_polygon); // Chop.
+	TypedArray<PackedVector2Array> clip_polyline_with_polygon(const Vector<Vector2> &p_polyline, const Vector<Vector2> &p_polygon); // Cut.
+	TypedArray<PackedVector2Array> intersect_polyline_with_polygon(const Vector<Vector2> &p_polyline, const Vector<Vector2> &p_polygon); // Chop.
 
 	// 2D offset polygons/polylines.
 	enum PolyJoinType {
@@ -325,8 +325,8 @@ public:
 		END_SQUARE,
 		END_ROUND
 	};
-	Array offset_polygon(const Vector<Vector2> &p_polygon, real_t p_delta, PolyJoinType p_join_type = JOIN_SQUARE);
-	Array offset_polyline(const Vector<Vector2> &p_polygon, real_t p_delta, PolyJoinType p_join_type = JOIN_SQUARE, PolyEndType p_end_type = END_SQUARE);
+	TypedArray<PackedVector2Array> offset_polygon(const Vector<Vector2> &p_polygon, real_t p_delta, PolyJoinType p_join_type = JOIN_SQUARE);
+	TypedArray<PackedVector2Array> offset_polyline(const Vector<Vector2> &p_polygon, real_t p_delta, PolyJoinType p_join_type = JOIN_SQUARE, PolyEndType p_end_type = END_SQUARE);
 
 	Dictionary make_atlas(const Vector<Size2> &p_rects);
 
@@ -343,9 +343,9 @@ protected:
 
 public:
 	static Geometry3D *get_singleton();
-	Vector<Plane> build_box_planes(const Vector3 &p_extents);
-	Vector<Plane> build_cylinder_planes(float p_radius, float p_height, int p_sides, Vector3::Axis p_axis = Vector3::AXIS_Z);
-	Vector<Plane> build_capsule_planes(float p_radius, float p_height, int p_sides, int p_lats, Vector3::Axis p_axis = Vector3::AXIS_Z);
+	TypedArray<Plane> build_box_planes(const Vector3 &p_extents);
+	TypedArray<Plane> build_cylinder_planes(float p_radius, float p_height, int p_sides, Vector3::Axis p_axis = Vector3::AXIS_Z);
+	TypedArray<Plane> build_capsule_planes(float p_radius, float p_height, int p_sides, int p_lats, Vector3::Axis p_axis = Vector3::AXIS_Z);
 	Vector<Vector3> get_closest_points_between_segments(const Vector3 &p1, const Vector3 &p2, const Vector3 &q1, const Vector3 &q2);
 	Vector3 get_closest_point_to_segment(const Vector3 &p_point, const Vector3 &p_a, const Vector3 &p_b);
 	Vector3 get_closest_point_to_segment_uncapped(const Vector3 &p_point, const Vector3 &p_a, const Vector3 &p_b);

+ 5 - 4
core/input/input_map.cpp

@@ -34,6 +34,7 @@
 #include "core/input/input.h"
 #include "core/os/keyboard.h"
 #include "core/os/os.h"
+#include "core/variant/typed_array.h"
 
 InputMap *InputMap::singleton = nullptr;
 
@@ -99,8 +100,8 @@ void InputMap::erase_action(const StringName &p_action) {
 	input_map.erase(p_action);
 }
 
-Array InputMap::_get_actions() {
-	Array ret;
+TypedArray<StringName> InputMap::_get_actions() {
+	TypedArray<StringName> ret;
 	List<StringName> actions = get_actions();
 	if (actions.is_empty()) {
 		return ret;
@@ -190,8 +191,8 @@ void InputMap::action_erase_events(const StringName &p_action) {
 	input_map[p_action].inputs.clear();
 }
 
-Array InputMap::_action_get_events(const StringName &p_action) {
-	Array ret;
+TypedArray<InputEvent> InputMap::_action_get_events(const StringName &p_action) {
+	TypedArray<InputEvent> ret;
 	const List<Ref<InputEvent>> *al = action_get_events(p_action);
 	if (al) {
 		for (const List<Ref<InputEvent>>::Element *E = al->front(); E; E = E->next()) {

+ 5 - 2
core/input/input_map.h

@@ -36,6 +36,9 @@
 #include "core/object/object.h"
 #include "core/templates/hash_map.h"
 
+template <typename T>
+class TypedArray;
+
 class InputMap : public Object {
 	GDCLASS(InputMap, Object);
 
@@ -60,8 +63,8 @@ private:
 
 	List<Ref<InputEvent>>::Element *_find_event(Action &p_action, const Ref<InputEvent> &p_event, bool p_exact_match = false, bool *r_pressed = nullptr, float *r_strength = nullptr, float *r_raw_strength = nullptr) const;
 
-	Array _action_get_events(const StringName &p_action);
-	Array _get_actions();
+	TypedArray<InputEvent> _action_get_events(const StringName &p_action);
+	TypedArray<StringName> _get_actions();
 
 protected:
 	static void _bind_methods();

+ 9 - 8
core/io/ip.cpp

@@ -33,6 +33,7 @@
 #include "core/os/semaphore.h"
 #include "core/os/thread.h"
 #include "core/templates/hash_map.h"
+#include "core/variant/typed_array.h"
 
 VARIANT_ENUM_CAST(IP::ResolverStatus);
 
@@ -124,11 +125,11 @@ struct _IP_ResolverPrivate {
 };
 
 IPAddress IP::resolve_hostname(const String &p_hostname, IP::Type p_type) {
-	const Array addresses = resolve_hostname_addresses(p_hostname, p_type);
-	return addresses.size() ? addresses[0].operator IPAddress() : IPAddress();
+	const PackedStringArray addresses = resolve_hostname_addresses(p_hostname, p_type);
+	return addresses.size() ? (IPAddress)addresses[0] : IPAddress();
 }
 
-Array IP::resolve_hostname_addresses(const String &p_hostname, Type p_type) {
+PackedStringArray IP::resolve_hostname_addresses(const String &p_hostname, Type p_type) {
 	List<IPAddress> res;
 	String key = _IP_ResolverPrivate::get_cache_key(p_hostname, p_type);
 
@@ -148,7 +149,7 @@ Array IP::resolve_hostname_addresses(const String &p_hostname, Type p_type) {
 	}
 	resolver->mutex.unlock();
 
-	Array result;
+	PackedStringArray result;
 	for (int i = 0; i < res.size(); ++i) {
 		result.push_back(String(res[i]));
 	}
@@ -254,8 +255,8 @@ void IP::clear_cache(const String &p_hostname) {
 	}
 }
 
-Array IP::_get_local_addresses() const {
-	Array addresses;
+PackedStringArray IP::_get_local_addresses() const {
+	PackedStringArray addresses;
 	List<IPAddress> ip_addresses;
 	get_local_addresses(&ip_addresses);
 	for (const IPAddress &E : ip_addresses) {
@@ -265,8 +266,8 @@ Array IP::_get_local_addresses() const {
 	return addresses;
 }
 
-Array IP::_get_local_interfaces() const {
-	Array results;
+TypedArray<Dictionary> IP::_get_local_interfaces() const {
+	TypedArray<Dictionary> results;
 	HashMap<String, Interface_Info> interfaces;
 	get_local_interfaces(&interfaces);
 	for (KeyValue<String, Interface_Info> &E : interfaces) {

+ 6 - 3
core/io/ip.h

@@ -34,6 +34,9 @@
 #include "core/io/ip_address.h"
 #include "core/os/os.h"
 
+template <typename T>
+class TypedArray;
+
 struct _IP_ResolverPrivate;
 
 class IP : public Object {
@@ -68,8 +71,8 @@ protected:
 	static IP *singleton;
 	static void _bind_methods();
 
-	Array _get_local_addresses() const;
-	Array _get_local_interfaces() const;
+	PackedStringArray _get_local_addresses() const;
+	TypedArray<Dictionary> _get_local_interfaces() const;
 
 	static IP *(*_create)();
 
@@ -82,7 +85,7 @@ public:
 	};
 
 	IPAddress resolve_hostname(const String &p_hostname, Type p_type = TYPE_ANY);
-	Array resolve_hostname_addresses(const String &p_hostname, Type p_type = TYPE_ANY);
+	PackedStringArray resolve_hostname_addresses(const String &p_hostname, Type p_type = TYPE_ANY);
 	// async resolver hostname
 	ResolverID resolve_hostname_queue_item(const String &p_hostname, Type p_type = TYPE_ANY);
 	ResolverStatus get_resolve_item_status(ResolverID p_id) const;

+ 18 - 12
core/object/object.cpp

@@ -38,6 +38,7 @@
 #include "core/os/os.h"
 #include "core/string/print_string.h"
 #include "core/string/translation.h"
+#include "core/variant/typed_array.h"
 
 #ifdef DEBUG_ENABLED
 
@@ -102,8 +103,8 @@ PropertyInfo PropertyInfo::from_dict(const Dictionary &p_dict) {
 	return pi;
 }
 
-Array convert_property_list(const List<PropertyInfo> *p_list) {
-	Array va;
+TypedArray<Dictionary> convert_property_list(const List<PropertyInfo> *p_list) {
+	TypedArray<Dictionary> va;
 	for (const List<PropertyInfo>::Element *E = p_list->front(); E; E = E->next()) {
 		va.push_back(Dictionary(E->get()));
 	}
@@ -912,16 +913,16 @@ void Object::remove_meta(const StringName &p_name) {
 	set_meta(p_name, Variant());
 }
 
-Array Object::_get_property_list_bind() const {
+TypedArray<Dictionary> Object::_get_property_list_bind() const {
 	List<PropertyInfo> lpi;
 	get_property_list(&lpi);
 	return convert_property_list(&lpi);
 }
 
-Array Object::_get_method_list_bind() const {
+TypedArray<Dictionary> Object::_get_method_list_bind() const {
 	List<MethodInfo> ml;
 	get_method_list(&ml);
-	Array ret;
+	TypedArray<Dictionary> ret;
 
 	for (List<MethodInfo>::Element *E = ml.front(); E; E = E->next()) {
 		Dictionary d = E->get();
@@ -1109,11 +1110,11 @@ void Object::_add_user_signal(const String &p_name, const Array &p_args) {
 	add_user_signal(mi);
 }
 
-Array Object::_get_signal_list() const {
+TypedArray<Dictionary> Object::_get_signal_list() const {
 	List<MethodInfo> signal_list;
 	get_signal_list(&signal_list);
 
-	Array ret;
+	TypedArray<Dictionary> ret;
 	for (const MethodInfo &E : signal_list) {
 		ret.push_back(Dictionary(E));
 	}
@@ -1121,11 +1122,11 @@ Array Object::_get_signal_list() const {
 	return ret;
 }
 
-Array Object::_get_signal_connection_list(const StringName &p_signal) const {
+TypedArray<Dictionary> Object::_get_signal_connection_list(const StringName &p_signal) const {
 	List<Connection> conns;
 	get_all_signal_connections(&conns);
 
-	Array ret;
+	TypedArray<Dictionary> ret;
 
 	for (const Connection &c : conns) {
 		if (c.signal.get_name() == p_signal) {
@@ -1136,8 +1137,8 @@ Array Object::_get_signal_connection_list(const StringName &p_signal) const {
 	return ret;
 }
 
-Array Object::_get_incoming_connections() const {
-	Array ret;
+TypedArray<Dictionary> Object::_get_incoming_connections() const {
+	TypedArray<Dictionary> ret;
 	int connections_amount = connections.size();
 	for (int idx_conn = 0; idx_conn < connections_amount; idx_conn++) {
 		ret.push_back(connections[idx_conn]);
@@ -1553,7 +1554,12 @@ void Object::_bind_methods() {
 	miget.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
 	BIND_OBJ_CORE_METHOD(miget);
 
-	BIND_OBJ_CORE_METHOD(MethodInfo(Variant::ARRAY, "_get_property_list"));
+	MethodInfo plget("_get_property_list");
+	plget.return_val.type = Variant::ARRAY;
+	plget.return_val.hint = PROPERTY_HINT_ARRAY_TYPE;
+	plget.return_val.hint_string = "Dictionary";
+	BIND_OBJ_CORE_METHOD(plget);
+
 	BIND_OBJ_CORE_METHOD(MethodInfo(Variant::BOOL, "_property_can_revert", PropertyInfo(Variant::STRING_NAME, "property")));
 	MethodInfo mipgr("_property_get_revert", PropertyInfo(Variant::STRING_NAME, "property"));
 	mipgr.return_val.name = "Variant";

+ 9 - 6
core/object/object.h

@@ -45,6 +45,9 @@
 #include "core/variant/callable_bind.h"
 #include "core/variant/variant.h"
 
+template <typename T>
+class TypedArray;
+
 enum PropertyHint {
 	PROPERTY_HINT_NONE, ///< no hint provided.
 	PROPERTY_HINT_RANGE, ///< hint_text = "min,max[,step][,or_greater][,or_lesser][,no_slider][,radians][,degrees][,exp][,suffix:<keyword>] range.
@@ -207,7 +210,7 @@ struct PropertyInfo {
 	}
 };
 
-Array convert_property_list(const List<PropertyInfo> *p_list);
+TypedArray<Dictionary> convert_property_list(const List<PropertyInfo> *p_list);
 
 enum MethodFlags {
 	METHOD_FLAG_NORMAL = 1,
@@ -597,9 +600,9 @@ private:
 	void _add_user_signal(const String &p_name, const Array &p_args = Array());
 	bool _has_user_signal(const StringName &p_name) const;
 	Error _emit_signal(const Variant **p_args, int p_argcount, Callable::CallError &r_error);
-	Array _get_signal_list() const;
-	Array _get_signal_connection_list(const StringName &p_signal) const;
-	Array _get_incoming_connections() const;
+	TypedArray<Dictionary> _get_signal_list() const;
+	TypedArray<Dictionary> _get_signal_connection_list(const StringName &p_signal) const;
+	TypedArray<Dictionary> _get_incoming_connections() const;
 	void _set_bind(const StringName &p_set, const Variant &p_value);
 	Variant _get_bind(const StringName &p_name) const;
 	void _set_indexed_bind(const NodePath &p_name, const Variant &p_value);
@@ -698,8 +701,8 @@ protected:
 	}
 
 	Vector<StringName> _get_meta_list_bind() const;
-	Array _get_property_list_bind() const;
-	Array _get_method_list_bind() const;
+	TypedArray<Dictionary> _get_property_list_bind() const;
+	TypedArray<Dictionary> _get_method_list_bind() const;
 
 	void _clear_internal_resource_paths(const Variant &p_var);
 

+ 7 - 6
core/object/script_language.cpp

@@ -34,6 +34,7 @@
 #include "core/core_string_names.h"
 #include "core/debugger/engine_debugger.h"
 #include "core/debugger/script_debugger.h"
+#include "core/variant/typed_array.h"
 
 #include <stdint.h>
 
@@ -61,8 +62,8 @@ Variant Script::_get_property_default_value(const StringName &p_property) {
 	return ret;
 }
 
-Array Script::_get_script_property_list() {
-	Array ret;
+TypedArray<Dictionary> Script::_get_script_property_list() {
+	TypedArray<Dictionary> ret;
 	List<PropertyInfo> list;
 	get_script_property_list(&list);
 	for (const PropertyInfo &E : list) {
@@ -71,8 +72,8 @@ Array Script::_get_script_property_list() {
 	return ret;
 }
 
-Array Script::_get_script_method_list() {
-	Array ret;
+TypedArray<Dictionary> Script::_get_script_method_list() {
+	TypedArray<Dictionary> ret;
 	List<MethodInfo> list;
 	get_script_method_list(&list);
 	for (const MethodInfo &E : list) {
@@ -81,8 +82,8 @@ Array Script::_get_script_method_list() {
 	return ret;
 }
 
-Array Script::_get_script_signal_list() {
-	Array ret;
+TypedArray<Dictionary> Script::_get_script_signal_list() {
+	TypedArray<Dictionary> ret;
 	List<MethodInfo> list;
 	get_script_signal_list(&list);
 	for (const MethodInfo &E : list) {

+ 5 - 3
core/object/script_language.h

@@ -37,6 +37,8 @@
 #include "core/templates/rb_map.h"
 
 class ScriptLanguage;
+template <typename T>
+class TypedArray;
 
 typedef void (*ScriptEditRequestFunction)(const String &p_path);
 
@@ -108,9 +110,9 @@ protected:
 	virtual void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder) {}
 
 	Variant _get_property_default_value(const StringName &p_property);
-	Array _get_script_property_list();
-	Array _get_script_method_list();
-	Array _get_script_signal_list();
+	TypedArray<Dictionary> _get_script_property_list();
+	TypedArray<Dictionary> _get_script_method_list();
+	TypedArray<Dictionary> _get_script_signal_list();
 	Dictionary _get_script_constant_map();
 
 public:

+ 8 - 8
doc/classes/Geometry2D.xml

@@ -10,7 +10,7 @@
 	</tutorials>
 	<methods>
 		<method name="clip_polygons">
-			<return type="Array" />
+			<return type="PackedVector2Array[]" />
 			<param index="0" name="polygon_a" type="PackedVector2Array" />
 			<param index="1" name="polygon_b" type="PackedVector2Array" />
 			<description>
@@ -19,7 +19,7 @@
 			</description>
 		</method>
 		<method name="clip_polyline_with_polygon">
-			<return type="Array" />
+			<return type="PackedVector2Array[]" />
 			<param index="0" name="polyline" type="PackedVector2Array" />
 			<param index="1" name="polygon" type="PackedVector2Array" />
 			<description>
@@ -34,7 +34,7 @@
 			</description>
 		</method>
 		<method name="exclude_polygons">
-			<return type="Array" />
+			<return type="PackedVector2Array[]" />
 			<param index="0" name="polygon_a" type="PackedVector2Array" />
 			<param index="1" name="polygon_b" type="PackedVector2Array" />
 			<description>
@@ -71,7 +71,7 @@
 			</description>
 		</method>
 		<method name="intersect_polygons">
-			<return type="Array" />
+			<return type="PackedVector2Array[]" />
 			<param index="0" name="polygon_a" type="PackedVector2Array" />
 			<param index="1" name="polygon_b" type="PackedVector2Array" />
 			<description>
@@ -80,7 +80,7 @@
 			</description>
 		</method>
 		<method name="intersect_polyline_with_polygon">
-			<return type="Array" />
+			<return type="PackedVector2Array[]" />
 			<param index="0" name="polyline" type="PackedVector2Array" />
 			<param index="1" name="polygon" type="PackedVector2Array" />
 			<description>
@@ -130,7 +130,7 @@
 			</description>
 		</method>
 		<method name="merge_polygons">
-			<return type="Array" />
+			<return type="PackedVector2Array[]" />
 			<param index="0" name="polygon_a" type="PackedVector2Array" />
 			<param index="1" name="polygon_b" type="PackedVector2Array" />
 			<description>
@@ -139,7 +139,7 @@
 			</description>
 		</method>
 		<method name="offset_polygon">
-			<return type="Array" />
+			<return type="PackedVector2Array[]" />
 			<param index="0" name="polygon" type="PackedVector2Array" />
 			<param index="1" name="delta" type="float" />
 			<param index="2" name="join_type" type="int" enum="Geometry2D.PolyJoinType" default="0" />
@@ -166,7 +166,7 @@
 			</description>
 		</method>
 		<method name="offset_polyline">
-			<return type="Array" />
+			<return type="PackedVector2Array[]" />
 			<param index="0" name="polyline" type="PackedVector2Array" />
 			<param index="1" name="delta" type="float" />
 			<param index="2" name="join_type" type="int" enum="Geometry2D.PolyJoinType" default="0" />

+ 3 - 3
doc/classes/Geometry3D.xml

@@ -10,14 +10,14 @@
 	</tutorials>
 	<methods>
 		<method name="build_box_planes">
-			<return type="Array" />
+			<return type="Plane[]" />
 			<param index="0" name="extents" type="Vector3" />
 			<description>
 				Returns an array with 6 [Plane]s that describe the sides of a box centered at the origin. The box size is defined by [param extents], which represents one (positive) corner of the box (i.e. half its actual size).
 			</description>
 		</method>
 		<method name="build_capsule_planes">
-			<return type="Array" />
+			<return type="Plane[]" />
 			<param index="0" name="radius" type="float" />
 			<param index="1" name="height" type="float" />
 			<param index="2" name="sides" type="int" />
@@ -28,7 +28,7 @@
 			</description>
 		</method>
 		<method name="build_cylinder_planes">
-			<return type="Array" />
+			<return type="Plane[]" />
 			<param index="0" name="radius" type="float" />
 			<param index="1" name="height" type="float" />
 			<param index="2" name="sides" type="int" />

+ 1 - 1
doc/classes/GraphEdit.xml

@@ -149,7 +149,7 @@
 			</description>
 		</method>
 		<method name="get_connection_list" qualifiers="const">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<description>
 				Returns an Array containing the list of connections. A connection consists in a structure of the form [code]{ from_port: 0, from: "GraphNode name 0", to_port: 1, to: "GraphNode name 1" }[/code].
 			</description>

+ 3 - 3
doc/classes/IP.xml

@@ -24,13 +24,13 @@
 			</description>
 		</method>
 		<method name="get_local_addresses" qualifiers="const">
-			<return type="Array" />
+			<return type="PackedStringArray" />
 			<description>
 				Returns all the user's current IPv4 and IPv6 addresses as an array.
 			</description>
 		</method>
 		<method name="get_local_interfaces" qualifiers="const">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<description>
 				Returns all network adapters as an array.
 				Each adapter is a dictionary of the form:
@@ -74,7 +74,7 @@
 			</description>
 		</method>
 		<method name="resolve_hostname_addresses">
-			<return type="Array" />
+			<return type="PackedStringArray" />
 			<param index="0" name="host" type="String" />
 			<param index="1" name="ip_type" type="int" enum="IP.Type" default="3" />
 			<description>

+ 2 - 2
doc/classes/InputMap.xml

@@ -41,7 +41,7 @@
 			</description>
 		</method>
 		<method name="action_get_events">
-			<return type="Array" />
+			<return type="InputEvent[]" />
 			<param index="0" name="action" type="StringName" />
 			<description>
 				Returns an array of [InputEvent]s associated with a given action.
@@ -91,7 +91,7 @@
 			</description>
 		</method>
 		<method name="get_actions">
-			<return type="Array" />
+			<return type="StringName[]" />
 			<description>
 				Returns an array of all actions in the [InputMap].
 			</description>

+ 2 - 2
doc/classes/Mesh.xml

@@ -60,7 +60,7 @@
 			</description>
 		</method>
 		<method name="_surface_get_blend_shape_arrays" qualifiers="virtual const">
-			<return type="Array" />
+			<return type="Array[]" />
 			<param index="0" name="index" type="int" />
 			<description>
 			</description>
@@ -153,7 +153,7 @@
 			</description>
 		</method>
 		<method name="surface_get_blend_shape_arrays" qualifiers="const">
-			<return type="Array" />
+			<return type="Array[]" />
 			<param index="0" name="surf_idx" type="int" />
 			<description>
 				Returns the blend shape arrays for the requested surface.

+ 3 - 3
doc/classes/NavigationServer2D.xml

@@ -128,7 +128,7 @@
 			</description>
 		</method>
 		<method name="get_maps" qualifiers="const">
-			<return type="Array" />
+			<return type="RID[]" />
 			<description>
 				Returns all created navigation map [RID]s on the NavigationServer. This returns both 2D and 3D created navigation maps as there is technically no distinction between them.
 			</description>
@@ -150,7 +150,7 @@
 			</description>
 		</method>
 		<method name="map_get_agents" qualifiers="const">
-			<return type="Array" />
+			<return type="RID[]" />
 			<param index="0" name="map" type="RID" />
 			<description>
 				Returns all navigation agents [RID]s that are currently assigned to the requested navigation [param map].
@@ -198,7 +198,7 @@
 			</description>
 		</method>
 		<method name="map_get_regions" qualifiers="const">
-			<return type="Array" />
+			<return type="RID[]" />
 			<param index="0" name="map" type="RID" />
 			<description>
 				Returns all navigation regions [RID]s that are currently assigned to the requested navigation [param map].

+ 3 - 3
doc/classes/NavigationServer3D.xml

@@ -128,7 +128,7 @@
 			</description>
 		</method>
 		<method name="get_maps" qualifiers="const">
-			<return type="Array" />
+			<return type="RID[]" />
 			<description>
 				Returns all created navigation map [RID]s on the NavigationServer. This returns both 2D and 3D created navigation maps as there is technically no distinction between them.
 			</description>
@@ -150,7 +150,7 @@
 			</description>
 		</method>
 		<method name="map_get_agents" qualifiers="const">
-			<return type="Array" />
+			<return type="RID[]" />
 			<param index="0" name="map" type="RID" />
 			<description>
 				Returns all navigation agents [RID]s that are currently assigned to the requested navigation [param map].
@@ -216,7 +216,7 @@
 			</description>
 		</method>
 		<method name="map_get_regions" qualifiers="const">
-			<return type="Array" />
+			<return type="RID[]" />
 			<param index="0" name="map" type="RID" />
 			<description>
 				Returns all navigation regions [RID]s that are currently assigned to the requested navigation [param map].

+ 1 - 1
doc/classes/Node.xml

@@ -262,7 +262,7 @@
 			</description>
 		</method>
 		<method name="get_groups" qualifiers="const">
-			<return type="Array" />
+			<return type="StringName[]" />
 			<description>
 				Returns an array listing the groups that the node is a member of.
 				[b]Note:[/b] For performance reasons, the order of node groups is [i]not[/i] guaranteed. The order of node groups should not be relied upon as it can vary across project runs.

+ 1 - 1
doc/classes/Node3D.xml

@@ -39,7 +39,7 @@
 			</description>
 		</method>
 		<method name="get_gizmos" qualifiers="const">
-			<return type="Array" />
+			<return type="Node3DGizmo[]" />
 			<description>
 				Returns all the gizmos attached to this [code]Node3D[/code].
 			</description>

+ 6 - 6
doc/classes/Object.xml

@@ -43,7 +43,7 @@
 			</description>
 		</method>
 		<method name="_get_property_list" qualifiers="virtual">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<description>
 				Virtual method which can be overridden to customize the return value of [method get_property_list].
 				Returns the object's property list as an [Array] of dictionaries.
@@ -353,7 +353,7 @@
 			</description>
 		</method>
 		<method name="get_incoming_connections" qualifiers="const">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<description>
 				Returns an [Array] of dictionaries with information about signals that are connected to the object.
 				Each [Dictionary] contains three String entries:
@@ -394,13 +394,13 @@
 			</description>
 		</method>
 		<method name="get_method_list" qualifiers="const">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<description>
 				Returns the object's methods and their signatures as an [Array].
 			</description>
 		</method>
 		<method name="get_property_list" qualifiers="const">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<description>
 				Returns the object's property list as an [Array] of dictionaries.
 				Each property's [Dictionary] contain at least [code]name: String[/code] and [code]type: int[/code] (see [enum Variant.Type]) entries. Optionally, it can also include [code]hint: int[/code] (see [enum PropertyHint]), [code]hint_string: String[/code], and [code]usage: int[/code] (see [enum PropertyUsageFlags]).
@@ -413,14 +413,14 @@
 			</description>
 		</method>
 		<method name="get_signal_connection_list" qualifiers="const">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<param index="0" name="signal" type="StringName" />
 			<description>
 				Returns an [Array] of connections for the given [param signal].
 			</description>
 		</method>
 		<method name="get_signal_list" qualifiers="const">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<description>
 				Returns the list of signals as an [Array] of dictionaries.
 			</description>

+ 1 - 1
doc/classes/Performance.xml

@@ -79,7 +79,7 @@
 			</description>
 		</method>
 		<method name="get_custom_monitor_names">
-			<return type="Array" />
+			<return type="StringName[]" />
 			<description>
 				Returns the names of active custom monitors in an [Array].
 			</description>

+ 4 - 4
doc/classes/PhysicsDirectSpaceState2D.xml

@@ -12,7 +12,7 @@
 	</tutorials>
 	<methods>
 		<method name="cast_motion">
-			<return type="Array" />
+			<return type="PackedFloat32Array" />
 			<param index="0" name="parameters" type="PhysicsShapeQueryParameters2D" />
 			<description>
 				Checks how far a [Shape2D] can move without colliding. All the parameters for the query, including the shape and the motion, are supplied through a [PhysicsShapeQueryParameters2D] object.
@@ -21,7 +21,7 @@
 			</description>
 		</method>
 		<method name="collide_shape">
-			<return type="Array" />
+			<return type="PackedVector2Array[]" />
 			<param index="0" name="parameters" type="PhysicsShapeQueryParameters2D" />
 			<param index="1" name="max_results" type="int" default="32" />
 			<description>
@@ -44,7 +44,7 @@
 			</description>
 		</method>
 		<method name="intersect_point">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<param index="0" name="parameters" type="PhysicsPointQueryParameters2D" />
 			<param index="1" name="max_results" type="int" default="32" />
 			<description>
@@ -72,7 +72,7 @@
 			</description>
 		</method>
 		<method name="intersect_shape">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<param index="0" name="parameters" type="PhysicsShapeQueryParameters2D" />
 			<param index="1" name="max_results" type="int" default="32" />
 			<description>

+ 4 - 4
doc/classes/PhysicsDirectSpaceState3D.xml

@@ -12,7 +12,7 @@
 	</tutorials>
 	<methods>
 		<method name="cast_motion">
-			<return type="Array" />
+			<return type="PackedFloat32Array" />
 			<param index="0" name="parameters" type="PhysicsShapeQueryParameters3D" />
 			<description>
 				Checks how far a [Shape3D] can move without colliding. All the parameters for the query, including the shape, are supplied through a [PhysicsShapeQueryParameters3D] object.
@@ -21,7 +21,7 @@
 			</description>
 		</method>
 		<method name="collide_shape">
-			<return type="Array" />
+			<return type="PackedVector2Array[]" />
 			<param index="0" name="parameters" type="PhysicsShapeQueryParameters3D" />
 			<param index="1" name="max_results" type="int" default="32" />
 			<description>
@@ -46,7 +46,7 @@
 			</description>
 		</method>
 		<method name="intersect_point">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<param index="0" name="parameters" type="PhysicsPointQueryParameters3D" />
 			<param index="1" name="max_results" type="int" default="32" />
 			<description>
@@ -73,7 +73,7 @@
 			</description>
 		</method>
 		<method name="intersect_shape">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<param index="0" name="parameters" type="PhysicsShapeQueryParameters3D" />
 			<param index="1" name="max_results" type="int" default="32" />
 			<description>

+ 1 - 1
doc/classes/RDUniform.xml

@@ -19,7 +19,7 @@
 			</description>
 		</method>
 		<method name="get_ids" qualifiers="const">
-			<return type="Array" />
+			<return type="RID[]" />
 			<description>
 			</description>
 		</method>

+ 1 - 1
doc/classes/RenderingServer.xml

@@ -1959,7 +1959,7 @@
 			</description>
 		</method>
 		<method name="mesh_surface_get_blend_shape_arrays" qualifiers="const">
-			<return type="Array" />
+			<return type="Array[]" />
 			<param index="0" name="mesh" type="RID" />
 			<param index="1" name="surface" type="int" />
 			<description>

+ 1 - 1
doc/classes/RigidDynamicBody3D.xml

@@ -98,7 +98,7 @@
 			</description>
 		</method>
 		<method name="get_colliding_bodies" qualifiers="const">
-			<return type="Array" />
+			<return type="Node3D[]" />
 			<description>
 				Returns a list of the bodies colliding with this one. Requires [member contact_monitor] to be set to [code]true[/code] and [member contacts_reported] to be set high enough to detect all the collisions.
 				[b]Note:[/b] The result of this test is not immediate after moving objects. For performance, list of collisions is updated once per frame and before the physics step. Consider using signals instead.

+ 2 - 2
doc/classes/SceneTree.xml

@@ -113,14 +113,14 @@
 			</description>
 		</method>
 		<method name="get_nodes_in_group">
-			<return type="Array" />
+			<return type="Node[]" />
 			<param index="0" name="group" type="StringName" />
 			<description>
 				Returns a list of all nodes assigned to the given group.
 			</description>
 		</method>
 		<method name="get_processed_tweens">
-			<return type="Array" />
+			<return type="Tween[]" />
 			<description>
 				Returns an array of currently existing [Tween]s in the [SceneTree] (both running and paused).
 			</description>

+ 3 - 3
doc/classes/Script.xml

@@ -44,19 +44,19 @@
 			</description>
 		</method>
 		<method name="get_script_method_list">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<description>
 				Returns the list of methods in this [Script].
 			</description>
 		</method>
 		<method name="get_script_property_list">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<description>
 				Returns the list of properties in this [Script].
 			</description>
 		</method>
 		<method name="get_script_signal_list">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<description>
 				Returns the list of user signals defined in this [Script].
 			</description>

+ 2 - 2
doc/classes/ScriptEditor.xml

@@ -22,13 +22,13 @@
 			</description>
 		</method>
 		<method name="get_open_script_editors" qualifiers="const">
-			<return type="Array" />
+			<return type="ScriptEditorBase[]" />
 			<description>
 				Returns an array with all [ScriptEditorBase] objects which are currently open in editor.
 			</description>
 		</method>
 		<method name="get_open_scripts" qualifiers="const">
-			<return type="Array" />
+			<return type="Script[]" />
 			<description>
 				Returns an array with all [Script] objects which are currently open in editor.
 			</description>

+ 2 - 2
doc/classes/Shape2D.xml

@@ -21,7 +21,7 @@
 			</description>
 		</method>
 		<method name="collide_and_get_contacts">
-			<return type="Array" />
+			<return type="PackedVector2Array" />
 			<param index="0" name="local_xform" type="Transform2D" />
 			<param index="1" name="with_shape" type="Shape2D" />
 			<param index="2" name="shape_xform" type="Transform2D" />
@@ -45,7 +45,7 @@
 			</description>
 		</method>
 		<method name="collide_with_motion_and_get_contacts">
-			<return type="Array" />
+			<return type="PackedVector2Array" />
 			<param index="0" name="local_xform" type="Transform2D" />
 			<param index="1" name="local_motion" type="Vector2" />
 			<param index="2" name="with_shape" type="Shape2D" />

+ 1 - 1
doc/classes/SoftDynamicBody3D.xml

@@ -19,7 +19,7 @@
 			</description>
 		</method>
 		<method name="get_collision_exceptions">
-			<return type="Array" />
+			<return type="PhysicsBody3D[]" />
 			<description>
 				Returns an array of nodes that were added as collision exceptions for this body.
 			</description>

+ 1 - 1
doc/classes/VisualShader.xml

@@ -81,7 +81,7 @@
 			</description>
 		</method>
 		<method name="get_node_connections" qualifiers="const">
-			<return type="Array" />
+			<return type="Dictionary[]" />
 			<param index="0" name="type" type="int" enum="VisualShader.Type" />
 			<description>
 				Returns the list of connected nodes with the specified type.

+ 4 - 4
editor/plugins/script_editor_plugin.cpp

@@ -1156,8 +1156,8 @@ Ref<Script> ScriptEditor::_get_current_script() {
 	}
 }
 
-Array ScriptEditor::_get_open_scripts() const {
-	Array ret;
+TypedArray<Script> ScriptEditor::_get_open_scripts() const {
+	TypedArray<Script> ret;
 	Vector<Ref<Script>> scripts = get_open_scripts();
 	int scrits_amount = scripts.size();
 	for (int idx_script = 0; idx_script < scrits_amount; idx_script++) {
@@ -3446,8 +3446,8 @@ Vector<Ref<Script>> ScriptEditor::get_open_scripts() const {
 	return out_scripts;
 }
 
-Array ScriptEditor::_get_open_script_editors() const {
-	Array script_editors;
+TypedArray<ScriptEditorBase> ScriptEditor::_get_open_script_editors() const {
+	TypedArray<ScriptEditorBase> script_editors;
 	for (int i = 0; i < tab_container->get_tab_count(); i++) {
 		ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_tab_control(i));
 		if (!se) {

+ 2 - 2
editor/plugins/script_editor_plugin.h

@@ -386,7 +386,7 @@ class ScriptEditor : public PanelContainer {
 	Array _get_cached_breakpoints_for_script(const String &p_path) const;
 
 	ScriptEditorBase *_get_current_editor() const;
-	Array _get_open_script_editors() const;
+	TypedArray<ScriptEditorBase> _get_open_script_editors() const;
 
 	Ref<ConfigFile> script_editor_cache;
 	void _save_editor_state(ScriptEditorBase *p_editor);
@@ -452,7 +452,7 @@ class ScriptEditor : public PanelContainer {
 	void _file_dialog_action(String p_file);
 
 	Ref<Script> _get_current_script();
-	Array _get_open_scripts() const;
+	TypedArray<Script> _get_open_scripts() const;
 
 	HashSet<String> textfile_extensions;
 	Ref<TextFile> _load_text_file(const String &p_path, Error *r_error) const;

+ 4 - 3
main/performance.cpp

@@ -32,6 +32,7 @@
 
 #include "core/object/message_queue.h"
 #include "core/os/os.h"
+#include "core/variant/typed_array.h"
 #include "scene/main/node.h"
 #include "scene/main/scene_tree.h"
 #include "servers/audio_server.h"
@@ -240,11 +241,11 @@ Variant Performance::get_custom_monitor(const StringName &p_id) {
 	return return_value;
 }
 
-Array Performance::get_custom_monitor_names() {
+TypedArray<StringName> Performance::get_custom_monitor_names() {
 	if (!_monitor_map.size()) {
-		return Array();
+		return TypedArray<StringName>();
 	}
-	Array return_array;
+	TypedArray<StringName> return_array;
 	return_array.resize(_monitor_map.size());
 	int index = 0;
 	for (KeyValue<StringName, MonitorCall> i : _monitor_map) {

+ 4 - 1
main/performance.h

@@ -37,6 +37,9 @@
 #define PERF_WARN_OFFLINE_FUNCTION
 #define PERF_WARN_PROCESS_SYNC
 
+template <typename T>
+class TypedArray;
+
 class Performance : public Object {
 	GDCLASS(Performance, Object);
 
@@ -107,7 +110,7 @@ public:
 	void remove_custom_monitor(const StringName &p_id);
 	bool has_custom_monitor(const StringName &p_id);
 	Variant get_custom_monitor(const StringName &p_id);
-	Array get_custom_monitor_names();
+	TypedArray<StringName> get_custom_monitor_names();
 
 	uint64_t get_monitor_modification_time();
 

+ 2 - 2
modules/gridmap/doc_classes/GridMap.xml

@@ -102,13 +102,13 @@
 			</description>
 		</method>
 		<method name="get_used_cells" qualifiers="const">
-			<return type="Array" />
+			<return type="Vector3i[]" />
 			<description>
 				Returns an array of [Vector3] with the non-empty cell coordinates in the grid map.
 			</description>
 		</method>
 		<method name="get_used_cells_by_item" qualifiers="const">
-			<return type="Array" />
+			<return type="Vector3i[]" />
 			<param index="0" name="item" type="int" />
 			<description>
 				Returns an array of all cells with the given item index specified in [code]item[/code].

+ 6 - 6
modules/gridmap/grid_map.cpp

@@ -1049,23 +1049,23 @@ float GridMap::get_cell_scale() const {
 	return cell_scale;
 }
 
-Array GridMap::get_used_cells() const {
-	Array a;
+TypedArray<Vector3i> GridMap::get_used_cells() const {
+	TypedArray<Vector3i> a;
 	a.resize(cell_map.size());
 	int i = 0;
 	for (const KeyValue<IndexKey, Cell> &E : cell_map) {
-		Vector3 p(E.key.x, E.key.y, E.key.z);
+		Vector3i p(E.key.x, E.key.y, E.key.z);
 		a[i++] = p;
 	}
 
 	return a;
 }
 
-Array GridMap::get_used_cells_by_item(int p_item) const {
-	Array a;
+TypedArray<Vector3i> GridMap::get_used_cells_by_item(int p_item) const {
+	TypedArray<Vector3i> a;
 	for (const KeyValue<IndexKey, Cell> &E : cell_map) {
 		if (E.value.item == p_item) {
-			Vector3 p(E.key.x, E.key.y, E.key.z);
+			Vector3i p(E.key.x, E.key.y, E.key.z);
 			a.push_back(p);
 		}
 	}

+ 2 - 2
modules/gridmap/grid_map.h

@@ -273,8 +273,8 @@ public:
 	void set_cell_scale(float p_scale);
 	float get_cell_scale() const;
 
-	Array get_used_cells() const;
-	Array get_used_cells_by_item(int p_item) const;
+	TypedArray<Vector3i> get_used_cells() const;
+	TypedArray<Vector3i> get_used_cells_by_item(int p_item) const;
 
 	Array get_meshes() const;
 

+ 6 - 6
modules/navigation/godot_navigation_server.cpp

@@ -123,8 +123,8 @@ void GodotNavigationServer::add_command(SetCommand *command) const {
 	}
 }
 
-Array GodotNavigationServer::get_maps() const {
-	Array all_map_rids;
+TypedArray<RID> GodotNavigationServer::get_maps() const {
+	TypedArray<RID> all_map_rids;
 	List<RID> maps_owned;
 	map_owner.get_owned_list(&maps_owned);
 	if (maps_owned.size()) {
@@ -245,8 +245,8 @@ RID GodotNavigationServer::map_get_closest_point_owner(RID p_map, const Vector3
 	return map->get_closest_point_owner(p_point);
 }
 
-Array GodotNavigationServer::map_get_regions(RID p_map) const {
-	Array regions_rids;
+TypedArray<RID> GodotNavigationServer::map_get_regions(RID p_map) const {
+	TypedArray<RID> regions_rids;
 	const NavMap *map = map_owner.get_or_null(p_map);
 	ERR_FAIL_COND_V(map == nullptr, regions_rids);
 	const LocalVector<NavRegion *> regions = map->get_regions();
@@ -257,8 +257,8 @@ Array GodotNavigationServer::map_get_regions(RID p_map) const {
 	return regions_rids;
 }
 
-Array GodotNavigationServer::map_get_agents(RID p_map) const {
-	Array agents_rids;
+TypedArray<RID> GodotNavigationServer::map_get_agents(RID p_map) const {
+	TypedArray<RID> agents_rids;
 	const NavMap *map = map_owner.get_or_null(p_map);
 	ERR_FAIL_COND_V(map == nullptr, agents_rids);
 	const LocalVector<RvoAgent *> agents = map->get_agents();

+ 3 - 3
modules/navigation/godot_navigation_server.h

@@ -85,7 +85,7 @@ public:
 
 	void add_command(SetCommand *command) const;
 
-	virtual Array get_maps() const override;
+	virtual TypedArray<RID> get_maps() const override;
 
 	virtual RID map_create() const override;
 	COMMAND_2(map_set_active, RID, p_map, bool, p_active);
@@ -107,8 +107,8 @@ public:
 	virtual Vector3 map_get_closest_point_normal(RID p_map, const Vector3 &p_point) const override;
 	virtual RID map_get_closest_point_owner(RID p_map, const Vector3 &p_point) const override;
 
-	virtual Array map_get_regions(RID p_map) const override;
-	virtual Array map_get_agents(RID p_map) const override;
+	virtual TypedArray<RID> map_get_regions(RID p_map) const override;
+	virtual TypedArray<RID> map_get_agents(RID p_map) const override;
 
 	virtual void map_force_update(RID p_map) override;
 

+ 1 - 1
scene/2d/physics_body_2d.cpp

@@ -849,7 +849,7 @@ RigidDynamicBody2D::CCDMode RigidDynamicBody2D::get_continuous_collision_detecti
 }
 
 TypedArray<Node2D> RigidDynamicBody2D::get_colliding_bodies() const {
-	ERR_FAIL_COND_V(!contact_monitor, Array());
+	ERR_FAIL_COND_V(!contact_monitor, TypedArray<Node2D>());
 
 	TypedArray<Node2D> ret;
 	ret.resize(contact_monitor->body_map.size());

+ 2 - 2
scene/3d/node_3d.cpp

@@ -561,8 +561,8 @@ void Node3D::clear_gizmos() {
 #endif
 }
 
-Array Node3D::get_gizmos_bind() const {
-	Array ret;
+TypedArray<Node3DGizmo> Node3D::get_gizmos_bind() const {
+	TypedArray<Node3DGizmo> ret;
 
 #ifdef TOOLS_ENABLED
 	for (int i = 0; i < data.gizmos.size(); i++) {

+ 1 - 1
scene/3d/node_3d.h

@@ -216,7 +216,7 @@ public:
 	void set_subgizmo_selection(Ref<Node3DGizmo> p_gizmo, int p_id, Transform3D p_transform = Transform3D());
 	void clear_subgizmo_selection();
 	Vector<Ref<Node3DGizmo>> get_gizmos() const;
-	Array get_gizmos_bind() const;
+	TypedArray<Node3DGizmo> get_gizmos_bind() const;
 	void add_gizmo(Ref<Node3DGizmo> p_gizmo);
 	void remove_gizmo(Ref<Node3DGizmo> p_gizmo);
 	void clear_gizmos();

+ 3 - 3
scene/3d/physics_body_3d.cpp

@@ -960,10 +960,10 @@ bool RigidDynamicBody3D::is_contact_monitor_enabled() const {
 	return contact_monitor != nullptr;
 }
 
-Array RigidDynamicBody3D::get_colliding_bodies() const {
-	ERR_FAIL_COND_V(!contact_monitor, Array());
+TypedArray<Node3D> RigidDynamicBody3D::get_colliding_bodies() const {
+	ERR_FAIL_COND_V(!contact_monitor, TypedArray<Node3D>());
 
-	Array ret;
+	TypedArray<Node3D> ret;
 	ret.resize(contact_monitor->body_map.size());
 	int idx = 0;
 	for (const KeyValue<ObjectID, BodyState> &E : contact_monitor->body_map) {

+ 1 - 1
scene/3d/physics_body_3d.h

@@ -304,7 +304,7 @@ public:
 	void set_use_continuous_collision_detection(bool p_enable);
 	bool is_using_continuous_collision_detection() const;
 
-	Array get_colliding_bodies() const;
+	TypedArray<Node3D> get_colliding_bodies() const;
 
 	void apply_central_impulse(const Vector3 &p_impulse);
 	void apply_impulse(const Vector3 &p_impulse, const Vector3 &p_position = Vector3());

+ 2 - 2
scene/3d/soft_dynamic_body_3d.cpp

@@ -591,10 +591,10 @@ Vector<SoftDynamicBody3D::PinnedPoint> SoftDynamicBody3D::get_pinned_points_indi
 	return pinned_points;
 }
 
-Array SoftDynamicBody3D::get_collision_exceptions() {
+TypedArray<PhysicsBody3D> SoftDynamicBody3D::get_collision_exceptions() {
 	List<RID> exceptions;
 	PhysicsServer3D::get_singleton()->soft_body_get_collision_exceptions(physics_rid, &exceptions);
-	Array ret;
+	TypedArray<PhysicsBody3D> ret;
 	for (const RID &body : exceptions) {
 		ObjectID instance_id = PhysicsServer3D::get_singleton()->body_get_object_instance_id(body);
 		Object *obj = ObjectDB::get_instance(instance_id);

+ 2 - 1
scene/3d/soft_dynamic_body_3d.h

@@ -34,6 +34,7 @@
 #include "scene/3d/mesh_instance_3d.h"
 #include "servers/physics_server_3d.h"
 
+class PhysicsBody3D;
 class SoftDynamicBody3D;
 
 class SoftDynamicBodyRenderingServerHandler : public PhysicsServer3DRenderingServerHandler {
@@ -168,7 +169,7 @@ public:
 	void set_drag_coefficient(real_t p_drag_coefficient);
 	real_t get_drag_coefficient();
 
-	Array get_collision_exceptions();
+	TypedArray<PhysicsBody3D> get_collision_exceptions();
 	void add_collision_exception_with(Node *p_node);
 	void remove_collision_exception_with(Node *p_node);
 

+ 2 - 2
scene/gui/graph_edit.cpp

@@ -1591,10 +1591,10 @@ void GraphEdit::remove_valid_left_disconnect_type(int p_type) {
 	valid_left_disconnect_types.erase(p_type);
 }
 
-Array GraphEdit::_get_connection_list() const {
+TypedArray<Dictionary> GraphEdit::_get_connection_list() const {
 	List<Connection> conns;
 	get_connection_list(&conns);
-	Array arr;
+	TypedArray<Dictionary> arr;
 	for (const Connection &E : conns) {
 		Dictionary d;
 		d["from"] = E.from;

+ 1 - 1
scene/gui/graph_edit.h

@@ -206,7 +206,7 @@ private:
 	void _minimap_draw();
 	void _update_scroll_offset();
 
-	Array _get_connection_list() const;
+	TypedArray<Dictionary> _get_connection_list() const;
 
 	bool lines_on_bg = false;
 

+ 2 - 2
scene/main/node.cpp

@@ -1778,8 +1778,8 @@ void Node::remove_from_group(const StringName &p_identifier) {
 	data.grouped.remove(E);
 }
 
-Array Node::_get_groups() const {
-	Array groups;
+TypedArray<StringName> Node::_get_groups() const {
+	TypedArray<StringName> groups;
 	List<GroupInfo> gi;
 	get_groups(&gi);
 	for (const GroupInfo &E : gi) {

+ 1 - 1
scene/main/node.h

@@ -181,7 +181,7 @@ private:
 	Node *_duplicate(int p_flags, HashMap<const Node *, Node *> *r_duplimap = nullptr) const;
 
 	TypedArray<Node> _get_children(bool p_include_internal = true) const;
-	Array _get_groups() const;
+	TypedArray<StringName> _get_groups() const;
 
 	Error _rpc_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error);
 	Error _rpc_id_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error);

+ 4 - 4
scene/main/scene_tree.cpp

@@ -1000,8 +1000,8 @@ int64_t SceneTree::get_frame() const {
 	return current_frame;
 }
 
-Array SceneTree::_get_nodes_in_group(const StringName &p_group) {
-	Array ret;
+TypedArray<Node> SceneTree::_get_nodes_in_group(const StringName &p_group) {
+	TypedArray<Node> ret;
 	HashMap<StringName, Group>::Iterator E = group_map.find(p_group);
 	if (!E) {
 		return ret;
@@ -1171,8 +1171,8 @@ Ref<Tween> SceneTree::create_tween() {
 	return tween;
 }
 
-Array SceneTree::get_processed_tweens() {
-	Array ret;
+TypedArray<Tween> SceneTree::get_processed_tweens() {
+	TypedArray<Tween> ret;
 	ret.resize(tweens.size());
 
 	int i = 0;

+ 2 - 2
scene/main/scene_tree.h

@@ -141,7 +141,7 @@ private:
 
 	_FORCE_INLINE_ void _update_group_order(Group &g, bool p_use_priority = false);
 
-	Array _get_nodes_in_group(const StringName &p_group);
+	TypedArray<Node> _get_nodes_in_group(const StringName &p_group);
 
 	Node *current_scene = nullptr;
 
@@ -367,7 +367,7 @@ public:
 
 	Ref<SceneTreeTimer> create_timer(double p_delay_sec, bool p_process_always = true);
 	Ref<Tween> create_tween();
-	Array get_processed_tweens();
+	TypedArray<Tween> get_processed_tweens();
 
 	//used by Main::start, don't use otherwise
 	void add_current_scene(Node *p_current);

+ 2 - 2
scene/resources/immediate_mesh.cpp

@@ -340,8 +340,8 @@ Array ImmediateMesh::surface_get_arrays(int p_surface) const {
 	ERR_FAIL_INDEX_V(p_surface, int(surfaces.size()), Array());
 	return RS::get_singleton()->mesh_surface_get_arrays(mesh, p_surface);
 }
-Array ImmediateMesh::surface_get_blend_shape_arrays(int p_surface) const {
-	return Array();
+TypedArray<Array> ImmediateMesh::surface_get_blend_shape_arrays(int p_surface) const {
+	return TypedArray<Array>();
 }
 Dictionary ImmediateMesh::surface_get_lods(int p_surface) const {
 	return Dictionary();

+ 1 - 1
scene/resources/immediate_mesh.h

@@ -97,7 +97,7 @@ public:
 	virtual int surface_get_array_len(int p_idx) const override;
 	virtual int surface_get_array_index_len(int p_idx) const override;
 	virtual Array surface_get_arrays(int p_surface) const override;
-	virtual Array surface_get_blend_shape_arrays(int p_surface) const override;
+	virtual TypedArray<Array> surface_get_blend_shape_arrays(int p_surface) const override;
 	virtual Dictionary surface_get_lods(int p_surface) const override;
 	virtual uint32_t surface_get_format(int p_idx) const override;
 	virtual PrimitiveType surface_get_primitive_type(int p_idx) const override;

+ 5 - 5
scene/resources/mesh.cpp

@@ -71,13 +71,13 @@ Array Mesh::surface_get_arrays(int p_surface) const {
 	return Array();
 }
 
-Array Mesh::surface_get_blend_shape_arrays(int p_surface) const {
-	Array ret;
+TypedArray<Array> Mesh::surface_get_blend_shape_arrays(int p_surface) const {
+	TypedArray<Array> ret;
 	if (GDVIRTUAL_REQUIRED_CALL(_surface_get_blend_shape_arrays, p_surface, ret)) {
 		return ret;
 	}
 
-	return Array();
+	return TypedArray<Array>();
 }
 
 Dictionary Mesh::surface_get_lods(int p_surface) const {
@@ -1640,8 +1640,8 @@ Array ArrayMesh::surface_get_arrays(int p_surface) const {
 	return RenderingServer::get_singleton()->mesh_surface_get_arrays(mesh, p_surface);
 }
 
-Array ArrayMesh::surface_get_blend_shape_arrays(int p_surface) const {
-	ERR_FAIL_INDEX_V(p_surface, surfaces.size(), Array());
+TypedArray<Array> ArrayMesh::surface_get_blend_shape_arrays(int p_surface) const {
+	ERR_FAIL_INDEX_V(p_surface, surfaces.size(), TypedArray<Array>());
 	return RenderingServer::get_singleton()->mesh_surface_get_blend_shape_arrays(mesh, p_surface);
 }
 

+ 4 - 4
scene/resources/mesh.h

@@ -63,7 +63,7 @@ protected:
 	GDVIRTUAL1RC(int, _surface_get_array_len, int)
 	GDVIRTUAL1RC(int, _surface_get_array_index_len, int)
 	GDVIRTUAL1RC(Array, _surface_get_arrays, int)
-	GDVIRTUAL1RC(Array, _surface_get_blend_shape_arrays, int)
+	GDVIRTUAL1RC(TypedArray<Array>, _surface_get_blend_shape_arrays, int)
 	GDVIRTUAL1RC(Dictionary, _surface_get_lods, int)
 	GDVIRTUAL1RC(uint32_t, _surface_get_format, int)
 	GDVIRTUAL1RC(uint32_t, _surface_get_primitive_type, int)
@@ -151,7 +151,7 @@ public:
 	virtual int surface_get_array_len(int p_idx) const;
 	virtual int surface_get_array_index_len(int p_idx) const;
 	virtual Array surface_get_arrays(int p_surface) const;
-	virtual Array surface_get_blend_shape_arrays(int p_surface) const;
+	virtual TypedArray<Array> surface_get_blend_shape_arrays(int p_surface) const;
 	virtual Dictionary surface_get_lods(int p_surface) const;
 	virtual uint32_t surface_get_format(int p_idx) const;
 	virtual PrimitiveType surface_get_primitive_type(int p_idx) const;
@@ -270,7 +270,7 @@ public:
 	void add_surface(uint32_t p_format, PrimitiveType p_primitive, const Vector<uint8_t> &p_array, const Vector<uint8_t> &p_attribute_array, const Vector<uint8_t> &p_skin_array, int p_vertex_count, const Vector<uint8_t> &p_index_array, int p_index_count, const AABB &p_aabb, const Vector<uint8_t> &p_blend_shape_data = Vector<uint8_t>(), const Vector<AABB> &p_bone_aabbs = Vector<AABB>(), const Vector<RS::SurfaceData::LOD> &p_lods = Vector<RS::SurfaceData::LOD>());
 
 	Array surface_get_arrays(int p_surface) const override;
-	Array surface_get_blend_shape_arrays(int p_surface) const override;
+	TypedArray<Array> surface_get_blend_shape_arrays(int p_surface) const override;
 	Dictionary surface_get_lods(int p_surface) const override;
 
 	void add_blend_shape(const StringName &p_name);
@@ -345,7 +345,7 @@ public:
 	virtual int surface_get_array_len(int p_idx) const override { return 0; }
 	virtual int surface_get_array_index_len(int p_idx) const override { return 0; }
 	virtual Array surface_get_arrays(int p_surface) const override { return Array(); }
-	virtual Array surface_get_blend_shape_arrays(int p_surface) const override { return Array(); }
+	virtual TypedArray<Array> surface_get_blend_shape_arrays(int p_surface) const override { return TypedArray<Array>(); }
 	virtual Dictionary surface_get_lods(int p_surface) const override { return Dictionary(); }
 	virtual uint32_t surface_get_format(int p_idx) const override { return 0; }
 	virtual PrimitiveType surface_get_primitive_type(int p_idx) const override { return PRIMITIVE_TRIANGLES; }

+ 2 - 2
scene/resources/primitive_meshes.cpp

@@ -152,8 +152,8 @@ Dictionary PrimitiveMesh::surface_get_lods(int p_surface) const {
 	return Dictionary(); //not really supported
 }
 
-Array PrimitiveMesh::surface_get_blend_shape_arrays(int p_surface) const {
-	return Array(); //not really supported
+TypedArray<Array> PrimitiveMesh::surface_get_blend_shape_arrays(int p_surface) const {
+	return TypedArray<Array>(); //not really supported
 }
 
 uint32_t PrimitiveMesh::surface_get_format(int p_idx) const {

+ 1 - 1
scene/resources/primitive_meshes.h

@@ -75,7 +75,7 @@ public:
 	virtual int surface_get_array_len(int p_idx) const override;
 	virtual int surface_get_array_index_len(int p_idx) const override;
 	virtual Array surface_get_arrays(int p_surface) const override;
-	virtual Array surface_get_blend_shape_arrays(int p_surface) const override;
+	virtual TypedArray<Array> surface_get_blend_shape_arrays(int p_surface) const override;
 	virtual Dictionary surface_get_lods(int p_surface) const override;
 	virtual uint32_t surface_get_format(int p_idx) const override;
 	virtual Mesh::PrimitiveType surface_get_primitive_type(int p_idx) const override;

+ 10 - 10
scene/resources/shape_2d.cpp

@@ -59,39 +59,39 @@ bool Shape2D::collide(const Transform2D &p_local_xform, const Ref<Shape2D> &p_sh
 	return PhysicsServer2D::get_singleton()->shape_collide(get_rid(), p_local_xform, Vector2(), p_shape->get_rid(), p_shape_xform, Vector2(), nullptr, 0, r);
 }
 
-Array Shape2D::collide_with_motion_and_get_contacts(const Transform2D &p_local_xform, const Vector2 &p_local_motion, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform, const Vector2 &p_shape_motion) {
-	ERR_FAIL_COND_V(p_shape.is_null(), Array());
+PackedVector2Array Shape2D::collide_with_motion_and_get_contacts(const Transform2D &p_local_xform, const Vector2 &p_local_motion, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform, const Vector2 &p_shape_motion) {
+	ERR_FAIL_COND_V(p_shape.is_null(), PackedVector2Array());
 	const int max_contacts = 16;
 	Vector2 result[max_contacts * 2];
 	int contacts = 0;
 
 	if (!PhysicsServer2D::get_singleton()->shape_collide(get_rid(), p_local_xform, p_local_motion, p_shape->get_rid(), p_shape_xform, p_shape_motion, result, max_contacts, contacts)) {
-		return Array();
+		return PackedVector2Array();
 	}
 
-	Array results;
+	PackedVector2Array results;
 	results.resize(contacts * 2);
 	for (int i = 0; i < contacts * 2; i++) {
-		results[i] = result[i];
+		results.write[i] = result[i];
 	}
 
 	return results;
 }
 
-Array Shape2D::collide_and_get_contacts(const Transform2D &p_local_xform, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform) {
-	ERR_FAIL_COND_V(p_shape.is_null(), Array());
+PackedVector2Array Shape2D::collide_and_get_contacts(const Transform2D &p_local_xform, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform) {
+	ERR_FAIL_COND_V(p_shape.is_null(), PackedVector2Array());
 	const int max_contacts = 16;
 	Vector2 result[max_contacts * 2];
 	int contacts = 0;
 
 	if (!PhysicsServer2D::get_singleton()->shape_collide(get_rid(), p_local_xform, Vector2(), p_shape->get_rid(), p_shape_xform, Vector2(), result, max_contacts, contacts)) {
-		return Array();
+		return PackedVector2Array();
 	}
 
-	Array results;
+	PackedVector2Array results;
 	results.resize(contacts * 2);
 	for (int i = 0; i < contacts * 2; i++) {
-		results[i] = result[i];
+		results.write[i] = result[i];
 	}
 
 	return results;

+ 2 - 2
scene/resources/shape_2d.h

@@ -53,8 +53,8 @@ public:
 	bool collide_with_motion(const Transform2D &p_local_xform, const Vector2 &p_local_motion, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform, const Vector2 &p_shape_motion);
 	bool collide(const Transform2D &p_local_xform, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform);
 
-	Array collide_with_motion_and_get_contacts(const Transform2D &p_local_xform, const Vector2 &p_local_motion, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform, const Vector2 &p_shape_motion);
-	Array collide_and_get_contacts(const Transform2D &p_local_xform, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform);
+	PackedVector2Array collide_with_motion_and_get_contacts(const Transform2D &p_local_xform, const Vector2 &p_local_motion, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform, const Vector2 &p_shape_motion);
+	PackedVector2Array collide_and_get_contacts(const Transform2D &p_local_xform, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform);
 
 	virtual void draw(const RID &p_to_rid, const Color &p_color) {}
 	virtual Rect2 get_rect() const { return Rect2(); }

+ 2 - 2
scene/resources/visual_shader.cpp

@@ -1036,11 +1036,11 @@ void VisualShader::disconnect_nodes(Type p_type, int p_from_node, int p_from_por
 	}
 }
 
-Array VisualShader::_get_node_connections(Type p_type) const {
+TypedArray<Dictionary> VisualShader::_get_node_connections(Type p_type) const {
 	ERR_FAIL_INDEX_V(p_type, TYPE_MAX, Array());
 	const Graph *g = &graph[p_type];
 
-	Array ret;
+	TypedArray<Dictionary> ret;
 	for (const Connection &E : g->connections) {
 		Dictionary d;
 		d["from_node"] = E.from_node;

+ 1 - 1
scene/resources/visual_shader.h

@@ -132,7 +132,7 @@ private:
 	Shader::Mode shader_mode = Shader::MODE_SPATIAL;
 	mutable String previous_code;
 
-	Array _get_node_connections(Type p_type) const;
+	TypedArray<Dictionary> _get_node_connections(Type p_type) const;
 
 	Vector2 graph_offset;
 

+ 3 - 3
servers/navigation_server_2d.cpp

@@ -263,11 +263,11 @@ NavigationServer2D::~NavigationServer2D() {
 	singleton = nullptr;
 }
 
-Array FORWARD_0_C(get_maps);
+TypedArray<RID> FORWARD_0_C(get_maps);
 
-Array FORWARD_1_C(map_get_regions, RID, p_map, rid_to_rid);
+TypedArray<RID> FORWARD_1_C(map_get_regions, RID, p_map, rid_to_rid);
 
-Array FORWARD_1_C(map_get_agents, RID, p_map, rid_to_rid);
+TypedArray<RID> FORWARD_1_C(map_get_agents, RID, p_map, rid_to_rid);
 
 RID FORWARD_1_C(region_get_map, RID, p_region, rid_to_rid);
 

+ 3 - 3
servers/navigation_server_2d.h

@@ -53,7 +53,7 @@ public:
 	/// MUST be used in single thread!
 	static NavigationServer2D *get_singleton_mut() { return singleton; }
 
-	virtual Array get_maps() const;
+	virtual TypedArray<RID> get_maps() const;
 
 	/// Create a new map.
 	virtual RID map_create() const;
@@ -82,8 +82,8 @@ public:
 	virtual Vector2 map_get_closest_point(RID p_map, const Vector2 &p_point) const;
 	virtual RID map_get_closest_point_owner(RID p_map, const Vector2 &p_point) const;
 
-	virtual Array map_get_regions(RID p_map) const;
-	virtual Array map_get_agents(RID p_map) const;
+	virtual TypedArray<RID> map_get_regions(RID p_map) const;
+	virtual TypedArray<RID> map_get_agents(RID p_map) const;
 
 	virtual void map_force_update(RID p_map);
 

+ 3 - 3
servers/navigation_server_3d.h

@@ -56,7 +56,7 @@ public:
 	/// MUST be used in single thread!
 	static NavigationServer3D *get_singleton_mut();
 
-	virtual Array get_maps() const = 0;
+	virtual TypedArray<RID> get_maps() const = 0;
 
 	/// Create a new map.
 	virtual RID map_create() const = 0;
@@ -93,8 +93,8 @@ public:
 	virtual Vector3 map_get_closest_point_normal(RID p_map, const Vector3 &p_point) const = 0;
 	virtual RID map_get_closest_point_owner(RID p_map, const Vector3 &p_point) const = 0;
 
-	virtual Array map_get_regions(RID p_map) const = 0;
-	virtual Array map_get_agents(RID p_map) const = 0;
+	virtual TypedArray<RID> map_get_regions(RID p_map) const = 0;
+	virtual TypedArray<RID> map_get_agents(RID p_map) const = 0;
 
 	virtual void map_force_update(RID p_map) = 0;
 

+ 16 - 15
servers/physics_server_2d.cpp

@@ -32,6 +32,7 @@
 
 #include "core/config/project_settings.h"
 #include "core/string/print_string.h"
+#include "core/variant/typed_array.h"
 
 PhysicsServer2D *PhysicsServer2D::singleton = nullptr;
 
@@ -347,7 +348,7 @@ Dictionary PhysicsDirectSpaceState2D::_intersect_ray(const Ref<PhysicsRayQueryPa
 	return d;
 }
 
-Array PhysicsDirectSpaceState2D::_intersect_point(const Ref<PhysicsPointQueryParameters2D> &p_point_query, int p_max_results) {
+TypedArray<Dictionary> PhysicsDirectSpaceState2D::_intersect_point(const Ref<PhysicsPointQueryParameters2D> &p_point_query, int p_max_results) {
 	ERR_FAIL_COND_V(p_point_query.is_null(), Array());
 
 	Vector<ShapeResult> ret;
@@ -356,10 +357,10 @@ Array PhysicsDirectSpaceState2D::_intersect_point(const Ref<PhysicsPointQueryPar
 	int rc = intersect_point(p_point_query->get_parameters(), ret.ptrw(), ret.size());
 
 	if (rc == 0) {
-		return Array();
+		return TypedArray<Dictionary>();
 	}
 
-	Array r;
+	TypedArray<Dictionary> r;
 	r.resize(rc);
 	for (int i = 0; i < rc; i++) {
 		Dictionary d;
@@ -372,13 +373,13 @@ Array PhysicsDirectSpaceState2D::_intersect_point(const Ref<PhysicsPointQueryPar
 	return r;
 }
 
-Array PhysicsDirectSpaceState2D::_intersect_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results) {
-	ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
+TypedArray<Dictionary> PhysicsDirectSpaceState2D::_intersect_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results) {
+	ERR_FAIL_COND_V(!p_shape_query.is_valid(), TypedArray<Dictionary>());
 
 	Vector<ShapeResult> sr;
 	sr.resize(p_max_results);
 	int rc = intersect_shape(p_shape_query->get_parameters(), sr.ptrw(), sr.size());
-	Array ret;
+	TypedArray<Dictionary> ret;
 	ret.resize(rc);
 	for (int i = 0; i < rc; i++) {
 		Dictionary d;
@@ -392,22 +393,22 @@ Array PhysicsDirectSpaceState2D::_intersect_shape(const Ref<PhysicsShapeQueryPar
 	return ret;
 }
 
-Array PhysicsDirectSpaceState2D::_cast_motion(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query) {
-	ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
+Vector<real_t> PhysicsDirectSpaceState2D::_cast_motion(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query) {
+	ERR_FAIL_COND_V(!p_shape_query.is_valid(), Vector<real_t>());
 
 	real_t closest_safe, closest_unsafe;
 	bool res = cast_motion(p_shape_query->get_parameters(), closest_safe, closest_unsafe);
 	if (!res) {
-		return Array();
+		return Vector<real_t>();
 	}
-	Array ret;
+	Vector<real_t> ret;
 	ret.resize(2);
-	ret[0] = closest_safe;
-	ret[1] = closest_unsafe;
+	ret.write[0] = closest_safe;
+	ret.write[1] = closest_unsafe;
 	return ret;
 }
 
-Array PhysicsDirectSpaceState2D::_collide_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results) {
+TypedArray<PackedVector2Array> PhysicsDirectSpaceState2D::_collide_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results) {
 	ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
 
 	Vector<Vector2> ret;
@@ -415,9 +416,9 @@ Array PhysicsDirectSpaceState2D::_collide_shape(const Ref<PhysicsShapeQueryParam
 	int rc = 0;
 	bool res = collide_shape(p_shape_query->get_parameters(), ret.ptrw(), p_max_results, rc);
 	if (!res) {
-		return Array();
+		return TypedArray<PackedVector2Array>();
 	}
-	Array r;
+	TypedArray<PackedVector2Array> r;
 	r.resize(rc * 2);
 	for (int i = 0; i < rc * 2; i++) {
 		r[i] = ret[i];

+ 6 - 4
servers/physics_server_2d.h

@@ -36,6 +36,8 @@
 #include "core/object/ref_counted.h"
 
 class PhysicsDirectSpaceState2D;
+template <typename T>
+class TypedArray;
 
 class PhysicsDirectBodyState2D : public Object {
 	GDCLASS(PhysicsDirectBodyState2D, Object);
@@ -114,10 +116,10 @@ class PhysicsDirectSpaceState2D : public Object {
 	GDCLASS(PhysicsDirectSpaceState2D, Object);
 
 	Dictionary _intersect_ray(const Ref<PhysicsRayQueryParameters2D> &p_ray_query);
-	Array _intersect_point(const Ref<PhysicsPointQueryParameters2D> &p_point_query, int p_max_results = 32);
-	Array _intersect_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results = 32);
-	Array _cast_motion(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query);
-	Array _collide_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results = 32);
+	TypedArray<Dictionary> _intersect_point(const Ref<PhysicsPointQueryParameters2D> &p_point_query, int p_max_results = 32);
+	TypedArray<Dictionary> _intersect_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results = 32);
+	Vector<real_t> _cast_motion(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query);
+	TypedArray<PackedVector2Array> _collide_shape(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query, int p_max_results = 32);
 	Dictionary _get_rest_info(const Ref<PhysicsShapeQueryParameters2D> &p_shape_query);
 
 protected:

+ 17 - 16
servers/physics_server_3d.cpp

@@ -32,6 +32,7 @@
 
 #include "core/config/project_settings.h"
 #include "core/string/print_string.h"
+#include "core/variant/typed_array.h"
 
 void PhysicsServer3DRenderingServerHandler::set_vertex(int p_vertex_id, const void *p_vector3) {
 	GDVIRTUAL_REQUIRED_CALL(_set_vertex, p_vertex_id, p_vector3);
@@ -366,8 +367,8 @@ Dictionary PhysicsDirectSpaceState3D::_intersect_ray(const Ref<PhysicsRayQueryPa
 	return d;
 }
 
-Array PhysicsDirectSpaceState3D::_intersect_point(const Ref<PhysicsPointQueryParameters3D> &p_point_query, int p_max_results) {
-	ERR_FAIL_COND_V(p_point_query.is_null(), Array());
+TypedArray<Dictionary> PhysicsDirectSpaceState3D::_intersect_point(const Ref<PhysicsPointQueryParameters3D> &p_point_query, int p_max_results) {
+	ERR_FAIL_COND_V(p_point_query.is_null(), TypedArray<Dictionary>());
 
 	Vector<ShapeResult> ret;
 	ret.resize(p_max_results);
@@ -375,10 +376,10 @@ Array PhysicsDirectSpaceState3D::_intersect_point(const Ref<PhysicsPointQueryPar
 	int rc = intersect_point(p_point_query->get_parameters(), ret.ptrw(), ret.size());
 
 	if (rc == 0) {
-		return Array();
+		return TypedArray<Dictionary>();
 	}
 
-	Array r;
+	TypedArray<Dictionary> r;
 	r.resize(rc);
 	for (int i = 0; i < rc; i++) {
 		Dictionary d;
@@ -391,13 +392,13 @@ Array PhysicsDirectSpaceState3D::_intersect_point(const Ref<PhysicsPointQueryPar
 	return r;
 }
 
-Array PhysicsDirectSpaceState3D::_intersect_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results) {
-	ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
+TypedArray<Dictionary> PhysicsDirectSpaceState3D::_intersect_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results) {
+	ERR_FAIL_COND_V(!p_shape_query.is_valid(), TypedArray<Dictionary>());
 
 	Vector<ShapeResult> sr;
 	sr.resize(p_max_results);
 	int rc = intersect_shape(p_shape_query->get_parameters(), sr.ptrw(), sr.size());
-	Array ret;
+	TypedArray<Dictionary> ret;
 	ret.resize(rc);
 	for (int i = 0; i < rc; i++) {
 		Dictionary d;
@@ -411,22 +412,22 @@ Array PhysicsDirectSpaceState3D::_intersect_shape(const Ref<PhysicsShapeQueryPar
 	return ret;
 }
 
-Array PhysicsDirectSpaceState3D::_cast_motion(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query) {
-	ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
+Vector<real_t> PhysicsDirectSpaceState3D::_cast_motion(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query) {
+	ERR_FAIL_COND_V(!p_shape_query.is_valid(), Vector<real_t>());
 
 	real_t closest_safe = 1.0f, closest_unsafe = 1.0f;
 	bool res = cast_motion(p_shape_query->get_parameters(), closest_safe, closest_unsafe);
 	if (!res) {
-		return Array();
+		return Vector<real_t>();
 	}
-	Array ret;
+	Vector<real_t> ret;
 	ret.resize(2);
-	ret[0] = closest_safe;
-	ret[1] = closest_unsafe;
+	ret.write[0] = closest_safe;
+	ret.write[1] = closest_unsafe;
 	return ret;
 }
 
-Array PhysicsDirectSpaceState3D::_collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results) {
+TypedArray<PackedVector2Array> PhysicsDirectSpaceState3D::_collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results) {
 	ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
 
 	Vector<Vector3> ret;
@@ -434,9 +435,9 @@ Array PhysicsDirectSpaceState3D::_collide_shape(const Ref<PhysicsShapeQueryParam
 	int rc = 0;
 	bool res = collide_shape(p_shape_query->get_parameters(), ret.ptrw(), p_max_results, rc);
 	if (!res) {
-		return Array();
+		return TypedArray<PackedVector2Array>();
 	}
-	Array r;
+	TypedArray<PackedVector2Array> r;
 	r.resize(rc * 2);
 	for (int i = 0; i < rc * 2; i++) {
 		r[i] = ret[i];

+ 6 - 4
servers/physics_server_3d.h

@@ -38,6 +38,8 @@
 #include "core/variant/native_ptr.h"
 
 class PhysicsDirectSpaceState3D;
+template <typename T>
+class TypedArray;
 
 class PhysicsDirectBodyState3D : public Object {
 	GDCLASS(PhysicsDirectBodyState3D, Object);
@@ -120,10 +122,10 @@ class PhysicsDirectSpaceState3D : public Object {
 
 private:
 	Dictionary _intersect_ray(const Ref<PhysicsRayQueryParameters3D> &p_ray_query);
-	Array _intersect_point(const Ref<PhysicsPointQueryParameters3D> &p_point_query, int p_max_results = 32);
-	Array _intersect_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results = 32);
-	Array _cast_motion(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query);
-	Array _collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results = 32);
+	TypedArray<Dictionary> _intersect_point(const Ref<PhysicsPointQueryParameters3D> &p_point_query, int p_max_results = 32);
+	TypedArray<Dictionary> _intersect_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results = 32);
+	Vector<real_t> _cast_motion(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query);
+	TypedArray<PackedVector2Array> _collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results = 32);
 	Dictionary _get_rest_info(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query);
 
 protected:

+ 3 - 3
servers/rendering/rendering_device_binds.h

@@ -443,8 +443,8 @@ public:
 
 	void add_id(const RID &p_id) { base.append_id(p_id); }
 	void clear_ids() { base.clear_ids(); }
-	Array get_ids() const {
-		Array ids;
+	TypedArray<RID> get_ids() const {
+		TypedArray<RID> ids;
 		for (uint32_t i = 0; i < base.get_id_count(); i++) {
 			ids.push_back(base.get_id(i));
 		}
@@ -452,7 +452,7 @@ public:
 	}
 
 protected:
-	void _set_ids(const Array &p_ids) {
+	void _set_ids(const TypedArray<RID> &p_ids) {
 		base.clear_ids();
 		for (int i = 0; i < p_ids.size(); i++) {
 			RID id = p_ids[i];

+ 4 - 3
servers/rendering_server.cpp

@@ -31,6 +31,7 @@
 #include "rendering_server.h"
 
 #include "core/config/project_settings.h"
+#include "core/variant/typed_array.h"
 #include "servers/rendering/rendering_server_globals.h"
 #include "servers/rendering/shader_language.h"
 
@@ -1337,7 +1338,7 @@ Dictionary RenderingServer::mesh_surface_get_lods(RID p_mesh, int p_surface) con
 	return ret;
 }
 
-Array RenderingServer::mesh_surface_get_blend_shape_arrays(RID p_mesh, int p_surface) const {
+TypedArray<Array> RenderingServer::mesh_surface_get_blend_shape_arrays(RID p_mesh, int p_surface) const {
 	SurfaceData sd = mesh_get_surface(p_mesh, p_surface);
 	ERR_FAIL_COND_V(sd.vertex_count == 0, Array());
 
@@ -1359,7 +1360,7 @@ Array RenderingServer::mesh_surface_get_blend_shape_arrays(RID p_mesh, int p_sur
 
 		ERR_FAIL_COND_V(blend_shape_count != (uint32_t)mesh_get_blend_shape_count(p_mesh), Array());
 
-		Array blend_shape_array;
+		TypedArray<Array> blend_shape_array;
 		blend_shape_array.resize(mesh_get_blend_shape_count(p_mesh));
 		for (uint32_t i = 0; i < blend_shape_count; i++) {
 			Vector<uint8_t> bs_data = blend_shape_data.slice(i * divisor, (i + 1) * divisor);
@@ -1369,7 +1370,7 @@ Array RenderingServer::mesh_surface_get_blend_shape_arrays(RID p_mesh, int p_sur
 
 		return blend_shape_array;
 	} else {
-		return Array();
+		return TypedArray<Array>();
 	}
 }
 

+ 4 - 1
servers/rendering_server.h

@@ -42,6 +42,9 @@
 #include "servers/display_server.h"
 #include "servers/rendering/rendering_device.h"
 
+template <typename T>
+class TypedArray;
+
 class RenderingServer : public Object {
 	GDCLASS(RenderingServer, Object);
 
@@ -325,7 +328,7 @@ public:
 	virtual Error mesh_create_surface_data_from_arrays(SurfaceData *r_surface_data, PrimitiveType p_primitive, const Array &p_arrays, const Array &p_blend_shapes = Array(), const Dictionary &p_lods = Dictionary(), uint32_t p_compress_format = 0);
 	Array mesh_create_arrays_from_surface_data(const SurfaceData &p_data) const;
 	Array mesh_surface_get_arrays(RID p_mesh, int p_surface) const;
-	Array mesh_surface_get_blend_shape_arrays(RID p_mesh, int p_surface) const;
+	TypedArray<Array> mesh_surface_get_blend_shape_arrays(RID p_mesh, int p_surface) const;
 	Dictionary mesh_surface_get_lods(RID p_mesh, int p_surface) const;
 
 	virtual void mesh_add_surface_from_arrays(RID p_mesh, PrimitiveType p_primitive, const Array &p_arrays, const Array &p_blend_shapes = Array(), const Dictionary &p_lods = Dictionary(), uint32_t p_compress_format = 0);