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/control/Action.java b/common/src/main/java/org/vivecraft/client_vr/provider/control/Action.java new file mode 100644 index 000000000..48d6cf505 --- /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 output, ActionType type) {} 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..eb9f52c35 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 @@ -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" -> BOOLEAN; + case "toggle_button" -> TOGGLE; + default -> BOOLEAN; + }; + 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" -> BOOLEAN; + default -> BOOLEAN; + }; + case "position" -> switch (mode) { + case "joystick" -> VEC2; + default -> VEC2; + }; + case "pull" -> switch (mode) { + case "trigger" -> VEC1; + default -> VEC1; + }; + case "grab" -> switch (mode) { + case "grab" -> BOOLEAN; + default -> BOOLEAN; + }; + 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..61f69ebe8 --- /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.Map; + +public record Chord(Map 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..22d9aa05e 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); 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..9e308eafb 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 @@ -23,15 +23,14 @@ 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 java.io.FileNotFoundException; +import java.io.IOException; import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; @@ -823,11 +822,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();} } } @@ -984,7 +979,7 @@ private void initInputAndApplication() { //this.generateActionManifest(); //this.loadActionManifest(); this.loadActionHandles(); - this.loadDefaultBindings(); + this.loadBindings(); //this.installApplicationManifest(false); this.inputInitialized = true; this.initDisplayRefreshRate(); @@ -1000,6 +995,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/left"), state); + logError(error, "xrGetCurrentInteractionProfile", "left"); + return getString(state.interactionProfile()); + } + } + public List getOrigins(XRInputAction.HandedAction handedAction, XRInputAction action) { try (MemoryStack stack = MemoryStack.stackPush()) { XrBoundSourcesForActionEnumerateInfo info = XrBoundSourcesForActionEnumerateInfo.calloc(stack); @@ -1100,7 +1105,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 +1138,134 @@ 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? - } - 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; - } - bindings.get(i).set( - new XrAction(handle, - new XrActionSet(this.actionSetHandles.get(inputAction.actionSet), this.instance)), - getPath(binding.controller()) - ); + 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; + } - //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); - suggested_binds.type(XR10.XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING); - suggested_binds.next(NULL); - suggested_binds.interactionProfile(getPath(headset)); - suggested_binds.suggestedBindings(bindings); - - error = XR10.xrSuggestInteractionProfileBindings(this.instance, suggested_binds); - logError(error, "xrSuggestInteractionProfileBindings", headset); + 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) { + String headsetPath = profile.controller_paths().openxr(); + VRSettings.LOGGER.info("Loading interaction profile: {}", profile.name()); + int bindingIndex = 0; + for (Map.Entry set : profile.sets().entrySet()) { + List sources = set.getValue().sources(); + int totalBindings = sources.stream().mapToInt(a -> a.inputs().size()).sum(); + XrActionSuggestedBinding.Buffer bindings = XrActionSuggestedBinding.calloc(totalBindings + 6, stack); + + for (Source source : sources) { + for (Action action : source.inputs()) { + XRInputAction inputAction = this.getInputActionByName(action.output()); + if (inputAction == null) { + VRSettings.LOGGER.warn("Input action '{}' not found", action.output()); + continue; + } + long handle = this.mappedBindings.get(new ActionBind(inputAction.actionSet, source.path())); + 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", action.output(), source.path()); + continue; + } + + // TODO support multiple bindings per action + bindings.get(bindingIndex).set( + new XrAction(handle, new XrActionSet(this.actionSetHandles.get(inputAction.actionSet), this.instance)), + getPath(source.path()) + ); + bindingIndex++; + } + } + + XrActionSet actionSet = new XrActionSet(this.actionSetHandles.get(VRInputActionSet.getByName(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++) { + bindings.get(bindingIndex + j).set(new XrAction(poses[j], actionSet), getPath(hands[j % 2] + posePaths[j])); + } + for (int j = 0; j < haptics.length; j++) { + bindings.get(bindingIndex + poses.length + j).set(new XrAction(haptics[j], actionSet), getPath(hands[j] + hapticPaths[j])); + } + + XrInteractionProfileSuggestedBinding suggested_binds = XrInteractionProfileSuggestedBinding.calloc(stack); + suggested_binds.type(XR10.XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING); + suggested_binds.next(NULL); + suggested_binds.interactionProfile(getPath(headsetPath)); + suggested_binds.suggestedBindings(bindings); + + error = XR10.xrSuggestInteractionProfileBindings(this.instance, suggested_binds); + logError(error, "xrSuggestInteractionProfileBindings", profile.name()); + bindings.close(); + } + } 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); } } 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/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/mappings/index_controller.json b/common/src/main/resources/assets/vivecraft/input/mappings/index_controller.json new file mode 100644 index 000000000..326da12e1 --- /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": "BOOLEAN", + "/user/hand/left/input/trigger/click": "BOOLEAN", + "/user/hand/left/input/trackpad/x": "VEC1", + "/user/hand/left/input/system/touch": "BOOLEAN", + "/user/hand/left/input/b/click": "BOOLEAN", + "/user/hand/left/input/thumbstick/touch": "BOOLEAN", + "/user/hand/right/input/trackpad/x": "VEC1", + "/user/hand/right/input/trackpad/y": "VEC1", + "/user/hand/left/input/a/touch": "BOOLEAN", + "/user/hand/right/input/trackpad/force": "BOOLEAN", + "/user/hand/right/input/a/click": "BOOLEAN", + "/user/hand/right/input/trackpad": "VEC2", + "/user/hand/right/input/system/touch": "BOOLEAN", + "/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": "BOOLEAN", + "/user/hand/left/input/trigger/value": "VEC1", + "/user/hand/right/input/b/click": "BOOLEAN", + "/user/hand/left/input/system/click": "BOOLEAN", + "/user/hand/left/input/thumbstick": "VEC2", + "/user/hand/right/input/b/touch": "BOOLEAN", + "/user/hand/left/input/b/touch": "BOOLEAN", + "/user/hand/left/input/trackpad/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/y": "VEC1", + "/user/hand/right/input/a/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/x": "VEC1", + "/user/hand/left/input/trackpad/force": "BOOLEAN", + "/user/hand/right/input/trigger/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/click": "BOOLEAN", + "/user/hand/left/input/trigger/touch": "BOOLEAN", + "/user/hand/left/input/squeeze/force": "BOOLEAN", + "/user/hand/left/input/thumbstick/click": "BOOLEAN", + "/user/hand/right/input/squeeze/force": "BOOLEAN", + "/user/hand/left/input/a/click": "BOOLEAN", + "/user/hand/right/input/thumbstick": "VEC2", + "/user/hand/right/input/trackpad/touch": "BOOLEAN" +} \ No newline at end of file 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..85c8ca0c9 --- /dev/null +++ b/common/src/main/resources/assets/vivecraft/input/mappings/pico4_controller.json @@ -0,0 +1,33 @@ +{ + "/user/hand/left/input/squeeze/click": "BOOLEAN", + "/user/hand/right/input/trigger/click": "BOOLEAN", + "/user/hand/right/input/squeeze/click": "BOOLEAN", + "/user/hand/left/input/trigger/click": "BOOLEAN", + "/user/hand/left/input/y/click": "BOOLEAN", + "/user/hand/left/input/y/touch": "BOOLEAN", + "/user/hand/left/input/thumbstick/touch": "BOOLEAN", + "/user/hand/right/input/a/click": "BOOLEAN", + "/user/hand/left/input/x/touch": "BOOLEAN", + "/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": "BOOLEAN", + "/user/hand/left/input/trigger/value": "VEC1", + "/user/hand/right/input/b/click": "BOOLEAN", + "/user/hand/left/input/system/click": "BOOLEAN", + "/user/hand/left/input/thumbstick": "VEC2", + "/user/hand/right/input/b/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/y": "VEC1", + "/user/hand/right/input/a/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/x": "VEC1", + "/user/hand/right/input/trigger/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/click": "BOOLEAN", + "/user/hand/left/input/x/click": "BOOLEAN", + "/user/hand/left/input/trigger/touch": "BOOLEAN", + "/user/hand/left/input/thumbstick/click": "BOOLEAN", + "/user/hand/right/input/thumbstick": "VEC2", + "/user/hand/left/input/menu/click": "BOOLEAN" +} \ No newline at end of file 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..85c8ca0c9 --- /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": "BOOLEAN", + "/user/hand/right/input/trigger/click": "BOOLEAN", + "/user/hand/right/input/squeeze/click": "BOOLEAN", + "/user/hand/left/input/trigger/click": "BOOLEAN", + "/user/hand/left/input/y/click": "BOOLEAN", + "/user/hand/left/input/y/touch": "BOOLEAN", + "/user/hand/left/input/thumbstick/touch": "BOOLEAN", + "/user/hand/right/input/a/click": "BOOLEAN", + "/user/hand/left/input/x/touch": "BOOLEAN", + "/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": "BOOLEAN", + "/user/hand/left/input/trigger/value": "VEC1", + "/user/hand/right/input/b/click": "BOOLEAN", + "/user/hand/left/input/system/click": "BOOLEAN", + "/user/hand/left/input/thumbstick": "VEC2", + "/user/hand/right/input/b/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/y": "VEC1", + "/user/hand/right/input/a/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/x": "VEC1", + "/user/hand/right/input/trigger/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/click": "BOOLEAN", + "/user/hand/left/input/x/click": "BOOLEAN", + "/user/hand/left/input/trigger/touch": "BOOLEAN", + "/user/hand/left/input/thumbstick/click": "BOOLEAN", + "/user/hand/right/input/thumbstick": "VEC2", + "/user/hand/left/input/menu/click": "BOOLEAN" +} \ No newline at end of file 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..01dd5383a --- /dev/null +++ b/common/src/main/resources/assets/vivecraft/input/mappings/simple_controller.json @@ -0,0 +1,6 @@ +{ + "/user/hand/left/input/select/click": "BOOLEAN", + "/user/hand/right/input/menu/click": "BOOLEAN", + "/user/hand/right/input/select/click": "BOOLEAN", + "/user/hand/left/input/menu/click": "BOOLEAN" +} \ No newline at end of file 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..fa3f565b7 --- /dev/null +++ b/common/src/main/resources/assets/vivecraft/input/mappings/touch_controller.json @@ -0,0 +1,30 @@ +{ + "/user/hand/left/input/y/click": "BOOLEAN", + "/user/hand/left/input/y/touch": "BOOLEAN", + "/user/hand/left/input/thumbrest/touch": "BOOLEAN", + "/user/hand/left/input/thumbstick/touch": "BOOLEAN", + "/user/hand/right/input/a/click": "BOOLEAN", + "/user/hand/left/input/x/touch": "BOOLEAN", + "/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": "BOOLEAN", + "/user/hand/left/input/trigger/value": "VEC1", + "/user/hand/right/input/b/click": "BOOLEAN", + "/user/hand/left/input/thumbstick": "VEC2", + "/user/hand/right/input/b/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/y": "VEC1", + "/user/hand/right/input/a/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/x": "VEC1", + "/user/hand/right/input/thumbrest/touch": "BOOLEAN", + "/user/hand/right/input/trigger/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/click": "BOOLEAN", + "/user/hand/left/input/x/click": "BOOLEAN", + "/user/hand/left/input/trigger/touch": "BOOLEAN", + "/user/hand/left/input/thumbstick/click": "BOOLEAN", + "/user/hand/right/input/thumbstick": "VEC2", + "/user/hand/left/input/menu/click": "BOOLEAN" +} \ No newline at end of file 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..3e4afe415 --- /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": "BOOLEAN", + "/user/hand/right/input/trigger/click": "BOOLEAN", + "/user/hand/right/input/squeeze/click": "BOOLEAN", + "/user/hand/left/input/trigger/click": "BOOLEAN", + "/user/hand/right/input/trigger/value": "VEC1", + "/user/hand/left/input/trackpad/x": "VEC1", + "/user/hand/left/input/trackpad/click": "BOOLEAN", + "/user/hand/right/input/system/click": "BOOLEAN", + "/user/hand/left/input/trigger/value": "VEC1", + "/user/hand/right/input/menu/click": "BOOLEAN", + "/user/hand/left/input/system/click": "BOOLEAN", + "/user/hand/left/input/trackpad/touch": "BOOLEAN", + "/user/hand/right/input/trackpad/x": "VEC1", + "/user/hand/right/input/trackpad/click": "BOOLEAN", + "/user/hand/right/input/trackpad/y": "VEC1", + "/user/hand/right/input/trackpad": "VEC2", + "/user/hand/left/input/menu/click": "BOOLEAN", + "/user/hand/right/input/trackpad/touch": "BOOLEAN" +} \ No newline at end of file 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..b1aab1618 --- /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": "BOOLEAN", + "/user/hand/left/input/thumbstick/x": "VEC1", + "/user/hand/right/input/trigger/click": "BOOLEAN", + "/user/hand/right/input/squeeze/click": "BOOLEAN", + "/user/hand/left/input/trigger/click": "BOOLEAN", + "/user/hand/right/input/trigger/value": "VEC1", + "/user/hand/right/input/system/click": "BOOLEAN", + "/user/hand/left/input/trigger/value": "VEC1", + "/user/hand/right/input/b/click": "BOOLEAN", + "/user/hand/left/input/y/click": "BOOLEAN", + "/user/hand/left/input/thumbstick": "VEC2", + "/user/hand/right/input/thumbstick/touch": "BOOLEAN", + "/user/hand/right/input/shoulder/click": "BOOLEAN", + "/user/hand/right/input/thumbstick/y": "VEC1", + "/user/hand/right/input/thumbstick/x": "VEC1", + "/user/hand/left/input/thumbstick/touch": "BOOLEAN", + "/user/hand/right/input/thumbstick/click": "BOOLEAN", + "/user/hand/left/input/x/click": "BOOLEAN", + "/user/hand/right/input/a/click": "BOOLEAN", + "/user/hand/left/input/thumbstick/click": "BOOLEAN", + "/user/hand/left/input/shoulder/click": "BOOLEAN", + "/user/hand/right/input/thumbstick": "VEC2", + "/user/hand/left/input/menu/click": "BOOLEAN" +} \ No newline at end of file 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..82f4e008a 100644 --- a/common/src/main/resources/assets/vivecraft/input/oculus_defaults.json +++ b/common/src/main/resources/assets/vivecraft/input/oculus_defaults.json @@ -1,7 +1,8 @@ { - "action_manifest_version": 0, - "alias_info": {}, - "app_key": "org.jrbudda.vivecraft.steamvrinput", + "name": "Oculus Touch Defaults", + "description": "", + "category": "steamvr_input", + "controller_type": ["oculus_touch", "/interaction_profiles/oculus/touch_controller"], "bindings": { "/actions/contextual": { "chords": [ @@ -344,11 +345,5 @@ } ] } - }, - "category": "steamvr_input", - "controller_type": "oculus_touch", - "description": "", - "name": "Oculus Touch Defaults", - "options": {}, - "simulated_actions": [] + } } 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" }