1 /////////////////////////////////////////////////////////////////////////////////////////////////// 2 // OpenGL Mathematics Copyright (c) 2006 G-Truc Creation (www.g-truc.net) 3 /////////////////////////////////////////////////////////////////////////////////////////////////// 4 // Created : 2008-04-27 5 // Updated : 2008-05-24 6 // Licence : This source is under MIT License 7 // File : glm/gtx/string_cast.hpp 8 /////////////////////////////////////////////////////////////////////////////////////////////////// 9 10 #include <cstdarg> 11 #include <cstdio> 12 13 namespace glm{ 14 namespace detail 15 { 16 GLM_FUNC_QUALIFIER std::string format(const char* msg, ...) 17 { 18 std::size_t const STRING_BUFFER(4096); 19 char text[STRING_BUFFER]; 20 va_list list; 21 22 if(msg == 0) 23 return std::string(); 24 25 va_start(list, msg); 26 # if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC8)) 27 vsprintf_s(text, STRING_BUFFER, msg, list); 28 # else// 29 vsprintf(text, msg, list); 30 # endif// 31 va_end(list); 32 33 return std::string(text); 34 } 35 36 static const char* True = "true"; 37 static const char* False = "false"; 38 }//namespace detail 39 40 //////////////////////////////// 41 // Scalars 42 43 GLM_FUNC_QUALIFIER std::string to_string(float x) 44 { 45 return detail::format("float(%f)", x); 46 } 47 48 GLM_FUNC_QUALIFIER std::string to_string(double x) 49 { 50 return detail::format("double(%f)", x); 51 } 52 53 GLM_FUNC_QUALIFIER std::string to_string(int x) 54 { 55 return detail::format("int(%d)", x); 56 } 57 58 GLM_FUNC_QUALIFIER std::string to_string(unsigned int x) 59 { 60 return detail::format("uint(%d)", x); 61 } 62 63 //////////////////////////////// 64 // Bool vectors 65 66 template <precision P> 67 GLM_FUNC_QUALIFIER std::string to_string 68 ( 69 detail::tvec2<bool, P> const & v 70 ) 71 { 72 return detail::format("bvec2(%s, %s)", 73 v.x ? detail::True : detail::False, 74 v.y ? detail::True : detail::False); 75 } 76 77 template <precision P> 78 GLM_FUNC_QUALIFIER std::string to_string 79 ( 80 detail::tvec3<bool, P> const & v 81 ) 82 { 83 return detail::format("bvec3(%s, %s, %s)", 84 v.x ? detail::True : detail::False, 85 v.y ? detail::True : detail::False, 86 v.z ? detail::True : detail::False); 87 } 88 89 template <precision P> 90 GLM_FUNC_QUALIFIER std::string to_string 91 ( 92 detail::tvec4<bool, P> const & v 93 ) 94 { 95 return detail::format("bvec4(%s, %s, %s, %s)", 96 v.x ? detail::True : detail::False, 97 v.y ? detail::True : detail::False, 98 v.z ? detail::True : detail::False, 99 v.w ? detail::True : detail::False); 100 } 101 102 //////////////////////////////// 103 // Float vectors 104 105 template <precision P> 106 GLM_FUNC_QUALIFIER std::string to_string 107 ( 108 detail::tvec2<float, P> const & v 109 ) 110 { 111 return detail::format("fvec2(%f, %f)", v.x, v.y); 112 } 113 114 template <precision P> 115 GLM_FUNC_QUALIFIER std::string to_string 116 ( 117 detail::tvec3<float, P> const & v 118 ) 119 { 120 return detail::format("fvec3(%f, %f, %f)", v.x, v.y, v.z); 121 } 122 123 template <precision P> 124 GLM_FUNC_QUALIFIER std::string to_string 125 ( 126 detail::tvec4<float, P> const & v 127 ) 128 { 129 return detail::format("fvec4(%f, %f, %f, %f)", v.x, v.y, v.z, v.w); 130 } 131 132 //////////////////////////////// 133 // Double vectors 134 135 template <precision P> 136 GLM_FUNC_QUALIFIER std::string to_string 137 ( 138 detail::tvec2<double, P> const & v 139 ) 140 { 141 return detail::format("dvec2(%f, %f)", v.x, v.y); 142 } 143 144 template <precision P> 145 GLM_FUNC_QUALIFIER std::string to_string 146 ( 147 detail::tvec3<double, P> const & v 148 ) 149 { 150 return detail::format("dvec3(%f, %f, %f)", v.x, v.y, v.z); 151 } 152 153 template <precision P> 154 GLM_FUNC_QUALIFIER std::string to_string 155 ( 156 detail::tvec4<double, P> const & v 157 ) 158 { 159 return detail::format("dvec4(%f, %f, %f, %f)", v.x, v.y, v.z, v.w); 160 } 161 162 //////////////////////////////// 163 // Int vectors 164 165 template <precision P> 166 GLM_FUNC_QUALIFIER std::string to_string 167 ( 168 detail::tvec2<int, P> const & v 169 ) 170 { 171 return detail::format("ivec2(%d, %d)", v.x, v.y); 172 } 173 174 template <precision P> 175 GLM_FUNC_QUALIFIER std::string to_string 176 ( 177 detail::tvec3<int, P> const & v 178 ) 179 { 180 return detail::format("ivec3(%d, %d, %d)", v.x, v.y, v.z); 181 } 182 183 template <precision P> 184 GLM_FUNC_QUALIFIER std::string to_string 185 ( 186 detail::tvec4<int, P> const & v 187 ) 188 { 189 return detail::format("ivec4(%d, %d, %d, %d)", v.x, v.y, v.z, v.w); 190 } 191 192 //////////////////////////////// 193 // Unsigned int vectors 194 195 template <precision P> 196 GLM_FUNC_QUALIFIER std::string to_string 197 ( 198 detail::tvec2<unsigned int, P> const & v 199 ) 200 { 201 return detail::format("uvec2(%d, %d)", v.x, v.y); 202 } 203 204 template <precision P> 205 GLM_FUNC_QUALIFIER std::string to_string 206 ( 207 detail::tvec3<unsigned int, P> const & v 208 ) 209 { 210 return detail::format("uvec3(%d, %d, %d)", v.x, v.y, v.z); 211 } 212 213 template <precision P> 214 GLM_FUNC_QUALIFIER std::string to_string 215 ( 216 detail::tvec4<unsigned int, P> const & v 217 ) 218 { 219 return detail::format("uvec4(%d, %d, %d, %d)", v.x, v.y, v.z, v.w); 220 } 221 222 //////////////////////////////// 223 // Float matrices 224 225 template <precision P> 226 GLM_FUNC_QUALIFIER std::string to_string 227 ( 228 detail::tmat2x2<float, P> const & x 229 ) 230 { 231 return detail::format("mat2x2((%f, %f), (%f, %f))", 232 x[0][0], x[0][1], 233 x[1][0], x[1][1]); 234 } 235 236 template <precision P> 237 GLM_FUNC_QUALIFIER std::string to_string 238 ( 239 detail::tmat2x3<float, P> const & x 240 ) 241 { 242 return detail::format("mat2x3((%f, %f, %f), (%f, %f, %f))", 243 x[0][0], x[0][1], x[0][2], 244 x[1][0], x[1][1], x[1][2]); 245 } 246 247 template <precision P> 248 GLM_FUNC_QUALIFIER std::string to_string 249 ( 250 detail::tmat2x4<float, P> const & x 251 ) 252 { 253 return detail::format("mat2x4((%f, %f, %f, %f), (%f, %f, %f, %f))", 254 x[0][0], x[0][1], x[0][2], x[0][3], 255 x[1][0], x[1][1], x[1][2], x[1][3]); 256 } 257 258 template <precision P> 259 GLM_FUNC_QUALIFIER std::string to_string 260 ( 261 detail::tmat3x2<float, P> const & x 262 ) 263 { 264 return detail::format("mat3x2((%f, %f), (%f, %f), (%f, %f))", 265 x[0][0], x[0][1], 266 x[1][0], x[1][1], 267 x[2][0], x[2][1]); 268 } 269 270 template <precision P> 271 GLM_FUNC_QUALIFIER std::string to_string 272 ( 273 detail::tmat3x3<float, P> const & x 274 ) 275 { 276 return detail::format("mat3x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f))", 277 x[0][0], x[0][1], x[0][2], 278 x[1][0], x[1][1], x[1][2], 279 x[2][0], x[2][1], x[2][2]); 280 } 281 282 template <precision P> 283 GLM_FUNC_QUALIFIER std::string to_string 284 ( 285 detail::tmat3x4<float, P> const & x 286 ) 287 { 288 return detail::format("mat3x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))", 289 x[0][0], x[0][1], x[0][2], x[0][3], 290 x[1][0], x[1][1], x[1][2], x[1][3], 291 x[2][0], x[2][1], x[2][2], x[2][3]); 292 } 293 294 template <precision P> 295 GLM_FUNC_QUALIFIER std::string to_string 296 ( 297 detail::tmat4x2<float, P> const & x 298 ) 299 { 300 return detail::format("mat4x2((%f, %f), (%f, %f), (%f, %f), (%f, %f))", 301 x[0][0], x[0][1], 302 x[1][0], x[1][1], 303 x[2][0], x[2][1], 304 x[3][0], x[3][1]); 305 } 306 307 template <precision P> 308 GLM_FUNC_QUALIFIER std::string to_string 309 ( 310 detail::tmat4x3<float, P> const & x 311 ) 312 { 313 return detail::format("mat4x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f), (%f, %f, %f))", 314 x[0][0], x[0][1], x[0][2], 315 x[1][0], x[1][1], x[1][2], 316 x[2][0], x[2][1], x[2][2], 317 x[3][0], x[3][1], x[3][2]); 318 } 319 320 template <precision P> 321 GLM_FUNC_QUALIFIER std::string to_string 322 ( 323 detail::tmat4x4<float, P> const & x 324 ) 325 { 326 return detail::format("mat4x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))", 327 x[0][0], x[0][1], x[0][2], x[0][3], 328 x[1][0], x[1][1], x[1][2], x[1][3], 329 x[2][0], x[2][1], x[2][2], x[2][3], 330 x[3][0], x[3][1], x[3][2], x[3][3]); 331 } 332 333 //////////////////////////////// 334 // Double matrices 335 336 template <precision P> 337 GLM_FUNC_QUALIFIER std::string to_string 338 ( 339 detail::tmat2x2<double, P> const & x 340 ) 341 { 342 return detail::format("dmat2x2((%f, %f), (%f, %f))", 343 x[0][0], x[0][1], 344 x[1][0], x[1][1]); 345 } 346 347 template <precision P> 348 GLM_FUNC_QUALIFIER std::string to_string 349 ( 350 detail::tmat2x3<double, P> const & x 351 ) 352 { 353 return detail::format("dmat2x3((%f, %f, %f), (%f, %f, %f))", 354 x[0][0], x[0][1], x[0][2], 355 x[1][0], x[1][1], x[1][2]); 356 } 357 358 template <precision P> 359 GLM_FUNC_QUALIFIER std::string to_string 360 ( 361 detail::tmat2x4<double, P> const & x 362 ) 363 { 364 return detail::format("dmat2x4((%f, %f, %f, %f), (%f, %f, %f, %f))", 365 x[0][0], x[0][1], x[0][2], x[0][3], 366 x[1][0], x[1][1], x[1][2], x[1][3]); 367 } 368 369 template <precision P> 370 GLM_FUNC_QUALIFIER std::string to_string 371 ( 372 detail::tmat3x2<double, P> const & x 373 ) 374 { 375 return detail::format("dmat3x2((%f, %f), (%f, %f), (%f, %f))", 376 x[0][0], x[0][1], 377 x[1][0], x[1][1], 378 x[2][0], x[2][1]); 379 } 380 381 template <precision P> 382 GLM_FUNC_QUALIFIER std::string to_string 383 ( 384 detail::tmat3x3<double, P> const & x 385 ) 386 { 387 return detail::format("dmat3x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f))", 388 x[0][0], x[0][1], x[0][2], 389 x[1][0], x[1][1], x[1][2], 390 x[2][0], x[2][1], x[2][2]); 391 } 392 393 template <precision P> 394 GLM_FUNC_QUALIFIER std::string to_string 395 ( 396 detail::tmat3x4<double, P> const & x 397 ) 398 { 399 return detail::format("dmat3x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))", 400 x[0][0], x[0][1], x[0][2], x[0][3], 401 x[1][0], x[1][1], x[1][2], x[1][3], 402 x[2][0], x[2][1], x[2][2], x[2][3]); 403 } 404 405 template <precision P> 406 GLM_FUNC_QUALIFIER std::string to_string 407 ( 408 detail::tmat4x2<double, P> const & x 409 ) 410 { 411 return detail::format("dmat4x2((%f, %f), (%f, %f), (%f, %f), (%f, %f))", 412 x[0][0], x[0][1], 413 x[1][0], x[1][1], 414 x[2][0], x[2][1], 415 x[3][0], x[3][1]); 416 } 417 418 template <precision P> 419 GLM_FUNC_QUALIFIER std::string to_string 420 ( 421 detail::tmat4x3<double, P> const & x 422 ) 423 { 424 return detail::format("dmat4x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f), (%f, %f, %f))", 425 x[0][0], x[0][1], x[0][2], 426 x[1][0], x[1][1], x[1][2], 427 x[2][0], x[2][1], x[2][2], 428 x[3][0], x[3][1], x[3][2]); 429 } 430 431 template <precision P> 432 GLM_FUNC_QUALIFIER std::string to_string 433 ( 434 detail::tmat4x4<double, P> const & x 435 ) 436 { 437 return detail::format("dmat4x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))", 438 x[0][0], x[0][1], x[0][2], x[0][3], 439 x[1][0], x[1][1], x[1][2], x[1][3], 440 x[2][0], x[2][1], x[2][2], x[2][3], 441 x[3][0], x[3][1], x[3][2], x[3][3]); 442 } 443 444 }//namespace glm 445