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 struct StructureAsset {
|
||||||
pub layout: StringTree,
|
pub layout: StringTree,
|
||||||
pub default_pose_positions: HashMap<String, Transform>,
|
pub default_pose_positions: HashMap<String, Transform>,
|
||||||
|
pub element_data: HashMap<String, String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
@ -94,6 +95,8 @@ pub mod serialization {
|
||||||
|
|
||||||
pub mod version_1 {
|
pub mod version_1 {
|
||||||
|
|
||||||
|
use bevy::transform::components::Transform;
|
||||||
|
|
||||||
use crate::vvedit::s_string_tree::StringTree;
|
use crate::vvedit::s_string_tree::StringTree;
|
||||||
|
|
||||||
use super::super::super::super::{StructureAsset, StructureLoadError};
|
use super::super::super::super::{StructureAsset, StructureLoadError};
|
||||||
|
@ -103,6 +106,7 @@ pub mod serialization {
|
||||||
Err(StructureLoadError::FileDataInvalid("".to_string()))
|
Err(StructureLoadError::FileDataInvalid("".to_string()))
|
||||||
}
|
}
|
||||||
pub fn save(asset: &StructureAsset) -> Option<Vec<u8>> {
|
pub fn save(asset: &StructureAsset) -> Option<Vec<u8>> {
|
||||||
|
const NEWLINE: &str = "\n";
|
||||||
// FILE STRUCTURE:
|
// FILE STRUCTURE:
|
||||||
// FIRST, STRING TREE
|
// FIRST, STRING TREE
|
||||||
// STRING TREE IS STORED AS LISTS OF STRINGS - FIRST STRING IS PARENT
|
// 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)
|
// 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 data: String = "".into();
|
||||||
let mut is_first = true;
|
// v STRING TREE (tree that defines shape/structure of it)
|
||||||
data += "\n";
|
{
|
||||||
let mut to_process = Vec::<String>::new();
|
let mut is_first = true;
|
||||||
for each in &asset.layout.root {
|
data += NEWLINE;
|
||||||
if let Some(name) = each.name_of() {
|
let mut to_process = Vec::<String>::new();
|
||||||
//
|
for each in &asset.layout.root {
|
||||||
if !is_first {
|
if let Some(name) = each.name_of() {
|
||||||
data += "|";
|
//
|
||||||
|
if !is_first {
|
||||||
|
data += "|";
|
||||||
|
} else {
|
||||||
|
is_first = false;
|
||||||
|
}
|
||||||
|
data += name.clone().as_str();
|
||||||
} else {
|
} else {
|
||||||
is_first = false;
|
return None;
|
||||||
}
|
}
|
||||||
data += name.clone().as_str();
|
if let Some(children) = each.children() {
|
||||||
} 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) {
|
|
||||||
for each in children {
|
for each in children {
|
||||||
to_process.push(each);
|
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())
|
Some(data.as_bytes().to_vec())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue