Couple of small changes so our ARVRInterfaceGDNative gets constructed and registered automatically when a module loads
This commit is contained in:
parent
b005c5fcec
commit
c6ce73c680
5 changed files with 12 additions and 48 deletions
|
@ -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"]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue