+1
-1
src/App.tsx
+1
-1
src/App.tsx
+14
-2
src/Mangers/NodeManager.tsx
+14
-2
src/Mangers/NodeManager.tsx
···
27
27
setInterval(() => {
28
28
let tabs = Object.values(this._tabs).filter(x => x.needSync);
29
29
for(let tab of tabs){
30
-
invoke('sync_tab', { graph: this._generateTabGraph(tab.id)[0], id: tab.id, name: tab.name, location: tab.saveLocation });
30
+
invoke('sync_tab', {
31
+
graph: this._generateTabGraph(tab.id)[0],
32
+
id: tab.id,
33
+
name: tab.name,
34
+
location: tab.saveLocation,
35
+
saveState: tab.needsSave()
36
+
});
37
+
31
38
tab.needSync = false;
32
39
}
33
40
}, 1000);
···
40
47
let version = await getVersion();
41
48
42
49
for(let tab of Object.entries<any>(tabs)){
43
-
await this._loadFromConfig(tab[1][2], tab[0], JSON.stringify({
50
+
let loaded_tab = await this._loadFromConfig(tab[1][2], tab[0], JSON.stringify({
44
51
tab_name: tab[1][1],
45
52
version,
46
53
graph: tab[1][0]
47
54
}));
55
+
56
+
if(loaded_tab)
57
+
loaded_tab.setNeedsSave(tab[1][3]);
48
58
};
49
59
50
60
this.UpdateConfig();
···
336
346
337
347
tab.needSync = false;
338
348
if(!id)this.UpdateConfig(false);
349
+
350
+
return tab;
339
351
}
340
352
341
353
private _generateTabGraph( tabId: string | null ): [ any, Tab | null ]{
-1
src/Nodes/Conditional/IfEqual.tsx
-1
src/Nodes/Conditional/IfEqual.tsx
-1
src/Nodes/Conditional/IfFalse.tsx
-1
src/Nodes/Conditional/IfFalse.tsx
-1
src/Nodes/Conditional/IfTrue.tsx
-1
src/Nodes/Conditional/IfTrue.tsx
-1
src/Nodes/Debug.tsx
-1
src/Nodes/Debug.tsx
+1
-2
src/Nodes/Nodes.tsx
+1
-2
src/Nodes/Nodes.tsx
···
17
17
onStaticsUpdate?: ( node: Node ) => Promise<void>,
18
18
// build?: ( pos: [ number, number ], onStaticsUpdate: ( node: Node ) => void ) => Promise<Node>,
19
19
w?: number,
20
-
h?: number,
21
20
statics?: NodeStatic[],
22
21
inputs?: { name: string, type: NodeType }[],
23
22
outputs?: { name: string, type: NodeType }[],
···
29
28
[details: string] : NodeDefinition;
30
29
}
31
30
32
-
// TODO: (Node Additions) Pressing keyboard keys
31
+
// TODO: (Node Additions) Pressing keyboard keys (like to do linux, but has extra steps)
33
32
// TODO: (Node Additions) Getting media state from os
34
33
// TODO: (Node Additions) Sending custom OSC messages
35
34
// TODO: (Node Additions) Sending HTTP requests?
-1
src/Nodes/OSCActions/Send Chatbox.tsx
-1
src/Nodes/OSCActions/Send Chatbox.tsx
+25
-10
src/Nodes/OSCTrigger.tsx
+25
-10
src/Nodes/OSCTrigger.tsx
···
12
12
typeId: 'osctrigger',
13
13
14
14
w: 200,
15
-
h: 50,
16
15
17
16
statics: [
18
17
{
···
41
40
}
42
41
}
43
42
44
-
node.outputs.map(output => {
45
-
output.connections.map(partner => {
46
-
partner.connections = partner.connections.filter(x => x != output);
47
-
})
48
-
})
49
-
node.outputs = [];
43
+
let tempOutputs = [];
50
44
51
-
node.outputs.push({
45
+
tempOutputs.push({
52
46
name: 'Flow',
53
47
type: NodeType.Flow,
54
48
connections: [],
···
75
69
}
76
70
77
71
if(type){
78
-
node.outputs.push({
72
+
tempOutputs.push({
79
73
name: dat.desc === '' ? dat.type : dat.desc,
80
74
type: type,
81
75
connections: [],
···
85
79
}
86
80
});
87
81
88
-
node.h = 60 + (parameters.length + 1) * 30;
82
+
let hasChanged = false;
83
+
84
+
for(let i in tempOutputs){
85
+
if(
86
+
node.outputs[i] === undefined ||
87
+
tempOutputs[i].type != node.outputs[i].type
88
+
){
89
+
hasChanged = true;
90
+
}
91
+
}
92
+
93
+
if(hasChanged){
94
+
node.outputs.map(output => {
95
+
output.connections.map(partner => {
96
+
partner.connections = partner.connections.filter(x => x != output);
97
+
})
98
+
})
99
+
100
+
node.outputs = tempOutputs;
101
+
node.updateSize();
102
+
}
103
+
89
104
NodeManager.Instance.UpdateConfig();
90
105
}
91
106
};
-1
src/Nodes/PressKey.tsx
-1
src/Nodes/PressKey.tsx
-1
src/Nodes/Shell.tsx
-1
src/Nodes/Shell.tsx
-1
src/Nodes/Statics/Float.tsx
-1
src/Nodes/Statics/Float.tsx
-1
src/Nodes/Statics/Int.tsx
-1
src/Nodes/Statics/Int.tsx
-1
src/Nodes/Statics/String.tsx
-1
src/Nodes/Statics/String.tsx
+9
-4
src/keybinds.ts
+9
-4
src/keybinds.ts
···
6
6
7
7
let isKeyDown: any = {};
8
8
9
-
export let load = ( mousePos: Accessor<[ number, number ]>, selectedNode: Accessor<Node[]>, setSelectedNode: Setter<Node[]> ) => {
9
+
export let load = ( canvas: HTMLCanvasElement, mousePos: Accessor<[ number, number ]>, selectedNode: Accessor<Node[]>, setSelectedNode: Setter<Node[]> ) => {
10
10
// TODO: Add undo / redo -ing
11
11
12
-
window.onkeydown = async ( e ) => {
13
-
isKeyDown[e.key] = true;
14
-
12
+
canvas.onkeydown = async ( e ) => {
15
13
switch(e.key){
16
14
case 'Delete':
17
15
let nodes = selectedNode();
···
33
31
34
32
setSelectedNode([]);
35
33
break;
34
+
}
35
+
}
36
+
37
+
window.onkeydown = async ( e ) => {
38
+
isKeyDown[e.key] = true;
39
+
40
+
switch(e.key){
36
41
case 's':
37
42
if(e.ctrlKey){
38
43
let currentTab = NodeManager.Instance.CurrentTab();
+7
-2
src/structs/node.ts
+7
-2
src/structs/node.ts
···
20
20
this.typeId = node.typeId!;
21
21
this.x = pos[0];
22
22
this.y = pos[1];
23
-
this.w = node.w!;
24
-
this.h = node.h!;
25
23
26
24
this.inputs = node.inputs ? node.inputs.map(( x, indx ) => {
27
25
return {
···
43
41
}
44
42
}) : [];
45
43
44
+
this.w = node.w || 200;
45
+
this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30;
46
+
46
47
this.selected = false;
47
48
this.statics = node.statics!,
48
49
this.onStaticsUpdate = node.onStaticsUpdate!;
50
+
}
51
+
52
+
updateSize(){
53
+
this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30;
49
54
}
50
55
}
51
56
+3
src-tauri/Cargo.lock
+3
src-tauri/Cargo.lock
···
7
7
version = "0.1.0"
8
8
dependencies = [
9
9
"anyhow",
10
+
"chrono",
10
11
"crossbeam-channel",
11
12
"dirs",
12
13
"enigo",
···
519
520
checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2"
520
521
dependencies = [
521
522
"iana-time-zone",
523
+
"js-sys",
522
524
"num-traits",
523
525
"serde",
526
+
"wasm-bindgen",
524
527
"windows-link 0.2.1",
525
528
]
526
529
+1
src-tauri/Cargo.toml
+1
src-tauri/Cargo.toml
+1
-1
src-tauri/src/frontend_calls/load_previous_tabs.rs
+1
-1
src-tauri/src/frontend_calls/load_previous_tabs.rs
···
8
8
pub fn load_previous_tabs(
9
9
window: Window,
10
10
conf: State<Config>,
11
-
) -> HashMap<String, (Vec<Node>, String, Option<String>)> {
11
+
) -> HashMap<String, (Vec<Node>, String, Option<String>, bool)> {
12
12
let config = conf.store.lock().unwrap();
13
13
14
14
if !config.hide_editor_on_start {
+5
-1
src-tauri/src/frontend_calls/sync_tab.rs
+5
-1
src-tauri/src/frontend_calls/sync_tab.rs
···
1
+
use chrono::Utc;
1
2
use crossbeam_channel::Sender;
2
3
3
4
use tauri::State;
···
9
10
graph: Vec<Node>,
10
11
id: String,
11
12
name: String,
13
+
save_state: bool,
12
14
location: Option<String>,
13
15
cmd: State<Sender<RuntimeCommand>>,
14
16
conf: State<Config>,
···
18
20
.unwrap();
19
21
20
22
let mut config = conf.store.lock().unwrap();
21
-
config.loaded_tabs.insert(id, (graph, name, location)); // TODO: When loading a tab into config, store the save state of it too
23
+
config.loaded_tabs.insert(id, (graph, name, location, save_state));
24
+
25
+
conf.save_prelocked(config);
22
26
}
23
27
24
28
#[tauri::command]
+5
-4
src-tauri/src/lib.rs
+5
-4
src-tauri/src/lib.rs
···
3
3
use crossbeam_channel::bounded;
4
4
use frontend_calls::*;
5
5
6
-
use crate::{osc::OSCMessage, setup::setup, utils::config::Config};
6
+
use crate::{osc::OSCMessage, setup::setup, utils::{config::Config, vrchat_builtin_parameters}};
7
7
8
8
mod frontend_calls;
9
9
mod osc;
···
11
11
mod setup;
12
12
mod structs;
13
13
mod utils;
14
-
15
-
// TODO: Add built-in OSC endpoints
16
-
// TODO: Read avatar paramaters from file
17
14
18
15
#[cfg_attr(mobile, tauri::mobile_entry_point)]
19
16
#[tokio::main]
···
35
32
let conf = Config::new(conf_file);
36
33
37
34
static ADDRESSES: Mutex<Vec<OSCMessage>> = Mutex::new(Vec::new());
35
+
36
+
let mut addresses = ADDRESSES.lock().unwrap();
37
+
addresses.append(&mut vrchat_builtin_parameters::get_read_addresses());
38
+
drop(addresses);
38
39
39
40
let (runtime_sender, runtime_receiver) = bounded(1024);
40
41
+3
-1
src-tauri/src/main.rs
+3
-1
src-tauri/src/main.rs
+4
-3
src-tauri/src/runtime/nodes/shell.rs
+4
-3
src-tauri/src/runtime/nodes/shell.rs
···
1
-
use std::process::Command;
1
+
use std::{io::Stdin, process::{Command, Stdio}};
2
2
3
3
use crate::{
4
4
runtime::nodes::RuntimeNode,
···
40
40
41
41
fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> {
42
42
if let Ok(cmd) = args[1].as_string(){
43
-
dbg!(&cmd);
44
-
45
43
if cmd != ""{
46
44
let mut split_cmd = cmd.split(" ");
47
45
48
46
let mut cmd = Command::new(split_cmd.nth(0).unwrap());
49
47
if split_cmd.clone().count() > 0{ cmd.args(split_cmd); }
48
+
49
+
cmd.stdout(Stdio::piped());
50
+
cmd.stderr(Stdio::piped());
50
51
51
52
let child = cmd.spawn().unwrap();
52
53
let output = child.wait_with_output().unwrap();
+1
-5
src-tauri/src/runtime.rs
+1
-5
src-tauri/src/runtime.rs
···
15
15
let mut next_node_args: HashMap<String, Vec<ParameterType>> = HashMap::new();
16
16
17
17
for i in 0..out_args.len(){
18
+
if output_map.len() <= i { break; }
18
19
let links = &output_map[i];
19
20
20
21
for ( id, link_index, _ ) in links{
···
55
56
if node.is_none() { bail!("Cannot find node"); }
56
57
57
58
let node = node.unwrap();
58
-
59
59
let inputs = node.inputs();
60
-
dbg!(&inputs);
61
60
62
61
let mut needed_input_nodes = HashMap::new();
63
62
···
73
72
}
74
73
}
75
74
76
-
dbg!(&needed_input_nodes);
77
-
78
75
for ( id, needed ) in needed_input_nodes{
79
76
let (out_args, _) = runtime(id, tab, vec![]).unwrap();
80
-
// TODO: Combine output with args
81
77
82
78
for ( output, input ) in needed{
83
79
let arg = &out_args[output as usize];
+17
-5
src-tauri/src/setup.rs
+17
-5
src-tauri/src/setup.rs
···
11
11
use tauri::{App, Emitter, Listener, Manager, WindowEvent};
12
12
13
13
use crate::{
14
-
osc::{self, OSCMessage}, runtime::{commands::RuntimeCommand, nodes::RuntimeNodeTree, recurse_runtime}, structs::parameter_types::ParameterType, utils::setup_traymenu::setup_traymenu
14
+
osc::{self, OSCMessage}, runtime::{commands::RuntimeCommand, nodes::RuntimeNodeTree, recurse_runtime}, structs::parameter_types::ParameterType, utils::{setup_traymenu::setup_traymenu, vrchat_builtin_parameters}
15
15
};
16
16
17
17
pub fn setup(
···
23
23
window.hide().unwrap();
24
24
25
25
let win_handle = window.clone();
26
+
26
27
window.on_window_event(move |event| match event {
27
28
WindowEvent::CloseRequested { api, .. } => {
28
29
api.prevent_close();
29
-
30
-
win_handle.hide().unwrap();
31
-
win_handle.emit("hide-window", ()).unwrap();
30
+
win_handle.emit("prompt_to_close", ()).unwrap();
31
+
}
32
+
WindowEvent::Resized(_) => {
33
+
let minimised = win_handle.is_minimized().unwrap();
34
+
if minimised{
35
+
win_handle.hide().unwrap();
36
+
win_handle.emit("hide-window", ()).unwrap();
37
+
win_handle.unminimize().unwrap();
38
+
}
32
39
}
33
40
_ => {}
34
41
});
···
82
89
addrs.push(msg);
83
90
}
84
91
92
+
if message.address == "/avatar/change".to_owned(){
93
+
*addrs = vrchat_builtin_parameters::get_read_addresses();
94
+
95
+
// TODO: Read avatar paramaters from file
96
+
}
97
+
85
98
runtime_sender
86
99
.send(RuntimeCommand::OSCMessage(message))
87
100
.unwrap();
···
89
102
});
90
103
91
104
// TODO: Run tabs in seperate threads (really not looking forward to this... thanks rust)
92
-
// TODO: Support multiple flow inputs on a node
93
105
94
106
tokio::spawn(async move {
95
107
let mut tabs: HashMap<String, RuntimeNodeTree> = HashMap::new();
+16
-6
src-tauri/src/utils/config.rs
+16
-6
src-tauri/src/utils/config.rs
···
3
3
fs::File,
4
4
io::{Read, Write},
5
5
path::PathBuf,
6
-
sync::Mutex,
6
+
sync::{Mutex, MutexGuard},
7
7
};
8
8
9
+
use chrono::Utc;
9
10
use flate2::{read::GzDecoder, write::GzEncoder, Compression};
10
11
use serde::{Deserialize, Serialize};
11
12
···
14
15
#[derive(Clone, Serialize, Deserialize, Debug)]
15
16
pub struct ConfigValues {
16
17
#[serde(default)]
17
-
pub loaded_tabs: HashMap<String, (Vec<Node>, String, Option<String>)>,
18
+
pub loaded_tabs: HashMap<String, (Vec<Node>, String, Option<String>, bool)>,
18
19
19
20
#[serde(default)]
20
21
pub hide_editor_on_start: bool,
···
39
40
40
41
let json: ConfigValues = serde_json::from_str(&json_string).unwrap();
41
42
42
-
dbg!(&json);
43
-
44
43
Config {
45
44
store: Mutex::new(json),
46
45
path: path,
···
48
47
}
49
48
50
49
pub fn save(&self) {
51
-
let dat = serde_json::to_string(&self.store.lock().unwrap().clone()).unwrap();
52
-
dbg!(&dat);
50
+
let mut dat = self.store.lock().unwrap();
51
+
52
+
let dat = serde_json::to_string(&*dat).unwrap();
53
+
54
+
let file = File::create(&self.path).unwrap();
55
+
let mut encoder = GzEncoder::new(file, Compression::default());
56
+
57
+
encoder.write_all(dat.as_bytes()).unwrap();
58
+
encoder.finish().unwrap();
59
+
}
60
+
61
+
pub fn save_prelocked(&self, mut dat: MutexGuard<'_, ConfigValues>) {
62
+
let dat = serde_json::to_string(&*dat).unwrap();
53
63
54
64
let file = File::create(&self.path).unwrap();
55
65
let mut encoder = GzEncoder::new(file, Compression::default());
+1
src-tauri/src/utils/mod.rs
+1
src-tauri/src/utils/mod.rs
+315
src-tauri/src/utils/vrchat_builtin_parameters.rs
+315
src-tauri/src/utils/vrchat_builtin_parameters.rs
···
1
+
use crate::{osc::OSCMessage, structs::parameter_types::ParameterType};
2
+
3
+
pub fn get_read_addresses() -> Vec<OSCMessage>{
4
+
vec![
5
+
// Avatar Parameters
6
+
OSCMessage {
7
+
address: "/avatar/change".into(),
8
+
values: vec![ ParameterType::String("".into()) ]
9
+
},
10
+
11
+
OSCMessage {
12
+
address: "/avatar/parameters/VRCEmote".into(),
13
+
values: vec![ ParameterType::Int(0) ]
14
+
},
15
+
OSCMessage {
16
+
address: "/avatar/parameters/VRCFaceBlendV".into(),
17
+
values: vec![ ParameterType::Float(0.0) ]
18
+
},
19
+
OSCMessage {
20
+
address: "/avatar/parameters/VRCFaceBlendH".into(),
21
+
values: vec![ ParameterType::Float(0.0) ]
22
+
},
23
+
OSCMessage {
24
+
address: "/avatar/parameters/PreviewMode".into(),
25
+
values: vec![ ParameterType::Int(0) ]
26
+
},
27
+
OSCMessage {
28
+
address: "/avatar/parameters/IsAnimatorEnabled".into(),
29
+
values: vec![ ParameterType::Boolean(true) ]
30
+
},
31
+
32
+
OSCMessage {
33
+
address: "/avatar/parameters/GestureRightWeight".into(),
34
+
values: vec![ ParameterType::Float(0.0) ]
35
+
},
36
+
OSCMessage {
37
+
address: "/avatar/parameters/GestureLeftWeight".into(),
38
+
values: vec![ ParameterType::Float(0.0) ]
39
+
},
40
+
OSCMessage {
41
+
address: "/avatar/parameters/GestureRight".into(),
42
+
values: vec![ ParameterType::Int(0) ]
43
+
},
44
+
OSCMessage {
45
+
address: "/avatar/parameters/GestureLeft".into(),
46
+
values: vec![ ParameterType::Int(0) ]
47
+
},
48
+
49
+
OSCMessage {
50
+
address: "/avatar/parameters/ScaleModified".into(),
51
+
values: vec![ ParameterType::Boolean(true) ]
52
+
},
53
+
OSCMessage {
54
+
address: "/avatar/parameters/ScaleFactor".into(),
55
+
values: vec![ ParameterType::Float(1.0) ]
56
+
},
57
+
OSCMessage {
58
+
address: "/avatar/parameters/ScaleFactorInverse".into(),
59
+
values: vec![ ParameterType::Float(1.0) ]
60
+
},
61
+
OSCMessage {
62
+
address: "/avatar/parameters/EyeHeightAsPercent".into(),
63
+
values: vec![ ParameterType::Float(1.0) ]
64
+
},
65
+
66
+
OSCMessage {
67
+
address: "/avatar/parameters/Viseme".into(),
68
+
values: vec![ ParameterType::Int(0) ]
69
+
},
70
+
OSCMessage {
71
+
address: "/avatar/parameters/Voice".into(),
72
+
values: vec![ ParameterType::Float(0.0) ]
73
+
},
74
+
OSCMessage {
75
+
address: "/avatar/parameters/Earmuffs".into(),
76
+
values: vec![ ParameterType::Boolean(true) ]
77
+
},
78
+
OSCMessage {
79
+
address: "/avatar/parameters/MuteSelf".into(),
80
+
values: vec![ ParameterType::Boolean(true) ]
81
+
},
82
+
83
+
OSCMessage {
84
+
address: "/avatar/parameters/AFK".into(),
85
+
values: vec![ ParameterType::Boolean(true) ]
86
+
},
87
+
OSCMessage {
88
+
address: "/avatar/parameters/InStation".into(),
89
+
values: vec![ ParameterType::Boolean(true) ]
90
+
},
91
+
OSCMessage {
92
+
address: "/avatar/parameters/Seated".into(),
93
+
values: vec![ ParameterType::Boolean(true) ]
94
+
},
95
+
OSCMessage {
96
+
address: "/avatar/parameters/VRMode".into(),
97
+
values: vec![ ParameterType::Int(0) ]
98
+
},
99
+
OSCMessage {
100
+
address: "/avatar/parameters/TrackingType".into(),
101
+
values: vec![ ParameterType::Int(0) ]
102
+
},
103
+
104
+
OSCMessage {
105
+
address: "/avatar/parameters/Grounded".into(),
106
+
values: vec![ ParameterType::Boolean(true) ]
107
+
},
108
+
OSCMessage {
109
+
address: "/avatar/parameters/Upright".into(),
110
+
values: vec![ ParameterType::Float(1.0) ]
111
+
},
112
+
OSCMessage {
113
+
address: "/avatar/parameters/AngularY".into(),
114
+
values: vec![ ParameterType::Float(1.0) ]
115
+
},
116
+
OSCMessage {
117
+
address: "/avatar/parameters/VelocityX".into(),
118
+
values: vec![ ParameterType::Float(1.0) ]
119
+
},
120
+
OSCMessage {
121
+
address: "/avatar/parameters/VelocityY".into(),
122
+
values: vec![ ParameterType::Float(1.0) ]
123
+
},
124
+
OSCMessage {
125
+
address: "/avatar/parameters/VelocityZ".into(),
126
+
values: vec![ ParameterType::Float(1.0) ]
127
+
},
128
+
OSCMessage {
129
+
address: "/avatar/parameters/VelocityMagnitude".into(),
130
+
values: vec![ ParameterType::Float(1.0) ]
131
+
},
132
+
133
+
// User Camera
134
+
OSCMessage {
135
+
address: "/usercamera/Mode".into(),
136
+
values: vec![ ParameterType::Int(0) ]
137
+
},
138
+
OSCMessage {
139
+
address: "/usercamera/Pose".into(),
140
+
values: vec![
141
+
ParameterType::Float(0.0),
142
+
ParameterType::Float(0.0),
143
+
ParameterType::Float(0.0),
144
+
145
+
ParameterType::Float(0.0),
146
+
ParameterType::Float(0.0),
147
+
ParameterType::Float(0.0)
148
+
]
149
+
},
150
+
151
+
OSCMessage {
152
+
address: "/usercamera/ShowUIInCamera".into(),
153
+
values: vec![ ParameterType::Boolean(true) ]
154
+
},
155
+
OSCMessage {
156
+
address: "/usercamera/LocalPlayer".into(),
157
+
values: vec![ ParameterType::Boolean(true) ]
158
+
},
159
+
OSCMessage {
160
+
address: "/usercamera/RemotePlayer".into(),
161
+
values: vec![ ParameterType::Boolean(true) ]
162
+
},
163
+
OSCMessage {
164
+
address: "/usercamera/Environment".into(),
165
+
values: vec![ ParameterType::Boolean(true) ]
166
+
},
167
+
OSCMessage {
168
+
address: "/usercamera/GreenScreen".into(),
169
+
values: vec![ ParameterType::Boolean(true) ]
170
+
},
171
+
OSCMessage {
172
+
address: "/usercamera/Lock".into(),
173
+
values: vec![ ParameterType::Boolean(true) ]
174
+
},
175
+
OSCMessage {
176
+
address: "/usercamera/SmoothMovement".into(),
177
+
values: vec![ ParameterType::Boolean(true) ]
178
+
},
179
+
OSCMessage {
180
+
address: "/usercamera/LookAtMe".into(),
181
+
values: vec![ ParameterType::Boolean(true) ]
182
+
},
183
+
OSCMessage {
184
+
address: "/usercamera/AutoLevelRoll".into(),
185
+
values: vec![ ParameterType::Boolean(true) ]
186
+
},
187
+
OSCMessage {
188
+
address: "/usercamera/AutoLevelPitch".into(),
189
+
values: vec![ ParameterType::Boolean(true) ]
190
+
},
191
+
OSCMessage {
192
+
address: "/usercamera/Flying".into(),
193
+
values: vec![ ParameterType::Boolean(true) ]
194
+
},
195
+
OSCMessage {
196
+
address: "/usercamera/TriggerTakesPhotos".into(),
197
+
values: vec![ ParameterType::Boolean(true) ]
198
+
},
199
+
OSCMessage {
200
+
address: "/usercamera/DollyPathsStayVisible".into(),
201
+
values: vec![ ParameterType::Boolean(true) ]
202
+
},
203
+
OSCMessage {
204
+
address: "/usercamera/AudioFromCamera".into(),
205
+
values: vec![ ParameterType::Boolean(true) ]
206
+
},
207
+
OSCMessage {
208
+
address: "/usercamera/ShowFocus".into(),
209
+
values: vec![ ParameterType::Boolean(true) ]
210
+
},
211
+
OSCMessage {
212
+
address: "/usercamera/Streaming".into(),
213
+
values: vec![ ParameterType::Boolean(true) ]
214
+
},
215
+
OSCMessage {
216
+
address: "/usercamera/RollWhileFlying".into(),
217
+
values: vec![ ParameterType::Boolean(true) ]
218
+
},
219
+
OSCMessage {
220
+
address: "/usercamera/OrientationIsLandscape".into(),
221
+
values: vec![ ParameterType::Boolean(true) ]
222
+
},
223
+
224
+
OSCMessage {
225
+
address: "/usercamera/Zoom".into(),
226
+
values: vec![ ParameterType::Float(0.0) ]
227
+
},
228
+
OSCMessage {
229
+
address: "/usercamera/Exposure".into(),
230
+
values: vec![ ParameterType::Float(0.0) ]
231
+
},
232
+
OSCMessage {
233
+
address: "/usercamera/Aperture".into(),
234
+
values: vec![ ParameterType::Float(0.0) ]
235
+
},
236
+
OSCMessage {
237
+
address: "/usercamera/Hue".into(),
238
+
values: vec![ ParameterType::Float(0.0) ]
239
+
},
240
+
OSCMessage {
241
+
address: "/usercamera/Saturation".into(),
242
+
values: vec![ ParameterType::Float(0.0) ]
243
+
},
244
+
OSCMessage {
245
+
address: "/usercamera/Lightness".into(),
246
+
values: vec![ ParameterType::Float(0.0) ]
247
+
},
248
+
OSCMessage {
249
+
address: "/usercamera/LookAtMeXOffset".into(),
250
+
values: vec![ ParameterType::Float(0.0) ]
251
+
},
252
+
OSCMessage {
253
+
address: "/usercamera/LookAtMeYOffset".into(),
254
+
values: vec![ ParameterType::Float(0.0) ]
255
+
},
256
+
OSCMessage {
257
+
address: "/usercamera/FlySpeed".into(),
258
+
values: vec![ ParameterType::Float(0.0) ]
259
+
},
260
+
OSCMessage {
261
+
address: "/usercamera/TurnSpeed".into(),
262
+
values: vec![ ParameterType::Float(0.0) ]
263
+
},
264
+
OSCMessage {
265
+
address: "/usercamera/SmoothStrength".into(),
266
+
values: vec![ ParameterType::Float(0.0) ]
267
+
},
268
+
OSCMessage {
269
+
address: "/usercamera/PhotoRate".into(),
270
+
values: vec![ ParameterType::Float(0.0) ]
271
+
},
272
+
OSCMessage {
273
+
address: "/usercamera/Duration".into(),
274
+
values: vec![ ParameterType::Float(0.0) ]
275
+
},
276
+
277
+
// Trackers
278
+
OSCMessage {
279
+
address: "/tracking/vrsystem/head/pose".into(),
280
+
values: vec![
281
+
ParameterType::Float(0.0),
282
+
ParameterType::Float(0.0),
283
+
ParameterType::Float(0.0),
284
+
285
+
ParameterType::Float(0.0),
286
+
ParameterType::Float(0.0),
287
+
ParameterType::Float(0.0),
288
+
]
289
+
},
290
+
OSCMessage {
291
+
address: "/tracking/vrsystem/rightwrist/pose".into(),
292
+
values: vec![
293
+
ParameterType::Float(0.0),
294
+
ParameterType::Float(0.0),
295
+
ParameterType::Float(0.0),
296
+
297
+
ParameterType::Float(0.0),
298
+
ParameterType::Float(0.0),
299
+
ParameterType::Float(0.0),
300
+
]
301
+
},
302
+
OSCMessage {
303
+
address: "/tracking/vrsystem/leftwrist/pose".into(),
304
+
values: vec![
305
+
ParameterType::Float(0.0),
306
+
ParameterType::Float(0.0),
307
+
ParameterType::Float(0.0),
308
+
309
+
ParameterType::Float(0.0),
310
+
ParameterType::Float(0.0),
311
+
ParameterType::Float(0.0),
312
+
]
313
+
},
314
+
]
315
+
}