• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
13namespace glm{
14namespace 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