00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef _FCD_ANIMATED_H_
00010 #include "FCDocument/FCDAnimated.h"
00011 #endif // _FCD_ANIMATED_H_
00012
00013
00014
00015
00016
00017 template <class TYPE, int QUALIFIERS>
00018 FCDParameterAnimatableT<TYPE, QUALIFIERS>::FCDParameterAnimatableT(FUParameterizable* _parent)
00019 : FCDParameterAnimatable(_parent)
00020 {
00021 }
00022
00023 template <class TYPE, int QUALIFIERS>
00024 FCDParameterAnimatableT<TYPE, QUALIFIERS>::FCDParameterAnimatableT(FUParameterizable* _parent, const TYPE& defaultValue)
00025 : FCDParameterAnimatable(_parent)
00026 , value(defaultValue)
00027 {
00028 }
00029
00030 template <class TYPE, int QUALIFIERS>
00031 FCDParameterAnimatableT<TYPE, QUALIFIERS>::~FCDParameterAnimatableT()
00032 {
00033 }
00034
00035 template <class TYPE, int QUALIFIERS>
00036 FCDParameterAnimatableT<TYPE, QUALIFIERS>& FCDParameterAnimatableT<TYPE, QUALIFIERS>::operator= (const TYPE& copy)
00037 {
00038 value = copy;
00039 GetParent()->SetValueChange();
00040 return *this;
00041 }
00042
00043
00044
00045
00046
00047 template <class TYPE, int QUALIFIERS>
00048 FCDParameterListAnimatableT<TYPE, QUALIFIERS>::FCDParameterListAnimatableT(FUParameterizable* parent)
00049 : FCDParameterListAnimatable(parent)
00050 {
00051 }
00052
00053 template <class TYPE, int QUALIFIERS>
00054 FCDParameterListAnimatableT<TYPE, QUALIFIERS>::~FCDParameterListAnimatableT()
00055 {
00056 }
00057
00058 template <class TYPE, int QUALIFIERS>
00059 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::set(size_t index, const TYPE& value)
00060 {
00061 values.at(index) = value;
00062 GetParent()->SetValueChange();
00063 }
00064
00065 template <class TYPE, int QUALIFIERS>
00066 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::insert(size_t index, const TYPE& value)
00067 {
00068 values.insert(values.begin() + index, value);
00069 GetParent()->SetStructureChangedFlag();
00070 GetParent()->SetDirtyFlag();
00071 OnInsertion(index, 1);
00072 OnPotentialSizeChange();
00073 }
00074
00075 template <class TYPE, int QUALIFIERS>
00076 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::insert(size_t index, const TYPE* _values, size_t count)
00077 {
00078 values.insert(values.begin() + index, _values, count);
00079 GetParent()->SetStructureChangedFlag();
00080 GetParent()->SetDirtyFlag();
00081 OnInsertion(index, count);
00082 OnPotentialSizeChange();
00083 }
00084
00085 template <class TYPE, int QUALIFIERS>
00086 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::insert(size_t index, size_t count, const TYPE& value)
00087 {
00088 values.insert(values.begin() + index, count, value);
00089 GetParent()->SetStructureChangedFlag();
00090 GetParent()->SetDirtyFlag();
00091 OnInsertion(index, count);
00092 OnPotentialSizeChange();
00093 }
00094
00095 template <class TYPE, int QUALIFIERS>
00096 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::erase(size_t index)
00097 {
00098 values.erase(index);
00099 GetParent()->SetStructureChangedFlag();
00100 GetParent()->SetDirtyFlag();
00101 OnRemoval(index, 1);
00102 OnPotentialSizeChange();
00103 }
00104
00105 template <class TYPE, int QUALIFIERS>
00106 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::erase(const TYPE& value)
00107 {
00108 size_t index = find(value);
00109 if (index < values.size()) erase(index);
00110 OnPotentialSizeChange();
00111 }
00112
00113 template <class TYPE, int QUALIFIERS>
00114 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::erase(size_t start, size_t end)
00115 {
00116 values.erase(values.begin() + start, values.begin() + end);
00117 GetParent()->SetStructureChangedFlag();
00118 GetParent()->SetDirtyFlag();
00119 OnRemoval(start, end - start);
00120 OnPotentialSizeChange();
00121 }
00122
00123 template <class TYPE, int QUALIFIERS>
00124 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::clear()
00125 {
00126 OnRemoval(0, values.size());
00127 values.clear();
00128 GetParent()->SetStructureChangedFlag();
00129 GetParent()->SetDirtyFlag();
00130 OnPotentialSizeChange();
00131 }
00132
00133 template <class TYPE, int QUALIFIERS>
00134 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::push_back(const TYPE& value)
00135 {
00136 OnInsertion(values.size(), 1);
00137 values.push_back(value);
00138 GetParent()->SetStructureChangedFlag();
00139 GetParent()->SetDirtyFlag();
00140 OnPotentialSizeChange();
00141 }
00142
00143 template <class TYPE, int QUALIFIERS>
00144 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::push_front(const TYPE& value)
00145 {
00146 values.push_front(value);
00147 GetParent()->SetStructureChangedFlag();
00148 GetParent()->SetDirtyFlag();
00149 OnInsertion(0, 1);
00150 OnPotentialSizeChange();
00151 }
00152
00153 template <class TYPE, int QUALIFIERS>
00154 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::pop_back()
00155 {
00156 OnRemoval(size() - 1, 1);
00157 values.pop_back();
00158 GetParent()->SetStructureChangedFlag();
00159 GetParent()->SetDirtyFlag();
00160 OnPotentialSizeChange();
00161 }
00162
00163 template <class TYPE, int QUALIFIERS>
00164 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::pop_front()
00165 {
00166 values.pop_front();
00167 GetParent()->SetStructureChangedFlag();
00168 GetParent()->SetDirtyFlag();
00169 OnRemoval(0, 1);
00170 OnPotentialSizeChange();
00171 }
00172
00173 template <class TYPE, int QUALIFIERS>
00174 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::resize(size_t count)
00175 {
00176 if (count > values.size()) OnInsertion(values.size(), count - values.size());
00177 else if (count < values.size()) OnRemoval(count, values.size() - count);
00178 values.resize(count);
00179 OnPotentialSizeChange();
00180 }
00181
00182 template <class TYPE, int QUALIFIERS>
00183 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::resize(size_t count, const TYPE& value)
00184 {
00185 if (count > values.size()) OnInsertion(values.size(), count - values.size());
00186 else if (count < values.size()) OnRemoval(count - values.size(), values.size());
00187 values.resize(count, value);
00188 OnPotentialSizeChange();
00189 }
00190
00191 template <class TYPE, int QUALIFIERS>
00192 void FCDParameterListAnimatableT<TYPE, QUALIFIERS>::OnPotentialSizeChange()
00193 {
00194 size_t animatedCount = animateds.size();
00195 if (animatedCount == 0) return;
00196
00197
00198
00199 FCDAnimated* animated = animateds.front();
00200 FUAssert((size_t) animated->GetArrayElement() < values.size(), return);
00201 if (animated->GetValue(0) == (void*) &values[animated->GetArrayElement()]) return;
00202
00203
00204
00205 size_t stride = animated->GetValueCount();
00206 for (size_t i = 0; i < animatedCount; ++i)
00207 {
00208 animated = animateds[i];
00209 size_t arrayElement = animated->GetArrayElement();
00210 FUAssert(arrayElement < values.size(), return);
00211 for (size_t j = 0; j < stride; ++j)
00212 {
00213 animated->SetValue(j, (float*) (j * sizeof(float) + ((char*) &values[arrayElement])));
00214 }
00215 }
00216 }
00217