diff --git a/docs/source/io.rst b/docs/source/io.rst index 34fe696..cead0be 100644 --- a/docs/source/io.rst +++ b/docs/source/io.rst @@ -28,6 +28,23 @@ Example to print mat4 matrix: (you probably will in some cases), you can change it temporary. cglm may provide precision parameter in the future +Changes since **v0.7.3**: +* Now mis-alignment of columns are fixed: larger numbers are printed via %g and others are printed via %f. Column withs are calculated before print. +* Now values are colorful ;) +* Some print improvements +* New options with default values: + +.. code-block:: c + + #define CGLM_PRINT_PRECISION 5 + #define CGLM_PRINT_MAX_TO_SHORT 1e5 + #define CGLM_PRINT_COLOR "\033[36m" + #define CGLM_PRINT_COLOR_RESET "\033[0m" + +* Inline prints are only enabled in DEBUG mode and if **CGLM_DEFINE_PRINTS** is defined. + +Check options page. + Table of contents (click to go): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/opt.rst b/docs/source/opt.rst index 6deca67..94b9a0c 100644 --- a/docs/source/opt.rst +++ b/docs/source/opt.rst @@ -50,3 +50,24 @@ You have to extra options for dot product: **CGLM_SSE4_DOT** and **CGLM_SSE3_DOT - If **SSE3** is enabled then you can define **CGLM_SSE3_DOT** to force cglm to use **_mm_hadd_ps** instructions. otherwise cglm will use custom cglm's hadd functions which are optimized too. + +Print Options +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. **CGLM_DEFINE_PRINTS** +2. **CGLM_NO_PRINTS_NOOP** + +Inline prints are only enabled in DEBUG mode and if **CGLM_DEFINE_PRINTS** is defined. +If DEBUG is not enabled then print function bodies will be emptied to eliminate print function calls. +You can disable this feature too by defining **CGLM_NO_PRINTS_NOOP** macro top of cglm headers. + +3. **CGLM_PRINT_PRECISION** 5 + +precision. + +4. **CGLM_PRINT_MAX_TO_SHORT** 1e5 + +if a number is greater than this value then %g will be used, since this is shorten print you won't be able to see high precision. + +5. **CGLM_PRINT_COLOR** "\033[36m" +6. **CGLM_PRINT_COLOR_RESET** "\033[0m" diff --git a/include/cglm/call/io.h b/include/cglm/call/io.h index b6c50f6..19ea06f 100644 --- a/include/cglm/call/io.h +++ b/include/cglm/call/io.h @@ -7,6 +7,7 @@ #ifndef cglmc_io_h #define cglmc_io_h + #ifdef __cplusplus extern "C" { #endif diff --git a/include/cglm/common.h b/include/cglm/common.h index 83d54be..8596970 100644 --- a/include/cglm/common.h +++ b/include/cglm/common.h @@ -8,7 +8,8 @@ #ifndef cglm_common_h #define cglm_common_h -#define _USE_MATH_DEFINES /* for windows */ +#define _USE_MATH_DEFINES /* for windows */ +#define _CRT_SECURE_NO_WARNINGS /* for windows */ #include #include diff --git a/include/cglm/euler.h b/include/cglm/euler.h index 8ae0c83..725a205 100644 --- a/include/cglm/euler.h +++ b/include/cglm/euler.h @@ -55,8 +55,6 @@ typedef enum glm_euler_seq { GLM_EULER_ZYX = 2 << 0 | 1 << 2 | 0 << 4 } glm_euler_seq; -typedef glm_euler_seq glm_euler_sq; - CGLM_INLINE glm_euler_seq glm_euler_order(int ord[3]) { diff --git a/include/cglm/io.h b/include/cglm/io.h index c714400..18c21da 100644 --- a/include/cglm/io.h +++ b/include/cglm/io.h @@ -17,67 +17,99 @@ #ifndef cglm_io_h #define cglm_io_h +#if defined(DEBUG) || defined(_DEBUG) \ + || defined(CGLM_DEFINE_PRINTS) || defined(CGLM_LIB_SRC) #include "common.h" #include #include +#define CGLM_PRINT_PRECISION 5 +#define CGLM_PRINT_MAX_TO_SHORT 1e5 +#define CGLM_PRINT_COLOR "\033[36m" +#define CGLM_PRINT_COLOR_RESET "\033[0m" + CGLM_INLINE void glm_mat4_print(mat4 matrix, FILE * __restrict ostream) { - int i; - int j; + char buff[16]; + int i, j, cw[4], cwi; #define m 4 #define n 4 - fprintf(ostream, "Matrix (float%dx%d):\n", m, n); + fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n" , m, n); + + cw[0] = cw[1] = cw[2] = cw[3] = 0; for (i = 0; i < m; i++) { - fprintf(ostream, "\t|"); for (j = 0; j < n; j++) { - fprintf(ostream, "%0.4f", matrix[j][i]);; - - if (j != n - 1) - fprintf(ostream, "\t"); + if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT) + cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]); + else + cwi = sprintf(buff, "% g", matrix[i][j]); + cw[i] = GLM_MAX(cw[i], cwi); } - - fprintf(ostream, "|\n"); } - fprintf(ostream, "\n"); + for (i = 0; i < m; i++) { + fprintf(ostream, " |"); + + for (j = 0; j < n; j++) + if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT) + fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]); + else + fprintf(ostream, " % *g", cw[j], matrix[j][i]); + + fprintf(ostream, " |\n"); + } + + fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n"); #undef m #undef n } + CGLM_INLINE void glm_mat3_print(mat3 matrix, FILE * __restrict ostream) { - int i; - int j; + char buff[16]; + int i, j, cw[4], cwi; #define m 3 #define n 3 - fprintf(ostream, "Matrix (float%dx%d):\n", m, n); + fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n); + + cw[0] = cw[1] = cw[2] = 0; for (i = 0; i < m; i++) { - fprintf(ostream, "\t|"); for (j = 0; j < n; j++) { - fprintf(ostream, "%0.4f", matrix[j][i]);; - - if (j != n - 1) - fprintf(ostream, "\t"); + if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT) + cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]); + else + cwi = sprintf(buff, "% g", matrix[i][j]); + cw[i] = GLM_MAX(cw[i], cwi); } - - fprintf(ostream, "|\n"); } - fprintf(ostream, "\n"); + for (i = 0; i < m; i++) { + fprintf(ostream, " |"); + + for (j = 0; j < n; j++) + if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT) + fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]); + else + fprintf(ostream, " % *g", cw[j], matrix[j][i]); + + fprintf(ostream, " |\n"); + } + + fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n"); #undef m #undef n @@ -87,27 +119,39 @@ CGLM_INLINE void glm_mat2_print(mat2 matrix, FILE * __restrict ostream) { - int i; - int j; + char buff[16]; + int i, j, cw[4], cwi; #define m 2 #define n 2 - fprintf(ostream, "Matrix (float%dx%d):\n", m, n); + fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n); + + cw[0] = cw[1] = 0; for (i = 0; i < m; i++) { - fprintf(ostream, "\t|"); for (j = 0; j < n; j++) { - fprintf(ostream, "%0.4f", matrix[j][i]);; - - if (j != n - 1) - fprintf(ostream, "\t"); + if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT) + cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]); + else + cwi = sprintf(buff, "% g", matrix[i][j]); + cw[i] = GLM_MAX(cw[i], cwi); } - - fprintf(ostream, "|\n"); } - fprintf(ostream, "\n"); + for (i = 0; i < m; i++) { + fprintf(ostream, " |"); + + for (j = 0; j < n; j++) + if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT) + fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]); + else + fprintf(ostream, " % *g", cw[j], matrix[j][i]); + + fprintf(ostream, " |\n"); + } + + fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n"); #undef m #undef n @@ -121,16 +165,16 @@ glm_vec4_print(vec4 vec, #define m 4 - fprintf(ostream, "Vector (float%d):\n\t|", m); + fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m); for (i = 0; i < m; i++) { - fprintf(ostream, "%0.4f", vec[i]); - - if (i != m - 1) - fprintf(ostream, "\t"); + if (vec[i] < CGLM_PRINT_MAX_TO_SHORT) + fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]); + else + fprintf(ostream, " % g", vec[i]); } - fprintf(ostream, "|\n\n"); + fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n"); #undef m } @@ -143,16 +187,16 @@ glm_vec3_print(vec3 vec, #define m 3 - fprintf(ostream, "Vector (float%d):\n\t|", m); + fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m); for (i = 0; i < m; i++) { - fprintf(ostream, "%0.4f", vec[i]); - - if (i != m - 1) - fprintf(ostream, "\t"); + if (vec[i] < CGLM_PRINT_MAX_TO_SHORT) + fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]); + else + fprintf(ostream, " % g", vec[i]); } - fprintf(ostream, "|\n\n"); + fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n"); #undef m } @@ -165,16 +209,12 @@ glm_ivec3_print(ivec3 vec, #define m 3 - fprintf(ostream, "Vector (int%d):\n\t|", m); + fprintf(ostream, "Vector (int%d): " CGLM_PRINT_COLOR "\n (", m); - for (i = 0; i < m; i++) { - fprintf(ostream, "%d", vec[i]); + for (i = 0; i < m; i++) + fprintf(ostream, " % d", vec[i]); - if (i != m - 1) - fprintf(ostream, "\t"); - } - - fprintf(ostream, "|\n\n"); + fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n"); #undef m } @@ -187,16 +227,16 @@ glm_vec2_print(vec2 vec, #define m 2 - fprintf(ostream, "Vector (float%d):\n\t|", m); + fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m); for (i = 0; i < m; i++) { - fprintf(ostream, "%0.4f", vec[i]); - - if (i != m - 1) - fprintf(ostream, "\t"); + if (vec[i] < CGLM_PRINT_MAX_TO_SHORT) + fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]); + else + fprintf(ostream, " % g", vec[i]); } - fprintf(ostream, "|\n\n"); + fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n"); #undef m } @@ -209,16 +249,17 @@ glm_versor_print(versor vec, #define m 4 - fprintf(ostream, "Versor (float%d):\n\t|", m); + fprintf(ostream, "Quaternion (float%d): " CGLM_PRINT_COLOR "\n (", m); for (i = 0; i < m; i++) { - fprintf(ostream, "%0.4f", vec[i]); - - if (i != m - 1) - fprintf(ostream, "\t"); + if (vec[i] < CGLM_PRINT_MAX_TO_SHORT) + fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]); + else + fprintf(ostream, " % g", vec[i]); } - fprintf(ostream, "|\n\n"); + + fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n"); #undef m } @@ -232,24 +273,42 @@ glm_aabb_print(vec3 bbox[2], #define m 3 - fprintf(ostream, "AABB (%s):\n", tag ? tag: "float"); + fprintf(ostream, "AABB (%s): " CGLM_PRINT_COLOR "\n", tag ? tag: "float"); for (i = 0; i < 2; i++) { - fprintf(ostream, "\t|"); - + fprintf(ostream, " ("); + for (j = 0; j < m; j++) { - fprintf(ostream, "%0.4f", bbox[i][j]); - - if (j != m - 1) - fprintf(ostream, "\t"); + if (bbox[i][j] < CGLM_PRINT_MAX_TO_SHORT) + fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, bbox[i][j]); + else + fprintf(ostream, " % g", bbox[i][j]); } - fprintf(ostream, "|\n"); + fprintf(ostream, " )\n"); } - fprintf(ostream, "\n"); + fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n"); #undef m } +#elif !defined(CGLM_NO_PRINTS_NOOP) + +#include "common.h" + +#include +#include + +/* NOOP: Remove print from DEBUG */ +CGLM_INLINE void glm_mat4_print(mat4 matrix, FILE *o) { } +CGLM_INLINE void glm_mat3_print(mat3 matrix, FILE *o) { } +CGLM_INLINE void glm_mat2_print(mat2 matrix, FILE *o) { } +CGLM_INLINE void glm_vec4_print(vec4 vec, FILE *o) { } +CGLM_INLINE void glm_vec3_print(vec3 vec, FILE *o) { } +CGLM_INLINE void glm_ivec3_print(ivec3 vec, FILE *o) { } +CGLM_INLINE void glm_vec2_print(vec2 vec, FILE *o) { } +CGLM_INLINE void glm_versor_print(versor vec, FILE *o) { } +CGLM_INLINE void glm_aabb_print(vec3 bbox[2], const char *t, FILE *o) { } +#endif #endif /* cglm_io_h */ diff --git a/src/io.c b/src/io.c index fb2b5a9..fd81dac 100644 --- a/src/io.c +++ b/src/io.c @@ -5,6 +5,8 @@ * Full license can be found in the LICENSE file */ +#define CGLM_LIB_SRC + #include "../include/cglm/cglm.h" #include "../include/cglm/call.h" diff --git a/test/include/common.h b/test/include/common.h index 3c32b9f..c5529e4 100644 --- a/test/include/common.h +++ b/test/include/common.h @@ -8,6 +8,9 @@ #ifndef tests_common_h #define tests_common_h +#define _USE_MATH_DEFINES /* for windows */ +#define _CRT_SECURE_NO_WARNINGS /* for windows */ + #include #include #include