1 #include "lc_global.h"
2 #include "object.h"
3
lcObject(lcObjectType ObjectType)4 lcObject::lcObject(lcObjectType ObjectType)
5 : mObjectType(ObjectType)
6 {
7 }
8
~lcObject()9 lcObject::~lcObject()
10 {
11 }
12
13 template void lcObjectKeyArray<float>::SaveKeysLDraw(QTextStream& Stream, const char* KeyName) const;
14 template void lcObjectKeyArray<float>::LoadKeysLDraw(QTextStream& Stream);
15 template const float& lcObjectKeyArray<float>::CalculateKey(lcStep Step) const;
16 template void lcObjectKeyArray<float>::ChangeKey(const float& Value, lcStep Step, bool AddKey);
17 template void lcObjectKeyArray<float>::InsertTime(lcStep Start, lcStep Time);
18 template void lcObjectKeyArray<float>::RemoveTime(lcStep Start, lcStep Time);
19
20 template void lcObjectKeyArray<lcVector3>::SaveKeysLDraw(QTextStream& Stream, const char* KeyName) const;
21 template void lcObjectKeyArray<lcVector3>::LoadKeysLDraw(QTextStream& Stream);
22 template const lcVector3& lcObjectKeyArray<lcVector3>::CalculateKey(lcStep Step) const;
23 template void lcObjectKeyArray<lcVector3>::ChangeKey(const lcVector3& Value, lcStep Step, bool AddKey);
24 template void lcObjectKeyArray<lcVector3>::InsertTime(lcStep Start, lcStep Time);
25 template void lcObjectKeyArray<lcVector3>::RemoveTime(lcStep Start, lcStep Time);
26
27 template void lcObjectKeyArray<lcVector4>::SaveKeysLDraw(QTextStream& Stream, const char* KeyName) const;
28 template void lcObjectKeyArray<lcVector4>::LoadKeysLDraw(QTextStream& Stream);
29 template const lcVector4& lcObjectKeyArray<lcVector4>::CalculateKey(lcStep Step) const;
30 template void lcObjectKeyArray<lcVector4>::ChangeKey(const lcVector4& Value, lcStep Step, bool AddKey);
31 template void lcObjectKeyArray<lcVector4>::InsertTime(lcStep Start, lcStep Time);
32 template void lcObjectKeyArray<lcVector4>::RemoveTime(lcStep Start, lcStep Time);
33
34 template void lcObjectKeyArray<lcMatrix33>::SaveKeysLDraw(QTextStream& Stream, const char* KeyName) const;
35 template void lcObjectKeyArray<lcMatrix33>::LoadKeysLDraw(QTextStream& Stream);
36 template const lcMatrix33& lcObjectKeyArray<lcMatrix33>::CalculateKey(lcStep Step) const;
37 template void lcObjectKeyArray<lcMatrix33>::ChangeKey(const lcMatrix33& Value, lcStep Step, bool AddKey);
38 template void lcObjectKeyArray<lcMatrix33>::InsertTime(lcStep Start, lcStep Time);
39 template void lcObjectKeyArray<lcMatrix33>::RemoveTime(lcStep Start, lcStep Time);
40
41 template<typename T>
SaveKeysLDraw(QTextStream & Stream,const char * KeyName) const42 void lcObjectKeyArray<T>::SaveKeysLDraw(QTextStream& Stream, const char* KeyName) const
43 {
44 const int Count = sizeof(T) / sizeof(float);
45
46 for (const lcObjectKey<T>& Key : mKeys)
47 {
48 Stream << QLatin1String("0 !LEOCAD ") << KeyName << Key.Step << ' ';
49
50 for (int ValueIdx = 0; ValueIdx < Count; ValueIdx++)
51 Stream << ((float*)&Key.Value)[ValueIdx] << ' ';
52
53 Stream << QLatin1String("\r\n");
54 }
55 }
56
57 template<typename T>
LoadKeysLDraw(QTextStream & Stream)58 void lcObjectKeyArray<T>::LoadKeysLDraw(QTextStream& Stream)
59 {
60 QString Token;
61 Stream >> Token;
62
63 int Step = Token.toInt();
64 T Value;
65
66 const int Count = sizeof(T) / sizeof(float);
67
68 for (int ValueIdx = 0; ValueIdx < Count; ValueIdx++)
69 Stream >> ((float*)&Value)[ValueIdx];
70
71 ChangeKey(Value, Step, true);
72 }
73
74 template<typename T>
CalculateKey(lcStep Step) const75 const T& lcObjectKeyArray<T>::CalculateKey(lcStep Step) const
76 {
77 const lcObjectKey<T>* PreviousKey = &mKeys[0];
78
79 for (const lcObjectKey<T>& Key : mKeys)
80 {
81 if (Key.Step > Step)
82 break;
83
84 PreviousKey = &Key;
85 }
86
87 return PreviousKey->Value;
88 }
89
90 template<typename T>
ChangeKey(const T & Value,lcStep Step,bool AddKey)91 void lcObjectKeyArray<T>::ChangeKey(const T& Value, lcStep Step, bool AddKey)
92 {
93 for (typename std::vector<lcObjectKey<T>>::iterator KeyIt = mKeys.begin(); KeyIt != mKeys.end(); KeyIt++)
94 {
95 if (KeyIt->Step < Step)
96 continue;
97
98 if (KeyIt->Step == Step)
99 KeyIt->Value = Value;
100 else if (AddKey)
101 mKeys.insert(KeyIt, lcObjectKey<T>{ Step, Value });
102 else if (KeyIt == mKeys.begin())
103 KeyIt->Value = Value;
104 else
105 {
106 KeyIt = KeyIt - 1;
107 KeyIt->Value = Value;
108 }
109
110 return;
111 }
112
113 if (AddKey || mKeys.empty())
114 mKeys.emplace_back(lcObjectKey<T>{ Step, Value });
115 else
116 mKeys.back().Value = Value;
117 }
118
119 template<typename T>
InsertTime(lcStep Start,lcStep Time)120 void lcObjectKeyArray<T>::InsertTime(lcStep Start, lcStep Time)
121 {
122 bool EndKey = false;
123
124 for (typename std::vector<lcObjectKey<T>>::iterator KeyIt = mKeys.begin(); KeyIt != mKeys.end();)
125 {
126 if ((KeyIt->Step < Start) || (KeyIt->Step == 1))
127 {
128 KeyIt++;
129 continue;
130 }
131
132 if (EndKey)
133 {
134 KeyIt = mKeys.erase(KeyIt);
135 continue;
136 }
137
138 if (KeyIt->Step >= LC_STEP_MAX - Time)
139 {
140 KeyIt->Step = LC_STEP_MAX;
141 EndKey = true;
142 }
143 else
144 KeyIt->Step += Time;
145
146 KeyIt++;
147 }
148 }
149
150 template<typename T>
RemoveTime(lcStep Start,lcStep Time)151 void lcObjectKeyArray<T>::RemoveTime(lcStep Start, lcStep Time)
152 {
153 for (typename std::vector<lcObjectKey<T>>::iterator KeyIt = mKeys.begin(); KeyIt != mKeys.end();)
154 {
155 if ((KeyIt->Step < Start) || (KeyIt->Step == 1))
156 {
157 KeyIt++;
158 continue;
159 }
160
161 if (KeyIt->Step < Start + Time)
162 {
163 KeyIt = mKeys.erase(KeyIt);
164 continue;
165 }
166
167 KeyIt->Step -= Time;
168 KeyIt++;
169 }
170 }
171