Browse Source

fix bam reader

David Rose 17 years ago
parent
commit
99b0236c1c
2 changed files with 18 additions and 6 deletions
  1. 5 1
      panda/src/char/characterJointEffect.cxx
  2. 13 5
      panda/src/pgraph/renderEffects.cxx

+ 5 - 1
panda/src/char/characterJointEffect.cxx

@@ -236,7 +236,11 @@ void CharacterJointEffect::
 write_datagram(BamWriter *manager, Datagram &dg) {
   RenderEffect::write_datagram(manager, dg);
 
-  manager->write_pointer(dg, _character);
+  if (_character.is_valid_pointer()) {
+    manager->write_pointer(dg, _character);
+  } else {
+    manager->write_pointer(dg, NULL);
+  }
 }
 
 ////////////////////////////////////////////////////////////////////

+ 13 - 5
panda/src/pgraph/renderEffects.cxx

@@ -801,13 +801,21 @@ complete_pointers(TypedWritable **p_list, BamReader *manager) {
   int pi = TypedWritable::complete_pointers(p_list, manager);
 
   // Get the effect pointers.
-  Effects::iterator ai;
-  for (ai = _effects.begin(); ai != _effects.end(); ++ai) {
-    Effect &effect = (*ai);
+  size_t i = 0;
+  while (i < _effects.size()) {
+    Effect &effect = _effects[i];
 
     effect._effect = DCAST(RenderEffect, p_list[pi++]);
-    nassertr(effect._effect != (RenderEffect *)NULL, pi);
-    effect._type = effect._effect->get_type();
+    if (effect._effect == (RenderEffect *)NULL) {
+      // Remove this bogus RenderEffect pointer (it must have been
+      // from an unwritable class).
+      _effects.erase(_effects.begin() + i);
+
+    } else {
+      // Keep this good pointer, and increment.
+      effect._type = effect._effect->get_type();
+      ++i;
+    }
   }
 
   // Now make sure the array is properly sorted.  (It won't