21 GeomMunger::Registry *GeomMunger::_registry =
nullptr;
35 Registry *registry = get_registry();
37 _registered_key = registry->_mungers.end();
49 Registry *registry = get_registry();
51 _registered_key = registry->_mungers.end();
60 nassertv(!_is_registered);
69 nassertv(_formats_by_animation.empty());
80 nassertv(_is_registered);
96 bool force,
Thread *current_thread) {
104 Geom::Cache::const_iterator ci = geom->_cache.find(&key);
105 if (ci == geom->_cache.end()) {
108 entry = (*ci).second;
110 nassertr(entry->_source == geom,
false);
114 entry->refresh(current_thread);
118 if (cdata->_source == geom &&
119 cdata->_geom_result !=
nullptr &&
120 geom->get_modified(current_thread) <= cdata->_geom_result->get_modified(current_thread) &&
121 data->get_modified(current_thread) <= cdata->_data_result->get_modified(current_thread)) {
124 geom = cdata->_geom_result;
125 data = cdata->_data_result;
141 PStatTimer timer(_munge_pcollector, current_thread);
143 PT(
Geom) orig_geom = (
Geom *)geom.p();
144 data = munge_data(data);
145 munge_geom_impl(geom, data, current_thread);
148 if (entry ==
nullptr) {
155 bool inserted = orig_geom->_cache.insert(Geom::Cache::value_type(&entry->_key, entry)).second;
164 entry->record(current_thread);
169 cdata->_source = (
Geom *)orig_geom.p();
170 cdata->set_result(geom, data);
182 nassertr(_is_registered,
nullptr);
187 Formats &formats = _formats_by_animation[animation];
189 Formats::iterator fi;
190 fi = formats.find(format);
191 if (fi != formats.end()) {
197 CPT(
GeomVertexFormat) derived_format = munge_format_impl(format, animation);
198 nassertr(derived_format->is_registered(),
nullptr);
201 bool inserted = formats.insert(Formats::value_type(format, derived_format)).second;
202 nassertr(inserted,
nullptr);
204 return derived_format;
221 nassertr(_is_registered,
nullptr);
225 munge_format(orig_format, orig_format->get_animation());
227 if (new_format == orig_format) {
232 return data->convert_to(new_format);
250 nassertr(_is_registered,
nullptr);
255 Formats::iterator fi;
256 fi = _premunge_formats.find(format);
257 if (fi != _premunge_formats.end()) {
264 nassertr(derived_format->is_registered(),
nullptr);
267 bool inserted = _premunge_formats.insert(Formats::value_type(format, derived_format)).second;
268 nassertr(inserted,
nullptr);
270 return derived_format;
287 nassertr(_is_registered,
nullptr);
292 if (new_format == orig_format) {
297 return data->convert_to(new_format);
315 compare_to_impl(
const GeomMunger *other)
const {
326 geom_compare_to_impl(
const GeomMunger *other)
const {
335 if (_registry ==
nullptr) {
336 _registry =
new Registry;
344 do_register(
Thread *current_thread) {
345 if (gobj_cat.is_debug()) {
347 <<
"GeomMunger::do_register(): " << (
void *)
this <<
"\n";
349 nassertv(!_is_registered);
350 nassertv(_formats_by_animation.empty());
354 CacheEntry *entry =
new CacheEntry;
355 entry->_munger =
this;
356 entry->record(current_thread);
358 _is_registered =
true;
366 if (gobj_cat.is_debug()) {
368 <<
"GeomMunger::do_unregister(): " << (
void *)
this <<
"\n";
370 nassertv(_is_registered);
371 _is_registered =
false;
374 _formats_by_animation.clear();
380 void GeomMunger::CacheEntry::
381 output(std::ostream &out)
const {
382 out <<
"munger " << _munger;
388 GeomMunger::Registry::
415 Mungers::iterator mi = _mungers.insert(munger).first;
418 new_munger->_registered_key = mi;
419 new_munger->do_register(current_thread);
429 void GeomMunger::Registry::
434 nassertv(munger->_registered_key != _mungers.end());
435 _mungers.erase(munger->_registered_key);
436 munger->_registered_key = _mungers.end();
437 munger->do_unregister();
444 void GeomMunger::Registry::
448 Mungers::iterator mi = _mungers.begin();
449 while (mi != _mungers.end()) {
451 Mungers::iterator mnext = mi;
454 if (munger->
get_gsg() == gsg) {
455 nassertv(mi == munger->_registered_key);
457 munger->_registered_key = _mungers.end();
458 munger->do_unregister();