[go: up one dir, main page]

glam 0.30.9

A simple and fast 3D math library for games and graphics
Documentation
{% 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 %}