Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.42 KB | None | 0 0
  1. fn parse(value: &gltf::Value, ty: u32) -> Result<yagl::Data, ()> {
  2. use gltf::Value;
  3. use yagl::*;
  4. fn try_unwrap<T>(option: Option<T>) -> Result<T, ()> {
  5. match option {
  6. Some(item) => Ok(item),
  7. None => Err(()),
  8. }
  9. }
  10.  
  11. let data = match ty {
  12. FLOAT => {
  13. match value.as_f64() {
  14. Some(v) => Data::F32(v as f32),
  15. None => return Err(()),
  16. }
  17. }
  18. FLOAT_MAT2 => {
  19. match value {
  20. &Value::Array(ref array) if array.len() >= 2 * 2 => {
  21. Data::Mat2([[try_unwrap(array[0].as_f64())? as f32,
  22. try_unwrap(array[1].as_f64())? as f32],
  23. [try_unwrap(array[2].as_f64())? as f32,
  24. try_unwrap(array[3].as_f64())? as f32]])
  25. }
  26. _ => return Err(()),
  27. }
  28. }
  29. FLOAT_MAT3 => {
  30. match value {
  31. &Value::Array(ref array) if array.len() >= 3 * 3 => {
  32. Data::Mat3([[try_unwrap(array[0].as_f64())? as f32,
  33. try_unwrap(array[1].as_f64())? as f32,
  34. try_unwrap(array[2].as_f64())? as f32],
  35. [try_unwrap(array[3].as_f64())? as f32,
  36. try_unwrap(array[4].as_f64())? as f32,
  37. try_unwrap(array[5].as_f64())? as f32],
  38. [try_unwrap(array[6].as_f64())? as f32,
  39. try_unwrap(array[7].as_f64())? as f32,
  40. try_unwrap(array[8].as_f64())? as f32]])
  41. }
  42. _ => return Err(()),
  43. }
  44. }
  45. FLOAT_MAT4 => {
  46. match value {
  47. &Value::Array(ref array) if array.len() >= 4 * 4 => {
  48. Data::Mat4([[try_unwrap(array[0].as_f64())? as f32,
  49. try_unwrap(array[1].as_f64())? as f32,
  50. try_unwrap(array[2].as_f64())? as f32,
  51. try_unwrap(array[3].as_f64())? as f32],
  52. [try_unwrap(array[4].as_f64())? as f32,
  53. try_unwrap(array[5].as_f64())? as f32,
  54. try_unwrap(array[6].as_f64())? as f32,
  55. try_unwrap(array[7].as_f64())? as f32],
  56. [try_unwrap(array[8].as_f64())? as f32,
  57. try_unwrap(array[9].as_f64())? as f32,
  58. try_unwrap(array[10].as_f64())? as f32,
  59. try_unwrap(array[11].as_f64())? as f32],
  60. [try_unwrap(array[12].as_f64())? as f32,
  61. try_unwrap(array[13].as_f64())? as f32,
  62. try_unwrap(array[14].as_f64())? as f32,
  63. try_unwrap(array[15].as_f64())? as f32]])
  64. }
  65. _ => return Err(()),
  66. }
  67. }
  68. FLOAT_VEC2 => {
  69. match value {
  70. &Value::Array(ref array) if array.len() >= 3 => {
  71. Data::Vec2([try_unwrap(array[0].as_f64())? as f32,
  72. try_unwrap(array[1].as_f64())? as f32])
  73. }
  74. _ => return Err(()),
  75. }
  76. }
  77. FLOAT_VEC3 => {
  78. match value {
  79. &Value::Array(ref array) if array.len() >= 3 => {
  80. Data::Vec3([try_unwrap(array[0].as_f64())? as f32,
  81. try_unwrap(array[1].as_f64())? as f32,
  82. try_unwrap(array[2].as_f64())? as f32])
  83. }
  84. _ => return Err(()),
  85. }
  86. }
  87. FLOAT_VEC4 => {
  88. match value {
  89. &Value::Array(ref array) if array.len() >= 4 => {
  90. Data::Vec4([try_unwrap(array[0].as_f64())? as f32,
  91. try_unwrap(array[1].as_f64())? as f32,
  92. try_unwrap(array[2].as_f64())? as f32,
  93. try_unwrap(array[3].as_f64())? as f32])
  94. }
  95. _ => return Err(()),
  96. }
  97. }
  98. _ => {
  99. println!("parse() implementation missing for {}", ty);
  100. panic!();
  101. }
  102. };
  103.  
  104. Ok(data)
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement