[Bf-blender-cvs] [cfc5c1b46d6] xr-actions-D9124: Improve error logging and controller data management.

Peter Kim noreply at git.blender.org
Tue Oct 13 14:45:01 CEST 2020


Commit: cfc5c1b46d6d4191e08f8fc172e9ae5ec1dafa0c
Author: Peter Kim
Date:   Sun Oct 11 16:24:56 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rBcfc5c1b46d6d4191e08f8fc172e9ae5ec1dafa0c

Improve error logging and controller data management.

===================================================================

M	intern/ghost/intern/GHOST_XrSession.cpp
M	source/blender/makesrna/intern/rna_xr.c
M	source/blender/windowmanager/xr/intern/wm_xr_actions.c
M	source/blender/windowmanager/xr/intern/wm_xr_intern.h
M	source/blender/windowmanager/xr/intern/wm_xr_operators.c
M	source/blender/windowmanager/xr/intern/wm_xr_session.c

===================================================================

diff --git a/intern/ghost/intern/GHOST_XrSession.cpp b/intern/ghost/intern/GHOST_XrSession.cpp
index a2f4af94aca..22b20d4cd23 100644
--- a/intern/ghost/intern/GHOST_XrSession.cpp
+++ b/intern/ghost/intern/GHOST_XrSession.cpp
@@ -609,7 +609,10 @@ bool GHOST_XrSession::createActionSet(const GHOST_XrActionSetInfo *info)
 
   OpenXRActionSet action_set;
   CHECK_XR_ND_BUF(xrCreateActionSet(m_context->getInstance(), &action_set_info, &action_set.set),
-                  (std::string("Failed to create action set \"") + info->name + "\".").c_str(),
+                  (std::string("Failed to create action set \"") + info->name + "\".\n" +
+                   "Name must not contain upper case letters or special characters other than "
+                   "'-', '_', or '.'.")
+                      .c_str(),
                   g_error_msg_buf);
 
   std::map<std::string, OpenXRActionSet> &action_sets = m_oxr->action_sets;
@@ -708,7 +711,11 @@ bool GHOST_XrSession::createActions(const char *action_set_name,
 
     OpenXRAction action;
     CHECK_XR_ND_BUF(xrCreateAction(action_set->set, &action_info, &action.action),
-                    (std::string("Failed to create action \"") + info.name + "\".").c_str(),
+                    (std::string("Failed to create action \"") + info.name + "\".\n" +
+                     "Action name and/or paths are invalid.\n" +
+                     "Name must not contain upper case letters or special characters other than "
+                     "'-', '_', or '.'.")
+                        .c_str(),
                     g_error_msg_buf);
 
     if (actions.find(info.name) == actions.end()) {
@@ -917,7 +924,8 @@ bool GHOST_XrSession::createActionBindings(const char *action_set_name,
 
     CHECK_XR_ND_BUF(xrSuggestInteractionProfileBindings(instance, &bindings_info),
                     (std::string("Failed to create bindings for profile \"") +
-                     interaction_profile_path + "\".")
+                     interaction_profile_path + "\".\n" +
+                     "Are the profile and action paths correct?")
                         .c_str(),
                     g_error_msg_buf);
 
@@ -1026,7 +1034,7 @@ void GHOST_XrSession::destroyActionBindings(const char *action_set_name,
 
     CHECK_XR_BUF(xrSuggestInteractionProfileBindings(instance, &bindings_info),
                  (std::string("Failed to destroy bindings for profile \"") +
-                  interaction_profile_path + "\".")
+                  interaction_profile_path + "\".\n" + "Are the profile and action paths correct?")
                      .c_str(),
                  g_error_msg_buf);
 
@@ -1078,7 +1086,7 @@ bool GHOST_XrSession::attachActionSets()
   attach_info.actionSets = action_sets.data();
 
   CHECK_XR_ND(xrAttachSessionActionSets(m_oxr->session, &attach_info),
-              "Failed to attach action sets.");
+              "Failed to attach XR action sets.");
 
   return true;
 }
@@ -1097,7 +1105,7 @@ bool GHOST_XrSession::syncActions(const char *action_set_name)
   std::vector<XrActiveActionSet> active_action_sets(sync_info.countActiveActionSets);
   if (action_set_name != nullptr) {
     OpenXRActionSet *action_set = find_action_set(m_oxr.get(), action_set_name);
-    if (action_set == nullptr) {
+    if (action_set == nullptr || action_set->actions.size() < 1) {
       return false;
     }
 
@@ -1108,15 +1116,25 @@ bool GHOST_XrSession::syncActions(const char *action_set_name)
   else {
     uint32_t i = 0;
     for (auto &action_set : action_sets) {
+      if (action_set.second.actions.size() < 1) {
+        active_action_sets.pop_back();
+        --sync_info.countActiveActionSets;
+        continue;
+      }
+
       XrActiveActionSet &active_action_set = active_action_sets[i];
       active_action_set.actionSet = action_set.second.set;
       active_action_set.subactionPath = XR_NULL_PATH;
       ++i;
     }
+
+    if (sync_info.countActiveActionSets < 1) {
+      return false;
+    }
   }
   sync_info.activeActionSets = active_action_sets.data();
 
-  CHECK_XR(xrSyncActions(m_oxr->session, &sync_info), "Failed to sync actions.");
+  CHECK_XR(xrSyncActions(m_oxr->session, &sync_info), "Failed to synchronize XR actions.");
 
   return true;
 }
diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index fdd7e30c863..91024fa0087 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -588,7 +588,13 @@ static void rna_def_xr_session_state(BlenderRNA *brna)
   RNA_def_function_flag(func, FUNC_NO_SELF);
   parm = RNA_def_pointer(func, "context", "Context", "", "");
   RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
-  parm = RNA_def_string(func, "name", NULL, 64, "Action Set", "Action set name");
+  parm = RNA_def_string(func,
+                        "name",
+                        NULL,
+                        64,
+                        "Action Set",
+                        "Action set name (must not contain upper case letters or special "
+                        "characters other than '-', '_', or '.'");
   RNA_def_parameter_flags(parm, PROP_STRING, PARM_REQUIRED);
   parm = RNA_def_boolean(func, "result", 0, "Result", "");
   RNA_def_function_return(func, parm);
@@ -600,7 +606,13 @@ static void rna_def_xr_session_state(BlenderRNA *brna)
   RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
   parm = RNA_def_string(func, "action_set_name", NULL, 64, "Action Set", "Action set name");
   RNA_def_parameter_flags(parm, PROP_STRING, PARM_REQUIRED);
-  parm = RNA_def_string(func, "name", NULL, 64, "Action", "Action name");
+  parm = RNA_def_string(func,
+                        "name",
+                        NULL,
+                        64,
+                        "Action",
+                        "Action name (must not contain upper case letters or special characters "
+                        "other than '-', '_', or '.'");
   RNA_def_parameter_flags(parm, PROP_STRING, PARM_REQUIRED);
   parm = RNA_def_enum(func, "type", action_types, 0, "Type", "Action type");
   RNA_def_parameter_flags(parm, PROP_ENUM, PARM_REQUIRED);
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_actions.c b/source/blender/windowmanager/xr/intern/wm_xr_actions.c
index 0e05bdb8d08..93ddea9b28f 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_actions.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_actions.c
@@ -184,22 +184,30 @@ void WM_xr_action_set_destroy(wmXrData *xr, const char *action_set_name, bool re
   wmXrSessionState *session_state = &xr->runtime->session_state;
   GHash *action_sets = session_state->action_sets;
   wmXrActionSet *action_set = BLI_ghash_lookup(action_sets, action_set_name);
+  if (!action_set) {
+    return;
+  }
 
-  if (action_set) {
-    if (action_set->actions) {
-      BLI_ghash_free(action_set->actions, NULL, action_destroy);
+  if (action_set == session_state->active_action_set) {
+    if (action_set->controller_pose_action) {
+      wm_xr_session_controller_data_clear(
+          action_set->controller_pose_action->count_subaction_paths,
+          xr->runtime->bcontext,
+          &xr->runtime->session_state);
+      action_set->controller_pose_action = NULL;
     }
+    session_state->active_action_set = NULL;
+  }
 
-    if (session_state->active_action_set == action_set) {
-      session_state->active_action_set = NULL;
-    }
+  if (action_set->actions) {
+    BLI_ghash_free(action_set->actions, NULL, action_destroy);
+  }
 
-    if (remove_reference) {
-      BLI_ghash_remove(action_sets, action_set_name, NULL, action_set_destroy);
-    }
-    else {
-      action_set_destroy(action_set);
-    }
+  if (remove_reference) {
+    BLI_ghash_remove(action_sets, action_set_name, NULL, action_set_destroy);
+  }
+  else {
+    action_set_destroy(action_set);
   }
 }
 
@@ -255,6 +263,8 @@ void WM_xr_actions_destroy(wmXrData *xr,
   /* Save name of controller pose action in case the action is removed from the GHash. */
   char controller_pose_name[64];
   strcpy(controller_pose_name, action_set->controller_pose_action->name);
+  const unsigned int controller_pose_count =
+      action_set->controller_pose_action->count_subaction_paths;
 
   GHash *actions = action_set->actions;
   for (unsigned int i = 0; i < count; ++i) {
@@ -262,6 +272,10 @@ void WM_xr_actions_destroy(wmXrData *xr,
   }
 
   if (!action_find(action_set, controller_pose_name)) {
+    if (action_set == xr->runtime->session_state.active_action_set) {
+      wm_xr_session_controller_data_clear(
+          controller_pose_count, xr->runtime->bcontext, &xr->runtime->session_state);
+    }
     action_set->controller_pose_action = NULL;
   }
 }
@@ -311,6 +325,12 @@ bool WM_xr_active_action_set_set(wmXrData *xr, const char *action_set_name)
   }
 
   xr->runtime->session_state.active_action_set = action_set;
+
+  if (action_set->controller_pose_action) {
+    wm_xr_session_controller_data_populate(
+        action_set->controller_pose_action, xr->runtime->bcontext, &xr->runtime->session_state);
+  }
+
   return true;
 }
 
@@ -330,6 +350,11 @@ bool WM_xr_controller_pose_action_set(wmXrData *xr,
 
   action_set->controller_pose_action = action;
 
+  if (action_set == xr->runtime->session_state.active_action_set) {
+    wm_xr_session_controller_data_populate(
+        action, xr->runtime->bcontext, &xr->runtime->session_state);
+  }
+
   return true;
 }
 
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_intern.h b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
index 61ef1890c78..0fc8f8c3ead 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_intern.h
+++ b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
@@ -155,8 +155,12 @@ void wm_xr_session_gpu_binding_context_destroy(GHOST_ContextHandle context);
 void wm_xr_session_actions_init(wmXrData *xr);
 void wm_xr_session_actions_update(wmXrData *xr);
 void wm_xr_session_actions_uninit(wmXrData *xr);
-void wm_xr_session_controller_data_create(wmXrData *xr);
-void wm_xr_session_controller_data_free(wmXrData *xr);
+void wm_xr_session_controller_data_populate(const wmXrAction *controller_pose_action,
+                                            struct bContex

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list