Merge pull request #10921 from karroffel/gdnative-MERGE-EVERYTHING

[GDNative] merge of NativeScript and GDNative, new GDNative singletons
This commit is contained in:
Rémi Verschelde 2017-09-04 21:51:07 +02:00 committed by GitHub
commit e979e50b7d
51 changed files with 295 additions and 164 deletions

View file

@ -2,12 +2,16 @@
Import('env')
env.add_source_files(env.modules_sources, "*.cpp")
env.add_source_files(env.modules_sources, "godot/*.cpp")
gdn_env = env.Clone()
env.Append(CPPFLAGS=['-DGDAPI_BUILT_IN'])
env.Append(CPPPATH=['#modules/gdnative/'])
gdn_env.add_source_files(env.modules_sources, "*.cpp")
gdn_env.add_source_files(env.modules_sources, "gdnative/*.cpp")
gdn_env.add_source_files(env.modules_sources, "nativescript/*.cpp")
gdn_env.Append(CPPFLAGS=['-DGDAPI_BUILT_IN'])
gdn_env.Append(CPPPATH=['#modules/gdnative/include/'])
if "platform" in env and env["platform"] == "x11": # there has to be a better solution?
env.Append(LINKFLAGS=["-rdynamic"])
env.use_ptrcall = True

View file

@ -100,6 +100,11 @@ 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) {
@ -175,7 +180,6 @@ GDNative::GDNative() {
}
GDNative::~GDNative() {
// TODO(karroffel): implement ALL the things!
}
extern "C" void _api_anchor();

View file

@ -35,7 +35,7 @@
#include "os/thread_safe.h"
#include "resource.h"
#include <godot/gdnative.h>
#include "gdnative/gdnative.h"
class GDNativeLibrary : public Resource {
GDCLASS(GDNativeLibrary, Resource)
@ -77,6 +77,8 @@ class GDNativeLibrary : public Resource {
String library_paths[NUM_PLATFORMS];
bool singleton_gdnative = false;
protected:
bool _set(const StringName &p_name, const Variant &p_value);
bool _get(const StringName &p_name, Variant &r_ret) const;
@ -92,6 +94,9 @@ public:
String get_library_path(StringName p_platform) const;
String get_active_library_path() const;
_FORCE_INLINE_ bool is_singleton_gdnative() const { return singleton_gdnative; }
_FORCE_INLINE_ void set_singleton_gdnative(bool p_singleton) { singleton_gdnative = p_singleton; }
};
typedef godot_variant (*native_call_cb)(void *, godot_string *, godot_array *);

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/array.h>
#include "gdnative/array.h"
#include "core/array.h"
#include "core/os/memory.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/basis.h>
#include "gdnative/basis.h"
#include "core/math/matrix3.h"
#include "core/variant.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/color.h>
#include "gdnative/color.h"
#include "core/color.h"
#include "core/variant.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/dictionary.h>
#include "gdnative/dictionary.h"
#include "core/variant.h"
// core/variant.h before to avoid compile errors with MSVC

View file

@ -27,11 +27,10 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/gdnative.h>
#include "gdnative/gdnative.h"
#include "class_db.h"
#include "error_macros.h"
#include "gdnative.h"
#include "global_constants.h"
#include "os/os.h"
#include "project_settings.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/node_path.h>
#include "gdnative/node_path.h"
#include "core/node_path.h"
#include "core/variant.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/plane.h>
#include "gdnative/plane.h"
#include "core/math/plane.h"
#include "core/variant.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/pool_arrays.h>
#include "gdnative/pool_arrays.h"
#include "array.h"
#include "core/variant.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/quat.h>
#include "gdnative/quat.h"
#include "core/math/quat.h"
#include "core/variant.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/rect2.h>
#include "gdnative/rect2.h"
#include "core/math/math_2d.h"
#include "core/variant.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/rect3.h>
#include "gdnative/rect3.h"
#include "core/math/rect3.h"
#include "core/variant.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/rid.h>
#include "gdnative/rid.h"
#include "core/resource.h"
#include "core/rid.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/string.h>
#include "gdnative/string.h"
#include "core/variant.h"
#include "string_db.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/transform.h>
#include "gdnative/transform.h"
#include "core/math/transform.h"
#include "core/variant.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/transform2d.h>
#include "gdnative/transform2d.h"
#include "core/math/math_2d.h"
#include "core/variant.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/variant.h>
#include "gdnative/variant.h"
#include "core/variant.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/vector2.h>
#include "gdnative/vector2.h"
#include "core/math/math_2d.h"
#include "core/variant.h"

View file

@ -27,7 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include <godot/vector3.h>
#include "gdnative/vector3.h"
#include "core/variant.h"
#include "core/vector.h"

View file

@ -1,23 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/icon.png-aa47d037a37fb38b3b7e7828e4eec407.stex"
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
stream=false
size_limit=0
detect_3d=true

View file

@ -46,10 +46,10 @@ typedef struct {
} godot_array;
#endif
#include <godot/pool_arrays.h>
#include <godot/variant.h>
#include <gdnative/pool_arrays.h>
#include <gdnative/variant.h>
#include <godot/gdnative.h>
#include <gdnative/gdnative.h>
void GDAPI godot_array_new(godot_array *r_dest);
void GDAPI godot_array_new_copy(godot_array *r_dest, const godot_array *p_src);

View file

@ -45,9 +45,9 @@ typedef struct {
} godot_basis;
#endif
#include <godot/gdnative.h>
#include <godot/quat.h>
#include <godot/vector3.h>
#include <gdnative/gdnative.h>
#include <gdnative/quat.h>
#include <gdnative/vector3.h>
void GDAPI godot_basis_new_with_rows(godot_basis *r_dest, const godot_vector3 *p_x_axis, const godot_vector3 *p_y_axis, const godot_vector3 *p_z_axis);
void GDAPI godot_basis_new_with_axis_and_angle(godot_basis *r_dest, const godot_vector3 *p_axis, const godot_real p_phi);

View file

@ -45,8 +45,8 @@ typedef struct {
} godot_color;
#endif
#include <godot/gdnative.h>
#include <godot/string.h>
#include <gdnative/gdnative.h>
#include <gdnative/string.h>
void GDAPI godot_color_new_rgba(godot_color *r_dest, const godot_real p_r, const godot_real p_g, const godot_real p_b, const godot_real p_a);
void GDAPI godot_color_new_rgb(godot_color *r_dest, const godot_real p_r, const godot_real p_g, const godot_real p_b);

View file

@ -45,9 +45,9 @@ typedef struct {
} godot_dictionary;
#endif
#include <godot/array.h>
#include <godot/gdnative.h>
#include <godot/variant.h>
#include <gdnative/array.h>
#include <gdnative/gdnative.h>
#include <gdnative/variant.h>
void GDAPI godot_dictionary_new(godot_dictionary *r_dest);
void GDAPI godot_dictionary_new_copy(godot_dictionary *r_dest, const godot_dictionary *p_src);

View file

@ -146,100 +146,74 @@ typedef float godot_real;
/////// Object (forward declared)
typedef void godot_object;
/////// Brute force forward declarations for the rest
/*
typedef struct godot_variant godot_variant;
typedef struct godot_string godot_string;
typedef struct godot_vector2 godot_vector2;
typedef struct godot_rect2 godot_rect2;
typedef struct godot_vector3 godot_vector3;
typedef struct godot_transform2d godot_transform2d;
typedef struct godot_plane godot_plane;
typedef struct godot_quat godot_quat;
typedef struct godot_rect3 godot_rect3;
typedef struct godot_basis godot_basis;
typedef struct godot_transform godot_transform;
typedef struct godot_color godot_color;
typedef struct godot_node_path godot_node_path;
typedef struct godot_rid godot_rid;
typedef struct godot_dictionary godot_dictionary;
typedef struct godot_array godot_array;
typedef struct godot_pool_byte_array godot_pool_byte_array;
typedef struct godot_pool_int_array godot_pool_int_array;
typedef struct godot_pool_real_array godot_pool_real_array;
typedef struct godot_pool_string_array godot_pool_string_array;
typedef struct godot_pool_vector2_array godot_pool_vector2_array;
typedef struct godot_pool_vector3_array godot_pool_vector3_array;
typedef struct godot_pool_color_array godot_pool_color_array;
*/
/////// String
#include <godot/string.h>
#include <gdnative/string.h>
////// Vector2
#include <godot/vector2.h>
#include <gdnative/vector2.h>
////// Rect2
#include <godot/rect2.h>
#include <gdnative/rect2.h>
////// Vector3
#include <godot/vector3.h>
#include <gdnative/vector3.h>
////// Transform2D
#include <godot/transform2d.h>
#include <gdnative/transform2d.h>
/////// Plane
#include <godot/plane.h>
#include <gdnative/plane.h>
/////// Quat
#include <godot/quat.h>
#include <gdnative/quat.h>
/////// Rect3
#include <godot/rect3.h>
#include <gdnative/rect3.h>
/////// Basis
#include <godot/basis.h>
#include <gdnative/basis.h>
/////// Transform
#include <godot/transform.h>
#include <gdnative/transform.h>
/////// Color
#include <godot/color.h>
#include <gdnative/color.h>
/////// NodePath
#include <godot/node_path.h>
#include <gdnative/node_path.h>
/////// RID
#include <godot/rid.h>
#include <gdnative/rid.h>
/////// Dictionary
#include <godot/dictionary.h>
#include <gdnative/dictionary.h>
/////// Array
#include <godot/array.h>
#include <gdnative/array.h>
// single API file for Pool*Array
#include <godot/pool_arrays.h>
#include <gdnative/pool_arrays.h>
void GDAPI godot_object_destroy(godot_object *p_o);
////// Variant
#include <godot/variant.h>
#include <gdnative/variant.h>
////// Singleton API

View file

@ -45,8 +45,8 @@ typedef struct {
} godot_node_path;
#endif
#include <godot/gdnative.h>
#include <godot/string.h>
#include <gdnative/gdnative.h>
#include <gdnative/string.h>
void GDAPI godot_node_path_new(godot_node_path *r_dest, const godot_string *p_from);
void GDAPI godot_node_path_new_copy(godot_node_path *r_dest, const godot_node_path *p_src);

View file

@ -45,8 +45,8 @@ typedef struct {
} godot_plane;
#endif
#include <godot/gdnative.h>
#include <godot/vector3.h>
#include <gdnative/gdnative.h>
#include <gdnative/vector3.h>
void GDAPI godot_plane_new_with_reals(godot_plane *r_dest, const godot_real p_a, const godot_real p_b, const godot_real p_c, const godot_real p_d);
void GDAPI godot_plane_new_with_vectors(godot_plane *r_dest, const godot_vector3 *p_v1, const godot_vector3 *p_v2, const godot_vector3 *p_v3);

View file

@ -113,12 +113,12 @@ typedef struct {
} godot_pool_color_array;
#endif
#include <godot/array.h>
#include <godot/color.h>
#include <godot/vector2.h>
#include <godot/vector3.h>
#include <gdnative/array.h>
#include <gdnative/color.h>
#include <gdnative/vector2.h>
#include <gdnative/vector3.h>
#include <godot/gdnative.h>
#include <gdnative/gdnative.h>
// byte

View file

@ -45,8 +45,8 @@ typedef struct {
} godot_quat;
#endif
#include <godot/gdnative.h>
#include <godot/vector3.h>
#include <gdnative/gdnative.h>
#include <gdnative/vector3.h>
void GDAPI godot_quat_new(godot_quat *r_dest, const godot_real p_x, const godot_real p_y, const godot_real p_z, const godot_real p_w);
void GDAPI godot_quat_new_with_axis_angle(godot_quat *r_dest, const godot_vector3 *p_axis, const godot_real p_angle);

View file

@ -43,8 +43,8 @@ typedef struct godot_rect2 {
} godot_rect2;
#endif
#include <godot/gdnative.h>
#include <godot/vector2.h>
#include <gdnative/gdnative.h>
#include <gdnative/vector2.h>
void GDAPI godot_rect2_new_with_position_and_size(godot_rect2 *r_dest, const godot_vector2 *p_pos, const godot_vector2 *p_size);
void GDAPI godot_rect2_new(godot_rect2 *r_dest, const godot_real p_x, const godot_real p_y, const godot_real p_width, const godot_real p_height);

View file

@ -45,9 +45,9 @@ typedef struct {
} godot_rect3;
#endif
#include <godot/gdnative.h>
#include <godot/plane.h>
#include <godot/vector3.h>
#include <gdnative/gdnative.h>
#include <gdnative/plane.h>
#include <gdnative/vector3.h>
void GDAPI godot_rect3_new(godot_rect3 *r_dest, const godot_vector3 *p_pos, const godot_vector3 *p_size);

View file

@ -45,7 +45,7 @@ typedef struct {
} godot_rid;
#endif
#include <godot/gdnative.h>
#include <gdnative/gdnative.h>
void GDAPI godot_rid_new(godot_rid *r_dest);

View file

@ -46,8 +46,8 @@ typedef struct {
} godot_string;
#endif
#include <godot/gdnative.h>
#include <godot/variant.h>
#include <gdnative/gdnative.h>
#include <gdnative/variant.h>
void GDAPI godot_string_new(godot_string *r_dest);
void GDAPI godot_string_new_copy(godot_string *r_dest, const godot_string *p_src);

View file

@ -45,10 +45,10 @@ typedef struct {
} godot_transform;
#endif
#include <godot/basis.h>
#include <godot/gdnative.h>
#include <godot/variant.h>
#include <godot/vector3.h>
#include <gdnative/basis.h>
#include <gdnative/gdnative.h>
#include <gdnative/variant.h>
#include <gdnative/vector3.h>
void GDAPI godot_transform_new_with_axis_origin(godot_transform *r_dest, const godot_vector3 *p_x_axis, const godot_vector3 *p_y_axis, const godot_vector3 *p_z_axis, const godot_vector3 *p_origin);
void GDAPI godot_transform_new(godot_transform *r_dest, const godot_basis *p_basis, const godot_vector3 *p_origin);

View file

@ -45,9 +45,9 @@ typedef struct {
} godot_transform2d;
#endif
#include <godot/gdnative.h>
#include <godot/variant.h>
#include <godot/vector2.h>
#include <gdnative/gdnative.h>
#include <gdnative/variant.h>
#include <gdnative/vector2.h>
void GDAPI godot_transform2d_new(godot_transform2d *r_dest, const godot_real p_rot, const godot_vector2 *p_pos);
void GDAPI godot_transform2d_new_axis_origin(godot_transform2d *r_dest, const godot_vector2 *p_x_axis, const godot_vector2 *p_y_axis, const godot_vector2 *p_origin);

View file

@ -99,25 +99,25 @@ typedef struct godot_variant_call_error {
godot_variant_type expected;
} godot_variant_call_error;
#include <godot/array.h>
#include <godot/basis.h>
#include <godot/color.h>
#include <godot/dictionary.h>
#include <godot/node_path.h>
#include <godot/plane.h>
#include <godot/pool_arrays.h>
#include <godot/quat.h>
#include <godot/rect2.h>
#include <godot/rect3.h>
#include <godot/rid.h>
#include <godot/string.h>
#include <godot/transform.h>
#include <godot/transform2d.h>
#include <godot/variant.h>
#include <godot/vector2.h>
#include <godot/vector3.h>
#include <gdnative/array.h>
#include <gdnative/basis.h>
#include <gdnative/color.h>
#include <gdnative/dictionary.h>
#include <gdnative/node_path.h>
#include <gdnative/plane.h>
#include <gdnative/pool_arrays.h>
#include <gdnative/quat.h>
#include <gdnative/rect2.h>
#include <gdnative/rect3.h>
#include <gdnative/rid.h>
#include <gdnative/string.h>
#include <gdnative/transform.h>
#include <gdnative/transform2d.h>
#include <gdnative/variant.h>
#include <gdnative/vector2.h>
#include <gdnative/vector3.h>
#include <godot/gdnative.h>
#include <gdnative/gdnative.h>
godot_variant_type GDAPI godot_variant_get_type(const godot_variant *p_v);

View file

@ -45,7 +45,7 @@ typedef struct {
} godot_vector2;
#endif
#include <godot/gdnative.h>
#include <gdnative/gdnative.h>
void GDAPI godot_vector2_new(godot_vector2 *r_dest, const godot_real p_x, const godot_real p_y);

View file

@ -45,8 +45,8 @@ typedef struct {
} godot_vector3;
#endif
#include <godot/basis.h>
#include <godot/gdnative.h>
#include <gdnative/basis.h>
#include <gdnative/gdnative.h>
typedef enum {
GODOT_VECTOR3_AXIS_X,

View file

@ -30,7 +30,7 @@
#ifndef GODOT_NATIVESCRIPT_H
#define GODOT_NATIVESCRIPT_H
#include <godot/gdnative.h>
#include <gdnative/gdnative.h>
#ifdef __cplusplus
extern "C" {

View file

@ -27,17 +27,17 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "godot_nativescript.h"
#include "nativescript.h"
#include "nativescript/godot_nativescript.h"
#include "class_db.h"
#include "error_macros.h"
#include "gdnative.h"
#include "gdnative/gdnative.h"
#include "global_constants.h"
#include "project_settings.h"
#include "variant.h"
#include "nativescript.h"
#ifdef __cplusplus
extern "C" {
#endif

View file

@ -29,7 +29,7 @@
/*************************************************************************/
#include "nativescript.h"
#include "modules/gdnative/godot/gdnative.h"
#include "gdnative/gdnative.h"
#include "global_constants.h"
#include "io/file_access_encrypted.h"

View file

@ -38,8 +38,8 @@
#include "script_language.h"
#include "self_list.h"
#include "godot_nativescript.h"
#include "modules/gdnative/gdnative.h"
#include <nativescript/godot_nativescript.h>
#ifndef NO_THREADS
#include "os/mutex.h"

View file

@ -28,12 +28,99 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "register_types.h"
#include "gdnative/gdnative.h"
#include "gdnative.h"
#include "io/resource_loader.h"
#include "io/resource_saver.h"
#include "nativescript/register_types.h"
#include "core/engine.h"
#include "core/os/os.h"
#include "core/project_settings.h"
#ifdef TOOLS_ENABLED
#include "editor/editor_node.h"
// Class used to discover singleton gdnative files
void actual_discoverer_handler();
class GDNativeSingletonDiscover : public Object {
// GDCLASS(GDNativeSingletonDiscover, Object)
virtual String get_class() const {
// okay, this is a really dirty hack.
// We're overriding get_class so we can connect it to a signal
// This works because get_class is a virtual method, so we don't
// need to register a new class to ClassDB just for this one
// little signal.
actual_discoverer_handler();
return "Object";
}
};
Set<String> get_gdnative_singletons(EditorFileSystemDirectory *p_dir) {
Set<String> file_paths;
// check children
for (int i = 0; i < p_dir->get_file_count(); i++) {
String file_name = p_dir->get_file(i);
String file_type = p_dir->get_file_type(i);
if (file_type != "GDNativeLibrary") {
continue;
}
Ref<GDNativeLibrary> lib = ResourceLoader::load(p_dir->get_file_path(i));
if (lib.is_valid() && lib->is_singleton_gdnative()) {
file_paths.insert(p_dir->get_file_path(i));
}
}
// check subdirectories
for (int i = 0; i < p_dir->get_subdir_count(); i++) {
Set<String> paths = get_gdnative_singletons(p_dir->get_subdir(i));
for (Set<String>::Element *E = paths.front(); E; E = E->next()) {
file_paths.insert(E->get());
}
}
return file_paths;
}
void actual_discoverer_handler() {
EditorFileSystemDirectory *dir = EditorFileSystem::get_singleton()->get_filesystem();
Set<String> file_paths = get_gdnative_singletons(dir);
Array files;
files.resize(file_paths.size());
int i = 0;
for (Set<String>::Element *E = file_paths.front(); E; i++, E = E->next()) {
files.set(i, E->get());
}
ProjectSettings::get_singleton()->set("gdnative/singletons", files);
ProjectSettings::get_singleton()->save();
}
GDNativeSingletonDiscover *discoverer = NULL;
void discoverer_callback() {
discoverer = memnew(GDNativeSingletonDiscover);
EditorFileSystem::get_singleton()->connect("filesystem_changed", discoverer, "get_class");
}
#endif
godot_variant cb_standard_varcall(void *handle, godot_string *p_procedure, godot_array *p_args) {
if (handle == NULL) {
@ -62,21 +149,110 @@ godot_variant cb_standard_varcall(void *handle, godot_string *p_procedure, godot
return proc(NULL, p_args);
}
void cb_singleton_call(
void *p_handle,
godot_string *p_proc_name,
void *p_data,
int p_num_args,
void **p_args,
void *r_return) {
if (p_handle == NULL) {
ERR_PRINT("No valid library handle, can't call singleton procedure");
return;
}
void *singleton_proc;
Error err = OS::get_singleton()->get_dynamic_library_symbol_handle(
p_handle,
*(String *)p_proc_name,
singleton_proc);
if (err != OK) {
return;
}
void (*singleton_procedure_ptr)() = (void (*)())singleton_proc;
singleton_procedure_ptr();
}
GDNativeCallRegistry *GDNativeCallRegistry::singleton;
Vector<Ref<GDNative> > singleton_gdnatives;
void register_gdnative_types() {
#ifdef TOOLS_ENABLED
if (Engine::get_singleton()->is_editor_hint()) {
EditorNode::add_init_callback(discoverer_callback);
}
#endif
ClassDB::register_class<GDNativeLibrary>();
ClassDB::register_class<GDNative>();
GDNativeCallRegistry::singleton = memnew(GDNativeCallRegistry);
GDNativeCallRegistry::singleton->register_native_call_type("standard_varcall", cb_standard_varcall);
GDNativeCallRegistry::singleton->register_native_raw_call_type("gdnative_singleton_call", cb_singleton_call);
register_nativescript_types();
// run singletons
Array singletons = ProjectSettings::get_singleton()->get("gdnative/singletons");
singleton_gdnatives.resize(singletons.size());
for (int i = 0; i < singletons.size(); i++) {
String path = singletons[i];
Ref<GDNativeLibrary> lib = ResourceLoader::load(path);
singleton_gdnatives[i].instance();
singleton_gdnatives[i]->set_library(lib);
if (!singleton_gdnatives[i]->initialize()) {
// Can't initialize. Don't make a native_call then
continue;
}
singleton_gdnatives[i]->call_native_raw(
"gdnative_singleton_call",
"godot_gdnative_singleton",
NULL,
0,
NULL,
NULL);
}
}
void unregister_gdnative_types() {
for (int i = 0; i < singleton_gdnatives.size(); i++) {
if (singleton_gdnatives[i].is_null()) {
continue;
}
if (!singleton_gdnatives[i]->is_initialized()) {
continue;
}
singleton_gdnatives[i]->terminate();
}
unregister_nativescript_types();
memdelete(GDNativeCallRegistry::singleton);
#ifdef TOOLS_ENABLED
if (Engine::get_singleton()->is_editor_hint()) {
memdelete(discoverer);
}
#endif
// This is for printing out the sizes of the core types
/*

View file

@ -1,8 +0,0 @@
def can_build(platform):
return True
def configure(env):
env.use_ptrcall = True