diff --git a/common/src/main/java/org/vivecraft/client/gui/framework/screens/GuiGroupedListEditorScreen.java b/common/src/main/java/org/vivecraft/client/gui/framework/screens/GuiGroupedListEditorScreen.java new file mode 100644 index 000000000..5fef3751b --- /dev/null +++ b/common/src/main/java/org/vivecraft/client/gui/framework/screens/GuiGroupedListEditorScreen.java @@ -0,0 +1,141 @@ +package org.vivecraft.client.gui.framework.screens; + +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import org.vivecraft.client.gui.framework.widgets.SettingsList; + +import javax.annotation.Nullable; +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +public abstract class GuiGroupedListEditorScreen extends GuiListScreen { + private final Supplier> valuesSupplier; + private final Function categorySupplier; + private final Runnable loadDefaults; + private final Consumer> save; + + protected final boolean fixedEntryCount; + + protected List elements; + protected abstract T createNewValue(String category); + + public GuiGroupedListEditorScreen( + Component title, Screen lastScreen, boolean fixedEntryCount, Supplier> valuesSupplier, + Runnable loadDefaults, Consumer> save, @Nullable Function categorySupplier) + { + super(title, lastScreen); + this.fixedEntryCount = fixedEntryCount; + this.valuesSupplier = valuesSupplier; + this.loadDefaults = loadDefaults; + this.save = save; + this.categorySupplier = categorySupplier != null ? categorySupplier : item -> "Empty"; + } + + @Override + protected void init() { + super.init(); + } + + @Override + protected void addLowerButtons(int top) { + this.addRenderableWidget( + Button.builder(Component.translatable("vivecraft.gui.loaddefaults"), button -> { + this.loadDefaults.run(); + this.elements = null; + this.reinit = true; + }) + .bounds(this.width / 2 - 155, top, 150, 20) + .build()); + + this.addRenderableWidget( + Button.builder(Component.translatable("gui.back"), button -> this.onClose()) + .bounds(this.width / 2 + 5, top, 150, 20) + .build()); + } + + @Override + public void onClose() { + this.save.accept(this.elements); + super.onClose(); + } + + @SuppressWarnings("unchecked") + protected List getCurrentValues() { + return this.list.children().stream().map(entry -> { + if (entry instanceof GuiListEditorScreen.ValueEntry valueEntry) { + return (T) valueEntry.getValue(); + } else { + return null; + } + }).filter(Objects::nonNull).collect(Collectors.toList()); + } + + @Override + protected List getEntries() { + List entries = new LinkedList<>(); + + if (this.elements == null) { + this.elements = new ArrayList<>(this.valuesSupplier.get()); + } + + Map> grouped = new LinkedHashMap<>(); + + for (T element : this.elements) { + String category = this.categorySupplier.apply(element); + grouped.computeIfAbsent(category, k -> new LinkedList<>()) + .add(element); + } + + int index = 0; + for (Map.Entry> group : grouped.entrySet()) { + + String category = group.getKey(); + List values = group.getValue(); + + if (!category.isEmpty()) { + entries.add(new SettingsList.GroupedEntry( + Component.translatable(category) + )); + } + + for (T value : values) { + entries.add(this.toEntry(value, index++)); + } + + if (!this.fixedEntryCount && !category.isEmpty()) { + entries.add(createAddButton(category)); + } + } + + return entries; + } + + private SettingsList.BaseEntry createAddButton(String category) { + return new SettingsList.WidgetEntry( + Component.literal(""), + Button.builder(Component.translatable("vivecraft.options.add"), button -> { + this.addNewValue(category); + }).size(50, 20).build() + ); + } + + protected void addNewValue(String category) { + this.elements = getCurrentValues(); + this.elements.add(this.createNewValue(category)); + this.reinit = true; + } + + protected abstract ValueEntry toEntry(T value, int index); + + protected static abstract class ValueEntry extends SettingsList.BaseEntry { + public ValueEntry(Component name, Supplier tooltipSupplier) { + super(name, tooltipSupplier); + } + + public abstract T getValue(); + } +} diff --git a/common/src/main/java/org/vivecraft/client/gui/settings/GuiBindings.java b/common/src/main/java/org/vivecraft/client/gui/settings/GuiBindings.java index f88b9a63e..3dddd132e 100644 --- a/common/src/main/java/org/vivecraft/client/gui/settings/GuiBindings.java +++ b/common/src/main/java/org/vivecraft/client/gui/settings/GuiBindings.java @@ -1,58 +1,97 @@ package org.vivecraft.client.gui.settings; import com.google.common.collect.ImmutableList; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.Tooltip; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import org.vivecraft.client.gui.framework.screens.GuiListScreen; -import org.vivecraft.client.gui.framework.widgets.SettingsList; -import org.vivecraft.client_vr.provider.control.ActionType; -import org.vivecraft.client_vr.provider.control.InputAction; +import org.vivecraft.client.gui.framework.screens.GuiGroupedListEditorScreen; +import org.vivecraft.client_vr.provider.control.ActionSet; +import org.vivecraft.client_vr.provider.control.Source; import org.vivecraft.client_vr.provider.openxr.MCOpenXR; +import org.vivecraft.client_vr.provider.control.BindingProfile; -import java.util.LinkedList; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; -import java.util.function.BooleanSupplier; -import java.util.function.Supplier; +import java.util.Map; -public class GuiBindings extends GuiListScreen { +public class GuiBindings extends GuiGroupedListEditorScreen { + public GuiBindings(Screen lastScreen) { + super(Component.empty(), lastScreen, false, () -> + { + if (MCOpenXR.get() == null) return List.of(); + List sources = new ArrayList<>(); + try { + if (MCOpenXR.get() == null) return List.of(); + BindingProfile profile = BindingProfile.getCurrentProfile(); + if (profile == null) profile = BindingProfile.getDefaultBinding(MCOpenXR.get().getCurrentInteractionProfile()); + if (profile == null) profile = BindingProfile.getDefaultBinding(""); + for (ActionSet set : profile.sets().values()) {sources.addAll(set.sources());} + } catch (FileNotFoundException e) { + // Show error to user about missing profile + } + return sources; + }, + () -> {}, + save -> { + Map bindings = new HashMap<>(); + bindings.put("/actions/custom", + new ActionSet(save, null, null, null) + ); - public GuiBindings(Screen lastScreen) { - super(Component.translatable("vivecraft.options.screen.bindings"), lastScreen); + BindingProfile profile = new BindingProfile( + "Custom Profile", + "New custom profile", + "Custom", + null, + bindings + ); + + if (profile.saveProfile()) { + // TODO success message + } else { + // TODO error message + } + }, + action -> Component.translatable(action.path()).getString() + ); + + this.searchable = false; } @Override - protected List getEntries() { - List list = new LinkedList<>(); - for (var entry : MCOpenXR.get().getBinds().entrySet()) { - var input = MCOpenXR.get().getInputActionByName(entry.getKey()); - if (input == null) continue; - //list.add(new ResettableEntry(Component.translatable(input.name), input)); - } - return list; + protected Source createNewValue(String category) { + return null; } - public static class ResettableEntry extends SettingsList.WidgetEntry { - public static final int VALUE_BUTTON_WIDTH = 125; + @Override + protected ValueEntry toEntry(Source value, int index) { + return new RemovableEntry<>(Component.translatable(value.path()), value, 0); + } - private final Button resetButton; - private final BooleanSupplier canReset; + protected static class RemovableEntry extends ValueEntry { + protected final T value; - public ResettableEntry(Component name, InputAction action) { - super(name, getBaseWidget(action, VALUE_BUTTON_WIDTH, 20).get()); + private final int index; + private final Button editButton; + private final Button removeButton; - this.canReset = () -> action.type != ActionType.BOOLEAN; - this.resetButton = Button.builder(Component.literal("X"), button -> { - action.setType(ActionType.BOOLEAN); - this.valueWidget = getBaseWidget(action, valueWidget.getWidth(), valueWidget.getHeight()).get(); - }) - .tooltip(Tooltip.create(Component.translatable("controls.reset"))) + public RemovableEntry(Component name, T value, int index) { + super(name, null); + this.value = value; + this.index = index; + + this.editButton = Button.builder(Component.translatable("vivecraft.options.edit"), + button -> {}) + .bounds(0, 0, 100, 20).build(); + this.removeButton = Button.builder(Component.literal("-"), + button -> {}) .bounds(0, 0, 20, 20).build(); } @@ -61,34 +100,41 @@ public void renderContent( GuiGraphics guiGraphics, int mouseX, int mouseY, boolean hovering, float partialTick) { super.renderContent(guiGraphics, mouseX, mouseY, hovering, partialTick); - this.resetButton.setX(this.getContentRight() - 20); - this.resetButton.setY(this.getContentY()); - this.resetButton.active = this.canReset.getAsBoolean(); - this.resetButton.render(guiGraphics, mouseX, mouseY, partialTick); + + int textY = this.getY() + this.getHeight() / 2 - Minecraft.getInstance().font.lineHeight / 2 + 2; + guiGraphics.drawString(Minecraft.getInstance().font, this.name, this.getContentX(), textY, + this.textColor()); + this.removeButton.active = this.isActive(); + this.editButton.active = this.isActive(); + + this.editButton.setX(this.getContentRight() - this.editButton.getWidth() - 20); + this.editButton.setY(this.getY()); + this.editButton.render(guiGraphics, mouseX, mouseY, partialTick); + this.removeButton.setX(this.getContentRight() - 20); + this.removeButton.setY(this.getY()); + this.removeButton.render(guiGraphics, mouseX, mouseY, partialTick); } @Override - public List children() { - return ImmutableList.of(this.valueWidget, this.resetButton); + public List narratables() { + return ImmutableList.of(this.editButton, this.removeButton); } @Override - public List narratables() { - return ImmutableList.of(this.valueWidget, this.resetButton); + public List children() { + return ImmutableList.of(this.editButton, this.removeButton); } @Override public void setActive(boolean active) { super.setActive(active); - this.resetButton.active = active; + this.removeButton.active = active; + this.editButton.active = active; } - } - public static Supplier getBaseWidget(InputAction action, int width, int height) { - return () -> Button - .builder(Component.literal("" + action.type), button -> {}) - .bounds(0, 0, width, height) - .tooltip(Tooltip.create(Component.literal(action.name))) - .build(); + @Override + public T getValue() { + return this.value; + } } } diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/MCVR.java b/common/src/main/java/org/vivecraft/client_vr/provider/MCVR.java index 71023baa9..030234dc7 100644 --- a/common/src/main/java/org/vivecraft/client_vr/provider/MCVR.java +++ b/common/src/main/java/org/vivecraft/client_vr/provider/MCVR.java @@ -1217,15 +1217,15 @@ public Map getSpecialActionParams() { this.addActionParams(map, this.mc.options.keyDown, "optional", ActionType.VEC1, null); this.addActionParams(map, this.mc.options.keyLeft, "optional", ActionType.VEC1, null); this.addActionParams(map, this.mc.options.keyRight, "optional", ActionType.VEC1, null); - this.addActionParams(map, this.mc.options.keyInventory, "suggested", ActionType.BOOLEAN, + this.addActionParams(map, this.mc.options.keyInventory, "suggested", ActionType.PRESS, VRInputActionSet.GLOBAL); - this.addActionParams(map, this.mc.options.keyAttack, "suggested", ActionType.BOOLEAN, null); - this.addActionParams(map, this.mc.options.keyUse, "suggested", ActionType.BOOLEAN, null); - this.addActionParams(map, this.mc.options.keyChat, "optional", ActionType.BOOLEAN, VRInputActionSet.GLOBAL); + this.addActionParams(map, this.mc.options.keyAttack, "suggested", ActionType.PRESS, null); + this.addActionParams(map, this.mc.options.keyUse, "suggested", ActionType.PRESS, null); + this.addActionParams(map, this.mc.options.keyChat, "optional", ActionType.PRESS, VRInputActionSet.GLOBAL); this.addActionParams(map, MOD.keyHotbarScroll, "optional", ActionType.VEC2, null); this.addActionParams(map, MOD.keyHotbarSwipeX, "optional", ActionType.VEC2, null); this.addActionParams(map, MOD.keyHotbarSwipeY, "optional", ActionType.VEC2, null); - this.addActionParams(map, MOD.keyMenuButton, "suggested", ActionType.BOOLEAN, VRInputActionSet.GLOBAL); + this.addActionParams(map, MOD.keyMenuButton, "suggested", ActionType.PRESS, VRInputActionSet.GLOBAL); this.addActionParams(map, MOD.keyTeleportFallback, "suggested", ActionType.VEC1, null); this.addActionParams(map, MOD.keyFreeMoveRotate, "optional", ActionType.VEC2, null); this.addActionParams(map, MOD.keyFreeMoveStrafe, "optional", ActionType.VEC2, null); @@ -1233,22 +1233,22 @@ public Map getSpecialActionParams() { this.addActionParams(map, MOD.keyRotateRight, "optional", ActionType.VEC1, null); this.addActionParams(map, MOD.keyRotateAxis, "optional", ActionType.VEC2, null); this.addActionParams(map, MOD.keyFlickStick, "optional", ActionType.VEC2, null); - this.addActionParams(map, MOD.keyRadialMenu, "suggested", ActionType.BOOLEAN, null); - this.addActionParams(map, MOD.keySwapMirrorView, "optional", ActionType.BOOLEAN, VRInputActionSet.GLOBAL); - this.addActionParams(map, MOD.keyToggleKeyboard, "optional", ActionType.BOOLEAN, VRInputActionSet.GLOBAL); - this.addActionParams(map, MOD.keyMoveThirdPersonCam, "optional", ActionType.BOOLEAN, VRInputActionSet.GLOBAL); - this.addActionParams(map, MOD.keyToggleHandheldCam, "optional", ActionType.BOOLEAN, VRInputActionSet.GLOBAL); - this.addActionParams(map, MOD.keyQuickHandheldCam, "optional", ActionType.BOOLEAN, VRInputActionSet.GLOBAL); - this.addActionParams(map, MOD.keyTrackpadTouch, "optional", ActionType.BOOLEAN, VRInputActionSet.TECHNICAL); - this.addActionParams(map, MOD.keyVRInteract, "suggested", ActionType.BOOLEAN, VRInputActionSet.CONTEXTUAL); - this.addActionParams(map, MOD.keyClimbeyGrab, "suggested", ActionType.BOOLEAN, null); - this.addActionParams(map, MOD.keyClimbeyJump, "suggested", ActionType.BOOLEAN, null); - this.addActionParams(map, GuiHandler.KEY_LEFT_CLICK, "suggested", ActionType.BOOLEAN, null); + this.addActionParams(map, MOD.keyRadialMenu, "suggested", ActionType.PRESS, null); + this.addActionParams(map, MOD.keySwapMirrorView, "optional", ActionType.PRESS, VRInputActionSet.GLOBAL); + this.addActionParams(map, MOD.keyToggleKeyboard, "optional", ActionType.PRESS, VRInputActionSet.GLOBAL); + this.addActionParams(map, MOD.keyMoveThirdPersonCam, "optional", ActionType.PRESS, VRInputActionSet.GLOBAL); + this.addActionParams(map, MOD.keyToggleHandheldCam, "optional", ActionType.PRESS, VRInputActionSet.GLOBAL); + this.addActionParams(map, MOD.keyQuickHandheldCam, "optional", ActionType.PRESS, VRInputActionSet.GLOBAL); + this.addActionParams(map, MOD.keyTrackpadTouch, "optional", ActionType.PRESS, VRInputActionSet.TECHNICAL); + this.addActionParams(map, MOD.keyVRInteract, "suggested", ActionType.PRESS, VRInputActionSet.CONTEXTUAL); + this.addActionParams(map, MOD.keyClimbeyGrab, "suggested", ActionType.PRESS, null); + this.addActionParams(map, MOD.keyClimbeyJump, "suggested", ActionType.PRESS, null); + this.addActionParams(map, GuiHandler.KEY_LEFT_CLICK, "suggested", ActionType.PRESS, null); this.addActionParams(map, GuiHandler.KEY_SCROLL_AXIS, "optional", ActionType.VEC2, null); - this.addActionParams(map, GuiHandler.KEY_RIGHT_CLICK, "suggested", ActionType.BOOLEAN, null); - this.addActionParams(map, GuiHandler.KEY_SHIFT, "suggested", ActionType.BOOLEAN, null); - this.addActionParams(map, GuiHandler.KEY_KEYBOARD_CLICK, "suggested", ActionType.BOOLEAN, null); - this.addActionParams(map, GuiHandler.KEY_KEYBOARD_SHIFT, "suggested", ActionType.BOOLEAN, null); + this.addActionParams(map, GuiHandler.KEY_RIGHT_CLICK, "suggested", ActionType.PRESS, null); + this.addActionParams(map, GuiHandler.KEY_SHIFT, "suggested", ActionType.PRESS, null); + this.addActionParams(map, GuiHandler.KEY_KEYBOARD_CLICK, "suggested", ActionType.PRESS, null); + this.addActionParams(map, GuiHandler.KEY_KEYBOARD_SHIFT, "suggested", ActionType.PRESS, null); // users can provide their own action parameters if they want // this allows them to split mod KeyMappings into GUI, INGAME and GLOBAL categories @@ -1284,7 +1284,7 @@ public Map getSpecialActionParams() { if (actionSet == null) { VRSettings.LOGGER.warn("Vivecraft: Unknown action set: {}", tokens[1]); } else { - this.addActionParams(map, keyMapping, "optional", ActionType.BOOLEAN, actionSet); + this.addActionParams(map, keyMapping, "optional", ActionType.PRESS, actionSet); } } } diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/control/Action.java b/common/src/main/java/org/vivecraft/client_vr/provider/control/Action.java new file mode 100644 index 000000000..9bde1878d --- /dev/null +++ b/common/src/main/java/org/vivecraft/client_vr/provider/control/Action.java @@ -0,0 +1,3 @@ +package org.vivecraft.client_vr.provider.control; + +public record Action(String action, ActionType type) {} diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/control/ActionParams.java b/common/src/main/java/org/vivecraft/client_vr/provider/control/ActionParams.java index 72ff6be68..77f01a9fe 100644 --- a/common/src/main/java/org/vivecraft/client_vr/provider/control/ActionParams.java +++ b/common/src/main/java/org/vivecraft/client_vr/provider/control/ActionParams.java @@ -8,5 +8,5 @@ * @param actionSetOverride action set to put it in, any of {@link VRInputActionSet} */ public record ActionParams(String requirement, ActionType type, VRInputActionSet actionSetOverride) { - public static final ActionParams DEFAULT = new ActionParams("optional", ActionType.BOOLEAN, null); + public static final ActionParams DEFAULT = new ActionParams("optional", ActionType.PRESS, null); } diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/control/ActionSet.java b/common/src/main/java/org/vivecraft/client_vr/provider/control/ActionSet.java new file mode 100644 index 000000000..5b7ed04c7 --- /dev/null +++ b/common/src/main/java/org/vivecraft/client_vr/provider/control/ActionSet.java @@ -0,0 +1,10 @@ +package org.vivecraft.client_vr.provider.control; + +import java.util.List; + +public record ActionSet( + List sources, + List haptics, + List poses, + List chords +) {} diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/control/ActionType.java b/common/src/main/java/org/vivecraft/client_vr/provider/control/ActionType.java index 6041925db..72ea7072e 100644 --- a/common/src/main/java/org/vivecraft/client_vr/provider/control/ActionType.java +++ b/common/src/main/java/org/vivecraft/client_vr/provider/control/ActionType.java @@ -1,7 +1,7 @@ package org.vivecraft.client_vr.provider.control; public enum ActionType { - BOOLEAN("boolean"), + PRESS("boolean"), DOUBLE_PRESS("boolean"), LONG_PRESS("boolean"), HOLD("boolean"), @@ -20,4 +20,44 @@ public enum ActionType { public String getSteamName() { return steamName; } + + public static ActionType convertFromSteam(String steamName, String mode) { + return switch (steamName) { + case "click" -> switch (mode) { + case "button" -> PRESS; + case "toggle_button" -> TOGGLE; + default -> PRESS; + }; + case "long" -> switch (mode) { + case "button" -> LONG_PRESS; + default -> LONG_PRESS; + }; + case "scroll" -> switch (mode) { + case "scroll" -> VEC2; + default -> VEC2; + }; + case "touch" -> switch (mode) { + case "trackpad" -> PRESS; + default -> PRESS; + }; + case "position" -> switch (mode) { + case "joystick" -> VEC2; + default -> VEC2; + }; + case "pull" -> switch (mode) { + case "trigger" -> VEC1; + default -> VEC1; + }; + case "grab" -> switch (mode) { + case "grab" -> PRESS; + default -> PRESS; + }; + case "north", "east", "south", "west" -> switch (mode) { + case "dpad" -> VEC1; + default -> VEC1; + }; + + default -> null; + }; + } } diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/control/BindingProfile.java b/common/src/main/java/org/vivecraft/client_vr/provider/control/BindingProfile.java new file mode 100644 index 000000000..2e1914d90 --- /dev/null +++ b/common/src/main/java/org/vivecraft/client_vr/provider/control/BindingProfile.java @@ -0,0 +1,112 @@ +package org.vivecraft.client_vr.provider.control; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.vivecraft.client.utils.FileUtils; +import org.vivecraft.client_vr.ClientDataHolderVR; +import org.vivecraft.client_vr.provider.openxr.MCOpenXR; +import org.vivecraft.client_vr.settings.VRSettings; + +import java.io.*; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +public record BindingProfile( + String name, + String description, + String category, + ControllerPaths controller_paths, + Map sets +) { + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); + + public static BindingProfile getCurrentProfile() throws FileNotFoundException { + String currentProfile = ClientDataHolderVR.getInstance().vrSettings.currentBindingProfile; + File profileFile = new File("input/profiles/" + currentProfile.replaceAll("[^a-zA-Z0-9-_\\.]", "_") + ".json"); + if (profileFile.exists()) return GSON.fromJson(new FileReader(profileFile), BindingProfile.class); + return null; + } + + public static List getAllProfiles() { + File profilesDir = new File("input/profiles/"); + if (!profilesDir.exists() || !profilesDir.isDirectory()) return List.of(); + + File[] profileFiles = profilesDir.listFiles((dir, name) -> name.endsWith(".json")); + if (profileFiles == null) return List.of(); + + List profiles = new java.util.ArrayList<>(); + for (File profileFile : profileFiles) { + try (FileReader reader = new FileReader(profileFile)) { + BindingProfile profile = GSON.fromJson(reader, BindingProfile.class); + if (profile != null) profiles.add(profile); + } catch (IOException e) { + VRSettings.LOGGER.error("Failed to load binding profile from {}: {}", profileFile.getName(), + e.getMessage()); + } + } + + return profiles; + } + + public boolean saveProfile() { + File profileFile = new File("input/profiles/" + name.replaceAll("[^a-zA-Z0-9-_\\.]", "_") + ".json"); + if (!profileFile.exists()) profileFile.getParentFile().mkdirs(); + try (FileWriter writer = new FileWriter(profileFile)) { + GSON.toJson(this, writer); + } catch (IOException e) { + VRSettings.LOGGER.error("Failed to save binding profile: {}", e.getMessage()); + return false; + } + + return true; + } + + public static HashSet supportedHeadsets() { + HashSet set = new HashSet<>(); + if (MCOpenXR.get().session.getCapabilities().XR_HTC_vive_cosmos_controller_interaction) { + set.add("/interaction_profiles/htc/vive_cosmos_controller"); + } + + if (MCOpenXR.get().session.getCapabilities().XR_BD_controller_interaction) { + set.add("/interaction_profiles/bytedance/pico4_controller"); + set.add("/interaction_profiles/bytedance/pico_neo3_controller"); + } + + set.add("/interaction_profiles/khr/simple_controller"); + set.add("/interaction_profiles/oculus/touch_controller"); + set.add("/interaction_profiles/htc/vive_controller"); + set.add("/interaction_profiles/valve/index_controller"); + set.add("/interaction_profiles/microsoft/motion_controller"); + return set; + } + + public static BindingProfile getDefaultBinding(String Headset) throws FileNotFoundException { + switch (Headset) { + case "/interaction_profiles/htc/vive_cosmos_controller" -> { + return GSON.fromJson(FileUtils.loadAssetToString("input/cosmos_defaults.json", true), BindingProfile.class); + } + case "/interaction_profiles/htc/vive_controller" -> { + return GSON.fromJson(FileUtils.loadAssetToString("input/vive_defaults.json", true), BindingProfile.class); + } + case "/interaction_profiles/valve/index_controller" -> { + return GSON.fromJson(FileUtils.loadAssetToString("input/knuckles_defaults.json", true), BindingProfile.class); + } + case "/interaction_profiles/oculus/touch_controller" -> { + return GSON.fromJson(FileUtils.loadAssetToString("input/oculus_defaults.json", true), BindingProfile.class); + } + case "/interaction_profiles/bytedance/pico4_controller" -> { + return GSON.fromJson(FileUtils.loadAssetToString("input/pico4_defaults.json", true), BindingProfile.class); + } + case "/interaction_profiles/bytedance/pico_neo3_controller" -> { + return GSON.fromJson(FileUtils.loadAssetToString("input/pico_neo3_defaults.json", true), BindingProfile.class); + } + case "/interaction_profiles/microsoft/motion_controller" -> { + return GSON.fromJson(FileUtils.loadAssetToString("input/wmr_defaults.json", true), BindingProfile.class); + } + default -> { + return GSON.fromJson(FileUtils.loadAssetToString("input/simple_defaults.json", true), BindingProfile.class); + } + } + } +} diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/control/Chord.java b/common/src/main/java/org/vivecraft/client_vr/provider/control/Chord.java new file mode 100644 index 000000000..c0865333e --- /dev/null +++ b/common/src/main/java/org/vivecraft/client_vr/provider/control/Chord.java @@ -0,0 +1,6 @@ +package org.vivecraft.client_vr.provider.control; + + +import java.util.List; + +public record Chord(List inputs, String output) {} diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/control/ControllerPaths.java b/common/src/main/java/org/vivecraft/client_vr/provider/control/ControllerPaths.java new file mode 100644 index 000000000..3174bf4e6 --- /dev/null +++ b/common/src/main/java/org/vivecraft/client_vr/provider/control/ControllerPaths.java @@ -0,0 +1,3 @@ +package org.vivecraft.client_vr.provider.control; + +public record ControllerPaths(String openvr, String openxr) {} diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/control/Haptic.java b/common/src/main/java/org/vivecraft/client_vr/provider/control/Haptic.java new file mode 100644 index 000000000..d79de9080 --- /dev/null +++ b/common/src/main/java/org/vivecraft/client_vr/provider/control/Haptic.java @@ -0,0 +1,3 @@ +package org.vivecraft.client_vr.provider.control; + +public record Haptic(String output, String path) {} diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/control/Pose.java b/common/src/main/java/org/vivecraft/client_vr/provider/control/Pose.java new file mode 100644 index 000000000..1c7d192d9 --- /dev/null +++ b/common/src/main/java/org/vivecraft/client_vr/provider/control/Pose.java @@ -0,0 +1,3 @@ +package org.vivecraft.client_vr.provider.control; + +public record Pose(String output, String path) {} diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/control/Source.java b/common/src/main/java/org/vivecraft/client_vr/provider/control/Source.java new file mode 100644 index 000000000..41f6cb4a5 --- /dev/null +++ b/common/src/main/java/org/vivecraft/client_vr/provider/control/Source.java @@ -0,0 +1,23 @@ +package org.vivecraft.client_vr.provider.control; + +import java.util.List; +import java.util.Map; + +public record Source(List inputs, Map parameters, String path) { + //TODO: this is a bit of a hack, but it allows us to reuse the same input system for both OpenVR and OpenXR. We should probably refactor this at some point to be more elegant. + //TODO: Finish changing to OpenVR + public String getOpenVRPath(String type) { + String xrPath = path; + if (path.contains("thumbstick")) xrPath = path.replace("thumbstick", "joystick"); + if (path.contains("menu")) xrPath = path.replace("menu", "application_menu"); + if (path.contains("shoulder")) xrPath = path.replace("shoulder", "bumper"); + if (path.contains("squeeze")) xrPath = path.replace("squeeze", "grab"); + + return switch (type) { + case "click", "touch" -> xrPath + "/" + type; + case "scroll", "long", "position", "pull" -> xrPath; + case "grab" -> xrPath + "/" + "click"; + default -> xrPath; + }; + } +} diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/control/VRInputActionSet.java b/common/src/main/java/org/vivecraft/client_vr/provider/control/VRInputActionSet.java index 93fd71235..550133134 100644 --- a/common/src/main/java/org/vivecraft/client_vr/provider/control/VRInputActionSet.java +++ b/common/src/main/java/org/vivecraft/client_vr/provider/control/VRInputActionSet.java @@ -55,4 +55,13 @@ public static VRInputActionSet fromKeyBinding(KeyMapping keyBinding) { default -> VivecraftVRMod.INSTANCE.isModBinding(keyBinding) ? MOD : INGAME; }; } + + public static VRInputActionSet getByName(String name) { + for (VRInputActionSet set : values()) { + if (set.name.equals(name)) { + return set; + } + } + return null; + } } diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/openvr_lwjgl/MCOpenVR.java b/common/src/main/java/org/vivecraft/client_vr/provider/openvr_lwjgl/MCOpenVR.java index c278063c6..6211f63ca 100644 --- a/common/src/main/java/org/vivecraft/client_vr/provider/openvr_lwjgl/MCOpenVR.java +++ b/common/src/main/java/org/vivecraft/client_vr/provider/openvr_lwjgl/MCOpenVR.java @@ -696,10 +696,10 @@ private void generateActionManifest() { // write action manifest to disk try { - (new File("openvr/input")).mkdirs(); + (new File("input/profiles")).mkdirs(); try (OutputStreamWriter outputstreamwriter = new OutputStreamWriter( - new FileOutputStream("openvr/input/action_manifest.json"), StandardCharsets.UTF_8)) + new FileOutputStream("input/action_manifest.json"), StandardCharsets.UTF_8)) { this.GSON.toJson(map, outputstreamwriter); } @@ -710,14 +710,14 @@ private void generateActionManifest() { // write defaults to disk String rev = this.dh.vrSettings.reverseHands ? "_reversed" : ""; // controllers - FileUtils.unpackAsset("input/vive_defaults" + rev + ".json", "openvr/input/vive_defaults.json", false); - FileUtils.unpackAsset("input/oculus_defaults" + rev + ".json", "openvr/input/oculus_defaults.json", false); - FileUtils.unpackAsset("input/wmr_defaults" + rev + ".json", "openvr/input/wmr_defaults.json", false); - FileUtils.unpackAsset("input/knuckles_defaults" + rev + ".json", "openvr/input/knuckles_defaults.json", false); - FileUtils.unpackAsset("input/cosmos_defaults" + rev + ".json", "openvr/input/cosmos_defaults.json", false); + FileUtils.unpackAsset("input/vive_defaults" + rev + ".json", "input/profiles/vive_defaults.json", false); + FileUtils.unpackAsset("input/oculus_defaults" + rev + ".json", "input/profiles/oculus_defaults.json", false); + FileUtils.unpackAsset("input/wmr_defaults" + rev + ".json", "input/profiles/wmr_defaults.json", false); + FileUtils.unpackAsset("input/knuckles_defaults" + rev + ".json", "input/profiles/knuckles_defaults.json", false); + FileUtils.unpackAsset("input/cosmos_defaults" + rev + ".json", "input/profiles/cosmos_defaults.json", false); // camera tracker - FileUtils.unpackAssetToFolder("input/tracker_defaults.json", "openvr", false); + FileUtils.unpackAsset("input/tracker_defaults.json", "input/profiles/tracker_defaults.json", false); } /** @@ -1070,7 +1070,7 @@ private void checkPathValid(String path, String knownError, boolean alwaysThrow) */ private void installApplicationManifest(boolean force) throws RenderConfigException { File manifestFile = new File("openvr/vivecraft.vrmanifest"); - FileUtils.unpackAssetToFolder("vivecraft.vrmanifest", "openvr", true); + FileUtils.unpackAsset("vivecraft.vrmanifest", "openvr/vivecraft.vrmanifest", true); File customFile = new File("openvr/custom.vrmanifest"); if (customFile.exists()) { @@ -1189,7 +1189,7 @@ private void loadActionHandles() { * @throws RenderConfigException if OpenVR throws any error, or the path is invalid */ private void loadActionManifest() throws RenderConfigException { - String actionsPath = new File("openvr/input/action_manifest.json").getAbsolutePath(); + String actionsPath = new File("input/action_manifest.json").getAbsolutePath(); // check if path is valid for steamvr, since it would just silently fail checkPathValid(actionsPath, "Failed to install action manifest", false); int error = VRInput_SetActionManifestPath(actionsPath); @@ -1543,7 +1543,7 @@ public ControllerType getOriginControllerType(long inputValueHandle) { */ private void readNewData(VRInputAction action) { switch (action.type) { - case BOOLEAN, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> { + case PRESS, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> { if (action.isHanded()) { for (ControllerType type : ControllerType.values()) { this.readDigitalData(action, type); diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/openvr_lwjgl/control/VRInputAction.java b/common/src/main/java/org/vivecraft/client_vr/provider/openvr_lwjgl/control/VRInputAction.java index 6ea9c698e..23526cff3 100644 --- a/common/src/main/java/org/vivecraft/client_vr/provider/openvr_lwjgl/control/VRInputAction.java +++ b/common/src/main/java/org/vivecraft/client_vr/provider/openvr_lwjgl/control/VRInputAction.java @@ -30,7 +30,7 @@ public VRInputAction( @Override public boolean isButtonPressed() { - if (this.type == ActionType.BOOLEAN) { + if (this.type == ActionType.PRESS) { return this.digitalData().state; } else { Vector3fc axis = this.getAxis3D(false); @@ -40,7 +40,7 @@ public boolean isButtonPressed() { @Override public boolean isButtonChanged() { - if (this.type == ActionType.BOOLEAN) { + if (this.type == ActionType.PRESS) { return this.digitalData().isChanged; } else { Vector3fc axis = this.getAxis3D(false); @@ -54,7 +54,7 @@ public boolean isButtonChanged() { @Override public float getAxis1D(boolean delta) { return switch (this.type) { - case BOOLEAN, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> this.digitalToAnalog(delta); + case PRESS, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> this.digitalToAnalog(delta); case VEC1, VEC2 -> delta ? this.analogData().deltaX : this.analogData().x; default -> 0.0F; }; @@ -63,7 +63,7 @@ public float getAxis1D(boolean delta) { @Override public Vector2fc getAxis2D(boolean delta) { return switch (this.type) { - case BOOLEAN, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> new Vector2f(this.digitalToAnalog(delta), 0.0F); + case PRESS, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> new Vector2f(this.digitalToAnalog(delta), 0.0F); case VEC1 -> delta ? new Vector2f(this.analogData().deltaX, 0.0F) : new Vector2f(this.analogData().x, 0.0F); case VEC2 -> delta ? new Vector2f(this.analogData().deltaX, this.analogData().deltaY) : new Vector2f(this.analogData().x, this.analogData().y); @@ -74,7 +74,7 @@ public Vector2fc getAxis2D(boolean delta) { //TODO remove public Vector3fc getAxis3D(boolean delta) { return switch (this.type) { - case BOOLEAN, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> + case PRESS, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> new Vector3f(this.digitalToAnalog(delta), 0.0F, 0.0F); case VEC1 -> delta ? new Vector3f(this.analogData().deltaX, 0.0F, 0.0F) : new Vector3f(this.analogData().x, 0.0F, 0.0F); @@ -137,7 +137,7 @@ private float digitalToAnalog(boolean delta) { @Override public long getLastOrigin() { return switch (this.type) { - case BOOLEAN, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> this.digitalData().activeOrigin; + case PRESS, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> this.digitalData().activeOrigin; case VEC1, VEC2 -> this.analogData().activeOrigin; default -> 0L; }; @@ -162,7 +162,7 @@ public void setHandle(long handle) { @Override public boolean isActive() { return switch (this.type) { - case BOOLEAN, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> this.digitalData().isActive; + case PRESS, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> this.digitalData().isActive; case VEC1, VEC2 -> this.analogData().isActive; default -> false; }; diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/openxr/MCOpenXR.java b/common/src/main/java/org/vivecraft/client_vr/provider/openxr/MCOpenXR.java index 6cff951be..a5124a683 100644 --- a/common/src/main/java/org/vivecraft/client_vr/provider/openxr/MCOpenXR.java +++ b/common/src/main/java/org/vivecraft/client_vr/provider/openxr/MCOpenXR.java @@ -3,8 +3,10 @@ import com.google.common.collect.HashBiMap; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; +import net.minecraft.util.Mth; import net.minecraft.util.profiling.Profiler; import org.joml.Matrix4f; +import org.joml.Matrix4fc; import org.joml.Vector2f; import org.joml.Vector3f; import org.lwjgl.PointerBuffer; @@ -23,15 +25,15 @@ import org.vivecraft.client_vr.gameplay.screenhandlers.RadialHandler; import org.vivecraft.client_vr.provider.MCVR; import org.vivecraft.client_vr.provider.VRRenderer; -import org.vivecraft.client_vr.provider.control.ActionType; -import org.vivecraft.client_vr.provider.control.ControllerType; -import org.vivecraft.client_vr.provider.control.InputAction; -import org.vivecraft.client_vr.provider.control.VRInputActionSet; +import org.vivecraft.client_vr.provider.control.*; +import org.vivecraft.client_vr.provider.control.BindingProfile; import org.vivecraft.client_vr.provider.openxr.control.ControllerMapping; -import org.vivecraft.client_vr.provider.openxr.control.XRBinding; import org.vivecraft.client_vr.provider.openxr.control.XRInputAction; import org.vivecraft.client_vr.settings.VRSettings; +import org.vivecraft.common.utils.MathUtils; +import oshi.util.tuples.Pair; +import java.io.FileNotFoundException; import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; @@ -319,6 +321,22 @@ private void updatePose() { } } + if(this.controllerTracking[RIGHT_CONTROLLER]) { + Matrix4fc tip = this.controllerRotation[RIGHT_CONTROLLER]; + Matrix4fc hand = this.handRotation[RIGHT_CONTROLLER]; + + Vector3f tipVec = tip.transformDirection(MathUtils.BACK, new Vector3f()); + Vector3f handVec = hand.transformDirection(MathUtils.BACK, new Vector3f()); + + float dot = Math.abs(tipVec.dot(handVec)); + + float angleRad = (float) Math.acos(dot); + float angleDeg = Mth.RAD_TO_DEG * angleRad; + + this.gunStyle = angleDeg > 10.0F; + this.gunAngle = angleDeg; + } + this.updateAim(); } } @@ -334,7 +352,7 @@ public void readNewData(XRInputAction action) { continue; } switch (handedAction.action()) { - case BOOLEAN, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> + case PRESS, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> this.readBoolean(action, handedAction.hand(), i); case VEC1 -> this.readFloat(action, handedAction.hand(), i); @@ -823,11 +841,7 @@ private void initializeOpenXRSession() { logError(error, "xrCreateSession", ""); this.session = new XrSession(sessionPtr.get(0), this.instance); - - while (!this.isActive) { - VRSettings.LOGGER.info("Vivecraft: waiting for OpenXR session to start"); - pollVREvents(); - } + while (!this.isActive) {pollVREvents();} } } @@ -886,20 +900,26 @@ private void initializeOpenXRSwapChain() { error = XR10.xrEnumerateSwapchainFormats(this.session, intBuf, swapchainFormats); logError(error, "xrEnumerateSwapchainFormats", "get formats"); - long[] desiredSwapchainFormats = { - // SRGB formats - GL21.GL_SRGB8_ALPHA8, - GL21.GL_SRGB8, - // others - GL11.GL_RGB10_A2, - GL30.GL_RGBA16F, - GL30.GL_RGB16F, - - // The two below should only be used as a fallback, as they are linear color formats without enough bits for color - // depth, thus leading to banding. - GL11.GL_RGBA8, - GL31.GL_RGBA8_SNORM, - }; + long[] desiredSwapchainFormats; + if (this.device.getClass() == DeviceCompat.Desktop.class) { + desiredSwapchainFormats = new long[] { + // SRGB formats + GL21.GL_SRGB8_ALPHA8, + GL21.GL_SRGB8, + // others + GL11.GL_RGB10_A2, + GL30.GL_RGBA16F, + GL30.GL_RGB16F, + + // The two below should only be used as a fallback, as they are linear color formats without enough bits for color + // depth, thus leading to banding. + GL11.GL_RGBA8, + GL31.GL_RGBA8_SNORM + }; + } else { + // Mobile runtimes tend to over-correct SRGB for some reason + desiredSwapchainFormats = new long[] {GL11.GL_RGBA8}; + } // Choose format long chosenFormat = 0; @@ -984,7 +1004,7 @@ private void initInputAndApplication() { //this.generateActionManifest(); //this.loadActionManifest(); this.loadActionHandles(); - this.loadDefaultBindings(); + this.loadBindings(); //this.installApplicationManifest(false); this.inputInitialized = true; this.initDisplayRefreshRate(); @@ -1000,6 +1020,16 @@ public boolean hasCameraTracker() { return false; } + public String getCurrentInteractionProfile() { + try (MemoryStack stack = MemoryStack.stackPush()) { + XrInteractionProfileState state = XrInteractionProfileState.calloc(stack); + state.type(XR10.XR_TYPE_INTERACTION_PROFILE_STATE); + int error = XR10.xrGetCurrentInteractionProfile(this.session, getPath("/user/hand/right"), state); + logError(error, "xrGetCurrentInteractionProfile", "right"); + return getString(state.interactionProfile()); + } + } + public List getOrigins(XRInputAction.HandedAction handedAction, XRInputAction action) { try (MemoryStack stack = MemoryStack.stackPush()) { XrBoundSourcesForActionEnumerateInfo info = XrBoundSourcesForActionEnumerateInfo.calloc(stack); @@ -1100,7 +1130,7 @@ private void loadActionHandles() { long actionSet = makeActionSet(this.instance, vrinputactionset.name, vrinputactionset.localizedName, 0); this.actionSetHandles.put(vrinputactionset, actionSet); - for (String headset : XRBinding.supportedHeadsets()) { + for (String headset : BindingProfile.supportedHeadsets()) { for (var binding : ControllerMapping.getMapping(headset).entrySet()) { long action = createAction( (binding.getKey() + "." + headset.replace("/interaction_profiles/", "")).replace("/", "."), @@ -1133,121 +1163,141 @@ private void setupControllers() { ActionType.POSE, actionSet, BOTH_HANDS[0]); } - private void loadDefaultBindings() { + private void loadBindings() { try (MemoryStack stack = MemoryStack.stackPush()) { int error; - for (String headset : XRBinding.supportedHeadsets()) { - VRSettings.LOGGER.info("loading defaults for {}", headset); -// if (!"/interaction_profiles/oculus/touch_controller".equals(headset)) { -// continue; -// } - XRBinding[] defaultBindings = XRBinding.getBinding(headset).toArray(new XRBinding[0]); - XrActionSuggestedBinding.Buffer bindings = XrActionSuggestedBinding.calloc(defaultBindings.length + 6, - stack); //TODO different way of adding controller poses - - for (int i = 0; i < defaultBindings.length; i++) { - XRBinding binding = defaultBindings[i]; - XRInputAction inputAction = this.getInputActionByName(binding.key()); - if (binding.actionSet() != null) { - //inputAction.actionSet = binding.actionSet(); //TODO? + BindingProfile bindingProfile; + if (ClientDataHolderVR.getInstance().vrSettings.currentBindingProfile != null) { + bindingProfile = BindingProfile.getCurrentProfile(); + if (bindingProfile == null) { + VRSettings.LOGGER.warn("Custom profile '{}' not found, loading defaults", ClientDataHolderVR.getInstance().vrSettings.currentBindingProfile); + } + } else { + bindingProfile = null; + } + + List profilesToLoad = new ArrayList<>(); + if (bindingProfile != null) { + profilesToLoad.add(bindingProfile); + VRSettings.LOGGER.info("Loading custom profile: {}", bindingProfile.name()); + } else { + for (String headset : BindingProfile.supportedHeadsets()) { + BindingProfile profile = BindingProfile.getDefaultBinding(headset); + if (profile != null) { + profilesToLoad.add(profile); + VRSettings.LOGGER.info("Loading default profile for {}", headset); + } else { + VRSettings.LOGGER.warn("Failed to load default profile for {}", headset); + } + } + } + + for (BindingProfile profile : profilesToLoad) { + if (profile.controller_paths() == null) continue; + String headsetPath = profile.controller_paths().openxr(); + VRSettings.LOGGER.info("Loading interaction profile: {}", profile.name()); + List> bindingList = new ArrayList<>(); + for (Map.Entry set : profile.sets().entrySet()) { + List sources = set.getValue().sources(); + for (Source source : sources) { + for (Action action : source.inputs()) { + XRInputAction inputAction = this.getInputActionByName("/actions/" + set.getKey() + "/in/" + action.action()); + if (inputAction == null) { + VRSettings.LOGGER.warn("Input action '{}' not found", "/actions/" + set.getKey() + "/in/" + action.action()); + continue; + } + + Long handle = this.mappedBindings.get(new ActionBind(inputAction.actionSet, source.path())); + if (handle == null) { + VRSettings.LOGGER.error("Cannot find button for path {}, are you sure this is the correct path?", source.path()); + continue; + } + + ActionType buttonType = ControllerMapping.getMapping(headsetPath).get(source.path()); + inputAction.addHandle( + headsetPath, + handle, + source.path().contains("/left/") ? ControllerType.LEFT : ControllerType.RIGHT, + buttonType + ); + + inputAction.setType(action.type()); + if (inputAction.getHandle(headsetPath).isEmpty() || handle == 0L) { + VRSettings.LOGGER.error("Handle for '{}'/'{}' is null", "/actions/" + set.getKey() + "/in/" + action.action(), source.path()); + continue; + } + + // TODO support multiple bindings per action + bindingList.add(new Pair<>( + new XrAction(handle, new XrActionSet(this.actionSetHandles.get(inputAction.actionSet), this.instance)), + getPath(source.path()) + )); + } } - long handle = this.mappedBindings.get(new ActionBind(inputAction.actionSet, binding.controller())); - ActionType type = ControllerMapping.getMapping(headset).get(binding.controller()); - inputAction.addHandle(headset, handle, - binding.controller().contains("/left/") ? ControllerType.LEFT : - ControllerType.RIGHT, type); - inputAction.setType(binding.actionType()); - if (inputAction.getHandle(headset).isEmpty() || handle == 0L) { - VRSettings.LOGGER.error("Handle for '{}'/'{}' is null", binding.key(), binding.controller()); - continue; + + XrActionSet actionSet = new XrActionSet(this.actionSetHandles.get(VRInputActionSet.getByName("/actions/" + set.getKey())), this.instance); + String[] hands = {"/user/hand/right", "/user/hand/left"}; + long[] poses = {this.grip[RIGHT_CONTROLLER], this.grip[LEFT_CONTROLLER], this.aim[RIGHT_CONTROLLER], this.aim[LEFT_CONTROLLER]}; + long[] haptics = {this.haptics[RIGHT_CONTROLLER], this.haptics[LEFT_CONTROLLER]}; + String[] posePaths = {"/input/grip/pose", "/input/grip/pose", "/input/aim/pose", "/input/aim/pose"}; + String[] hapticPaths = {"/output/haptic", "/output/haptic"}; + + for (int j = 0; j < poses.length; j++) { + bindingList.add(new Pair<>(new XrAction(poses[j], actionSet), getPath(hands[j % 2] + posePaths[j]))); + } + + for (int j = 0; j < haptics.length; j++) { + bindingList.add(new Pair<>(new XrAction(haptics[j], actionSet), getPath(hands[j] + hapticPaths[j]))); } - bindings.get(i).set( - new XrAction(handle, - new XrActionSet(this.actionSetHandles.get(inputAction.actionSet), this.instance)), - getPath(binding.controller()) - ); } - //TODO make this also changeable? - XrActionSet actionSet = new XrActionSet(this.actionSetHandles.get(VRInputActionSet.GLOBAL), - this.instance); - bindings.get(defaultBindings.length).set( - new XrAction(this.grip[RIGHT_CONTROLLER], actionSet), - getPath("/user/hand/right/input/grip/pose") - ); - bindings.get(defaultBindings.length + 1).set( - new XrAction(this.grip[LEFT_CONTROLLER], actionSet), - getPath("/user/hand/left/input/grip/pose") - ); - bindings.get(defaultBindings.length + 2).set( - new XrAction(this.aim[RIGHT_CONTROLLER], actionSet), - getPath("/user/hand/right/input/aim/pose") - ); - bindings.get(defaultBindings.length + 3).set( - new XrAction(this.aim[LEFT_CONTROLLER], actionSet), - getPath("/user/hand/left/input/aim/pose") - ); - - bindings.get(defaultBindings.length + 4).set( - new XrAction(this.haptics[RIGHT_CONTROLLER], actionSet), - getPath("/user/hand/right/output/haptic") - ); - - bindings.get(defaultBindings.length + 5).set( - new XrAction(this.haptics[LEFT_CONTROLLER], actionSet), - getPath("/user/hand/left/output/haptic") - ); - - XrInteractionProfileSuggestedBinding suggested_binds = XrInteractionProfileSuggestedBinding.calloc( - stack); + XrActionSuggestedBinding.Buffer bindings = XrActionSuggestedBinding.calloc(bindingList.size(), stack); + for (int i = 0; i < bindingList.size(); i++) { + Pair binding = bindingList.get(i); + bindings.get(i).set(binding.getA(), binding.getB()); + } + + XrInteractionProfileSuggestedBinding suggested_binds = XrInteractionProfileSuggestedBinding.calloc(stack); suggested_binds.type(XR10.XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING); suggested_binds.next(NULL); - suggested_binds.interactionProfile(getPath(headset)); + suggested_binds.interactionProfile(getPath(headsetPath)); suggested_binds.suggestedBindings(bindings); error = XR10.xrSuggestInteractionProfileBindings(this.instance, suggested_binds); - logError(error, "xrSuggestInteractionProfileBindings", headset); + logError(error, "xrSuggestInteractionProfileBindings", profile.name()); } - XrSessionActionSetsAttachInfo attach_info = XrSessionActionSetsAttachInfo.calloc(stack); attach_info.type(XR10.XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO); attach_info.next(NULL); - attach_info.actionSets( - stackPointers(this.actionSetHandles.values().stream().mapToLong(value -> value).toArray())); + attach_info.actionSets(stackPointers(this.actionSetHandles.values().stream().mapToLong(value -> value).toArray())); error = XR10.xrAttachSessionActionSets(this.session, attach_info); logError(error, "xrAttachSessionActionSets", ""); - XrActionSet actionSet = new XrActionSet(this.actionSetHandles.get(VRInputActionSet.GLOBAL), this.instance); + XrActionSet globalActionSet = new XrActionSet(this.actionSetHandles.get(VRInputActionSet.GLOBAL), this.instance); XrActionSpaceCreateInfo actionSpace = XrActionSpaceCreateInfo.calloc(stack); actionSpace.type(XR10.XR_TYPE_ACTION_SPACE_CREATE_INFO); actionSpace.next(NULL); - actionSpace.action(new XrAction(this.grip[RIGHT_CONTROLLER], actionSet)); - actionSpace.subactionPath(getPath("/user/hand/right")); - actionSpace.poseInActionSpace(POSE_IDENTITY); PointerBuffer pp = stackCallocPointer(1); - error = XR10.xrCreateActionSpace(this.session, actionSpace, pp); - logError(error, "xrCreateActionSpace", "grip: /user/hand/right"); - this.gripSpace[RIGHT_CONTROLLER] = new XrSpace(pp.get(0), this.session); - - actionSpace.action(new XrAction(this.grip[LEFT_CONTROLLER], actionSet)); - actionSpace.subactionPath(getPath("/user/hand/left")); - error = XR10.xrCreateActionSpace(this.session, actionSpace, pp); - logError(error, "xrCreateActionSpace", "grip: /user/hand/left"); - this.gripSpace[LEFT_CONTROLLER] = new XrSpace(pp.get(0), this.session); - - actionSpace.action(new XrAction(this.aim[RIGHT_CONTROLLER], actionSet)); - actionSpace.subactionPath(getPath("/user/hand/right")); - error = XR10.xrCreateActionSpace(session, actionSpace, pp); - logError(error, "xrCreateActionSpace", "aim: /user/hand/right"); - this.aimSpace[RIGHT_CONTROLLER] = new XrSpace(pp.get(0), this.session); - - actionSpace.action(new XrAction(this.aim[LEFT_CONTROLLER], actionSet)); - actionSpace.subactionPath(getPath("/user/hand/left")); - error = XR10.xrCreateActionSpace(this.session, actionSpace, pp); - logError(error, "xrCreateActionSpace", "aim: /user/hand/left"); - this.aimSpace[LEFT_CONTROLLER] = new XrSpace(pp.get(0), this.session); + + long[] allPoses = {this.grip[RIGHT_CONTROLLER], this.grip[LEFT_CONTROLLER], this.aim[RIGHT_CONTROLLER], this.aim[LEFT_CONTROLLER]}; + for (int i = 0; i < allPoses.length; i++) { + String hand = (i % 2 == 0) ? "/user/hand/right" : "/user/hand/left"; + actionSpace.action(new XrAction(allPoses[i], globalActionSet)); + actionSpace.subactionPath(getPath(hand)); + actionSpace.poseInActionSpace(POSE_IDENTITY); + + error = XR10.xrCreateActionSpace(this.session, actionSpace, pp); + logError(error, "xrCreateActionSpace", allPoses[i] == this.grip[RIGHT_CONTROLLER] ? "grip: " + hand : "aim: " + hand); + + if (i == 0) this.gripSpace[RIGHT_CONTROLLER] = new XrSpace(pp.get(0), this.session); + else if (i == 1) this.gripSpace[LEFT_CONTROLLER] = new XrSpace(pp.get(0), this.session); + else if (i == 2) this.aimSpace[RIGHT_CONTROLLER] = new XrSpace(pp.get(0), this.session); + else this.aimSpace[LEFT_CONTROLLER] = new XrSpace(pp.get(0), this.session); + } + } catch (FileNotFoundException e) { + throw new RuntimeException("Binding profile file not found: " + e.getMessage(), e); } } @@ -1293,7 +1343,7 @@ private long createAction( hands.next(NULL); hands.actionName(memUTF8(s)); switch (type) { - case BOOLEAN, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> + case PRESS, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> hands.actionType(XR10.XR_ACTION_TYPE_BOOLEAN_INPUT); case VEC1 -> hands.actionType(XR10.XR_ACTION_TYPE_FLOAT_INPUT); case VEC2 -> hands.actionType(XR10.XR_ACTION_TYPE_VECTOR2F_INPUT); diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/openxr/control/ControllerMapping.java b/common/src/main/java/org/vivecraft/client_vr/provider/openxr/control/ControllerMapping.java index 3cb9486a8..f8c8fde36 100644 --- a/common/src/main/java/org/vivecraft/client_vr/provider/openxr/control/ControllerMapping.java +++ b/common/src/main/java/org/vivecraft/client_vr/provider/openxr/control/ControllerMapping.java @@ -1,223 +1,42 @@ package org.vivecraft.client_vr.provider.openxr.control; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import org.vivecraft.client.utils.FileUtils; import org.vivecraft.client_vr.provider.control.ActionType; -import java.util.HashMap; import java.util.Map; public class ControllerMapping { - - public static Map quest2Bindings() { - Map bindings = new HashMap<>(); - - bindings.put("/user/hand/left/input/y/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/y/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/x/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/x/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/menu/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/squeeze/value", ActionType.VEC1); - bindings.put("/user/hand/left/input/trigger/value", ActionType.VEC1); - bindings.put("/user/hand/left/input/trigger/touch", ActionType.BOOLEAN); - //bindings.put("/user/hand/left/input/trigger/proximity", ActionType.BOOLEAN); openxr 1.1 - //bindings.put("/user/hand/left/input/thumb_resting_surfaces/proximity", ActionType.BOOLEAN); openxr 1.1 - bindings.put("/user/hand/left/input/thumbstick", ActionType.VEC2); - bindings.put("/user/hand/left/input/thumbstick/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/thumbstick/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/thumbstick/y", ActionType.VEC1); - bindings.put("/user/hand/left/input/thumbstick/x", ActionType.VEC1); - bindings.put("/user/hand/left/input/thumbrest/touch", ActionType.BOOLEAN); - - bindings.put("/user/hand/right/input/a/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/a/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/b/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/b/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/system/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/squeeze/value", ActionType.VEC1); - bindings.put("/user/hand/right/input/trigger/value", ActionType.VEC1); - bindings.put("/user/hand/right/input/trigger/touch", ActionType.BOOLEAN); - //bindings.put("/user/hand/right/input/trigger/proximity", ActionType.BOOLEAN); openxr 1.1 - //bindings.put("/user/hand/right/input/thumb_resting_surfaces/proximity", ActionType.BOOLEAN); openxr 1.1 - bindings.put("/user/hand/right/input/thumbstick", ActionType.VEC2); - bindings.put("/user/hand/right/input/thumbstick/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/thumbstick/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/thumbstick/y", ActionType.VEC1); - bindings.put("/user/hand/right/input/thumbstick/x", ActionType.VEC1); - bindings.put("/user/hand/right/input/thumbrest/touch", ActionType.BOOLEAN); - return bindings; - } - - public static Map cosmosBindings() { - Map bindings = new HashMap<>(); - bindings.put("/user/hand/left/input/y/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/x/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/menu/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/squeeze/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/trigger/value", ActionType.VEC1); - bindings.put("/user/hand/left/input/trigger/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/thumbstick", ActionType.VEC2); - bindings.put("/user/hand/left/input/thumbstick/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/thumbstick/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/thumbstick/y", ActionType.VEC1); - bindings.put("/user/hand/left/input/thumbstick/x", ActionType.VEC1); - bindings.put("/user/hand/left/input/shoulder/click", ActionType.BOOLEAN); - - bindings.put("/user/hand/right/input/a/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/b/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/system/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/squeeze/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/trigger/value", ActionType.VEC1); - bindings.put("/user/hand/right/input/trigger/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/thumbstick", ActionType.VEC2); - bindings.put("/user/hand/right/input/thumbstick/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/thumbstick/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/thumbstick/y", ActionType.VEC1); - bindings.put("/user/hand/right/input/thumbstick/x", ActionType.VEC1); - bindings.put("/user/hand/right/input/shoulder/click", ActionType.BOOLEAN); - return bindings; - } - - public static Map viveBindings() { - Map bindings = new HashMap<>(); - bindings.put("/user/hand/left/input/menu/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/system/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/trigger/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/trigger/value", ActionType.VEC1); - bindings.put("/user/hand/left/input/trackpad", ActionType.VEC2); - bindings.put("/user/hand/left/input/trackpad/x", ActionType.VEC1); - bindings.put("/user/hand/left/input/trackpad/y", ActionType.VEC1); - bindings.put("/user/hand/left/input/trackpad/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/trackpad/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/squeeze/click", ActionType.BOOLEAN); - - bindings.put("/user/hand/right/input/menu/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/system/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/trigger/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/trigger/value", ActionType.VEC1); - bindings.put("/user/hand/right/input/trackpad", ActionType.VEC2); - bindings.put("/user/hand/right/input/trackpad/x", ActionType.VEC1); - bindings.put("/user/hand/right/input/trackpad/y", ActionType.VEC1); - bindings.put("/user/hand/right/input/trackpad/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/trackpad/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/squeeze/click", ActionType.BOOLEAN); - return bindings; - } - - public static Map indexBindings() { - Map bindings = new HashMap<>(); - bindings.put("/user/hand/left/input/a/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/a/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/b/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/b/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/system/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/system/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/trigger/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/trigger/value", ActionType.VEC1); - bindings.put("/user/hand/left/input/trigger/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/thumbstick", ActionType.VEC2); - bindings.put("/user/hand/left/input/thumbstick/x", ActionType.VEC1); - bindings.put("/user/hand/left/input/thumbstick/y", ActionType.VEC1); - bindings.put("/user/hand/left/input/thumbstick/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/thumbstick/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/trackpad", ActionType.VEC2); - bindings.put("/user/hand/left/input/trackpad/x", ActionType.VEC1); - bindings.put("/user/hand/left/input/trackpad/y", ActionType.VEC1); - bindings.put("/user/hand/left/input/trackpad/force", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/trackpad/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/squeeze/force", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/squeeze/value", ActionType.VEC1); - - bindings.put("/user/hand/right/input/a/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/a/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/b/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/b/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/system/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/system/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/trigger/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/trigger/value", ActionType.VEC1); - bindings.put("/user/hand/right/input/trigger/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/thumbstick", ActionType.VEC2); - bindings.put("/user/hand/right/input/thumbstick/x", ActionType.VEC1); - bindings.put("/user/hand/right/input/thumbstick/y", ActionType.VEC1); - bindings.put("/user/hand/right/input/thumbstick/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/thumbstick/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/trackpad", ActionType.VEC2); - bindings.put("/user/hand/right/input/trackpad/x", ActionType.VEC1); - bindings.put("/user/hand/right/input/trackpad/y", ActionType.VEC1); - bindings.put("/user/hand/right/input/trackpad/force", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/trackpad/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/squeeze/force", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/squeeze/value", ActionType.VEC1); - return bindings; - } - - public static Map picoBindings() { - Map bindings = new HashMap<>(); - bindings.put("/user/hand/left/input/x/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/x/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/y/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/y/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/menu/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/system/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/trigger/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/trigger/value", ActionType.VEC1); - bindings.put("/user/hand/left/input/trigger/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/thumbstick", ActionType.VEC2); - bindings.put("/user/hand/left/input/thumbstick/x", ActionType.VEC1); - bindings.put("/user/hand/left/input/thumbstick/y", ActionType.VEC1); - bindings.put("/user/hand/left/input/thumbstick/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/thumbstick/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/squeeze/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/squeeze/value", ActionType.VEC1); - - bindings.put("/user/hand/right/input/a/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/a/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/b/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/b/touch", ActionType.BOOLEAN); - //bindings.put("/user/hand/right/input/menu/click", ActionType.BOOLEAN); //not present on pico4, is present on neo3 - bindings.put("/user/hand/right/input/system/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/trigger/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/trigger/value", ActionType.VEC1); - bindings.put("/user/hand/right/input/trigger/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/thumbstick", ActionType.VEC2); - bindings.put("/user/hand/right/input/thumbstick/x", ActionType.VEC1); - bindings.put("/user/hand/right/input/thumbstick/y", ActionType.VEC1); - bindings.put("/user/hand/right/input/thumbstick/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/thumbstick/touch", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/squeeze/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/squeeze/value", ActionType.VEC1); - return bindings; - } - - public static Map defaultBindings() { - Map bindings = new HashMap<>(); - bindings.put("/user/hand/left/input/menu/click", ActionType.BOOLEAN); - bindings.put("/user/hand/left/input/select/click", ActionType.BOOLEAN); - - bindings.put("/user/hand/right/input/menu/click", ActionType.BOOLEAN); - bindings.put("/user/hand/right/input/select/click", ActionType.BOOLEAN); - return bindings; - } + public static Gson GSON = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create(); public static Map getMapping(String Headset) { switch (Headset) { case "/interaction_profiles/htc/vive_cosmos_controller" -> { - return cosmosBindings(); + return GSON.fromJson(FileUtils.loadAssetToString("input/mappings/vive_cosmos_controller.json", true), + TypeToken.getParameterized(Map.class, String.class, ActionType.class).getType()); } case "/interaction_profiles/htc/vive_controller" -> { - return viveBindings(); + return GSON.fromJson(FileUtils.loadAssetToString("input/mappings/vive_controller.json", true), + TypeToken.getParameterized(Map.class, String.class, ActionType.class).getType()); } case "/interaction_profiles/valve/index_controller" -> { - return indexBindings(); + return GSON.fromJson(FileUtils.loadAssetToString("input/mappings/index_controller.json", true), + TypeToken.getParameterized(Map.class, String.class, ActionType.class).getType()); } case "/interaction_profiles/oculus/touch_controller" -> { - return quest2Bindings(); + return GSON.fromJson(FileUtils.loadAssetToString("input/mappings/touch_controller.json", true), + TypeToken.getParameterized(Map.class, String.class, ActionType.class).getType()); } case "/interaction_profiles/bytedance/pico4_controller", "/interaction_profiles/bytedance/pico_neo3_controller" -> { - return picoBindings(); + return GSON.fromJson(FileUtils.loadAssetToString("input/mappings/pico_controller.json", true), + TypeToken.getParameterized(Map.class, String.class, ActionType.class).getType()); } default -> { - return defaultBindings(); + return GSON.fromJson(FileUtils.loadAssetToString("input/mappings/simple_controller.json", true), + TypeToken.getParameterized(Map.class, String.class, ActionType.class).getType()); } } } diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/openxr/control/XRBinding.java b/common/src/main/java/org/vivecraft/client_vr/provider/openxr/control/XRBinding.java deleted file mode 100644 index def89eee1..000000000 --- a/common/src/main/java/org/vivecraft/client_vr/provider/openxr/control/XRBinding.java +++ /dev/null @@ -1,483 +0,0 @@ -package org.vivecraft.client_vr.provider.openxr.control; - -import org.jetbrains.annotations.Nullable; -import org.vivecraft.client_vr.provider.control.ActionType; -import org.vivecraft.client_vr.provider.control.VRInputActionSet; -import org.vivecraft.client_vr.provider.openxr.MCOpenXR; - -import java.util.HashSet; - -public record XRBinding(@Nullable VRInputActionSet actionSet, String key, String controller, ActionType actionType) { - - public static HashSet supportedHeadsets() { - HashSet set = new HashSet<>(); - if (MCOpenXR.get().session.getCapabilities().XR_HTC_vive_cosmos_controller_interaction) { - set.add("/interaction_profiles/htc/vive_cosmos_controller"); - } - - if (MCOpenXR.get().session.getCapabilities().XR_BD_controller_interaction) { - set.add("/interaction_profiles/bytedance/pico4_controller"); - set.add("/interaction_profiles/bytedance/pico_neo3_controller"); - } - - set.add("/interaction_profiles/khr/simple_controller"); - set.add("/interaction_profiles/oculus/touch_controller"); - set.add("/interaction_profiles/htc/vive_controller"); - set.add("/interaction_profiles/valve/index_controller"); - return set; - } - - private static HashSet quest2Bindings() { - HashSet set = new HashSet<>(); - - set.add( - new XRBinding(null, "/actions/global/in/vivecraft.key.ingameMenuButton", "/user/hand/left/input/y/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/global/in/key.inventory", "/user/hand/left/input/x/click", - ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiShift", "/user/hand/left/input/squeeze/value", - ActionType.VEC1)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiMiddleClick", "/user/hand/right/input/squeeze/value", - ActionType.VEC1)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiLeftClick", "/user/hand/right/input/trigger/value", - ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiRightClick", "/user/hand/right/input/a/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiScrollAxis", "/user/hand/right/input/thumbstick/y", - ActionType.VEC1)); - - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.hotbarPrev", "/user/hand/left/input/squeeze/value", - ActionType.VEC1)); - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.hotbarNext", "/user/hand/right/input/squeeze/value", - ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/ingame/in/key.attack", "/user/hand/right/input/trigger/value", - ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.teleport", "/user/hand/left/input/trigger/value", - ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.radialMenu", "/user/hand/right/input/b/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/ingame/in/key.use", "/user/hand/right/input/a/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.teleportFallback", - "/user/hand/left/input/trigger/value", ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/ingame/in/key.jump", "/user/hand/left/input/thumbstick/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.freeMoveStrafe", "/user/hand/left/input/thumbstick", - ActionType.VEC2)); - set.add(new XRBinding(null, "/actions/ingame/in/key.sneak", "/user/hand/right/input/thumbstick/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.rotateAxis", "/user/hand/right/input/thumbstick", - ActionType.VEC2)); - - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardShift", - "/user/hand/left/input/squeeze/value", ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardShift", - "/user/hand/right/input/squeeze/value", ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardClick", - "/user/hand/left/input/trigger/value", ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardClick", - "/user/hand/right/input/trigger/value", ActionType.VEC1)); - - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/left/input/squeeze/value", ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/right/input/squeeze/value", ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/left/input/trigger/value", ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/right/input/trigger/value", ActionType.VEC1)); - - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/left/input/squeeze/value", ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/right/input/squeeze/value", ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/left/input/trigger/value", ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/right/input/trigger/value", ActionType.VEC1)); - return set; - } - - private static HashSet viveBindings() { - HashSet set = new HashSet<>(); - - set.add( - new XRBinding(null, "/actions/global/in/vivecraft.key.ingameMenuButton", "/user/hand/left/input/menu/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/global/in/key.inventory", "/user/hand/right/input/trackpad/click", - ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiShift", "/user/hand/left/input/squeeze/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiMiddleClick", "/user/hand/right/input/squeeze/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiLeftClick", "/user/hand/right/input/trigger/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiRightClick", "/user/hand/right/input/trackpad/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiScrollAxis", "/user/hand/right/input/trackpad/y", - ActionType.VEC1)); - - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.hotbarPrev", "/user/hand/left/input/squeeze/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.hotbarNext", "/user/hand/right/input/squeeze/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/key.attack", "/user/hand/right/input/trigger/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.teleport", "/user/hand/left/input/trigger/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.radialMenu", "/user/hand/right/input/menu/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/key.use", "/user/hand/right/input/trackpad/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.teleportFallback", - "/user/hand/left/input/trigger/value", ActionType.VEC1)); - set.add( - new XRBinding(null, "/actions/ingame/in/key.jump", "/user/hand/left/input/trackpad/x", ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.freeMoveStrafe", "/user/hand/left/input/trackpad", - ActionType.VEC2)); - set.add( - new XRBinding(null, "/actions/ingame/in/key.sneak", "/user/hand/left/input/trackpad/y", ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.rotateAxis", "/user/hand/right/input/trackpad", - ActionType.VEC2)); - - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardShift", - "/user/hand/left/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardClick", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardClick", - "/user/hand/right/input/trigger/click", ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/technical/in/vivecraft.key.trackpadTouch", - "/user/hand/left/input/trackpad/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/technical/in/vivecraft.key.trackpadTouch", - "/user/hand/right/input/trackpad/touch", ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/left/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/right/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/right/input/trigger/click", ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/left/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/right/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/right/input/trigger/click", ActionType.BOOLEAN)); - - return set; - } - - private static HashSet cosmosBindings() { - HashSet set = new HashSet<>(); - - set.add( - new XRBinding(null, "/actions/global/in/vivecraft.key.ingameMenuButton", "/user/hand/left/input/y/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/global/in/key.inventory", "/user/hand/left/input/x/click", - ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiShift", "/user/hand/left/input/squeeze/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiMiddleClick", "/user/hand/right/input/squeeze/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiLeftClick", "/user/hand/right/input/trigger/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiRightClick", "/user/hand/right/input/a/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiScrollAxis", "/user/hand/right/input/thumbstick", - ActionType.VEC2)); - - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.hotbarPrev", "/user/hand/left/input/squeeze/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.hotbarNext", "/user/hand/right/input/squeeze/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/key.attack", "/user/hand/right/input/trigger/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.teleport", "/user/hand/left/input/trigger/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.radialMenu", "/user/hand/right/input/b/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/ingame/in/key.use", "/user/hand/right/input/a/click", ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.freeMoveStrafe", "/user/hand/left/input/thumbstick", - ActionType.VEC2)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.rotateAxis", "/user/hand/right/input/thumbstick", - ActionType.VEC2)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.teleportFallback", - "/user/hand/left/input/trigger/value", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/key.jump", "/user/hand/left/input/shoulder/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/key.sneak", "/user/hand/right/input/shoulder/click", - ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardShift", - "/user/hand/left/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardClick", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardClick", - "/user/hand/right/input/trigger/click", ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/left/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/right/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/right/input/trigger/click", ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/left/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/right/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/right/input/trigger/click", ActionType.BOOLEAN)); - return set; - } - - private static HashSet picoBindings() { - HashSet set = new HashSet<>(); - - set.add( - new XRBinding(null, "/actions/global/in/vivecraft.key.ingameMenuButton", "/user/hand/left/input/y/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/global/in/key.inventory", "/user/hand/left/input/x/click", - ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiShift", "/user/hand/left/input/squeeze/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiMiddleClick", "/user/hand/right/input/squeeze/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiLeftClick", "/user/hand/right/input/trigger/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiRightClick", "/user/hand/right/input/a/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiScrollAxis", "/user/hand/right/input/thumbstick/y", - ActionType.VEC1)); - - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.hotbarPrev", "/user/hand/left/input/squeeze/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.hotbarNext", "/user/hand/right/input/squeeze/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/key.attack", "/user/hand/right/input/trigger/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.teleport", "/user/hand/left/input/trigger/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.radialMenu", "/user/hand/right/input/b/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/ingame/in/key.use", "/user/hand/right/input/a/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.teleportFallback", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/key.jump", "/user/hand/left/input/thumbstick/click", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.freeMoveStrafe", "/user/hand/left/input/thumbstick", - ActionType.VEC2)); - set.add(new XRBinding(null, "/actions/ingame/in/key.sneak", "/user/hand/right/input/thumbstick/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.rotateAxis", "/user/hand/right/input/thumbstick", - ActionType.VEC2)); - - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardShift", - "/user/hand/left/input/squeeze/click", ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardShift", - "/user/hand/right/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardClick", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardClick", - "/user/hand/right/input/trigger/click", ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/left/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/right/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/right/input/trigger/click", ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/left/input/squeeze/click", ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/right/input/squeeze/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/right/input/trigger/click", ActionType.BOOLEAN)); - return set; - } - - private static HashSet indexBindings() { - HashSet set = new HashSet<>(); - - set.add( - new XRBinding(null, "/actions/global/in/vivecraft.key.ingameMenuButton", "/user/hand/left/input/b/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/global/in/key.inventory", "/user/hand/left/input/a/click", - ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiShift", "/user/hand/left/input/squeeze/force", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiMiddleClick", "/user/hand/right/input/squeeze/force", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiLeftClick", "/user/hand/right/input/trigger/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiRightClick", "/user/hand/right/input/trackpad", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/gui/in/vivecraft.key.guiScrollAxis", "/user/hand/right/input/thumbstick/y", - ActionType.VEC1)); - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiScrollAxis", "/user/hand/right/input/trackpad/y", - ActionType.VEC1)); - - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.hotbarPrev", "/user/hand/left/input/squeeze/force", - ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.hotbarNext", "/user/hand/right/input/squeeze/force", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/key.attack", "/user/hand/right/input/trigger/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.teleport", "/user/hand/left/input/trigger/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.radialMenu", "/user/hand/right/input/b/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/key.use", "/user/hand/right/input/trackpad", ActionType.VEC2)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.teleportFallback", - "/user/hand/left/input/trigger/value", ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/ingame/in/key.jump", "/user/hand/left/input/thumbstick", ActionType.VEC2)); - set.add( - new XRBinding(null, "/actions/ingame/in/vivecraft.key.freeMoveStrafe", "/user/hand/left/input/thumbstick", - ActionType.VEC2)); - set.add( - new XRBinding(null, "/actions/ingame/in/key.sneak", "/user/hand/right/input/a/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.rotateAxis", "/user/hand/right/input/thumbstick", - ActionType.VEC2)); - - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardShift", - "/user/hand/left/input/squeeze/force", ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardShift", - "/user/hand/right/input/squeeze/force", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardClick", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardClick", - "/user/hand/right/input/trigger/click", ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/left/input/squeeze/force", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/right/input/squeeze/force", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/right/input/trigger/click", ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/left/input/squeeze/force", ActionType.BOOLEAN)); - set.add( - new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/right/input/squeeze/force", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/left/input/trigger/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/right/input/trigger/click", ActionType.BOOLEAN)); - return set; - } - - private static HashSet defaultBindings() { - HashSet set = new HashSet<>(); - - set.add( - new XRBinding(null, "/actions/global/in/vivecraft.key.ingameMenuButton", "/user/hand/left/input/menu/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/gui/in/vivecraft.key.guiLeftClick", "/user/hand/right/input/select/click", - ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/ingame/in/key.attack", "/user/hand/right/input/select/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.teleport", "/user/hand/left/input/select/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/ingame/in/vivecraft.key.teleportFallback", - "/user/hand/left/input/select/click", ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardClick", - "/user/hand/left/input/select/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/keyboard/in/vivecraft.key.keyboardClick", - "/user/hand/right/input/select/click", ActionType.BOOLEAN)); - - set.add( - new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", "/user/hand/left/input/select/click", - ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.vrInteract", - "/user/hand/right/input/select/click", ActionType.BOOLEAN)); - - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/left/input/select/click", ActionType.BOOLEAN)); - set.add(new XRBinding(null, "/actions/contextual/in/vivecraft.key.climbeyGrab", - "/user/hand/right/input/select/click", ActionType.BOOLEAN)); - - return set; - } - - public static HashSet getBinding(String Headset) { - switch (Headset) { - case "/interaction_profiles/htc/vive_cosmos_controller" -> { - return cosmosBindings(); - } - case "/interaction_profiles/htc/vive_controller" -> { - return viveBindings(); - } - case "/interaction_profiles/valve/index_controller" -> { - return indexBindings(); - } - case "/interaction_profiles/oculus/touch_controller" -> { - return quest2Bindings(); - } - case "/interaction_profiles/bytedance/pico4_controller", - "/interaction_profiles/bytedance/pico_neo3_controller" -> { - return picoBindings(); - } - default -> { - return defaultBindings(); - } - } - } -} diff --git a/common/src/main/java/org/vivecraft/client_vr/provider/openxr/control/XRInputAction.java b/common/src/main/java/org/vivecraft/client_vr/provider/openxr/control/XRInputAction.java index f3bb1a31c..763f66ccc 100644 --- a/common/src/main/java/org/vivecraft/client_vr/provider/openxr/control/XRInputAction.java +++ b/common/src/main/java/org/vivecraft/client_vr/provider/openxr/control/XRInputAction.java @@ -76,7 +76,7 @@ public boolean isActive() { continue; } switch (data.type) { - case BOOLEAN, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> { + case PRESS, DOUBLE_PRESS, LONG_PRESS, HOLD, TOGGLE -> { if (this.digitalData().get(i).isActive) { this.activeAction = i; return true; diff --git a/common/src/main/java/org/vivecraft/client_vr/settings/VRSettings.java b/common/src/main/java/org/vivecraft/client_vr/settings/VRSettings.java index 5493fe83f..dbc50174a 100644 --- a/common/src/main/java/org/vivecraft/client_vr/settings/VRSettings.java +++ b/common/src/main/java/org/vivecraft/client_vr/settings/VRSettings.java @@ -260,6 +260,8 @@ public enum AimDevice implements OptionEnum { public int[] keyboardCodes = getKeyboardCodesDefault(); // Control + @SettingField() + public String currentBindingProfile = "Custom Bindings"; @SettingField(VrOptions.REVERSE_HANDS) public boolean reverseHands = false; @SettingField(VrOptions.REVERSE_BOW) diff --git a/common/src/main/resources/assets/vivecraft/input/cosmos_defaults.json b/common/src/main/resources/assets/vivecraft/input/cosmos_defaults.json index 019894be8..7c1d0663f 100644 --- a/common/src/main/resources/assets/vivecraft/input/cosmos_defaults.json +++ b/common/src/main/resources/assets/vivecraft/input/cosmos_defaults.json @@ -1,360 +1,221 @@ { - "action_manifest_version": 0, - "alias_info": {}, - "app_key": "org.jrbudda.vivecraft.steamvrinput", - "bindings": { - "/actions/contextual": { + "name": "Vive Cosmos Defaults", + "category": "vivecraft.input.defaults", + "controller_paths": {"openvr": "vive_cosmos_controller", "openxr": "/interaction_profiles/htc/vive_cosmos_controller"}, + "description": "Default Vivecraft bindings for Vive Cosmos controllers.", + "sets": { + "contextual": { "chords": [ { "inputs": [ - ["/user/hand/left/input/grip", "click"], - ["/user/hand/right/input/grip", "click"] + {"action": "/user/hand/left/input/squeeze/click", "type": "PRESS"}, + {"action": "/user/hand/right/input/squeeze/click", "type": "PRESS"} ], - "output": "/actions/contextual/in/vivecraft.key.climbeyjump" + "output": "vivecraft.key.climbeyJump" } ], "sources": [ { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.climbeygrab" - } - }, - "parameters": { - "haptic_amplitude": "0" - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" - }, - { - "inputs": {}, - "mode": "button", - "path": "/user/hand/left/input/grip" - }, - { - "inputs": {}, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.climbeyGrab", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.climbeygrab" - } - }, - "parameters": { - "haptic_amplitude": "0" - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.climbeyGrab", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.climbeygrab" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.climbeyGrab", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.climbeygrab" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.climbeyGrab", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.vrinteract" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.vrInteract", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.vrinteract" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.vrInteract", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.vrinteract" - } - }, - "parameters": { - "haptic_amplitude": "0" - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" + "inputs": [ + {"action": "vivecraft.key.vrInteract", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.vrinteract" - } - }, - "parameters": { - "haptic_amplitude": "0" - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.vrInteract", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/click" } ] }, - "/actions/global": { - "haptics": [ - { - "output": "/actions/global/out/lefthaptic", - "path": "/user/hand/left/output/haptic" - }, - { - "output": "/actions/global/out/righthaptic", - "path": "/user/hand/right/output/haptic" - } - ], - "poses": [ - { - "output": "/actions/global/in/lefthand", - "path": "/user/hand/left/pose/raw" - }, - { - "output": "/actions/global/in/righthand", - "path": "/user/hand/right/pose/raw" - } - ], + "global": { "sources": [ { - "inputs": { - "click": { - "output": "/actions/global/in/vivecraft.key.ingamemenubutton" - }, - "long": { - "output": "/actions/global/in/vivecraft.key.togglekeyboard" - } - }, - "mode": "button", - "path": "/user/hand/left/input/y" + "inputs": [ + {"action": "vivecraft.key.ingameMenuButton", "type": "PRESS"}, + {"action": "vivecraft.key.toggleKeyboard", "type": "LONG_PRESS"} + ], + "path": "/user/hand/left/input/y/click" }, { - "inputs": { - "click": { - "output": "/actions/global/in/key.inventory" - } - }, - "mode": "button", - "path": "/user/hand/left/input/x" + "inputs": [ + {"action": "key.inventory", "type": "PRESS"} + ], + "path": "/user/hand/left/input/x/click" } ] }, - "/actions/gui": { + "gui": { "sources": [ { - "inputs": { - "click": { - "output": "/actions/gui/in/vivecraft.key.guishift" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.guiShift", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/gui/in/vivecraft.key.guimiddleclick" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.guiMiddleClick", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/gui/in/vivecraft.key.guileftclick" - } - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.guiLeftClick", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/gui/in/vivecraft.key.guirightclick" - } - }, - "mode": "button", - "path": "/user/hand/right/input/a" + "inputs": [ + {"action": "vivecraft.key.guiRightClick", "type": "PRESS"} + ], + "path": "/user/hand/right/input/a/click" }, { - "inputs": { - "scroll": { - "output": "/actions/gui/in/vivecraft.key.guiscrollaxis" - } - }, - "mode": "scroll", + "inputs": [ + {"action": "vivecraft.key.guiScrollAxis", "type": "VEC1"} + ], "parameters": { "scroll_mode": "discrete" }, - "path": "/user/hand/right/input/joystick" + "path": "/user/hand/right/input/thumbstick/y" } ] }, - "/actions/ingame": { + "ingame": { "sources": [ { - "inputs": { - "click": { - "output": "/actions/ingame/in/vivecraft.key.hotbarprev" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.hotbarPrev", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/vivecraft.key.hotbarnext" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.hotbarNext", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/key.attack" - } - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "key.attack", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/vivecraft.key.teleport" - } - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" + "inputs": [ + {"action": "vivecraft.key.teleport", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/vivecraft.key.radialmenu" - } - }, - "mode": "button", - "path": "/user/hand/right/input/b" + "inputs": [ + {"action": "vivecraft.key.radialMenu", "type": "PRESS"} + ], + "path": "/user/hand/right/input/b/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/key.use" - } - }, - "mode": "button", - "path": "/user/hand/right/input/a" + "inputs": [ + {"action": "key.use", "type": "PRESS"} + ], + "path": "/user/hand/right/input/a/click" }, { - "inputs": { - "position": { - "output": "/actions/ingame/in/vivecraft.key.freemovestrafe" - } - }, - "mode": "joystick", - "path": "/user/hand/left/input/joystick" + "inputs": [ + {"action": "vivecraft.key.freeMoveStrafe", "type": "VEC2"} + ], + "path": "/user/hand/left/input/thumbstick" }, { - "inputs": { - "position": { - "output": "/actions/ingame/in/vivecraft.key.rotateaxis" - } - }, - "mode": "joystick", - "path": "/user/hand/right/input/joystick" + "inputs": [ + {"action": "vivecraft.key.rotateAxis", "type": "VEC2"} + ], + "path": "/user/hand/right/input/thumbstick" }, { - "inputs": { - "pull": { - "output": "/actions/ingame/in/vivecraft.key.teleportfallback" - } - }, - "mode": "trigger", - "path": "/user/hand/left/input/trigger" + "inputs": [ + {"action": "vivecraft.key.teleportFallback", "type": "VEC1"} + ], + "path": "/user/hand/left/input/trigger/value" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/key.jump" - } - }, - "mode": "button", - "path": "/user/hand/left/input/bumper" + "inputs": [ + {"action": "key.jump", "type": "PRESS"} + ], + "path": "/user/hand/left/input/shoulder/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/key.sneak" - } - }, - "mode": "button", - "path": "/user/hand/right/input/bumper" + "inputs": [ + {"action": "key.sneak", "type": "PRESS"} + ], + "path": "/user/hand/right/input/shoulder/click" } ] }, - "/actions/keyboard": { + "keyboard": { "sources": [ { - "inputs": { - "click": { - "output": "/actions/keyboard/in/vivecraft.key.keyboardshift" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.keyboardShift", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/keyboard/in/vivecraft.key.keyboardshift" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.keyboardShift", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/keyboard/in/vivecraft.key.keyboardclick" - } - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" + "inputs": [ + {"action": "vivecraft.key.keyboardClick", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/keyboard/in/vivecraft.key.keyboardclick" - } - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.keyboardClick", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/click" } ] } - }, - "category": "steamvr_input", - "controller_type": "vive_cosmos_controller", - "description": "", - "name": "Vive Cosmos Defaults", - "options": {}, - "simulated_actions": [] + } } diff --git a/common/src/main/resources/assets/vivecraft/input/cosmos_defaults_reversed.json b/common/src/main/resources/assets/vivecraft/input/cosmos_defaults_reversed.json index 6b1db06c7..a82061472 100644 --- a/common/src/main/resources/assets/vivecraft/input/cosmos_defaults_reversed.json +++ b/common/src/main/resources/assets/vivecraft/input/cosmos_defaults_reversed.json @@ -1,360 +1,221 @@ { - "action_manifest_version": 0, - "alias_info": {}, - "app_key": "org.jrbudda.vivecraft.steamvrinput", - "bindings": { - "/actions/contextual": { + "name": "Vive Cosmos Defaults (Reversed)", + "category": "vivecraft.input.reverseddefaults", + "controller_paths": {"openvr": "vive_cosmos_controller", "openxr": "/interaction_profiles/htc/vive_cosmos_controller"}, + "description": "Reversed default Vivecraft bindings for Vive Cosmos controllers.", + "sets": { + "contextual": { "chords": [ { "inputs": [ - ["/user/hand/left/input/grip", "click"], - ["/user/hand/right/input/grip", "click"] + {"action": "/user/hand/left/input/squeeze/click", "type": "PRESS"}, + {"action": "/user/hand/right/input/squeeze/click", "type": "PRESS"} ], - "output": "/actions/contextual/in/vivecraft.key.climbeyjump" + "output": "vivecraft.key.climbeyjump" } ], "sources": [ { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.climbeygrab" - } - }, - "parameters": { - "haptic_amplitude": "0" - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" - }, - { - "inputs": {}, - "mode": "button", - "path": "/user/hand/left/input/grip" - }, - { - "inputs": {}, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.climbeygrab", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.climbeygrab" - } - }, - "parameters": { - "haptic_amplitude": "0" - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.climbeygrab", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.climbeygrab" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.climbeygrab", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.climbeygrab" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.climbeygrab", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.vrinteract" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.vrinteract", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.vrinteract" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.vrinteract", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.vrinteract" - } - }, - "parameters": { - "haptic_amplitude": "0" - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" + "inputs": [ + {"action": "vivecraft.key.vrinteract", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.vrinteract" - } - }, - "parameters": { - "haptic_amplitude": "0" - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.vrinteract", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/click" } ] }, - "/actions/global": { - "haptics": [ - { - "output": "/actions/global/out/lefthaptic", - "path": "/user/hand/left/output/haptic" - }, - { - "output": "/actions/global/out/righthaptic", - "path": "/user/hand/right/output/haptic" - } - ], - "poses": [ - { - "output": "/actions/global/in/lefthand", - "path": "/user/hand/left/pose/raw" - }, - { - "output": "/actions/global/in/righthand", - "path": "/user/hand/right/pose/raw" - } - ], + "global": { "sources": [ { - "inputs": { - "click": { - "output": "/actions/global/in/vivecraft.key.ingamemenubutton" - }, - "long": { - "output": "/actions/global/in/vivecraft.key.togglekeyboard" - } - }, - "mode": "button", - "path": "/user/hand/right/input/b" + "inputs": [ + {"action": "vivecraft.key.ingamemenubutton", "type": "PRESS"}, + {"action": "vivecraft.key.togglekeyboard", "type": "LONG_PRESS"} + ], + "path": "/user/hand/right/input/b/click" }, { - "inputs": { - "click": { - "output": "/actions/global/in/key.inventory" - } - }, - "mode": "button", - "path": "/user/hand/right/input/a" + "inputs": [ + {"action": "key.inventory", "type": "PRESS"} + ], + "path": "/user/hand/right/input/a/click" } ] }, - "/actions/gui": { + "gui": { "sources": [ { - "inputs": { - "click": { - "output": "/actions/gui/in/vivecraft.key.guishift" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.guishift", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/gui/in/vivecraft.key.guimiddleclick" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.guimiddleclick", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/gui/in/vivecraft.key.guileftclick" - } - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" + "inputs": [ + {"action": "vivecraft.key.guileftclick", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/gui/in/vivecraft.key.guirightclick" - } - }, - "mode": "button", - "path": "/user/hand/left/input/a" + "inputs": [ + {"action": "vivecraft.key.guirightclick", "type": "PRESS"} + ], + "path": "/user/hand/left/input/a/click" }, { - "inputs": { - "scroll": { - "output": "/actions/gui/in/vivecraft.key.guiscrollaxis" - } - }, - "mode": "scroll", + "inputs": [ + {"action": "vivecraft.key.guiscrollaxis", "type": "VEC1"} + ], "parameters": { "scroll_mode": "discrete" }, - "path": "/user/hand/left/input/joystick" + "path": "/user/hand/left/input/thumbstick/y" } ] }, - "/actions/ingame": { + "ingame": { "sources": [ { - "inputs": { - "click": { - "output": "/actions/ingame/in/vivecraft.key.hotbarprev" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.hotbarprev", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/vivecraft.key.hotbarnext" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.hotbarnext", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/key.attack" - } - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" + "inputs": [ + {"action": "key.attack", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/vivecraft.key.teleport" - } - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.teleport", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/vivecraft.key.radialmenu" - } - }, - "mode": "button", - "path": "/user/hand/left/input/y" + "inputs": [ + {"action": "vivecraft.key.radialmenu", "type": "PRESS"} + ], + "path": "/user/hand/left/input/y/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/key.use" - } - }, - "mode": "button", - "path": "/user/hand/left/input/x" + "inputs": [ + {"action": "key.use", "type": "PRESS"} + ], + "path": "/user/hand/left/input/x/click" }, { - "inputs": { - "position": { - "output": "/actions/ingame/in/vivecraft.key.freemovestrafe" - } - }, - "mode": "joystick", - "path": "/user/hand/right/input/joystick" + "inputs": [ + {"action": "vivecraft.key.freemovestrafe", "type": "VEC2"} + ], + "path": "/user/hand/right/input/thumbstick" }, { - "inputs": { - "position": { - "output": "/actions/ingame/in/vivecraft.key.rotateaxis" - } - }, - "mode": "joystick", - "path": "/user/hand/left/input/joystick" + "inputs": [ + {"action": "vivecraft.key.rotateaxis", "type": "VEC2"} + ], + "path": "/user/hand/left/input/thumbstick" }, { - "inputs": { - "pull": { - "output": "/actions/ingame/in/vivecraft.key.teleportfallback" - } - }, - "mode": "trigger", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.teleportfallback", "type": "VEC1"} + ], + "path": "/user/hand/right/input/trigger/value" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/key.jump" - } - }, - "mode": "button", - "path": "/user/hand/right/input/bumper" + "inputs": [ + {"action": "key.jump", "type": "PRESS"} + ], + "path": "/user/hand/right/input/shoulder/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/key.sneak" - } - }, - "mode": "button", - "path": "/user/hand/left/input/bumper" + "inputs": [ + {"action": "key.sneak", "type": "PRESS"} + ], + "path": "/user/hand/left/input/shoulder/click" } ] }, - "/actions/keyboard": { + "keyboard": { "sources": [ { - "inputs": { - "click": { - "output": "/actions/keyboard/in/vivecraft.key.keyboardshift" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.keyboardshift", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/keyboard/in/vivecraft.key.keyboardshift" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.keyboardshift", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/click" }, { - "inputs": { - "click": { - "output": "/actions/keyboard/in/vivecraft.key.keyboardclick" - } - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" + "inputs": [ + {"action": "vivecraft.key.keyboardclick", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/click" }, { - "inputs": { - "click": { - "output": "/actions/keyboard/in/vivecraft.key.keyboardclick" - } - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.keyboardclick", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/click" } ] } - }, - "category": "steamvr_input", - "controller_type": "vive_cosmos_controller", - "description": "", - "name": "Vive Cosmos Defaults (Reversed Hands)", - "options": {}, - "simulated_actions": [] + } } diff --git a/common/src/main/resources/assets/vivecraft/input/mappings/index_controller.json b/common/src/main/resources/assets/vivecraft/input/mappings/index_controller.json new file mode 100644 index 000000000..fda89f656 --- /dev/null +++ b/common/src/main/resources/assets/vivecraft/input/mappings/index_controller.json @@ -0,0 +1,44 @@ +{ + "/user/hand/left/input/trackpad": "VEC2", + "/user/hand/left/input/trackpad/y": "VEC1", + "/user/hand/right/input/trigger/click": "PRESS", + "/user/hand/left/input/trigger/click": "PRESS", + "/user/hand/left/input/trackpad/x": "VEC1", + "/user/hand/left/input/system/touch": "PRESS", + "/user/hand/left/input/b/click": "PRESS", + "/user/hand/left/input/thumbstick/touch": "PRESS", + "/user/hand/right/input/trackpad/x": "VEC1", + "/user/hand/right/input/trackpad/y": "VEC1", + "/user/hand/left/input/a/touch": "PRESS", + "/user/hand/right/input/trackpad/force": "PRESS", + "/user/hand/right/input/a/click": "PRESS", + "/user/hand/right/input/trackpad": "VEC2", + "/user/hand/right/input/system/touch": "PRESS", + "/user/hand/left/input/squeeze/value": "VEC1", + "/user/hand/left/input/thumbstick/y": "VEC1", + "/user/hand/left/input/thumbstick/x": "VEC1", + "/user/hand/right/input/squeeze/value": "VEC1", + "/user/hand/right/input/trigger/value": "VEC1", + "/user/hand/right/input/system/click": "PRESS", + "/user/hand/left/input/trigger/value": "VEC1", + "/user/hand/right/input/b/click": "PRESS", + "/user/hand/left/input/system/click": "PRESS", + "/user/hand/left/input/thumbstick": "VEC2", + "/user/hand/right/input/b/touch": "PRESS", + "/user/hand/left/input/b/touch": "PRESS", + "/user/hand/left/input/trackpad/touch": "PRESS", + "/user/hand/right/input/thumbstick/touch": "PRESS", + "/user/hand/right/input/thumbstick/y": "VEC1", + "/user/hand/right/input/a/touch": "PRESS", + "/user/hand/right/input/thumbstick/x": "VEC1", + "/user/hand/left/input/trackpad/force": "PRESS", + "/user/hand/right/input/trigger/touch": "PRESS", + "/user/hand/right/input/thumbstick/click": "PRESS", + "/user/hand/left/input/trigger/touch": "PRESS", + "/user/hand/left/input/squeeze/force": "PRESS", + "/user/hand/left/input/thumbstick/click": "PRESS", + "/user/hand/right/input/squeeze/force": "PRESS", + "/user/hand/left/input/a/click": "PRESS", + "/user/hand/right/input/thumbstick": "VEC2", + "/user/hand/right/input/trackpad/touch": "PRESS" +} diff --git a/common/src/main/resources/assets/vivecraft/input/mappings/pico4_controller.json b/common/src/main/resources/assets/vivecraft/input/mappings/pico4_controller.json new file mode 100644 index 000000000..37fc41ac3 --- /dev/null +++ b/common/src/main/resources/assets/vivecraft/input/mappings/pico4_controller.json @@ -0,0 +1,33 @@ +{ + "/user/hand/left/input/squeeze/click": "PRESS", + "/user/hand/right/input/trigger/click": "PRESS", + "/user/hand/right/input/squeeze/click": "PRESS", + "/user/hand/left/input/trigger/click": "PRESS", + "/user/hand/left/input/y/click": "PRESS", + "/user/hand/left/input/y/touch": "PRESS", + "/user/hand/left/input/thumbstick/touch": "PRESS", + "/user/hand/right/input/a/click": "PRESS", + "/user/hand/left/input/x/touch": "PRESS", + "/user/hand/left/input/squeeze/value": "VEC1", + "/user/hand/left/input/thumbstick/y": "VEC1", + "/user/hand/left/input/thumbstick/x": "VEC1", + "/user/hand/right/input/squeeze/value": "VEC1", + "/user/hand/right/input/trigger/value": "VEC1", + "/user/hand/right/input/system/click": "PRESS", + "/user/hand/left/input/trigger/value": "VEC1", + "/user/hand/right/input/b/click": "PRESS", + "/user/hand/left/input/system/click": "PRESS", + "/user/hand/left/input/thumbstick": "VEC2", + "/user/hand/right/input/b/touch": "PRESS", + "/user/hand/right/input/thumbstick/touch": "PRESS", + "/user/hand/right/input/thumbstick/y": "VEC1", + "/user/hand/right/input/a/touch": "PRESS", + "/user/hand/right/input/thumbstick/x": "VEC1", + "/user/hand/right/input/trigger/touch": "PRESS", + "/user/hand/right/input/thumbstick/click": "PRESS", + "/user/hand/left/input/x/click": "PRESS", + "/user/hand/left/input/trigger/touch": "PRESS", + "/user/hand/left/input/thumbstick/click": "PRESS", + "/user/hand/right/input/thumbstick": "VEC2", + "/user/hand/left/input/menu/click": "PRESS" +} diff --git a/common/src/main/resources/assets/vivecraft/input/mappings/pico_neo3_controller.json b/common/src/main/resources/assets/vivecraft/input/mappings/pico_neo3_controller.json new file mode 100644 index 000000000..37fc41ac3 --- /dev/null +++ b/common/src/main/resources/assets/vivecraft/input/mappings/pico_neo3_controller.json @@ -0,0 +1,33 @@ +{ + "/user/hand/left/input/squeeze/click": "PRESS", + "/user/hand/right/input/trigger/click": "PRESS", + "/user/hand/right/input/squeeze/click": "PRESS", + "/user/hand/left/input/trigger/click": "PRESS", + "/user/hand/left/input/y/click": "PRESS", + "/user/hand/left/input/y/touch": "PRESS", + "/user/hand/left/input/thumbstick/touch": "PRESS", + "/user/hand/right/input/a/click": "PRESS", + "/user/hand/left/input/x/touch": "PRESS", + "/user/hand/left/input/squeeze/value": "VEC1", + "/user/hand/left/input/thumbstick/y": "VEC1", + "/user/hand/left/input/thumbstick/x": "VEC1", + "/user/hand/right/input/squeeze/value": "VEC1", + "/user/hand/right/input/trigger/value": "VEC1", + "/user/hand/right/input/system/click": "PRESS", + "/user/hand/left/input/trigger/value": "VEC1", + "/user/hand/right/input/b/click": "PRESS", + "/user/hand/left/input/system/click": "PRESS", + "/user/hand/left/input/thumbstick": "VEC2", + "/user/hand/right/input/b/touch": "PRESS", + "/user/hand/right/input/thumbstick/touch": "PRESS", + "/user/hand/right/input/thumbstick/y": "VEC1", + "/user/hand/right/input/a/touch": "PRESS", + "/user/hand/right/input/thumbstick/x": "VEC1", + "/user/hand/right/input/trigger/touch": "PRESS", + "/user/hand/right/input/thumbstick/click": "PRESS", + "/user/hand/left/input/x/click": "PRESS", + "/user/hand/left/input/trigger/touch": "PRESS", + "/user/hand/left/input/thumbstick/click": "PRESS", + "/user/hand/right/input/thumbstick": "VEC2", + "/user/hand/left/input/menu/click": "PRESS" +} diff --git a/common/src/main/resources/assets/vivecraft/input/mappings/simple_controller.json b/common/src/main/resources/assets/vivecraft/input/mappings/simple_controller.json new file mode 100644 index 000000000..c76c79197 --- /dev/null +++ b/common/src/main/resources/assets/vivecraft/input/mappings/simple_controller.json @@ -0,0 +1,6 @@ +{ + "/user/hand/left/input/select/click": "PRESS", + "/user/hand/right/input/menu/click": "PRESS", + "/user/hand/right/input/select/click": "PRESS", + "/user/hand/left/input/menu/click": "PRESS" +} diff --git a/common/src/main/resources/assets/vivecraft/input/mappings/touch_controller.json b/common/src/main/resources/assets/vivecraft/input/mappings/touch_controller.json new file mode 100644 index 000000000..7542e3858 --- /dev/null +++ b/common/src/main/resources/assets/vivecraft/input/mappings/touch_controller.json @@ -0,0 +1,30 @@ +{ + "/user/hand/left/input/y/click": "PRESS", + "/user/hand/left/input/y/touch": "PRESS", + "/user/hand/left/input/thumbrest/touch": "PRESS", + "/user/hand/left/input/thumbstick/touch": "PRESS", + "/user/hand/right/input/a/click": "PRESS", + "/user/hand/left/input/x/touch": "PRESS", + "/user/hand/left/input/squeeze/value": "VEC1", + "/user/hand/left/input/thumbstick/y": "VEC1", + "/user/hand/left/input/thumbstick/x": "VEC1", + "/user/hand/right/input/squeeze/value": "VEC1", + "/user/hand/right/input/trigger/value": "VEC1", + "/user/hand/right/input/system/click": "PRESS", + "/user/hand/left/input/trigger/value": "VEC1", + "/user/hand/right/input/b/click": "PRESS", + "/user/hand/left/input/thumbstick": "VEC2", + "/user/hand/right/input/b/touch": "PRESS", + "/user/hand/right/input/thumbstick/touch": "PRESS", + "/user/hand/right/input/thumbstick/y": "VEC1", + "/user/hand/right/input/a/touch": "PRESS", + "/user/hand/right/input/thumbstick/x": "VEC1", + "/user/hand/right/input/thumbrest/touch": "PRESS", + "/user/hand/right/input/trigger/touch": "PRESS", + "/user/hand/right/input/thumbstick/click": "PRESS", + "/user/hand/left/input/x/click": "PRESS", + "/user/hand/left/input/trigger/touch": "PRESS", + "/user/hand/left/input/thumbstick/click": "PRESS", + "/user/hand/right/input/thumbstick": "VEC2", + "/user/hand/left/input/menu/click": "PRESS" +} diff --git a/common/src/main/resources/assets/vivecraft/input/mappings/vive_controller.json b/common/src/main/resources/assets/vivecraft/input/mappings/vive_controller.json new file mode 100644 index 000000000..9cd506b48 --- /dev/null +++ b/common/src/main/resources/assets/vivecraft/input/mappings/vive_controller.json @@ -0,0 +1,22 @@ +{ + "/user/hand/left/input/trackpad": "VEC2", + "/user/hand/left/input/trackpad/y": "VEC1", + "/user/hand/left/input/squeeze/click": "PRESS", + "/user/hand/right/input/trigger/click": "PRESS", + "/user/hand/right/input/squeeze/click": "PRESS", + "/user/hand/left/input/trigger/click": "PRESS", + "/user/hand/right/input/trigger/value": "VEC1", + "/user/hand/left/input/trackpad/x": "VEC1", + "/user/hand/left/input/trackpad/click": "PRESS", + "/user/hand/right/input/system/click": "PRESS", + "/user/hand/left/input/trigger/value": "VEC1", + "/user/hand/right/input/menu/click": "PRESS", + "/user/hand/left/input/system/click": "PRESS", + "/user/hand/left/input/trackpad/touch": "PRESS", + "/user/hand/right/input/trackpad/x": "VEC1", + "/user/hand/right/input/trackpad/click": "PRESS", + "/user/hand/right/input/trackpad/y": "VEC1", + "/user/hand/right/input/trackpad": "VEC2", + "/user/hand/left/input/menu/click": "PRESS", + "/user/hand/right/input/trackpad/touch": "PRESS" +} diff --git a/common/src/main/resources/assets/vivecraft/input/mappings/vive_cosmos_controller.json b/common/src/main/resources/assets/vivecraft/input/mappings/vive_cosmos_controller.json new file mode 100644 index 000000000..9c7c487dc --- /dev/null +++ b/common/src/main/resources/assets/vivecraft/input/mappings/vive_cosmos_controller.json @@ -0,0 +1,26 @@ +{ + "/user/hand/left/input/thumbstick/y": "VEC1", + "/user/hand/left/input/squeeze/click": "PRESS", + "/user/hand/left/input/thumbstick/x": "VEC1", + "/user/hand/right/input/trigger/click": "PRESS", + "/user/hand/right/input/squeeze/click": "PRESS", + "/user/hand/left/input/trigger/click": "PRESS", + "/user/hand/right/input/trigger/value": "VEC1", + "/user/hand/right/input/system/click": "PRESS", + "/user/hand/left/input/trigger/value": "VEC1", + "/user/hand/right/input/b/click": "PRESS", + "/user/hand/left/input/y/click": "PRESS", + "/user/hand/left/input/thumbstick": "VEC2", + "/user/hand/right/input/thumbstick/touch": "PRESS", + "/user/hand/right/input/shoulder/click": "PRESS", + "/user/hand/right/input/thumbstick/y": "VEC1", + "/user/hand/right/input/thumbstick/x": "VEC1", + "/user/hand/left/input/thumbstick/touch": "PRESS", + "/user/hand/right/input/thumbstick/click": "PRESS", + "/user/hand/left/input/x/click": "PRESS", + "/user/hand/right/input/a/click": "PRESS", + "/user/hand/left/input/thumbstick/click": "PRESS", + "/user/hand/left/input/shoulder/click": "PRESS", + "/user/hand/right/input/thumbstick": "VEC2", + "/user/hand/left/input/menu/click": "PRESS" +} diff --git a/common/src/main/resources/assets/vivecraft/input/oculus_defaults.json b/common/src/main/resources/assets/vivecraft/input/oculus_defaults.json index 2b7a20384..58eeb3dde 100644 --- a/common/src/main/resources/assets/vivecraft/input/oculus_defaults.json +++ b/common/src/main/resources/assets/vivecraft/input/oculus_defaults.json @@ -1,354 +1,221 @@ { - "action_manifest_version": 0, - "alias_info": {}, - "app_key": "org.jrbudda.vivecraft.steamvrinput", - "bindings": { - "/actions/contextual": { + "name": "Oculus Touch Defaults", + "category": "vivecraft.input.defaults", + "controller_paths": {"openvr": "oculus_touch", "openxr": "/interaction_profiles/oculus/touch_controller"}, + "description": "Default Vivecraft bindings for Oculus Touch controllers.", + "sets": { + "contextual": { "chords": [ { "inputs": [ - ["/user/hand/left/input/grip", "click"], - ["/user/hand/right/input/grip", "click"] + {"action": "/user/hand/left/input/squeeze/value", "type": "PRESS"}, + {"action": "/user/hand/right/input/squeeze/value", "type": "PRESS"} ], - "output": "/actions/contextual/in/vivecraft.key.climbeyjump" + "output": "vivecraft.key.climbeyJump" } ], "sources": [ { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.climbeygrab" - } - }, - "parameters": { - "haptic_amplitude": "0" - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" - }, - { - "inputs": {}, - "mode": "button", - "path": "/user/hand/left/input/grip" - }, - { - "inputs": {}, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.climbeyGrab", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/value" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.climbeygrab" - } - }, - "parameters": { - "haptic_amplitude": "0" - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.climbeyGrab", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/value" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.climbeygrab" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.climbeyGrab", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/value" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.climbeygrab" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.climbeyGrab", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/value" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.vrinteract" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.vrInteract", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/value" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.vrinteract" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.vrInteract", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/value" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.vrinteract" - } - }, - "parameters": { - "haptic_amplitude": "0" - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" + "inputs": [ + {"action": "vivecraft.key.vrInteract", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/value" }, { - "inputs": { - "click": { - "output": "/actions/contextual/in/vivecraft.key.vrinteract" - } - }, - "parameters": { - "haptic_amplitude": "0" - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.vrInteract", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/value" } ] }, - "/actions/global": { - "haptics": [ - { - "output": "/actions/global/out/lefthaptic", - "path": "/user/hand/left/output/haptic" - }, - { - "output": "/actions/global/out/righthaptic", - "path": "/user/hand/right/output/haptic" - } - ], - "poses": [ - { - "output": "/actions/global/in/lefthand", - "path": "/user/hand/left/pose/raw" - }, - { - "output": "/actions/global/in/righthand", - "path": "/user/hand/right/pose/raw" - } - ], + "global": { "sources": [ { - "inputs": { - "click": { - "output": "/actions/global/in/vivecraft.key.ingamemenubutton" - }, - "long": { - "output": "/actions/global/in/vivecraft.key.togglekeyboard" - } - }, - "mode": "button", - "path": "/user/hand/left/input/y" + "inputs": [ + {"action": "vivecraft.key.ingameMenuButton", "type": "PRESS"}, + {"action": "vivecraft.key.toggleKeyboard", "type": "LONG_PRESS"} + ], + "path": "/user/hand/left/input/y/click" }, { - "inputs": { - "click": { - "output": "/actions/global/in/key.inventory" - } - }, - "mode": "button", - "path": "/user/hand/left/input/x" + "inputs": [ + {"action": "key.inventory", "type": "PRESS"} + ], + "path": "/user/hand/left/input/x/click" } ] }, - "/actions/gui": { + "gui": { "sources": [ { - "inputs": { - "click": { - "output": "/actions/gui/in/vivecraft.key.guishift" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.guiShift", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/value" }, { - "inputs": { - "click": { - "output": "/actions/gui/in/vivecraft.key.guimiddleclick" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.guiMiddleClick", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/value" }, { - "inputs": { - "click": { - "output": "/actions/gui/in/vivecraft.key.guileftclick" - } - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.guiLeftClick", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/value" }, { - "inputs": { - "click": { - "output": "/actions/gui/in/vivecraft.key.guirightclick" - } - }, - "mode": "button", - "path": "/user/hand/right/input/a" + "inputs": [ + {"action": "vivecraft.key.guiRightClick", "type": "PRESS"} + ], + "path": "/user/hand/right/input/a/click" }, { - "inputs": { - "scroll": { - "output": "/actions/gui/in/vivecraft.key.guiscrollaxis" - } - }, - "mode": "scroll", + "inputs": [ + {"action": "vivecraft.key.guiScrollAxis", "type": "VEC1"} + ], "parameters": { "scroll_mode": "discrete" }, - "path": "/user/hand/right/input/joystick" + "path": "/user/hand/right/input/thumbstick/y" } ] }, - "/actions/ingame": { + "ingame": { "sources": [ { - "inputs": { - "click": { - "output": "/actions/ingame/in/vivecraft.key.hotbarprev" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.hotbarPrev", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/value" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/vivecraft.key.hotbarnext" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.hotbarNext", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/value" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/key.attack" - } - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "key.attack", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/value" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/vivecraft.key.teleport" - } - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" + "inputs": [ + {"action": "vivecraft.key.teleport", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/value" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/vivecraft.key.radialmenu" - } - }, - "mode": "button", - "path": "/user/hand/right/input/b" + "inputs": [ + {"action": "vivecraft.key.radialMenu", "type": "PRESS"} + ], + "path": "/user/hand/right/input/b/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/key.use" - } - }, - "mode": "button", - "path": "/user/hand/right/input/a" + "inputs": [ + {"action": "key.use", "type": "PRESS"} + ], + "path": "/user/hand/right/input/a/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/key.jump" - }, - "position": { - "output": "/actions/ingame/in/vivecraft.key.freemovestrafe" - } - }, - "mode": "joystick", - "path": "/user/hand/left/input/joystick" + "inputs": [ + {"action": "vivecraft.key.freeMoveStrafe", "type": "VEC2"} + ], + "path": "/user/hand/left/input/thumbstick" }, { - "inputs": { - "position": { - "output": "/actions/ingame/in/vivecraft.key.rotateaxis" - } - }, - "mode": "joystick", - "path": "/user/hand/right/input/joystick" + "inputs": [ + {"action": "key.jump", "type": "PRESS"} + ], + "path": "/user/hand/left/input/thumbstick/click" }, { - "inputs": { - "click": { - "output": "/actions/ingame/in/key.sneak" - } - }, - "mode": "toggle_button", - "path": "/user/hand/right/input/joystick" + "inputs": [ + {"action": "vivecraft.key.rotateAxis", "type": "VEC2"} + ], + "path": "/user/hand/right/input/thumbstick" }, { - "inputs": { - "pull": { - "output": "/actions/ingame/in/vivecraft.key.teleportfallback" - } - }, - "mode": "trigger", - "path": "/user/hand/left/input/trigger" + "inputs": [ + {"action": "key.sneak", "type": "TOGGLE"} + ], + "path": "/user/hand/right/input/thumbstick/click" + }, + { + "inputs": [ + {"action": "vivecraft.key.teleportFallback", "type": "VEC1"} + ], + "path": "/user/hand/left/input/trigger/value" } ] }, - "/actions/keyboard": { + "keyboard": { "sources": [ { - "inputs": { - "click": { - "output": "/actions/keyboard/in/vivecraft.key.keyboardshift" - } - }, - "mode": "button", - "path": "/user/hand/left/input/grip" + "inputs": [ + {"action": "vivecraft.key.keyboardShift", "type": "PRESS"} + ], + "path": "/user/hand/left/input/squeeze/value" }, { - "inputs": { - "click": { - "output": "/actions/keyboard/in/vivecraft.key.keyboardshift" - } - }, - "mode": "button", - "path": "/user/hand/right/input/grip" + "inputs": [ + {"action": "vivecraft.key.keyboardShift", "type": "PRESS"} + ], + "path": "/user/hand/right/input/squeeze/value" }, { - "inputs": { - "click": { - "output": "/actions/keyboard/in/vivecraft.key.keyboardclick" - } - }, - "mode": "button", - "path": "/user/hand/left/input/trigger" + "inputs": [ + {"action": "vivecraft.key.keyboardClick", "type": "PRESS"} + ], + "path": "/user/hand/left/input/trigger/value" }, { - "inputs": { - "click": { - "output": "/actions/keyboard/in/vivecraft.key.keyboardclick" - } - }, - "mode": "button", - "path": "/user/hand/right/input/trigger" + "inputs": [ + {"action": "vivecraft.key.keyboardClick", "type": "PRESS"} + ], + "path": "/user/hand/right/input/trigger/value" } ] } - }, - "category": "steamvr_input", - "controller_type": "oculus_touch", - "description": "", - "name": "Oculus Touch Defaults", - "options": {}, - "simulated_actions": [] + } } diff --git a/common/src/main/resources/assets/vivecraft/input/simple_defaults.json b/common/src/main/resources/assets/vivecraft/input/simple_defaults.json new file mode 100644 index 000000000..250e800bf --- /dev/null +++ b/common/src/main/resources/assets/vivecraft/input/simple_defaults.json @@ -0,0 +1,34 @@ +{ + "name": "Simple Controller Defaults", + "category": "vivecraft.input.defaults", + "controller_paths": {"openvr": "khr_simple", "openxr": "/interaction_profiles/khr/simple_controller"}, + "description": "Default Vivecraft bindings for Khronos Simple controllers.", + "sets": { + "global": { + "sources": [ + { + "inputs": [ + {"action": "vivecraft.key.ingameMenuButton", "type": "PRESS"} + ], + "path": "/user/hand/left/input/menu/click" + } + ] + }, + "gui": { + "sources": [ + { + "inputs": [ + {"action": "vivecraft.key.guiLeftClick", "type": "PRESS"} + ], + "path": "/user/hand/left/input/select/click" + }, + { + "inputs": [ + {"action": "vivecraft.key.guiRightClick", "type": "PRESS"} + ], + "path": "/user/hand/right/input/select/click" + } + ] + } + } +} diff --git a/common/src/main/resources/assets/vivecraft/lang/en_us.json b/common/src/main/resources/assets/vivecraft/lang/en_us.json index 949ab5435..a9c7aff16 100644 --- a/common/src/main/resources/assets/vivecraft/lang/en_us.json +++ b/common/src/main/resources/assets/vivecraft/lang/en_us.json @@ -84,6 +84,7 @@ "vivecraft.options.screen.teleport": "Teleport Settings", "vivecraft.options.screen.controls": "Controller Settings", "vivecraft.options.screen.keyboard": "Keyboard Settings", + "vivecraft.options.screen.bindings": "Controller Bindings", "_comment4": "Buttons that lead to the screen", "vivecraft.options.screen.main.button": "VR Settings...", "vivecraft.options.screen.gui.button": "HUD and GUI Settings...", @@ -493,7 +494,9 @@ "vivecraft.options.once": "Once", "vivecraft.options.disabled": "Disabled", "vivecraft.options.editlist": "Edit List", + "vivecraft.options.add": "Add", "vivecraft.options.addnew": "Add New", + "vivecraft.options.edit": "Edit", "vivecraft.options.updatetype.alpha": "Alpha", "vivecraft.options.updatetype.beta": "Beta", "vivecraft.options.updatetype.release": "Release", @@ -931,5 +934,56 @@ "tag.block.vivecraft.climbable": "Vivecraft Climbable Block", "tag.block.vivecraft.crops": "Vivecraft Crop", - "tag.block.vivecraft.music_blocks": "Vivecraft Music Block" + "tag.block.vivecraft.music_blocks": "Vivecraft Music Block", + + "/user/hand/left/input/y/click": "Left Y", + "/user/hand/left/input/y/touch": "Left Y Touch", + "/user/hand/left/input/x/click": "Left X", + "/user/hand/left/input/x/touch": "Left X Touch", + "/user/hand/left/input/menu/click": "Left Menu", + "/user/hand/left/input/system/click": "Left System", + "/user/hand/left/input/select/click": "Left Select", + "/user/hand/left/input/squeeze/click": "Left Grip", + "/user/hand/left/input/squeeze/value": "Left Grip Value", + "/user/hand/left/input/squeeze/force": "Left Grip Force", + "/user/hand/left/input/trigger/click": "Left Trigger Click", + "/user/hand/left/input/trigger/value": "Left Trigger", + "/user/hand/left/input/trigger/touch": "Left Trigger Touch", + "/user/hand/left/input/thumbstick": "Left Thumbstick", + "/user/hand/left/input/thumbstick/x": "Left Thumbstick X", + "/user/hand/left/input/thumbstick/y": "Left Thumbstick Y", + "/user/hand/left/input/thumbstick/click": "Left Thumbstick Click", + "/user/hand/left/input/thumbstick/touch": "Left Thumbstick Touch", + "/user/hand/left/input/thumbrest/touch": "Left Thumbrest Touch", + "/user/hand/left/input/trackpad": "Left Trackpad", + "/user/hand/left/input/trackpad/x": "Left Trackpad X", + "/user/hand/left/input/trackpad/y": "Left Trackpad Y", + "/user/hand/left/input/trackpad/force": "Left Trackpad Force", + "/user/hand/left/input/trackpad/touch": "Left Trackpad Touch", + "/user/hand/left/input/shoulder/click": "Left Shoulder", + "/user/hand/right/input/a/click": "Right A", + "/user/hand/right/input/a/touch": "Right A Touch", + "/user/hand/right/input/b/click": "Right B", + "/user/hand/right/input/b/touch": "Right B Touch", + "/user/hand/right/input/menu/click": "Right Menu", + "/user/hand/right/input/system/click": "Right System", + "/user/hand/right/input/select/click": "Right Select", + "/user/hand/right/input/squeeze/click": "Right Grip", + "/user/hand/right/input/squeeze/value": "Right Grip Value", + "/user/hand/right/input/squeeze/force": "Right Grip Force", + "/user/hand/right/input/trigger/click": "Right Trigger Click", + "/user/hand/right/input/trigger/value": "Right Trigger", + "/user/hand/right/input/trigger/touch": "Right Trigger Touch", + "/user/hand/right/input/thumbstick": "Right Thumbstick", + "/user/hand/right/input/thumbstick/x": "Right Thumbstick X", + "/user/hand/right/input/thumbstick/y": "Right Thumbstick Y", + "/user/hand/right/input/thumbstick/click": "Right Thumbstick Click", + "/user/hand/right/input/thumbstick/touch": "Right Thumbstick Touch", + "/user/hand/right/input/thumbrest/touch": "Right Thumbrest Touch", + "/user/hand/right/input/trackpad": "Right Trackpad", + "/user/hand/right/input/trackpad/x": "Right Trackpad X", + "/user/hand/right/input/trackpad/y": "Right Trackpad Y", + "/user/hand/right/input/trackpad/force": "Right Trackpad Force", + "/user/hand/right/input/trackpad/touch": "Right Trackpad Touch", + "/user/hand/right/input/shoulder/click": "Right Shoulder" }