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