gdnative_cpp/core/pandemonium_global.cpp

208 lines
8.1 KiB
C++

/*************************************************************************/
/* PandemoniumGlobal.cpp */
/*************************************************************************/
/* This file is part of: */
/* PANDEMONIUM ENGINE */
/* https://pandemoniumengine.org */
/*************************************************************************/
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2022 Pandemonium 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 "pandemonium_global.h"
#include "ustring.h"
#include "array.h"
#include "wrapped.h"
static GDCALLINGCONV void *wrapper_create(void *data, const void *type_tag, pandemonium_object *instance) {
_Wrapped *wrapper_memory = (_Wrapped *)Pandemonium::api->pandemonium_alloc(sizeof(_Wrapped));
if (!wrapper_memory)
return NULL;
wrapper_memory->_owner = instance;
wrapper_memory->_type_tag = (size_t)type_tag;
return (void *)wrapper_memory;
}
static GDCALLINGCONV void wrapper_destroy(void *data, void *wrapper) {
if (wrapper)
Pandemonium::api->pandemonium_free(wrapper);
}
void *_RegisterState::nativescript_handle;
int _RegisterState::language_index;
const pandemonium_gdnative_core_api_struct *api = nullptr;
const pandemonium_gdnative_ext_nativescript_api_struct *nativescript_api = nullptr;
const pandemonium_gdnative_ext_pluginscript_api_struct *pluginscript_api = nullptr;
const pandemonium_gdnative_ext_android_api_struct *android_api = nullptr;
const pandemonium_gdnative_ext_videodecoder_api_struct *videodecoder_api = nullptr;
const pandemonium_gdnative_ext_net_api_struct *net_api = nullptr;
const void *gdnlib = NULL;
void Pandemonium::print(const String &message) {
Pandemonium::api->pandemonium_print((pandemonium_string *)&message);
}
void Pandemonium::print_warning(const String &description, const String &function, const String &file, int line) {
int len;
char *c_desc = description.alloc_c_string();
char *c_func = function.alloc_c_string();
char *c_file = file.alloc_c_string();
if (c_desc != nullptr && c_func != nullptr && c_file != nullptr) {
Pandemonium::api->pandemonium_print_warning(c_desc, c_func, c_file, line);
};
if (c_desc != nullptr)
Pandemonium::api->pandemonium_free(c_desc);
if (c_func != nullptr)
Pandemonium::api->pandemonium_free(c_func);
if (c_file != nullptr)
Pandemonium::api->pandemonium_free(c_file);
}
void Pandemonium::print_error(const String &description, const String &function, const String &file, int line) {
int len;
char *c_desc = description.alloc_c_string();
char *c_func = function.alloc_c_string();
char *c_file = file.alloc_c_string();
if (c_desc != nullptr && c_func != nullptr && c_file != nullptr) {
Pandemonium::api->pandemonium_print_error(c_desc, c_func, c_file, line);
};
if (c_desc != nullptr)
Pandemonium::api->pandemonium_free(c_desc);
if (c_func != nullptr)
Pandemonium::api->pandemonium_free(c_func);
if (c_file != nullptr)
Pandemonium::api->pandemonium_free(c_file);
}
void ___register_types();
void ___init_method_bindings();
void Pandemonium::gdnative_init(pandemonium_gdnative_init_options *options) {
Pandemonium::api = options->api_struct;
Pandemonium::gdnlib = options->gd_native_library;
const pandemonium_gdnative_api_struct *core_extension = Pandemonium::api->next;
/*
while (core_extension) {
if (core_extension->version.major == 1 && core_extension->version.minor == 1) {
Pandemonium::core_1_1_api = (const pandemonium_gdnative_core_1_1_api_struct *)core_extension;
} else if (core_extension->version.major == 1 && core_extension->version.minor == 2) {
Pandemonium::core_1_2_api = (const pandemonium_gdnative_core_1_2_api_struct *)core_extension;
}
core_extension = core_extension->next;
}
*/
// now find our extensions
for (int i = 0; i < Pandemonium::api->num_extensions; i++) {
switch (Pandemonium::api->extensions[i]->type) {
case GDNATIVE_EXT_NATIVESCRIPT: {
Pandemonium::nativescript_api = (const pandemonium_gdnative_ext_nativescript_api_struct *)Pandemonium::api->extensions[i];
/*
const pandemonium_gdnative_api_struct *extension = Pandemonium::nativescript_api->next;
while (extension) {
if (extension->version.major == 1 && extension->version.minor == 1) {
//Pandemonium::nativescript_1_1_api = (const pandemonium_gdnative_ext_nativescript_1_1_api_struct *)extension;
}
extension = extension->next;
}
*/
} break;
case GDNATIVE_EXT_PLUGINSCRIPT: {
Pandemonium::pluginscript_api = (const pandemonium_gdnative_ext_pluginscript_api_struct *)Pandemonium::api->extensions[i];
} break;
case GDNATIVE_EXT_ANDROID: {
Pandemonium::android_api = (const pandemonium_gdnative_ext_android_api_struct *)Pandemonium::api->extensions[i];
} break;
case GDNATIVE_EXT_VIDEODECODER: {
Pandemonium::videodecoder_api = (const pandemonium_gdnative_ext_videodecoder_api_struct *)Pandemonium::api->extensions[i];
} break;
case GDNATIVE_EXT_NET: {
Pandemonium::net_api = (const pandemonium_gdnative_ext_net_api_struct *)Pandemonium::api->extensions[i];
/*
const pandemonium_gdnative_api_struct *extension = Pandemonium::net_api->next;
while (extension) {
if (extension->version.major == 3 && extension->version.minor == 2) {
Pandemonium::net_3_2_api = (const pandemonium_gdnative_ext_net_3_2_api_struct *)extension;
}
extension = extension->next;
}
*/
} break;
default:
break;
}
}
// Initialize the `language_index` here since `__register_types()` makes use of it.
pandemonium_instance_binding_functions binding_funcs = {};
binding_funcs.alloc_instance_binding_data = wrapper_create;
binding_funcs.free_instance_binding_data = wrapper_destroy;
_RegisterState::language_index = Pandemonium::nativescript_api->pandemonium_nativescript_register_instance_binding_data_functions(binding_funcs);
// register these now
___register_types();
___init_method_bindings();
}
void Pandemonium::gdnative_terminate(pandemonium_gdnative_terminate_options *options) {
// reserved for future use.
}
void Pandemonium::gdnative_profiling_add_data(const char *p_signature, uint64_t p_time) {
Pandemonium::nativescript_api->pandemonium_nativescript_profiling_add_data(p_signature, p_time);
}
void Pandemonium::nativescript_init(void *handle) {
_RegisterState::nativescript_handle = handle;
}
void Pandemonium::nativescript_terminate(void *handle) {
Pandemonium::nativescript_api->pandemonium_nativescript_unregister_instance_binding_data_functions(_RegisterState::language_index);
}