Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fn parse(value: &gltf::Value, ty: u32) -> Result<yagl::Data, ()> {
- use gltf::Value;
- use yagl::*;
- fn try_unwrap<T>(option: Option<T>) -> Result<T, ()> {
- match option {
- Some(item) => Ok(item),
- None => Err(()),
- }
- }
- let data = match ty {
- FLOAT => {
- match value.as_f64() {
- Some(v) => Data::F32(v as f32),
- None => return Err(()),
- }
- }
- FLOAT_MAT2 => {
- match value {
- &Value::Array(ref array) if array.len() >= 2 * 2 => {
- Data::Mat2([[try_unwrap(array[0].as_f64())? as f32,
- try_unwrap(array[1].as_f64())? as f32],
- [try_unwrap(array[2].as_f64())? as f32,
- try_unwrap(array[3].as_f64())? as f32]])
- }
- _ => return Err(()),
- }
- }
- FLOAT_MAT3 => {
- match value {
- &Value::Array(ref array) if array.len() >= 3 * 3 => {
- Data::Mat3([[try_unwrap(array[0].as_f64())? as f32,
- try_unwrap(array[1].as_f64())? as f32,
- try_unwrap(array[2].as_f64())? as f32],
- [try_unwrap(array[3].as_f64())? as f32,
- try_unwrap(array[4].as_f64())? as f32,
- try_unwrap(array[5].as_f64())? as f32],
- [try_unwrap(array[6].as_f64())? as f32,
- try_unwrap(array[7].as_f64())? as f32,
- try_unwrap(array[8].as_f64())? as f32]])
- }
- _ => return Err(()),
- }
- }
- FLOAT_MAT4 => {
- match value {
- &Value::Array(ref array) if array.len() >= 4 * 4 => {
- Data::Mat4([[try_unwrap(array[0].as_f64())? as f32,
- try_unwrap(array[1].as_f64())? as f32,
- try_unwrap(array[2].as_f64())? as f32,
- try_unwrap(array[3].as_f64())? as f32],
- [try_unwrap(array[4].as_f64())? as f32,
- try_unwrap(array[5].as_f64())? as f32,
- try_unwrap(array[6].as_f64())? as f32,
- try_unwrap(array[7].as_f64())? as f32],
- [try_unwrap(array[8].as_f64())? as f32,
- try_unwrap(array[9].as_f64())? as f32,
- try_unwrap(array[10].as_f64())? as f32,
- try_unwrap(array[11].as_f64())? as f32],
- [try_unwrap(array[12].as_f64())? as f32,
- try_unwrap(array[13].as_f64())? as f32,
- try_unwrap(array[14].as_f64())? as f32,
- try_unwrap(array[15].as_f64())? as f32]])
- }
- _ => return Err(()),
- }
- }
- FLOAT_VEC2 => {
- match value {
- &Value::Array(ref array) if array.len() >= 3 => {
- Data::Vec2([try_unwrap(array[0].as_f64())? as f32,
- try_unwrap(array[1].as_f64())? as f32])
- }
- _ => return Err(()),
- }
- }
- FLOAT_VEC3 => {
- match value {
- &Value::Array(ref array) if array.len() >= 3 => {
- Data::Vec3([try_unwrap(array[0].as_f64())? as f32,
- try_unwrap(array[1].as_f64())? as f32,
- try_unwrap(array[2].as_f64())? as f32])
- }
- _ => return Err(()),
- }
- }
- FLOAT_VEC4 => {
- match value {
- &Value::Array(ref array) if array.len() >= 4 => {
- Data::Vec4([try_unwrap(array[0].as_f64())? as f32,
- try_unwrap(array[1].as_f64())? as f32,
- try_unwrap(array[2].as_f64())? as f32,
- try_unwrap(array[3].as_f64())? as f32])
- }
- _ => return Err(()),
- }
- }
- _ => {
- println!("parse() implementation missing for {}", ty);
- panic!();
- }
- };
- Ok(data)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement