#[macro_use]
extern crate failure;
#[macro_use]
extern crate serde_derive;
pub use self::combine_indices::CreateSingleIndexConfig;
pub use self::export::*;
pub use crate::bounding_box::BoundingBox;
use crate::custom_property::CustomProperty;
pub use crate::material::PrincipledBSDF;
use crate::serde::serialize_hashmap_deterministic;
pub use crate::vertex_attributes::{
BoneInfluence, MultiIndexedVertexAttributes, SingleIndexedVertexAttributes, Vertex,
VertexAttribute,
};
pub use material::{Channel, MaterialInput};
use std::collections::HashMap;
mod bone;
mod bounding_box;
mod combine_indices;
mod custom_property;
mod export;
mod face_tangents;
mod interleave;
mod material;
mod serde;
mod triangulate;
mod vertex_attributes;
mod y_up;
mod create_mesh;
#[cfg(test)]
mod test_utils;
#[derive(Debug, Fail)]
pub enum BlenderError {
#[fail(
display = "There was an issue while exporting meshes: Blender stderr output: {}",
_0
)]
Stderr(String),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
#[serde(deny_unknown_fields)]
pub struct BlenderMesh {
name: String,
armature_name: Option<String>,
bounding_box: BoundingBox,
#[serde(alias = "attribs")]
multi_indexed_vertex_attributes: MultiIndexedVertexAttributes,
#[serde(default, serialize_with = "serialize_hashmap_deterministic")]
materials: HashMap<String, PrincipledBSDF>,
#[serde(default, serialize_with = "serialize_hashmap_deterministic")]
custom_properties: HashMap<String, CustomProperty>,
}
impl BlenderMesh {
pub fn armature_name(&self) -> Option<&String> {
self.armature_name.as_ref()
}
pub fn set_armature_name(&mut self, armature_name: Option<String>) {
self.armature_name = armature_name;
}
pub fn materials(&self) -> &HashMap<String, PrincipledBSDF> {
&self.materials
}
pub fn materials_mut(&mut self) -> &mut HashMap<String, PrincipledBSDF> {
&mut self.materials
}
pub fn custom_properties(&self) -> &HashMap<String, CustomProperty> {
&self.custom_properties
}
pub fn bounding_box(&self) -> BoundingBox {
self.bounding_box
}
pub fn set_bounding_box(&mut self, bounding_box: BoundingBox) {
self.bounding_box = bounding_box;
}
pub fn name(&self) -> &String {
&self.name
}
pub fn set_name(&mut self, name: String) {
self.name = name;
}
}
#[cfg(test)]
#[macro_export]
#[cfg(test)]
macro_rules! concat_vecs {
( $( $vec:expr),* ) => {
{
let mut concatenated_vec = Vec::new();
$(
concatenated_vec.append(&mut $vec.clone());
)*
concatenated_vec
}
}
}
#[cfg(test)]
fn indexed(
attribute: crate::vertex_attributes::VertexAttribute<f32>,
) -> crate::vertex_attributes::IndexedAttribute {
crate::vertex_attributes::IndexedAttribute {
indices: vec![],
attribute,
}
}