You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
Add action map editor for OpenXR
This commit is contained in:
@@ -39,6 +39,7 @@ void OpenXRActionSet::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("get_priority"), &OpenXRActionSet::get_priority);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "priority"), "set_priority", "get_priority");
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_action_count"), &OpenXRActionSet::get_action_count);
|
||||
ClassDB::bind_method(D_METHOD("set_actions", "actions"), &OpenXRActionSet::set_actions);
|
||||
ClassDB::bind_method(D_METHOD("get_actions"), &OpenXRActionSet::get_actions);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "actions", PROPERTY_HINT_RESOURCE_TYPE, "OpenXRAction", PROPERTY_USAGE_NO_EDITOR), "set_actions", "get_actions");
|
||||
@@ -75,18 +76,54 @@ int OpenXRActionSet::get_priority() const {
|
||||
return priority;
|
||||
}
|
||||
|
||||
int OpenXRActionSet::get_action_count() const {
|
||||
return actions.size();
|
||||
}
|
||||
|
||||
void OpenXRActionSet::clear_actions() {
|
||||
// Actions held within our action set should be released and destroyed but just in case they are still used some where else
|
||||
for (int i = 0; i < actions.size(); i++) {
|
||||
Ref<OpenXRAction> action = actions[i];
|
||||
action->action_set = nullptr;
|
||||
}
|
||||
actions.clear();
|
||||
}
|
||||
|
||||
void OpenXRActionSet::set_actions(Array p_actions) {
|
||||
actions = p_actions;
|
||||
// Any actions not retained in p_actions should be freed automatically, those held within our Array will have be relinked to our action set.
|
||||
clear_actions();
|
||||
|
||||
for (int i = 0; i < p_actions.size(); i++) {
|
||||
// add them anew so we verify our action_set pointer
|
||||
add_action(p_actions[i]);
|
||||
}
|
||||
}
|
||||
|
||||
Array OpenXRActionSet::get_actions() const {
|
||||
return actions;
|
||||
}
|
||||
|
||||
Ref<OpenXRAction> OpenXRActionSet::get_action(const String p_name) const {
|
||||
for (int i = 0; i < actions.size(); i++) {
|
||||
Ref<OpenXRAction> action = actions[i];
|
||||
if (action->get_name() == p_name) {
|
||||
return action;
|
||||
}
|
||||
}
|
||||
|
||||
return Ref<OpenXRAction>();
|
||||
}
|
||||
|
||||
void OpenXRActionSet::add_action(Ref<OpenXRAction> p_action) {
|
||||
ERR_FAIL_COND(p_action.is_null());
|
||||
|
||||
if (actions.find(p_action) == -1) {
|
||||
if (p_action->action_set && p_action->action_set != this) {
|
||||
// action should only relate to our action set
|
||||
p_action->action_set->remove_action(p_action);
|
||||
}
|
||||
|
||||
p_action->action_set = this;
|
||||
actions.push_back(p_action);
|
||||
}
|
||||
}
|
||||
@@ -95,6 +132,9 @@ void OpenXRActionSet::remove_action(Ref<OpenXRAction> p_action) {
|
||||
int idx = actions.find(p_action);
|
||||
if (idx != -1) {
|
||||
actions.remove_at(idx);
|
||||
|
||||
ERR_FAIL_COND_MSG(p_action->action_set != this, "Removing action that belongs to this action set but had incorrect action set pointer."); // this should never happen!
|
||||
p_action->action_set = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,5 +147,5 @@ Ref<OpenXRAction> OpenXRActionSet::add_new_action(const char *p_name, const char
|
||||
}
|
||||
|
||||
OpenXRActionSet::~OpenXRActionSet() {
|
||||
actions.clear();
|
||||
clear_actions();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user