17 INLINE TransformBlend::
24 INLINE TransformBlend::
32 INLINE TransformBlend::
43 INLINE TransformBlend::
56 INLINE TransformBlend::
71 INLINE TransformBlend::
73 _entries(copy._entries)
80 INLINE
void TransformBlend::
82 _entries = copy._entries;
84 clear_result(current_thread);
90 INLINE TransformBlend::
97 INLINE
bool TransformBlend::
105 INLINE
bool TransformBlend::
113 INLINE
bool TransformBlend::
121 INLINE
size_t TransformBlend::
122 get_num_transforms()
const {
123 return _entries.
size();
131 nassertr(n < _entries.
size(),
nullptr);
132 return _entries[n]._transform;
141 nassertr(n < _entries.
size(), 0.0f);
142 return _entries[n]._weight;
150 nassertv(n < _entries.
size());
151 _entries.erase(_entries.
begin() + n);
153 clear_result(current_thread);
161 nassertv(n < _entries.
size());
162 _entries[n]._transform = transform;
171 nassertv(n < _entries.
size());
172 _entries[n]._weight = weight;
184 ((
TransformBlend *)
this)->recompute_result(cdataw, current_thread);
197 CDReader cdata(_cycler, current_thread);
198 result = cdata->_result;
209 if (!_entries.
empty()) {
210 CDReader cdata(_cycler, current_thread);
211 point = point * cdata->_result;
223 if (!_entries.
empty()) {
224 CDReader cdata(_cycler, current_thread);
225 point = point * cdata->_result;
237 if (!_entries.
empty()) {
238 CDReader cdata(_cycler, current_thread);
239 vector = vector * cdata->_result;
243 #ifndef STDFLOAT_DOUBLE 252 if (!_entries.
empty()) {
253 CDReader cdata(_cycler, current_thread);
254 point = point * LCAST(
double, cdata->_result);
257 #else // STDFLOAT_DOUBLE 266 if (!_entries.
empty()) {
267 CDReader cdata(_cycler, current_thread);
268 point = point * LCAST(
float, cdata->_result);
271 #endif // STDFLOAT_DOUBLE 273 #ifndef STDFLOAT_DOUBLE 282 if (!_entries.
empty()) {
283 CDReader cdata(_cycler, current_thread);
284 point = point * LCAST(
double, cdata->_result);
287 #else // STDFLOAT_DOUBLE 296 if (!_entries.
empty()) {
297 CDReader cdata(_cycler, current_thread);
298 point = point * LCAST(
float, cdata->_result);
301 #endif // STDFLOAT_DOUBLE 303 #ifndef STDFLOAT_DOUBLE 312 if (!_entries.
empty()) {
313 CDReader cdata(_cycler, current_thread);
314 vector = vector * LCAST(
double, cdata->_result);
317 #else // STDFLOAT_DOUBLE 326 if (!_entries.
empty()) {
327 CDReader cdata(_cycler, current_thread);
328 vector = vector * LCAST(
float, cdata->_result);
331 #endif // STDFLOAT_DOUBLE 339 CDLockedReader cdata(_cycler, current_thread);
342 ((
TransformBlend *)
this)->recompute_result(cdataw, current_thread);
343 return cdataw->_modified;
345 return cdata->_modified;
354 INLINE
bool TransformBlend::TransformEntry::
355 operator < (
const TransformBlend::TransformEntry &other)
const {
356 return _transform < other._transform;
362 INLINE TransformBlend::CData::
364 _result(LMatrix4::ident_mat())
371 INLINE TransformBlend::CData::
372 CData(
const TransformBlend::CData ©) :
373 _result(copy._result),
374 _modified(copy._modified),
375 _global_modified(copy._global_modified)
379 INLINE std::ostream &
size_type_0 size() const
Returns the number of elements in the ordered vector.
iterator_0 begin()
Returns the iterator that marks the first element in the ordered vector.
bool empty() const
Returns true if the ordered vector is empty, false otherwise.
This template class calls PipelineCycler::read_unlocked(), and then provides a transparent read-only ...
get_current_thread
Returns a pointer to the currently-executing Thread object.
This template class calls PipelineCycler::read() in the constructor and PipelineCycler::release_read(...
This template class calls PipelineCycler::write() in the constructor and PipelineCycler::release_writ...
A thread; that is, a lightweight process.
This is a sequence number that increments monotonically.