15 #include "transformBlend.h"
17 #include "bamReader.h"
18 #include "bamWriter.h"
30 if (_entries.
size() != other._entries.
size()) {
31 return (
int)_entries.
size() - (int)other._entries.
size();
34 Entries::const_iterator ai, bi;
35 ai = _entries.
begin();
36 bi = other._entries.
begin();
37 while (ai != _entries.
end() && bi != other._entries.
end()) {
38 if ((*ai)._transform != (*bi)._transform) {
39 return (*ai)._transform < (*bi)._transform ? -1 : 1;
41 if (!IS_NEARLY_EQUAL((*ai)._weight, (*bi)._weight)) {
42 return (*ai)._weight < (*bi)._weight ? -1 : 1;
59 if (!IS_NEARLY_ZERO(weight)) {
61 entry._transform = transform;
62 entry._weight = weight;
63 pair<Entries::iterator, bool> result = _entries.insert(entry);
67 Entries::iterator ei = result.first;
68 (*ei)._weight += weight;
69 if (IS_NEARLY_ZERO((*ei)._weight)) {
75 clear_result(current_thread);
87 entry._transform = transform;
89 Entries::iterator ei = _entries.find(entry);
90 if (ei != _entries.
end()) {
94 clear_result(current_thread);
107 if (max_transforms <= 0) {
112 while ((
int)_entries.
size() > max_transforms) {
114 nassertv(!_entries.
empty());
115 Entries::iterator ei_least = _entries.
begin();
116 Entries::iterator ei = ei_least;
118 while (ei != _entries.
end()) {
119 if ((*ei)._weight < (*ei_least)._weight) {
125 _entries.erase(ei_least);
139 PN_stdfloat net_weight = 0.0f;
140 Entries::iterator ei;
141 for (ei = _entries.
begin(); ei != _entries.
end(); ++ei) {
142 net_weight += (*ei)._weight;
144 if (net_weight != 0.0f) {
145 for (ei = _entries.
begin(); ei != _entries.
end(); ++ei) {
146 (*ei)._weight /= net_weight;
150 clear_result(current_thread);
161 TransformEntry entry;
162 entry._transform = transform;
163 entry._weight = 0.0f;
164 Entries::const_iterator ei = _entries.find(entry);
165 return (ei != _entries.
end());
177 TransformEntry entry;
178 entry._transform = transform;
179 entry._weight = 0.0f;
180 Entries::const_iterator ei = _entries.find(entry);
181 if (ei != _entries.
end()) {
182 return (*ei)._weight;
192 void TransformBlend::
193 output(ostream &out)
const {
194 if (_entries.
empty()) {
197 Entries::const_iterator ei = _entries.
begin();
198 out << *(*ei)._transform <<
":" << (*ei)._weight;
200 while (ei != _entries.
end()) {
201 out <<
" " << *(*ei)._transform <<
":" << (*ei)._weight;
212 void TransformBlend::
213 write(ostream &out,
int indent_level)
const {
215 Entries::const_iterator ei;
216 for (ei = _entries.
begin(); ei != _entries.
end(); ++ei) {
217 indent(out, indent_level)
218 << *(*ei)._transform <<
":" << (*ei)._weight <<
"\n";
220 (*ei)._transform->get_matrix(mat);
221 mat.write(out, indent_level + 4);
226 indent(out, indent_level)
227 <<
"Blended result =\n";
228 blend.write(out, indent_level + 2);
237 void TransformBlend::
238 recompute_result(CData *cdata,
Thread *current_thread) {
245 Entries::const_iterator ei;
246 for (ei = _entries.
begin(); ei != _entries.
end(); ++ei) {
247 seq = max(seq, (*ei)._transform->get_modified(current_thread));
250 if (cdata->_modified != seq) {
252 cdata->_modified = seq;
255 for (ei = _entries.
begin(); ei != _entries.
end(); ++ei) {
256 (*ei)._transform->accumulate_matrix(cdata->_result, (*ei)._weight);
267 void TransformBlend::
268 clear_result(
Thread *current_thread) {
269 CDWriter cdata(_cycler,
true, current_thread);
287 Entries::const_iterator ei;
288 for (ei = _entries.
begin(); ei != _entries.
end(); ++ei) {
305 Entries::iterator ei;
306 for (ei = _entries.
begin(); ei != _entries.
end(); ++ei) {
328 for (
size_t i = 0; i < num_entries; ++i) {
329 TransformEntry entry;
343 return new CData(*
this);
static const LMatrix4f & ident_mat()
Returns an identity matrix.
PN_stdfloat get_stdfloat()
Extracts either a 32-bit or a 64-bit floating-point number, according to Datagram::set_stdfloat_doubl...
bool empty() const
Returns true if the ordered vector is empty, false otherwise.
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
void clear()
Removes all elements from the ordered vector.
A single page of data maintained by a PipelineCycler.
Base class for objects that can be written to and read from Bam files.
iterator_0 begin()
Returns the iterator that marks the first element in the ordered vector.
This is the fundamental interface for writing binary objects to a Bam file, to be extracted later by ...
iterator_0 end()
Returns the iterator that marks the end of the ordered vector.
void reserve(size_type_0 n)
Informs the vector of a planned change in size; ensures that the capacity of the vector is greater th...
PN_uint16 get_uint16()
Extracts an unsigned 16-bit integer.
static Thread * get_current_thread()
Returns a pointer to the currently-executing Thread object.
void add_stdfloat(PN_stdfloat value)
Adds either a 32-bit or a 64-bit floating-point number, according to set_stdfloat_double().
This is a 4-by-4 transform matrix.
void sort()
Maps to sort_unique().
void push_back(const value_type_0 &key)
Adds the new element to the end of the vector without regard for proper sorting.
void add_uint16(PN_uint16 value)
Adds an unsigned 16-bit integer to the datagram.
static const LMatrix4f & zeros_mat()
Returns an matrix filled with zeros.
A thread; that is, a lightweight process.
size_type_0 size() const
Returns the number of elements in the ordered vector.
A class to retrieve the individual data elements previously stored in a Datagram. ...
TypeHandle is the identifier used to differentiate C++ class types.
This is a sequence number that increments monotonically.
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
void write_pointer(Datagram &packet, const TypedWritable *dest)
The interface for writing a pointer to another object to a Bam file.
void read_pointer(DatagramIterator &scan)
The interface for reading a pointer to another object from a Bam file.