2021-03-27 15:53:32 +01:00
extends Node
2021-04-04 12:52:42 +02:00
var regression_test_project : bool = true # Set it to true in RegressionTestProject
2021-05-18 06:56:35 +02:00
### Contains info about disabled classes and allows to take info about allowed methods
2021-04-04 12:52:42 +02:00
2021-05-18 06:56:35 +02:00
# Globablly disabled functions for all classes
2021-03-27 15:53:32 +01:00
var function_exceptions : Array = [
2021-05-18 06:56:35 +02:00
# GODOT 4.0
2021-03-27 15:53:32 +01:00
" create_from_image " ,
" set_point_position " ,
" connect " , # OTHER THINGS
" set_base " ,
" particles_collision_set_height_field_resolution " ,
" set_deconstruct_type " ,
" set_constant_type " ,
" set_enabled_inputs " ,
" load_threaded_request " ,
" get_sdfgi_max_distance " ,
" draw_multiline_string " ,
" draw_font " ,
" create " ,
" add_string " ,
" draw_string " ,
" set_dropcap " ,
" set_sdfgi_max_distance " ,
" get_inverse_inertia_tensor " ,
" generate_lod " ,
" optimize_indices_for_cache " ,
" add_file " ,
" set_texture " ,
" _activate " ,
" add_node " , #GH 46012
2021-05-18 06:56:35 +02:00
" set_peering_bit_terrain " , #GH 48799
" get_peering_bit_terrain " ,
2021-03-27 15:53:32 +01:00
2021-04-04 12:52:42 +02:00
" get_packet " , # TODO
2021-05-18 06:56:35 +02:00
" _gui_input " , # TODO probably missing cherrypick #GH 47636
" _input " ,
" _unhandled_input " ,
" _unhandled_key_input " ,
" connect_to_signal " , # Should be chrrypicked
2021-03-27 15:53:32 +01:00
# They exists without assigment like Class.method, because they may be a parent of other objects and children also should have disabled child.method, its children also etc. which is too much to do
2021-05-18 06:56:35 +02:00
#"connect_to_signal", # GH 47572
2021-03-27 15:53:32 +01:00
" _editor_settings_changed " , # GH 45979
" _submenu_timeout " , # GH 45981
" _thread_done " , #GH 46000
" generate " , #GH 46001
" _proximity_group_broadcast " , #GH 46002
" _direct_state_changed " , #GH 46003
" create_from " , #GH 46004
" create_from_blend_shape " , #GH 46004
" append_from " , #GH 46004
" _set_tile_data " , #GH 46015
" get " , #GH 46019
" instance_has " , #GH 46020
" get_var " , #GH 46096
" set_script " , #GH 46120
" getvar " , #GH 46019
" get_available_chars " , #GH 46118
" open_midi_inputs " , #GH 46183
" set_icon " , #GH 46189
" get_latin_keyboard_variant " , #GH TODO Memory Leak
" set_editor_hint " , #GH 46252
" get_item_at_position " , #TODO hard to find
" set_probe_data " , #GH 46570
2021-05-18 06:56:35 +02:00
" _range_click_timeout " , #GH 46648
2021-03-27 15:53:32 +01:00
" get_indexed " , #GH 46019
" add_vertex " , #GH 47066
2021-04-04 12:52:42 +02:00
" create_client " , # TODO, strange memory leak
" create_shape_owner " , #47135
" shape_owner_get_owner " , #47135
2021-03-27 15:53:32 +01:00
2021-05-18 06:56:35 +02:00
" get_bind_bone " , #GH 47358
" get_bind_name " , #GH 47358
" get_bind_pose " , #GH 47358
2021-03-27 15:53:32 +01:00
# TODO Check this later
" propagate_notification " ,
" notification " ,
# TODO Adds big spam when i>100 - look for possiblity to
" add_sphere " ,
" _update_inputs " , # Cause big spam with add_input
# Spam when i~1000 - change to specific
" update_bitmask_region " ,
2021-04-04 12:52:42 +02:00
" set_enabled_inputs " ,
2021-03-27 15:53:32 +01:00
# Slow Function
" _update_sky " ,
# Undo/Redo function which doesn't provide enough information about types of objects, probably due vararg(variable size argument)
" add_do_method " ,
" add_undo_method " ,
# Do not save files and create files and folders
" pck_start " ,
" save " ,
" save_png " ,
" save_to_wav " ,
" save_to_file " ,
" make_dir " ,
" make_dir_recursive " ,
" save_encrypted " ,
" save_encrypted_pass " ,
" save_exr " ,
" dump_resources_to_file " ,
" dump_memory_to_file " ,
# This also allow to save files
" open " ,
" open_encrypted " ,
" open_encrypted_with_pass " ,
" open_compressed " ,
# Do not warp mouse
" warp_mouse " ,
" warp_mouse_position " ,
# OS
" kill " ,
" shell_open " ,
" execute " ,
" delay_usec " ,
" delay_msec " ,
" alert " , # Stupid alert window opens
# Godot Freeze
" wait_to_finish " ,
" accept_stream " ,
" connect_to_stream " ,
" discover " ,
" wait " ,
" debug_bake " ,
" bake " ,
" _create " , # TODO Check
" set_gizmo " , # Stupid function, needs as parameter an object which can't be instanced # TODO, create issue to hide it
# Spams Output
" print_tree " ,
" print_stray_nodes " ,
" print_tree_pretty " ,
" print_all_textures_by_size " ,
" print_all_resources " ,
" print_resources_in_use " ,
# Do not call other functions
" _call_function " ,
" call " ,
" call_deferred " ,
" callv " ,
# Looks like a bug in FuncRef, probably but not needed, because it call other functions
" call_func " ,
# Too dangerous, because add, mix and remove randomly nodes and objects
" replace_by " ,
" create_instance " ,
" set_owner " ,
" set_root_node " ,
" instance " ,
" init_ref " ,
" reference " ,
" unreference " ,
" new " ,
" duplicate " ,
" queue_free " ,
" free " ,
" remove_and_skip " ,
" remove_child " ,
" move_child " ,
" raise " ,
" add_child " ,
" add_child_below_node " ,
2021-04-04 12:52:42 +02:00
" add_sibling " ,
2021-03-27 15:53:32 +01:00
]
2021-04-04 12:52:42 +02:00
2021-05-18 06:56:35 +02:00
# Globally disabled classes which causes bugs or are very hard to us
2021-03-27 15:53:32 +01:00
var disabled_classes : Array = [
" ProjectSettings " , # Don't mess with project settings, because they can broke entire your workflow
" EditorSettings " , # Also don't mess with editor settings
" _OS " , # This may sometimes crash compositor, but it should be tested manually sometimes
2021-04-04 12:52:42 +02:00
" GDScript " , # Broke script
2021-03-27 15:53:32 +01:00
2021-04-04 12:52:42 +02:00
# This classes have problems with static/non static methods
" PhysicsDirectSpaceState " ,
" PhysicsDirectSpaceState2D " ,
" PhysicsDirectBodyState " ,
" PhysicsDirectBodyState2D " ,
" BulletPhysicsDirectSpaceState " ,
" InputDefault " ,
" IP_Unix " ,
" JNISingleton " ,
2021-05-18 06:56:35 +02:00
" JavaClass " ,
2021-04-04 12:52:42 +02:00
2021-04-28 06:56:46 +02:00
# Godot 4.0 Leaks, crashes etc.
2021-03-27 15:53:32 +01:00
" World3D " ,
" GPUParticlesCollisionHeightField " , #4.0 Crash
" NavigationAgent2D " ,
" NavigationAgent3D " ,
" Image " ,
" GIProbe " ,
# Just don't use these because they are not normal things
" _Thread " ,
" _Semaphore " ,
2021-05-18 06:56:35 +02:00
" _Mutex " ,
2021-04-15 19:13:17 +02:00
# Creating them is really slow in Godot 4.0
" ColorPicker " ,
" FileDialog " ,
" ColorPickerButton " ,
" PhysicalSkyMaterial " ,
" ProceduralSkyMaterial "
2021-03-27 15:53:32 +01:00
]
2021-04-04 12:52:42 +02:00
# Checks if function can be executed
func check_if_is_allowed ( method_data : Dictionary ) - > bool :
2021-05-18 06:56:35 +02:00
# Function is virtual or vararg, so we just skip it
2021-04-04 12:52:42 +02:00
if method_data . get ( " flags " ) == method_data . get ( " flags " ) | METHOD_FLAG_VIRTUAL :
return false
2021-05-18 06:56:35 +02:00
if method_data . get ( " flags " ) == method_data . get ( " flags " ) | 128 : # VARARG TODO, Godot issue, add missing flag binding
2021-04-21 16:41:27 +02:00
return false
2021-04-04 12:52:42 +02:00
for arg in method_data . get ( " args " ) :
var name_of_class : String = arg . get ( " class_name " )
if name_of_class . is_empty ( ) :
continue
if name_of_class in disabled_classes :
return false
if name_of_class . find ( " Server " ) != - 1 && ClassDB . class_exists ( name_of_class ) && ! ClassDB . is_parent_class ( name_of_class , " Reference " ) :
return false
2021-05-18 06:56:35 +02:00
# Editor stuff usually aren't good choice for arhuments
if name_of_class . find ( " Editor " ) != - 1 || name_of_class . find ( " SkinReference " ) != - 1 :
2021-04-04 12:52:42 +02:00
return false
2021-05-18 06:56:35 +02:00
# In case of adding new type, this prevents from crashing due not recognizing this type
# In case of removing/rename type, just comment e.g. TYPE_ARRAY and all occurencies on e.g. switch statement with it
2021-04-04 12:52:42 +02:00
# In case of adding new type, this prevents from crashing due not recognizing this type
var t : int = arg . get ( " type " )
2021-05-18 06:56:35 +02:00
if ! ( t == TYPE_NIL || t == TYPE_CALLABLE || t == TYPE_MAX || t == TYPE_AABB || t == TYPE_ARRAY || t == TYPE_BASIS || t == TYPE_BOOL || t == TYPE_COLOR || t == TYPE_COLOR_ARRAY || t == TYPE_DICTIONARY || t == TYPE_INT || t == TYPE_INT32_ARRAY || t == TYPE_INT64_ARRAY || t == TYPE_NODE_PATH || t == TYPE_OBJECT || t == TYPE_PLANE || t == TYPE_QUAT || t == TYPE_RAW_ARRAY || t == TYPE_FLOAT || t == TYPE_FLOAT32_ARRAY || t == TYPE_FLOAT64_ARRAY || t == TYPE_RECT2 || t == TYPE_RECT2I || t == TYPE_RID || t == TYPE_STRING || t == TYPE_STRING_NAME || t == TYPE_STRING_ARRAY || t == TYPE_TRANSFORM || t == TYPE_TRANSFORM2D || t == TYPE_VECTOR2 || t == TYPE_VECTOR2I || t == TYPE_VECTOR2_ARRAY || t == TYPE_VECTOR3 || t == TYPE_VECTOR3I || t == TYPE_VECTOR3_ARRAY ) :
2021-04-04 12:52:42 +02:00
print ( " ----------------------------------------------------------- TODO - MISSING TYPE, ADD SUPPORT IT " )
return false
2021-05-18 06:56:35 +02:00
#This is only for RegressionTestProject, because it needs for now clear visual info what is going on screen, but some nodes broke view
if regression_test_project :
# That means that this is constant, not class
if ! ClassDB . class_exists ( name_of_class ) :
continue
if ! ClassDB . is_parent_class ( name_of_class , " Node " ) && ! ClassDB . is_parent_class ( name_of_class , " Reference " ) :
return false
2021-04-04 12:52:42 +02:00
return true
2021-05-18 06:56:35 +02:00
func remove_disabled_methods ( method_list : Array , exceptions : Array ) - > void :
for exception in exceptions :
var index : int = - 1
for method_index in range ( method_list . size ( ) ) :
if method_list [ method_index ] . get ( " name " ) == exception :
index = method_index
break
if index != - 1 :
method_list . remove ( index )
# Return all available classes which can be used
2021-03-27 15:53:32 +01:00
func get_list_of_available_classes ( must_be_instantable : bool = true ) - > Array :
var full_class_list : Array = Array ( ClassDB . get_class_list ( ) )
var classes : Array = [ ]
full_class_list . sort ( )
var c = 0
2021-05-18 06:56:35 +02:00
# var rr = 0
2021-03-27 15:53:32 +01:00
for name_of_class in full_class_list :
2021-05-18 06:56:35 +02:00
# rr += 1
2021-03-27 15:53:32 +01:00
if name_of_class in disabled_classes :
continue
# if rr < 550:
2021-04-04 12:52:42 +02:00
# continue
#This is only for RegressionTestProject, because it needs for now clear visual info what is going on screen, but some nodes broke view
if regression_test_project :
if ! ClassDB . is_parent_class ( name_of_class , " Node " ) && ! ClassDB . is_parent_class ( name_of_class , " Reference " ) :
continue
2021-03-27 15:53:32 +01:00
if name_of_class . find ( " Server " ) != - 1 && ! ClassDB . is_parent_class ( name_of_class , " Reference " ) :
continue
2021-05-18 06:56:35 +02:00
if name_of_class . find ( " Editor " ) != - 1 && regression_test_project :
2021-03-27 15:53:32 +01:00
continue
if ! must_be_instantable || ClassDB . can_instance ( name_of_class ) :
classes . push_back ( name_of_class )
c += 1
print ( str ( c ) + " choosen classes from all " + str ( full_class_list . size ( ) ) + " classes. " )
return classes