@@ -74,7 +74,6 @@ RenderState() :
7474 _saved_entry = -1 ;
7575 _last_mi = -1 ;
7676 _cache_stats.add_num_states (1 );
77- _read_overrides = nullptr ;
7877 _generated_shader = nullptr ;
7978
8079#ifdef DO_MEMORY_USAGE
@@ -99,7 +98,6 @@ RenderState(const RenderState ©) :
9998 _saved_entry = -1 ;
10099 _last_mi = -1 ;
101100 _cache_stats.add_num_states (1 );
102- _read_overrides = nullptr ;
103101 _generated_shader = nullptr ;
104102
105103#ifdef DO_MEMORY_USAGE
@@ -1899,23 +1897,21 @@ int RenderState::
18991897complete_pointers (TypedWritable **p_list, BamReader *manager) {
19001898 int pi = TypedWritable::complete_pointers (p_list, manager);
19011899
1902- if (_read_overrides != nullptr ) {
1903- RenderAttribRegistry *reg = RenderAttribRegistry::quick_get_global_ptr ();
1904- for (size_t i = 0 ; i < (*_read_overrides).size (); ++i) {
1905- int override = (*_read_overrides)[i];
1906-
1907- RenderAttrib *attrib = DCAST (RenderAttrib, p_list[pi++]);
1908- if (attrib != nullptr ) {
1909- int slot = attrib->get_slot ();
1910- if (slot > 0 && slot < reg->get_max_slots ()) {
1911- _attributes[slot].set (attrib, override );
1912- _filled_slots.set_bit (slot);
1913- }
1900+ BamAuxData *aux = (BamAuxData *)manager->get_aux_data (this , " overrides" );
1901+ nassertr (aux != nullptr , pi);
1902+
1903+ RenderAttribRegistry *reg = RenderAttribRegistry::quick_get_global_ptr ();
1904+ for (size_t i = 0 ; i < aux->_overrides .size (); ++i) {
1905+ int override = aux->_overrides [i];
1906+
1907+ RenderAttrib *attrib = DCAST (RenderAttrib, p_list[pi++]);
1908+ if (attrib != nullptr ) {
1909+ int slot = attrib->get_slot ();
1910+ if (slot > 0 && slot < reg->get_max_slots ()) {
1911+ _attributes[slot].set (attrib, override );
1912+ _filled_slots.set_bit (slot);
19141913 }
19151914 }
1916-
1917- delete _read_overrides;
1918- _read_overrides = nullptr ;
19191915 }
19201916
19211917 return pi;
@@ -1974,15 +1970,19 @@ finalize(BamReader *) {
19741970 */
19751971TypedWritable *RenderState::
19761972make_from_bam (const FactoryParams ¶ms) {
1977- RenderState *state = new RenderState;
19781973 DatagramIterator scan;
19791974 BamReader *manager;
19801975
19811976 parse_params (params, scan, manager);
1982- state->fillin (scan, manager);
1983- manager->register_change_this (change_this, state);
19841977
1985- return state;
1978+ if (scan.peek_uint16 () != 0 ) {
1979+ RenderState *state = new RenderState;
1980+ state->fillin (scan, manager);
1981+ manager->register_change_this (change_this, state);
1982+ return state;
1983+ } else {
1984+ return (TypedWritable *)_empty_state;
1985+ }
19861986}
19871987
19881988/* *
@@ -1994,16 +1994,15 @@ fillin(DatagramIterator &scan, BamReader *manager) {
19941994 TypedWritable::fillin (scan, manager);
19951995
19961996 int num_attribs = scan.get_uint16 ();
1997- if (num_attribs == 0 ) {
1998- _read_overrides = nullptr ;
1999- } else {
2000- _read_overrides = new vector_int;
2001- (*_read_overrides).reserve (num_attribs);
20021997
2003- for (int i = 0 ; i < num_attribs; ++i) {
2004- manager->read_pointer (scan);
2005- int override = scan.get_int32 ();
2006- (*_read_overrides).push_back (override );
2007- }
1998+ BamAuxData *aux_data = new BamAuxData;
1999+ aux_data->_overrides .reserve (num_attribs);
2000+
2001+ for (int i = 0 ; i < num_attribs; ++i) {
2002+ manager->read_pointer (scan);
2003+ int override = scan.get_int32 ();
2004+ aux_data->_overrides .push_back (override );
20082005 }
2006+
2007+ manager->set_aux_data (this , " overrides" , aux_data);
20092008}
0 commit comments