[go: up one dir, main page]

glam 0.30.3

A simple and fast 3D math library for games and graphics
Documentation
{% macro impl_mat4_inverse() %}
    // Based on https://github.com/g-truc/glm `glm_mat4_inverse`
    let fac0 = {
        let swp0a = simd_swizzle!(
            self.w_axis.0,
            self.z_axis.0,
            [3, 3, 7, 7]
        );
        let swp0b = simd_swizzle!(
            self.w_axis.0,
            self.z_axis.0,
            [2, 2, 6, 6]
        );

        let swp00 = simd_swizzle!(
            self.z_axis.0,
            self.y_axis.0,
            [2, 2, 6, 6]
        );
        let swp01 = simd_swizzle!(swp0a, [0, 0, 0, 2]);
        let swp02 = simd_swizzle!(swp0b, [0, 0, 0, 2]);
        let swp03 = simd_swizzle!(
            self.z_axis.0,
            self.y_axis.0,
            [3, 3, 7, 7]
        );

        let mul00 = swp00 * swp01;
        let mul01 = swp02 * swp03;
        mul00 - mul01
    };
    let fac1 = {
        let swp0a = simd_swizzle!(
            self.w_axis.0,
            self.z_axis.0,
            [3, 3, 7, 7]
        );
        let swp0b = simd_swizzle!(
            self.w_axis.0,
            self.z_axis.0,
            [1, 1, 5, 5]
        );

        let swp00 = simd_swizzle!(
            self.z_axis.0,
            self.y_axis.0,
            [1, 1, 5, 5]
        );
        let swp01 = simd_swizzle!(swp0a, [0, 0, 0, 2]);
        let swp02 = simd_swizzle!(swp0b, [0, 0, 0, 2]);
        let swp03 = simd_swizzle!(
            self.z_axis.0,
            self.y_axis.0,
            [3, 3, 7, 7]
        );

        let mul00 = swp00 * swp01;
        let mul01 = swp02 * swp03;
        mul00 - mul01
    };
    let fac2 = {
        let swp0a = simd_swizzle!(
            self.w_axis.0,
            self.z_axis.0,
            [2, 2, 6, 6]
        );
        let swp0b = simd_swizzle!(
            self.w_axis.0,
            self.z_axis.0,
            [1, 1, 5, 5]
        );

        let swp00 = simd_swizzle!(
            self.z_axis.0,
            self.y_axis.0,
            [1, 1, 5, 5]
        );
        let swp01 = simd_swizzle!(swp0a, [0, 0, 0, 2]);
        let swp02 = simd_swizzle!(swp0b, [0, 0, 0, 2]);
        let swp03 = simd_swizzle!(
            self.z_axis.0,
            self.y_axis.0,
            [2, 2, 6, 6]
        );

        let mul00 = swp00 * swp01;
        let mul01 = swp02 * swp03;
        mul00 - mul01
    };
    let fac3 = {
        let swp0a = simd_swizzle!(
            self.w_axis.0,
            self.z_axis.0,
            [3, 3, 7, 7]
        );
        let swp0b = simd_swizzle!(
            self.w_axis.0,
            self.z_axis.0,
            [0, 0, 4, 4]
        );

        let swp00 = simd_swizzle!(
            self.z_axis.0,
            self.y_axis.0,
            [0, 0, 4, 4]
        );
        let swp01 = simd_swizzle!(swp0a, [0, 0, 0, 2]);
        let swp02 = simd_swizzle!(swp0b, [0, 0, 0, 2]);
        let swp03 = simd_swizzle!(
            self.z_axis.0,
            self.y_axis.0,
            [3, 3, 7, 7]
        );

        let mul00 = swp00 * swp01;
        let mul01 = swp02 * swp03;
        mul00 - mul01
    };
    let fac4 = {
        let swp0a = simd_swizzle!(
            self.w_axis.0,
            self.z_axis.0,
            [2, 2, 6, 6]
        );
        let swp0b = simd_swizzle!(
            self.w_axis.0,
            self.z_axis.0,
            [0, 0, 4, 4]
        );

        let swp00 = simd_swizzle!(
            self.z_axis.0,
            self.y_axis.0,
            [0, 0, 4, 4]
        );
        let swp01 = simd_swizzle!(swp0a, [0, 0, 0, 2]);
        let swp02 = simd_swizzle!(swp0b, [0, 0, 0, 2]);
        let swp03 = simd_swizzle!(
            self.z_axis.0,
            self.y_axis.0,
            [2, 2, 6, 6]
        );

        let mul00 = swp00 * swp01;
        let mul01 = swp02 * swp03;
        mul00 - mul01
    };
    let fac5 = {
        let swp0a = simd_swizzle!(
            self.w_axis.0,
            self.z_axis.0,
            [1, 1, 5, 5]
        );
        let swp0b = simd_swizzle!(
            self.w_axis.0,
            self.z_axis.0,
            [0, 0, 4, 4]
        );

        let swp00 = simd_swizzle!(
            self.z_axis.0,
            self.y_axis.0,
            [0, 0, 4, 4]
        );
        let swp01 = simd_swizzle!(swp0a, [0, 0, 0, 2]);
        let swp02 = simd_swizzle!(swp0b, [0, 0, 0, 2]);
        let swp03 = simd_swizzle!(
            self.z_axis.0,
            self.y_axis.0,
            [1, 1, 5, 5]
        );

        let mul00 = swp00 * swp01;
        let mul01 = swp02 * swp03;
        mul00 - mul01
    };
    let sign_a = f32x4::from_array([-1.0, 1.0, -1.0, 1.0]);
    let sign_b = f32x4::from_array([1.0, -1.0, 1.0, -1.0]);

    let temp0 = simd_swizzle!(
        self.y_axis.0,
        self.x_axis.0,
        [0, 0, 4, 4]
    );
    let vec0 = simd_swizzle!(temp0, [0, 2, 2, 2]);

    let temp1 = simd_swizzle!(
        self.y_axis.0,
        self.x_axis.0,
        [1, 1, 5, 5]
    );
    let vec1 = simd_swizzle!(temp1, [0, 2, 2, 2]);

    let temp2 = simd_swizzle!(
        self.y_axis.0,
        self.x_axis.0,
        [2, 2, 6, 6]
    );
    let vec2 = simd_swizzle!(temp2, [0, 2, 2, 2]);

    let temp3 = simd_swizzle!(
        self.y_axis.0,
        self.x_axis.0,
        [3, 3, 7, 7]
    );
    let vec3 = simd_swizzle!(temp3, [0, 2, 2, 2]);

    let mul00 = vec1 * fac0;
    let mul01 = vec2 * fac1;
    let mul02 = vec3 * fac2;
    let sub00 = mul00 - mul01;
    let add00 = sub00 + mul02;
    let inv0 = sign_b * add00;

    let mul03 = vec0 * fac0;
    let mul04 = vec2 * fac3;
    let mul05 = vec3 * fac4;
    let sub01 = mul03 - mul04;
    let add01 = sub01 + mul05;
    let inv1 = sign_a * add01;

    let mul06 = vec0 * fac1;
    let mul07 = vec1 * fac3;
    let mul08 = vec3 * fac5;
    let sub02 = mul06 - mul07;
    let add02 = sub02 + mul08;
    let inv2 = sign_b * add02;

    let mul09 = vec0 * fac2;
    let mul10 = vec1 * fac4;
    let mul11 = vec2 * fac5;
    let sub03 = mul09 - mul10;
    let add03 = sub03 + mul11;
    let inv3 = sign_a * add03;

    let row0 = simd_swizzle!(inv0, inv1, [0, 0, 4, 4]);
    let row1 = simd_swizzle!(inv2, inv3, [0, 0, 4, 4]);
    let row2 = simd_swizzle!(row0, row1, [0, 2, 4, 6]);

    let dot0 = dot4(self.x_axis.0, row2);
    glam_assert!(dot0 != 0.0);

    let rcp0 = f32x4::splat(dot0.recip());

    Self {
        x_axis: Vec4(inv0 * rcp0),
        y_axis: Vec4(inv1 * rcp0),
        z_axis: Vec4(inv2 * rcp0),
        w_axis: Vec4(inv3 * rcp0),
    }
{% endmacro impl_mat4_inverse %}