cglm icon indicating copy to clipboard operation
cglm copied to clipboard

glm::adjugate ?

Open ghost opened this issue 3 years ago • 4 comments

Hello there,

I am currently using cglm in my game engine and was wondering if there is an implementation of adjugate in cglm? here how the function looks like from glm C++ library

image

Thank you.

ghost avatar Mar 27 '22 17:03 ghost

Hi @wobes1

Thanks for your feedback,

We can add this function to cglm, I will work on it asap if anyone wont before me

It is similar to inverse just without determinant division

recp avatar Mar 28 '22 21:03 recp

Thank you for your reply @recp

Wow, I really appreciate the reactivity! Sorry I couldn't contribute myself, I lack proper knowledge of cglm and complex matrices operations, but will be happy to learn

Cheers

EDIT:

oh so just without this part? image

ghost avatar Mar 28 '22 21:03 ghost

Yes I believe this is it:

CGLM_INLINE
void glm_mat3_adjugate(mat3 mat, mat3 dest) {
  float det;
  float a = mat[0][0], b = mat[0][1], c = mat[0][2], d = mat[1][0], e = mat[1][1], f = mat[1][2],
        g = mat[2][0], h = mat[2][1], i = mat[2][2];

  dest[0][0] = e * i - f * h;
  dest[0][1] = -(b * i - h * c);
  dest[0][2] = b * f - e * c;
  dest[1][0] = -(d * i - g * f);
  dest[1][1] = a * i - c * g;
  dest[1][2] = -(a * f - d * c);
  dest[2][0] = d * h - g * e;
  dest[2][1] = -(a * h - g * b);
  dest[2][2] = a * e - b * d;
}

Please let me know if something is off. Thank you!

ghost avatar Mar 29 '22 00:03 ghost

Yes that's it! But with correct indents/alignment ;)

CGLM_INLINE
void
glm_mat3_adjugate(mat3 mat, mat3 dest) {
  float a = mat[0][0], b = mat[0][1], c = mat[0][2],
        d = mat[1][0], e = mat[1][1], f = mat[1][2],
        g = mat[2][0], h = mat[2][1], i = mat[2][2];

  dest[0][0] =   e * i - f * h;
  dest[0][1] = -(b * i - h * c);
  dest[0][2] =   b * f - e * c;
  dest[1][0] = -(d * i - g * f);
  dest[1][1] =   a * i - c * g;
  dest[1][2] = -(a * f - d * c);
  dest[2][0] =   d * h - g * e;
  dest[2][1] = -(a * h - g * b);
  dest[2][2] =   a * e - b * d;
}

maybe glm_mat3_adj() could be used for the name but not sure.

recp avatar Mar 29 '22 08:03 recp