25 int TexMatrixAttrib::_attrib_slot;
41 if (_empty_attrib ==
nullptr) {
55 make(
const LMatrix4 &mat) {
57 <<
"Using deprecated TexMatrixAttrib interface.\n";
58 if (mat.is_identity()) {
92 Stages::iterator si = attrib->_stages.insert(StageNode(stage)).first;
93 (*si)._transform = transform;
94 (*si)._override =
override;
96 return return_new(attrib);
106 attrib->_stages.erase(StageNode(stage));
107 return return_new(attrib);
114 const LMatrix4 &TexMatrixAttrib::
123 bool TexMatrixAttrib::
125 return _stages.
empty();
133 bool TexMatrixAttrib::
135 Stages::const_iterator mi = _stages.find(StageNode(stage));
136 return (mi != _stages.
end());
142 int TexMatrixAttrib::
143 get_num_stages()
const {
144 return _stages.
size();
152 get_stage(
int n)
const {
153 nassertr(n >= 0 && n < (
int)_stages.
size(),
nullptr);
154 return _stages[n]._stage;
162 const LMatrix4 &TexMatrixAttrib::
164 return get_transform(stage)->get_mat();
173 Stages::const_iterator mi = _stages.find(StageNode(stage));
174 if (mi != _stages.
end()) {
175 return (*mi)._transform;
177 return TransformState::make_identity();
183 void TexMatrixAttrib::
184 output(std::ostream &out)
const {
185 out << get_type() <<
":";
187 Stages::const_iterator mi;
188 for (mi = _stages.
begin(); mi != _stages.
end(); ++mi) {
189 const StageNode &sn = (*mi);
190 out <<
" " << sn._stage->
get_name() <<
"(" << *sn._transform <<
")";
191 if (sn._override != 0) {
192 out <<
"^" << sn._override;
209 int TexMatrixAttrib::
213 Stages::const_iterator ai, bi;
214 ai = _stages.
begin();
215 bi = ta->_stages.
begin();
216 while (ai != _stages.
end() && bi != ta->_stages.
end()) {
221 }
else if ((*bi) < (*ai)) {
232 if (bi != ta->_stages.
end()) {
237 if (ai != _stages.
end()) {
251 size_t TexMatrixAttrib::
252 get_hash_impl()
const {
254 Stages::const_iterator si;
255 for (si = _stages.
begin(); si != _stages.
end(); ++si) {
256 const StageNode &sn = (*si);
286 Stages::const_iterator ai, bi;
287 ai = _stages.
begin();
288 bi = ta->_stages.
begin();
289 while (ai != _stages.
end() && bi != ta->_stages.
end()) {
290 if ((*ai)._stage < (*bi)._stage) {
292 attrib->_stages.insert(attrib->_stages.
end(), *ai);
295 }
else if ((*bi)._stage < (*ai)._stage) {
297 attrib->_stages.insert(attrib->_stages.
end(), *bi);
302 if ((*ai)._override == (*bi)._override) {
304 CPT(
TransformState) new_transform = (*ai)._transform->compose((*bi)._transform);
305 StageNode sn((*ai)._stage);
306 sn._transform = new_transform;
307 sn._override = (*ai)._override;
308 attrib->_stages.insert(attrib->_stages.
end(), sn);
309 }
else if ((*ai)._override < (*bi)._override) {
311 attrib->_stages.insert(attrib->_stages.
end(), *bi);
314 attrib->_stages.insert(attrib->_stages.
end(), *ai);
322 while (ai != _stages.
end()) {
324 attrib->_stages.insert(attrib->_stages.
end(), *ai);
328 while (bi != ta->_stages.
end()) {
330 attrib->_stages.insert(attrib->_stages.
end(), *bi);
334 return return_new(attrib);
352 Stages::const_iterator ai, bi;
353 ai = _stages.
begin();
354 bi = ta->_stages.
begin();
355 while (ai != _stages.
end() && bi != ta->_stages.
end()) {
356 if ((*ai)._stage < (*bi)._stage) {
359 (*ai)._transform->invert_compose(TransformState::make_identity());
360 StageNode sn((*ai)._stage);
361 sn._transform = inv_a;
362 sn._override = (*ai)._override;
363 attrib->_stages.insert(attrib->_stages.
end(), sn);
366 }
else if ((*bi)._stage < (*ai)._stage) {
368 attrib->_stages.insert(attrib->_stages.
end(), *bi);
373 if ((*ai)._override == (*bi)._override) {
375 CPT(
TransformState) new_transform = (*ai)._transform->invert_compose((*bi)._transform);
376 StageNode sn((*ai)._stage);
377 sn._transform = new_transform;
378 sn._override = (*ai)._override;
379 attrib->_stages.insert(attrib->_stages.
end(), sn);
381 }
else if ((*ai)._override < (*bi)._override) {
383 attrib->_stages.insert(attrib->_stages.
end(), *bi);
388 (*ai)._transform->invert_compose(TransformState::make_identity());
389 StageNode sn((*ai)._stage);
390 sn._transform = inv_a;
391 sn._override = (*ai)._override;
392 attrib->_stages.insert(attrib->_stages.
end(), sn);
400 while (ai != _stages.
end()) {
403 (*ai)._transform->invert_compose(TransformState::make_identity());
404 StageNode sn((*ai)._stage);
405 sn._transform = inv_a;
406 sn._override = (*ai)._override;
407 attrib->_stages.insert(attrib->_stages.
end(), sn);
411 while (bi != ta->_stages.
end()) {
413 attrib->_stages.insert(attrib->_stages.
end(), *bi);
417 return return_new(attrib);
423 void TexMatrixAttrib::
424 register_with_read_factory() {
438 Stages::const_iterator si;
439 for (si = _stages.
begin(); si != _stages.
end(); ++si) {
440 const StageNode &sn = (*si);
459 for (
size_t sni = 0; sni < _stages.
size(); ++sni) {
466 StageNode &sn = _stages[sni];
468 sn._transform = transform;
487 attrib->fillin(scan, manager);
496 void TexMatrixAttrib::
498 RenderAttrib::fillin(scan, manager);
501 for (
size_t i = 0; i < num_stages; i++) {
509 StageNode sn(
nullptr);
510 sn._override =
override;