vmc 0.5.1

Implementation of Virtual Motion Capture protocol for virtual avatar tracking.
Documentation
use std::collections::HashMap;

use futures_util::StreamExt;
use vmc::{Message, ModelState};

#[tokio::main]
async fn main() -> vmc::Result<()> {
	let mut socket = vmc::marionette!("127.0.0.1:39539").await?;
	let mut blendshapes = HashMap::new();
	while let Some(packet) = socket.next().await {
		let (packet, _) = packet?;
		for message in vmc::parse(packet)? {
			match message {
				Message::BoneTransform(transform) => {
					println!("\tTransform bone: {} (pos {:?}; rot {:?})", transform.bone, transform.position, transform.rotation)
				}
				Message::DeviceTransform(transform) => {
					println!("\tTransform device ({:?}): {} (pos {:?}; rot {:?})", transform.device, transform.joint, transform.position, transform.rotation)
				}
				Message::RootTransform(transform) => {
					println!("\tTransform root: (pos {:?}; rot {:?})", transform.position, transform.rotation)
				}
				Message::State(t) => match t.model_state {
					ModelState::Loaded => println!("\tModel is loaded."),
					ModelState::NotLoaded => println!("\tModel is not yet loaded.")
				},
				Message::BlendShape(blend) => {
					blendshapes.insert(blend.key, blend.value);
				}
				Message::ApplyBlendShapes => {
					if !blendshapes.is_empty() {
						println!(
							"\tBlend shape: {}",
							blendshapes
								.iter()
								.filter(|b| b.1 > &0.)
								.map(|b| format!("{} x{:.02}", b.0, b.1))
								.collect::<Vec<_>>()
								.join(", ")
						);
						blendshapes.clear();
					}
				}
				Message::Time(t) => println!("Render all (time: {})", t.0)
			}
		}
	}

	Ok(())
}