17INLINE TransformBlend::
24INLINE TransformBlend::
32INLINE TransformBlend::
43INLINE TransformBlend::
56INLINE TransformBlend::
71INLINE TransformBlend::
73 _entries(copy._entries)
80INLINE
void TransformBlend::
82 _entries = copy._entries;
84 clear_result(current_thread);
90INLINE TransformBlend::
97INLINE
bool TransformBlend::
105INLINE
bool TransformBlend::
113INLINE
bool TransformBlend::
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);
266 if (!_entries.
empty()) {
267 CDReader cdata(_cycler, current_thread);
268 point = point * LCAST(
float, cdata->_result);
273#ifndef STDFLOAT_DOUBLE
282 if (!_entries.
empty()) {
283 CDReader cdata(_cycler, current_thread);
284 point = point * LCAST(
double, cdata->_result);
296 if (!_entries.
empty()) {
297 CDReader cdata(_cycler, current_thread);
298 point = point * LCAST(
float, cdata->_result);
303#ifndef STDFLOAT_DOUBLE
312 if (!_entries.
empty()) {
313 CDReader cdata(_cycler, current_thread);
314 vector = vector * LCAST(
double, cdata->_result);
326 if (!_entries.
empty()) {
327 CDReader cdata(_cycler, current_thread);
328 vector = vector * LCAST(
float, cdata->_result);
339 CDLockedReader cdata(_cycler, current_thread);
342 ((
TransformBlend *)
this)->recompute_result(cdataw, current_thread);
343 return cdataw->_modified;
345 return cdata->_modified;
354INLINE
bool TransformBlend::TransformEntry::
355operator < (
const TransformBlend::TransformEntry &other)
const {
356 return _transform < other._transform;
362INLINE TransformBlend::CData::
364 _result(LMatrix4::ident_mat())
371INLINE TransformBlend::CData::
372CData(
const TransformBlend::CData ©) :
373 _result(copy._result),
374 _modified(copy._modified),
375 _global_modified(copy._global_modified)
This template class calls PipelineCycler::read() in the constructor and PipelineCycler::release_read(...
This template class calls PipelineCycler::read_unlocked(), and then provides a transparent read-only ...
This template class calls PipelineCycler::write() in the constructor and PipelineCycler::release_writ...
A thread; that is, a lightweight process.
get_current_thread
Returns a pointer to the currently-executing Thread object.
This is a sequence number that increments monotonically.
iterator_0 begin()
Returns the iterator that marks the first element in the ordered vector.
size_type_0 size() const
Returns the number of elements in the ordered vector.
bool empty() const
Returns true if the ordered vector is empty, false otherwise.