A multiplayer VR framework w/voice chat
1// NOTE: Very WIP, Does not work!!
2
3use anyhow::bail;
4use bevy::{prelude::*, transform::components::Transform};
5use unity_asset::environment::{Environment, EnvironmentObjectRef};
6use unity_asset_binary::unity_version::UnityVersion;
7use unity_asset_decode::mesh::MeshParser;
8
9use crate::{BevyObject, BevyObjectData, unity::{component::{Component, mesh_renderer::MeshRenderer, transform::into_bevy_transform}, unity_value::try_unity_mesh_to_bevy}};
10
11mod component;
12mod unity_value;
13
14#[derive(Debug)]
15pub struct UnityGameObject{
16 pub name: String,
17 pub active: bool,
18
19 pub transform: Transform,
20 pub mesh_renderer: Option<MeshRenderer>,
21 pub mesh_filter: Option<Mesh>,
22}
23
24pub fn load( path: &'static str ) -> anyhow::Result<Vec<BevyObject>>{
25 let mesh_parser = MeshParser::new(UnityVersion::parse_version("2020.3.12f1").unwrap());
26
27 let mut env = Environment::new();
28 env.load(path)?;
29
30 let mut gameobjects = vec![];
31
32 for obj in env.objects(){
33 match obj{
34 EnvironmentObjectRef::Binary(v) => {
35 if v.object.class_id() == 1{
36 let obj = v.object.read()?;
37 let go = obj.as_gameobject().unwrap();
38
39 let mut components: Vec<Box<dyn Component>> = vec![];
40
41 let mut transform = None;
42 let mut mesh_renderer = None;
43 let mut mesh_filter = None;
44
45 let comps = obj.get("m_Component").unwrap().as_array().unwrap();
46
47 for comp in comps{
48 let obj = comp.as_object().unwrap().get("component").unwrap();
49 let path_id = obj.as_object().unwrap().get("m_PathID").unwrap().as_i64().unwrap();
50
51 let comp = env.find_binary_object(path_id).unwrap();
52 let comp = comp.read().unwrap();
53
54 match comp.class_id(){
55 4 => transform = Some(into_bevy_transform(comp)), // Normal Transform
56 224 => transform = Some(into_bevy_transform(comp)), // Rect Transform (gonna just treat it as normal)
57
58 23 => mesh_renderer = Some(MeshRenderer::from(comp)),
59 33 => {
60 let mesh = comp.get("m_Mesh").unwrap();
61 let path_id = mesh.as_object().unwrap().get("m_PathID").unwrap().as_i64().unwrap();
62
63 let mesh = env.find_binary_object(path_id).unwrap();
64 let mesh_obj = mesh.read().unwrap();
65
66 if let Some(mesh) = try_unity_mesh_to_bevy(mesh_obj, &mesh_parser){
67 mesh_filter = Some(mesh);
68 } else{
69 println!("[WARN] Failed to load mesh for: {}", go.name);
70 }
71 },
72
73 _ => {}
74 }
75 }
76
77 if transform.is_none(){ bail!("Cannot find transform for object {}", go.name); }
78
79 let gameobject = UnityGameObject {
80 name: go.name,
81 active: go.active,
82
83 transform: transform.unwrap(),
84 mesh_renderer,
85 mesh_filter
86 };
87
88 gameobjects.push(gameobject);
89 break;
90 }
91 },
92 _ => {}
93 }
94 }
95
96 let mut objs = vec![];
97
98 for go in gameobjects{
99 if go.active{
100 if let Some(mesh) = go.mesh_filter{
101 objs.push(BevyObject {
102 name: go.name,
103 transform: go.transform,
104 data: BevyObjectData::Mesh(mesh)
105 });
106 }
107 }
108 }
109
110 Ok(objs)
111}