public Matrix3f mult(Matrix3f mat, Matrix3f product) {
        float temp00, temp01, temp02;
        float temp10, temp11, temp12;
        float temp20, temp21, temp22;

        if (product == null) {
            product = new Matrix3f();
        }
        temp00 = m00 * mat.m00 + m01 * mat.m10 + m02 * mat.m20;
        temp01 = m00 * mat.m01 + m01 * mat.m11 + m02 * mat.m21;
        temp02 = m00 * mat.m02 + m01 * mat.m12 + m02 * mat.m22;
        temp10 = m10 * mat.m00 + m11 * mat.m10 + m12 * mat.m20;
        temp11 = m10 * mat.m01 + m11 * mat.m11 + m12 * mat.m21;
        temp12 = m10 * mat.m02 + m11 * mat.m12 + m12 * mat.m22;
        temp20 = m20 * mat.m00 + m21 * mat.m10 + m22 * mat.m20;
        temp21 = m20 * mat.m01 + m21 * mat.m11 + m22 * mat.m21;
        temp22 = m20 * mat.m02 + m21 * mat.m12 + m22 * mat.m22;

        product.m00 = temp00;
        product.m01 = temp01;
        product.m02 = temp02;
        product.m10 = temp10;
        product.m11 = temp11;
        product.m12 = temp12;
        product.m20 = temp20;
        product.m21 = temp21;
        product.m22 = temp22;

        return product;
    }
Multiplies with the specified matrix and returns the product in a 3rd
matrix. The current instance is unaffected unless it's {@code product}.

<p>Note that matrix multiplication is noncommutative, so generally
q * p != p * q.

<p>It is safe for {@code mat} and {@code product} to be the same object.

@param mat the right factor (not null, unaffected unless it's {@code
    product})
@param product storage for the product, or null for a new Matrix3f
@return {@code this} times {@code mat} (either {@code product} or a new
    Matrix3f)
jme3-core/src/main/java/com/jme3/math/Matrix3f.java