{% macro make_tuple_t(t, n) %} ( {%- for i in range(end=n) -%} {{ t }}, {%- endfor -%} ) {% endmacro make_tuple_t %} {% macro impl_mat3_minor(mat3_t, align="") %} /// Creates a 2x2 matrix from the minor of the given 3x3 matrix, discarding the `i`th column /// and `j`th row. /// /// # Panics /// /// Panics if `i` or `j` is greater than 2. #[inline] #[must_use] pub fn from_mat3{{ align }}_minor(m: {{ mat3_t }}, i: usize, j: usize) -> Self { match (i, j) { (0, 0) => Self::from_cols(m.y_axis.yz(), m.z_axis.yz()), (0, 1) => Self::from_cols(m.y_axis.xz(), m.z_axis.xz()), (0, 2) => Self::from_cols(m.y_axis.xy(), m.z_axis.xy()), (1, 0) => Self::from_cols(m.x_axis.yz(), m.z_axis.yz()), (1, 1) => Self::from_cols(m.x_axis.xz(), m.z_axis.xz()), (1, 2) => Self::from_cols(m.x_axis.xy(), m.z_axis.xy()), (2, 0) => Self::from_cols(m.x_axis.yz(), m.y_axis.yz()), (2, 1) => Self::from_cols(m.x_axis.xz(), m.y_axis.xz()), (2, 2) => Self::from_cols(m.x_axis.xy(), m.y_axis.xy()), _ => panic!("index out of bounds"), } } {% endmacro impl_mat3_minor %} {% macro impl_mat4_minor(mat4_t, vec3_t) %} {% if vec3_t == "Vec3A" %} {% set w = "w" %} {% set b = "Vec3A::from_vec4(" %} {% set e = ")" %} {% else %} {% set w = "" %} {% set b = "" %} {% set e = "" %} {% endif %} /// Creates a 3x3 matrix from the minor of the given 4x4 matrix, discarding the `i`th column /// and `j`th row. /// /// # Panics /// /// Panics if `i` or `j` is greater than 3. #[inline] #[must_use] pub fn from_mat4_minor(m: {{ mat4_t }}, i: usize, j: usize) -> Self { match (i, j) { (0, 0) => Self::from_cols({{ b }}m.y_axis.yzw{{ w }}(){{ e }}, {{ b }}m.z_axis.yzw{{ w }}(){{ e }}, {{ b }}m.w_axis.yzw{{ w }}(){{ e }}), (0, 1) => Self::from_cols({{ b }}m.y_axis.xzw{{ w }}(){{ e }}, {{ b }}m.z_axis.xzw{{ w }}(){{ e }}, {{ b }}m.w_axis.xzw{{ w }}(){{ e }}), (0, 2) => Self::from_cols({{ b }}m.y_axis.xyw{{ w }}(){{ e }}, {{ b }}m.z_axis.xyw{{ w }}(){{ e }}, {{ b }}m.w_axis.xyw{{ w }}(){{ e }}), (0, 3) => Self::from_cols({{ b }}m.y_axis.xyz{{ w }}(){{ e }}, {{ b }}m.z_axis.xyz{{ w }}(){{ e }}, {{ b }}m.w_axis.xyz{{ w }}(){{ e }}), (1, 0) => Self::from_cols({{ b }}m.x_axis.yzw{{ w }}(){{ e }}, {{ b }}m.z_axis.yzw{{ w }}(){{ e }}, {{ b }}m.w_axis.yzw{{ w }}(){{ e }}), (1, 1) => Self::from_cols({{ b }}m.x_axis.xzw{{ w }}(){{ e }}, {{ b }}m.z_axis.xzw{{ w }}(){{ e }}, {{ b }}m.w_axis.xzw{{ w }}(){{ e }}), (1, 2) => Self::from_cols({{ b }}m.x_axis.xyw{{ w }}(){{ e }}, {{ b }}m.z_axis.xyw{{ w }}(){{ e }}, {{ b }}m.w_axis.xyw{{ w }}(){{ e }}), (1, 3) => Self::from_cols({{ b }}m.x_axis.xyz{{ w }}(){{ e }}, {{ b }}m.z_axis.xyz{{ w }}(){{ e }}, {{ b }}m.w_axis.xyz{{ w }}(){{ e }}), (2, 0) => Self::from_cols({{ b }}m.x_axis.yzw{{ w }}(){{ e }}, {{ b }}m.y_axis.yzw{{ w }}(){{ e }}, {{ b }}m.w_axis.yzw{{ w }}(){{ e }}), (2, 1) => Self::from_cols({{ b }}m.x_axis.xzw{{ w }}(){{ e }}, {{ b }}m.y_axis.xzw{{ w }}(){{ e }}, {{ b }}m.w_axis.xzw{{ w }}(){{ e }}), (2, 2) => Self::from_cols({{ b }}m.x_axis.xyw{{ w }}(){{ e }}, {{ b }}m.y_axis.xyw{{ w }}(){{ e }}, {{ b }}m.w_axis.xyw{{ w }}(){{ e }}), (2, 3) => Self::from_cols({{ b }}m.x_axis.xyz{{ w }}(){{ e }}, {{ b }}m.y_axis.xyz{{ w }}(){{ e }}, {{ b }}m.w_axis.xyz{{ w }}(){{ e }}), (3, 0) => Self::from_cols({{ b }}m.x_axis.yzw{{ w }}(){{ e }}, {{ b }}m.y_axis.yzw{{ w }}(){{ e }}, {{ b }}m.z_axis.yzw{{ w }}(){{ e }}), (3, 1) => Self::from_cols({{ b }}m.x_axis.xzw{{ w }}(){{ e }}, {{ b }}m.y_axis.xzw{{ w }}(){{ e }}, {{ b }}m.z_axis.xzw{{ w }}(){{ e }}), (3, 2) => Self::from_cols({{ b }}m.x_axis.xyw{{ w }}(){{ e }}, {{ b }}m.y_axis.xyw{{ w }}(){{ e }}, {{ b }}m.z_axis.xyw{{ w }}(){{ e }}), (3, 3) => Self::from_cols({{ b }}m.x_axis.xyz{{ w }}(){{ e }}, {{ b }}m.y_axis.xyz{{ w }}(){{ e }}, {{ b }}m.z_axis.xyz{{ w }}(){{ e }}), _ => panic!("index out of bounds"), } } {% endmacro impl_mat4_minor %} {% macro impl_ref_unop(imp, self_t, output_t) %} {% set op = imp | lower %} impl {{ imp }} for &{{ self_t }} { type Output = {{ output_t }}; #[inline] fn {{ op }}(self) -> {{ output_t }} { (*self).{{ op }}() } } {% endmacro impl_ref_unop %} {% macro impl_ref_binop(imp, self_t, rhs_t, output_t) %} {% set op = imp | lower %} {% if rhs_t == self_t %} {% set val_rhs_t = "Self" %} {% else %} {% set val_rhs_t = rhs_t %} {% endif %} {% if output_t == self_t %} {% set val_output_t = "Self" %} {% else %} {% set val_output_t = output_t %} {% endif %} impl {{ imp }}<&{{ val_rhs_t }}> for {{ self_t }} { type Output = {{ val_output_t }}; #[inline] fn {{ op }}(self, rhs: &{{ val_rhs_t }}) -> {{ val_output_t }} { self.{{ op }}(*rhs) } } impl {{ imp }}<&{{ rhs_t }}> for &{{ self_t }} { type Output = {{ output_t }}; #[inline] fn {{ op }}(self, rhs: &{{ rhs_t }}) -> {{ output_t }} { (*self).{{ op }}(*rhs) } } impl {{ imp }}<{{ rhs_t }}> for &{{ self_t }} { type Output = {{ output_t }}; #[inline] fn {{ op }}(self, rhs: {{ rhs_t }}) -> {{ output_t }} { (*self).{{ op }}(rhs) } } {% endmacro impl_ref_biop %} {% macro impl_ref_op_assign(imp, self_t, rhs_t) %} {% set op = imp | lower %} {% if rhs_t == self_t %} {% set rhs_t = "Self" %} {% endif %} impl {{ imp }}Assign<&{{ rhs_t }}> for {{ self_t }} { #[inline] fn {{ op }}_assign(&mut self, rhs: &{{ rhs_t }}) { self.{{ op }}_assign(*rhs); } } {% endmacro forward_ref_op_assign %} {% macro impl_op_assign(imp, self_t, rhs_t) %} {% set op = imp | lower %} impl {{ imp }}Assign{% if rhs_t != self_t %}<{{rhs_t}}>{% endif %} for {{ self_t }} { #[inline] fn {{ op }}_assign(&mut self, rhs: {% if rhs_t == self_t %} Self {% else %} {{ rhs_t }} {% endif %}) { *self = self.{{ op }}(rhs); } } {{ self::impl_ref_op_assign(imp=imp, self_t=self_t, rhs_t=rhs_t) }} {% endmacro impl_op_assign %}