diff options
Diffstat (limited to 'viewport_vr_preview/action_map.py')
-rw-r--r-- | viewport_vr_preview/action_map.py | 112 |
1 files changed, 85 insertions, 27 deletions
diff --git a/viewport_vr_preview/action_map.py b/viewport_vr_preview/action_map.py index ed3dbe82..d5055b76 100644 --- a/viewport_vr_preview/action_map.py +++ b/viewport_vr_preview/action_map.py @@ -2,6 +2,7 @@ if "bpy" in locals(): import importlib + importlib.reload(action_map_io) importlib.reload(defaults) else: from . import action_map_io, defaults @@ -13,22 +14,65 @@ import importlib.util import os.path +def vr_actionmap_active_get(session_settings): + actionmaps = session_settings.actionmaps + return ( + None if (len(actionmaps) < + 1) else actionmaps[session_settings.active_actionmap] + ) + + +def vr_actionmap_selected_get(session_settings): + actionmaps = session_settings.actionmaps + return ( + None if (len(actionmaps) < + 1) else actionmaps[session_settings.selected_actionmap] + ) + + +def vr_actionmap_item_selected_get(am): + actionmap_items = am.actionmap_items + return ( + None if (len(actionmap_items) < + 1) else actionmap_items[am.selected_item] + ) + + +def vr_actionmap_user_path_selected_get(ami): + user_paths = ami.user_paths + return ( + None if (len(user_paths) < + 1) else user_paths[ami.selected_user_path] + ) + + +def vr_actionmap_binding_selected_get(ami): + actionmap_bindings = ami.bindings + return ( + None if (len(actionmap_bindings) < + 1) else actionmap_bindings[ami.selected_binding] + ) + + +def vr_actionmap_component_path_selected_get(amb): + component_paths = amb.component_paths + return ( + None if (len(component_paths) < + 1) else component_paths[amb.selected_component_path] + ) + + def vr_actionset_active_update(context): session_state = context.window_manager.xr_session_state - if not session_state or len(session_state.actionmaps) < 1: + if not session_state: return - scene = context.scene - - if scene.vr_actions_use_gamepad and session_state.actionmaps.find(session_state, defaults.VRDefaultActionmaps.GAMEPAD.value): - session_state.active_action_set_set(context, defaults.VRDefaultActionmaps.GAMEPAD.value) - else: - # Use first action map. - session_state.active_action_set_set(context, session_state.actionmaps[0].name) - + session_settings = context.window_manager.xr_session_settings + am = vr_actionmap_active_get(session_settings) + if not am: + return -def vr_actions_use_gamepad_update(self, context): - vr_actionset_active_update(context) + session_state.active_action_set_set(context, am.name) @persistent @@ -43,20 +87,29 @@ def vr_create_actions(context: bpy.context): if not scene.vr_actions_enable: return - # Ensure default action maps. - if not defaults.vr_ensure_default_actionmaps(session_state): - return + session_settings = context.window_manager.xr_session_settings - for am in session_state.actionmaps: + if (len(session_settings.actionmaps) < 1): + # Ensure default action maps. + if not defaults.vr_ensure_default_actionmaps(session_settings): + return + + for am in session_settings.actionmaps: if len(am.actionmap_items) < 1: continue + # Check for action maps where all bindings require OpenXR extensions. + if am.name == defaults.VRDefaultActionmaps.TRACKER.value: + if not session_settings.enable_vive_tracker_extension: #scene.vr_actions_enable_vive_tracker: + continue + ok = session_state.action_set_create(context, am) if not ok: return controller_grip_name = "" controller_aim_name = "" + tracker_names = [] for ami in am.actionmap_items: if len(ami.bindings) < 1: @@ -71,6 +124,8 @@ def vr_create_actions(context: bpy.context): controller_grip_name = ami.name if ami.pose_is_controller_aim: controller_aim_name = ami.name + if ami.pose_is_tracker: + tracker_names.append(ami.name) for amb in ami.bindings: # Check for bindings that require OpenXR extensions. @@ -91,15 +146,18 @@ def vr_create_actions(context: bpy.context): if not ok: return - # Set controller pose actions. + # Set controller and tracker pose actions. if controller_grip_name and controller_aim_name: session_state.controller_pose_actions_set(context, am.name, controller_grip_name, controller_aim_name) + for tracker_name in tracker_names: + session_state.tracker_pose_action_add(context, am.name, tracker_name) + # Set active action set. vr_actionset_active_update(context) -def vr_load_actionmaps(session_state, filepath): +def vr_load_actionmaps(session_settings, filepath): if not os.path.exists(filepath): return False @@ -107,16 +165,16 @@ def vr_load_actionmaps(session_state, filepath): file = importlib.util.module_from_spec(spec) spec.loader.exec_module(file) - action_map_io.actionconfig_init_from_data(session_state, file.actionconfig_data, file.actionconfig_version) + action_map_io.actionconfig_init_from_data(session_settings, file.actionconfig_data, file.actionconfig_version) return True -def vr_save_actionmaps(session_state, filepath, sort=False): - action_map_io.actionconfig_export_as_data(session_state, filepath, sort=sort) +def vr_save_actionmaps(session_settings, filepath, sort=False): + action_map_io.actionconfig_export_as_data(session_settings, filepath, sort=sort) print("Saved XR actionmaps: " + filepath) - + return True @@ -126,11 +184,6 @@ def register(): description="Enable default VR controller actions, including controller poses and haptics", default=True, ) - bpy.types.Scene.vr_actions_use_gamepad = bpy.props.BoolProperty( - description="Use input from gamepad (Microsoft Xbox Controller) instead of motion controllers", - default=False, - update=vr_actions_use_gamepad_update, - ) bpy.types.Scene.vr_actions_enable_huawei = bpy.props.BoolProperty( description="Enable bindings for the Huawei controllers. Note that this may not be supported by all OpenXR runtimes", default=False, @@ -147,16 +200,21 @@ def register(): description="Enable bindings for the HTC Vive Focus 3 controllers. Note that this may not be supported by all OpenXR runtimes", default=False, ) + # Stored in session settings to use in session creation as a workaround for SteamVR controller/tracker compatibility issues. + #bpy.types.Scene.vr_actions_enable_vive_tracker = bpy.props.BoolProperty( + # description="Enable bindings for the HTC Vive Trackers. Note that this may not be supported by all OpenXR runtimes", + # default=False, + #) bpy.app.handlers.xr_session_start_pre.append(vr_create_actions) def unregister(): del bpy.types.Scene.vr_actions_enable - del bpy.types.Scene.vr_actions_use_gamepad del bpy.types.Scene.vr_actions_enable_huawei del bpy.types.Scene.vr_actions_enable_reverb_g2 del bpy.types.Scene.vr_actions_enable_vive_cosmos del bpy.types.Scene.vr_actions_enable_vive_focus + #del bpy.types.Scene.vr_actions_enable_vive_tracker bpy.app.handlers.xr_session_start_pre.remove(vr_create_actions) |