Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h> // For printf
- class v4
- {
- public:
- double x;
- double y;
- double z;
- double w;
- v4() {}
- v4(double a_x, double a_y, double a_z, double a_w)
- {
- x = a_x;
- y = a_y;
- z = a_z;
- w = a_w;
- }
- };
- class m4
- {
- public:
- v4 x;
- v4 y;
- v4 z;
- v4 w;
- m4() {};
- m4(const double xx, const double xy, const double xz, const double xw,
- const double yx, const double yy, const double yz, const double yw,
- const double zx, const double zy, const double zz, const double zw,
- const double wx, const double wy, const double wz, const double ww)
- :
- x(xx, xy, xz, xw),
- y(yx, yy, yz, yw),
- z(zx, zy, zz, zw),
- w(wx, wy, wz, ww)
- {
- }
- };
- // Full matrix multiply A x B
- static m4 test_mul(const m4& matA, const m4& matB)
- {
- #if 1 //BAD
- return m4
- (
- (matA.x.x * matB.x.x) + (matA.x.y * matB.y.x) + (matA.x.z * matB.z.x) + (matA.x.w * matB.w.x),
- (matA.x.x * matB.x.y) + (matA.x.y * matB.y.y) + (matA.x.z * matB.z.y) + (matA.x.w * matB.w.y),
- (matA.x.x * matB.x.z) + (matA.x.y * matB.y.z) + (matA.x.z * matB.z.z) + (matA.x.w * matB.w.z),
- (matA.x.x * matB.x.w) + (matA.x.y * matB.y.w) + (matA.x.z * matB.z.w) + (matA.x.w * matB.w.w),
- (matA.y.x * matB.x.x) + (matA.y.y * matB.y.x) + (matA.y.z * matB.z.x) + (matA.y.w * matB.w.x),
- (matA.y.x * matB.x.y) + (matA.y.y * matB.y.y) + (matA.y.z * matB.z.y) + (matA.y.w * matB.w.y),
- (matA.y.x * matB.x.z) + (matA.y.y * matB.y.z) + (matA.y.z * matB.z.z) + (matA.y.w * matB.w.z),
- (matA.y.x * matB.x.w) + (matA.y.y * matB.y.w) + (matA.y.z * matB.z.w) + (matA.y.w * matB.w.w),
- (matA.z.x * matB.x.x) + (matA.z.y * matB.y.x) + (matA.z.z * matB.z.x) + (matA.z.w * matB.w.x),
- (matA.z.x * matB.x.y) + (matA.z.y * matB.y.y) + (matA.z.z * matB.z.y) + (matA.z.w * matB.w.y),
- (matA.z.x * matB.x.z) + (matA.z.y * matB.y.z) + (matA.z.z * matB.z.z) + (matA.z.w * matB.w.z),
- (matA.z.x * matB.x.w) + (matA.z.y * matB.y.w) + (matA.z.z * matB.z.w) + (matA.z.w * matB.w.w),
- (matA.w.x * matB.x.x) + (matA.w.y * matB.y.x) + (matA.w.z * matB.z.x) + (matA.w.w * matB.w.x),
- (matA.w.x * matB.x.y) + (matA.w.y * matB.y.y) + (matA.w.z * matB.z.y) + (matA.w.w * matB.w.y),
- (matA.w.x * matB.x.z) + (matA.w.y * matB.y.z) + (matA.w.z * matB.z.z) + (matA.w.w * matB.w.z),
- (matA.w.x * matB.x.w) + (matA.w.y * matB.y.w) + (matA.w.z * matB.z.w) + (matA.w.w * matB.w.w)
- );
- #endif
- #if 0 //GOOD
- m4 out;
- out.x.x = (matA.x.x * matB.x.x) + (matA.x.y * matB.y.x) + (matA.x.z * matB.z.x) + (matA.x.w * matB.w.x);
- out.x.y = (matA.x.x * matB.x.y) + (matA.x.y * matB.y.y) + (matA.x.z * matB.z.y) + (matA.x.w * matB.w.y);
- out.x.z = (matA.x.x * matB.x.z) + (matA.x.y * matB.y.z) + (matA.x.z * matB.z.z) + (matA.x.w * matB.w.z);
- out.x.w = (matA.x.x * matB.x.w) + (matA.x.y * matB.y.w) + (matA.x.z * matB.z.w) + (matA.x.w * matB.w.w);
- out.y.x = (matA.y.x * matB.x.x) + (matA.y.y * matB.y.x) + (matA.y.z * matB.z.x) + (matA.y.w * matB.w.x);
- out.y.y = (matA.y.x * matB.x.y) + (matA.y.y * matB.y.y) + (matA.y.z * matB.z.y) + (matA.y.w * matB.w.y);
- out.y.z = (matA.y.x * matB.x.z) + (matA.y.y * matB.y.z) + (matA.y.z * matB.z.z) + (matA.y.w * matB.w.z);
- out.y.w = (matA.y.x * matB.x.w) + (matA.y.y * matB.y.w) + (matA.y.z * matB.z.w) + (matA.y.w * matB.w.w);
- out.z.x = (matA.z.x * matB.x.x) + (matA.z.y * matB.y.x) + (matA.z.z * matB.z.x) + (matA.z.w * matB.w.x);
- out.z.y = (matA.z.x * matB.x.y) + (matA.z.y * matB.y.y) + (matA.z.z * matB.z.y) + (matA.z.w * matB.w.y);
- out.z.z = (matA.z.x * matB.x.z) + (matA.z.y * matB.y.z) + (matA.z.z * matB.z.z) + (matA.z.w * matB.w.z);
- out.z.w = (matA.z.x * matB.x.w) + (matA.z.y * matB.y.w) + (matA.z.z * matB.z.w) + (matA.z.w * matB.w.w);
- out.w.x = (matA.w.x * matB.x.x) + (matA.w.y * matB.y.x) + (matA.w.z * matB.z.x) + (matA.w.w * matB.w.x);
- out.w.y = (matA.w.x * matB.x.y) + (matA.w.y * matB.y.y) + (matA.w.z * matB.z.y) + (matA.w.w * matB.w.y);
- out.w.z = (matA.w.x * matB.x.z) + (matA.w.y * matB.y.z) + (matA.w.z * matB.z.z) + (matA.w.w * matB.w.z);
- out.w.w = (matA.w.x * matB.x.w) + (matA.w.y * matB.y.w) + (matA.w.z * matB.z.w) + (matA.w.w * matB.w.w);
- return m4(out.x.x, out.x.y, out.x.z, out.x.w,
- out.y.x, out.y.y, out.y.z, out.y.w,
- out.z.x, out.z.y, out.z.z, out.z.w,
- out.w.x, out.w.y, out.w.z, out.w.w);
- #endif
- #if 0 //GOOD
- m4 out;
- out.x.x = (matA.x.x * matB.x.x) + (matA.x.y * matB.y.x) + (matA.x.z * matB.z.x) + (matA.x.w * matB.w.x);
- out.x.y = (matA.x.x * matB.x.y) + (matA.x.y * matB.y.y) + (matA.x.z * matB.z.y) + (matA.x.w * matB.w.y);
- out.x.z = (matA.x.x * matB.x.z) + (matA.x.y * matB.y.z) + (matA.x.z * matB.z.z) + (matA.x.w * matB.w.z);
- out.x.w = (matA.x.x * matB.x.w) + (matA.x.y * matB.y.w) + (matA.x.z * matB.z.w) + (matA.x.w * matB.w.w);
- out.y.x = (matA.y.x * matB.x.x) + (matA.y.y * matB.y.x) + (matA.y.z * matB.z.x) + (matA.y.w * matB.w.x);
- out.y.y = (matA.y.x * matB.x.y) + (matA.y.y * matB.y.y) + (matA.y.z * matB.z.y) + (matA.y.w * matB.w.y);
- out.y.z = (matA.y.x * matB.x.z) + (matA.y.y * matB.y.z) + (matA.y.z * matB.z.z) + (matA.y.w * matB.w.z);
- out.y.w = (matA.y.x * matB.x.w) + (matA.y.y * matB.y.w) + (matA.y.z * matB.z.w) + (matA.y.w * matB.w.w);
- out.z.x = (matA.z.x * matB.x.x) + (matA.z.y * matB.y.x) + (matA.z.z * matB.z.x) + (matA.z.w * matB.w.x);
- out.z.y = (matA.z.x * matB.x.y) + (matA.z.y * matB.y.y) + (matA.z.z * matB.z.y) + (matA.z.w * matB.w.y);
- out.z.z = (matA.z.x * matB.x.z) + (matA.z.y * matB.y.z) + (matA.z.z * matB.z.z) + (matA.z.w * matB.w.z);
- out.z.w = (matA.z.x * matB.x.w) + (matA.z.y * matB.y.w) + (matA.z.z * matB.z.w) + (matA.z.w * matB.w.w);
- out.w.x = (matA.w.x * matB.x.x) + (matA.w.y * matB.y.x) + (matA.w.z * matB.z.x) + (matA.w.w * matB.w.x);
- out.w.y = (matA.w.x * matB.x.y) + (matA.w.y * matB.y.y) + (matA.w.z * matB.z.y) + (matA.w.w * matB.w.y);
- out.w.z = (matA.w.x * matB.x.z) + (matA.w.y * matB.y.z) + (matA.w.z * matB.z.z) + (matA.w.w * matB.w.z);
- out.w.w = (matA.w.x * matB.x.w) + (matA.w.y * matB.y.w) + (matA.w.z * matB.z.w) + (matA.w.w * matB.w.w);
- return out;
- #endif
- }
- void print_m4(const m4& a_mat, const char* a_label)
- {
- printf("%s\n", a_label);
- printf("%f, %f, %f, %f\n", a_mat.x.x, a_mat.x.y, a_mat.x.z, a_mat.x.w);
- printf("%f, %f, %f, %f\n", a_mat.y.x, a_mat.y.y, a_mat.y.z, a_mat.y.w);
- printf("%f, %f, %f, %f\n", a_mat.z.x, a_mat.z.y, a_mat.z.z, a_mat.z.w);
- printf("%f, %f, %f, %f\n", a_mat.w.x, a_mat.w.y, a_mat.w.z, a_mat.w.w);
- }
- int main()
- {
- // REPRO:
- // Build with VS 15.7.1 Debug, 64bit
- // Notice the last element of
- // Try comparing BAD vs GOOD #def'd blocks
- // Also, with the BAD block enabled, compare Debug and Release behaviors
- const m4 mat(0, 1, 2, 3,
- 4, 5, 6, 7,
- 8, 9, 10, 11,
- 12, 13, 14, 15);
- const m4 id(1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 1, 0,
- 0, 0, 0, 1);
- const m4 test = test_mul(mat, id);
- print_m4(test, "test_mul");
- getchar();
- return 0;
- }
Add Comment
Please, Sign In to add comment