Couple of small changes so our ARVRInterfaceGDNative gets constructed and registered automatically when a module loads

This commit is contained in:
BastiaanOlij 2017-10-15 09:58:36 +11:00
parent b005c5fcec
commit c6ce73c680
5 changed files with 12 additions and 48 deletions

View file

@ -5234,7 +5234,6 @@
"name": "godot_arvr_register_interface", "name": "godot_arvr_register_interface",
"return_type": "void", "return_type": "void",
"arguments": [ "arguments": [
["const char *", "p_name"],
["const godot_arvr_interface_gdnative *", "p_interface"] ["const godot_arvr_interface_gdnative *", "p_interface"]
] ]
}, },

View file

@ -54,7 +54,7 @@ typedef struct {
void (*process)(void *); void (*process)(void *);
} godot_arvr_interface_gdnative; } godot_arvr_interface_gdnative;
void GDAPI godot_arvr_register_interface(const char *p_name, const godot_arvr_interface_gdnative *p_interface); void GDAPI godot_arvr_register_interface(const godot_arvr_interface_gdnative *p_interface);
// helper functions to access ARVRServer data // helper functions to access ARVRServer data
godot_real GDAPI godot_arvr_get_worldscale(); godot_real GDAPI godot_arvr_get_worldscale();

View file

@ -33,10 +33,6 @@
#include "servers/arvr/arvr_positional_tracker.h" #include "servers/arvr/arvr_positional_tracker.h"
#include "servers/visual/visual_server_global.h" #include "servers/visual/visual_server_global.h"
#include "oa_hash_map.h"
extern OAHashMap<StringName, godot_arvr_interface_gdnative *> *_registered_interfaces;
ARVRInterfaceGDNative::ARVRInterfaceGDNative() { ARVRInterfaceGDNative::ARVRInterfaceGDNative() {
// testing // testing
printf("Construct gdnative interface\n"); printf("Construct gdnative interface\n");
@ -66,23 +62,16 @@ void ARVRInterfaceGDNative::cleanup() {
} }
} }
void ARVRInterfaceGDNative::set_interface(StringName p_name) { void ARVRInterfaceGDNative::set_interface(const godot_arvr_interface_gdnative *p_interface) {
// this should only be called once, just being paranoid..
godot_arvr_interface_gdnative *new_interface;
if (!_registered_interfaces->lookup(p_name, &new_interface)) {
ERR_PRINT((String("ARVR interface \"") + p_name + "\" does not exist.").utf8().get_data());
return;
}
if (interface) { if (interface) {
cleanup(); cleanup();
} }
interface = new_interface; // bind to our interface
interface = p_interface;
// Now we do our constructing... // Now we do our constructing...
data = interface->constructor((godot_object *)this); data = interface->constructor((godot_object *)this);
} }
@ -222,20 +211,16 @@ void ARVRInterfaceGDNative::process() {
interface->process(data); interface->process(data);
} }
void ARVRInterfaceGDNative::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_interface", "name"), &ARVRInterfaceGDNative::set_interface);
}
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
// some helper callbacks // some helper callbacks
extern "C" { extern "C" {
void GDAPI godot_arvr_register_interface(const char *p_name, const godot_arvr_interface_gdnative *p_interface) { void GDAPI godot_arvr_register_interface(const godot_arvr_interface_gdnative *p_interface) {
// this method is supposed to only be called by GDNative singletons Ref<ARVRInterfaceGDNative> new_interface;
// which are initialized in a thread safe way, so using a global map is fine here new_interface.instance();
new_interface->set_interface((godot_arvr_interface_gdnative * const)p_interface);
_registered_interfaces->set(StringName(p_name), (godot_arvr_interface_gdnative * const)p_interface); ARVRServer::get_singleton()->add_interface(new_interface);
} }
godot_real GDAPI godot_arvr_get_worldscale() { godot_real GDAPI godot_arvr_get_worldscale() {

View file

@ -46,17 +46,15 @@ class ARVRInterfaceGDNative : public ARVRInterface {
void cleanup(); void cleanup();
protected: protected:
godot_arvr_interface_gdnative *interface; const godot_arvr_interface_gdnative *interface;
void *data; void *data;
static void _bind_methods();
public: public:
/** general interface information **/ /** general interface information **/
ARVRInterfaceGDNative(); ARVRInterfaceGDNative();
~ARVRInterfaceGDNative(); ~ARVRInterfaceGDNative();
void set_interface(StringName p_name); void set_interface(const godot_arvr_interface_gdnative *p_interface);
virtual StringName get_name() const; virtual StringName get_name() const;
virtual int get_capabilities() const; virtual int get_capabilities() const;

View file

@ -29,29 +29,11 @@
/*************************************************************************/ /*************************************************************************/
#include "register_types.h" #include "register_types.h"
#include "arvr_interface_gdnative.h" #include "arvr_interface_gdnative.h"
#include "core/os/os.h"
#include "oa_hash_map.h"
#include "ustring.h"
// what is this?? I can't memnew(OAHashMap<String, godot_arvr_interface_gdnative *>)
// but with this typedef it's working just fine...
// C++ grammar can be a joy.
typedef OAHashMap<StringName, godot_arvr_interface_gdnative *> InterfaceMap;
InterfaceMap *_registered_interfaces;
void register_nativearvr_types() { void register_nativearvr_types() {
_registered_interfaces = memnew(InterfaceMap);
ClassDB::register_class<ARVRInterfaceGDNative>(); ClassDB::register_class<ARVRInterfaceGDNative>();
} }
void unregister_nativearvr_types() { void unregister_nativearvr_types() {
memdelete(_registered_interfaces);
_registered_interfaces = NULL;
} }