2026-05-10 22:29:56 +08:00
#!/usr/bin/env python3
import argparse
import json
import re
from dataclasses import dataclass
from pathlib import Path
SMOKE_TEST_CLASSES = [ " Object " , " RefCounted " , " Resource " , " MainLoop " , " SceneTree " , " Node " , " CanvasItem " , " Node2D " , " Control " , " Label " , " Sprite2D " ]
CS_CLASS_NAMES = { " Object " : " GodotObject " }
CPP_HEADER_NAME_OVERRIDES = {
" Object " : " object " ,
" RefCounted " : " ref_counted " ,
" Resource " : " resource " ,
" MainLoop " : " main_loop " ,
" SceneTree " : " scene_tree " ,
" Node " : " node " ,
" CanvasItem " : " canvas_item " ,
" Node2D " : " node2d " ,
" Control " : " control " ,
" Label " : " label " ,
" Sprite2D " : " sprite2d " ,
" AnimationNodeBlendSpace1D " : " animation_node_blend_space1_d " ,
" ClassDB " : " class_db_singleton " ,
" EditorSceneFormatImporterFBX2GLTF " : " editor_scene_format_importer_fbx2_gltf " ,
" Generic6DOFJoint3D " : " generic6_dof_joint3d " ,
" GradientTexture1D " : " gradient_texture1_d " ,
}
2026-06-07 22:55:56 +08:00
# godot-cpp 4.5 renamed ClassDB to a ClassDBSingleton wrapper. Map the API
# class name to the renamed C++ class and treat all of its methods as static
# (so the generated native side calls ClassDBSingleton::get_singleton()->...).
SINGLETON_CLASS_CPP_NAMES = { " ClassDB " : " ClassDBSingleton " }
2026-05-10 22:29:56 +08:00
HANDWRITTEN_PARTIAL_CLASSES = { " GodotObject " , " Node " }
CS_KEYWORDS = {
" abstract " , " as " , " base " , " bool " , " break " , " byte " , " case " , " catch " , " char " , " checked " , " class " , " const " ,
" continue " , " decimal " , " default " , " delegate " , " do " , " double " , " else " , " enum " , " event " , " explicit " , " extern " ,
" false " , " finally " , " fixed " , " float " , " for " , " foreach " , " goto " , " if " , " implicit " , " in " , " int " , " interface " ,
" internal " , " is " , " lock " , " long " , " namespace " , " new " , " null " , " object " , " operator " , " out " , " override " ,
" params " , " private " , " protected " , " public " , " readonly " , " ref " , " return " , " sbyte " , " sealed " , " short " , " sizeof " ,
" stackalloc " , " static " , " string " , " struct " , " switch " , " this " , " throw " , " true " , " try " , " typeof " , " uint " , " ulong " ,
" unchecked " , " unsafe " , " ushort " , " using " , " virtual " , " void " , " volatile " , " while " ,
}
PROPERTY_METHODS = {
( " Node " , " get_name " ) ,
( " Node " , " set_name " ) ,
( " Node2D " , " get_position " ) ,
( " Node2D " , " set_position " ) ,
( " Node2D " , " get_global_position " ) ,
( " Node2D " , " set_global_position " ) ,
( " Node2D " , " get_scale " ) ,
( " Node2D " , " set_scale " ) ,
( " Control " , " get_position " ) ,
( " Control " , " set_position " ) ,
( " Control " , " get_size " ) ,
( " Control " , " set_size " ) ,
( " Label " , " get_text " ) ,
( " Label " , " set_text " ) ,
( " Sprite2D " , " is_centered " ) ,
( " Sprite2D " , " set_centered " ) ,
( " Sprite2D " , " get_offset " ) ,
( " Sprite2D " , " set_offset " ) ,
( " Sprite2D " , " is_flipped_h " ) ,
( " Sprite2D " , " set_flip_h " ) ,
( " Sprite2D " , " is_flipped_v " ) ,
( " Sprite2D " , " set_flip_v " ) ,
}
EXCLUDED_METHODS = set ( )
METHOD_ALIASES = {
( " Object " , " to_string " ) : " ToGodotString " ,
( " Node " , " get_node " ) : " GetNode " ,
( " Node " , " get_node_or_null " ) : " GetNodeOrNull " ,
}
ICALL_SUFFIX_ALIASES = {
( " Node " , " get_node " ) : " GetNode " ,
( " Node " , " get_node_or_null " ) : " GetNodeOrNull " ,
}
CPP_METHOD_ALIASES = {
( " Node " , " get_node " ) : " get_node<Node> " ,
( " Node " , " get_node_or_null " ) : " get_node_or_null " ,
( " TextServer " , " shaped_get_run_glyph_range " ) : " shaped_get_run_range " ,
}
METHOD_ARGUMENT_TYPE_OVERRIDES = {
( " FileAccess " , " create_temp " , " mode_flags " ) : ( " enum::FileAccess.ModeFlags " , None ) ,
}
STRING_LIKE_TYPES = { " String " , " StringName " , " NodePath " }
PACKED_ARRAY_TYPES = {
" PackedByteArray " , " PackedInt32Array " , " PackedInt64Array " , " PackedFloat32Array " , " PackedFloat64Array " ,
" PackedVector2Array " , " PackedVector3Array " , " PackedColorArray " ,
}
OPAQUE_VARIANT_TYPES = { " Array " , " Dictionary " , " Callable " , " Signal " }
OPAQUE_VALUE_TYPES = set ( )
INT32_META = { " int8 " , " uint8 " , " int16 " , " uint16 " , " int32 " , " uint32 " , " char16 " , " char32 " }
INT64_META = { " int64 " , " uint64 " }
CPP_INT_TYPES = {
" int8 " : " int8_t " ,
" uint8 " : " uint8_t " ,
" int16 " : " int16_t " ,
" uint16 " : " uint16_t " ,
" int32 " : " int32_t " ,
" uint32 " : " uint32_t " ,
" char16 " : " char16_t " ,
" char32 " : " char32_t " ,
" int64 " : " int64_t " ,
" uint64 " : " uint64_t " ,
}
PACKED_ARRAY_INFOS = {
" PackedByteArray " : { " cs " : " byte " , " cpp " : " PackedByteArray " , " stack " : " uint8_t " , " default " : " 0 " } ,
" PackedInt32Array " : { " cs " : " int " , " cpp " : " PackedInt32Array " , " stack " : " int32_t " , " default " : " 0 " } ,
" PackedInt64Array " : { " cs " : " long " , " cpp " : " PackedInt64Array " , " stack " : " int64_t " , " default " : " 0 " } ,
" PackedFloat32Array " : { " cs " : " float " , " cpp " : " PackedFloat32Array " , " stack " : " float " , " default " : " 0.0f " } ,
" PackedFloat64Array " : { " cs " : " double " , " cpp " : " PackedFloat64Array " , " stack " : " double " , " default " : " 0.0 " } ,
" PackedVector2Array " : { " cs " : " Vector2 " , " cpp " : " PackedVector2Array " , " stack " : " Vector2 " , " default " : " Vector2() " } ,
" PackedVector3Array " : { " cs " : " Vector3 " , " cpp " : " PackedVector3Array " , " stack " : " Vector3 " , " default " : " Vector3() " } ,
" PackedColorArray " : { " cs " : " Color " , " cpp " : " PackedColorArray " , " stack " : " Color " , " default " : " Color() " } ,
}
@dataclass ( frozen = True )
class TypeInfo :
managed_type : str
native_type : str
stack_type : str
signature_type : str
category : str
cpp_type : str = " "
cs_class : str = " "
stack_slots : int = 1
@dataclass ( frozen = True )
class GeneratedMethod :
class_name : str
cs_class_name : str
cpp_class_name : str
api_name : str
cpp_name : str
cs_name : str
icall_suffix : str
return_type : TypeInfo
args : tuple
is_static : bool
is_virtual : bool = False
is_vararg : bool = False
def write ( path , content ) :
path . parent . mkdir ( parents = True , exist_ok = True )
normalized = content . replace ( " \r \n " , " \n " ) . replace ( " \r " , " \n " )
with path . open ( " w " , encoding = " utf-8 " , newline = " " ) as file :
file . write ( normalized . replace ( " \n " , " \r \n " ) )
def cs_class_name ( class_name ) :
return cs_identifier ( CS_CLASS_NAMES . get ( class_name , class_name ) , " GodotType " )
def cs_identifier ( name , fallback ) :
identifier = re . sub ( r " [^0-9A-Za-z_] " , " _ " , name )
if not identifier :
identifier = fallback
if identifier [ 0 ] . isdigit ( ) :
identifier = f " { fallback } { identifier } "
if identifier . lower ( ) in CS_KEYWORDS :
identifier = f " { identifier } _ "
return identifier
def pascal_name ( snake_name ) :
return cs_identifier ( " " . join ( part . capitalize ( ) for part in snake_name . split ( " _ " ) if part ) , " Value " )
def camel_name ( snake_name ) :
pascal = pascal_name ( snake_name )
return pascal [ : 1 ] . lower ( ) + pascal [ 1 : ]
def native_function_name ( method ) :
return f " godot_ { method . cs_class_name } _ { method . icall_suffix } " . lower ( )
def cpp_header_name ( class_name ) :
if class_name in CPP_HEADER_NAME_OVERRIDES :
return CPP_HEADER_NAME_OVERRIDES [ class_name ]
header = re . sub ( r " (.)([A-Z][a-z]+) " , r " \ 1_ \ 2 " , class_name )
header = re . sub ( r " ([a-z])([A-Z]) " , r " \ 1_ \ 2 " , header )
return header . lower ( )
def icall_name ( method ) :
param_types = [ ] if method . is_static else [ " System.IntPtr " ]
param_sig = " , " . join ( param_types + [ arg [ " type " ] . signature_type for arg in method . args ] )
if method . is_vararg :
param_sig = param_sig + ( " , " if param_sig else " " ) + " Godot.Variant[] "
return f " Godot.NativeCalls::Godot { method . cs_class_name } { method . icall_suffix } ( { param_sig } ) "
def class_inherits ( class_name , base_name , classes ) :
current = classes . get ( class_name , { } ) . get ( " inherits " )
while current :
if current == base_name :
return True
current = classes . get ( current , { } ) . get ( " inherits " )
return False
def method_type_info ( raw_type , meta , class_names , classes = None , global_enum_names = None , global_bitfield_names = None ) :
if raw_type is None :
return TypeInfo ( " void " , " leanclr::RtResultVoid " , " " , " " , " void " , stack_slots = 0 )
if raw_type == " bool " :
return TypeInfo ( " bool " , " bool " , " bool " , " System.Boolean " , " bool " )
if raw_type == " float " :
return TypeInfo ( " float " , " float " , " float " , " System.Single " , " float " )
if raw_type == " int " :
if meta in INT32_META :
return TypeInfo ( " int " , " int32_t " , " int32_t " , " System.Int32 " , " int " , cpp_type = CPP_INT_TYPES [ meta ] )
if meta in INT64_META :
return TypeInfo ( " long " , " int64_t " , " int64_t " , " System.Int64 " , " int " , cpp_type = CPP_INT_TYPES [ meta ] )
return TypeInfo ( " long " , " int64_t " , " int64_t " , " System.Int64 " , " int " )
if raw_type in STRING_LIKE_TYPES :
managed_type = " string " if raw_type == " String " else raw_type
return TypeInfo ( managed_type , " leanclr::vm::RtString* " , " leanclr::vm::RtString* " , " System.String " , " string " , cpp_type = raw_type )
if raw_type == " Variant " :
return TypeInfo ( " Variant " , " ManagedVariant " , " ManagedVariant " , " Godot.Variant " , " variant " , cpp_type = " Variant " , stack_slots = 9 )
if raw_type == " PackedStringArray " :
return TypeInfo ( " PackedStringArray " , " intptr_t " , " intptr_t " , " System.IntPtr " , " packed_string_array " , cpp_type = " PackedStringArray " )
if raw_type in PACKED_ARRAY_TYPES :
return TypeInfo ( raw_type , " intptr_t " , " intptr_t " , " System.IntPtr " , " packed_array " , cpp_type = raw_type , cs_class = raw_type )
if raw_type in OPAQUE_VARIANT_TYPES :
return TypeInfo ( raw_type , " intptr_t " , " intptr_t " , " System.IntPtr " , " opaque_variant " , cpp_type = raw_type , cs_class = raw_type )
if raw_type and raw_type . startswith ( " typedarray:: " ) :
element_type = raw_type . removeprefix ( " typedarray:: " )
cpp_element_type = element_type
if element_type == " Object " :
cpp_element_type = " Object "
return TypeInfo ( " GodotArray " , " intptr_t " , " intptr_t " , " System.IntPtr " , " typed_array " , cpp_type = f " TypedArray< { cpp_element_type } > " , cs_class = " GodotArray " )
if raw_type in OPAQUE_VALUE_TYPES :
return TypeInfo ( raw_type , " intptr_t " , " intptr_t " , " System.IntPtr " , " opaque_value " , cpp_type = raw_type , cs_class = raw_type )
if raw_type in { " const void* " , " const GDExtensionInitializationFunction* " } or ( raw_type and raw_type . endswith ( " * " ) ) :
return TypeInfo ( " IntPtr " , " intptr_t " , " intptr_t " , " System.IntPtr " , " native_pointer " , cpp_type = raw_type )
if raw_type == " Vector2 " :
return TypeInfo ( " Vector2 " , " Vector2 " , " Vector2 " , " Godot.Vector2 " , " vector2 " , cpp_type = " Vector2 " )
if raw_type == " Vector2i " :
return TypeInfo ( " Vector2i " , " Vector2i " , " Vector2i " , " Godot.Vector2i " , " vector2i " , cpp_type = " Vector2i " )
if raw_type == " Vector3 " :
return TypeInfo ( " Vector3 " , " Vector3 " , " Vector3 " , " Godot.Vector3 " , " vector3 " , cpp_type = " Vector3 " , stack_slots = 2 )
if raw_type == " Vector3i " :
return TypeInfo ( " Vector3i " , " Vector3i " , " Vector3i " , " Godot.Vector3i " , " vector3i " , cpp_type = " Vector3i " , stack_slots = 2 )
if raw_type == " Color " :
return TypeInfo ( " Color " , " Color " , " Color " , " Godot.Color " , " color " , cpp_type = " Color " , stack_slots = 2 )
if raw_type == " Rect2 " :
return TypeInfo ( " Rect2 " , " Rect2 " , " Rect2 " , " Godot.Rect2 " , " rect2 " , cpp_type = " Rect2 " , stack_slots = 2 )
if raw_type == " Rect2i " :
return TypeInfo ( " Rect2i " , " Rect2i " , " Rect2i " , " Godot.Rect2i " , " rect2i " , cpp_type = " Rect2i " , stack_slots = 2 )
if raw_type == " Transform2D " :
return TypeInfo ( " Transform2D " , " Transform2D " , " Transform2D " , " Godot.Transform2D " , " transform2d " , cpp_type = " Transform2D " , stack_slots = 3 )
if raw_type == " AABB " :
return TypeInfo ( " Aabb " , " AABB " , " AABB " , " Godot.Aabb " , " aabb " , cpp_type = " AABB " , stack_slots = 3 )
if raw_type == " Quaternion " :
return TypeInfo ( " Quaternion " , " Quaternion " , " Quaternion " , " Godot.Quaternion " , " quaternion " , cpp_type = " Quaternion " , stack_slots = 2 )
if raw_type == " Basis " :
return TypeInfo ( " Basis " , " Basis " , " Basis " , " Godot.Basis " , " basis " , cpp_type = " Basis " , stack_slots = 5 )
if raw_type == " Transform3D " :
return TypeInfo ( " Transform3D " , " Transform3D " , " Transform3D " , " Godot.Transform3D " , " transform3d " , cpp_type = " Transform3D " , stack_slots = 6 )
if raw_type == " Vector4 " :
return TypeInfo ( " Vector4 " , " Vector4 " , " Vector4 " , " Godot.Vector4 " , " vector4 " , cpp_type = " Vector4 " , stack_slots = 2 )
if raw_type == " Vector4i " :
return TypeInfo ( " Vector4i " , " Vector4i " , " Vector4i " , " Godot.Vector4i " , " vector4i " , cpp_type = " Vector4i " , stack_slots = 2 )
if raw_type == " Plane " :
return TypeInfo ( " Plane " , " Plane " , " Plane " , " Godot.Plane " , " plane " , cpp_type = " Plane " , stack_slots = 2 )
if raw_type == " Projection " :
return TypeInfo ( " Projection " , " Projection " , " Projection " , " Godot.Projection " , " projection " , cpp_type = " Projection " , stack_slots = 8 )
if raw_type == " RID " :
return TypeInfo ( " RID " , " RID " , " RID " , " Godot.RID " , " rid " , cpp_type = " RID " )
if raw_type and raw_type . startswith ( " enum:: " ) :
enum_name = raw_type . removeprefix ( " enum:: " )
if " . " not in enum_name :
if global_enum_names is not None and enum_name in global_enum_names :
managed_name = cs_identifier ( enum_name , " GodotEnum " )
return TypeInfo ( managed_name , " int32_t " , " int32_t " , " System.Int32 " , " enum " , cpp_type = enum_name )
return TypeInfo ( " " , " " , " " , " " , " unsupported " )
class_name , nested_name = enum_name . split ( " . " , 1 )
managed_name = f " { cs_class_name ( class_name ) } . { cs_identifier ( nested_name , ' GodotEnum ' ) } "
return TypeInfo ( managed_name , " int32_t " , " int32_t " , " System.Int32 " , " enum " , cpp_type = enum_name . replace ( " . " , " :: " ) )
if raw_type and raw_type . startswith ( " bitfield:: " ) :
bitfield_name = raw_type . removeprefix ( " bitfield:: " )
if " . " not in bitfield_name :
if global_bitfield_names is not None and bitfield_name in global_bitfield_names :
managed_name = cs_identifier ( bitfield_name , " GodotBitfield " )
return TypeInfo ( managed_name , " int64_t " , " int64_t " , " System.Int64 " , " bitfield " , cpp_type = f " BitField< { bitfield_name } > " )
return TypeInfo ( " " , " " , " " , " " , " unsupported " )
class_name , nested_name = bitfield_name . split ( " . " , 1 )
cpp_enum_name = bitfield_name . replace ( " . " , " :: " )
managed_name = f " { cs_class_name ( class_name ) } . { cs_identifier ( nested_name , ' GodotBitfield ' ) } "
return TypeInfo ( managed_name , " int64_t " , " int64_t " , " System.Int64 " , " bitfield " , cpp_type = f " BitField< { cpp_enum_name } > " )
if raw_type in class_names :
if classes is not None and ( raw_type == " RefCounted " or class_inherits ( raw_type , " RefCounted " , classes ) ) :
return TypeInfo ( cs_class_name ( raw_type ) , " intptr_t " , " intptr_t " , " System.IntPtr " , " refcounted " , cpp_type = raw_type , cs_class = cs_class_name ( raw_type ) )
return TypeInfo ( cs_class_name ( raw_type ) , " intptr_t " , " intptr_t " , " System.IntPtr " , " object " , cpp_type = raw_type , cs_class = cs_class_name ( raw_type ) )
return TypeInfo ( " " , " " , " " , " " , " unsupported " )
def is_supported_type ( type_info ) :
return type_info . category in { " void " , " bool " , " float " , " int " , " string " , " variant " , " packed_string_array " , " packed_array " , " opaque_variant " , " typed_array " , " opaque_value " , " native_pointer " , " object " , " refcounted " , " enum " , " bitfield " , " vector2 " , " vector2i " , " vector3 " , " vector3i " , " color " , " rect2 " , " rect2i " , " transform2d " , " aabb " , " quaternion " , " basis " , " transform3d " , " vector4 " , " vector4i " , " plane " , " projection " , " rid " }
def empty_report ( class_order ) :
return {
" class_count " : len ( class_order ) ,
" generated_managed_classes " : len ( class_order ) ,
" native_bound_classes " : [ ] ,
" generated_methods " : 0 ,
" skipped_methods " : { } ,
" unsupported_type_counts " : { } ,
" overview " : { } ,
" per_class " : [ ] ,
" examples " : { } ,
}
def add_report_skip ( report , reason , example , raw_type = None ) :
report [ " skipped_methods " ] [ reason ] = report [ " skipped_methods " ] . get ( reason , 0 ) + 1
examples = report [ " examples " ] . setdefault ( reason , [ ] )
if len ( examples ) < 20 :
examples . append ( example )
if raw_type :
report [ " unsupported_type_counts " ] [ raw_type ] = report [ " unsupported_type_counts " ] . get ( raw_type , 0 ) + 1
def method_example ( class_name , method ) :
return f " { class_name } . { method [ ' name ' ] } "
def method_skip_reason ( class_name , method , class_names , classes , global_enum_names , global_bitfield_names ) :
if ( class_name , method [ " name " ] ) in EXCLUDED_METHODS :
return " excluded_method " , None
if method . get ( " is_vararg " ) :
return " vararg_method " , None
if method . get ( " is_virtual " ) :
return " virtual_method " , None
return_value = method . get ( " return_value " ) or { }
return_type = method_type_info ( return_value . get ( " type " ) , return_value . get ( " meta " ) , class_names , classes , global_enum_names , global_bitfield_names )
if not is_supported_type ( return_type ) :
return " unsupported_return " , return_value . get ( " type " )
for arg in method . get ( " arguments " , [ ] ) :
if " default_value " in arg :
continue
raw_type , meta = METHOD_ARGUMENT_TYPE_OVERRIDES . get ( ( class_name , method [ " name " ] , arg [ " name " ] ) , ( arg [ " type " ] , arg . get ( " meta " ) ) )
arg_type = method_type_info ( raw_type , meta , class_names , classes , global_enum_names , global_bitfield_names )
if not is_supported_type ( arg_type ) or arg_type . category == " void " :
return " unsupported_argument " , arg . get ( " type " )
return " supported_signature_not_selected " , None
def build_generated_method ( class_name , api_method , class_names , classes , global_enum_names , global_bitfield_names ) :
if ( class_name , api_method [ " name " ] ) in EXCLUDED_METHODS :
return None , " excluded_method " , None
is_vararg = bool ( api_method . get ( " is_vararg " ) )
is_virtual = bool ( api_method . get ( " is_virtual " ) )
return_value = api_method . get ( " return_value " ) or { }
return_type = method_type_info ( return_value . get ( " type " ) , return_value . get ( " meta " ) , class_names , classes , global_enum_names , global_bitfield_names )
if not is_supported_type ( return_type ) :
return None , " unsupported_return " , return_value . get ( " type " )
args = [ ]
for arg in api_method . get ( " arguments " , [ ] ) :
if " default_value " in arg :
continue
raw_type , meta = METHOD_ARGUMENT_TYPE_OVERRIDES . get ( ( class_name , api_method [ " name " ] , arg [ " name " ] ) , ( arg [ " type " ] , arg . get ( " meta " ) ) )
arg_type = method_type_info ( raw_type , meta , class_names , classes , global_enum_names , global_bitfield_names )
if not is_supported_type ( arg_type ) or arg_type . category == " void " :
return None , " unsupported_argument " , arg . get ( " type " )
args . append ( { " name " : arg [ " name " ] , " type " : arg_type } )
api_name = api_method [ " name " ]
if is_virtual and api_name . startswith ( " _ " ) :
cs_name = " _ " + pascal_name ( api_name [ 1 : ] )
else :
cs_name = METHOD_ALIASES . get ( ( class_name , api_name ) , pascal_name ( api_name ) )
icall_suffix = ICALL_SUFFIX_ALIASES . get ( ( class_name , api_name ) , cs_name )
cpp_name = CPP_METHOD_ALIASES . get ( ( class_name , api_name ) , api_name )
return GeneratedMethod (
class_name = class_name ,
cs_class_name = cs_class_name ( class_name ) ,
2026-06-07 22:55:56 +08:00
cpp_class_name = SINGLETON_CLASS_CPP_NAMES . get ( class_name , class_name ) ,
2026-05-10 22:29:56 +08:00
api_name = api_name ,
cpp_name = cpp_name ,
cs_name = cs_name ,
icall_suffix = icall_suffix ,
return_type = return_type ,
args = tuple ( args ) ,
2026-06-07 22:55:56 +08:00
is_static = bool ( api_method . get ( " is_static " ) ) or class_name in SINGLETON_CLASS_CPP_NAMES ,
2026-05-10 22:29:56 +08:00
is_virtual = is_virtual ,
is_vararg = is_vararg ,
) , None , None
def build_model ( api ) :
classes = { entry [ " name " ] : entry for entry in api [ " classes " ] }
class_order = [ entry [ " name " ] for entry in api [ " classes " ] ]
class_names = set ( classes . keys ( ) )
global_enums = api . get ( " global_enums " , [ ] )
global_enum_names = { entry [ " name " ] for entry in global_enums if not entry . get ( " is_bitfield " ) }
global_bitfield_names = { entry [ " name " ] for entry in global_enums if entry . get ( " is_bitfield " ) }
missing_classes = [ name for name in SMOKE_TEST_CLASSES if name not in classes ]
if missing_classes :
raise SystemExit ( " extension_api.json is missing required classes: " + " , " . join ( missing_classes ) )
methods = [ ]
report = empty_report ( class_order )
generated_signatures = set ( )
per_class = { name : { " class_name " : name , " methods_total " : len ( classes [ name ] . get ( " methods " , [ ] ) ) , " methods_generated " : 0 , " methods_skipped " : 0 , " skip_reasons " : { } } for name in class_order }
for class_name in class_order :
for api_method in classes [ class_name ] . get ( " methods " , [ ] ) :
method , reason , raw_type = build_generated_method ( class_name , api_method , class_names , classes , global_enum_names , global_bitfield_names )
if method is None :
add_report_skip ( report , reason , method_example ( class_name , api_method ) , raw_type )
per_class [ class_name ] [ " methods_skipped " ] + = 1
per_class [ class_name ] [ " skip_reasons " ] [ reason ] = per_class [ class_name ] [ " skip_reasons " ] . get ( reason , 0 ) + 1
continue
signature = ( method . class_name , method . is_static , method . cs_name , tuple ( arg [ " type " ] . managed_type for arg in method . args ) , method . is_vararg )
if signature in generated_signatures :
add_report_skip ( report , " duplicate_managed_signature " , method_example ( class_name , api_method ) )
per_class [ class_name ] [ " methods_skipped " ] + = 1
per_class [ class_name ] [ " skip_reasons " ] [ " duplicate_managed_signature " ] = per_class [ class_name ] [ " skip_reasons " ] . get ( " duplicate_managed_signature " , 0 ) + 1
continue
generated_signatures . add ( signature )
methods . append ( method )
per_class [ class_name ] [ " methods_generated " ] + = 1
report [ " generated_methods " ] = len ( methods )
native_methods = [ method for method in methods if not method . is_virtual ]
native_bound_classes = sorted ( { method . class_name for method in native_methods } )
total_methods = sum ( entry [ " methods_total " ] for entry in per_class . values ( ) )
skipped_methods = sum ( report [ " skipped_methods " ] . values ( ) )
report [ " native_bound_classes " ] = native_bound_classes
report [ " overview " ] = {
" api_class_count " : len ( class_order ) ,
" skeleton_class_count " : len ( class_order ) ,
" native_bound_class_count " : len ( native_bound_classes ) ,
" classes_with_generated_methods " : len ( native_bound_classes ) ,
" total_methods " : total_methods ,
" generated_methods " : len ( methods ) ,
" generated_native_methods " : len ( native_methods ) ,
" generated_virtual_stubs " : sum ( 1 for method in methods if method . is_virtual ) ,
" generated_vararg_bridges " : sum ( 1 for method in methods if method . is_vararg ) ,
" skipped_methods " : skipped_methods ,
" class_skeleton_coverage_pct " : 100.0 ,
" native_class_coverage_pct " : round ( len ( native_bound_classes ) * 100.0 / len ( class_order ) , 2 ) if class_order else 0.0 ,
" method_coverage_pct " : round ( len ( methods ) * 100.0 / total_methods , 2 ) if total_methods else 0.0 ,
}
class_rows = [ ]
for class_name in class_order :
row = per_class [ class_name ]
row [ " coverage_pct " ] = round ( row [ " methods_generated " ] * 100.0 / row [ " methods_total " ] , 2 ) if row [ " methods_total " ] else 0.0
class_rows . append ( row )
report [ " per_class " ] = class_rows
return classes , class_order , global_enums , methods , report
def managed_base_clause ( class_name , classes ) :
cs_name = cs_class_name ( class_name )
if cs_name in HANDWRITTEN_PARTIAL_CLASSES :
return " "
base = classes [ class_name ] . get ( " inherits " )
if not base :
return " "
return f " : { cs_class_name ( base ) } "
def managed_arg_declaration ( arg ) :
return f " { arg [ ' type ' ] . managed_type } { camel_name ( arg [ ' name ' ] ) } "
def managed_native_arg_expression ( arg ) :
name = camel_name ( arg [ " name " ] )
if arg [ " type " ] . category == " variant " :
return name
if arg [ " type " ] . category in { " packed_string_array " , " packed_array " , " opaque_variant " , " typed_array " , " opaque_value " } :
return f " { name } != null ? { name } .NativePtr : IntPtr.Zero "
if arg [ " type " ] . category in { " object " , " refcounted " } :
return f " { name } != null ? { name } .NativePtr : IntPtr.Zero "
if arg [ " type " ] . category == " string " and arg [ " type " ] . managed_type != " string " :
return f " { name } .ToString() "
if arg [ " type " ] . category == " enum " :
return f " (int) { name } "
if arg [ " type " ] . category == " bitfield " :
return f " (long) { name } "
return name
def managed_return_expression ( method , call ) :
if method . return_type . category == " void " :
return f " { call } ; "
if method . return_type . category == " object " :
return f " return CreateFromNative< { method . return_type . cs_class } >( { call } ); "
if method . return_type . category == " refcounted " :
return f " return CreateFromNative< { method . return_type . cs_class } >( { call } , true); "
if method . return_type . category == " variant " :
return f " return { call } ; "
if method . return_type . category == " packed_string_array " :
return f " return PackedStringArray.CreateFromNative( { call } ); "
if method . return_type . category in { " packed_array " , " opaque_variant " , " typed_array " , " opaque_value " } :
return f " return { method . return_type . cs_class } .CreateFromNative( { call } ); "
if method . return_type . category == " string " and method . return_type . managed_type != " string " :
return f " return new { method . return_type . managed_type } ( { call } ); "
if method . return_type . category == " enum " :
return f " return ( { method . return_type . managed_type } ) { call } ; "
if method . return_type . category == " bitfield " :
return f " return ( { method . return_type . managed_type } ) { call } ; "
return f " return { call } ; "
def managed_default_return_expression ( type_info ) :
category = type_info . category
if category == " void " :
return " "
if category == " bool " :
return " return false; "
if category in { " int " , " enum " , " bitfield " } :
return " return 0; "
if category == " float " :
return " return 0.0f; "
if category == " string " :
return " return string.Empty; "
if category in { " object " , " refcounted " , " packed_string_array " , " packed_array " , " opaque_variant " , " typed_array " , " opaque_value " } :
return " return null; "
return f " return default( { type_info . managed_type } ); "
def generate_managed_method ( method ) :
if ( method . class_name , method . api_name ) in PROPERTY_METHODS :
return " "
if method . class_name == " Node " and method . api_name in { " _ready " , " _process " } :
return " "
if method . class_name == " Node " and method . api_name == " get_node " :
return """ public T GetNode<T>(NodePath path) where T : Node, new()
{
return CreateFromNative<T>(NativeCalls.GodotNodeGetNode(NativePtr, path.ToString()));
}
"""
if method . class_name == " Node " and method . api_name == " get_node_or_null " :
return """ public T GetNodeOrNull<T>(NodePath path) where T : Node, new()
{
return CreateFromNative<T>(NativeCalls.GodotNodeGetNodeOrNull(NativePtr, path.ToString()));
}
"""
args = " , " . join ( managed_arg_declaration ( arg ) for arg in method . args )
if method . is_vararg :
args = ( args + " , " if args else " " ) + " params Variant[] varargs "
if method . is_virtual :
return_type = method . return_type . managed_type
body = managed_default_return_expression ( method . return_type )
return f """ public virtual { return_type } { method . cs_name } ( { args } )
{{
{ body }
}}
"""
native_args = ( [ ] if method . is_static else [ " NativePtr " ] ) + [ managed_native_arg_expression ( arg ) for arg in method . args ]
if method . is_vararg :
native_args . append ( " varargs " )
call = f " NativeCalls.Godot { method . cs_class_name } { method . icall_suffix } ( " + " , " . join ( native_args ) + " ) "
return_type = method . return_type . managed_type
body = managed_return_expression ( method , call )
static_modifier = " static " if method . is_static else " "
return f """ public { static_modifier } { return_type } { method . cs_name } ( { args } )
{{
{ body }
}}
"""
def generate_node_name_property ( ) :
return """ public StringName Name
{
get { return new StringName(NativeCalls.GodotNodeGetName(NativePtr)); }
set { NativeCalls.GodotNodeSetName(NativePtr, value.ToString()); }
}
"""
def generate_node2d_vector2_property ( property_name , getter , setter ) :
return f """ public Vector2 { property_name }
{{
get {{ return NativeCalls.GodotNode2D { getter } (NativePtr); }}
set {{ NativeCalls.GodotNode2D { setter } (NativePtr, value); }}
}}
"""
def generate_vector2_property ( class_name , property_name , getter , setter ) :
return f """ public Vector2 { property_name }
{{
get {{ return NativeCalls.Godot { class_name } { getter } (NativePtr); }}
set {{ NativeCalls.Godot { class_name } { setter } (NativePtr, value); }}
}}
"""
def generate_bool_property ( class_name , property_name , getter , setter ) :
return f """ public bool { property_name }
{{
get {{ return NativeCalls.Godot { class_name } { getter } (NativePtr); }}
set {{ NativeCalls.Godot { class_name } { setter } (NativePtr, value); }}
}}
"""
def generate_string_property ( class_name , property_name , getter , setter ) :
return f """ public string { property_name }
{{
get {{ return NativeCalls.Godot { class_name } { getter } (NativePtr); }}
set {{ NativeCalls.Godot { class_name } { setter } (NativePtr, value); }}
}}
"""
def generate_builtin_wrappers ( generated ) :
write (
generated / " Variant.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Explicit)]
public partial struct Variant : IEquatable<Variant>
{
private const int OwnsNativePtrFlag = 1;
[StructLayout(LayoutKind.Explicit)]
private struct VariantUnion
{
[FieldOffset(0)]
public bool Bool;
[FieldOffset(0)]
public long Int;
[FieldOffset(0)]
public double Float;
[FieldOffset(0)]
public string String;
[FieldOffset(0)]
public long Rid;
[FieldOffset(0)]
public IntPtr NativePtr;
[FieldOffset(0)]
public Vector2 Vector2;
[FieldOffset(0)]
public Vector2i Vector2i;
[FieldOffset(0)]
public Vector3 Vector3;
[FieldOffset(0)]
public Vector3i Vector3i;
[FieldOffset(0)]
public Vector4 Vector4;
[FieldOffset(0)]
public Vector4i Vector4i;
[FieldOffset(0)]
public Color Color;
[FieldOffset(0)]
public Rect2 Rect2;
[FieldOffset(0)]
public Rect2i Rect2i;
[FieldOffset(0)]
public Transform2D Transform2D;
[FieldOffset(0)]
public Aabb Aabb;
[FieldOffset(0)]
public Quaternion Quaternion;
[FieldOffset(0)]
public Basis Basis;
[FieldOffset(0)]
public Transform3D Transform3D;
[FieldOffset(0)]
public Plane Plane;
[FieldOffset(0)]
public Projection Projection;
}
[FieldOffset(0)]
private Type variantType;
[FieldOffset(4)]
private int flags;
[FieldOffset(8)]
private VariantUnion data;
public Variant(bool value)
{
variantType = Type.Bool_;
flags = 0;
data = default(VariantUnion);
data.Bool = value;
}
public Variant(int value)
: this((long)value)
{
}
public Variant(long value)
{
variantType = Type.Int_;
flags = 0;
data = default(VariantUnion);
data.Int = value;
}
public Variant(float value)
: this((double)value)
{
}
public Variant(double value)
{
variantType = Type.Float_;
flags = 0;
data = default(VariantUnion);
data.Float = value;
}
public Variant(string value)
{
variantType = Type.String_;
flags = 0;
data = default(VariantUnion);
data.String = value ?? string.Empty;
}
public Variant(StringName value)
{
variantType = Type.StringName;
flags = 0;
data = default(VariantUnion);
data.String = value.ToString();
}
public Variant(NodePath value)
{
variantType = Type.NodePath;
flags = 0;
data = default(VariantUnion);
data.String = value.ToString();
}
public Variant(RID value)
{
variantType = Type.Rid;
flags = 0;
data = default(VariantUnion);
data.Rid = value.GetId();
}
public Variant(GodotObject value)
{
variantType = Type.Object_;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(Array value)
{
variantType = Type.Array;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(Dictionary value)
{
variantType = Type.Dictionary;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(PackedByteArray value)
{
variantType = Type.PackedByteArray;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(PackedInt32Array value)
{
variantType = Type.PackedInt32Array;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(PackedInt64Array value)
{
variantType = Type.PackedInt64Array;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(PackedFloat32Array value)
{
variantType = Type.PackedFloat32Array;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(PackedFloat64Array value)
{
variantType = Type.PackedFloat64Array;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(PackedStringArray value)
{
variantType = Type.PackedStringArray;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(PackedVector2Array value)
{
variantType = Type.PackedVector2Array;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(PackedVector3Array value)
{
variantType = Type.PackedVector3Array;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(PackedColorArray value)
{
variantType = Type.PackedColorArray;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(Callable value)
{
variantType = Type.Callable;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(Signal value)
{
variantType = Type.Signal;
flags = 0;
data = default(VariantUnion);
data.NativePtr = value != null ? value.NativePtr : IntPtr.Zero;
}
public Variant(Vector2 value)
{
variantType = Type.Vector2;
flags = 0;
data = default(VariantUnion);
data.Vector2 = value;
}
public Variant(Vector2i value)
{
variantType = Type.Vector2i;
flags = 0;
data = default(VariantUnion);
data.Vector2i = value;
}
public Variant(Vector3 value)
{
variantType = Type.Vector3;
flags = 0;
data = default(VariantUnion);
data.Vector3 = value;
}
public Variant(Vector3i value)
{
variantType = Type.Vector3i;
flags = 0;
data = default(VariantUnion);
data.Vector3i = value;
}
public Variant(Vector4 value)
{
variantType = Type.Vector4;
flags = 0;
data = default(VariantUnion);
data.Vector4 = value;
}
public Variant(Vector4i value)
{
variantType = Type.Vector4i;
flags = 0;
data = default(VariantUnion);
data.Vector4i = value;
}
public Variant(Projection value)
{
variantType = Type.Projection;
flags = 0;
data = default(VariantUnion);
data.Projection = value;
}
public Variant(Color value)
{
variantType = Type.Color;
flags = 0;
data = default(VariantUnion);
data.Color = value;
}
public Variant(Rect2 value)
{
variantType = Type.Rect2;
flags = 0;
data = default(VariantUnion);
data.Rect2 = value;
}
public Variant(Rect2i value)
{
variantType = Type.Rect2i;
flags = 0;
data = default(VariantUnion);
data.Rect2i = value;
}
public Variant(Transform2D value)
{
variantType = Type.Transform2d;
flags = 0;
data = default(VariantUnion);
data.Transform2D = value;
}
public Variant(Aabb value)
{
variantType = Type.Aabb;
flags = 0;
data = default(VariantUnion);
data.Aabb = value;
}
public Variant(Plane value)
{
variantType = Type.Plane;
flags = 0;
data = default(VariantUnion);
data.Plane = value;
}
public Variant(Quaternion value)
{
variantType = Type.Quaternion;
flags = 0;
data = default(VariantUnion);
data.Quaternion = value;
}
public Variant(Basis value)
{
variantType = Type.Basis;
flags = 0;
data = default(VariantUnion);
data.Basis = value;
}
public Variant(Transform3D value)
{
variantType = Type.Transform3d;
flags = 0;
data = default(VariantUnion);
data.Transform3D = value;
}
public Type VariantType
{
get { return variantType; }
}
public void Dispose()
{
if ((flags & OwnsNativePtrFlag) != 0 && data.NativePtr != IntPtr.Zero)
{
if (variantType == Type.Array || variantType == Type.Dictionary || variantType == Type.Callable || variantType == Type.Signal || variantType == Type.PackedByteArray || variantType == Type.PackedInt32Array || variantType == Type.PackedInt64Array || variantType == Type.PackedFloat32Array || variantType == Type.PackedFloat64Array || variantType == Type.PackedVector2Array || variantType == Type.PackedVector3Array || variantType == Type.PackedColorArray)
{
NativeCalls.GodotOpaqueValueDestroy(data.NativePtr);
}
else if (variantType == Type.PackedStringArray)
{
NativeCalls.GodotPackedStringArrayDestroy(data.NativePtr);
}
data.NativePtr = IntPtr.Zero;
flags = 0;
}
}
public bool AsBool()
{
return data.Bool;
}
public long AsInt64()
{
return data.Int;
}
public double AsDouble()
{
return data.Float;
}
public string AsString()
{
return data.String ?? string.Empty;
}
public StringName AsStringName()
{
return new StringName(data.String ?? string.Empty);
}
public NodePath AsNodePath()
{
return new NodePath(data.String ?? string.Empty);
}
public RID AsRID()
{
return new RID(data.Rid);
}
public T AsObject<T>() where T : GodotObject, new()
{
return GodotObject.CreateFromNative<T>(data.NativePtr);
}
public Array AsArray()
{
return Array.CreateFromNative(data.NativePtr, false);
}
public Dictionary AsDictionary()
{
return Dictionary.CreateFromNative(data.NativePtr, false);
}
public PackedByteArray AsPackedByteArray()
{
return PackedByteArray.CreateFromNative(data.NativePtr, false);
}
public PackedInt32Array AsPackedInt32Array()
{
return PackedInt32Array.CreateFromNative(data.NativePtr, false);
}
public PackedInt64Array AsPackedInt64Array()
{
return PackedInt64Array.CreateFromNative(data.NativePtr, false);
}
public PackedFloat32Array AsPackedFloat32Array()
{
return PackedFloat32Array.CreateFromNative(data.NativePtr, false);
}
public PackedFloat64Array AsPackedFloat64Array()
{
return PackedFloat64Array.CreateFromNative(data.NativePtr, false);
}
public PackedStringArray AsPackedStringArray()
{
return PackedStringArray.CreateFromNative(data.NativePtr, false);
}
public PackedVector2Array AsPackedVector2Array()
{
return PackedVector2Array.CreateFromNative(data.NativePtr, false);
}
public PackedVector3Array AsPackedVector3Array()
{
return PackedVector3Array.CreateFromNative(data.NativePtr, false);
}
public PackedColorArray AsPackedColorArray()
{
return PackedColorArray.CreateFromNative(data.NativePtr, false);
}
public Callable AsCallable()
{
return Callable.CreateFromNative(data.NativePtr, false);
}
public Signal AsSignal()
{
return Signal.CreateFromNative(data.NativePtr, false);
}
public Vector2 AsVector2()
{
return data.Vector2;
}
public Vector2i AsVector2i()
{
return data.Vector2i;
}
public Vector3 AsVector3()
{
return data.Vector3;
}
public Vector3i AsVector3i()
{
return data.Vector3i;
}
public Vector4 AsVector4()
{
return data.Vector4;
}
public Vector4i AsVector4i()
{
return data.Vector4i;
}
public Projection AsProjection()
{
return data.Projection;
}
public Color AsColor()
{
return data.Color;
}
public Rect2 AsRect2()
{
return data.Rect2;
}
public Rect2i AsRect2i()
{
return data.Rect2i;
}
public Transform2D AsTransform2D()
{
return data.Transform2D;
}
public Aabb AsAabb()
{
return data.Aabb;
}
public Plane AsPlane()
{
return data.Plane;
}
public Quaternion AsQuaternion()
{
return data.Quaternion;
}
public Basis AsBasis()
{
return data.Basis;
}
public Transform3D AsTransform3D()
{
return data.Transform3D;
}
public bool Equals(Variant other)
{
if (variantType != other.variantType)
{
return false;
}
switch (variantType)
{
case Type.Nil:
return true;
case Type.Bool_:
return data.Bool == other.data.Bool;
case Type.Int_:
return data.Int == other.data.Int;
case Type.Float_:
return data.Float == other.data.Float;
case Type.String_:
case Type.StringName:
case Type.NodePath:
return data.String == other.data.String;
case Type.Rid:
return data.Rid == other.data.Rid;
case Type.Object_:
case Type.Array:
case Type.Dictionary:
case Type.Callable:
case Type.Signal:
case Type.PackedStringArray:
case Type.PackedByteArray:
case Type.PackedInt32Array:
case Type.PackedInt64Array:
case Type.PackedFloat32Array:
case Type.PackedFloat64Array:
case Type.PackedVector2Array:
case Type.PackedVector3Array:
case Type.PackedColorArray:
return data.NativePtr == other.data.NativePtr;
case Type.Vector2:
return data.Vector2.Equals(other.data.Vector2);
case Type.Vector2i:
return data.Vector2i.Equals(other.data.Vector2i);
case Type.Vector3:
return data.Vector3.Equals(other.data.Vector3);
case Type.Vector3i:
return data.Vector3i.Equals(other.data.Vector3i);
case Type.Vector4:
return data.Vector4.Equals(other.data.Vector4);
case Type.Vector4i:
return data.Vector4i.Equals(other.data.Vector4i);
case Type.Projection:
return data.Projection.Equals(other.data.Projection);
case Type.Color:
return data.Color.Equals(other.data.Color);
case Type.Rect2:
return data.Rect2.Equals(other.data.Rect2);
case Type.Rect2i:
return data.Rect2i.Equals(other.data.Rect2i);
case Type.Transform2d:
return data.Transform2D.Equals(other.data.Transform2D);
case Type.Aabb:
return data.Aabb.Equals(other.data.Aabb);
case Type.Plane:
return data.Plane.Equals(other.data.Plane);
case Type.Quaternion:
return data.Quaternion.Equals(other.data.Quaternion);
case Type.Basis:
return data.Basis.Equals(other.data.Basis);
case Type.Transform3d:
return data.Transform3D.Equals(other.data.Transform3D);
default:
return false;
}
}
public override bool Equals(object obj)
{
return obj is Variant && Equals((Variant)obj);
}
public override int GetHashCode()
{
return ToString().GetHashCode();
}
public override string ToString()
{
return NativeCalls.GodotVariantStringify(this);
}
}
}
""" ,
)
write (
generated / " PackedStringArray.generated.cs " ,
""" // <auto-generated />
using System;
namespace Godot
{
public partial class PackedStringArray : IDisposable
{
internal IntPtr NativePtr;
private bool ownsNativePtr;
public PackedStringArray()
: this(NativeCalls.GodotPackedStringArrayCreate(), true)
{
}
public PackedStringArray(string[] values)
: this()
{
if (values == null)
{
return;
}
for (int i = 0; i < values.Length; ++i)
{
Add(values[i]);
}
}
private PackedStringArray(IntPtr nativePtr, bool ownsNativePtr)
{
NativePtr = nativePtr;
this.ownsNativePtr = ownsNativePtr;
}
internal static PackedStringArray CreateFromNative(IntPtr nativePtr)
{
return CreateFromNative(nativePtr, true);
}
internal static PackedStringArray CreateFromNative(IntPtr nativePtr, bool ownsNativePtr)
{
return nativePtr != IntPtr.Zero ? new PackedStringArray(nativePtr, ownsNativePtr) : null;
}
~PackedStringArray()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (ownsNativePtr && NativePtr != IntPtr.Zero)
{
NativeCalls.GodotPackedStringArrayDestroy(NativePtr);
NativePtr = IntPtr.Zero;
ownsNativePtr = false;
}
}
public int Count
{
get { return NativePtr != IntPtr.Zero ? NativeCalls.GodotPackedStringArraySize(NativePtr) : 0; }
}
public string this[int index]
{
get { return NativeCalls.GodotPackedStringArrayGet(NativePtr, index); }
}
public void Add(string value)
{
NativeCalls.GodotPackedStringArrayAppend(NativePtr, value);
}
public string[] ToArray()
{
string[] values = new string[Count];
for (int i = 0; i < values.Length; ++i)
{
values[i] = this[i];
}
return values;
}
}
}
""" ,
)
opaque_wrappers = sorted ( PACKED_ARRAY_TYPES | OPAQUE_VARIANT_TYPES | OPAQUE_VALUE_TYPES | { " GodotArray " } )
for wrapper_name in opaque_wrappers :
destroy_call = " NativeCalls.GodotOpaqueValueDestroy "
create_call = { " Array " : " GodotArrayCreate " , " Dictionary " : " GodotDictionaryCreate " } . get ( wrapper_name )
public_constructor = (
f """ \n public { wrapper_name } () \n : this(NativeCalls. { create_call } (), true) \n {{ \n }} \n """
if create_call is not None
else " "
)
collection_methods = " "
extra_constructor = " "
if wrapper_name == " Callable " :
extra_constructor = """
public Callable(GodotObject target, StringName method)
: this(NativeCalls.GodotCallableCreate(target != null ? target.NativePtr : IntPtr.Zero, method.ToString()), true)
{
}
public static Callable From(Action action)
{
long delegateId = CallableDelegateRegistry.Register(args => { action(); return new Variant(); });
return new Callable(NativeCalls.GodotCallableCreateDelegate(delegateId), true, delegateId);
}
public static Callable From(Func<Variant> function)
{
long delegateId = CallableDelegateRegistry.Register(args => function());
return new Callable(NativeCalls.GodotCallableCreateDelegate(delegateId), true, delegateId);
}
public static Callable From<T>(Action<T> action)
{
long delegateId = CallableDelegateRegistry.Register(args => { action(CallableDelegateRegistry.ConvertArgument<T>(args, 0)); return new Variant(); });
return new Callable(NativeCalls.GodotCallableCreateDelegate(delegateId), true, delegateId);
}
public static Callable From<T>(Func<T, Variant> function)
{
long delegateId = CallableDelegateRegistry.Register(args => function(CallableDelegateRegistry.ConvertArgument<T>(args, 0)));
return new Callable(NativeCalls.GodotCallableCreateDelegate(delegateId), true, delegateId);
}
"""
collection_methods = """
public bool IsValid()
{
return NativeCalls.GodotCallableIsValid(NativePtr);
}
public StringName GetMethod()
{
return new StringName(NativeCalls.GodotCallableGetMethod(NativePtr));
}
public Variant Call(params Variant[] varargs)
{
return NativeCalls.GodotCallableCall(NativePtr, varargs);
}
public Callable Bind(params Variant[] varargs)
{
return CreateFromNative(NativeCalls.GodotCallableBind(NativePtr, varargs));
}
"""
elif wrapper_name == " Signal " :
extra_constructor = """
public Signal(GodotObject target, StringName signal)
: this(NativeCalls.GodotSignalCreate(target != null ? target.NativePtr : IntPtr.Zero, signal.ToString()), true)
{
}
"""
collection_methods = """
public bool IsNull()
{
return NativeCalls.GodotSignalIsNull(NativePtr);
}
public StringName GetName()
{
return new StringName(NativeCalls.GodotSignalGetName(NativePtr));
}
public Error Connect(Callable callable, int flags)
{
return (Error)NativeCalls.GodotSignalConnect(NativePtr, callable != null ? callable.NativePtr : IntPtr.Zero, flags);
}
public void Emit(params Variant[] varargs)
{
NativeCalls.GodotSignalEmit(NativePtr, varargs);
}
"""
elif wrapper_name in PACKED_ARRAY_INFOS :
element_type = PACKED_ARRAY_INFOS [ wrapper_name ] [ " cs " ]
public_constructor = f """
public { wrapper_name } ()
: this(NativeCalls.Godot { wrapper_name } Create(), true)
{{
}}
"""
collection_methods = f """
public int Count
{{
get {{ return NativePtr != IntPtr.Zero ? NativeCalls.Godot { wrapper_name } Size(NativePtr) : 0; }}
}}
public { element_type } this[int index]
{{
get {{ return NativeCalls.Godot { wrapper_name } Get(NativePtr, index); }}
set {{ NativeCalls.Godot { wrapper_name } Set(NativePtr, index, value); }}
}}
public void Add( { element_type } value)
{{
NativeCalls.Godot { wrapper_name } Add(NativePtr, value);
}}
public void Clear()
{{
NativeCalls.Godot { wrapper_name } Clear(NativePtr);
}}
public { element_type } [] ToArray()
{{
{ element_type } [] values = new { element_type } [Count];
for (int i = 0; i < values.Length; ++i)
{{
values[i] = this[i];
}}
return values;
}}
"""
if wrapper_name == " Array " or wrapper_name == " GodotArray " :
collection_methods = """
public int Count
{
get { return NativePtr != IntPtr.Zero ? NativeCalls.GodotArraySize(NativePtr) : 0; }
}
public Variant this[int index]
{
get { return NativeCalls.GodotArrayGet(NativePtr, index); }
set { NativeCalls.GodotArraySet(NativePtr, index, value); }
}
public void Add(Variant value)
{
NativeCalls.GodotArrayAdd(NativePtr, value);
}
public void Insert(int index, Variant value)
{
NativeCalls.GodotArrayInsert(NativePtr, index, value);
}
public void RemoveAt(int index)
{
NativeCalls.GodotArrayRemoveAt(NativePtr, index);
}
public void Clear()
{
NativeCalls.GodotArrayClear(NativePtr);
}
public bool Contains(Variant value)
{
return NativeCalls.GodotArrayContains(NativePtr, value);
}
public int IndexOf(Variant value)
{
return NativeCalls.GodotArrayIndexOf(NativePtr, value);
}
public Variant[] ToArray()
{
Variant[] values = new Variant[Count];
for (int i = 0; i < values.Length; ++i)
{
values[i] = this[i];
}
return values;
}
public IEnumerator<Variant> GetEnumerator()
{
for (int i = 0; i < Count; ++i)
{
yield return this[i];
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
"""
elif wrapper_name == " Dictionary " :
collection_methods = """
public int Count
{
get { return NativePtr != IntPtr.Zero ? NativeCalls.GodotDictionarySize(NativePtr) : 0; }
}
public Variant this[Variant key]
{
get { return NativeCalls.GodotDictionaryGet(NativePtr, key); }
set { NativeCalls.GodotDictionarySet(NativePtr, key, value); }
}
public bool ContainsKey(Variant key)
{
return NativeCalls.GodotDictionaryContainsKey(NativePtr, key);
}
public bool Remove(Variant key)
{
return NativeCalls.GodotDictionaryRemove(NativePtr, key);
}
public void Clear()
{
NativeCalls.GodotDictionaryClear(NativePtr);
}
public Array Keys
{
get { return Array.CreateFromNative(NativeCalls.GodotDictionaryKeys(NativePtr)); }
}
public Array Values
{
get { return Array.CreateFromNative(NativeCalls.GodotDictionaryValues(NativePtr)); }
}
public IEnumerator<KeyValuePair<Variant, Variant>> GetEnumerator()
{
Array keys = Keys;
for (int i = 0; i < keys.Count; ++i)
{
Variant key = keys[i];
yield return new KeyValuePair<Variant, Variant>(key, this[key]);
}
keys.Dispose();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
"""
write (
generated / f " { wrapper_name } .generated.cs " ,
f """ // <auto-generated />
using System;
using System.Collections;
using System.Collections.Generic;
namespace Godot
{{
public partial class { wrapper_name } : IDisposable { ' , IEnumerable<Variant> ' if wrapper_name == ' Array ' or wrapper_name == ' GodotArray ' else ' , IEnumerable<KeyValuePair<Variant, Variant>> ' if wrapper_name == ' Dictionary ' else ' ' }
{{
internal IntPtr NativePtr;
private bool ownsNativePtr;
private long delegateId;
internal static { wrapper_name } CreateFromNative(IntPtr nativePtr)
{{
return nativePtr != IntPtr.Zero ? new { wrapper_name } (nativePtr, true) : null;
}}
internal static { wrapper_name } CreateFromNative(IntPtr nativePtr, bool ownsNativePtr)
{{
return nativePtr != IntPtr.Zero ? new { wrapper_name } (nativePtr, ownsNativePtr) : null;
}}
{ public_constructor } { extra_constructor }
private { wrapper_name } (IntPtr nativePtr, bool ownsNativePtr)
: this(nativePtr, ownsNativePtr, 0)
{{
}}
private { wrapper_name } (IntPtr nativePtr, bool ownsNativePtr, long delegateId)
{{
NativePtr = nativePtr;
this.ownsNativePtr = ownsNativePtr;
this.delegateId = delegateId;
}}
~ { wrapper_name } ()
{{
Dispose(false);
}}
public void Dispose()
{{
Dispose(true);
GC.SuppressFinalize(this);
}}
private void Dispose(bool disposing)
{{
if (ownsNativePtr && NativePtr != IntPtr.Zero)
{{
{ destroy_call } (NativePtr);
if (delegateId != 0)
{{
CallableDelegateRegistry.Unregister(delegateId);
delegateId = 0;
}}
NativePtr = IntPtr.Zero;
ownsNativePtr = false;
}}
}}
{ collection_methods }
}}
}}
""" ,
)
write (
generated / " StringName.generated.cs " ,
""" // <auto-generated />
using System;
namespace Godot
{
public struct StringName : IEquatable<StringName>
{
private readonly string value;
public StringName(string value)
{
this.value = value ?? string.Empty;
}
public bool Equals(StringName other)
{
return ToString() == other.ToString();
}
public override bool Equals(object obj)
{
return obj is StringName && Equals((StringName)obj);
}
public override int GetHashCode()
{
return ToString().GetHashCode();
}
public override string ToString()
{
return value ?? string.Empty;
}
public static implicit operator StringName(string value)
{
return new StringName(value);
}
public static implicit operator string(StringName value)
{
return value.ToString();
}
}
}
""" ,
)
write (
generated / " Vector2.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Vector2 : IEquatable<Vector2>
{
public float X;
public float Y;
public Vector2(float x, float y)
{
X = x;
Y = y;
}
public bool Equals(Vector2 other)
{
return X == other.X && Y == other.Y;
}
public override bool Equals(object obj)
{
return obj is Vector2 && Equals((Vector2)obj);
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode();
}
public override string ToString()
{
return " ( " + X.ToString() + " , " + Y.ToString() + " ) " ;
}
public static Vector2 One
{
get { return new Vector2(1.0f, 1.0f); }
}
public static Vector2 Zero
{
get { return new Vector2(0.0f, 0.0f); }
}
}
}
""" ,
)
write (
generated / " Vector2i.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Vector2i : IEquatable<Vector2i>
{
public int X;
public int Y;
public Vector2i(int x, int y)
{
X = x;
Y = y;
}
public bool Equals(Vector2i other)
{
return X == other.X && Y == other.Y;
}
public override bool Equals(object obj)
{
return obj is Vector2i && Equals((Vector2i)obj);
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode();
}
public override string ToString()
{
return " ( " + X.ToString() + " , " + Y.ToString() + " ) " ;
}
public static Vector2i One
{
get { return new Vector2i(1, 1); }
}
public static Vector2i Zero
{
get { return new Vector2i(0, 0); }
}
}
}
""" ,
)
write (
generated / " Vector3.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Vector3 : IEquatable<Vector3>
{
public float X;
public float Y;
public float Z;
public Vector3(float x, float y, float z)
{
X = x;
Y = y;
Z = z;
}
public bool Equals(Vector3 other)
{
return X == other.X && Y == other.Y && Z == other.Z;
}
public override bool Equals(object obj)
{
return obj is Vector3 && Equals((Vector3)obj);
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode();
}
public override string ToString()
{
return " ( " + X.ToString() + " , " + Y.ToString() + " , " + Z.ToString() + " ) " ;
}
public static Vector3 One
{
get { return new Vector3(1.0f, 1.0f, 1.0f); }
}
public static Vector3 Zero
{
get { return new Vector3(0.0f, 0.0f, 0.0f); }
}
}
}
""" ,
)
write (
generated / " Vector3i.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Vector3i : IEquatable<Vector3i>
{
public int X;
public int Y;
public int Z;
public Vector3i(int x, int y, int z)
{
X = x;
Y = y;
Z = z;
}
public bool Equals(Vector3i other)
{
return X == other.X && Y == other.Y && Z == other.Z;
}
public override bool Equals(object obj)
{
return obj is Vector3i && Equals((Vector3i)obj);
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode();
}
public override string ToString()
{
return " ( " + X.ToString() + " , " + Y.ToString() + " , " + Z.ToString() + " ) " ;
}
}
}
""" ,
)
write (
generated / " Rect2.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Rect2 : IEquatable<Rect2>
{
public Vector2 Position;
public Vector2 Size;
public Rect2(Vector2 position, Vector2 size)
{
Position = position;
Size = size;
}
public Rect2(float x, float y, float width, float height)
{
Position = new Vector2(x, y);
Size = new Vector2(width, height);
}
public bool Equals(Rect2 other)
{
return Position.Equals(other.Position) && Size.Equals(other.Size);
}
public override bool Equals(object obj)
{
return obj is Rect2 && Equals((Rect2)obj);
}
public override int GetHashCode()
{
return Position.GetHashCode() ^ Size.GetHashCode();
}
public override string ToString()
{
return " ( " + Position.ToString() + " , " + Size.ToString() + " ) " ;
}
}
}
""" ,
)
write (
generated / " Rect2i.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Rect2i : IEquatable<Rect2i>
{
public Vector2i Position;
public Vector2i Size;
public Rect2i(Vector2i position, Vector2i size)
{
Position = position;
Size = size;
}
public Rect2i(int x, int y, int width, int height)
{
Position = new Vector2i(x, y);
Size = new Vector2i(width, height);
}
public bool Equals(Rect2i other)
{
return Position.Equals(other.Position) && Size.Equals(other.Size);
}
public override bool Equals(object obj)
{
return obj is Rect2i && Equals((Rect2i)obj);
}
public override int GetHashCode()
{
return Position.GetHashCode() ^ Size.GetHashCode();
}
public override string ToString()
{
return " ( " + Position.ToString() + " , " + Size.ToString() + " ) " ;
}
}
}
""" ,
)
write (
generated / " Transform2D.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Transform2D : IEquatable<Transform2D>
{
public Vector2 X;
public Vector2 Y;
public Vector2 Origin;
public Transform2D(Vector2 x, Vector2 y, Vector2 origin)
{
X = x;
Y = y;
Origin = origin;
}
public bool Equals(Transform2D other)
{
return X.Equals(other.X) && Y.Equals(other.Y) && Origin.Equals(other.Origin);
}
public override bool Equals(object obj)
{
return obj is Transform2D && Equals((Transform2D)obj);
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode() ^ Origin.GetHashCode();
}
public override string ToString()
{
return " ( " + X.ToString() + " , " + Y.ToString() + " , " + Origin.ToString() + " ) " ;
}
public static Transform2D Identity
{
get { return new Transform2D(new Vector2(1.0f, 0.0f), new Vector2(0.0f, 1.0f), Vector2.Zero); }
}
}
}
""" ,
)
write (
generated / " Aabb.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Aabb : IEquatable<Aabb>
{
public Vector3 Position;
public Vector3 Size;
public Aabb(Vector3 position, Vector3 size)
{
Position = position;
Size = size;
}
public bool Equals(Aabb other)
{
return Position.Equals(other.Position) && Size.Equals(other.Size);
}
public override bool Equals(object obj)
{
return obj is Aabb && Equals((Aabb)obj);
}
public override int GetHashCode()
{
return Position.GetHashCode() ^ Size.GetHashCode();
}
public override string ToString()
{
return " ( " + Position.ToString() + " , " + Size.ToString() + " ) " ;
}
}
}
""" ,
)
write (
generated / " Quaternion.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Quaternion : IEquatable<Quaternion>
{
public float X;
public float Y;
public float Z;
public float W;
public Quaternion(float x, float y, float z, float w)
{
X = x;
Y = y;
Z = z;
W = w;
}
public bool Equals(Quaternion other)
{
return X == other.X && Y == other.Y && Z == other.Z && W == other.W;
}
public override bool Equals(object obj)
{
return obj is Quaternion && Equals((Quaternion)obj);
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode() ^ W.GetHashCode();
}
public override string ToString()
{
return " ( " + X.ToString() + " , " + Y.ToString() + " , " + Z.ToString() + " , " + W.ToString() + " ) " ;
}
public static Quaternion Identity
{
get { return new Quaternion(0.0f, 0.0f, 0.0f, 1.0f); }
}
}
}
""" ,
)
write (
generated / " Basis.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Basis : IEquatable<Basis>
{
public Vector3 X;
public Vector3 Y;
public Vector3 Z;
public Basis(Vector3 x, Vector3 y, Vector3 z)
{
X = x;
Y = y;
Z = z;
}
public bool Equals(Basis other)
{
return X.Equals(other.X) && Y.Equals(other.Y) && Z.Equals(other.Z);
}
public override bool Equals(object obj)
{
return obj is Basis && Equals((Basis)obj);
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode();
}
public override string ToString()
{
return " ( " + X.ToString() + " , " + Y.ToString() + " , " + Z.ToString() + " ) " ;
}
public static Basis Identity
{
get { return new Basis(new Vector3(1.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f), new Vector3(0.0f, 0.0f, 1.0f)); }
}
}
}
""" ,
)
write (
generated / " Transform3D.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Transform3D : IEquatable<Transform3D>
{
public Basis Basis;
public Vector3 Origin;
public Transform3D(Basis basis, Vector3 origin)
{
Basis = basis;
Origin = origin;
}
public bool Equals(Transform3D other)
{
return Basis.Equals(other.Basis) && Origin.Equals(other.Origin);
}
public override bool Equals(object obj)
{
return obj is Transform3D && Equals((Transform3D)obj);
}
public override int GetHashCode()
{
return Basis.GetHashCode() ^ Origin.GetHashCode();
}
public override string ToString()
{
return " ( " + Basis.ToString() + " , " + Origin.ToString() + " ) " ;
}
public static Transform3D Identity
{
get { return new Transform3D(Basis.Identity, Vector3.Zero); }
}
}
}
""" ,
)
write (
generated / " Vector4.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Vector4 : IEquatable<Vector4>
{
public float X;
public float Y;
public float Z;
public float W;
public Vector4(float x, float y, float z, float w)
{
X = x;
Y = y;
Z = z;
W = w;
}
public bool Equals(Vector4 other)
{
return X == other.X && Y == other.Y && Z == other.Z && W == other.W;
}
public override bool Equals(object obj)
{
return obj is Vector4 && Equals((Vector4)obj);
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode() ^ W.GetHashCode();
}
public override string ToString()
{
return " ( " + X.ToString() + " , " + Y.ToString() + " , " + Z.ToString() + " , " + W.ToString() + " ) " ;
}
}
}
""" ,
)
write (
generated / " Vector4i.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Vector4i : IEquatable<Vector4i>
{
public int X;
public int Y;
public int Z;
public int W;
public Vector4i(int x, int y, int z, int w)
{
X = x;
Y = y;
Z = z;
W = w;
}
public bool Equals(Vector4i other)
{
return X == other.X && Y == other.Y && Z == other.Z && W == other.W;
}
public override bool Equals(object obj)
{
return obj is Vector4i && Equals((Vector4i)obj);
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode() ^ W.GetHashCode();
}
public override string ToString()
{
return " ( " + X.ToString() + " , " + Y.ToString() + " , " + Z.ToString() + " , " + W.ToString() + " ) " ;
}
}
}
""" ,
)
write (
generated / " Plane.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Plane : IEquatable<Plane>
{
public Vector3 Normal;
public float D;
public Plane(Vector3 normal, float d)
{
Normal = normal;
D = d;
}
public bool Equals(Plane other)
{
return Normal.Equals(other.Normal) && D == other.D;
}
public override bool Equals(object obj)
{
return obj is Plane && Equals((Plane)obj);
}
public override int GetHashCode()
{
return Normal.GetHashCode() ^ D.GetHashCode();
}
public override string ToString()
{
return " ( " + Normal.ToString() + " , " + D.ToString() + " ) " ;
}
}
}
""" ,
)
write (
generated / " Projection.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Projection : IEquatable<Projection>
{
public Vector4 X;
public Vector4 Y;
public Vector4 Z;
public Vector4 W;
public Projection(Vector4 x, Vector4 y, Vector4 z, Vector4 w)
{
X = x;
Y = y;
Z = z;
W = w;
}
public bool Equals(Projection other)
{
return X.Equals(other.X) && Y.Equals(other.Y) && Z.Equals(other.Z) && W.Equals(other.W);
}
public override bool Equals(object obj)
{
return obj is Projection && Equals((Projection)obj);
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode() ^ W.GetHashCode();
}
public override string ToString()
{
return " ( " + X.ToString() + " , " + Y.ToString() + " , " + Z.ToString() + " , " + W.ToString() + " ) " ;
}
}
}
""" ,
)
write (
generated / " Color.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public partial struct Color : IEquatable<Color>
{
public float R;
public float G;
public float B;
public float A;
public Color(float r, float g, float b, float a)
{
R = r;
G = g;
B = b;
A = a;
}
public bool Equals(Color other)
{
return R == other.R && G == other.G && B == other.B && A == other.A;
}
public override bool Equals(object obj)
{
return obj is Color && Equals((Color)obj);
}
public override int GetHashCode()
{
return R.GetHashCode() ^ G.GetHashCode() ^ B.GetHashCode() ^ A.GetHashCode();
}
public override string ToString()
{
return " ( " + R.ToString() + " , " + G.ToString() + " , " + B.ToString() + " , " + A.ToString() + " ) " ;
}
public static Color White
{
get { return new Color(1.0f, 1.0f, 1.0f, 1.0f); }
}
public static Color Transparent
{
get { return new Color(0.0f, 0.0f, 0.0f, 0.0f); }
}
}
}
""" ,
)
write (
generated / " RID.generated.cs " ,
""" // <auto-generated />
using System;
using System.Runtime.InteropServices;
namespace Godot
{
[StructLayout(LayoutKind.Sequential)]
public struct RID : IEquatable<RID>
{
private readonly long id;
public RID(long id)
{
this.id = id;
}
public bool IsValid()
{
return id != 0;
}
public long GetId()
{
return id;
}
public bool Equals(RID other)
{
return id == other.id;
}
public override bool Equals(object obj)
{
return obj is RID && Equals((RID)obj);
}
public override int GetHashCode()
{
return id.GetHashCode();
}
public override string ToString()
{
return id.ToString();
}
}
}
""" ,
)
write (
generated / " NodePath.generated.cs " ,
""" // <auto-generated />
using System;
namespace Godot
{
public struct NodePath : IEquatable<NodePath>
{
private readonly string value;
public NodePath(string value)
{
this.value = value ?? string.Empty;
}
public bool Equals(NodePath other)
{
return ToString() == other.ToString();
}
public override bool Equals(object obj)
{
return obj is NodePath && Equals((NodePath)obj);
}
public override int GetHashCode()
{
return ToString().GetHashCode();
}
public override string ToString()
{
return value ?? string.Empty;
}
public static implicit operator NodePath(string value)
{
return new NodePath(value);
}
public static implicit operator string(NodePath value)
{
return value.ToString();
}
}
}
""" ,
)
def screaming_enum_prefix ( enum_name ) :
result = [ ]
for char in enum_name :
if char . isupper ( ) and result :
result . append ( " _ " )
result . append ( char . upper ( ) )
return " " . join ( result )
def enum_member_name ( enum_name , value_name ) :
prefix = screaming_enum_prefix ( enum_name )
short_name = value_name
if short_name . startswith ( prefix + " _ " ) :
short_name = short_name [ len ( prefix ) + 1 : ]
if short_name . startswith ( " FLAG_ " ) :
short_name = short_name [ 5 : ]
return pascal_name ( short_name . lower ( ) )
def generate_enum_declarations ( class_entry ) :
declarations = [ ]
seen_enum_names = set ( )
for enum_entry in class_entry . get ( " enums " , [ ] ) :
enum_name = cs_identifier ( enum_entry [ " name " ] , " GodotEnum " )
if enum_name in seen_enum_names :
continue
seen_enum_names . add ( enum_name )
if enum_entry . get ( " is_bitfield " ) :
declarations . append ( " [Flags] " )
declarations . append ( f " public enum { enum_name } : long " )
else :
declarations . append ( f " public enum { enum_name } " )
declarations . append ( " { " )
seen_value_names = set ( )
for value in enum_entry . get ( " values " , [ ] ) :
member_name = enum_member_name ( enum_entry [ " name " ] , value [ " name " ] )
if member_name in seen_value_names :
member_name = f " { member_name } _ { value [ ' value ' ] } "
seen_value_names . add ( member_name )
declarations . append ( f " { member_name } = { value [ ' value ' ] } , " )
declarations . append ( " } " )
return " \n " . join ( declarations )
def generate_standalone_nested_enum_declarations ( type_name , enums ) :
lines = [ f " public partial struct { cs_identifier ( type_name , ' GodotBuiltin ' ) } " , " { " ]
seen_enum_names = set ( )
for enum_entry in enums :
enum_name = cs_identifier ( enum_entry [ " name " ] , " GodotEnum " )
if enum_name in seen_enum_names :
continue
seen_enum_names . add ( enum_name )
if enum_entry . get ( " is_bitfield " ) :
lines . append ( " [Flags] " )
lines . append ( f " public enum { enum_name } : long " )
else :
lines . append ( f " public enum { enum_name } " )
lines . append ( " { " )
seen_value_names = set ( )
for value in enum_entry . get ( " values " , [ ] ) :
member_name = enum_member_name ( enum_entry [ " name " ] , value [ " name " ] )
if member_name in seen_value_names :
member_name = f " { member_name } _ { value [ ' value ' ] } "
seen_value_names . add ( member_name )
lines . append ( f " { member_name } = { value [ ' value ' ] } , " )
lines . append ( " } " )
lines . append ( " } " )
return lines
def generate_builtin_enums ( builtin_classes , generated ) :
lines = [ " // <auto-generated /> " , " using System; " , " " , " namespace Godot " , " { " ]
for builtin_class in builtin_classes :
enums = builtin_class . get ( " enums " , [ ] )
if not enums :
continue
lines . extend ( generate_standalone_nested_enum_declarations ( builtin_class [ " name " ] , enums ) )
lines . extend ( [ " } " , " " ] )
write ( generated / " BuiltinEnums.generated.cs " , " \n " . join ( lines ) )
def generate_global_enums ( global_enums , generated ) :
lines = [ " // <auto-generated /> " , " using System; " , " " , " namespace Godot " , " { " ]
nested_enums = { }
for enum_entry in global_enums :
enum_name = cs_identifier ( enum_entry [ " name " ] , " GodotEnum " )
if " . " in enum_entry [ " name " ] :
container_name , nested_name = enum_entry [ " name " ] . split ( " . " , 1 )
nested_entry = dict ( enum_entry )
nested_entry [ " name " ] = nested_name
nested_enums . setdefault ( container_name , [ ] ) . append ( nested_entry )
continue
if enum_entry . get ( " is_bitfield " ) :
lines . append ( " [Flags] " )
lines . append ( f " public enum { enum_name } : long " )
else :
lines . append ( f " public enum { enum_name } " )
lines . append ( " { " )
seen_value_names = set ( )
for value in enum_entry . get ( " values " , [ ] ) :
member_name = enum_member_name ( enum_entry [ " name " ] , value [ " name " ] )
if member_name in seen_value_names :
member_name = f " { member_name } _ { value [ ' value ' ] } "
seen_value_names . add ( member_name )
lines . append ( f " { member_name } = { value [ ' value ' ] } , " )
lines . append ( " } " )
for container_name , enums in nested_enums . items ( ) :
lines . extend ( generate_standalone_nested_enum_declarations ( container_name , enums ) )
lines . extend ( [ " } " , " " ] )
write ( generated / " GlobalEnums.generated.cs " , " \n " . join ( lines ) )
def generate_managed ( classes , class_order , global_enums , builtin_classes , methods , managed_dir ) :
generated = managed_dir / " Generated "
generated . mkdir ( parents = True , exist_ok = True )
for stale_file in generated . glob ( " *.generated.cs " ) :
stale_file . unlink ( )
generate_builtin_wrappers ( generated )
generate_builtin_enums ( builtin_classes , generated )
generate_global_enums ( global_enums , generated )
by_class = { name : [ ] for name in class_order }
for method in methods :
by_class [ method . class_name ] . append ( method )
for class_name in class_order :
cs_name = cs_class_name ( class_name )
lines = [ " // <auto-generated /> " , " using System; " , " " , " namespace Godot " , " { " , f " public partial class { cs_name } { managed_base_clause ( class_name , classes ) } " , " { " ]
enum_declarations = generate_enum_declarations ( classes [ class_name ] )
if enum_declarations :
lines . append ( enum_declarations )
if class_name == " Node " :
lines . append ( generate_node_name_property ( ) . rstrip ( ) )
if class_name == " Node2D " :
lines . append ( generate_node2d_vector2_property ( " Position " , " GetPosition " , " SetPosition " ) . rstrip ( ) )
lines . append ( generate_node2d_vector2_property ( " GlobalPosition " , " GetGlobalPosition " , " SetGlobalPosition " ) . rstrip ( ) )
lines . append ( generate_node2d_vector2_property ( " Scale " , " GetScale " , " SetScale " ) . rstrip ( ) )
if class_name == " Control " :
lines . append ( generate_vector2_property ( " Control " , " Position " , " GetPosition " , " SetPosition " ) . rstrip ( ) )
lines . append ( generate_vector2_property ( " Control " , " Size " , " GetSize " , " SetSize " ) . rstrip ( ) )
if class_name == " Label " :
lines . append ( generate_string_property ( " Label " , " Text " , " GetText " , " SetText " ) . rstrip ( ) )
if class_name == " Sprite2D " :
lines . append ( generate_bool_property ( " Sprite2D " , " Centered " , " IsCentered " , " SetCentered " ) . rstrip ( ) )
lines . append ( generate_vector2_property ( " Sprite2D " , " Offset " , " GetOffset " , " SetOffset " ) . rstrip ( ) )
lines . append ( generate_bool_property ( " Sprite2D " , " FlipH " , " IsFlippedH " , " SetFlipH " ) . rstrip ( ) )
lines . append ( generate_bool_property ( " Sprite2D " , " FlipV " , " IsFlippedV " , " SetFlipV " ) . rstrip ( ) )
for method in by_class [ class_name ] :
generated_method = generate_managed_method ( method )
if generated_method :
lines . append ( generated_method . rstrip ( ) )
lines . extend ( [ " } " , " } " , " " ] )
write ( generated / f " { cs_name } .generated.cs " , " \n " . join ( lines ) )
native_call_lines = [
" // <auto-generated /> " ,
" using System; " ,
" using System.Runtime.CompilerServices; " ,
" " ,
" namespace Godot " ,
" { " ,
" internal static partial class NativeCalls " ,
" { " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotObjectReleaseRefCounted(IntPtr nativePtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern string GodotVariantStringify(Variant variant); " ,
" " , " [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotCallableCreate(IntPtr targetPtr, string method); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotCallableCreateDelegate(long delegateId); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern bool GodotCallableIsValid(IntPtr callablePtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern string GodotCallableGetMethod(IntPtr callablePtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern Variant GodotCallableCall(IntPtr callablePtr, Variant[] varargs); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotCallableBind(IntPtr callablePtr, Variant[] varargs); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotSignalCreate(IntPtr targetPtr, string signal); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern bool GodotSignalIsNull(IntPtr signalPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern string GodotSignalGetName(IntPtr signalPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotSignalConnect(IntPtr signalPtr, IntPtr callablePtr, int flags); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotSignalEmit(IntPtr signalPtr, Variant[] varargs); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotPackedStringArrayCreate(); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedStringArrayDestroy(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotPackedStringArraySize(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern string GodotPackedStringArrayGet(IntPtr arrayPtr, int index); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedStringArrayAppend(IntPtr arrayPtr, string value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotPackedByteArrayCreate(); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotPackedByteArraySize(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern byte GodotPackedByteArrayGet(IntPtr arrayPtr, int index); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedByteArraySet(IntPtr arrayPtr, int index, byte value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedByteArrayAdd(IntPtr arrayPtr, byte value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedByteArrayClear(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotPackedInt32ArrayCreate(); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotPackedInt32ArraySize(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotPackedInt32ArrayGet(IntPtr arrayPtr, int index); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedInt32ArraySet(IntPtr arrayPtr, int index, int value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedInt32ArrayAdd(IntPtr arrayPtr, int value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedInt32ArrayClear(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotPackedInt64ArrayCreate(); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotPackedInt64ArraySize(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern long GodotPackedInt64ArrayGet(IntPtr arrayPtr, int index); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedInt64ArraySet(IntPtr arrayPtr, int index, long value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedInt64ArrayAdd(IntPtr arrayPtr, long value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedInt64ArrayClear(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotPackedFloat32ArrayCreate(); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotPackedFloat32ArraySize(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern float GodotPackedFloat32ArrayGet(IntPtr arrayPtr, int index); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedFloat32ArraySet(IntPtr arrayPtr, int index, float value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedFloat32ArrayAdd(IntPtr arrayPtr, float value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedFloat32ArrayClear(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotPackedFloat64ArrayCreate(); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotPackedFloat64ArraySize(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern double GodotPackedFloat64ArrayGet(IntPtr arrayPtr, int index); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedFloat64ArraySet(IntPtr arrayPtr, int index, double value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedFloat64ArrayAdd(IntPtr arrayPtr, double value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedFloat64ArrayClear(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotPackedVector2ArrayCreate(); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotPackedVector2ArraySize(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern Vector2 GodotPackedVector2ArrayGet(IntPtr arrayPtr, int index); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedVector2ArraySet(IntPtr arrayPtr, int index, Vector2 value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedVector2ArrayAdd(IntPtr arrayPtr, Vector2 value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedVector2ArrayClear(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotPackedVector3ArrayCreate(); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotPackedVector3ArraySize(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern Vector3 GodotPackedVector3ArrayGet(IntPtr arrayPtr, int index); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedVector3ArraySet(IntPtr arrayPtr, int index, Vector3 value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedVector3ArrayAdd(IntPtr arrayPtr, Vector3 value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedVector3ArrayClear(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotPackedColorArrayCreate(); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotPackedColorArraySize(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern Color GodotPackedColorArrayGet(IntPtr arrayPtr, int index); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedColorArraySet(IntPtr arrayPtr, int index, Color value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedColorArrayAdd(IntPtr arrayPtr, Color value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotPackedColorArrayClear(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotOpaqueValueDestroy(IntPtr valuePtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotArrayCreate(); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotArraySize(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern Variant GodotArrayGet(IntPtr arrayPtr, int index); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotArraySet(IntPtr arrayPtr, int index, Variant value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotArrayAdd(IntPtr arrayPtr, Variant value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotArrayInsert(IntPtr arrayPtr, int index, Variant value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotArrayRemoveAt(IntPtr arrayPtr, int index); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotArrayClear(IntPtr arrayPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern bool GodotArrayContains(IntPtr arrayPtr, Variant value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotArrayIndexOf(IntPtr arrayPtr, Variant value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotDictionaryCreate(); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern int GodotDictionarySize(IntPtr dictionaryPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern bool GodotDictionaryContainsKey(IntPtr dictionaryPtr, Variant key); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern Variant GodotDictionaryGet(IntPtr dictionaryPtr, Variant key); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotDictionarySet(IntPtr dictionaryPtr, Variant key, Variant value); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern bool GodotDictionaryRemove(IntPtr dictionaryPtr, Variant key); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern void GodotDictionaryClear(IntPtr dictionaryPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotDictionaryKeys(IntPtr dictionaryPtr); " ,
" " ,
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
" internal static extern IntPtr GodotDictionaryValues(IntPtr dictionaryPtr); " ,
" " ,
]
for method in methods :
if method . return_type . category in { " packed_string_array " , " packed_array " , " opaque_variant " , " typed_array " , " opaque_value " , " object " , " refcounted " } :
return_type = " IntPtr "
elif method . return_type . category == " variant " :
return_type = " Variant "
elif method . return_type . category == " string " :
return_type = " string "
elif method . return_type . category == " enum " :
return_type = " int "
elif method . return_type . category == " bitfield " :
return_type = " long "
elif method . return_type . category in { " vector2 " , " vector2i " , " vector3 " , " vector3i " , " color " , " rect2 " , " rect2i " , " transform2d " , " aabb " , " quaternion " , " basis " , " transform3d " , " vector4 " , " vector4i " , " plane " , " projection " , " rid " } :
return_type = method . return_type . managed_type
else :
return_type = method . return_type . managed_type if method . return_type . category != " void " else " void "
args = [ ] if method . is_static else [ " IntPtr nativePtr " ]
for arg in method . args :
if arg [ " type " ] . category == " variant " :
args . append ( f " Variant { camel_name ( arg [ ' name ' ] ) } " )
elif arg [ " type " ] . category in { " packed_string_array " , " packed_array " , " opaque_variant " , " typed_array " , " opaque_value " } :
args . append ( f " IntPtr { camel_name ( arg [ ' name ' ] ) } Ptr " )
elif arg [ " type " ] . category == " native_pointer " :
args . append ( f " IntPtr { camel_name ( arg [ ' name ' ] ) } " )
elif arg [ " type " ] . category in { " object " , " refcounted " } :
args . append ( f " IntPtr { camel_name ( arg [ ' name ' ] ) } Ptr " )
elif arg [ " type " ] . category == " string " :
args . append ( f " string { camel_name ( arg [ ' name ' ] ) } " )
elif arg [ " type " ] . category == " enum " :
args . append ( f " int { camel_name ( arg [ ' name ' ] ) } " )
elif arg [ " type " ] . category == " bitfield " :
args . append ( f " long { camel_name ( arg [ ' name ' ] ) } " )
elif arg [ " type " ] . category in { " vector2 " , " vector2i " , " vector3 " , " vector3i " , " color " , " rect2 " , " rect2i " , " transform2d " , " aabb " , " quaternion " , " basis " , " transform3d " , " vector4 " , " vector4i " , " plane " , " projection " , " rid " } :
args . append ( f " { arg [ ' type ' ] . managed_type } { camel_name ( arg [ ' name ' ] ) } " )
else :
args . append ( managed_arg_declaration ( arg ) )
if method . is_vararg :
args . append ( " Variant[] varargs " )
native_call_lines . extend (
[
" [MethodImpl(MethodImplOptions.InternalCall)] " ,
f " internal static extern { return_type } Godot { method . cs_class_name } { method . icall_suffix } ( { ' , ' . join ( args ) } ); " ,
" " ,
]
)
native_call_lines . extend ( [ " } " , " } " , " " ] )
write ( generated / " NativeCalls.generated.cs " , " \n " . join ( native_call_lines ) )
def cpp_cast_type ( type_info ) :
return type_info . cpp_type
def cpp_return_statement ( method , call ) :
category = method . return_type . category
if category == " void " :
return f " { call } ; \n return leanclr::core::Unit {{ }} ; "
if category == " string " :
return f " return to_rt_string( { call } ); "
if category == " variant " :
return f " return to_managed_variant( { call } ); "
if category == " packed_string_array " :
return f " return new_packed_string_array( { call } ); "
if category in { " packed_array " , " opaque_variant " , " typed_array " , " opaque_value " } :
return f " return new_opaque_value( { call } ); "
if category == " object " :
return f " return reinterpret_cast<intptr_t>( { call } ); "
if category == " native_pointer " :
return f " return reinterpret_cast<intptr_t>( { call } ); "
if category == " refcounted " :
return f " return retain_refcounted( { call } ); "
if category == " enum " :
return f " return static_cast<int32_t>( { call } ); "
if category == " bitfield " :
return f " return static_cast<int64_t>( { call } ); "
if category == " float " :
return f " return static_cast<float>( { call } ); "
return f " return { call } ; "
def cpp_native_param_declaration ( arg ) :
name = camel_name ( arg [ " name " ] )
typ = arg [ " type " ]
if typ . category == " string " :
return f " leanclr::vm::RtString* p_ { name } "
if typ . category == " variant " :
return f " ManagedVariant p_ { name } "
if typ . category in { " packed_string_array " , " packed_array " , " opaque_variant " , " typed_array " , " opaque_value " } :
return f " intptr_t p_ { name } _ptr "
if typ . category == " native_pointer " :
return f " intptr_t p_ { name } "
if typ . category in { " object " , " refcounted " } :
return f " intptr_t p_ { name } _ptr "
if typ . category == " enum " :
return f " int32_t p_ { name } "
if typ . category == " bitfield " :
return f " int64_t p_ { name } "
return f " { typ . native_type } p_ { name } "
def cpp_call_arg ( arg ) :
name = camel_name ( arg [ " name " ] )
typ = arg [ " type " ]
if typ . category == " string " :
if typ . cpp_type == " StringName " :
return f " StringName(rt_string_to_godot(p_ { name } )) "
if typ . cpp_type == " NodePath " :
return f " NodePath(rt_string_to_godot(p_ { name } )) "
return f " rt_string_to_godot(p_ { name } ) "
if typ . category == " variant " :
return f " variant_arg(p_ { name } ) "
if typ . category == " packed_string_array " :
return f " packed_string_array_arg(p_ { name } _ptr) "
if typ . category in { " packed_array " , " opaque_variant " , " typed_array " , " opaque_value " } :
return f " opaque_value_arg< { typ . cpp_type } >(p_ { name } _ptr) "
if typ . category == " native_pointer " :
return f " reinterpret_cast< { typ . cpp_type } >(p_ { name } ) "
if typ . category == " object " :
return f " as_godot_object< { cpp_cast_type ( typ ) } >(p_ { name } _ptr) "
if typ . category == " refcounted " :
return f " Ref< { cpp_cast_type ( typ ) } >(as_godot_object< { cpp_cast_type ( typ ) } >(p_ { name } _ptr)) "
if typ . category == " enum " :
return f " static_cast< { typ . cpp_type } >(p_ { name } ) "
if typ . category == " bitfield " :
return f " { typ . cpp_type } (p_ { name } ) "
if typ . category == " int " and typ . cpp_type and typ . cpp_type != typ . native_type :
return f " static_cast< { typ . cpp_type } >(p_ { name } ) "
return f " p_ { name } "
def cpp_self_type ( method ) :
return " Object " if method . class_name == " Object " else method . cpp_class_name
def append_formal_vararg ( array_name , arg ) :
category = arg [ " type " ] . category
expression = cpp_call_arg ( arg )
if category == " void " :
return " "
if category == " enum " :
expression = f " static_cast<int32_t>( { expression } ) "
if category == " bitfield " :
expression = f " static_cast<int64_t>( { expression } ) "
return f " { array_name } .append(Variant( { expression } )); "
def vararg_return_statement ( method , result_name ) :
category = method . return_type . category
if category == " void " :
return " return leanclr::core::Unit {} ; "
if category == " variant " :
return f " return to_managed_variant( { result_name } ); "
if category == " enum " :
return f " return static_cast<int32_t>(static_cast<int64_t>( { result_name } )); "
if category == " bitfield " :
return f " return static_cast<int64_t>( { result_name } ); "
if category == " bool " :
return f " return static_cast<bool>( { result_name } ); "
if category == " int " :
return f " return static_cast<int64_t>( { result_name } ); "
if category == " float " :
return f " return static_cast<float>(static_cast<double>( { result_name } )); "
if category == " string " :
return f " return to_rt_string(static_cast<String>( { result_name } )); "
if category in { " object " , " refcounted " } :
return f " return reinterpret_cast<intptr_t>(static_cast<Object*>( { result_name } )); "
return f " return { method . return_type . native_type } (); "
def generate_native_vararg_method_function ( method ) :
fn = native_function_name ( method )
params = ( [ ] if method . is_static else [ " intptr_t p_native_ptr " ] ) + [ cpp_native_param_declaration ( arg ) for arg in method . args ] + [ " leanclr::vm::RtArray* p_varargs " ]
self_type = " Object "
setup_lines = [ ]
if not method . is_static :
setup_lines . extend (
[
f " { self_type } * self = as_godot_object< { self_type } >(p_native_ptr); " ,
" if (self == nullptr) " ,
" { " ,
f " { { ' void ' : ' return leanclr::core::Unit {} ; ' , ' variant ' : ' return to_managed_variant(Variant()); ' , ' enum ' : ' return 0; ' } . get ( method . return_type . category , ' return ' + method . return_type . native_type + ' (); ' ) } " ,
" } " ,
" " ,
]
)
setup_lines . append ( " Array args; " )
if method . class_name == " Object " and method . api_name == " call " :
call_method = " rt_string_to_godot(p_method) "
else :
call_method = f " StringName( \" { method . api_name } \" ) "
for arg in method . args :
setup_lines . append ( append_formal_vararg ( " args " , arg ) )
setup_lines . append ( " append_managed_varargs(args, p_varargs); " )
2026-06-07 22:55:56 +08:00
if method . is_static and method . class_name in SINGLETON_CLASS_CPP_NAMES :
target = f " { method . cpp_class_name } ::get_singleton() "
else :
target = method . cpp_class_name if method . is_static else " self "
2026-05-10 22:29:56 +08:00
if method . return_type . category == " void " :
call_lines = [ f " { target } ->callv( { call_method } , args); " , * vararg_return_statement ( method , " result " ) . splitlines ( ) ]
else :
call_lines = [ f " Variant result = { target } ->callv( { call_method } , args); " , * vararg_return_statement ( method , " result " ) . splitlines ( ) ]
return f """ { method . return_type . native_type } { fn } ( { ' , ' . join ( params ) } ) noexcept
{{
{ chr ( 10 ) . join ( line for line in setup_lines if line is not None ) }
{ chr ( 10 ) . join ( call_lines ) }
}}
"""
def generate_native_method_function ( method ) :
fn = native_function_name ( method )
if method . is_vararg :
return generate_native_vararg_method_function ( method )
params = ( [ ] if method . is_static else [ " intptr_t p_native_ptr " ] ) + [ cpp_native_param_declaration ( arg ) for arg in method . args ]
call_args = " , " . join ( cpp_call_arg ( arg ) for arg in method . args )
if method . is_static :
2026-06-07 22:55:56 +08:00
if method . class_name in SINGLETON_CLASS_CPP_NAMES :
# godot-cpp 4.5 exposes ClassDB methods as non-static on
# ClassDBSingleton; route them through the singleton instance.
target = f " { method . cpp_class_name } ::get_singleton() "
call = f " { target } -> { method . cpp_name } ( { call_args } ) " if call_args else f " { target } -> { method . cpp_name } () "
else :
call = f " { method . cpp_class_name } :: { method . cpp_name } ( { call_args } ) " if call_args else f " { method . cpp_class_name } :: { method . cpp_name } () "
2026-05-10 22:29:56 +08:00
return f """ { method . return_type . native_type } { fn } ( { ' , ' . join ( params ) } ) noexcept
{{
{ cpp_return_statement ( method , call ) }
}}
"""
self_type = cpp_self_type ( method )
call = f " self-> { method . cpp_name } ( { call_args } ) " if call_args else f " self-> { method . cpp_name } () "
null_return = {
" void " : " return leanclr::core::Unit {} ; " ,
" string " : " return leanclr::vm::String::get_empty_string(); " ,
" variant " : " return to_managed_variant(Variant()); " ,
" packed_string_array " : " return new_packed_string_array(PackedStringArray()); " ,
" packed_array " : f " return 0; " ,
" opaque_variant " : f " return 0; " ,
" typed_array " : f " return 0; " ,
" opaque_value " : f " return 0; " ,
" object " : " return 0; " ,
" native_pointer " : " return 0; " ,
" refcounted " : " return 0; " ,
" bool " : " return false; " ,
" int " : " return 0; " ,
" float " : " return 0.0f; " ,
" enum " : " return 0; " ,
" bitfield " : " return 0; " ,
" vector2 " : " return Vector2(); " ,
" vector2i " : " return Vector2i(); " ,
" vector3 " : " return Vector3(); " ,
" vector3i " : " return Vector3i(); " ,
" color " : " return Color(); " ,
" rect2 " : " return Rect2(); " ,
" rect2i " : " return Rect2i(); " ,
" transform2d " : " return Transform2D(); " ,
" aabb " : " return AABB(); " ,
" quaternion " : " return Quaternion(); " ,
" basis " : " return Basis(); " ,
" transform3d " : " return Transform3D(); " ,
" vector4 " : " return Vector4(); " ,
" vector4i " : " return Vector4i(); " ,
" plane " : " return Plane(); " ,
" projection " : " return Projection(); " ,
" rid " : " return RID(); " ,
} [ method . return_type . category ]
return f """ { method . return_type . native_type } { fn } ( { ' , ' . join ( params ) } ) noexcept
{{
{ self_type } * self = as_godot_object< { self_type } >(p_native_ptr);
if (self == nullptr)
{{
{ null_return }
}}
{ cpp_return_statement ( method , call ) }
}}
"""
def cpp_invoker_param_get ( arg , index ) :
name = camel_name ( arg [ " name " ] )
typ = arg [ " type " ]
if typ . category == " variant " :
return f " ManagedVariant arg_ { name } = leanclr::interp::EvalStackOp::get_param<ManagedVariant>(p_params, { index } ); "
if typ . category in { " packed_string_array " , " packed_array " , " opaque_variant " , " typed_array " , " opaque_value " , " object " , " refcounted " } :
return f " const intptr_t arg_ { name } _ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, { index } ); "
return f " { typ . stack_type } arg_ { name } = leanclr::interp::EvalStackOp::get_param< { typ . stack_type } >(p_params, { index } ); "
def generate_native_invoker ( method ) :
fn = native_function_name ( method )
invoker = f " { fn } _invoker "
param_reads = [ ] if method . is_static else [ " const intptr_t p_native_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ]
call_args = [ ] if method . is_static else [ " p_native_ptr " ]
arg_offset = 0 if method . is_static else 1
for arg in method . args :
param_reads . append ( cpp_invoker_param_get ( arg , arg_offset ) )
arg_offset + = arg [ " type " ] . stack_slots
name = camel_name ( arg [ " name " ] )
call_args . append ( f " arg_ { name } _ptr " if arg [ " type " ] . category in { " packed_string_array " , " packed_array " , " opaque_variant " , " typed_array " , " opaque_value " , " object " , " refcounted " } else f " arg_ { name } " )
if method . is_vararg :
param_reads . append ( f " leanclr::vm::RtArray* p_varargs = leanclr::interp::EvalStackOp::get_param<leanclr::vm::RtArray*>(p_params, { arg_offset } ); " )
call_args . append ( " p_varargs " )
if method . return_type . category == " void " :
body = f " return { fn } ( { ' , ' . join ( call_args ) } ); "
else :
body = f " leanclr::interp::EvalStackOp::set_return(p_ret, { fn } ( { ' , ' . join ( call_args ) } )); \n return leanclr::core::Unit {{ }} ; "
return f """ leanclr::RtResultVoid { invoker } (leanclr::metadata::RtManagedMethodPointer p_method_ptr,
const leanclr::metadata::RtMethodInfo* p_method,
const leanclr::interp::RtStackObject* p_params,
leanclr::interp::RtStackObject* p_ret) noexcept
{{
(void)p_method_ptr;
(void)p_method;
(void)p_params;
(void)p_ret;
{ chr ( 10 ) . join ( param_reads ) }
{ body }
}}
"""
def generate_native ( classes , methods , src_dir ) :
methods = [ method for method in methods if not method . is_virtual ]
write (
src_dir / " generated " / " godot_api.generated.h " ,
""" #pragma once
namespace godot
{
void register_generated_godot_api_icalls();
} // namespace godot
""" ,
)
includes = [ " #include \" godot_api.generated.h \" " , " " ]
bound_classes = { method . class_name for method in methods }
for method in methods :
if method . return_type . category in { " object " , " refcounted " } :
bound_classes . add ( method . return_type . cpp_type )
for arg in method . args :
if arg [ " type " ] . category in { " object " , " refcounted " } :
bound_classes . add ( arg [ " type " ] . cpp_type )
bound_classes = sorted ( bound_classes )
for class_name in bound_classes :
includes . append ( f " #include <godot_cpp/classes/ { cpp_header_name ( class_name ) } .hpp> " )
includes . extend (
[
" #include <godot_cpp/variant/char_string.hpp> " ,
" #include <godot_cpp/variant/node_path.hpp> " ,
" #include <godot_cpp/variant/aabb.hpp> " ,
" #include <godot_cpp/variant/array.hpp> " ,
" #include <godot_cpp/variant/basis.hpp> " ,
" #include <godot_cpp/variant/callable.hpp> " ,
" #include <godot_cpp/variant/color.hpp> " ,
" #include <godot_cpp/variant/dictionary.hpp> " ,
" #include <godot_cpp/variant/packed_byte_array.hpp> " ,
" #include <godot_cpp/variant/packed_color_array.hpp> " ,
" #include <godot_cpp/variant/packed_float32_array.hpp> " ,
" #include <godot_cpp/variant/packed_float64_array.hpp> " ,
" #include <godot_cpp/variant/packed_int32_array.hpp> " ,
" #include <godot_cpp/variant/packed_int64_array.hpp> " ,
" #include <godot_cpp/variant/packed_string_array.hpp> " ,
" #include <godot_cpp/variant/packed_vector2_array.hpp> " ,
" #include <godot_cpp/variant/packed_vector3_array.hpp> " ,
" #include <godot_cpp/variant/plane.hpp> " ,
" #include <godot_cpp/variant/rect2.hpp> " ,
" #include <godot_cpp/variant/rect2i.hpp> " ,
" #include <godot_cpp/variant/rid.hpp> " ,
" #include <godot_cpp/variant/signal.hpp> " ,
" #include <godot_cpp/variant/projection.hpp> " ,
" #include <godot_cpp/variant/quaternion.hpp> " ,
" #include <godot_cpp/variant/string.hpp> " ,
" #include <godot_cpp/variant/string_name.hpp> " ,
" #include <godot_cpp/variant/transform2d.hpp> " ,
" #include <godot_cpp/variant/transform3d.hpp> " ,
" #include <godot_cpp/variant/typed_array.hpp> " ,
" #include <godot_cpp/variant/vector2.hpp> " ,
" #include <godot_cpp/variant/vector2i.hpp> " ,
" #include <godot_cpp/variant/vector3.hpp> " ,
" #include <godot_cpp/variant/vector3i.hpp> " ,
" #include <godot_cpp/variant/vector4.hpp> " ,
" #include <godot_cpp/variant/vector4i.hpp> " ,
" #include <godot_cpp/variant/variant.hpp> " ,
" " ,
" #include \" interp/eval_stack_op.h \" " ,
" #include \" vm/internal_calls.h \" " ,
" #include \" vm/rt_array.h \" " ,
" #include \" vm/rt_string.h \" " ,
" " ,
]
)
body = [
" // <auto-generated /> " ,
* includes ,
" namespace godot " ,
" { " ,
" namespace " ,
" { " ,
" " ,
" enum ManagedVariantType : int32_t " ,
" { " ,
" MANAGED_VARIANT_TYPE_NIL = 0, " ,
" MANAGED_VARIANT_TYPE_BOOL = 1, " ,
" MANAGED_VARIANT_TYPE_INT = 2, " ,
" MANAGED_VARIANT_TYPE_FLOAT = 3, " ,
" MANAGED_VARIANT_TYPE_STRING = 4, " ,
" MANAGED_VARIANT_TYPE_VECTOR2 = 5, " ,
" MANAGED_VARIANT_TYPE_VECTOR2I = 6, " ,
" MANAGED_VARIANT_TYPE_RECT2 = 7, " ,
" MANAGED_VARIANT_TYPE_RECT2I = 8, " ,
" MANAGED_VARIANT_TYPE_VECTOR3 = 9, " ,
" MANAGED_VARIANT_TYPE_VECTOR3I = 10, " ,
" MANAGED_VARIANT_TYPE_TRANSFORM2D = 11, " ,
" MANAGED_VARIANT_TYPE_VECTOR4 = 12, " ,
" MANAGED_VARIANT_TYPE_VECTOR4I = 13, " ,
" MANAGED_VARIANT_TYPE_PLANE = 14, " ,
" MANAGED_VARIANT_TYPE_QUATERNION = 15, " ,
" MANAGED_VARIANT_TYPE_AABB = 16, " ,
" MANAGED_VARIANT_TYPE_BASIS = 17, " ,
" MANAGED_VARIANT_TYPE_TRANSFORM3D = 18, " ,
" MANAGED_VARIANT_TYPE_PROJECTION = 19, " ,
" MANAGED_VARIANT_TYPE_COLOR = 20, " ,
" MANAGED_VARIANT_TYPE_STRING_NAME = 21, " ,
" MANAGED_VARIANT_TYPE_NODE_PATH = 22, " ,
" MANAGED_VARIANT_TYPE_RID = 23, " ,
" MANAGED_VARIANT_TYPE_OBJECT = 24, "
" MANAGED_VARIANT_TYPE_CALLABLE = 25, "
" MANAGED_VARIANT_TYPE_SIGNAL = 26, "
" MANAGED_VARIANT_TYPE_DICTIONARY = 27, " ,
" MANAGED_VARIANT_TYPE_ARRAY = 28, " ,
" MANAGED_VARIANT_TYPE_PACKED_BYTE_ARRAY = 29, " ,
" MANAGED_VARIANT_TYPE_PACKED_INT32_ARRAY = 30, " ,
" MANAGED_VARIANT_TYPE_PACKED_INT64_ARRAY = 31, " ,
" MANAGED_VARIANT_TYPE_PACKED_FLOAT32_ARRAY = 32, " ,
" MANAGED_VARIANT_TYPE_PACKED_FLOAT64_ARRAY = 33, " ,
" MANAGED_VARIANT_TYPE_PACKED_STRING_ARRAY = 34, " ,
" MANAGED_VARIANT_TYPE_PACKED_VECTOR2_ARRAY = 35, " ,
" MANAGED_VARIANT_TYPE_PACKED_VECTOR3_ARRAY = 36, " ,
" MANAGED_VARIANT_TYPE_PACKED_COLOR_ARRAY = 37, " ,
" }; " ,
" " ,
" struct ManagedVector2 { float x; float y; }; " ,
" struct ManagedVector2i { int32_t x; int32_t y; }; " ,
" struct ManagedVector3 { float x; float y; float z; }; " ,
" struct ManagedVector3i { int32_t x; int32_t y; int32_t z; }; " ,
" struct ManagedVector4 { float x; float y; float z; float w; }; " ,
" struct ManagedVector4i { int32_t x; int32_t y; int32_t z; int32_t w; }; " ,
" struct ManagedColor { float r; float g; float b; float a; }; " ,
" struct ManagedRect2 { ManagedVector2 position; ManagedVector2 size; }; " ,
" struct ManagedRect2i { ManagedVector2i position; ManagedVector2i size; }; " ,
" struct ManagedTransform2D { ManagedVector2 x; ManagedVector2 y; ManagedVector2 origin; }; " ,
" struct ManagedAABB { ManagedVector3 position; ManagedVector3 size; }; " ,
" struct ManagedQuaternion { float x; float y; float z; float w; }; " ,
" struct ManagedBasis { ManagedVector3 x; ManagedVector3 y; ManagedVector3 z; }; " ,
" struct ManagedTransform3D { ManagedBasis basis; ManagedVector3 origin; }; " ,
" struct ManagedPlane { ManagedVector3 normal; float d; }; " ,
" struct ManagedProjection { ManagedVector4 x; ManagedVector4 y; ManagedVector4 z; ManagedVector4 w; }; " ,
" " ,
" struct ManagedVariant " ,
" { " ,
" int32_t type = MANAGED_VARIANT_TYPE_NIL; " ,
" int32_t flags = 0; " ,
" union " ,
" { " ,
" bool bool_value; " ,
" int64_t int_value; " ,
" double float_value; " ,
" leanclr::vm::RtString* string_value; " ,
" int64_t rid_value; " ,
" intptr_t native_ptr; " ,
" ManagedVector2 vector2_value; " ,
" ManagedVector2i vector2i_value; " ,
" ManagedVector3 vector3_value; " ,
" ManagedVector3i vector3i_value; " ,
" ManagedVector4 vector4_value; " ,
" ManagedVector4i vector4i_value; " ,
" ManagedColor color_value; " ,
" ManagedRect2 rect2_value; " ,
" ManagedRect2i rect2i_value; " ,
" ManagedTransform2D transform2d_value; " ,
" ManagedAABB aabb_value; " ,
" ManagedQuaternion quaternion_value; " ,
" ManagedBasis basis_value; " ,
" ManagedTransform3D transform3d_value; " ,
" ManagedPlane plane_value; " ,
" ManagedProjection projection_value; " ,
" }; " ,
" }; " ,
" " ,
" String rt_string_to_godot(const leanclr::vm::RtString* p_string) " ,
" { " ,
" if (p_string == nullptr) " ,
" { " ,
" return String(); " ,
" } " ,
" " ,
" String result; " ,
" for (int32_t i = 0; i < p_string->length; ++i) " ,
" { " ,
" result += String::chr(static_cast<char32_t>(*(&p_string->first_char + i))); " ,
" } " ,
" return result; " ,
" } " ,
" " ,
" leanclr::vm::RtString* to_rt_string(const String& p_string) " ,
" { " ,
" const CharString utf8 = p_string.utf8(); " ,
" return leanclr::vm::String::create_string_from_utf8cstr(utf8.get_data()); " ,
" } " ,
" " ,
" leanclr::vm::RtString* to_rt_string(const StringName& p_string_name) " ,
" { " ,
" return to_rt_string(String(p_string_name)); " ,
" } " ,
" " ,
" struct OpaqueValue " ,
" { " ,
" void* value = nullptr; " ,
" void (*destroy)(void*) = nullptr; " ,
" }; " ,
" " ,
" template <typename T> " ,
" void destroy_opaque_value(void* p_value) " ,
" { " ,
" memdelete(reinterpret_cast<T*>(p_value)); " ,
" } " ,
" " ,
" template <typename T> " ,
" intptr_t new_opaque_value(const T& p_value) " ,
" { " ,
" OpaqueValue* opaque = memnew(OpaqueValue); " ,
" opaque->value = memnew(T(p_value)); " ,
" opaque->destroy = &destroy_opaque_value<T>; " ,
" return reinterpret_cast<intptr_t>(opaque); " ,
" } " ,
" " ,
" template <typename T> " ,
" T* opaque_value_ptr(intptr_t p_value_ptr) " ,
" { " ,
" OpaqueValue* opaque = reinterpret_cast<OpaqueValue*>(p_value_ptr); " ,
" return opaque != nullptr && opaque->value != nullptr ? reinterpret_cast<T*>(opaque->value) : nullptr; " ,
" } " ,
" " ,
" template <typename T> " ,
" T opaque_value_arg(intptr_t p_value_ptr) " ,
" { " ,
" T* value = opaque_value_ptr<T>(p_value_ptr); " ,
" return value != nullptr ? *value : T(); " ,
" } " ,
" " ,
" intptr_t new_packed_string_array(const PackedStringArray& p_array); " ,
" PackedStringArray packed_string_array_arg(intptr_t p_array_ptr); " ,
" " ,
" ManagedVariant to_managed_variant(const Variant& p_variant) " ,
" { " ,
" ManagedVariant result; " ,
" switch (p_variant.get_type()) " ,
" { " ,
" case Variant::BOOL: " ,
" result.type = MANAGED_VARIANT_TYPE_BOOL; " ,
" result.bool_value = static_cast<bool>(p_variant); " ,
" break; " ,
" case Variant::INT: " ,
" result.type = MANAGED_VARIANT_TYPE_INT; " ,
" result.int_value = static_cast<int64_t>(p_variant); " ,
" break; " ,
" case Variant::FLOAT: " ,
" result.type = MANAGED_VARIANT_TYPE_FLOAT; " ,
" result.float_value = static_cast<double>(p_variant); " ,
" break; " ,
" case Variant::STRING: " ,
" result.type = MANAGED_VARIANT_TYPE_STRING; " ,
" result.string_value = to_rt_string(static_cast<String>(p_variant)); " ,
" break; " ,
" case Variant::STRING_NAME: " ,
" result.type = MANAGED_VARIANT_TYPE_STRING_NAME; " ,
" result.string_value = to_rt_string(static_cast<StringName>(p_variant)); " ,
" break; " ,
" case Variant::NODE_PATH: " ,
" result.type = MANAGED_VARIANT_TYPE_NODE_PATH; " ,
" result.string_value = to_rt_string(String(static_cast<NodePath>(p_variant))); " ,
" break; " ,
" case Variant::RID: " ,
" result.type = MANAGED_VARIANT_TYPE_RID; " ,
" { const RID value = static_cast<RID>(p_variant); result.rid_value = value.get_id(); } " ,
" break; " ,
" case Variant::VECTOR2: " ,
" result.type = MANAGED_VARIANT_TYPE_VECTOR2; " ,
" { const Vector2 value = static_cast<Vector2>(p_variant); result.vector2_value = ManagedVector2 { value.x, value.y}; } " ,
" break; " ,
" case Variant::VECTOR2I: " ,
" result.type = MANAGED_VARIANT_TYPE_VECTOR2I; " ,
" { const Vector2i value = static_cast<Vector2i>(p_variant); result.vector2i_value = ManagedVector2i { value.x, value.y}; } " ,
" break; " ,
" case Variant::RECT2: " ,
" result.type = MANAGED_VARIANT_TYPE_RECT2; " ,
" { const Rect2 value = static_cast<Rect2>(p_variant); result.rect2_value = ManagedRect2 { ManagedVector2 { value.position.x, value.position.y}, ManagedVector2 { value.size.x, value.size.y}}; } " ,
" break; " ,
" case Variant::RECT2I: " ,
" result.type = MANAGED_VARIANT_TYPE_RECT2I; " ,
" { const Rect2i value = static_cast<Rect2i>(p_variant); result.rect2i_value = ManagedRect2i { ManagedVector2i { value.position.x, value.position.y}, ManagedVector2i { value.size.x, value.size.y}}; } " ,
" break; " ,
" case Variant::VECTOR3: " ,
" result.type = MANAGED_VARIANT_TYPE_VECTOR3; " ,
" { const Vector3 value = static_cast<Vector3>(p_variant); result.vector3_value = ManagedVector3 { value.x, value.y, value.z}; } " ,
" break; " ,
" case Variant::VECTOR3I: " ,
" result.type = MANAGED_VARIANT_TYPE_VECTOR3I; " ,
" { const Vector3i value = static_cast<Vector3i>(p_variant); result.vector3i_value = ManagedVector3i { value.x, value.y, value.z}; } " ,
" break; " ,
" case Variant::TRANSFORM2D: " ,
" result.type = MANAGED_VARIANT_TYPE_TRANSFORM2D; " ,
" { const Transform2D value = static_cast<Transform2D>(p_variant); result.transform2d_value = ManagedTransform2D { ManagedVector2 { value.columns[0].x, value.columns[0].y}, ManagedVector2 { value.columns[1].x, value.columns[1].y}, ManagedVector2 { value.columns[2].x, value.columns[2].y}}; } " ,
" break; " ,
" case Variant::VECTOR4: " ,
" result.type = MANAGED_VARIANT_TYPE_VECTOR4; " ,
" { const Vector4 value = static_cast<Vector4>(p_variant); result.vector4_value = ManagedVector4 { value.x, value.y, value.z, value.w}; } " ,
" break; " ,
" case Variant::VECTOR4I: " ,
" result.type = MANAGED_VARIANT_TYPE_VECTOR4I; " ,
" { const Vector4i value = static_cast<Vector4i>(p_variant); result.vector4i_value = ManagedVector4i { value.x, value.y, value.z, value.w}; } " ,
" break; " ,
" case Variant::PLANE: " ,
" result.type = MANAGED_VARIANT_TYPE_PLANE; " ,
" { const Plane value = static_cast<Plane>(p_variant); result.plane_value = ManagedPlane { ManagedVector3 { value.normal.x, value.normal.y, value.normal.z}, value.d}; } " ,
" break; " ,
" case Variant::QUATERNION: " ,
" result.type = MANAGED_VARIANT_TYPE_QUATERNION; " ,
" { const Quaternion value = static_cast<Quaternion>(p_variant); result.quaternion_value = ManagedQuaternion { value.x, value.y, value.z, value.w}; } " ,
" break; " ,
" case Variant::AABB: " ,
" result.type = MANAGED_VARIANT_TYPE_AABB; " ,
" { const AABB value = static_cast<AABB>(p_variant); result.aabb_value = ManagedAABB { ManagedVector3 { value.position.x, value.position.y, value.position.z}, ManagedVector3 { value.size.x, value.size.y, value.size.z}}; } " ,
" break; " ,
" case Variant::BASIS: " ,
" result.type = MANAGED_VARIANT_TYPE_BASIS; " ,
" { const Basis value = static_cast<Basis>(p_variant); result.basis_value = ManagedBasis { ManagedVector3 { value.rows[0].x, value.rows[0].y, value.rows[0].z}, ManagedVector3 { value.rows[1].x, value.rows[1].y, value.rows[1].z}, ManagedVector3 { value.rows[2].x, value.rows[2].y, value.rows[2].z}}; } " ,
" break; " ,
" case Variant::TRANSFORM3D: " ,
" result.type = MANAGED_VARIANT_TYPE_TRANSFORM3D; " ,
" { const Transform3D value = static_cast<Transform3D>(p_variant); result.transform3d_value = ManagedTransform3D { ManagedBasis { ManagedVector3 { value.basis.rows[0].x, value.basis.rows[0].y, value.basis.rows[0].z}, ManagedVector3 { value.basis.rows[1].x, value.basis.rows[1].y, value.basis.rows[1].z}, ManagedVector3 { value.basis.rows[2].x, value.basis.rows[2].y, value.basis.rows[2].z}}, ManagedVector3 { value.origin.x, value.origin.y, value.origin.z}}; } " ,
" break; " ,
" case Variant::PROJECTION: " ,
" result.type = MANAGED_VARIANT_TYPE_PROJECTION; " ,
" { const Projection value = static_cast<Projection>(p_variant); result.projection_value = ManagedProjection { ManagedVector4 { value.columns[0].x, value.columns[0].y, value.columns[0].z, value.columns[0].w}, ManagedVector4 { value.columns[1].x, value.columns[1].y, value.columns[1].z, value.columns[1].w}, ManagedVector4 { value.columns[2].x, value.columns[2].y, value.columns[2].z, value.columns[2].w}, ManagedVector4 { value.columns[3].x, value.columns[3].y, value.columns[3].z, value.columns[3].w}}; } " ,
" break; " ,
" case Variant::COLOR: " ,
" result.type = MANAGED_VARIANT_TYPE_COLOR; " ,
" { const Color value = static_cast<Color>(p_variant); result.color_value = ManagedColor { value.r, value.g, value.b, value.a}; } " ,
" break; " ,
" case Variant::OBJECT: " ,
" result.type = MANAGED_VARIANT_TYPE_OBJECT; " ,
" result.native_ptr = reinterpret_cast<intptr_t>(static_cast<Object*>(p_variant)); " ,
" break; " ,
" case Variant::ARRAY: " ,
" result.type = MANAGED_VARIANT_TYPE_ARRAY; " ,
" result.flags = 1; " ,
" result.native_ptr = new_opaque_value(static_cast<Array>(p_variant)); " ,
" break; " ,
" case Variant::DICTIONARY: " ,
" result.type = MANAGED_VARIANT_TYPE_DICTIONARY; " ,
" result.flags = 1; " ,
" result.native_ptr = new_opaque_value(static_cast<Dictionary>(p_variant)); " ,
" break; " ,
" case Variant::CALLABLE: " ,
" result.type = MANAGED_VARIANT_TYPE_CALLABLE; " ,
" result.flags = 1; " ,
" result.native_ptr = new_opaque_value(static_cast<Callable>(p_variant)); " ,
" break; " ,
" case Variant::SIGNAL: " ,
" result.type = MANAGED_VARIANT_TYPE_SIGNAL; " ,
" result.flags = 1; " ,
" result.native_ptr = new_opaque_value(static_cast<Signal>(p_variant)); " ,
" break; " ,
" case Variant::PACKED_BYTE_ARRAY: " ,
" result.type = MANAGED_VARIANT_TYPE_PACKED_BYTE_ARRAY; " ,
" result.flags = 1; " ,
" result.native_ptr = new_opaque_value(static_cast<PackedByteArray>(p_variant)); " ,
" break; " ,
" case Variant::PACKED_INT32_ARRAY: " ,
" result.type = MANAGED_VARIANT_TYPE_PACKED_INT32_ARRAY; " ,
" result.flags = 1; " ,
" result.native_ptr = new_opaque_value(static_cast<PackedInt32Array>(p_variant)); " ,
" break; " ,
" case Variant::PACKED_INT64_ARRAY: " ,
" result.type = MANAGED_VARIANT_TYPE_PACKED_INT64_ARRAY; " ,
" result.flags = 1; " ,
" result.native_ptr = new_opaque_value(static_cast<PackedInt64Array>(p_variant)); " ,
" break; " ,
" case Variant::PACKED_FLOAT32_ARRAY: " ,
" result.type = MANAGED_VARIANT_TYPE_PACKED_FLOAT32_ARRAY; " ,
" result.flags = 1; " ,
" result.native_ptr = new_opaque_value(static_cast<PackedFloat32Array>(p_variant)); " ,
" break; " ,
" case Variant::PACKED_FLOAT64_ARRAY: " ,
" result.type = MANAGED_VARIANT_TYPE_PACKED_FLOAT64_ARRAY; " ,
" result.flags = 1; " ,
" result.native_ptr = new_opaque_value(static_cast<PackedFloat64Array>(p_variant)); " ,
" break; " ,
" case Variant::PACKED_STRING_ARRAY: " ,
" result.type = MANAGED_VARIANT_TYPE_PACKED_STRING_ARRAY; " ,
" result.flags = 1; " ,
" result.native_ptr = new_packed_string_array(static_cast<PackedStringArray>(p_variant)); " ,
" break; " ,
" case Variant::PACKED_VECTOR2_ARRAY: " ,
" result.type = MANAGED_VARIANT_TYPE_PACKED_VECTOR2_ARRAY; " ,
" result.flags = 1; " ,
" result.native_ptr = new_opaque_value(static_cast<PackedVector2Array>(p_variant)); " ,
" break; " ,
" case Variant::PACKED_VECTOR3_ARRAY: " ,
" result.type = MANAGED_VARIANT_TYPE_PACKED_VECTOR3_ARRAY; " ,
" result.flags = 1; " ,
" result.native_ptr = new_opaque_value(static_cast<PackedVector3Array>(p_variant)); " ,
" break; " ,
" case Variant::PACKED_COLOR_ARRAY: " ,
" result.type = MANAGED_VARIANT_TYPE_PACKED_COLOR_ARRAY; " ,
" result.flags = 1; " ,
" result.native_ptr = new_opaque_value(static_cast<PackedColorArray>(p_variant)); " ,
" break; " ,
" default: " ,
" result.type = MANAGED_VARIANT_TYPE_NIL; " ,
" result.int_value = 0; " ,
" break; " ,
" } " ,
" return result; " ,
" } " ,
" " ,
" Variant variant_arg(const ManagedVariant& p_variant) " ,
" { " ,
" switch (p_variant.type) " ,
" { " ,
" case MANAGED_VARIANT_TYPE_BOOL: " ,
" return Variant(p_variant.bool_value); " ,
" case MANAGED_VARIANT_TYPE_INT: " ,
" return Variant(p_variant.int_value); " ,
" case MANAGED_VARIANT_TYPE_FLOAT: " ,
" return Variant(p_variant.float_value); " ,
" case MANAGED_VARIANT_TYPE_STRING: " ,
" return Variant(rt_string_to_godot(p_variant.string_value)); " ,
" case MANAGED_VARIANT_TYPE_STRING_NAME: " ,
" return Variant(StringName(rt_string_to_godot(p_variant.string_value))); " ,
" case MANAGED_VARIANT_TYPE_NODE_PATH: " ,
" return Variant(NodePath(rt_string_to_godot(p_variant.string_value))); " ,
" case MANAGED_VARIANT_TYPE_RID: " ,
" { RID rid; *reinterpret_cast<int64_t*>(rid._native_ptr()) = p_variant.rid_value; return Variant(rid); } " ,
" case MANAGED_VARIANT_TYPE_VECTOR2: " ,
" return Variant(Vector2(p_variant.vector2_value.x, p_variant.vector2_value.y)); " ,
" case MANAGED_VARIANT_TYPE_VECTOR2I: " ,
" return Variant(Vector2i(p_variant.vector2i_value.x, p_variant.vector2i_value.y)); " ,
" case MANAGED_VARIANT_TYPE_RECT2: " ,
" return Variant(Rect2(Vector2(p_variant.rect2_value.position.x, p_variant.rect2_value.position.y), Vector2(p_variant.rect2_value.size.x, p_variant.rect2_value.size.y))); " ,
" case MANAGED_VARIANT_TYPE_RECT2I: " ,
" return Variant(Rect2i(Vector2i(p_variant.rect2i_value.position.x, p_variant.rect2i_value.position.y), Vector2i(p_variant.rect2i_value.size.x, p_variant.rect2i_value.size.y))); " ,
" case MANAGED_VARIANT_TYPE_VECTOR3: " ,
" return Variant(Vector3(p_variant.vector3_value.x, p_variant.vector3_value.y, p_variant.vector3_value.z)); " ,
" case MANAGED_VARIANT_TYPE_VECTOR3I: " ,
" return Variant(Vector3i(p_variant.vector3i_value.x, p_variant.vector3i_value.y, p_variant.vector3i_value.z)); " ,
" case MANAGED_VARIANT_TYPE_TRANSFORM2D: " ,
" return Variant(Transform2D(Vector2(p_variant.transform2d_value.x.x, p_variant.transform2d_value.x.y), Vector2(p_variant.transform2d_value.y.x, p_variant.transform2d_value.y.y), Vector2(p_variant.transform2d_value.origin.x, p_variant.transform2d_value.origin.y))); " ,
" case MANAGED_VARIANT_TYPE_VECTOR4: " ,
" return Variant(Vector4(p_variant.vector4_value.x, p_variant.vector4_value.y, p_variant.vector4_value.z, p_variant.vector4_value.w)); " ,
" case MANAGED_VARIANT_TYPE_VECTOR4I: " ,
" return Variant(Vector4i(p_variant.vector4i_value.x, p_variant.vector4i_value.y, p_variant.vector4i_value.z, p_variant.vector4i_value.w)); " ,
" case MANAGED_VARIANT_TYPE_PLANE: " ,
" return Variant(Plane(Vector3(p_variant.plane_value.normal.x, p_variant.plane_value.normal.y, p_variant.plane_value.normal.z), p_variant.plane_value.d)); " ,
" case MANAGED_VARIANT_TYPE_QUATERNION: " ,
" return Variant(Quaternion(p_variant.quaternion_value.x, p_variant.quaternion_value.y, p_variant.quaternion_value.z, p_variant.quaternion_value.w)); " ,
" case MANAGED_VARIANT_TYPE_AABB: " ,
" return Variant(AABB(Vector3(p_variant.aabb_value.position.x, p_variant.aabb_value.position.y, p_variant.aabb_value.position.z), Vector3(p_variant.aabb_value.size.x, p_variant.aabb_value.size.y, p_variant.aabb_value.size.z))); " ,
" case MANAGED_VARIANT_TYPE_BASIS: " ,
" return Variant(Basis(Vector3(p_variant.basis_value.x.x, p_variant.basis_value.x.y, p_variant.basis_value.x.z), Vector3(p_variant.basis_value.y.x, p_variant.basis_value.y.y, p_variant.basis_value.y.z), Vector3(p_variant.basis_value.z.x, p_variant.basis_value.z.y, p_variant.basis_value.z.z))); " ,
" case MANAGED_VARIANT_TYPE_TRANSFORM3D: " ,
" return Variant(Transform3D(Basis(Vector3(p_variant.transform3d_value.basis.x.x, p_variant.transform3d_value.basis.x.y, p_variant.transform3d_value.basis.x.z), Vector3(p_variant.transform3d_value.basis.y.x, p_variant.transform3d_value.basis.y.y, p_variant.transform3d_value.basis.y.z), Vector3(p_variant.transform3d_value.basis.z.x, p_variant.transform3d_value.basis.z.y, p_variant.transform3d_value.basis.z.z)), Vector3(p_variant.transform3d_value.origin.x, p_variant.transform3d_value.origin.y, p_variant.transform3d_value.origin.z))); " ,
" case MANAGED_VARIANT_TYPE_PROJECTION: " ,
" return Variant(Projection(Vector4(p_variant.projection_value.x.x, p_variant.projection_value.x.y, p_variant.projection_value.x.z, p_variant.projection_value.x.w), Vector4(p_variant.projection_value.y.x, p_variant.projection_value.y.y, p_variant.projection_value.y.z, p_variant.projection_value.y.w), Vector4(p_variant.projection_value.z.x, p_variant.projection_value.z.y, p_variant.projection_value.z.z, p_variant.projection_value.z.w), Vector4(p_variant.projection_value.w.x, p_variant.projection_value.w.y, p_variant.projection_value.w.z, p_variant.projection_value.w.w))); " ,
" case MANAGED_VARIANT_TYPE_COLOR: " ,
" return Variant(Color(p_variant.color_value.r, p_variant.color_value.g, p_variant.color_value.b, p_variant.color_value.a)); " ,
" case MANAGED_VARIANT_TYPE_OBJECT: " ,
" return Variant(reinterpret_cast<Object*>(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_ARRAY: " ,
" return Variant(opaque_value_arg<Array>(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_DICTIONARY: " ,
" return Variant(opaque_value_arg<Dictionary>(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_CALLABLE: " ,
" return Variant(opaque_value_arg<Callable>(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_SIGNAL: " ,
" return Variant(opaque_value_arg<Signal>(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_PACKED_BYTE_ARRAY: " ,
" return Variant(opaque_value_arg<PackedByteArray>(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_PACKED_INT32_ARRAY: " ,
" return Variant(opaque_value_arg<PackedInt32Array>(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_PACKED_INT64_ARRAY: " ,
" return Variant(opaque_value_arg<PackedInt64Array>(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_PACKED_FLOAT32_ARRAY: " ,
" return Variant(opaque_value_arg<PackedFloat32Array>(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_PACKED_FLOAT64_ARRAY: " ,
" return Variant(opaque_value_arg<PackedFloat64Array>(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_PACKED_STRING_ARRAY: " ,
" return Variant(packed_string_array_arg(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_PACKED_VECTOR2_ARRAY: " ,
" return Variant(opaque_value_arg<PackedVector2Array>(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_PACKED_VECTOR3_ARRAY: " ,
" return Variant(opaque_value_arg<PackedVector3Array>(p_variant.native_ptr)); " ,
" case MANAGED_VARIANT_TYPE_PACKED_COLOR_ARRAY: " ,
" return Variant(opaque_value_arg<PackedColorArray>(p_variant.native_ptr)); " ,
" default: " ,
" return Variant(); " ,
" } " ,
" } " ,
" " ,
" void append_managed_varargs(Array& r_args, leanclr::vm::RtArray* p_varargs) " ,
" { " ,
" if (p_varargs == nullptr) " ,
" { " ,
" return; " ,
" } " ,
" const int32_t count = leanclr::vm::Array::get_array_length(p_varargs); " ,
" for (int32_t i = 0; i < count; ++i) " ,
" { " ,
" ManagedVariant value = leanclr::vm::Array::get_array_data_at<ManagedVariant>(p_varargs, i); " ,
" r_args.append(variant_arg(value)); " ,
" } " ,
" } " ,
" " ,
" intptr_t new_packed_string_array(const PackedStringArray& p_array) " ,
" { " ,
" return reinterpret_cast<intptr_t>(memnew(PackedStringArray(p_array))); " ,
" } " ,
" " ,
" PackedStringArray packed_string_array_arg(intptr_t p_array_ptr) " ,
" { " ,
" return p_array_ptr != 0 ? *reinterpret_cast<const PackedStringArray*>(p_array_ptr) : PackedStringArray(); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_opaquevalue_destroy(intptr_t p_value_ptr) noexcept " ,
" { " ,
" if (p_value_ptr != 0) " ,
" { " ,
" OpaqueValue* opaque = reinterpret_cast<OpaqueValue*>(p_value_ptr); " ,
" if (opaque->destroy != nullptr && opaque->value != nullptr) " ,
" { " ,
" opaque->destroy(opaque->value); " ,
" } " ,
" memdelete(opaque); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" intptr_t godot_array_create() noexcept " ,
" { " ,
" return new_opaque_value(Array()); " ,
" } " ,
" " ,
" Array* godot_array_ptr(intptr_t p_array_ptr) " ,
" { " ,
" OpaqueValue* opaque = reinterpret_cast<OpaqueValue*>(p_array_ptr); " ,
" return opaque != nullptr ? reinterpret_cast<Array*>(opaque->value) : nullptr; " ,
" } " ,
" " ,
" int32_t godot_array_size(intptr_t p_array_ptr) noexcept " ,
" { " ,
" Array* array = godot_array_ptr(p_array_ptr); " ,
" return array != nullptr ? static_cast<int32_t>(array->size()) : 0; " ,
" } " ,
" " ,
" ManagedVariant godot_array_get(intptr_t p_array_ptr, int32_t p_index) noexcept " ,
" { " ,
" Array* array = godot_array_ptr(p_array_ptr); " ,
" if (array == nullptr || p_index < 0 || p_index >= array->size()) " ,
" { " ,
" return to_managed_variant(Variant()); " ,
" } " ,
" return to_managed_variant(array->get(p_index)); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_set(intptr_t p_array_ptr, int32_t p_index, ManagedVariant p_value) noexcept " ,
" { " ,
" Array* array = godot_array_ptr(p_array_ptr); " ,
" if (array != nullptr && p_index >= 0 && p_index < array->size()) " ,
" { " ,
" array->set(p_index, variant_arg(p_value)); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_add(intptr_t p_array_ptr, ManagedVariant p_value) noexcept " ,
" { " ,
" Array* array = godot_array_ptr(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->append(variant_arg(p_value)); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_insert(intptr_t p_array_ptr, int32_t p_index, ManagedVariant p_value) noexcept " ,
" { " ,
" Array* array = godot_array_ptr(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->insert(p_index, variant_arg(p_value)); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_removeat(intptr_t p_array_ptr, int32_t p_index) noexcept " ,
" { " ,
" Array* array = godot_array_ptr(p_array_ptr); " ,
" if (array != nullptr && p_index >= 0 && p_index < array->size()) " ,
" { " ,
" array->remove_at(p_index); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_clear(intptr_t p_array_ptr) noexcept " ,
" { " ,
" Array* array = godot_array_ptr(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->clear(); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" bool godot_array_contains(intptr_t p_array_ptr, ManagedVariant p_value) noexcept " ,
" { " ,
" Array* array = godot_array_ptr(p_array_ptr); " ,
" return array != nullptr && array->has(variant_arg(p_value)); " ,
" } " ,
" " ,
" int32_t godot_array_indexof(intptr_t p_array_ptr, ManagedVariant p_value) noexcept " ,
" { " ,
" Array* array = godot_array_ptr(p_array_ptr); " ,
" return array != nullptr ? static_cast<int32_t>(array->find(variant_arg(p_value))) : -1; " ,
" } " ,
" " ,
" intptr_t godot_dictionary_create() noexcept " ,
" { " ,
" return new_opaque_value(Dictionary()); " ,
" } " ,
" " ,
" Dictionary* godot_dictionary_ptr(intptr_t p_dictionary_ptr) " ,
" { " ,
" OpaqueValue* opaque = reinterpret_cast<OpaqueValue*>(p_dictionary_ptr); " ,
" return opaque != nullptr ? reinterpret_cast<Dictionary*>(opaque->value) : nullptr; " ,
" } " ,
" " ,
" int32_t godot_dictionary_size(intptr_t p_dictionary_ptr) noexcept " ,
" { " ,
" Dictionary* dictionary = godot_dictionary_ptr(p_dictionary_ptr); " ,
" return dictionary != nullptr ? static_cast<int32_t>(dictionary->size()) : 0; " ,
" } " ,
" " ,
" bool godot_dictionary_containskey(intptr_t p_dictionary_ptr, ManagedVariant p_key) noexcept " ,
" { " ,
" Dictionary* dictionary = godot_dictionary_ptr(p_dictionary_ptr); " ,
" return dictionary != nullptr && dictionary->has(variant_arg(p_key)); " ,
" } " ,
" " ,
" ManagedVariant godot_dictionary_get(intptr_t p_dictionary_ptr, ManagedVariant p_key) noexcept " ,
" { " ,
" Dictionary* dictionary = godot_dictionary_ptr(p_dictionary_ptr); " ,
" if (dictionary == nullptr) " ,
" { " ,
" return to_managed_variant(Variant()); " ,
" } " ,
" const Variant key = variant_arg(p_key); " ,
" return dictionary->has(key) ? to_managed_variant((*dictionary)[key]) : to_managed_variant(Variant()); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_dictionary_set(intptr_t p_dictionary_ptr, ManagedVariant p_key, ManagedVariant p_value) noexcept " ,
" { " ,
" Dictionary* dictionary = godot_dictionary_ptr(p_dictionary_ptr); " ,
" if (dictionary != nullptr) " ,
" { " ,
" (*dictionary)[variant_arg(p_key)] = variant_arg(p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" bool godot_dictionary_remove(intptr_t p_dictionary_ptr, ManagedVariant p_key) noexcept " ,
" { " ,
" Dictionary* dictionary = godot_dictionary_ptr(p_dictionary_ptr); " ,
" if (dictionary == nullptr) " ,
" { " ,
" return false; " ,
" } " ,
" const Variant key = variant_arg(p_key); " ,
" const bool had_key = dictionary->has(key); " ,
" if (had_key) " ,
" { " ,
" dictionary->erase(key); " ,
" } " ,
" return had_key; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_dictionary_clear(intptr_t p_dictionary_ptr) noexcept " ,
" { " ,
" Dictionary* dictionary = godot_dictionary_ptr(p_dictionary_ptr); " ,
" if (dictionary != nullptr) " ,
" { " ,
" dictionary->clear(); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" intptr_t godot_dictionary_keys(intptr_t p_dictionary_ptr) noexcept " ,
" { " ,
" Dictionary* dictionary = godot_dictionary_ptr(p_dictionary_ptr); " ,
" return new_opaque_value(dictionary != nullptr ? dictionary->keys() : Array()); " ,
" } " ,
" " ,
" intptr_t godot_dictionary_values(intptr_t p_dictionary_ptr) noexcept " ,
" { " ,
" Dictionary* dictionary = godot_dictionary_ptr(p_dictionary_ptr); " ,
" return new_opaque_value(dictionary != nullptr ? dictionary->values() : Array()); " ,
" } " ,
" " ,
" leanclr::vm::RtString* godot_variant_stringify(ManagedVariant p_variant) noexcept " ,
" { " ,
" return to_rt_string(variant_arg(p_variant).stringify()); " ,
" } " ,
" " , " intptr_t godot_callable_create(intptr_t p_target_ptr, leanclr::vm::RtString* p_method) noexcept " ,
" { " ,
" return new_opaque_value(Callable(reinterpret_cast<Object*>(p_target_ptr), StringName(rt_string_to_godot(p_method)))); " ,
" } " ,
" " ,
" bool godot_callable_isvalid(intptr_t p_callable_ptr) noexcept " ,
" { " ,
" return opaque_value_arg<Callable>(p_callable_ptr).is_valid(); " ,
" } " ,
" " ,
" leanclr::vm::RtString* godot_callable_getmethod(intptr_t p_callable_ptr) noexcept " ,
" { " ,
" return to_rt_string(opaque_value_arg<Callable>(p_callable_ptr).get_method()); " ,
" } " ,
" " ,
" ManagedVariant godot_callable_call(intptr_t p_callable_ptr, leanclr::vm::RtArray* p_varargs) noexcept " ,
" { " ,
" Array args; " ,
" append_managed_varargs(args, p_varargs); " ,
" return to_managed_variant(opaque_value_arg<Callable>(p_callable_ptr).callv(args)); " ,
" } " ,
" " ,
" intptr_t godot_callable_bind(intptr_t p_callable_ptr, leanclr::vm::RtArray* p_varargs) noexcept " ,
" { " ,
" Array args; " ,
" append_managed_varargs(args, p_varargs); " ,
" return new_opaque_value(opaque_value_arg<Callable>(p_callable_ptr).bindv(args)); " ,
" } " ,
" " ,
" intptr_t godot_signal_create(intptr_t p_target_ptr, leanclr::vm::RtString* p_signal) noexcept " ,
" { " ,
" return new_opaque_value(Signal(reinterpret_cast<Object*>(p_target_ptr), StringName(rt_string_to_godot(p_signal)))); " ,
" } " ,
" " ,
" bool godot_signal_isnull(intptr_t p_signal_ptr) noexcept " ,
" { " ,
" return opaque_value_arg<Signal>(p_signal_ptr).is_null(); " ,
" } " ,
" " ,
" leanclr::vm::RtString* godot_signal_getname(intptr_t p_signal_ptr) noexcept " ,
" { " ,
" return to_rt_string(opaque_value_arg<Signal>(p_signal_ptr).get_name()); " ,
" } " ,
" " ,
" int32_t godot_signal_connect(intptr_t p_signal_ptr, intptr_t p_callable_ptr, int32_t p_flags) noexcept " ,
" { " ,
" return static_cast<int32_t>(opaque_value_arg<Signal>(p_signal_ptr).connect(opaque_value_arg<Callable>(p_callable_ptr), p_flags)); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_signal_emit(intptr_t p_signal_ptr, leanclr::vm::RtArray* p_varargs) noexcept " ,
" { " ,
" Signal signal = opaque_value_arg<Signal>(p_signal_ptr); " ,
" Object* target = signal.get_object(); " ,
" if (target != nullptr) " ,
" { " ,
" Array args; " ,
" args.append(Variant(signal.get_name())); " ,
" append_managed_varargs(args, p_varargs); " ,
" target->callv(StringName( \" emit_signal \" ), args); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" intptr_t godot_packedstringarray_create() noexcept " ,
" { " ,
" return new_packed_string_array(PackedStringArray()); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedstringarray_destroy(intptr_t p_array_ptr) noexcept " ,
" { " ,
" if (p_array_ptr != 0) " ,
" { " ,
" memdelete(reinterpret_cast<PackedStringArray*>(p_array_ptr)); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" int32_t godot_packedstringarray_size(intptr_t p_array_ptr) noexcept " ,
" { " ,
" return static_cast<int32_t>(packed_string_array_arg(p_array_ptr).size()); " ,
" } " ,
" " ,
" leanclr::vm::RtString* godot_packedstringarray_get(intptr_t p_array_ptr, int32_t p_index) noexcept " ,
" { " ,
" const PackedStringArray array = packed_string_array_arg(p_array_ptr); " ,
" if (p_index < 0 || p_index >= array.size()) " ,
" { " ,
" return leanclr::vm::String::get_empty_string(); " ,
" } " ,
" return to_rt_string(array.get(p_index)); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedstringarray_append(intptr_t p_array_ptr, leanclr::vm::RtString* p_value) noexcept " ,
" { " ,
" PackedStringArray* array = reinterpret_cast<PackedStringArray*>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->append(rt_string_to_godot(p_value)); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" intptr_t godot_packedbytearray_create() noexcept " ,
" { " ,
" return new_opaque_value(PackedByteArray()); " ,
" } " ,
" " ,
" int32_t godot_packedbytearray_size(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedByteArray* array = opaque_value_ptr<PackedByteArray>(p_array_ptr); " ,
" return array != nullptr ? static_cast<int32_t>(array->size()) : 0; " ,
" } " ,
" " ,
" uint8_t godot_packedbytearray_get(intptr_t p_array_ptr, int32_t p_index) noexcept " ,
" { " ,
" PackedByteArray* array = opaque_value_ptr<PackedByteArray>(p_array_ptr); " ,
" return array != nullptr && p_index >= 0 && p_index < array->size() ? array->get(p_index) : 0; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedbytearray_set(intptr_t p_array_ptr, int32_t p_index, uint8_t p_value) noexcept " ,
" { " ,
" PackedByteArray* array = opaque_value_ptr<PackedByteArray>(p_array_ptr); " ,
" if (array != nullptr && p_index >= 0 && p_index < array->size()) " ,
" { " ,
" array->set(p_index, p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedbytearray_add(intptr_t p_array_ptr, uint8_t p_value) noexcept " ,
" { " ,
" PackedByteArray* array = opaque_value_ptr<PackedByteArray>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->append(p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedbytearray_clear(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedByteArray* array = opaque_value_ptr<PackedByteArray>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->clear(); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedbytearray_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_params; " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedbytearray_create()); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedbytearray_size_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedbytearray_size(p_array_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedbytearray_get_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedbytearray_get(p_array_ptr, p_index)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedbytearray_set_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" uint8_t p_value = leanclr::interp::EvalStackOp::get_param<uint8_t>(p_params, 2); " ,
" return godot_packedbytearray_set(p_array_ptr, p_index, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedbytearray_add_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" uint8_t p_value = leanclr::interp::EvalStackOp::get_param<uint8_t>(p_params, 1); " ,
" return godot_packedbytearray_add(p_array_ptr, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedbytearray_clear_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_packedbytearray_clear(p_array_ptr); " ,
" } " ,
" " ,
" intptr_t godot_packedint32array_create() noexcept " ,
" { " ,
" return new_opaque_value(PackedInt32Array()); " ,
" } " ,
" " ,
" int32_t godot_packedint32array_size(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedInt32Array* array = opaque_value_ptr<PackedInt32Array>(p_array_ptr); " ,
" return array != nullptr ? static_cast<int32_t>(array->size()) : 0; " ,
" } " ,
" " ,
" int32_t godot_packedint32array_get(intptr_t p_array_ptr, int32_t p_index) noexcept " ,
" { " ,
" PackedInt32Array* array = opaque_value_ptr<PackedInt32Array>(p_array_ptr); " ,
" return array != nullptr && p_index >= 0 && p_index < array->size() ? array->get(p_index) : 0; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint32array_set(intptr_t p_array_ptr, int32_t p_index, int32_t p_value) noexcept " ,
" { " ,
" PackedInt32Array* array = opaque_value_ptr<PackedInt32Array>(p_array_ptr); " ,
" if (array != nullptr && p_index >= 0 && p_index < array->size()) " ,
" { " ,
" array->set(p_index, p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint32array_add(intptr_t p_array_ptr, int32_t p_value) noexcept " ,
" { " ,
" PackedInt32Array* array = opaque_value_ptr<PackedInt32Array>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->append(p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint32array_clear(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedInt32Array* array = opaque_value_ptr<PackedInt32Array>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->clear(); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint32array_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_params; " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedint32array_create()); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint32array_size_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedint32array_size(p_array_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint32array_get_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedint32array_get(p_array_ptr, p_index)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint32array_set_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" int32_t p_value = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 2); " ,
" return godot_packedint32array_set(p_array_ptr, p_index, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint32array_add_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" int32_t p_value = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" return godot_packedint32array_add(p_array_ptr, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint32array_clear_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_packedint32array_clear(p_array_ptr); " ,
" } " ,
" " ,
" intptr_t godot_packedint64array_create() noexcept " ,
" { " ,
" return new_opaque_value(PackedInt64Array()); " ,
" } " ,
" " ,
" int32_t godot_packedint64array_size(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedInt64Array* array = opaque_value_ptr<PackedInt64Array>(p_array_ptr); " ,
" return array != nullptr ? static_cast<int32_t>(array->size()) : 0; " ,
" } " ,
" " ,
" int64_t godot_packedint64array_get(intptr_t p_array_ptr, int32_t p_index) noexcept " ,
" { " ,
" PackedInt64Array* array = opaque_value_ptr<PackedInt64Array>(p_array_ptr); " ,
" return array != nullptr && p_index >= 0 && p_index < array->size() ? array->get(p_index) : 0; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint64array_set(intptr_t p_array_ptr, int32_t p_index, int64_t p_value) noexcept " ,
" { " ,
" PackedInt64Array* array = opaque_value_ptr<PackedInt64Array>(p_array_ptr); " ,
" if (array != nullptr && p_index >= 0 && p_index < array->size()) " ,
" { " ,
" array->set(p_index, p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint64array_add(intptr_t p_array_ptr, int64_t p_value) noexcept " ,
" { " ,
" PackedInt64Array* array = opaque_value_ptr<PackedInt64Array>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->append(p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint64array_clear(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedInt64Array* array = opaque_value_ptr<PackedInt64Array>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->clear(); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint64array_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_params; " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedint64array_create()); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint64array_size_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedint64array_size(p_array_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint64array_get_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedint64array_get(p_array_ptr, p_index)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint64array_set_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" int64_t p_value = leanclr::interp::EvalStackOp::get_param<int64_t>(p_params, 2); " ,
" return godot_packedint64array_set(p_array_ptr, p_index, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint64array_add_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" int64_t p_value = leanclr::interp::EvalStackOp::get_param<int64_t>(p_params, 1); " ,
" return godot_packedint64array_add(p_array_ptr, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedint64array_clear_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_packedint64array_clear(p_array_ptr); " ,
" } " ,
" " ,
" intptr_t godot_packedfloat32array_create() noexcept " ,
" { " ,
" return new_opaque_value(PackedFloat32Array()); " ,
" } " ,
" " ,
" int32_t godot_packedfloat32array_size(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedFloat32Array* array = opaque_value_ptr<PackedFloat32Array>(p_array_ptr); " ,
" return array != nullptr ? static_cast<int32_t>(array->size()) : 0; " ,
" } " ,
" " ,
" float godot_packedfloat32array_get(intptr_t p_array_ptr, int32_t p_index) noexcept " ,
" { " ,
" PackedFloat32Array* array = opaque_value_ptr<PackedFloat32Array>(p_array_ptr); " ,
" return array != nullptr && p_index >= 0 && p_index < array->size() ? array->get(p_index) : 0.0f; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat32array_set(intptr_t p_array_ptr, int32_t p_index, float p_value) noexcept " ,
" { " ,
" PackedFloat32Array* array = opaque_value_ptr<PackedFloat32Array>(p_array_ptr); " ,
" if (array != nullptr && p_index >= 0 && p_index < array->size()) " ,
" { " ,
" array->set(p_index, p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat32array_add(intptr_t p_array_ptr, float p_value) noexcept " ,
" { " ,
" PackedFloat32Array* array = opaque_value_ptr<PackedFloat32Array>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->append(p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat32array_clear(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedFloat32Array* array = opaque_value_ptr<PackedFloat32Array>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->clear(); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat32array_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_params; " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedfloat32array_create()); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat32array_size_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedfloat32array_size(p_array_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat32array_get_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedfloat32array_get(p_array_ptr, p_index)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat32array_set_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" float p_value = leanclr::interp::EvalStackOp::get_param<float>(p_params, 2); " ,
" return godot_packedfloat32array_set(p_array_ptr, p_index, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat32array_add_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" float p_value = leanclr::interp::EvalStackOp::get_param<float>(p_params, 1); " ,
" return godot_packedfloat32array_add(p_array_ptr, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat32array_clear_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_packedfloat32array_clear(p_array_ptr); " ,
" } " ,
" " ,
" intptr_t godot_packedfloat64array_create() noexcept " ,
" { " ,
" return new_opaque_value(PackedFloat64Array()); " ,
" } " ,
" " ,
" int32_t godot_packedfloat64array_size(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedFloat64Array* array = opaque_value_ptr<PackedFloat64Array>(p_array_ptr); " ,
" return array != nullptr ? static_cast<int32_t>(array->size()) : 0; " ,
" } " ,
" " ,
" double godot_packedfloat64array_get(intptr_t p_array_ptr, int32_t p_index) noexcept " ,
" { " ,
" PackedFloat64Array* array = opaque_value_ptr<PackedFloat64Array>(p_array_ptr); " ,
" return array != nullptr && p_index >= 0 && p_index < array->size() ? array->get(p_index) : 0.0; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat64array_set(intptr_t p_array_ptr, int32_t p_index, double p_value) noexcept " ,
" { " ,
" PackedFloat64Array* array = opaque_value_ptr<PackedFloat64Array>(p_array_ptr); " ,
" if (array != nullptr && p_index >= 0 && p_index < array->size()) " ,
" { " ,
" array->set(p_index, p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat64array_add(intptr_t p_array_ptr, double p_value) noexcept " ,
" { " ,
" PackedFloat64Array* array = opaque_value_ptr<PackedFloat64Array>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->append(p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat64array_clear(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedFloat64Array* array = opaque_value_ptr<PackedFloat64Array>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->clear(); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat64array_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_params; " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedfloat64array_create()); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat64array_size_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedfloat64array_size(p_array_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat64array_get_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedfloat64array_get(p_array_ptr, p_index)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat64array_set_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" double p_value = leanclr::interp::EvalStackOp::get_param<double>(p_params, 2); " ,
" return godot_packedfloat64array_set(p_array_ptr, p_index, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat64array_add_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" double p_value = leanclr::interp::EvalStackOp::get_param<double>(p_params, 1); " ,
" return godot_packedfloat64array_add(p_array_ptr, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedfloat64array_clear_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_packedfloat64array_clear(p_array_ptr); " ,
" } " ,
" " ,
" intptr_t godot_packedvector2array_create() noexcept " ,
" { " ,
" return new_opaque_value(PackedVector2Array()); " ,
" } " ,
" " ,
" int32_t godot_packedvector2array_size(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedVector2Array* array = opaque_value_ptr<PackedVector2Array>(p_array_ptr); " ,
" return array != nullptr ? static_cast<int32_t>(array->size()) : 0; " ,
" } " ,
" " ,
" Vector2 godot_packedvector2array_get(intptr_t p_array_ptr, int32_t p_index) noexcept " ,
" { " ,
" PackedVector2Array* array = opaque_value_ptr<PackedVector2Array>(p_array_ptr); " ,
" return array != nullptr && p_index >= 0 && p_index < array->size() ? array->get(p_index) : Vector2(); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector2array_set(intptr_t p_array_ptr, int32_t p_index, Vector2 p_value) noexcept " ,
" { " ,
" PackedVector2Array* array = opaque_value_ptr<PackedVector2Array>(p_array_ptr); " ,
" if (array != nullptr && p_index >= 0 && p_index < array->size()) " ,
" { " ,
" array->set(p_index, p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector2array_add(intptr_t p_array_ptr, Vector2 p_value) noexcept " ,
" { " ,
" PackedVector2Array* array = opaque_value_ptr<PackedVector2Array>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->append(p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector2array_clear(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedVector2Array* array = opaque_value_ptr<PackedVector2Array>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->clear(); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector2array_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_params; " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedvector2array_create()); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector2array_size_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedvector2array_size(p_array_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector2array_get_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedvector2array_get(p_array_ptr, p_index)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector2array_set_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" Vector2 p_value = leanclr::interp::EvalStackOp::get_param<Vector2>(p_params, 2); " ,
" return godot_packedvector2array_set(p_array_ptr, p_index, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector2array_add_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" Vector2 p_value = leanclr::interp::EvalStackOp::get_param<Vector2>(p_params, 1); " ,
" return godot_packedvector2array_add(p_array_ptr, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector2array_clear_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_packedvector2array_clear(p_array_ptr); " ,
" } " ,
" " ,
" intptr_t godot_packedvector3array_create() noexcept " ,
" { " ,
" return new_opaque_value(PackedVector3Array()); " ,
" } " ,
" " ,
" int32_t godot_packedvector3array_size(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedVector3Array* array = opaque_value_ptr<PackedVector3Array>(p_array_ptr); " ,
" return array != nullptr ? static_cast<int32_t>(array->size()) : 0; " ,
" } " ,
" " ,
" Vector3 godot_packedvector3array_get(intptr_t p_array_ptr, int32_t p_index) noexcept " ,
" { " ,
" PackedVector3Array* array = opaque_value_ptr<PackedVector3Array>(p_array_ptr); " ,
" return array != nullptr && p_index >= 0 && p_index < array->size() ? array->get(p_index) : Vector3(); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector3array_set(intptr_t p_array_ptr, int32_t p_index, Vector3 p_value) noexcept " ,
" { " ,
" PackedVector3Array* array = opaque_value_ptr<PackedVector3Array>(p_array_ptr); " ,
" if (array != nullptr && p_index >= 0 && p_index < array->size()) " ,
" { " ,
" array->set(p_index, p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector3array_add(intptr_t p_array_ptr, Vector3 p_value) noexcept " ,
" { " ,
" PackedVector3Array* array = opaque_value_ptr<PackedVector3Array>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->append(p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector3array_clear(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedVector3Array* array = opaque_value_ptr<PackedVector3Array>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->clear(); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector3array_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_params; " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedvector3array_create()); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector3array_size_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedvector3array_size(p_array_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector3array_get_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedvector3array_get(p_array_ptr, p_index)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector3array_set_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" Vector3 p_value = leanclr::interp::EvalStackOp::get_param<Vector3>(p_params, 2); " ,
" return godot_packedvector3array_set(p_array_ptr, p_index, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector3array_add_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" Vector3 p_value = leanclr::interp::EvalStackOp::get_param<Vector3>(p_params, 1); " ,
" return godot_packedvector3array_add(p_array_ptr, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedvector3array_clear_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_packedvector3array_clear(p_array_ptr); " ,
" } " ,
" " ,
" intptr_t godot_packedcolorarray_create() noexcept " ,
" { " ,
" return new_opaque_value(PackedColorArray()); " ,
" } " ,
" " ,
" int32_t godot_packedcolorarray_size(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedColorArray* array = opaque_value_ptr<PackedColorArray>(p_array_ptr); " ,
" return array != nullptr ? static_cast<int32_t>(array->size()) : 0; " ,
" } " ,
" " ,
" Color godot_packedcolorarray_get(intptr_t p_array_ptr, int32_t p_index) noexcept " ,
" { " ,
" PackedColorArray* array = opaque_value_ptr<PackedColorArray>(p_array_ptr); " ,
" return array != nullptr && p_index >= 0 && p_index < array->size() ? array->get(p_index) : Color(); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedcolorarray_set(intptr_t p_array_ptr, int32_t p_index, Color p_value) noexcept " ,
" { " ,
" PackedColorArray* array = opaque_value_ptr<PackedColorArray>(p_array_ptr); " ,
" if (array != nullptr && p_index >= 0 && p_index < array->size()) " ,
" { " ,
" array->set(p_index, p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedcolorarray_add(intptr_t p_array_ptr, Color p_value) noexcept " ,
" { " ,
" PackedColorArray* array = opaque_value_ptr<PackedColorArray>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->append(p_value); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedcolorarray_clear(intptr_t p_array_ptr) noexcept " ,
" { " ,
" PackedColorArray* array = opaque_value_ptr<PackedColorArray>(p_array_ptr); " ,
" if (array != nullptr) " ,
" { " ,
" array->clear(); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedcolorarray_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_params; " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedcolorarray_create()); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedcolorarray_size_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedcolorarray_size(p_array_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedcolorarray_get_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedcolorarray_get(p_array_ptr, p_index)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedcolorarray_set_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" Color p_value = leanclr::interp::EvalStackOp::get_param<Color>(p_params, 2); " ,
" return godot_packedcolorarray_set(p_array_ptr, p_index, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedcolorarray_add_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" Color p_value = leanclr::interp::EvalStackOp::get_param<Color>(p_params, 1); " ,
" return godot_packedcolorarray_add(p_array_ptr, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedcolorarray_clear_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, const leanclr::metadata::RtMethodInfo* p_method, const leanclr::interp::RtStackObject* p_params, leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_packedcolorarray_clear(p_array_ptr); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_variant_stringify_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" ManagedVariant p_variant = leanclr::interp::EvalStackOp::get_param<ManagedVariant>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_variant_stringify(p_variant)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " , " leanclr::RtResultVoid godot_callable_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_target_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::vm::RtString* p_method_name = leanclr::interp::EvalStackOp::get_param<leanclr::vm::RtString*>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_callable_create(p_target_ptr, p_method_name)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_callable_isvalid_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_callable_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_callable_isvalid(p_callable_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_callable_getmethod_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_callable_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_callable_getmethod(p_callable_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_callable_call_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_callable_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::vm::RtArray* p_varargs = leanclr::interp::EvalStackOp::get_param<leanclr::vm::RtArray*>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_callable_call(p_callable_ptr, p_varargs)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_callable_bind_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_callable_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::vm::RtArray* p_varargs = leanclr::interp::EvalStackOp::get_param<leanclr::vm::RtArray*>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_callable_bind(p_callable_ptr, p_varargs)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_signal_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_target_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::vm::RtString* p_signal_name = leanclr::interp::EvalStackOp::get_param<leanclr::vm::RtString*>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_signal_create(p_target_ptr, p_signal_name)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_signal_isnull_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_signal_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_signal_isnull(p_signal_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_signal_getname_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_signal_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_signal_getname(p_signal_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_signal_connect_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_signal_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const intptr_t p_callable_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 1); " ,
" const int32_t p_flags = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 2); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_signal_connect(p_signal_ptr, p_callable_ptr, p_flags)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_signal_emit_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_signal_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::vm::RtArray* p_varargs = leanclr::interp::EvalStackOp::get_param<leanclr::vm::RtArray*>(p_params, 1); " ,
" return godot_signal_emit(p_signal_ptr, p_varargs); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedstringarray_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_params; " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedstringarray_create()); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedstringarray_destroy_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_packedstringarray_destroy(p_array_ptr); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedstringarray_size_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedstringarray_size(p_array_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedstringarray_get_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_packedstringarray_get(p_array_ptr, p_index)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_packedstringarray_append_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::vm::RtString* p_value = leanclr::interp::EvalStackOp::get_param<leanclr::vm::RtString*>(p_params, 1); " ,
" return godot_packedstringarray_append(p_array_ptr, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_opaquevalue_destroy_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_value_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_opaquevalue_destroy(p_value_ptr); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_params; " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_array_create()); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_size_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_array_size(p_array_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_get_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_array_get(p_array_ptr, p_index)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_set_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" ManagedVariant p_value = leanclr::interp::EvalStackOp::get_param<ManagedVariant>(p_params, 2); " ,
" return godot_array_set(p_array_ptr, p_index, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_add_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" ManagedVariant p_value = leanclr::interp::EvalStackOp::get_param<ManagedVariant>(p_params, 1); " ,
" return godot_array_add(p_array_ptr, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_insert_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" ManagedVariant p_value = leanclr::interp::EvalStackOp::get_param<ManagedVariant>(p_params, 2); " ,
" return godot_array_insert(p_array_ptr, p_index, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_removeat_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" const int32_t p_index = leanclr::interp::EvalStackOp::get_param<int32_t>(p_params, 1); " ,
" return godot_array_removeat(p_array_ptr, p_index); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_clear_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_array_clear(p_array_ptr); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_contains_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" ManagedVariant p_value = leanclr::interp::EvalStackOp::get_param<ManagedVariant>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_array_contains(p_array_ptr, p_value)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_array_indexof_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_array_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" ManagedVariant p_value = leanclr::interp::EvalStackOp::get_param<ManagedVariant>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_array_indexof(p_array_ptr, p_value)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_dictionary_create_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_params; " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_dictionary_create()); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_dictionary_size_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_dictionary_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_dictionary_size(p_dictionary_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_dictionary_containskey_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_dictionary_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" ManagedVariant p_key = leanclr::interp::EvalStackOp::get_param<ManagedVariant>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_dictionary_containskey(p_dictionary_ptr, p_key)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_dictionary_get_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_dictionary_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" ManagedVariant p_key = leanclr::interp::EvalStackOp::get_param<ManagedVariant>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_dictionary_get(p_dictionary_ptr, p_key)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_dictionary_set_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_dictionary_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" ManagedVariant p_key = leanclr::interp::EvalStackOp::get_param<ManagedVariant>(p_params, 1); " ,
" ManagedVariant p_value = leanclr::interp::EvalStackOp::get_param<ManagedVariant>(p_params, 10); " ,
" return godot_dictionary_set(p_dictionary_ptr, p_key, p_value); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_dictionary_remove_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_dictionary_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" ManagedVariant p_key = leanclr::interp::EvalStackOp::get_param<ManagedVariant>(p_params, 1); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_dictionary_remove(p_dictionary_ptr, p_key)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_dictionary_clear_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_dictionary_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_dictionary_clear(p_dictionary_ptr); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_dictionary_keys_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_dictionary_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_dictionary_keys(p_dictionary_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_dictionary_values_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" const intptr_t p_dictionary_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" leanclr::interp::EvalStackOp::set_return(p_ret, godot_dictionary_values(p_dictionary_ptr)); " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" template <typename T> " ,
" T* as_godot_object(intptr_t p_native_ptr) " ,
" { " ,
" return Object::cast_to<T>(reinterpret_cast<Object*>(p_native_ptr)); " ,
" } " ,
" " ,
" template <typename T> " ,
" intptr_t retain_refcounted(const Ref<T>& p_ref) " ,
" { " ,
" T* ptr = p_ref.ptr(); " ,
" if (ptr != nullptr) " ,
" { " ,
" ptr->reference(); " ,
" } " ,
" return reinterpret_cast<intptr_t>(ptr); " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_object_releaserefcounted(intptr_t p_native_ptr) noexcept " ,
" { " ,
" RefCounted* ref_counted = as_godot_object<RefCounted>(p_native_ptr); " ,
" if (ref_counted != nullptr && ref_counted->unreference()) " ,
" { " ,
" memdelete(ref_counted); " ,
" } " ,
" return leanclr::core::Unit {} ; " ,
" } " ,
" " ,
" leanclr::RtResultVoid godot_object_releaserefcounted_invoker(leanclr::metadata::RtManagedMethodPointer p_method_ptr, " ,
" const leanclr::metadata::RtMethodInfo* p_method, " ,
" const leanclr::interp::RtStackObject* p_params, " ,
" leanclr::interp::RtStackObject* p_ret) noexcept " ,
" { " ,
" (void)p_method_ptr; " ,
" (void)p_method; " ,
" (void)p_ret; " ,
" const intptr_t p_native_ptr = leanclr::interp::EvalStackOp::get_param<intptr_t>(p_params, 0); " ,
" return godot_object_releaserefcounted(p_native_ptr); " ,
" } " ,
" " ,
]
for method in methods :
body . append ( generate_native_method_function ( method ) . rstrip ( ) )
body . append ( " " )
body . append ( generate_native_invoker ( method ) . rstrip ( ) )
body . append ( " " )
body . extend ( [ " } // namespace " , " " , " void register_generated_godot_api_icalls() " , " { " ] )
body . extend (
[
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotObjectReleaseRefCounted(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_object_releaserefcounted), " ,
" godot_object_releaserefcounted_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotVariantStringify(Godot.Variant) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_variant_stringify), " ,
" godot_variant_stringify_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotCallableCreate(System.IntPtr,System.String) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_callable_create), " ,
" godot_callable_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotCallableIsValid(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_callable_isvalid), " ,
" godot_callable_isvalid_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotCallableGetMethod(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_callable_getmethod), " ,
" godot_callable_getmethod_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotCallableCall(System.IntPtr,Godot.Variant[]) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_callable_call), " ,
" godot_callable_call_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotCallableBind(System.IntPtr,Godot.Variant[]) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_callable_bind), " ,
" godot_callable_bind_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotSignalCreate(System.IntPtr,System.String) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_signal_create), " ,
" godot_signal_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotSignalIsNull(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_signal_isnull), " ,
" godot_signal_isnull_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotSignalGetName(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_signal_getname), " ,
" godot_signal_getname_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotSignalConnect(System.IntPtr,System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_signal_connect), " ,
" godot_signal_connect_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotSignalEmit(System.IntPtr,Godot.Variant[]) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_signal_emit), " ,
" godot_signal_emit_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedStringArrayCreate() \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedstringarray_create), " ,
" godot_packedstringarray_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedStringArrayDestroy(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedstringarray_destroy), " ,
" godot_packedstringarray_destroy_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedStringArraySize(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedstringarray_size), " ,
" godot_packedstringarray_size_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedStringArrayGet(System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedstringarray_get), " ,
" godot_packedstringarray_get_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedStringArrayAppend(System.IntPtr,System.String) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedstringarray_append), " ,
" godot_packedstringarray_append_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedByteArrayCreate() \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedbytearray_create), " ,
" godot_packedbytearray_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedByteArraySize(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedbytearray_size), " ,
" godot_packedbytearray_size_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedByteArrayGet(System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedbytearray_get), " ,
" godot_packedbytearray_get_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedByteArraySet(System.IntPtr,System.Int32,System.Byte) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedbytearray_set), " ,
" godot_packedbytearray_set_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedByteArrayAdd(System.IntPtr,System.Byte) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedbytearray_add), " ,
" godot_packedbytearray_add_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedByteArrayClear(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedbytearray_clear), " ,
" godot_packedbytearray_clear_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedInt32ArrayCreate() \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedint32array_create), " ,
" godot_packedint32array_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedInt32ArraySize(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedint32array_size), " ,
" godot_packedint32array_size_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedInt32ArrayGet(System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedint32array_get), " ,
" godot_packedint32array_get_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedInt32ArraySet(System.IntPtr,System.Int32,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedint32array_set), " ,
" godot_packedint32array_set_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedInt32ArrayAdd(System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedint32array_add), " ,
" godot_packedint32array_add_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedInt32ArrayClear(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedint32array_clear), " ,
" godot_packedint32array_clear_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedInt64ArrayCreate() \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedint64array_create), " ,
" godot_packedint64array_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedInt64ArraySize(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedint64array_size), " ,
" godot_packedint64array_size_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedInt64ArrayGet(System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedint64array_get), " ,
" godot_packedint64array_get_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedInt64ArraySet(System.IntPtr,System.Int32,System.Int64) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedint64array_set), " ,
" godot_packedint64array_set_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedInt64ArrayAdd(System.IntPtr,System.Int64) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedint64array_add), " ,
" godot_packedint64array_add_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedInt64ArrayClear(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedint64array_clear), " ,
" godot_packedint64array_clear_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedFloat32ArrayCreate() \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedfloat32array_create), " ,
" godot_packedfloat32array_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedFloat32ArraySize(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedfloat32array_size), " ,
" godot_packedfloat32array_size_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedFloat32ArrayGet(System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedfloat32array_get), " ,
" godot_packedfloat32array_get_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedFloat32ArraySet(System.IntPtr,System.Int32,System.Single) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedfloat32array_set), " ,
" godot_packedfloat32array_set_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedFloat32ArrayAdd(System.IntPtr,System.Single) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedfloat32array_add), " ,
" godot_packedfloat32array_add_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedFloat32ArrayClear(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedfloat32array_clear), " ,
" godot_packedfloat32array_clear_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedFloat64ArrayCreate() \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedfloat64array_create), " ,
" godot_packedfloat64array_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedFloat64ArraySize(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedfloat64array_size), " ,
" godot_packedfloat64array_size_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedFloat64ArrayGet(System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedfloat64array_get), " ,
" godot_packedfloat64array_get_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedFloat64ArraySet(System.IntPtr,System.Int32,System.Double) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedfloat64array_set), " ,
" godot_packedfloat64array_set_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedFloat64ArrayAdd(System.IntPtr,System.Double) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedfloat64array_add), " ,
" godot_packedfloat64array_add_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedFloat64ArrayClear(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedfloat64array_clear), " ,
" godot_packedfloat64array_clear_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedVector2ArrayCreate() \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedvector2array_create), " ,
" godot_packedvector2array_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedVector2ArraySize(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedvector2array_size), " ,
" godot_packedvector2array_size_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedVector2ArrayGet(System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedvector2array_get), " ,
" godot_packedvector2array_get_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedVector2ArraySet(System.IntPtr,System.Int32,Godot.Vector2) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedvector2array_set), " ,
" godot_packedvector2array_set_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedVector2ArrayAdd(System.IntPtr,Godot.Vector2) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedvector2array_add), " ,
" godot_packedvector2array_add_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedVector2ArrayClear(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedvector2array_clear), " ,
" godot_packedvector2array_clear_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedVector3ArrayCreate() \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedvector3array_create), " ,
" godot_packedvector3array_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedVector3ArraySize(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedvector3array_size), " ,
" godot_packedvector3array_size_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedVector3ArrayGet(System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedvector3array_get), " ,
" godot_packedvector3array_get_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedVector3ArraySet(System.IntPtr,System.Int32,Godot.Vector3) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedvector3array_set), " ,
" godot_packedvector3array_set_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedVector3ArrayAdd(System.IntPtr,Godot.Vector3) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedvector3array_add), " ,
" godot_packedvector3array_add_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedVector3ArrayClear(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedvector3array_clear), " ,
" godot_packedvector3array_clear_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedColorArrayCreate() \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedcolorarray_create), " ,
" godot_packedcolorarray_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedColorArraySize(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedcolorarray_size), " ,
" godot_packedcolorarray_size_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedColorArrayGet(System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedcolorarray_get), " ,
" godot_packedcolorarray_get_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedColorArraySet(System.IntPtr,System.Int32,Godot.Color) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedcolorarray_set), " ,
" godot_packedcolorarray_set_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedColorArrayAdd(System.IntPtr,Godot.Color) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedcolorarray_add), " ,
" godot_packedcolorarray_add_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotPackedColorArrayClear(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_packedcolorarray_clear), " ,
" godot_packedcolorarray_clear_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotOpaqueValueDestroy(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_opaquevalue_destroy), " ,
" godot_opaquevalue_destroy_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotArrayCreate() \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_array_create), " ,
" godot_array_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotArraySize(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_array_size), " ,
" godot_array_size_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotArrayGet(System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_array_get), " ,
" godot_array_get_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotArraySet(System.IntPtr,System.Int32,Godot.Variant) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_array_set), " ,
" godot_array_set_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotArrayAdd(System.IntPtr,Godot.Variant) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_array_add), " ,
" godot_array_add_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotArrayInsert(System.IntPtr,System.Int32,Godot.Variant) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_array_insert), " ,
" godot_array_insert_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotArrayRemoveAt(System.IntPtr,System.Int32) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_array_removeat), " ,
" godot_array_removeat_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotArrayClear(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_array_clear), " ,
" godot_array_clear_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotArrayContains(System.IntPtr,Godot.Variant) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_array_contains), " ,
" godot_array_contains_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotArrayIndexOf(System.IntPtr,Godot.Variant) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_array_indexof), " ,
" godot_array_indexof_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotDictionaryCreate() \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_dictionary_create), " ,
" godot_dictionary_create_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotDictionarySize(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_dictionary_size), " ,
" godot_dictionary_size_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotDictionaryContainsKey(System.IntPtr,Godot.Variant) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_dictionary_containskey), " ,
" godot_dictionary_containskey_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotDictionaryGet(System.IntPtr,Godot.Variant) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_dictionary_get), " ,
" godot_dictionary_get_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotDictionarySet(System.IntPtr,Godot.Variant,Godot.Variant) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_dictionary_set), " ,
" godot_dictionary_set_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotDictionaryRemove(System.IntPtr,Godot.Variant) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_dictionary_remove), " ,
" godot_dictionary_remove_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotDictionaryClear(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_dictionary_clear), " ,
" godot_dictionary_clear_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotDictionaryKeys(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_dictionary_keys), " ,
" godot_dictionary_keys_invoker); " ,
" leanclr::vm::InternalCalls::register_internal_call( \" Godot.NativeCalls::GodotDictionaryValues(System.IntPtr) \" , " ,
" reinterpret_cast<leanclr::vm::InternalCallFunction>(&godot_dictionary_values), " ,
" godot_dictionary_values_invoker); " ,
]
)
for method in methods :
fn = native_function_name ( method )
body . extend (
[
f " leanclr::vm::InternalCalls::register_internal_call( \" { icall_name ( method ) } \" , " ,
f " reinterpret_cast<leanclr::vm::InternalCallFunction>(& { fn } ), " ,
f " { fn } _invoker); " ,
]
)
body . extend ( [ " } " , " " , " } // namespace godot " , " " ] )
write ( src_dir / " generated " / " godot_api.generated.cpp " , " \n " . join ( body ) )
def generate_report ( report , report_path ) :
report_path . parent . mkdir ( parents = True , exist_ok = True )
report_path . write_text ( json . dumps ( report , indent = 2 , ensure_ascii = False ) + " \n " , encoding = " utf-8 " )
def generate_summary_report ( report , report_path ) :
overview = report [ " overview " ]
top_types = sorted ( report [ " unsupported_type_counts " ] . items ( ) , key = lambda item : item [ 1 ] , reverse = True ) [ : 20 ]
top_classes = sorted (
( row for row in report [ " per_class " ] if row [ " methods_generated " ] ) ,
key = lambda row : row [ " methods_generated " ] ,
reverse = True ,
) [ : 20 ]
lines = [
" # LeanCLR Godot Binding Statistics " ,
" " ,
" ## Overview " ,
" " ,
f " - API classes: { overview [ ' api_class_count ' ] } " ,
f " - Generated C# skeleton classes: { overview [ ' skeleton_class_count ' ] } ( { overview [ ' class_skeleton_coverage_pct ' ] } %) " ,
f " - Native-bound classes with generated methods: { overview [ ' native_bound_class_count ' ] } ( { overview [ ' native_class_coverage_pct ' ] } %) " ,
f " - API methods: { overview [ ' total_methods ' ] } " ,
f " - Generated methods: { overview [ ' generated_methods ' ] } ( { overview [ ' method_coverage_pct ' ] } %) " ,
f " - Generated native methods: { overview [ ' generated_native_methods ' ] } " ,
f " - Generated vararg bridges: { overview [ ' generated_vararg_bridges ' ] } " ,
f " - Generated virtual stubs: { overview [ ' generated_virtual_stubs ' ] } " ,
f " - Skipped methods: { overview [ ' skipped_methods ' ] } " ,
" " ,
" ## Skip Breakdown " ,
" " ,
]
for reason , count in sorted ( report [ " skipped_methods " ] . items ( ) , key = lambda item : item [ 1 ] , reverse = True ) :
lines . append ( f " - { reason } : { count } " )
lines . extend ( [ " " , " ## Top Unsupported Types " , " " ] )
for raw_type , count in top_types :
lines . append ( f " - { raw_type } : { count } " )
lines . extend ( [ " " , " ## Top Generated Classes " , " " ] )
for row in top_classes :
lines . append ( f " - { row [ ' class_name ' ] } : { row [ ' methods_generated ' ] } / { row [ ' methods_total ' ] } ( { row [ ' coverage_pct ' ] } %) " )
lines . append ( " " )
write ( report_path , " \n " . join ( lines ) )
def main ( ) :
parser = argparse . ArgumentParser ( description = " Generate minimal LeanCLR Godot bindings. " )
parser . add_argument ( " --api " , default = " extension_api.json " )
parser . add_argument ( " --managed-dir " , default = " managed/GodotSharpCompat " )
parser . add_argument ( " --src-dir " , default = " src " )
parser . add_argument ( " --report " , default = " tools/binding_generator/unsupported_api_report.json " )
parser . add_argument ( " --summary-report " , default = " tools/binding_generator/binding_statistics_report.md " )
args = parser . parse_args ( )
with open ( args . api , " r " , encoding = " utf-8 " ) as file :
api = json . load ( file )
classes , class_order , global_enums , methods , report = build_model ( api )
generate_managed ( classes , class_order , global_enums , api . get ( " builtin_classes " , [ ] ) , methods , Path ( args . managed_dir ) )
generate_native ( classes , methods , Path ( args . src_dir ) )
generate_report ( report , Path ( args . report ) )
generate_summary_report ( report , Path ( args . summary_report ) )
if __name__ == " __main__ " :
main ( )