/* * Copyright (c), Recep Aslantas. * * MIT License (MIT), http://opensource.org/licenses/MIT * Full license can be found in the LICENSE file */ /* Functions: CGLM_INLINE void glm_mat4_print(mat4 matrix, FILE *ostream); CGLM_INLINE void glm_mat3_print(mat3 matrix, FILE *ostream); CGLM_INLINE void glm_vec4_print(vec4 vec, FILE *ostream); CGLM_INLINE void glm_vec3_print(vec3 vec, FILE *ostream); CGLM_INLINE void glm_ivec3_print(ivec3 vec, FILE *ostream); CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream); */ /* cglm tried to enable print functions in debug mode and disable them in release/production mode to eliminate printing costs. if you need to force enable then define CGLM_DEFINE_PRINTS macro not DEBUG one Print functions are enabled if: - DEBUG or _DEBUG macro is defined (mostly defined automatically in debugging) - CGLM_DEFINE_PRINTS macro is defined including release/production which makes enabled printing always - glmc_ calls for io are always prints */ /* DEPRECATED: CGLM_NO_PRINTS_NOOP (use CGLM_DEFINE_PRINTS) */ #ifndef cglm_io_h #define cglm_io_h #if defined(DEBUG) || defined(_DEBUG) \ || defined(CGLM_DEFINE_PRINTS) || defined(CGLM_LIB_SRC) \ || defined(CGLM_NO_PRINTS_NOOP) #include "common.h" #include #include #ifndef CGLM_PRINT_PRECISION # define CGLM_PRINT_PRECISION 5 #endif #ifndef CGLM_PRINT_MAX_TO_SHORT # define CGLM_PRINT_MAX_TO_SHORT 1e5 #endif #ifndef CGLM_PRINT_COLOR # define CGLM_PRINT_COLOR "\033[36m" #endif #ifndef CGLM_PRINT_COLOR_RESET # define CGLM_PRINT_COLOR_RESET "\033[0m" #endif CGLM_INLINE void glm_mat4_print(mat4 matrix, FILE * __restrict ostream) { char buff[16]; int i, j, cw[4], cwi; #define m 4 #define n 4 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++) { for (j = 0; j < n; j++) { 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); } } 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) { char buff[16]; int i, j, cw[4], cwi; #define m 3 #define n 3 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++) { for (j = 0; j < n; j++) { 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); } } 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_mat2_print(mat2 matrix, FILE * __restrict ostream) { char buff[16]; int i, j, cw[4], cwi; #define m 2 #define n 2 fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n); cw[0] = cw[1] = 0; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { 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); } } 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_vec4_print(vec4 vec, FILE * __restrict ostream) { int i; #define m 4 fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m); for (i = 0; i < m; i++) { if (vec[i] < CGLM_PRINT_MAX_TO_SHORT) fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]); else fprintf(ostream, " % g", vec[i]); } fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n"); #undef m } CGLM_INLINE void glm_vec3_print(vec3 vec, FILE * __restrict ostream) { int i; #define m 3 fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m); for (i = 0; i < m; i++) { if (vec[i] < CGLM_PRINT_MAX_TO_SHORT) fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]); else fprintf(ostream, " % g", vec[i]); } fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n"); #undef m } CGLM_INLINE void glm_ivec3_print(ivec3 vec, FILE * __restrict ostream) { int i; #define m 3 fprintf(ostream, "Vector (int%d): " CGLM_PRINT_COLOR "\n (", m); for (i = 0; i < m; i++) fprintf(ostream, " % d", vec[i]); fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n"); #undef m } CGLM_INLINE void glm_vec2_print(vec2 vec, FILE * __restrict ostream) { int i; #define m 2 fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m); for (i = 0; i < m; i++) { if (vec[i] < CGLM_PRINT_MAX_TO_SHORT) fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]); else fprintf(ostream, " % g", vec[i]); } fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n"); #undef m } CGLM_INLINE void glm_versor_print(versor vec, FILE * __restrict ostream) { int i; #define m 4 fprintf(ostream, "Quaternion (float%d): " CGLM_PRINT_COLOR "\n (", m); for (i = 0; i < m; i++) { if (vec[i] < CGLM_PRINT_MAX_TO_SHORT) fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]); else fprintf(ostream, " % g", vec[i]); } fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n"); #undef m } CGLM_INLINE void glm_aabb_print(vec3 bbox[2], const char * __restrict tag, FILE * __restrict ostream) { int i, j; #define m 3 fprintf(ostream, "AABB (%s): " CGLM_PRINT_COLOR "\n", tag ? tag: "float"); for (i = 0; i < 2; i++) { fprintf(ostream, " ("); for (j = 0; j < m; j++) { 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, CGLM_PRINT_COLOR_RESET "\n"); #undef m } #else #include "common.h" #include #include /* NOOP: Remove print from DEBUG */ #define glm_mat4_print(v, s) (void)v; (void)s; #define glm_mat3_print(v, s) (void)v; (void)s; #define glm_mat2_print(v, s) (void)v; (void)s; #define glm_vec4_print(v, s) (void)v; (void)s; #define glm_vec3_print(v, s) (void)v; (void)s; #define glm_ivec3_print(v, s) (void)v; (void)s; #define glm_vec2_print(v, s) (void)v; (void)s; #define glm_versor_print(v, s) (void)v; (void)s; #define glm_aabb_print(v, t, s) (void)v; (void)t; (void)s; #endif #endif /* cglm_io_h */