diff --git a/la.h b/la.h index 4325754..293e8f3 100644 --- a/la.h +++ b/la.h @@ -237,6 +237,13 @@ typedef union { #define V2f_Fmt "v2f(%f, %f)" #define V2f_Arg(v) (v).x, (v).y +#define M2f_Fmt "m2f(\n" \ + " %f, %f,\n" \ + " %f, %f\n" \ +")" +#define M2f_Arg(m) \ + (m)._11, (m)._12, \ + (m)._21, (m)._22 LADEF V2f v2f(float x, float y); LADEF V2f v2ff(float x); LADEF V2f v2f2d(V2d a); @@ -280,6 +287,13 @@ LADEF M2f m2f_rot(float angle); #define V2d_Fmt "v2d(%lf, %lf)" #define V2d_Arg(v) (v).x, (v).y +#define M2d_Fmt "m2d(\n" \ + " %lf, %lf,\n" \ + " %lf, %lf\n" \ +")" +#define M2d_Arg(m) \ + (m)._11, (m)._12, \ + (m)._21, (m)._22 LADEF V2d v2d(double x, double y); LADEF V2d v2dd(double x); LADEF V2d v2d2f(V2f a); @@ -323,6 +337,13 @@ LADEF M2d m2d_rot(double angle); #define V2i_Fmt "v2i(%d, %d)" #define V2i_Arg(v) (v).x, (v).y +#define M2i_Fmt "m2i(\n" \ + " %d, %d,\n" \ + " %d, %d\n" \ +")" +#define M2i_Arg(m) \ + (m)._11, (m)._12, \ + (m)._21, (m)._22 LADEF V2i v2i(int x, int y); LADEF V2i v2ii(int x); LADEF V2i v2i2f(V2f a); @@ -356,6 +377,13 @@ LADEF V2i m2i_mul_vec(M2i m, V2i v); #define V2u_Fmt "v2u(%u, %u)" #define V2u_Arg(v) (v).x, (v).y +#define M2u_Fmt "m2u(\n" \ + " %u, %u,\n" \ + " %u, %u\n" \ +")" +#define M2u_Arg(m) \ + (m)._11, (m)._12, \ + (m)._21, (m)._22 LADEF V2u v2u(unsigned int x, unsigned int y); LADEF V2u v2uu(unsigned int x); LADEF V2u v2u2f(V2f a); @@ -389,6 +417,15 @@ LADEF V2u m2u_mul_vec(M2u m, V2u v); #define V3f_Fmt "v3f(%f, %f, %f)" #define V3f_Arg(v) (v).x, (v).y, (v).z +#define M3f_Fmt "m3f(\n" \ + " %f, %f, %f,\n" \ + " %f, %f, %f,\n" \ + " %f, %f, %f\n" \ +")" +#define M3f_Arg(m) \ + (m)._11, (m)._12, (m)._13, \ + (m)._21, (m)._22, (m)._23, \ + (m)._31, (m)._32, (m)._33 LADEF V3f v3f(float x, float y, float z); LADEF V3f v3ff(float x); LADEF V3f v3f2f(V2f a); @@ -435,6 +472,15 @@ LADEF M3f m3f_rot_z(float angle); #define V3d_Fmt "v3d(%lf, %lf, %lf)" #define V3d_Arg(v) (v).x, (v).y, (v).z +#define M3d_Fmt "m3d(\n" \ + " %lf, %lf, %lf,\n" \ + " %lf, %lf, %lf,\n" \ + " %lf, %lf, %lf\n" \ +")" +#define M3d_Arg(m) \ + (m)._11, (m)._12, (m)._13, \ + (m)._21, (m)._22, (m)._23, \ + (m)._31, (m)._32, (m)._33 LADEF V3d v3d(double x, double y, double z); LADEF V3d v3dd(double x); LADEF V3d v3d2f(V2f a); @@ -481,6 +527,15 @@ LADEF M3d m3d_rot_z(double angle); #define V3i_Fmt "v3i(%d, %d, %d)" #define V3i_Arg(v) (v).x, (v).y, (v).z +#define M3i_Fmt "m3i(\n" \ + " %d, %d, %d,\n" \ + " %d, %d, %d,\n" \ + " %d, %d, %d\n" \ +")" +#define M3i_Arg(m) \ + (m)._11, (m)._12, (m)._13, \ + (m)._21, (m)._22, (m)._23, \ + (m)._31, (m)._32, (m)._33 LADEF V3i v3i(int x, int y, int z); LADEF V3i v3ii(int x); LADEF V3i v3i2f(V2f a); @@ -515,6 +570,15 @@ LADEF V3i m3i_mul_vec(M3i m, V3i v); #define V3u_Fmt "v3u(%u, %u, %u)" #define V3u_Arg(v) (v).x, (v).y, (v).z +#define M3u_Fmt "m3u(\n" \ + " %u, %u, %u,\n" \ + " %u, %u, %u,\n" \ + " %u, %u, %u\n" \ +")" +#define M3u_Arg(m) \ + (m)._11, (m)._12, (m)._13, \ + (m)._21, (m)._22, (m)._23, \ + (m)._31, (m)._32, (m)._33 LADEF V3u v3u(unsigned int x, unsigned int y, unsigned int z); LADEF V3u v3uu(unsigned int x); LADEF V3u v3u2f(V2f a); @@ -549,6 +613,17 @@ LADEF V3u m3u_mul_vec(M3u m, V3u v); #define V4f_Fmt "v4f(%f, %f, %f, %f)" #define V4f_Arg(v) (v).x, (v).y, (v).z, (v).w +#define M4f_Fmt "m4f(\n" \ + " %f, %f, %f, %f,\n" \ + " %f, %f, %f, %f,\n" \ + " %f, %f, %f, %f,\n" \ + " %f, %f, %f, %f\n" \ +")" +#define M4f_Arg(m) \ + (m)._11, (m)._12, (m)._13, (m)._14, \ + (m)._21, (m)._22, (m)._23, (m)._24, \ + (m)._31, (m)._32, (m)._33, (m)._34, \ + (m)._41, (m)._42, (m)._43, (m)._44 LADEF V4f v4f(float x, float y, float z, float w); LADEF V4f v4ff(float x); LADEF V4f v4f2f(V2f a); @@ -594,6 +669,17 @@ LADEF M4f m4f_rot_z(float angle); #define V4d_Fmt "v4d(%lf, %lf, %lf, %lf)" #define V4d_Arg(v) (v).x, (v).y, (v).z, (v).w +#define M4d_Fmt "m4d(\n" \ + " %lf, %lf, %lf, %lf,\n" \ + " %lf, %lf, %lf, %lf,\n" \ + " %lf, %lf, %lf, %lf,\n" \ + " %lf, %lf, %lf, %lf\n" \ +")" +#define M4d_Arg(m) \ + (m)._11, (m)._12, (m)._13, (m)._14, \ + (m)._21, (m)._22, (m)._23, (m)._24, \ + (m)._31, (m)._32, (m)._33, (m)._34, \ + (m)._41, (m)._42, (m)._43, (m)._44 LADEF V4d v4d(double x, double y, double z, double w); LADEF V4d v4dd(double x); LADEF V4d v4d2f(V2f a); @@ -639,6 +725,17 @@ LADEF M4d m4d_rot_z(double angle); #define V4i_Fmt "v4i(%d, %d, %d, %d)" #define V4i_Arg(v) (v).x, (v).y, (v).z, (v).w +#define M4i_Fmt "m4i(\n" \ + " %d, %d, %d, %d,\n" \ + " %d, %d, %d, %d,\n" \ + " %d, %d, %d, %d,\n" \ + " %d, %d, %d, %d\n" \ +")" +#define M4i_Arg(m) \ + (m)._11, (m)._12, (m)._13, (m)._14, \ + (m)._21, (m)._22, (m)._23, (m)._24, \ + (m)._31, (m)._32, (m)._33, (m)._34, \ + (m)._41, (m)._42, (m)._43, (m)._44 LADEF V4i v4i(int x, int y, int z, int w); LADEF V4i v4ii(int x); LADEF V4i v4i2f(V2f a); @@ -672,6 +769,17 @@ LADEF V4i m4i_mul_vec(M4i m, V4i v); #define V4u_Fmt "v4u(%u, %u, %u, %u)" #define V4u_Arg(v) (v).x, (v).y, (v).z, (v).w +#define M4u_Fmt "m4u(\n" \ + " %u, %u, %u, %u,\n" \ + " %u, %u, %u, %u,\n" \ + " %u, %u, %u, %u,\n" \ + " %u, %u, %u, %u\n" \ +")" +#define M4u_Arg(m) \ + (m)._11, (m)._12, (m)._13, (m)._14, \ + (m)._21, (m)._22, (m)._23, (m)._24, \ + (m)._31, (m)._32, (m)._33, (m)._34, \ + (m)._41, (m)._42, (m)._43, (m)._44 LADEF V4u v4u(unsigned int x, unsigned int y, unsigned int z, unsigned int w); LADEF V4u v4uu(unsigned int x); LADEF V4u v4u2f(V2f a); diff --git a/src/lag.c b/src/lag.c index 50f46c9..48e67e4 100644 --- a/src/lag.c +++ b/src/lag.c @@ -673,6 +673,16 @@ const char *mat_func(size_t rows, size_t cols, Type type, const char *name) } } +const char *mat_ctor(size_t rows, size_t cols, Type type) +{ + if (rows == cols) { + return temp_sprintf("m%zu%s", rows, type_defs[type].suffix); + } else { + return temp_sprintf("m%zux%zu%s", rows, cols, type_defs[type].suffix); + } +} + + void gen_mat_def(FILE *stream, size_t rows, size_t cols, Type type) { fgenf(stream, "typedef union {"); @@ -693,6 +703,32 @@ void gen_mat_def(FILE *stream, size_t rows, size_t cols, Type type) fgen_line_break(stream); } +void gen_mat_printf_macros(FILE *stream, size_t rows, size_t cols, Type type) +{ + fprintf(stream, "#define %s_Fmt \"%s(\\n\" \\\n", mat_type(rows, cols, type), mat_ctor(rows, cols, type)); + for (size_t y = 0; y < rows; ++y) { + fprintf(stream, " \" "); + for (size_t x = 0; x < cols; ++x) { + if (x > 0) fprintf(stream, ", "); + fprintf(stream, "%%%s", type_defs[type].fmt); + } + if (y + 1 < rows) fprintf(stream, ","); + fgenf(stream, "\\n\" \\"); + } + fgenf(stream, "\")\""); + + fprintf(stream, "#define %s_Arg(m) \\\n", mat_type(rows, cols, type)); + for (size_t y = 0; y < rows; ++y) { + fprintf(stream, " "); + for (size_t x = 0; x < cols; ++x) { + if (x > 0) fprintf(stream, ", "); + fprintf(stream, "(m)._%zu%zu", y + 1, x + 1); + } + if (y + 1 < rows) fprintf(stream, ", \\\n"); + } + fgen_line_break(stream); +} + void gen_mat_id(FILE *stream, size_t n, Type type, bool impl) { gen_sig_begin(stream, mat_type(n, n, type), mat_func(n, n, type, "id")); @@ -906,6 +942,7 @@ int main() for (size_t n = VECTOR_MIN_SIZE; n <= VECTOR_MAX_SIZE; ++n) { for (Type type = 0; type < COUNT_TYPES; ++type) { gen_vec_printf_macros(stream, n, type); + gen_mat_printf_macros(stream, n, n, type); gen_vec_ctor(stream, n, type, false); gen_scalar_ctor(stream, n, type, false); for (size_t src_n = VECTOR_MIN_SIZE; src_n <= VECTOR_MAX_SIZE; ++src_n) {