1
// Copyright (C) 2002-2011 Nikolaus Gebhardt
2
// This file is part of the "Irrlicht Engine".
3
// For conditions of distribution and use, see copyright notice in irrlicht.h
5
#include "CAttributes.h"
8
#include "IVideoDriver.h"
19
// Attribute implemented for boolean values
20
class CBoolAttribute : public IAttribute
24
CBoolAttribute(const char* name, bool value)
32
return BoolValue ? 1 : 0;
35
virtual f32 getFloat()
37
return BoolValue ? 1.0f : 0.0f;
40
virtual bool getBool()
45
virtual core::stringw getStringW()
47
return core::stringw( BoolValue ? L"true" : L"false" );
50
virtual void setInt(s32 intValue)
52
BoolValue = (intValue != 0);
55
virtual void setFloat(f32 floatValue)
57
BoolValue = (floatValue != 0);
60
virtual void setBool(bool boolValue)
62
BoolValue = boolValue;
65
virtual void setString(const char* string)
67
BoolValue = strcmp(string, "true") == 0;
70
virtual E_ATTRIBUTE_TYPE getType() const
75
virtual const wchar_t* getTypeString() const
83
// Attribute implemented for integers
84
class CIntAttribute : public IAttribute
88
CIntAttribute(const char* name, s32 value)
99
virtual f32 getFloat()
104
virtual bool getBool()
109
virtual core::stringw getStringW()
111
return core::stringw(Value);
114
virtual void setInt(s32 intValue)
119
virtual void setFloat(f32 floatValue)
121
Value = (s32)floatValue;
124
virtual void setString(const char* text)
129
virtual E_ATTRIBUTE_TYPE getType() const
135
virtual const wchar_t* getTypeString() const
143
// Attribute implemented for floats
144
class CFloatAttribute : public IAttribute
148
CFloatAttribute(const char* name, f32 value)
159
virtual f32 getFloat()
164
virtual bool getBool()
169
virtual core::stringw getStringW()
171
return core::stringw(Value);
174
virtual void setInt(s32 intValue)
176
Value = (f32)intValue;
179
virtual void setFloat(f32 floatValue)
184
virtual void setString(const char* text)
186
Value = core::fast_atof(text);
189
virtual E_ATTRIBUTE_TYPE getType() const
195
virtual const wchar_t* getTypeString() const
206
Types which can be represented as a list of numbers
209
// Base class for all attributes which are a list of numbers-
210
// vectors, colors, positions, triangles, etc
211
class CNumbersAttribute : public IAttribute
215
CNumbersAttribute(const char* name, video::SColorf value) :
216
ValueI(), ValueF(), Count(4), IsFloat(true)
219
ValueF.push_back(value.r);
220
ValueF.push_back(value.g);
221
ValueF.push_back(value.b);
222
ValueF.push_back(value.a);
225
CNumbersAttribute(const char* name, video::SColor value) :
226
ValueI(), ValueF(), Count(4), IsFloat(false)
229
ValueI.push_back(value.getRed());
230
ValueI.push_back(value.getGreen());
231
ValueI.push_back(value.getBlue());
232
ValueI.push_back(value.getAlpha());
236
CNumbersAttribute(const char* name, core::vector3df value) :
237
ValueI(), ValueF(), Count(3), IsFloat(true)
240
ValueF.push_back(value.X);
241
ValueF.push_back(value.Y);
242
ValueF.push_back(value.Z);
245
CNumbersAttribute(const char* name, core::rect<s32> value) :
246
ValueI(), ValueF(), Count(4), IsFloat(false)
249
ValueI.push_back(value.UpperLeftCorner.X);
250
ValueI.push_back(value.UpperLeftCorner.Y);
251
ValueI.push_back(value.LowerRightCorner.X);
252
ValueI.push_back(value.LowerRightCorner.Y);
255
CNumbersAttribute(const char* name, core::rect<f32> value) :
256
ValueI(), ValueF(), Count(4), IsFloat(true)
259
ValueF.push_back(value.UpperLeftCorner.X);
260
ValueF.push_back(value.UpperLeftCorner.Y);
261
ValueF.push_back(value.LowerRightCorner.X);
262
ValueF.push_back(value.LowerRightCorner.Y);
265
CNumbersAttribute(const char* name, core::matrix4 value) :
266
ValueI(), ValueF(), Count(16), IsFloat(true)
269
for (s32 r=0; r<4; ++r)
270
for (s32 c=0; c<4; ++c)
271
ValueF.push_back(value(r,c));
274
CNumbersAttribute(const char* name, core::quaternion value) :
275
ValueI(), ValueF(), Count(4), IsFloat(true)
278
ValueF.push_back(value.X);
279
ValueF.push_back(value.Y);
280
ValueF.push_back(value.Z);
281
ValueF.push_back(value.W);
284
CNumbersAttribute(const char* name, core::aabbox3d<f32> value) :
285
ValueI(), ValueF(), Count(6), IsFloat(true)
288
ValueF.push_back(value.MinEdge.X);
289
ValueF.push_back(value.MinEdge.Y);
290
ValueF.push_back(value.MinEdge.Z);
291
ValueF.push_back(value.MaxEdge.X);
292
ValueF.push_back(value.MaxEdge.Y);
293
ValueF.push_back(value.MaxEdge.Z);
296
CNumbersAttribute(const char* name, core::plane3df value) :
297
ValueI(), ValueF(), Count(4), IsFloat(true)
300
ValueF.push_back(value.Normal.X);
301
ValueF.push_back(value.Normal.Y);
302
ValueF.push_back(value.Normal.Z);
303
ValueF.push_back(value.D);
306
CNumbersAttribute(const char* name, core::triangle3df value) :
307
ValueI(), ValueF(), Count(9), IsFloat(true)
310
ValueF.push_back(value.pointA.X);
311
ValueF.push_back(value.pointA.Y);
312
ValueF.push_back(value.pointA.Z);
313
ValueF.push_back(value.pointB.X);
314
ValueF.push_back(value.pointB.Y);
315
ValueF.push_back(value.pointB.Z);
316
ValueF.push_back(value.pointC.X);
317
ValueF.push_back(value.pointC.Y);
318
ValueF.push_back(value.pointC.Z);
321
CNumbersAttribute(const char* name, core::vector2df value) :
322
ValueI(), ValueF(), Count(2), IsFloat(true)
325
ValueF.push_back(value.X);
326
ValueF.push_back(value.Y);
329
CNumbersAttribute(const char* name, core::vector2di value) :
330
ValueI(), ValueF(), Count(2), IsFloat(false)
333
ValueI.push_back(value.X);
334
ValueI.push_back(value.Y);
337
CNumbersAttribute(const char* name, core::line2di value) :
338
ValueI(), ValueF(), Count(4), IsFloat(false)
341
ValueI.push_back(value.start.X);
342
ValueI.push_back(value.start.Y);
343
ValueI.push_back(value.end.X);
344
ValueI.push_back(value.end.Y);
347
CNumbersAttribute(const char* name, core::line2df value) :
348
ValueI(), ValueF(), Count(4), IsFloat(true)
351
ValueF.push_back(value.start.X);
352
ValueF.push_back(value.start.Y);
353
ValueF.push_back(value.end.X);
354
ValueF.push_back(value.end.Y);
357
CNumbersAttribute(const char* name, core::line3df value) :
358
ValueI(), ValueF(), Count(6), IsFloat(true)
361
ValueF.push_back(value.start.X);
362
ValueF.push_back(value.start.Y);
363
ValueF.push_back(value.start.Z);
364
ValueF.push_back(value.end.X);
365
ValueF.push_back(value.end.Y);
366
ValueF.push_back(value.end.Z);
369
CNumbersAttribute(const char* name, core::dimension2du value) :
370
ValueI(), ValueF(), Count(2), IsFloat(false)
373
ValueI.push_back(value.Width);
374
ValueI.push_back(value.Height);
378
CNumbersAttribute(const char* name, core::dimension2df value) :
379
ValueI(), ValueF(), Count(2), IsFloat(true)
382
ValueF.push_back(value.Width);
383
ValueF.push_back(value.Height);
395
return (s32)ValueF[0];
400
virtual f32 getFloat()
408
return (f32)ValueI[0];
411
virtual bool getBool()
413
// return true if any number is nonzero
416
for (u32 i=0; i < Count; ++i)
417
if ( IsFloat ? (ValueF[i] != 0) : (ValueI[i] != 0) )
428
virtual core::stringc getString()
430
core::stringc outstr;
432
for (u32 i=0; i <Count; ++i)
444
virtual core::stringw getStringW()
446
core::stringw outstr;
448
for (u32 i=0; i <Count; ++i)
461
virtual core::position2di getPosition()
467
p.X = (s32)(Count > 0 ? ValueF[0] : 0);
468
p.Y = (s32)(Count > 1 ? ValueF[1] : 0);
472
p.X = Count > 0 ? ValueI[0] : 0;
473
p.Y = Count > 1 ? ValueI[1] : 0;
479
virtual core::vector3df getVector()
485
v.X = Count > 0 ? ValueF[0] : 0;
486
v.Y = Count > 1 ? ValueF[1] : 0;
487
v.Z = Count > 2 ? ValueF[2] : 0;
491
v.X = (f32)(Count > 0 ? ValueI[0] : 0);
492
v.Y = (f32)(Count > 1 ? ValueI[1] : 0);
493
v.Z = (f32)(Count > 2 ? ValueI[2] : 0);
499
virtual video::SColorf getColorf()
504
c.setColorComponentValue(0, Count > 0 ? ValueF[0] : 0);
505
c.setColorComponentValue(1, Count > 1 ? ValueF[1] : 0);
506
c.setColorComponentValue(2, Count > 2 ? ValueF[2] : 0);
507
c.setColorComponentValue(3, Count > 3 ? ValueF[3] : 0);
511
c.setColorComponentValue(0, Count > 0 ? (f32)(ValueI[0]) / 255.0f : 0);
512
c.setColorComponentValue(1, Count > 1 ? (f32)(ValueI[1]) / 255.0f : 0);
513
c.setColorComponentValue(2, Count > 2 ? (f32)(ValueI[2]) / 255.0f : 0);
514
c.setColorComponentValue(3, Count > 3 ? (f32)(ValueI[3]) / 255.0f : 0);
520
virtual video::SColor getColor()
522
return getColorf().toSColor();
526
virtual core::rect<s32> getRect()
532
r.UpperLeftCorner.X = (s32)(Count > 0 ? ValueF[0] : 0);
533
r.UpperLeftCorner.Y = (s32)(Count > 1 ? ValueF[1] : 0);
534
r.LowerRightCorner.X = (s32)(Count > 2 ? ValueF[2] : r.UpperLeftCorner.X);
535
r.LowerRightCorner.Y = (s32)(Count > 3 ? ValueF[3] : r.UpperLeftCorner.Y);
539
r.UpperLeftCorner.X = Count > 0 ? ValueI[0] : 0;
540
r.UpperLeftCorner.Y = Count > 1 ? ValueI[1] : 0;
541
r.LowerRightCorner.X = Count > 2 ? ValueI[2] : r.UpperLeftCorner.X;
542
r.LowerRightCorner.Y = Count > 3 ? ValueI[3] : r.UpperLeftCorner.Y;
547
virtual core::matrix4 getMatrix()
552
for (u32 r=0; r<4; ++r)
553
for (u32 c=0; c<4; ++c)
555
ret(r,c) = ValueF[c+r*4];
559
for (u32 r=0; r<4; ++r)
560
for (u32 c=0; c<4; ++c)
562
ret(r,c) = (f32)ValueI[c+r*4];
567
virtual core::quaternion getQuaternion()
569
core::quaternion ret;
572
ret.X = Count > 0 ? ValueF[0] : 0.0f;
573
ret.Y = Count > 1 ? ValueF[1] : 0.0f;
574
ret.Z = Count > 2 ? ValueF[2] : 0.0f;
575
ret.W = Count > 3 ? ValueF[3] : 0.0f;
579
ret.X = Count > 0 ? (f32)ValueI[0] : 0.0f;
580
ret.Y = Count > 1 ? (f32)ValueI[1] : 0.0f;
581
ret.Z = Count > 2 ? (f32)ValueI[2] : 0.0f;
582
ret.W = Count > 3 ? (f32)ValueI[3] : 0.0f;
587
virtual core::triangle3df getTriangle()
589
core::triangle3df ret;
593
ret.pointA.X = Count > 0 ? ValueF[0] : 0.0f;
594
ret.pointA.Y = Count > 1 ? ValueF[1] : 0.0f;
595
ret.pointA.Z = Count > 2 ? ValueF[2] : 0.0f;
596
ret.pointB.X = Count > 3 ? ValueF[3] : 0.0f;
597
ret.pointB.Y = Count > 4 ? ValueF[4] : 0.0f;
598
ret.pointB.Z = Count > 5 ? ValueF[5] : 0.0f;
599
ret.pointC.X = Count > 6 ? ValueF[6] : 0.0f;
600
ret.pointC.Y = Count > 7 ? ValueF[7] : 0.0f;
601
ret.pointC.Z = Count > 8 ? ValueF[8] : 0.0f;
605
ret.pointA.X = Count > 0 ? (f32)ValueI[0] : 0.0f;
606
ret.pointA.Y = Count > 1 ? (f32)ValueI[1] : 0.0f;
607
ret.pointA.Z = Count > 2 ? (f32)ValueI[2] : 0.0f;
608
ret.pointB.X = Count > 3 ? (f32)ValueI[3] : 0.0f;
609
ret.pointB.Y = Count > 4 ? (f32)ValueI[4] : 0.0f;
610
ret.pointB.Z = Count > 5 ? (f32)ValueI[5] : 0.0f;
611
ret.pointC.X = Count > 6 ? (f32)ValueI[6] : 0.0f;
612
ret.pointC.Y = Count > 7 ? (f32)ValueI[7] : 0.0f;
613
ret.pointC.Z = Count > 8 ? (f32)ValueI[8] : 0.0f;
619
virtual core::plane3df getPlane()
625
ret.Normal.X = Count > 0 ? ValueF[0] : 0.0f;
626
ret.Normal.Y = Count > 1 ? ValueF[1] : 0.0f;
627
ret.Normal.Z = Count > 2 ? ValueF[2] : 0.0f;
628
ret.D = Count > 3 ? ValueF[3] : 0.0f;
632
ret.Normal.X = Count > 0 ? (f32)ValueI[0] : 0.0f;
633
ret.Normal.Y = Count > 1 ? (f32)ValueI[1] : 0.0f;
634
ret.Normal.Z = Count > 2 ? (f32)ValueI[2] : 0.0f;
635
ret.D = Count > 3 ? (f32)ValueI[3] : 0.0f;
641
virtual core::aabbox3df getBBox()
646
ret.MinEdge.X = Count > 0 ? ValueF[0] : 0.0f;
647
ret.MinEdge.Y = Count > 1 ? ValueF[1] : 0.0f;
648
ret.MinEdge.Z = Count > 2 ? ValueF[2] : 0.0f;
649
ret.MaxEdge.X = Count > 3 ? ValueF[3] : 0.0f;
650
ret.MaxEdge.Y = Count > 4 ? ValueF[4] : 0.0f;
651
ret.MaxEdge.Z = Count > 5 ? ValueF[5] : 0.0f;
655
ret.MinEdge.X = Count > 0 ? (f32)ValueI[0] : 0.0f;
656
ret.MinEdge.Y = Count > 1 ? (f32)ValueI[1] : 0.0f;
657
ret.MinEdge.Z = Count > 2 ? (f32)ValueI[2] : 0.0f;
658
ret.MaxEdge.X = Count > 3 ? (f32)ValueI[3] : 0.0f;
659
ret.MaxEdge.Y = Count > 4 ? (f32)ValueI[4] : 0.0f;
660
ret.MaxEdge.Z = Count > 5 ? (f32)ValueI[5] : 0.0f;
666
virtual core::line2df getLine2d()
671
ret.start.X = Count > 0 ? ValueF[0] : 0.0f;
672
ret.start.Y = Count > 1 ? ValueF[1] : 0.0f;
673
ret.end.X = Count > 2 ? ValueF[2] : 0.0f;
674
ret.end.Y = Count > 3 ? ValueF[3] : 0.0f;
678
ret.start.X = Count > 0 ? (f32)ValueI[0] : 0.0f;
679
ret.start.Y = Count > 1 ? (f32)ValueI[1] : 0.0f;
680
ret.end.X = Count > 2 ? (f32)ValueI[2] : 0.0f;
681
ret.end.Y = Count > 3 ? (f32)ValueI[3] : 0.0f;
686
virtual core::line3df getLine3d()
691
ret.start.X = Count > 0 ? ValueF[0] : 0.0f;
692
ret.start.Y = Count > 1 ? ValueF[1] : 0.0f;
693
ret.start.Z = Count > 2 ? ValueF[2] : 0.0f;
694
ret.end.X = Count > 3 ? ValueF[3] : 0.0f;
695
ret.end.Y = Count > 4 ? ValueF[4] : 0.0f;
696
ret.end.Z = Count > 5 ? ValueF[5] : 0.0f;
700
ret.start.X = Count > 0 ? (f32)ValueI[0] : 0.0f;
701
ret.start.Y = Count > 1 ? (f32)ValueI[1] : 0.0f;
702
ret.start.Z = Count > 2 ? (f32)ValueI[2] : 0.0f;
703
ret.end.X = Count > 3 ? (f32)ValueI[3] : 0.0f;
704
ret.end.Y = Count > 4 ? (f32)ValueI[4] : 0.0f;
705
ret.end.Z = Count > 5 ? (f32)ValueI[5] : 0.0f;
711
virtual core::array<f32> getFloatArray()
716
for (u32 i=0; i<Count; ++i)
717
ValueF.push_back( (f32) ValueI[i] );
723
virtual core::array<s32> getIntArray()
728
for (u32 i=0; i<Count; ++i)
729
ValueI.push_back( (s32) ValueF[i] );
736
virtual void setInt(s32 intValue)
739
for (u32 i=0; i < Count; ++i)
741
ValueF[i] = (f32)intValue;
743
ValueI[i] = intValue;
746
virtual void setFloat(f32 floatValue)
749
for (u32 i=0; i < Count; ++i)
751
ValueF[i] = floatValue;
753
ValueI[i] = (s32)floatValue;
756
virtual void setBool(bool boolValue)
758
setInt( boolValue ? 1 : 0);
761
virtual void setString(const char* text)
765
const char* P = (const char*)text;
771
for ( i=0; i<Count && *P; ++i )
773
while(*P && P[0]!='-' && ( P[0]==' ' || (P[0] < '0' || P[0] > '9') ) )
782
P = core::fast_atof_move(P, c);
787
// todo: fix this to read ints properly
789
P = core::fast_atof_move(P, c);
795
// todo: warning message
802
virtual void setPosition(core::position2di v)
807
if (Count > 0) ValueF[0] = (f32)v.X;
808
if (Count > 1) ValueF[1] = (f32)v.Y;
812
if (Count > 0) ValueI[0] = v.X;
813
if (Count > 1) ValueI[1] = v.Y;
817
virtual void setVector(core::vector3df v)
822
if (Count > 0) ValueF[0] = v.X;
823
if (Count > 1) ValueF[1] = v.Y;
824
if (Count > 2) ValueF[2] = v.Z;
828
if (Count > 0) ValueI[0] = (s32)v.X;
829
if (Count > 1) ValueI[1] = (s32)v.Y;
830
if (Count > 2) ValueI[2] = (s32)v.Z;
834
virtual void setColor(video::SColorf color)
839
if (Count > 0) ValueF[0] = color.r;
840
if (Count > 1) ValueF[1] = color.g;
841
if (Count > 2) ValueF[2] = color.b;
842
if (Count > 3) ValueF[3] = color.a;
846
if (Count > 0) ValueI[0] = (s32)(color.r * 255);
847
if (Count > 1) ValueI[1] = (s32)(color.g * 255);
848
if (Count > 2) ValueI[2] = (s32)(color.b * 255);
849
if (Count > 3) ValueI[3] = (s32)(color.a * 255);
854
virtual void setColor(video::SColor color)
859
if (Count > 0) ValueF[0] = (f32)color.getRed() / 255.0f;
860
if (Count > 1) ValueF[1] = (f32)color.getGreen() / 255.0f;
861
if (Count > 2) ValueF[2] = (f32)color.getBlue() / 255.0f;
862
if (Count > 3) ValueF[3] = (f32)color.getAlpha() / 255.0f;
866
if (Count > 0) ValueI[0] = color.getRed();
867
if (Count > 1) ValueI[1] = color.getGreen();
868
if (Count > 2) ValueI[2] = color.getBlue();
869
if (Count > 3) ValueI[3] = color.getAlpha();
873
virtual void setRect(core::rect<s32> value)
878
if (Count > 0) ValueF[0] = (f32)value.UpperLeftCorner.X;
879
if (Count > 1) ValueF[1] = (f32)value.UpperLeftCorner.Y;
880
if (Count > 2) ValueF[2] = (f32)value.LowerRightCorner.X;
881
if (Count > 3) ValueF[3] = (f32)value.LowerRightCorner.Y;
885
if (Count > 0) ValueI[0] = value.UpperLeftCorner.X;
886
if (Count > 1) ValueI[1] = value.UpperLeftCorner.Y;
887
if (Count > 2) ValueI[2] = value.LowerRightCorner.X;
888
if (Count > 3) ValueI[3] = value.LowerRightCorner.Y;
892
virtual void setMatrix(core::matrix4 value)
897
for (u32 r=0; r<4; ++r)
898
for (u32 c=0; c<4; ++c)
900
ValueF[c+r*4] = value(r,c);
904
for (u32 r=0; r<4; ++r)
905
for (u32 c=0; c<4; ++c)
907
ValueI[c+r*4] = (s32)value(r,c);
911
virtual void setQuaternion(core::quaternion value)
916
if (Count > 0) ValueF[0] = value.X;
917
if (Count > 1) ValueF[1] = value.Y;
918
if (Count > 2) ValueF[2] = value.Z;
919
if (Count > 3) ValueF[3] = value.W;
923
if (Count > 0) ValueI[0] = (s32)value.X;
924
if (Count > 1) ValueI[1] = (s32)value.Y;
925
if (Count > 2) ValueI[2] = (s32)value.Z;
926
if (Count > 3) ValueI[3] = (s32)value.W;
930
virtual void setBoundingBox(core::aabbox3d<f32> value)
935
if (Count > 0) ValueF[0] = value.MinEdge.X;
936
if (Count > 1) ValueF[1] = value.MinEdge.Y;
937
if (Count > 2) ValueF[2] = value.MinEdge.Z;
938
if (Count > 3) ValueF[3] = value.MaxEdge.X;
939
if (Count > 4) ValueF[4] = value.MaxEdge.Y;
940
if (Count > 5) ValueF[5] = value.MaxEdge.Z;
944
if (Count > 0) ValueI[0] = (s32)value.MinEdge.X;
945
if (Count > 1) ValueI[1] = (s32)value.MinEdge.Y;
946
if (Count > 2) ValueI[2] = (s32)value.MinEdge.Z;
947
if (Count > 3) ValueI[3] = (s32)value.MaxEdge.X;
948
if (Count > 4) ValueI[4] = (s32)value.MaxEdge.Y;
949
if (Count > 5) ValueI[5] = (s32)value.MaxEdge.Z;
953
virtual void setPlane(core::plane3df value)
958
if (Count > 0) ValueF[0] = value.Normal.X;
959
if (Count > 1) ValueF[1] = value.Normal.Y;
960
if (Count > 2) ValueF[2] = value.Normal.Z;
961
if (Count > 3) ValueF[3] = value.D;
965
if (Count > 0) ValueI[0] = (s32)value.Normal.X;
966
if (Count > 1) ValueI[1] = (s32)value.Normal.Y;
967
if (Count > 2) ValueI[2] = (s32)value.Normal.Z;
968
if (Count > 3) ValueI[3] = (s32)value.D;
972
virtual void setTriangle3d(core::triangle3df value)
977
if (Count > 0) ValueF[0] = value.pointA.X;
978
if (Count > 1) ValueF[1] = value.pointA.Y;
979
if (Count > 2) ValueF[2] = value.pointA.Z;
980
if (Count > 3) ValueF[3] = value.pointB.X;
981
if (Count > 4) ValueF[4] = value.pointB.Y;
982
if (Count > 5) ValueF[5] = value.pointB.Z;
983
if (Count > 6) ValueF[6] = value.pointC.X;
984
if (Count > 7) ValueF[7] = value.pointC.Y;
985
if (Count > 8) ValueF[8] = value.pointC.Z;
989
if (Count > 0) ValueI[0] = (s32)value.pointA.X;
990
if (Count > 1) ValueI[1] = (s32)value.pointA.Y;
991
if (Count > 2) ValueI[2] = (s32)value.pointA.Z;
992
if (Count > 3) ValueI[3] = (s32)value.pointB.X;
993
if (Count > 4) ValueI[4] = (s32)value.pointB.Y;
994
if (Count > 5) ValueI[5] = (s32)value.pointB.Z;
995
if (Count > 6) ValueI[6] = (s32)value.pointC.X;
996
if (Count > 7) ValueI[7] = (s32)value.pointC.Y;
997
if (Count > 8) ValueI[8] = (s32)value.pointC.Z;
1001
virtual void setVector2d(core::vector2df v)
1006
if (Count > 0) ValueF[0] = v.X;
1007
if (Count > 1) ValueF[1] = v.Y;
1011
if (Count > 0) ValueI[0] = (s32)v.X;
1012
if (Count > 1) ValueI[1] = (s32)v.Y;
1016
virtual void setVector2d(core::vector2di v)
1021
if (Count > 0) ValueF[0] = (f32)v.X;
1022
if (Count > 1) ValueF[1] = (f32)v.Y;
1026
if (Count > 0) ValueI[0] = v.X;
1027
if (Count > 1) ValueI[1] = v.Y;
1031
virtual void setLine2d(core::line2di v)
1036
if (Count > 0) ValueF[0] = (f32)v.start.X;
1037
if (Count > 1) ValueF[1] = (f32)v.start.Y;
1038
if (Count > 2) ValueF[2] = (f32)v.end.X;
1039
if (Count > 3) ValueF[3] = (f32)v.end.Y;
1043
if (Count > 0) ValueI[0] = v.start.X;
1044
if (Count > 1) ValueI[1] = v.start.Y;
1045
if (Count > 2) ValueI[2] = v.end.X;
1046
if (Count > 3) ValueI[3] = v.end.Y;
1050
virtual void setLine2d(core::line2df v)
1055
if (Count > 0) ValueF[0] = v.start.X;
1056
if (Count > 1) ValueF[1] = v.start.Y;
1057
if (Count > 2) ValueF[2] = v.end.X;
1058
if (Count > 3) ValueF[3] = v.end.Y;
1062
if (Count > 0) ValueI[0] = (s32)v.start.X;
1063
if (Count > 1) ValueI[1] = (s32)v.start.Y;
1064
if (Count > 2) ValueI[2] = (s32)v.end.X;
1065
if (Count > 3) ValueI[3] = (s32)v.end.Y;
1069
virtual void setDimension2d(core::dimension2du v)
1074
if (Count > 0) ValueF[0] = (f32)v.Width;
1075
if (Count > 1) ValueF[1] = (f32)v.Height;
1079
if (Count > 0) ValueI[0] = v.Width;
1080
if (Count > 1) ValueI[1] = v.Height;
1085
virtual void setFloatArray(core::array<f32> &vals)
1089
for (u32 i=0; i<vals.size() && i<Count; ++i)
1092
ValueF[i] = vals[i];
1094
ValueI[i] = (s32)vals[i];
1099
virtual void setIntArray(core::array<s32> &vals)
1103
for (u32 i=0; i<vals.size() && i<Count; ++i)
1106
ValueF[i] = (f32)vals[i];
1108
ValueI[i] = vals[i];
1113
//! is it a number list?
1114
virtual bool isNumberList()
1119
//! is it a float list?
1120
virtual bool isFloat()
1125
virtual E_ATTRIBUTE_TYPE getType() const
1128
return EAT_FLOATARRAY;
1130
return EAT_INTARRAY;
1133
virtual const wchar_t* getTypeString() const
1136
return L"floatlist";
1143
//! clear all values
1147
for (u32 i=0; i < Count ; ++i)
1150
for (u32 i=0; i < Count ; ++i)
1154
core::array<s32> ValueI;
1155
core::array<f32> ValueF;
1161
// Attribute implemented for floating point colors
1162
class CColorfAttribute : public CNumbersAttribute
1166
CColorfAttribute(const char* name, video::SColorf value) : CNumbersAttribute(name, value) {}
1168
virtual s32 getInt()
1170
return getColor().color;
1173
virtual f32 getFloat()
1175
return (f32)getColor().color;
1178
virtual void setInt(s32 intValue)
1180
video::SColorf c = video::SColor(intValue);
1187
virtual void setFloat(f32 floatValue)
1189
setInt((s32)floatValue);
1192
virtual E_ATTRIBUTE_TYPE getType() const
1197
virtual const wchar_t* getTypeString() const
1205
// Attribute implemented for colors
1206
class CColorAttribute : public CNumbersAttribute
1210
CColorAttribute(const char* name, const video::SColorf& value) : CNumbersAttribute(name, value) {}
1212
CColorAttribute(const char* name, const video::SColor& value) : CNumbersAttribute(name, value) {}
1214
virtual s32 getInt()
1216
return getColor().color;
1219
virtual f32 getFloat()
1221
return (f32)getColor().color;
1224
virtual void setInt(s32 intValue)
1226
video::SColorf c = video::SColor(intValue);
1233
virtual void setFloat(f32 floatValue)
1235
setInt((s32)floatValue);
1238
virtual core::stringw getStringW()
1241
const video::SColor c = getColor();
1242
sprintf(tmp, "%02x%02x%02x%02x", c.getAlpha(), c.getRed(), c.getGreen(), c.getBlue());
1243
return core::stringw(tmp);
1246
virtual void setString(const char* text)
1249
if (sscanf(text, "%08x", &c)!=1)
1251
CNumbersAttribute::setString(text);
1257
virtual E_ATTRIBUTE_TYPE getType() const
1263
virtual const wchar_t* getTypeString() const
1271
// Attribute implemented for 3d vectors
1272
class CVector3DAttribute : public CNumbersAttribute
1276
CVector3DAttribute(const char* name, core::vector3df value) : CNumbersAttribute(name, value) {}
1278
virtual E_ATTRIBUTE_TYPE getType() const
1280
return EAT_VECTOR3D;
1283
virtual core::matrix4 getMatrix()
1287
ret.setTranslation( core::vector3df(ValueF[0],ValueF[1],ValueF[2]) );
1291
virtual const wchar_t* getTypeString() const
1297
// Attribute implemented for 2d vectors
1298
class CPosition2DAttribute : public CNumbersAttribute
1302
CPosition2DAttribute(const char* name, core::position2di value) : CNumbersAttribute(name, value) {}
1304
virtual E_ATTRIBUTE_TYPE getType() const
1306
return EAT_POSITION2D;
1309
virtual const wchar_t* getTypeString() const
1317
// Attribute implemented for rectangles
1318
class CRectAttribute : public CNumbersAttribute
1322
CRectAttribute(const char* name, core::rect<s32> value) : CNumbersAttribute(name, value) { }
1324
virtual E_ATTRIBUTE_TYPE getType() const
1329
virtual const wchar_t* getTypeString() const
1335
// Attribute implemented for matrices
1336
class CMatrixAttribute : public CNumbersAttribute
1340
CMatrixAttribute(const char* name, core::matrix4 value) : CNumbersAttribute(name, value) { }
1342
virtual E_ATTRIBUTE_TYPE getType() const
1347
virtual core::quaternion getQuaternion()
1349
return core::quaternion(getMatrix());
1352
virtual const wchar_t* getTypeString() const
1358
// Attribute implemented for quaternions
1359
class CQuaternionAttribute : public CNumbersAttribute
1363
CQuaternionAttribute(const char* name, core::quaternion value) : CNumbersAttribute(name, value) { }
1365
virtual E_ATTRIBUTE_TYPE getType() const
1367
return EAT_QUATERNION;
1370
virtual core::matrix4 getMatrix()
1372
return getQuaternion().getMatrix();
1375
virtual const wchar_t* getTypeString() const
1377
return L"quaternion";
1382
// Attribute implemented for bounding boxes
1383
class CBBoxAttribute : public CNumbersAttribute
1387
CBBoxAttribute(const char* name, core::aabbox3df value) : CNumbersAttribute(name, value) { }
1389
virtual E_ATTRIBUTE_TYPE getType() const
1394
virtual const wchar_t* getTypeString() const
1400
// Attribute implemented for planes
1401
class CPlaneAttribute : public CNumbersAttribute
1405
CPlaneAttribute(const char* name, core::plane3df value) : CNumbersAttribute(name, value) { }
1407
virtual E_ATTRIBUTE_TYPE getType() const
1412
virtual const wchar_t* getTypeString() const
1418
// Attribute implemented for triangles
1419
class CTriangleAttribute : public CNumbersAttribute
1423
CTriangleAttribute(const char* name, core::triangle3df value) : CNumbersAttribute(name, value) { }
1425
virtual E_ATTRIBUTE_TYPE getType() const
1427
return EAT_TRIANGLE3D;
1430
virtual core::plane3df getPlane()
1432
return getTriangle().getPlane();
1435
virtual const wchar_t* getTypeString() const
1442
// Attribute implemented for 2d lines
1443
class CLine2dAttribute : public CNumbersAttribute
1447
CLine2dAttribute(const char* name, core::line2df value) : CNumbersAttribute(name, value) { }
1449
virtual E_ATTRIBUTE_TYPE getType() const
1454
virtual const wchar_t* getTypeString() const
1460
// Attribute implemented for 3d lines
1461
class CLine3dAttribute : public CNumbersAttribute
1465
CLine3dAttribute(const char* name, core::line3df value) : CNumbersAttribute(name, value) { }
1467
virtual E_ATTRIBUTE_TYPE getType() const
1472
virtual const wchar_t* getTypeString() const
1486
// Attribute implemented for enumeration literals
1487
class CEnumAttribute : public IAttribute
1491
CEnumAttribute(const char* name, const char* value, const char* const* literals)
1494
setEnum(value, literals);
1497
virtual void setEnum(const char* enumValue, const char* const* enumerationLiterals)
1499
int literalCount = 0;
1501
if (enumerationLiterals)
1504
for (i=0; enumerationLiterals[i]; ++i)
1507
EnumLiterals.reallocate(literalCount);
1508
for (i=0; enumerationLiterals[i]; ++i)
1509
EnumLiterals.push_back(enumerationLiterals[i]);
1512
setString(enumValue);
1515
virtual s32 getInt()
1517
for (s32 i=0; EnumLiterals.size(); ++i)
1518
if (Value.equals_ignore_case(EnumLiterals[i]))
1526
virtual f32 getFloat()
1528
return (f32)getInt();
1531
virtual bool getBool()
1533
return (getInt() != 0); // does not make a lot of sense, I know
1536
virtual core::stringc getString()
1541
virtual core::stringw getStringW()
1543
return core::stringw(Value.c_str());
1546
virtual void setInt(s32 intValue)
1548
if (intValue>=0 && intValue<(s32)EnumLiterals.size())
1549
Value = EnumLiterals[intValue];
1554
virtual void setFloat(f32 floatValue)
1556
setInt((s32)floatValue);
1559
virtual void setString(const char* text)
1564
virtual const char* getEnum()
1566
return Value.c_str();
1569
virtual E_ATTRIBUTE_TYPE getType() const
1575
virtual const wchar_t* getTypeString() const
1580
core::stringc Value;
1581
core::array<core::stringc> EnumLiterals;
1588
// Attribute implemented for strings
1589
class CStringAttribute : public IAttribute
1593
CStringAttribute(const char* name, const char* value)
1600
CStringAttribute(const char* name, const wchar_t* value)
1607
CStringAttribute(const char* name, void* binaryData, s32 lenghtInBytes)
1611
setBinary(binaryData, lenghtInBytes);
1614
virtual s32 getInt()
1617
return atoi(core::stringc(ValueW.c_str()).c_str());
1619
return atoi(Value.c_str());
1622
virtual f32 getFloat()
1625
return core::fast_atof(core::stringc(ValueW.c_str()).c_str());
1627
return core::fast_atof(Value.c_str());
1630
virtual bool getBool()
1633
return ValueW.equals_ignore_case(L"true");
1635
return Value.equals_ignore_case("true");
1638
virtual core::stringc getString()
1641
return core::stringc(ValueW.c_str());
1645
virtual core::stringw getStringW()
1650
return core::stringw(Value.c_str());
1653
virtual void setInt(s32 intValue)
1656
ValueW = core::stringw(intValue);
1658
Value = core::stringc(intValue);
1661
virtual void setFloat(f32 floatValue)
1665
ValueW = core::stringw(floatValue);
1669
Value = core::stringc(floatValue);
1673
virtual void setString(const char* text)
1676
ValueW = core::stringw(text);
1681
virtual void setString(const wchar_t* text)
1686
Value = core::stringc(text);
1689
virtual E_ATTRIBUTE_TYPE getType() const
1695
virtual const wchar_t* getTypeString() const
1700
virtual void getBinary(void* outdata, s32 maxLength)
1702
s32 dataSize = maxLength;
1703
c8* datac8 = (c8*)(outdata);
1705
const c8* dataString = Value.c_str();
1707
for (s32 i=0; i<dataSize; ++i)
1710
while(dataString[p] && p<dataSize)
1712
s32 v = getByteFromHex((c8)dataString[p*2]) * 16;
1714
if (dataString[(p*2)+1])
1715
v += getByteFromHex((c8)dataString[(p*2)+1]);
1722
virtual void setBinary(void* data, s32 maxLength)
1724
s32 dataSize = maxLength;
1725
c8* datac8 = (c8*)(data);
1730
for (s32 b=0; b<dataSize; ++b)
1732
getHexStrFromByte(datac8[b], tmp);
1738
core::stringc Value;
1739
core::stringw ValueW;
1743
static inline s32 getByteFromHex(c8 h)
1745
if (h >= '0' && h <='9')
1748
if (h >= 'a' && h <='f')
1754
static inline void getHexStrFromByte(c8 byte, c8* out)
1756
s32 b = (byte & 0xf0) >> 4;
1758
for (s32 i=0; i<2; ++i)
1760
if (b >=0 && b <= 9)
1762
if (b >=10 && b <= 15)
1763
out[i] = (b-10)+'a';
1770
// Attribute implemented for binary data
1771
class CBinaryAttribute : public CStringAttribute
1775
CBinaryAttribute(const char* name, void* binaryData, s32 lenghtInBytes)
1776
: CStringAttribute(name, binaryData, lenghtInBytes)
1781
virtual E_ATTRIBUTE_TYPE getType() const
1787
virtual const wchar_t* getTypeString() const
1795
// Attribute implemented for texture references
1796
class CTextureAttribute : public IAttribute
1800
CTextureAttribute(const char* name, video::ITexture* value, video::IVideoDriver* driver, const io::path& filename)
1801
: Value(0), Driver(driver), OverrideName(filename)
1810
~CTextureAttribute()
1819
virtual video::ITexture* getTexture()
1824
virtual bool getBool()
1826
return (Value != 0);
1829
virtual core::stringw getStringW()
1831
return core::stringw(OverrideName.size()?OverrideName:
1832
Value ? Value->getName().getPath().c_str() : 0);
1835
virtual core::stringc getString()
1837
// since texture names can be stringw we are careful with the types
1838
return core::stringc(OverrideName.size()?OverrideName:
1839
Value ? Value->getName().getPath().c_str() : 0);
1842
virtual void setString(const char* text)
1848
setTexture(Driver->getTexture(text));
1856
virtual void setTexture(video::ITexture* value)
1858
if ( value == Value )
1870
virtual E_ATTRIBUTE_TYPE getType() const
1876
virtual const wchar_t* getTypeString() const
1881
video::ITexture* Value;
1882
video::IVideoDriver* Driver;
1883
io::path OverrideName;
1888
// Attribute implemented for array of stringw
1889
class CStringWArrayAttribute : public IAttribute
1893
CStringWArrayAttribute(const char* name, const core::array<core::stringw>& value)
1899
virtual core::array<core::stringw> getArray()
1904
virtual void setArray(const core::array<core::stringw>& value)
1909
virtual E_ATTRIBUTE_TYPE getType() const
1911
return EAT_STRINGWARRAY;
1914
virtual const wchar_t* getTypeString() const
1916
return L"stringwarray";
1919
core::array<core::stringw> Value;
1923
// Attribute implemented for user pointers
1924
class CUserPointerAttribute : public IAttribute
1928
CUserPointerAttribute(const char* name, void* value)
1934
virtual s32 getInt()
1936
return *static_cast<s32*>(Value);
1939
virtual bool getBool()
1941
return (Value != 0);
1944
virtual core::stringw getStringW()
1947
swprintf(buf, 32, L"%p", Value);
1949
return core::stringw(buf);
1952
virtual void setString(const char* text)
1954
sscanf(text, "0x%x", (unsigned int*)(&Value));
1957
virtual E_ATTRIBUTE_TYPE getType() const
1959
return EAT_USER_POINTER;
1962
virtual void setUserPointer(void* v)
1967
virtual void* getUserPointer()
1973
virtual const wchar_t* getTypeString() const
1975
return L"userPointer";
1982
// todo: CGUIFontAttribute
1984
} // end namespace io
1985
} // end namespace irr