Advertisement
Guest User

Untitled

a guest
Sep 15th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 5.44 KB | None | 0 0
  1.  
  2. use super::metadata::{StructMeta};
  3.  
  4. fn impl_new_function(s: &StructMeta) -> quote::Tokens {
  5.     let initializers = s.fields.iter().map(|field| {
  6.         match field.kind.as_ref() {
  7.             "Vector4" => {
  8.                 let field_name = quote::Ident::from(field.name.clone());
  9.                 quote! {
  10.                     #field_name: Vector4::new(0.0, 0.0, 0.0, 0.0)
  11.                 }
  12.             },
  13.             "Vector3" => {
  14.                 let field_name = quote::Ident::from(field.name.clone());
  15.                 quote! {
  16.                     #field_name: Vector3::new(0.0, 0.0, 0.0)
  17.                 }
  18.             },
  19.             "Vector2" => {
  20.                 let field_name = quote::Ident::from(field.name.clone());
  21.                 quote! {
  22.                     #field_name: Vector2::new(0.0, 0.0)
  23.                 }
  24.             },
  25.             _ => panic!(format!("Cannot interpolate type '{}'", field.kind))
  26.         }
  27.     });
  28.     let name = quote::Ident::from(s.name.clone());
  29.     quote!(
  30.         #[inline(always)]
  31.         fn new() -> #name {
  32.             #name {
  33.                 #( #initializers ),*
  34.             }
  35.         }
  36.     )
  37. }
  38.  
  39. fn impl_correct_function(s: &StructMeta) -> quote::Tokens {
  40.     let initializers = s.fields.iter().map(|field| {
  41.         match field.kind.as_ref() {
  42.             "Vector4" => {
  43.                 let field_name = quote::Ident::from(field.name.clone());
  44.                 quote! {
  45.                     #field_name: Vector4::new(
  46.                         v.#field_name.x / w,
  47.                         v.#field_name.y / w,
  48.                         v.#field_name.z / w,
  49.                         v.#field_name.w / w,
  50.                     )
  51.                 }
  52.             },
  53.             "Vector3" => {
  54.                 let field_name = quote::Ident::from(field.name.clone());
  55.                 quote! {
  56.                     #field_name: Vector3::new(
  57.                         v.#field_name.x / w,
  58.                         v.#field_name.y / w,
  59.                         v.#field_name.z / w,
  60.                     )
  61.                 }
  62.             },
  63.             "Vector2" => {
  64.                 let field_name = quote::Ident::from(field.name.clone());
  65.                 quote! {
  66.                     #field_name: Vector2::new(
  67.                         v.#field_name.x / w,
  68.                         v.#field_name.y / w,
  69.                     )
  70.                 }
  71.             },
  72.             _ => panic!(format!("Cannot interpolate type '{}'", field.kind))
  73.         }
  74.     });
  75.     let name = quote::Ident::from(s.name.clone());
  76.     quote!(
  77.         #[inline(always)]
  78.         fn correct(v: &#name, w: &f32)  -> #name {
  79.             #name {
  80.                 #( #initializers ),*
  81.             }
  82.         }
  83.     )
  84. }
  85.  
  86. fn impl_interpolate_function(s: &StructMeta) -> quote::Tokens {
  87.     let initializers = s.fields.iter().map(|field| {
  88.         match field.kind.as_ref() {
  89.             "Vector4" => {
  90.                 let field_name = quote::Ident::from(field.name.clone());
  91.                 quote! {
  92.                     #field_name: Vector4::new(
  93.                         ((w0 * v0.#field_name.x) + (w1 * v1.#field_name.x) + (w2 * v2.#field_name.x)) / w,
  94.                         ((w0 * v0.#field_name.y) + (w1 * v1.#field_name.y) + (w2 * v2.#field_name.y)) / w,
  95.                         ((w0 * v0.#field_name.z) + (w1 * v1.#field_name.z) + (w2 * v2.#field_name.z)) / w,
  96.                         ((w0 * v0.#field_name.w) + (w1 * v1.#field_name.w) + (w2 * v2.#field_name.w)) / w,
  97.                     )
  98.                 }
  99.             },
  100.             "Vector3" => {
  101.                 let field_name = quote::Ident::from(field.name.clone());
  102.                 quote! {
  103.                     #field_name: Vector3::new(
  104.                         ((w0 * v0.#field_name.x) + (w1 * v1.#field_name.x) + (w2 * v2.#field_name.x)) / w,
  105.                         ((w0 * v0.#field_name.y) + (w1 * v1.#field_name.y) + (w2 * v2.#field_name.y)) / w,
  106.                         ((w0 * v0.#field_name.z) + (w1 * v1.#field_name.z) + (w2 * v2.#field_name.z)) / w,
  107.                     )
  108.                 }
  109.             },
  110.             "Vector2" => {
  111.                 let field_name = quote::Ident::from(field.name.clone());
  112.                 quote! {
  113.                     #field_name: Vector2::new(
  114.                         ((w0 * v0.#field_name.x) + (w1 * v1.#field_name.x) + (w2 * v2.#field_name.x)) / w,
  115.                         ((w0 * v0.#field_name.y) + (w1 * v1.#field_name.y) + (w2 * v2.#field_name.y)) / w,
  116.                     )
  117.                 }
  118.             },
  119.             _ => panic!(format!("Cannot interpolate type '{}'", field.kind))
  120.         }
  121.     });
  122.     let name = quote::Ident::from(s.name.clone());
  123.     quote!(
  124.         #[inline(always)]
  125.         fn interpolate(v0: &#name, v1: &#name, v2: &#name, w0: &f32, w1: &f32, w2: &f32, w:  &f32) -> #name {
  126.             #name {
  127.                 #( #initializers ),*
  128.             }
  129.         }
  130.     )
  131. }
  132.  
  133. pub fn impl_interpolate(s: &StructMeta) -> quote::Tokens {
  134.     let kind                 = quote::Ident::from(s.name.clone());
  135.     let new_function         = impl_new_function(&s);
  136.     let correct_function     = impl_correct_function(&s);
  137.     let interpolate_function = impl_interpolate_function(&s);
  138.     let implementation       = quote! {
  139.         impl Interpolate for #kind {
  140.             #new_function
  141.             #correct_function
  142.             #interpolate_function
  143.         }
  144.     };
  145.     // println!("{}", implementation);
  146.     implementation
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement