first two stages of write-to-file complete. waiting on plans for dependency element data (meshes)
This commit is contained in:
parent
f38839557b
commit
0455167d78
|
@ -13,6 +13,7 @@ use thiserror::Error;
|
|||
pub struct StructureAsset {
|
||||
pub layout: StringTree,
|
||||
pub default_pose_positions: HashMap<String, Transform>,
|
||||
pub element_data: HashMap<String, String>,
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
|
@ -94,6 +95,8 @@ pub mod serialization {
|
|||
|
||||
pub mod version_1 {
|
||||
|
||||
use bevy::transform::components::Transform;
|
||||
|
||||
use crate::vvedit::s_string_tree::StringTree;
|
||||
|
||||
use super::super::super::super::{StructureAsset, StructureLoadError};
|
||||
|
@ -103,6 +106,7 @@ pub mod serialization {
|
|||
Err(StructureLoadError::FileDataInvalid("".to_string()))
|
||||
}
|
||||
pub fn save(asset: &StructureAsset) -> Option<Vec<u8>> {
|
||||
const NEWLINE: &str = "\n";
|
||||
// FILE STRUCTURE:
|
||||
// FIRST, STRING TREE
|
||||
// STRING TREE IS STORED AS LISTS OF STRINGS - FIRST STRING IS PARENT
|
||||
|
@ -112,52 +116,81 @@ pub mod serialization {
|
|||
// LIST OF NODE IDS BY STRING NAME, FOLLOWED BY TRANSFORM DATA, FOLLOWED BY NONSTANDARD DATA (MESH BEING RENDERED AT THIS TRANSFORM)
|
||||
|
||||
let mut data: String = "".into();
|
||||
let mut is_first = true;
|
||||
data += "\n";
|
||||
let mut to_process = Vec::<String>::new();
|
||||
for each in &asset.layout.root {
|
||||
if let Some(name) = each.name_of() {
|
||||
//
|
||||
if !is_first {
|
||||
data += "|";
|
||||
// v STRING TREE (tree that defines shape/structure of it)
|
||||
{
|
||||
let mut is_first = true;
|
||||
data += NEWLINE;
|
||||
let mut to_process = Vec::<String>::new();
|
||||
for each in &asset.layout.root {
|
||||
if let Some(name) = each.name_of() {
|
||||
//
|
||||
if !is_first {
|
||||
data += "|";
|
||||
} else {
|
||||
is_first = false;
|
||||
}
|
||||
data += name.clone().as_str();
|
||||
} else {
|
||||
is_first = false;
|
||||
return None;
|
||||
}
|
||||
data += name.clone().as_str();
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
if let Some(children) = each.children() {
|
||||
for each in children {
|
||||
to_process.push(each);
|
||||
}
|
||||
}
|
||||
}
|
||||
// v HELPER FUNCTION
|
||||
fn save_child(element: &String, tree: &StringTree, data: &mut String) {
|
||||
if let Some(children) = tree.children_of(element) {
|
||||
if children.is_empty() {
|
||||
return;
|
||||
}
|
||||
*data += "\n";
|
||||
*data += element.as_str();
|
||||
for each in children {
|
||||
*data += "|";
|
||||
*data += each.as_str();
|
||||
}
|
||||
}
|
||||
}
|
||||
// ^ HELPER FUNCTION
|
||||
while !to_process.is_empty() {
|
||||
if let Some(next) = to_process.pop() {
|
||||
save_child(&next, &asset.layout, &mut data);
|
||||
if let Some(children) = asset.layout.children_of(&next) {
|
||||
if let Some(children) = each.children() {
|
||||
for each in children {
|
||||
to_process.push(each);
|
||||
}
|
||||
}
|
||||
}
|
||||
// v HELPER FUNCTION
|
||||
fn save_child(element: &String, tree: &StringTree, data: &mut String) {
|
||||
if let Some(children) = tree.children_of(element) {
|
||||
if children.is_empty() {
|
||||
return;
|
||||
}
|
||||
*data += NEWLINE;
|
||||
*data += element.as_str();
|
||||
for each in children {
|
||||
*data += "|";
|
||||
*data += each.as_str();
|
||||
}
|
||||
}
|
||||
}
|
||||
// ^ HELPER FUNCTION
|
||||
while !to_process.is_empty() {
|
||||
if let Some(next) = to_process.pop() {
|
||||
save_child(&next, &asset.layout, &mut data);
|
||||
if let Some(children) = asset.layout.children_of(&next) {
|
||||
for each in children {
|
||||
to_process.push(each);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// ^ STRING TREE (tree that defines shape/structure of it)
|
||||
data += NEWLINE;
|
||||
data += "||";
|
||||
// v NODE IDS BY STRING NAME, FOLLOWED BY TRANSFORM DATA, FOLLOWED BY NONSTANDARD DATA
|
||||
{
|
||||
// error if bool is true
|
||||
fn transform_to_file(pos: &Transform, data: &mut String) -> bool {
|
||||
let [x, y, z] = pos.translation.to_array();
|
||||
*data += format!("{x}|{y}|{z}").as_str();
|
||||
let [x, y, z] = pos.scale.to_array();
|
||||
*data += format!("|{x}|{y}|{z}").as_str();
|
||||
let [x, y, z, w] = pos.rotation.to_array();
|
||||
*data += format!("|{x}|{y}|{z}|{w}").as_str();
|
||||
true
|
||||
}
|
||||
for (name, pos) in &asset.default_pose_positions {
|
||||
data += NEWLINE;
|
||||
data += format!("{name}|").as_str();
|
||||
if !transform_to_file(pos, &mut data) {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
}
|
||||
// ^ NODE IDS BY STRING NAME, FOLLOWED BY TRANSFORM DATA, FOLLOWED BY NONSTANDARD DATA
|
||||
data += NEWLINE;
|
||||
data += "||";
|
||||
Some(data.as_bytes().to_vec())
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue