godot/modules/gdnative/gdnative.cpp

1027 lines
48 KiB
C++

/*************************************************************************/
/* gdnative.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "gdnative.h"
#include "global_constants.h"
#include "io/file_access_encrypted.h"
#include "os/file_access.h"
#include "os/os.h"
#include "project_settings.h"
#include "scene/main/scene_tree.h"
const String init_symbol = "godot_gdnative_init";
const String terminate_symbol = "godot_gdnative_terminate";
const godot_gdnative_api_struct api_struct = {
.godot_color_new_rgba = godot_color_new_rgba,
.godot_color_new_rgb = godot_color_new_rgb,
.godot_color_get_r = godot_color_get_r,
.godot_color_set_r = godot_color_set_r,
.godot_color_get_g = godot_color_get_g,
.godot_color_set_g = godot_color_set_g,
.godot_color_get_b = godot_color_get_b,
.godot_color_set_b = godot_color_set_b,
.godot_color_get_a = godot_color_get_a,
.godot_color_set_a = godot_color_set_a,
.godot_color_get_h = godot_color_get_h,
.godot_color_get_s = godot_color_get_s,
.godot_color_get_v = godot_color_get_v,
.godot_color_as_string = godot_color_as_string,
.godot_color_to_rgba32 = godot_color_to_rgba32,
.godot_color_to_argb32 = godot_color_to_argb32,
.godot_color_gray = godot_color_gray,
.godot_color_inverted = godot_color_inverted,
.godot_color_contrasted = godot_color_contrasted,
.godot_color_linear_interpolate = godot_color_linear_interpolate,
.godot_color_blend = godot_color_blend,
.godot_color_to_html = godot_color_to_html,
.godot_color_operator_equal = godot_color_operator_equal,
.godot_color_operator_less = godot_color_operator_less,
.godot_vector2_new = godot_vector2_new,
.godot_vector2_as_string = godot_vector2_as_string,
.godot_vector2_normalized = godot_vector2_normalized,
.godot_vector2_length = godot_vector2_length,
.godot_vector2_angle = godot_vector2_angle,
.godot_vector2_length_squared = godot_vector2_length_squared,
.godot_vector2_is_normalized = godot_vector2_is_normalized,
.godot_vector2_distance_to = godot_vector2_distance_to,
.godot_vector2_distance_squared_to = godot_vector2_distance_squared_to,
.godot_vector2_angle_to = godot_vector2_angle_to,
.godot_vector2_angle_to_point = godot_vector2_angle_to_point,
.godot_vector2_linear_interpolate = godot_vector2_linear_interpolate,
.godot_vector2_cubic_interpolate = godot_vector2_cubic_interpolate,
.godot_vector2_rotated = godot_vector2_rotated,
.godot_vector2_tangent = godot_vector2_tangent,
.godot_vector2_floor = godot_vector2_floor,
.godot_vector2_snapped = godot_vector2_snapped,
.godot_vector2_aspect = godot_vector2_aspect,
.godot_vector2_dot = godot_vector2_dot,
.godot_vector2_slide = godot_vector2_slide,
.godot_vector2_bounce = godot_vector2_bounce,
.godot_vector2_reflect = godot_vector2_reflect,
.godot_vector2_abs = godot_vector2_abs,
.godot_vector2_clamped = godot_vector2_clamped,
.godot_vector2_operator_add = godot_vector2_operator_add,
.godot_vector2_operator_substract = godot_vector2_operator_substract,
.godot_vector2_operator_multiply_vector = godot_vector2_operator_multiply_vector,
.godot_vector2_operator_multiply_scalar = godot_vector2_operator_multiply_scalar,
.godot_vector2_operator_divide_vector = godot_vector2_operator_divide_vector,
.godot_vector2_operator_divide_scalar = godot_vector2_operator_divide_scalar,
.godot_vector2_operator_equal = godot_vector2_operator_equal,
.godot_vector2_operator_less = godot_vector2_operator_less,
.godot_vector2_operator_neg = godot_vector2_operator_neg,
.godot_vector2_set_x = godot_vector2_set_x,
.godot_vector2_set_y = godot_vector2_set_y,
.godot_vector2_get_x = godot_vector2_get_x,
.godot_vector2_get_y = godot_vector2_get_y,
.godot_quat_new = godot_quat_new,
.godot_quat_new_with_axis_angle = godot_quat_new_with_axis_angle,
.godot_quat_get_x = godot_quat_get_x,
.godot_quat_set_x = godot_quat_set_x,
.godot_quat_get_y = godot_quat_get_y,
.godot_quat_set_y = godot_quat_set_y,
.godot_quat_get_z = godot_quat_get_z,
.godot_quat_set_z = godot_quat_set_z,
.godot_quat_get_w = godot_quat_get_w,
.godot_quat_set_w = godot_quat_set_w,
.godot_quat_as_string = godot_quat_as_string,
.godot_quat_length = godot_quat_length,
.godot_quat_length_squared = godot_quat_length_squared,
.godot_quat_normalized = godot_quat_normalized,
.godot_quat_is_normalized = godot_quat_is_normalized,
.godot_quat_inverse = godot_quat_inverse,
.godot_quat_dot = godot_quat_dot,
.godot_quat_xform = godot_quat_xform,
.godot_quat_slerp = godot_quat_slerp,
.godot_quat_slerpni = godot_quat_slerpni,
.godot_quat_cubic_slerp = godot_quat_cubic_slerp,
.godot_quat_operator_multiply = godot_quat_operator_multiply,
.godot_quat_operator_add = godot_quat_operator_add,
.godot_quat_operator_substract = godot_quat_operator_substract,
.godot_quat_operator_divide = godot_quat_operator_divide,
.godot_quat_operator_equal = godot_quat_operator_equal,
.godot_quat_operator_neg = godot_quat_operator_neg,
.godot_basis_new_with_rows = godot_basis_new_with_rows,
.godot_basis_new_with_axis_and_angle = godot_basis_new_with_axis_and_angle,
.godot_basis_new_with_euler = godot_basis_new_with_euler,
.godot_basis_as_string = godot_basis_as_string,
.godot_basis_inverse = godot_basis_inverse,
.godot_basis_transposed = godot_basis_transposed,
.godot_basis_orthonormalized = godot_basis_orthonormalized,
.godot_basis_determinant = godot_basis_determinant,
.godot_basis_rotated = godot_basis_rotated,
.godot_basis_scaled = godot_basis_scaled,
.godot_basis_get_scale = godot_basis_get_scale,
.godot_basis_get_euler = godot_basis_get_euler,
.godot_basis_tdotx = godot_basis_tdotx,
.godot_basis_tdoty = godot_basis_tdoty,
.godot_basis_tdotz = godot_basis_tdotz,
.godot_basis_xform = godot_basis_xform,
.godot_basis_xform_inv = godot_basis_xform_inv,
.godot_basis_get_orthogonal_index = godot_basis_get_orthogonal_index,
.godot_basis_new = godot_basis_new,
.godot_basis_new_with_euler_quat = godot_basis_new_with_euler_quat,
.godot_basis_get_elements = godot_basis_get_elements,
.godot_basis_get_axis = godot_basis_get_axis,
.godot_basis_set_axis = godot_basis_set_axis,
.godot_basis_get_row = godot_basis_get_row,
.godot_basis_set_row = godot_basis_set_row,
.godot_basis_operator_equal = godot_basis_operator_equal,
.godot_basis_operator_add = godot_basis_operator_add,
.godot_basis_operator_substract = godot_basis_operator_substract,
.godot_basis_operator_multiply_vector = godot_basis_operator_multiply_vector,
.godot_basis_operator_multiply_scalar = godot_basis_operator_multiply_scalar,
.godot_vector3_new = godot_vector3_new,
.godot_vector3_as_string = godot_vector3_as_string,
.godot_vector3_min_axis = godot_vector3_min_axis,
.godot_vector3_max_axis = godot_vector3_max_axis,
.godot_vector3_length = godot_vector3_length,
.godot_vector3_length_squared = godot_vector3_length_squared,
.godot_vector3_is_normalized = godot_vector3_is_normalized,
.godot_vector3_normalized = godot_vector3_normalized,
.godot_vector3_inverse = godot_vector3_inverse,
.godot_vector3_snapped = godot_vector3_snapped,
.godot_vector3_rotated = godot_vector3_rotated,
.godot_vector3_linear_interpolate = godot_vector3_linear_interpolate,
.godot_vector3_cubic_interpolate = godot_vector3_cubic_interpolate,
.godot_vector3_dot = godot_vector3_dot,
.godot_vector3_cross = godot_vector3_cross,
.godot_vector3_outer = godot_vector3_outer,
.godot_vector3_to_diagonal_matrix = godot_vector3_to_diagonal_matrix,
.godot_vector3_abs = godot_vector3_abs,
.godot_vector3_floor = godot_vector3_floor,
.godot_vector3_ceil = godot_vector3_ceil,
.godot_vector3_distance_to = godot_vector3_distance_to,
.godot_vector3_distance_squared_to = godot_vector3_distance_squared_to,
.godot_vector3_angle_to = godot_vector3_angle_to,
.godot_vector3_slide = godot_vector3_slide,
.godot_vector3_bounce = godot_vector3_bounce,
.godot_vector3_reflect = godot_vector3_reflect,
.godot_vector3_operator_add = godot_vector3_operator_add,
.godot_vector3_operator_substract = godot_vector3_operator_substract,
.godot_vector3_operator_multiply_vector = godot_vector3_operator_multiply_vector,
.godot_vector3_operator_multiply_scalar = godot_vector3_operator_multiply_scalar,
.godot_vector3_operator_divide_vector = godot_vector3_operator_divide_vector,
.godot_vector3_operator_divide_scalar = godot_vector3_operator_divide_scalar,
.godot_vector3_operator_equal = godot_vector3_operator_equal,
.godot_vector3_operator_less = godot_vector3_operator_less,
.godot_vector3_operator_neg = godot_vector3_operator_neg,
.godot_vector3_set_axis = godot_vector3_set_axis,
.godot_vector3_get_axis = godot_vector3_get_axis,
.godot_pool_byte_array_new = godot_pool_byte_array_new,
.godot_pool_byte_array_new_copy = godot_pool_byte_array_new_copy,
.godot_pool_byte_array_new_with_array = godot_pool_byte_array_new_with_array,
.godot_pool_byte_array_append = godot_pool_byte_array_append,
.godot_pool_byte_array_append_array = godot_pool_byte_array_append_array,
.godot_pool_byte_array_insert = godot_pool_byte_array_insert,
.godot_pool_byte_array_invert = godot_pool_byte_array_invert,
.godot_pool_byte_array_push_back = godot_pool_byte_array_push_back,
.godot_pool_byte_array_remove = godot_pool_byte_array_remove,
.godot_pool_byte_array_resize = godot_pool_byte_array_resize,
.godot_pool_byte_array_set = godot_pool_byte_array_set,
.godot_pool_byte_array_get = godot_pool_byte_array_get,
.godot_pool_byte_array_size = godot_pool_byte_array_size,
.godot_pool_byte_array_destroy = godot_pool_byte_array_destroy,
.godot_pool_int_array_new = godot_pool_int_array_new,
.godot_pool_int_array_new_copy = godot_pool_int_array_new_copy,
.godot_pool_int_array_new_with_array = godot_pool_int_array_new_with_array,
.godot_pool_int_array_append = godot_pool_int_array_append,
.godot_pool_int_array_append_array = godot_pool_int_array_append_array,
.godot_pool_int_array_insert = godot_pool_int_array_insert,
.godot_pool_int_array_invert = godot_pool_int_array_invert,
.godot_pool_int_array_push_back = godot_pool_int_array_push_back,
.godot_pool_int_array_remove = godot_pool_int_array_remove,
.godot_pool_int_array_resize = godot_pool_int_array_resize,
.godot_pool_int_array_set = godot_pool_int_array_set,
.godot_pool_int_array_get = godot_pool_int_array_get,
.godot_pool_int_array_size = godot_pool_int_array_size,
.godot_pool_int_array_destroy = godot_pool_int_array_destroy,
.godot_pool_real_array_new = godot_pool_real_array_new,
.godot_pool_real_array_new_copy = godot_pool_real_array_new_copy,
.godot_pool_real_array_new_with_array = godot_pool_real_array_new_with_array,
.godot_pool_real_array_append = godot_pool_real_array_append,
.godot_pool_real_array_append_array = godot_pool_real_array_append_array,
.godot_pool_real_array_insert = godot_pool_real_array_insert,
.godot_pool_real_array_invert = godot_pool_real_array_invert,
.godot_pool_real_array_push_back = godot_pool_real_array_push_back,
.godot_pool_real_array_remove = godot_pool_real_array_remove,
.godot_pool_real_array_resize = godot_pool_real_array_resize,
.godot_pool_real_array_set = godot_pool_real_array_set,
.godot_pool_real_array_get = godot_pool_real_array_get,
.godot_pool_real_array_size = godot_pool_real_array_size,
.godot_pool_real_array_destroy = godot_pool_real_array_destroy,
.godot_pool_string_array_new = godot_pool_string_array_new,
.godot_pool_string_array_new_copy = godot_pool_string_array_new_copy,
.godot_pool_string_array_new_with_array = godot_pool_string_array_new_with_array,
.godot_pool_string_array_append = godot_pool_string_array_append,
.godot_pool_string_array_append_array = godot_pool_string_array_append_array,
.godot_pool_string_array_insert = godot_pool_string_array_insert,
.godot_pool_string_array_invert = godot_pool_string_array_invert,
.godot_pool_string_array_push_back = godot_pool_string_array_push_back,
.godot_pool_string_array_remove = godot_pool_string_array_remove,
.godot_pool_string_array_resize = godot_pool_string_array_resize,
.godot_pool_string_array_set = godot_pool_string_array_set,
.godot_pool_string_array_get = godot_pool_string_array_get,
.godot_pool_string_array_size = godot_pool_string_array_size,
.godot_pool_string_array_destroy = godot_pool_string_array_destroy,
.godot_pool_vector2_array_new = godot_pool_vector2_array_new,
.godot_pool_vector2_array_new_copy = godot_pool_vector2_array_new_copy,
.godot_pool_vector2_array_new_with_array = godot_pool_vector2_array_new_with_array,
.godot_pool_vector2_array_append = godot_pool_vector2_array_append,
.godot_pool_vector2_array_append_array = godot_pool_vector2_array_append_array,
.godot_pool_vector2_array_insert = godot_pool_vector2_array_insert,
.godot_pool_vector2_array_invert = godot_pool_vector2_array_invert,
.godot_pool_vector2_array_push_back = godot_pool_vector2_array_push_back,
.godot_pool_vector2_array_remove = godot_pool_vector2_array_remove,
.godot_pool_vector2_array_resize = godot_pool_vector2_array_resize,
.godot_pool_vector2_array_set = godot_pool_vector2_array_set,
.godot_pool_vector2_array_get = godot_pool_vector2_array_get,
.godot_pool_vector2_array_size = godot_pool_vector2_array_size,
.godot_pool_vector2_array_destroy = godot_pool_vector2_array_destroy,
.godot_pool_vector3_array_new = godot_pool_vector3_array_new,
.godot_pool_vector3_array_new_copy = godot_pool_vector3_array_new_copy,
.godot_pool_vector3_array_new_with_array = godot_pool_vector3_array_new_with_array,
.godot_pool_vector3_array_append = godot_pool_vector3_array_append,
.godot_pool_vector3_array_append_array = godot_pool_vector3_array_append_array,
.godot_pool_vector3_array_insert = godot_pool_vector3_array_insert,
.godot_pool_vector3_array_invert = godot_pool_vector3_array_invert,
.godot_pool_vector3_array_push_back = godot_pool_vector3_array_push_back,
.godot_pool_vector3_array_remove = godot_pool_vector3_array_remove,
.godot_pool_vector3_array_resize = godot_pool_vector3_array_resize,
.godot_pool_vector3_array_set = godot_pool_vector3_array_set,
.godot_pool_vector3_array_get = godot_pool_vector3_array_get,
.godot_pool_vector3_array_size = godot_pool_vector3_array_size,
.godot_pool_vector3_array_destroy = godot_pool_vector3_array_destroy,
.godot_pool_color_array_new = godot_pool_color_array_new,
.godot_pool_color_array_new_copy = godot_pool_color_array_new_copy,
.godot_pool_color_array_new_with_array = godot_pool_color_array_new_with_array,
.godot_pool_color_array_append = godot_pool_color_array_append,
.godot_pool_color_array_append_array = godot_pool_color_array_append_array,
.godot_pool_color_array_insert = godot_pool_color_array_insert,
.godot_pool_color_array_invert = godot_pool_color_array_invert,
.godot_pool_color_array_push_back = godot_pool_color_array_push_back,
.godot_pool_color_array_remove = godot_pool_color_array_remove,
.godot_pool_color_array_resize = godot_pool_color_array_resize,
.godot_pool_color_array_set = godot_pool_color_array_set,
.godot_pool_color_array_get = godot_pool_color_array_get,
.godot_pool_color_array_size = godot_pool_color_array_size,
.godot_pool_color_array_destroy = godot_pool_color_array_destroy,
.godot_array_new = godot_array_new,
.godot_array_new_copy = godot_array_new_copy,
.godot_array_new_pool_color_array = godot_array_new_pool_color_array,
.godot_array_new_pool_vector3_array = godot_array_new_pool_vector3_array,
.godot_array_new_pool_vector2_array = godot_array_new_pool_vector2_array,
.godot_array_new_pool_string_array = godot_array_new_pool_string_array,
.godot_array_new_pool_real_array = godot_array_new_pool_real_array,
.godot_array_new_pool_int_array = godot_array_new_pool_int_array,
.godot_array_new_pool_byte_array = godot_array_new_pool_byte_array,
.godot_array_set = godot_array_set,
.godot_array_get = godot_array_get,
.godot_array_operator_index = godot_array_operator_index,
.godot_array_append = godot_array_append,
.godot_array_clear = godot_array_clear,
.godot_array_count = godot_array_count,
.godot_array_empty = godot_array_empty,
.godot_array_erase = godot_array_erase,
.godot_array_front = godot_array_front,
.godot_array_back = godot_array_back,
.godot_array_find = godot_array_find,
.godot_array_find_last = godot_array_find_last,
.godot_array_has = godot_array_has,
.godot_array_hash = godot_array_hash,
.godot_array_insert = godot_array_insert,
.godot_array_invert = godot_array_invert,
.godot_array_pop_back = godot_array_pop_back,
.godot_array_pop_front = godot_array_pop_front,
.godot_array_push_back = godot_array_push_back,
.godot_array_push_front = godot_array_push_front,
.godot_array_remove = godot_array_remove,
.godot_array_resize = godot_array_resize,
.godot_array_rfind = godot_array_rfind,
.godot_array_size = godot_array_size,
.godot_array_sort = godot_array_sort,
.godot_array_sort_custom = godot_array_sort_custom,
.godot_array_destroy = godot_array_destroy,
.godot_dictionary_new = godot_dictionary_new,
.godot_dictionary_new_copy = godot_dictionary_new_copy,
.godot_dictionary_destroy = godot_dictionary_destroy,
.godot_dictionary_size = godot_dictionary_size,
.godot_dictionary_empty = godot_dictionary_empty,
.godot_dictionary_clear = godot_dictionary_clear,
.godot_dictionary_has = godot_dictionary_has,
.godot_dictionary_has_all = godot_dictionary_has_all,
.godot_dictionary_erase = godot_dictionary_erase,
.godot_dictionary_hash = godot_dictionary_hash,
.godot_dictionary_keys = godot_dictionary_keys,
.godot_dictionary_values = godot_dictionary_values,
.godot_dictionary_get = godot_dictionary_get,
.godot_dictionary_set = godot_dictionary_set,
.godot_dictionary_operator_index = godot_dictionary_operator_index,
.godot_dictionary_next = godot_dictionary_next,
.godot_dictionary_operator_equal = godot_dictionary_operator_equal,
.godot_dictionary_to_json = godot_dictionary_to_json,
.godot_node_path_new = godot_node_path_new,
.godot_node_path_new_copy = godot_node_path_new_copy,
.godot_node_path_destroy = godot_node_path_destroy,
.godot_node_path_as_string = godot_node_path_as_string,
.godot_node_path_is_absolute = godot_node_path_is_absolute,
.godot_node_path_get_name_count = godot_node_path_get_name_count,
.godot_node_path_get_name = godot_node_path_get_name,
.godot_node_path_get_subname_count = godot_node_path_get_subname_count,
.godot_node_path_get_subname = godot_node_path_get_subname,
.godot_node_path_get_property = godot_node_path_get_property,
.godot_node_path_is_empty = godot_node_path_is_empty,
.godot_node_path_operator_equal = godot_node_path_operator_equal,
.godot_plane_new_with_reals = godot_plane_new_with_reals,
.godot_plane_new_with_vectors = godot_plane_new_with_vectors,
.godot_plane_new_with_normal = godot_plane_new_with_normal,
.godot_plane_as_string = godot_plane_as_string,
.godot_plane_normalized = godot_plane_normalized,
.godot_plane_center = godot_plane_center,
.godot_plane_get_any_point = godot_plane_get_any_point,
.godot_plane_is_point_over = godot_plane_is_point_over,
.godot_plane_distance_to = godot_plane_distance_to,
.godot_plane_has_point = godot_plane_has_point,
.godot_plane_project = godot_plane_project,
.godot_plane_intersect_3 = godot_plane_intersect_3,
.godot_plane_intersects_ray = godot_plane_intersects_ray,
.godot_plane_intersects_segment = godot_plane_intersects_segment,
.godot_plane_operator_neg = godot_plane_operator_neg,
.godot_plane_operator_equal = godot_plane_operator_equal,
.godot_plane_set_normal = godot_plane_set_normal,
.godot_plane_get_normal = godot_plane_get_normal,
.godot_plane_get_d = godot_plane_get_d,
.godot_plane_set_d = godot_plane_set_d,
.godot_rect2_new_with_position_and_size = godot_rect2_new_with_position_and_size,
.godot_rect2_new = godot_rect2_new,
.godot_rect2_as_string = godot_rect2_as_string,
.godot_rect2_get_area = godot_rect2_get_area,
.godot_rect2_intersects = godot_rect2_intersects,
.godot_rect2_encloses = godot_rect2_encloses,
.godot_rect2_has_no_area = godot_rect2_has_no_area,
.godot_rect2_clip = godot_rect2_clip,
.godot_rect2_merge = godot_rect2_merge,
.godot_rect2_has_point = godot_rect2_has_point,
.godot_rect2_grow = godot_rect2_grow,
.godot_rect2_expand = godot_rect2_expand,
.godot_rect2_operator_equal = godot_rect2_operator_equal,
.godot_rect2_get_position = godot_rect2_get_position,
.godot_rect2_get_size = godot_rect2_get_size,
.godot_rect2_set_position = godot_rect2_set_position,
.godot_rect2_set_size = godot_rect2_set_size,
.godot_rect3_new = godot_rect3_new,
.godot_rect3_get_position = godot_rect3_get_position,
.godot_rect3_set_position = godot_rect3_set_position,
.godot_rect3_get_size = godot_rect3_get_size,
.godot_rect3_set_size = godot_rect3_set_size,
.godot_rect3_as_string = godot_rect3_as_string,
.godot_rect3_get_area = godot_rect3_get_area,
.godot_rect3_has_no_area = godot_rect3_has_no_area,
.godot_rect3_has_no_surface = godot_rect3_has_no_surface,
.godot_rect3_intersects = godot_rect3_intersects,
.godot_rect3_encloses = godot_rect3_encloses,
.godot_rect3_merge = godot_rect3_merge,
.godot_rect3_intersection = godot_rect3_intersection,
.godot_rect3_intersects_plane = godot_rect3_intersects_plane,
.godot_rect3_intersects_segment = godot_rect3_intersects_segment,
.godot_rect3_has_point = godot_rect3_has_point,
.godot_rect3_get_support = godot_rect3_get_support,
.godot_rect3_get_longest_axis = godot_rect3_get_longest_axis,
.godot_rect3_get_longest_axis_index = godot_rect3_get_longest_axis_index,
.godot_rect3_get_longest_axis_size = godot_rect3_get_longest_axis_size,
.godot_rect3_get_shortest_axis = godot_rect3_get_shortest_axis,
.godot_rect3_get_shortest_axis_index = godot_rect3_get_shortest_axis_index,
.godot_rect3_get_shortest_axis_size = godot_rect3_get_shortest_axis_size,
.godot_rect3_expand = godot_rect3_expand,
.godot_rect3_grow = godot_rect3_grow,
.godot_rect3_get_endpoint = godot_rect3_get_endpoint,
.godot_rect3_operator_equal = godot_rect3_operator_equal,
.godot_rid_new = godot_rid_new,
.godot_rid_get_id = godot_rid_get_id,
.godot_rid_new_with_resource = godot_rid_new_with_resource,
.godot_rid_operator_equal = godot_rid_operator_equal,
.godot_rid_operator_less = godot_rid_operator_less,
.godot_transform_new_with_axis_origin = godot_transform_new_with_axis_origin,
.godot_transform_new = godot_transform_new,
.godot_transform_get_basis = godot_transform_get_basis,
.godot_transform_set_basis = godot_transform_set_basis,
.godot_transform_get_origin = godot_transform_get_origin,
.godot_transform_set_origin = godot_transform_set_origin,
.godot_transform_as_string = godot_transform_as_string,
.godot_transform_inverse = godot_transform_inverse,
.godot_transform_affine_inverse = godot_transform_affine_inverse,
.godot_transform_orthonormalized = godot_transform_orthonormalized,
.godot_transform_rotated = godot_transform_rotated,
.godot_transform_scaled = godot_transform_scaled,
.godot_transform_translated = godot_transform_translated,
.godot_transform_looking_at = godot_transform_looking_at,
.godot_transform_xform_plane = godot_transform_xform_plane,
.godot_transform_xform_inv_plane = godot_transform_xform_inv_plane,
.godot_transform_new_identity = godot_transform_new_identity,
.godot_transform_operator_equal = godot_transform_operator_equal,
.godot_transform_operator_multiply = godot_transform_operator_multiply,
.godot_transform_xform_vector3 = godot_transform_xform_vector3,
.godot_transform_xform_inv_vector3 = godot_transform_xform_inv_vector3,
.godot_transform_xform_rect3 = godot_transform_xform_rect3,
.godot_transform_xform_inv_rect3 = godot_transform_xform_inv_rect3,
.godot_transform2d_new = godot_transform2d_new,
.godot_transform2d_new_axis_origin = godot_transform2d_new_axis_origin,
.godot_transform2d_as_string = godot_transform2d_as_string,
.godot_transform2d_inverse = godot_transform2d_inverse,
.godot_transform2d_affine_inverse = godot_transform2d_affine_inverse,
.godot_transform2d_get_rotation = godot_transform2d_get_rotation,
.godot_transform2d_get_origin = godot_transform2d_get_origin,
.godot_transform2d_get_scale = godot_transform2d_get_scale,
.godot_transform2d_orthonormalized = godot_transform2d_orthonormalized,
.godot_transform2d_rotated = godot_transform2d_rotated,
.godot_transform2d_scaled = godot_transform2d_scaled,
.godot_transform2d_translated = godot_transform2d_translated,
.godot_transform2d_xform_vector2 = godot_transform2d_xform_vector2,
.godot_transform2d_xform_inv_vector2 = godot_transform2d_xform_inv_vector2,
.godot_transform2d_basis_xform_vector2 = godot_transform2d_basis_xform_vector2,
.godot_transform2d_basis_xform_inv_vector2 = godot_transform2d_basis_xform_inv_vector2,
.godot_transform2d_interpolate_with = godot_transform2d_interpolate_with,
.godot_transform2d_operator_equal = godot_transform2d_operator_equal,
.godot_transform2d_operator_multiply = godot_transform2d_operator_multiply,
.godot_transform2d_new_identity = godot_transform2d_new_identity,
.godot_transform2d_xform_rect2 = godot_transform2d_xform_rect2,
.godot_transform2d_xform_inv_rect2 = godot_transform2d_xform_inv_rect2,
.godot_variant_get_type = godot_variant_get_type,
.godot_variant_new_copy = godot_variant_new_copy,
.godot_variant_new_nil = godot_variant_new_nil,
.godot_variant_new_bool = godot_variant_new_bool,
.godot_variant_new_uint = godot_variant_new_uint,
.godot_variant_new_int = godot_variant_new_int,
.godot_variant_new_real = godot_variant_new_real,
.godot_variant_new_string = godot_variant_new_string,
.godot_variant_new_vector2 = godot_variant_new_vector2,
.godot_variant_new_rect2 = godot_variant_new_rect2,
.godot_variant_new_vector3 = godot_variant_new_vector3,
.godot_variant_new_transform2d = godot_variant_new_transform2d,
.godot_variant_new_plane = godot_variant_new_plane,
.godot_variant_new_quat = godot_variant_new_quat,
.godot_variant_new_rect3 = godot_variant_new_rect3,
.godot_variant_new_basis = godot_variant_new_basis,
.godot_variant_new_transform = godot_variant_new_transform,
.godot_variant_new_color = godot_variant_new_color,
.godot_variant_new_node_path = godot_variant_new_node_path,
.godot_variant_new_rid = godot_variant_new_rid,
.godot_variant_new_object = godot_variant_new_object,
.godot_variant_new_dictionary = godot_variant_new_dictionary,
.godot_variant_new_array = godot_variant_new_array,
.godot_variant_new_pool_byte_array = godot_variant_new_pool_byte_array,
.godot_variant_new_pool_int_array = godot_variant_new_pool_int_array,
.godot_variant_new_pool_real_array = godot_variant_new_pool_real_array,
.godot_variant_new_pool_string_array = godot_variant_new_pool_string_array,
.godot_variant_new_pool_vector2_array = godot_variant_new_pool_vector2_array,
.godot_variant_new_pool_vector3_array = godot_variant_new_pool_vector3_array,
.godot_variant_new_pool_color_array = godot_variant_new_pool_color_array,
.godot_variant_as_bool = godot_variant_as_bool,
.godot_variant_as_uint = godot_variant_as_uint,
.godot_variant_as_int = godot_variant_as_int,
.godot_variant_as_real = godot_variant_as_real,
.godot_variant_as_string = godot_variant_as_string,
.godot_variant_as_vector2 = godot_variant_as_vector2,
.godot_variant_as_rect2 = godot_variant_as_rect2,
.godot_variant_as_vector3 = godot_variant_as_vector3,
.godot_variant_as_transform2d = godot_variant_as_transform2d,
.godot_variant_as_plane = godot_variant_as_plane,
.godot_variant_as_quat = godot_variant_as_quat,
.godot_variant_as_rect3 = godot_variant_as_rect3,
.godot_variant_as_basis = godot_variant_as_basis,
.godot_variant_as_transform = godot_variant_as_transform,
.godot_variant_as_color = godot_variant_as_color,
.godot_variant_as_node_path = godot_variant_as_node_path,
.godot_variant_as_rid = godot_variant_as_rid,
.godot_variant_as_object = godot_variant_as_object,
.godot_variant_as_dictionary = godot_variant_as_dictionary,
.godot_variant_as_array = godot_variant_as_array,
.godot_variant_as_pool_byte_array = godot_variant_as_pool_byte_array,
.godot_variant_as_pool_int_array = godot_variant_as_pool_int_array,
.godot_variant_as_pool_real_array = godot_variant_as_pool_real_array,
.godot_variant_as_pool_string_array = godot_variant_as_pool_string_array,
.godot_variant_as_pool_vector2_array = godot_variant_as_pool_vector2_array,
.godot_variant_as_pool_vector3_array = godot_variant_as_pool_vector3_array,
.godot_variant_as_pool_color_array = godot_variant_as_pool_color_array,
.godot_variant_call = godot_variant_call,
.godot_variant_has_method = godot_variant_has_method,
.godot_variant_operator_equal = godot_variant_operator_equal,
.godot_variant_operator_less = godot_variant_operator_less,
.godot_variant_hash_compare = godot_variant_hash_compare,
.godot_variant_booleanize = godot_variant_booleanize,
.godot_variant_destroy = godot_variant_destroy,
.godot_string_new = godot_string_new,
.godot_string_new_copy = godot_string_new_copy,
.godot_string_new_data = godot_string_new_data,
.godot_string_new_unicode_data = godot_string_new_unicode_data,
.godot_string_get_data = godot_string_get_data,
.godot_string_operator_index = godot_string_operator_index,
.godot_string_c_str = godot_string_c_str,
.godot_string_unicode_str = godot_string_unicode_str,
.godot_string_operator_equal = godot_string_operator_equal,
.godot_string_operator_less = godot_string_operator_less,
.godot_string_operator_plus = godot_string_operator_plus,
.godot_string_length = godot_string_length,
.godot_string_begins_with = godot_string_begins_with,
.godot_string_begins_with_char_array = godot_string_begins_with_char_array,
.godot_string_bigrams = godot_string_bigrams,
.godot_string_chr = godot_string_chr,
.godot_string_ends_with = godot_string_ends_with,
.godot_string_find = godot_string_find,
.godot_string_find_from = godot_string_find_from,
.godot_string_findmk = godot_string_findmk,
.godot_string_findmk_from = godot_string_findmk_from,
.godot_string_findmk_from_in_place = godot_string_findmk_from_in_place,
.godot_string_findn = godot_string_findn,
.godot_string_findn_from = godot_string_findn_from,
.godot_string_find_last = godot_string_find_last,
.godot_string_format = godot_string_format,
.godot_string_format_with_custom_placeholder = godot_string_format_with_custom_placeholder,
.godot_string_hex_encode_buffer = godot_string_hex_encode_buffer,
.godot_string_hex_to_int = godot_string_hex_to_int,
.godot_string_hex_to_int_without_prefix = godot_string_hex_to_int_without_prefix,
.godot_string_insert = godot_string_insert,
.godot_string_is_numeric = godot_string_is_numeric,
.godot_string_is_subsequence_of = godot_string_is_subsequence_of,
.godot_string_is_subsequence_ofi = godot_string_is_subsequence_ofi,
.godot_string_lpad = godot_string_lpad,
.godot_string_lpad_with_custom_character = godot_string_lpad_with_custom_character,
.godot_string_match = godot_string_match,
.godot_string_matchn = godot_string_matchn,
.godot_string_md5 = godot_string_md5,
.godot_string_num = godot_string_num,
.godot_string_num_int64 = godot_string_num_int64,
.godot_string_num_int64_capitalized = godot_string_num_int64_capitalized,
.godot_string_num_real = godot_string_num_real,
.godot_string_num_scientific = godot_string_num_scientific,
.godot_string_num_with_decimals = godot_string_num_with_decimals,
.godot_string_pad_decimals = godot_string_pad_decimals,
.godot_string_pad_zeros = godot_string_pad_zeros,
.godot_string_replace_first = godot_string_replace_first,
.godot_string_replace = godot_string_replace,
.godot_string_replacen = godot_string_replacen,
.godot_string_rfind = godot_string_rfind,
.godot_string_rfindn = godot_string_rfindn,
.godot_string_rfind_from = godot_string_rfind_from,
.godot_string_rfindn_from = godot_string_rfindn_from,
.godot_string_rpad = godot_string_rpad,
.godot_string_rpad_with_custom_character = godot_string_rpad_with_custom_character,
.godot_string_similarity = godot_string_similarity,
.godot_string_sprintf = godot_string_sprintf,
.godot_string_substr = godot_string_substr,
.godot_string_to_double = godot_string_to_double,
.godot_string_to_float = godot_string_to_float,
.godot_string_to_int = godot_string_to_int,
.godot_string_camelcase_to_underscore = godot_string_camelcase_to_underscore,
.godot_string_camelcase_to_underscore_lowercased = godot_string_camelcase_to_underscore_lowercased,
.godot_string_capitalize = godot_string_capitalize,
.godot_string_char_to_double = godot_string_char_to_double,
.godot_string_char_to_int = godot_string_char_to_int,
.godot_string_wchar_to_int = godot_string_wchar_to_int,
.godot_string_char_to_int_with_len = godot_string_char_to_int_with_len,
.godot_string_char_to_int64_with_len = godot_string_char_to_int64_with_len,
.godot_string_hex_to_int64 = godot_string_hex_to_int64,
.godot_string_hex_to_int64_with_prefix = godot_string_hex_to_int64_with_prefix,
.godot_string_to_int64 = godot_string_to_int64,
.godot_string_unicode_char_to_double = godot_string_unicode_char_to_double,
.godot_string_get_slice_count = godot_string_get_slice_count,
.godot_string_get_slice = godot_string_get_slice,
.godot_string_get_slicec = godot_string_get_slicec,
.godot_string_split = godot_string_split,
.godot_string_split_allow_empty = godot_string_split_allow_empty,
.godot_string_split_floats = godot_string_split_floats,
.godot_string_split_floats_allows_empty = godot_string_split_floats_allows_empty,
.godot_string_split_floats_mk = godot_string_split_floats_mk,
.godot_string_split_floats_mk_allows_empty = godot_string_split_floats_mk_allows_empty,
.godot_string_split_ints = godot_string_split_ints,
.godot_string_split_ints_allows_empty = godot_string_split_ints_allows_empty,
.godot_string_split_ints_mk = godot_string_split_ints_mk,
.godot_string_split_ints_mk_allows_empty = godot_string_split_ints_mk_allows_empty,
.godot_string_split_spaces = godot_string_split_spaces,
.godot_string_char_lowercase = godot_string_char_lowercase,
.godot_string_char_uppercase = godot_string_char_uppercase,
.godot_string_to_lower = godot_string_to_lower,
.godot_string_to_upper = godot_string_to_upper,
.godot_string_get_basename = godot_string_get_basename,
.godot_string_get_extension = godot_string_get_extension,
.godot_string_left = godot_string_left,
.godot_string_ord_at = godot_string_ord_at,
.godot_string_plus_file = godot_string_plus_file,
.godot_string_right = godot_string_right,
.godot_string_strip_edges = godot_string_strip_edges,
.godot_string_strip_escapes = godot_string_strip_escapes,
.godot_string_erase = godot_string_erase,
.godot_string_ascii = godot_string_ascii,
.godot_string_ascii_extended = godot_string_ascii_extended,
.godot_string_utf8 = godot_string_utf8,
.godot_string_parse_utf8 = godot_string_parse_utf8,
.godot_string_parse_utf8_with_len = godot_string_parse_utf8_with_len,
.godot_string_chars_to_utf8 = godot_string_chars_to_utf8,
.godot_string_chars_to_utf8_with_len = godot_string_chars_to_utf8_with_len,
.godot_string_hash = godot_string_hash,
.godot_string_hash64 = godot_string_hash64,
.godot_string_hash_chars = godot_string_hash_chars,
.godot_string_hash_chars_with_len = godot_string_hash_chars_with_len,
.godot_string_hash_utf8_chars = godot_string_hash_utf8_chars,
.godot_string_hash_utf8_chars_with_len = godot_string_hash_utf8_chars_with_len,
.godot_string_md5_buffer = godot_string_md5_buffer,
.godot_string_md5_text = godot_string_md5_text,
.godot_string_sha256_buffer = godot_string_sha256_buffer,
.godot_string_sha256_text = godot_string_sha256_text,
.godot_string_empty = godot_string_empty,
.godot_string_get_base_dir = godot_string_get_base_dir,
.godot_string_get_file = godot_string_get_file,
.godot_string_humanize_size = godot_string_humanize_size,
.godot_string_is_abs_path = godot_string_is_abs_path,
.godot_string_is_rel_path = godot_string_is_rel_path,
.godot_string_is_resource_file = godot_string_is_resource_file,
.godot_string_path_to = godot_string_path_to,
.godot_string_path_to_file = godot_string_path_to_file,
.godot_string_simplify_path = godot_string_simplify_path,
.godot_string_c_escape = godot_string_c_escape,
.godot_string_c_escape_multiline = godot_string_c_escape_multiline,
.godot_string_c_unescape = godot_string_c_unescape,
.godot_string_http_escape = godot_string_http_escape,
.godot_string_http_unescape = godot_string_http_unescape,
.godot_string_json_escape = godot_string_json_escape,
.godot_string_word_wrap = godot_string_word_wrap,
.godot_string_xml_escape = godot_string_xml_escape,
.godot_string_xml_escape_with_quotes = godot_string_xml_escape_with_quotes,
.godot_string_xml_unescape = godot_string_xml_unescape,
.godot_string_percent_decode = godot_string_percent_decode,
.godot_string_percent_encode = godot_string_percent_encode,
.godot_string_is_valid_float = godot_string_is_valid_float,
.godot_string_is_valid_hex_number = godot_string_is_valid_hex_number,
.godot_string_is_valid_html_color = godot_string_is_valid_html_color,
.godot_string_is_valid_identifier = godot_string_is_valid_identifier,
.godot_string_is_valid_integer = godot_string_is_valid_integer,
.godot_string_is_valid_ip_address = godot_string_is_valid_ip_address,
.godot_string_destroy = godot_string_destroy,
.godot_object_destroy = godot_object_destroy,
.godot_global_get_singleton = godot_global_get_singleton,
.godot_get_stack_bottom = godot_get_stack_bottom,
.godot_method_bind_get_method = godot_method_bind_get_method,
.godot_method_bind_ptrcall = godot_method_bind_ptrcall,
.godot_method_bind_call = godot_method_bind_call,
.godot_get_class_constructor = godot_get_class_constructor,
.godot_get_global_constants = godot_get_global_constants,
.godot_alloc = godot_alloc,
.godot_realloc = godot_realloc,
.godot_free = godot_free,
.godot_print_error = godot_print_error,
.godot_print_warning = godot_print_warning,
.godot_print = godot_print,
.godot_nativescript_register_class = godot_nativescript_register_class,
.godot_nativescript_register_tool_class = godot_nativescript_register_tool_class,
.godot_nativescript_register_method = godot_nativescript_register_method,
.godot_nativescript_register_property = godot_nativescript_register_property,
.godot_nativescript_register_signal = godot_nativescript_register_signal,
.godot_nativescript_get_userdata = godot_nativescript_get_userdata,
};
String GDNativeLibrary::platform_names[NUM_PLATFORMS + 1] = {
"X11_32bit",
"X11_64bit",
"Windows_32bit",
"Windows_64bit",
"OSX",
"Android",
"iOS_32bit",
"iOS_64bit",
"WebAssembly",
""
};
String GDNativeLibrary::platform_lib_ext[NUM_PLATFORMS + 1] = {
"so",
"so",
"dll",
"dll",
"dylib",
"so",
"dylib",
"dylib",
"wasm",
""
};
GDNativeLibrary::Platform GDNativeLibrary::current_platform =
#if defined(X11_ENABLED)
(sizeof(void *) == 8 ? X11_64BIT : X11_32BIT);
#elif defined(WINDOWS_ENABLED)
(sizeof(void *) == 8 ? WINDOWS_64BIT : WINDOWS_32BIT);
#elif defined(OSX_ENABLED)
OSX;
#elif defined(IPHONE_ENABLED)
(sizeof(void *) == 8 ? IOS_64BIT : IOS_32BIT);
#elif defined(ANDROID_ENABLED)
ANDROID;
#elif defined(JAVASCRIPT_ENABLED)
WASM;
#else
NUM_PLATFORMS;
#endif
GDNativeLibrary::GDNativeLibrary()
: library_paths(), singleton_gdnative(false) {
}
GDNativeLibrary::~GDNativeLibrary() {
}
void GDNativeLibrary::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_library_path", "platform", "path"), &GDNativeLibrary::set_library_path);
ClassDB::bind_method(D_METHOD("get_library_path", "platform"), &GDNativeLibrary::get_library_path);
ClassDB::bind_method(D_METHOD("is_singleton_gdnative"), &GDNativeLibrary::is_singleton_gdnative);
ClassDB::bind_method(D_METHOD("set_singleton_gdnative", "singleton"), &GDNativeLibrary::set_singleton_gdnative);
ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "singleton_gdnative"), "set_singleton_gdnative", "is_singleton_gdnative");
}
bool GDNativeLibrary::_set(const StringName &p_name, const Variant &p_value) {
String name = p_name;
if (name.begins_with("platform/")) {
set_library_path(name.get_slice("/", 1), p_value);
return true;
}
return false;
}
bool GDNativeLibrary::_get(const StringName &p_name, Variant &r_ret) const {
String name = p_name;
if (name.begins_with("platform/")) {
r_ret = get_library_path(name.get_slice("/", 1));
return true;
}
return false;
}
void GDNativeLibrary::_get_property_list(List<PropertyInfo> *p_list) const {
for (int i = 0; i < NUM_PLATFORMS; i++) {
p_list->push_back(PropertyInfo(Variant::STRING,
"platform/" + platform_names[i],
PROPERTY_HINT_FILE,
"*." + platform_lib_ext[i]));
}
}
void GDNativeLibrary::set_library_path(StringName p_platform, String p_path) {
int i;
for (i = 0; i <= NUM_PLATFORMS; i++) {
if (i == NUM_PLATFORMS) break;
if (platform_names[i] == p_platform) {
break;
}
}
if (i == NUM_PLATFORMS) {
ERR_EXPLAIN(String("No such platform: ") + p_platform);
ERR_FAIL();
}
library_paths[i] = p_path;
}
String GDNativeLibrary::get_library_path(StringName p_platform) const {
int i;
for (i = 0; i <= NUM_PLATFORMS; i++) {
if (i == NUM_PLATFORMS) break;
if (platform_names[i] == p_platform) {
break;
}
}
if (i == NUM_PLATFORMS) {
ERR_EXPLAIN(String("No such platform: ") + p_platform);
ERR_FAIL_V("");
}
return library_paths[i];
}
String GDNativeLibrary::get_active_library_path() const {
if (GDNativeLibrary::current_platform != NUM_PLATFORMS) {
return library_paths[GDNativeLibrary::current_platform];
}
return "";
}
GDNative::GDNative() {
native_handle = NULL;
}
GDNative::~GDNative() {
}
extern "C" void _api_anchor();
void GDNative::_compile_dummy_for_api() {
_api_anchor();
}
void GDNative::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_library", "library"), &GDNative::set_library);
ClassDB::bind_method(D_METHOD("get_library"), &GDNative::get_library);
ClassDB::bind_method(D_METHOD("initialize"), &GDNative::initialize);
ClassDB::bind_method(D_METHOD("terminate"), &GDNative::terminate);
// TODO(karroffel): get_native_(raw_)call_types binding?
// TODO(karroffel): make this a varargs function?
ClassDB::bind_method(D_METHOD("call_native", "procedure_name", "arguments"), &GDNative::call_native);
ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT, "library", PROPERTY_HINT_RESOURCE_TYPE, "GDNativeLibrary"), "set_library", "get_library");
}
void GDNative::set_library(Ref<GDNativeLibrary> p_library) {
ERR_EXPLAIN("Tried to change library of GDNative when it is already set");
ERR_FAIL_COND(library.is_valid());
library = p_library;
}
Ref<GDNativeLibrary> GDNative::get_library() {
return library;
}
bool GDNative::initialize() {
if (library.is_null()) {
ERR_PRINT("No library set, can't initialize GDNative object");
return false;
}
String lib_path = library->get_active_library_path();
if (lib_path.empty()) {
ERR_PRINT("No library set for this platform");
return false;
}
String path = ProjectSettings::get_singleton()->globalize_path(lib_path);
Error err = OS::get_singleton()->open_dynamic_library(path, native_handle);
if (err != OK) {
return false;
}
void *library_init;
err = OS::get_singleton()->get_dynamic_library_symbol_handle(
native_handle,
init_symbol,
library_init);
if (err || !library_init) {
OS::get_singleton()->close_dynamic_library(native_handle);
native_handle = NULL;
ERR_PRINT("Failed to obtain godot_gdnative_init symbol");
return false;
}
godot_gdnative_init_fn library_init_fpointer;
library_init_fpointer = (godot_gdnative_init_fn)library_init;
godot_gdnative_init_options options;
options.api_struct = &api_struct;
options.in_editor = Engine::get_singleton()->is_editor_hint();
options.core_api_hash = ClassDB::get_api_hash(ClassDB::API_CORE);
options.editor_api_hash = ClassDB::get_api_hash(ClassDB::API_EDITOR);
options.no_api_hash = ClassDB::get_api_hash(ClassDB::API_NONE);
options.gd_native_library = (godot_object *)(get_library().ptr());
library_init_fpointer(&options);
return true;
}
bool GDNative::terminate() {
if (native_handle == NULL) {
ERR_PRINT("No valid library handle, can't terminate GDNative object");
return false;
}
void *library_terminate;
Error error = OS::get_singleton()->get_dynamic_library_symbol_handle(
native_handle,
terminate_symbol,
library_terminate);
if (error) {
OS::get_singleton()->close_dynamic_library(native_handle);
native_handle = NULL;
return true;
}
godot_gdnative_terminate_fn library_terminate_pointer;
library_terminate_pointer = (godot_gdnative_terminate_fn)library_terminate;
// TODO(karroffel): remove this? Should be part of NativeScript, not
// GDNative IMO
godot_gdnative_terminate_options options;
options.in_editor = Engine::get_singleton()->is_editor_hint();
library_terminate_pointer(&options);
// GDNativeScriptLanguage::get_singleton()->initialized_libraries.erase(p_native_lib->path);
OS::get_singleton()->close_dynamic_library(native_handle);
native_handle = NULL;
return true;
}
bool GDNative::is_initialized() {
return (native_handle != NULL);
}
void GDNativeCallRegistry::register_native_call_type(StringName p_call_type, native_call_cb p_callback) {
native_calls.insert(p_call_type, p_callback);
}
void GDNativeCallRegistry::register_native_raw_call_type(StringName p_raw_call_type, native_raw_call_cb p_callback) {
native_raw_calls.insert(p_raw_call_type, p_callback);
}
Vector<StringName> GDNativeCallRegistry::get_native_call_types() {
Vector<StringName> call_types;
call_types.resize(native_calls.size());
size_t idx = 0;
for (Map<StringName, native_call_cb>::Element *E = native_calls.front(); E; E = E->next(), idx++) {
call_types[idx] = E->key();
}
return call_types;
}
Vector<StringName> GDNativeCallRegistry::get_native_raw_call_types() {
Vector<StringName> call_types;
call_types.resize(native_raw_calls.size());
size_t idx = 0;
for (Map<StringName, native_raw_call_cb>::Element *E = native_raw_calls.front(); E; E = E->next(), idx++) {
call_types[idx] = E->key();
}
return call_types;
}
Variant GDNative::call_native(StringName p_native_call_type, StringName p_procedure_name, Array p_arguments) {
Map<StringName, native_call_cb>::Element *E = GDNativeCallRegistry::singleton->native_calls.find(p_native_call_type);
if (!E) {
ERR_PRINT((String("No handler for native call type \"" + p_native_call_type) + "\" found").utf8().get_data());
return Variant();
}
String procedure_name = p_procedure_name;
godot_variant result = E->get()(native_handle, (godot_string *)&procedure_name, (godot_array *)&p_arguments);
return *(Variant *)&result;
}
void GDNative::call_native_raw(StringName p_raw_call_type, StringName p_procedure_name, void *data, int num_args, void **args, void *r_return) {
Map<StringName, native_raw_call_cb>::Element *E = GDNativeCallRegistry::singleton->native_raw_calls.find(p_raw_call_type);
if (!E) {
ERR_PRINT((String("No handler for native raw call type \"" + p_raw_call_type) + "\" found").utf8().get_data());
return;
}
String procedure_name = p_procedure_name;
E->get()(native_handle, (godot_string *)&procedure_name, data, num_args, args, r_return);
}