diff --git a/panda/src/putil/bitArray.cxx b/panda/src/putil/bitArray.cxx index aab43ee99e..e7364584f6 100644 --- a/panda/src/putil/bitArray.cxx +++ b/panda/src/putil/bitArray.cxx @@ -909,10 +909,14 @@ normalize() { */ void BitArray:: write_datagram(BamWriter *manager, Datagram &dg) const { - dg.add_uint32(_array.size()); - Array::const_iterator ai; - for (ai = _array.begin(); ai != _array.end(); ++ai) { - dg.add_uint32((*ai).get_word()); + dg.add_uint32(_array.size() * (num_bits_per_word >> 5)); + + for (MaskType &item : _array) { + WordType word = item.get_word(); + for (size_t i = 0; i < num_bits_per_word; i += 32) { + dg.add_uint32(word); + word >>= 32; + } } dg.add_uint8(_highest_bits); } @@ -922,10 +926,16 @@ write_datagram(BamWriter *manager, Datagram &dg) const { */ void BitArray:: read_datagram(DatagramIterator &scan, BamReader *manager) { - size_t num_words = scan.get_uint32(); - _array = Array::empty_array(num_words); - for (size_t i = 0; i < num_words; ++i) { - _array[i] = WordType(scan.get_uint32()); + size_t num_words32 = scan.get_uint32(); + size_t num_bits = num_words32 << 5; + + _array = Array::empty_array((num_bits + num_bits_per_word - 1) / num_bits_per_word); + + for (size_t i = 0; i < num_bits; i += 32) { + int w = i / num_bits_per_word; + int b = i % num_bits_per_word; + + _array[w].store(scan.get_uint32(), b, 32); } _highest_bits = scan.get_uint8(); }