Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
VolcanicArts committed Dec 8, 2024
2 parents ad33e06 + 006b583 commit 1fe3267
Show file tree
Hide file tree
Showing 547 changed files with 23,337 additions and 23,074 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
bin/
obj/
/build
/Releases
/releases
/publish
/publish.sh
/packages/
Expand Down
10 changes: 6 additions & 4 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
<!-- Contains required properties for osu!framework projects. -->
<Project>
<PropertyGroup>
<ApplicationManifest>$(MSBuildThisFileDirectory)app.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup>
<GlobalVersionYear>$([System.DateTime]::Now.ToString("yyyy"))</GlobalVersionYear>
<GlobalVersionMonthDay>$([System.DateTime]::Now.ToString("Mdd"))</GlobalVersionMonthDay>
<GlobalBuild>0</GlobalBuild>
<GlobalVersion>$(GlobalVersionYear).$(GlobalVersionMonthDay).$(GlobalBuild).0</GlobalVersion>
</PropertyGroup>
</Project>
112 changes: 52 additions & 60 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,93 +1,85 @@
<div align="center">

# VRCOSC
A modular OSC program creator and toolkit made for [VRChat](https://vrchat.com) built on top of the [osu!framework](https://github.com/ppy/osu-framework)
A modular OSC program creator, animation system, toolkit, and debugger made for [VRChat](https://vrchat.com)

<img src="https://github.com/VolcanicArts/VRCOSC/assets/29819296/a6828e41-ad72-4068-a195-42dc6508ceff" width=70% height=70%>
<img src="https://github.com/user-attachments/assets/61945157-d185-4134-a655-d6a9923eba23" width=75% height=75%>

[![release version](https://img.shields.io/github/v/release/VolcanicArts/VRCOSC?style=for-the-badge)](https://github.com/VolcanicArts/VRCOSC/releases/latest)
[![downloads](https://img.shields.io/github/downloads/VolcanicArts/VRCOSC/total?style=for-the-badge&label=Downloads%20Total)](https://github.com/VolcanicArts/VRCOSC/releases/latest)
[![downloads@latest](https://img.shields.io/github/downloads/VolcanicArts/VRCOSC/latest/total?style=for-the-badge&label=Downloads%20For%20Latest)](https://github.com/VolcanicArts/VRCOSC/releases/latest)
[![commits](https://img.shields.io/github/commit-activity/m/VolcanicArts/VRCOSC/v2-wpf?style=for-the-badge)](https://github.com/VolcanicArts/VRCOSC/commits/v2-wpf)
[![commits](https://img.shields.io/github/commit-activity/m/VolcanicArts/VRCOSC/dev?style=for-the-badge)](https://github.com/VolcanicArts/VRCOSC/commits/dev)
<br>
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/O5O8FF9YO)
<br>
[![discord](https://discordapp.com/api/guilds/1000862183963496519/widget.png?style=shield)](https://discord.gg/vj4brHyvT5)
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/volcanicarts)
<br/>
[![discord](https://discordapp.com/api/guilds/1000862183963496519/widget.png?style=shield)](https://vrcosc.com/discord)
[![docs](https://img.shields.io/badge/Documentation-2b2b2b?logo=docusaurus)](https://vrcosc.com/docs/welcome)

</div>

## V2
V2 is a rewrite of the app currently in beta. It'll be released when it's ready, but is a huge advancement over the current version.

Featuring:
- Module packages: Release a module on GitHub and have it appear in the app for anyone to download
- Profiles: For those that want different modules per avatar, profiles can automatically change how the modules behave based on which avatar you're wearing
- Better performance: With virtually 0 CPU usage and no GPU usage, it can quietly run in the background while you're in VR with no performance hit
- Module generalisation: Have a prefab you've wanted to connect to VROSC? Now you can. All the parameters are generic and customisable
- More module features: All the modules have been upgraded with more customisability, and more have been added
- ChatBox V4: An improved animation system with truly limitless customisation
- Improved SDK: For those that want to make and distribute modules with our framework, it's easier than ever

If you're interested in beta testing the app, grab the V2 Beta role in the [Discord Server](https://discord.gg/vj4brHyvT5). Any and all feedback is welcomed!

## About

VRCOSC is intended to act as a wrapper around VRChat's OSC system to make creating OSC programs easier, provide interfaces for other APIs and frameworks that might be useful to an OSC project, and act as a centralised source for useful OSC programs so that a user will only need to download a single application. Our framework supports developing your own modules to save you the trouble of having to setup everything yourself, as well as allowing other people to seamlessly use your module on their PC. Check out how to create a module [here](https://github.com/VolcanicArts/VRCOSC/wiki/Module-Creation).
VRCOSC is intended to act as a wrapper around VRChat's OSC system to make creating OSC programs easier,
provide interfaces for other APIs and frameworks that might be useful to an OSC project,
and act as a centralised source for useful OSC programs so that a user will only need to download a single application.
Our framework supports developing your own modules to save you the trouble of having to set up everything yourself,
as well as allowing other people to seamlessly use your module on their PC. See how to create a module [here](https://vrcosc.com/docs/v2/sdk/getting-started).

VRCOSC's powerful ChatBox design system allows you to display what you want, when you want, how you want. Check out the ChatBox-Config forum channel of our [Discord Server](https://discord.gg/vj4brHyvT5) to see some of the configs people have created!
The ChatBox uses a [community-created list](https://github.com/cyberkitsune/chatbox-club-blacklist/blob/master/npblacklist.json) to block all modules apart from the accessibility and health related modules (SpeechToText, Pulsoid, and Hyperate) from using the ChatBox when in club/event worlds as a courtesy to performers and event staff. You can turn this off in VRCOSC's settings, but we recommend you keep it on for respect.

VRCOSC's router lets you route other OSC programs through our app to stop port binding issues. Common setups can be found on the [Routing Wiki](https://github.com/VolcanicArts/VRCOSC/wiki/VRCOSC-Router) page.

We have a [Discord Server](https://discord.gg/vj4brHyvT5) for posting suggestions or to get help with anything to do with VRCOSC.
The ChatBox uses a [community-created list](https://github.com/cyberkitsune/chatbox-club-blacklist/blob/master/npblacklist.json) to block the ChatBox from being used in certain worlds. You can turn this off in the app settings, but we recommend you keep it on for respect.

If you like VRCOSC, please star the repo. It really helps!
Our powerful ChatBox animation system allows you to display what you want, when you want, how you want.
Community configs are available, or you can make your own by following [the docs](https://vrcosc.com/docs/v2/chatbox)!

Featuring:
- Responsive GUI generation
- Modern GUI
- Automated configuration management
- A powerful ChatBox design system
- An in-built router to work with other OSC apps
- A powerful ChatBox animation system
- Profiles that can link to avatars
- A built-in router
- Program modularity for easy development
- Automatic updates
- Common API interfaces
- Drag-and-drop Unity prefabs
- Debug tools

## Getting Started
- Download `VRCOSCSetup.exe` from the [Releases](https://github.com/VolcanicArts/VRCOSC/releases/latest) page
- Download and run `VRCOSCSetup.exe` from the [Releases](https://github.com/VolcanicArts/VRCOSC/releases/latest) page
- Tick the modules you'd like to use
- Download any prefabs you want and add them to your avatar (Guides are available inside each prefab)
- (Optional) Download any prefabs you want and add them to your avatar (Guides are available inside each prefab)
- Press the run button!

Check the [FAQ](https://github.com/VolcanicArts/VRCOSC/wiki/FAQ) if you have any issues with installing or using any of the prefabs.
Check the [FAQ](https://vrcosc.com/docs/faq) if you have any issues with installing, using the app, or using any of the prefabs.
Join the [Discord Server](https://vrcosc.com/discord) if you need any other help.

## Official Modules
If you have a module idea join the [Discord Server](https://discord.gg/vj4brHyvT5) and tell us or [create it yourself](https://github.com/VolcanicArts/VRCOSC/wiki/Module-Creation)!

Note: The VRCOSC-Controls.unitypackage prefab is global controls for VRCOSC. It does not require a module to use.

All prefabs listed can be downloaded from the [Releases](https://github.com/VolcanicArts/VRCOSC/releases/latest) page

| Module | Description | Prefab |
| :---: | :--- | :---: |
| Media | Allows for media display in the ChatBox and full control over media from your action menu | VRCOSC-Media.unitypackage |
| Pulsoid [![pulsoid](https://pulsoid.net/s/github-badge)](https://pulsoid.net/) | Connects to [Pulsoid](https://pulsoid.net/) to display your live heartrate in-game - [Supported Devices](https://www.blog.pulsoid.net/monitors) | VRCOSC-Heartrate.unitypackage |
| HypeRate | Connects to [HypeRate.io](https://www.hyperate.io/) to display your live heartrate in-game - [Supported Devices](https://www.hyperate.io/supported-devices) | VRCOSC-Heartrate.unitypackage |
| Speech To Text | Run Speech To Text using any language model and display the result in your ChatBox | |
| Clock | Sends your local time as hours, minutes, and seconds to be displayed on a wrist watch | VRCOSC-Watch.unitypackage |
| PiShock | Allow you to control groups of PiShock shockers directly from your avatar | VRCOSC-PiShock.unitypackage |
| Hardware Stats | Gather's hardware stats to send to your avatar and display in the ChatBox | |
| Haptic Control | Allows for triggering controller haptics using variables from your avatar | |
| OpenVR Statistics | Gets statistics from your OpenVR (SteamVR) session | VRCOSC-Trackers.unitypackage |
| OpenVR Controller Statistics | Gets controller statistics from your OpenVR (SteamVR) session | |
| Gesture Extensions | Allows for custom gestures to be sent to VRChat from your Index controllers | |
| AFK Display | Displays how long you've been AFK for in the ChatBox | |
| Process Manager | Open and close apps on your PC using avatar parameters | |
| Weather | Gets weather from a postcode/zipcode/city to display in the ChatBox | |
| Counter | Counts how many times a parameter on your avatar changes to be displayed in the ChatBox | |
| ChatBox Text | Displays custom text in the ChatBox that can also function like a ticker tape | |
| Discord | Allows for toggling of mute and deafen from the action menu | VRCOSC-Discord.unitypackage |
| Exchange Rate | Retrieves exchange rate information for currencies and displays them in the ChatBox | |
If you have a module idea join the [Discord Server](https://vrcosc.com/discord) and tell us or [create it yourself](https://vrcosc.com/docs/v2/sdk/getting-started)!

All modules support sending generic parameters that are standardised so that public avatars can utilise these features.
Most modules have ChatBox support, providing generic variables for you to customise in limitless ways.

The official modules source code is located [here](https://github.com/VolcanicArts/VRCOSC-Modules).

| Module Name | Description |
|:------------------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Media | Allows for media (Spotify, YouTube, etc) display in the ChatBox and full control over media from your action menu |
| Pulsoid | Connects to [Pulsoid](https://pulsoid.net/) to display your live heartrate in-game - [Supported Devices](https://www.blog.pulsoid.net/monitors) [![pulsoid](https://pulsoid.net/s/github-badge)](https://pulsoid.net/) |
| HypeRate | Connects to [HypeRate.io](https://www.hyperate.io/) to display your live heartrate in-game - [Supported Devices](https://www.hyperate.io/supported-devices) |
| Speech To Text | Listens to your speech and displays the result in the ChatBox |
| Voice Commands | Control avatar parameters with your voice |
| DateTime | Sends your local date/time as day, month, year, hours, minutes, and seconds to avatar parameters |
| Counter | Counts how many times a parameter on your avatar has changed to be displayed in the ChatBox |
| PiShock | Control groups of PiShock shockers directly from your avatar, or with your voice |
| Maths | Define complex equations to drive avatar parameters |
| Keybinds | Trigger keybinds using avatar parameters |
| Client Events | Listens for events from VRChat and triggers parameters on your avatar |
| Hardware Stats | Gathers hardware stats to send to your avatar and ChatBox |
| SteamVR Stats | Gets statistics from your SteamVR session |
| SteamVR Haptic Control | Control SteamVR haptics on your devices |
| Index Gesture Extensions | Allows for custom gestures to be sent to VRChat from your Index controllers |
| AFK Detection | Detects when you're AFK in VRChat or SteamVR |
| Process Manager | Open and close apps on your PC using avatar parameters |
| Stopwatch | A simple stopwatch |
| Weather | Gets weather from a postcode/zipcode/city to display in the ChatBox |

## License
This program is licensed under the [GNU General Public License V3](https://www.gnu.org/licenses/gpl-3.0.en.html). Please see [the license file](LICENSE) for more information.
Expand Down
37 changes: 37 additions & 0 deletions VRCOSC.App/Actions/CompositeProgressAction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Copyright (c) VolcanicArts. Licensed under the GPL-3.0 License.
// See the LICENSE file in the repository root for full license text.

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace VRCOSC.App.Actions;

public class CompositeProgressAction : ProgressAction
{
public override string Title => currentChild is CompositeProgressAction compositeCurrentChild ? compositeCurrentChild.Title : currentChild?.Title ?? string.Empty;

private readonly List<ProgressAction> children = new();
private ProgressAction? currentChild => children.FirstOrDefault(child => !child.IsComplete);

public void AddAction(ProgressAction? child)
{
if (child is null) return;

children.Add(child);
}

protected override async Task Perform()
{
foreach (var child in children)
{
await child.Execute();
}
}

public override float GetProgress()
{
var multiplier = 1f / children.Count;
return children.Sum(child => child.IsComplete ? multiplier : child.GetProgress() * multiplier);
}
}
25 changes: 25 additions & 0 deletions VRCOSC.App/Actions/DynamicChildProgressAction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Copyright (c) VolcanicArts. Licensed under the GPL-3.0 License.
// See the LICENSE file in the repository root for full license text.

using System;
using System.Threading.Tasks;

namespace VRCOSC.App.Actions;

public class DynamicChildProgressAction : CompositeProgressAction
{
private readonly Func<ProgressAction?> callback;

public DynamicChildProgressAction(Func<ProgressAction?> callback)
{
this.callback = callback;
}

protected override async Task Perform()
{
var childAction = callback();
AddAction(childAction);

await base.Perform();
}
}
43 changes: 43 additions & 0 deletions VRCOSC.App/Actions/DynamicProgressAction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright (c) VolcanicArts. Licensed under the GPL-3.0 License.
// See the LICENSE file in the repository root for full license text.

using System;
using System.Threading.Tasks;

namespace VRCOSC.App.Actions;

public class DynamicProgressAction : ProgressAction
{
public override string Title { get; }
private readonly Action callback;

public DynamicProgressAction(string title, Action callback)
{
Title = title;
this.callback = callback;
}

protected override Task Perform()
{
callback();
return Task.CompletedTask;
}

public override float GetProgress() => 0f;
}

public class DynamicAsyncProgressAction : ProgressAction
{
public override string Title { get; }
private readonly Func<Task> callback;

public DynamicAsyncProgressAction(string title, Func<Task> callback)
{
Title = title;
this.callback = callback;
}

protected override async Task Perform() => await callback();

public override float GetProgress() => 0f;
}
Loading

0 comments on commit 1fe3267

Please sign in to comment.