Skip to content

Commit a2ae62d

Browse files
committed
Introduce ability to write older .bam versions, down to 6.21
See https://www.panda3d.org/manual/index.php/Dev:Bam_Format
1 parent 063f9bb commit a2ae62d

27 files changed

+280
-71
lines changed

panda/src/gobj/geomVertexArrayFormat.cxx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,10 @@ write_datagram(BamWriter *manager, Datagram &dg) {
708708
dg.add_uint16(_stride);
709709
dg.add_uint16(_total_bytes);
710710
dg.add_uint8(_pad_to);
711-
dg.add_uint16(_divisor);
711+
712+
if (manager->get_file_minor_ver() > 36) {
713+
dg.add_uint16(_divisor);
714+
}
712715

713716
consider_sort_columns();
714717

panda/src/gobj/geomVertexColumn.cxx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,9 +378,19 @@ write_datagram(BamWriter *manager, Datagram &dg) {
378378
manager->write_pointer(dg, _name);
379379
dg.add_uint8(_num_components);
380380
dg.add_uint8(_numeric_type);
381-
dg.add_uint8(_contents);
381+
382+
if (_contents == C_normal && manager->get_file_minor_ver() < 38) {
383+
// Panda 1.9 did not have C_normal.
384+
dg.add_uint8(C_vector);
385+
} else {
386+
dg.add_uint8(_contents);
387+
}
388+
382389
dg.add_uint16(_start);
383-
dg.add_uint8(_column_alignment);
390+
391+
if (manager->get_file_minor_ver() >= 29) {
392+
dg.add_uint8(_column_alignment);
393+
}
384394
}
385395

386396
/**

panda/src/gobj/material.cxx

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ set_roughness(PN_stdfloat roughness) {
257257
// Calculate the specular exponent from the roughness as it is used in
258258
// Blinn-Phong shading model. We use the popular Disney method of squaring
259259
// the roughness to get a more perceptually linear scale. From:
260-
// http:graphicrants.blogspot.de201308specular-brdf-reference.html
260+
// http://graphicrants.blogspot.de/2013/08/specular-brdf-reference.html
261261
if (roughness <= 0 || IS_NEARLY_ZERO(roughness)) {
262262
_shininess = make_inf((PN_stdfloat)0);
263263
} else {
@@ -481,26 +481,35 @@ void Material::
481481
write_datagram(BamWriter *manager, Datagram &me) {
482482
me.add_string(get_name());
483483

484-
me.add_int32(_flags);
484+
if (manager->get_file_minor_ver() >= 39) {
485+
me.add_int32(_flags);
485486

486-
if (_flags & F_metallic) {
487-
// Metalness workflow.
488-
_base_color.write_datagram(me);
489-
me.add_stdfloat(_metallic);
487+
if (_flags & F_metallic) {
488+
// Metalness workflow.
489+
_base_color.write_datagram(me);
490+
me.add_stdfloat(_metallic);
491+
} else {
492+
_ambient.write_datagram(me);
493+
_diffuse.write_datagram(me);
494+
_specular.write_datagram(me);
495+
}
496+
_emission.write_datagram(me);
497+
498+
if (_flags & F_roughness) {
499+
me.add_stdfloat(_roughness);
500+
} else {
501+
me.add_stdfloat(_shininess);
502+
}
503+
504+
me.add_stdfloat(_refractive_index);
490505
} else {
491506
_ambient.write_datagram(me);
492507
_diffuse.write_datagram(me);
493508
_specular.write_datagram(me);
494-
}
495-
_emission.write_datagram(me);
496-
497-
if (_flags & F_roughness) {
498-
me.add_stdfloat(_roughness);
499-
} else {
509+
_emission.write_datagram(me);
500510
me.add_stdfloat(_shininess);
511+
me.add_int32(_flags & 0x7f);
501512
}
502-
503-
me.add_stdfloat(_refractive_index);
504513
}
505514

506515
/**

panda/src/gobj/matrixLens.cxx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,18 @@ register_with_read_factory() {
8383
*/
8484
void MatrixLens::
8585
write_datagram(BamWriter *manager, Datagram &dg) {
86-
dg.add_uint8(_ml_flags);
87-
_user_mat.write_datagram(dg);
86+
Lens::write_datagram(manager, dg);
8887

89-
if (_ml_flags & MF_has_left_eye) {
90-
_left_eye_mat.write_datagram(dg);
91-
}
92-
if (_ml_flags & MF_has_right_eye) {
93-
_left_eye_mat.write_datagram(dg);
88+
if (manager->get_file_minor_ver() >= 41) {
89+
dg.add_uint8(_ml_flags);
90+
_user_mat.write_datagram(dg);
91+
92+
if (_ml_flags & MF_has_left_eye) {
93+
_left_eye_mat.write_datagram(dg);
94+
}
95+
if (_ml_flags & MF_has_right_eye) {
96+
_left_eye_mat.write_datagram(dg);
97+
}
9498
}
9599
}
96100

panda/src/gobj/texture.cxx

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8663,8 +8663,19 @@ do_write_datagram_header(CData *cdata, BamWriter *manager, Datagram &me, bool &h
86638663
me.add_uint8(cdata->_primary_file_num_channels);
86648664
me.add_uint8(cdata->_alpha_file_channel);
86658665
me.add_bool(has_rawdata);
8666-
me.add_uint8(cdata->_texture_type);
8667-
me.add_bool(cdata->_has_read_mipmaps);
8666+
8667+
if (manager->get_file_minor_ver() < 25 &&
8668+
cdata->_texture_type == TT_cube_map) {
8669+
// Between Panda3D releases 1.7.2 and 1.8.0 (bam versions 6.24 and 6.25),
8670+
// we added TT_2d_texture_array, shifting the definition for TT_cube_map.
8671+
me.add_uint8(TT_2d_texture_array);
8672+
} else {
8673+
me.add_uint8(cdata->_texture_type);
8674+
}
8675+
8676+
if (manager->get_file_minor_ver() >= 32) {
8677+
me.add_bool(cdata->_has_read_mipmaps);
8678+
}
86688679
}
86698680

86708681
/**
@@ -8673,7 +8684,18 @@ do_write_datagram_header(CData *cdata, BamWriter *manager, Datagram &me, bool &h
86738684
*/
86748685
void Texture::
86758686
do_write_datagram_body(CData *cdata, BamWriter *manager, Datagram &me) {
8676-
cdata->_default_sampler.write_datagram(me);
8687+
if (manager->get_file_minor_ver() >= 36) {
8688+
cdata->_default_sampler.write_datagram(me);
8689+
} else {
8690+
const SamplerState &s = cdata->_default_sampler;
8691+
me.add_uint8(s.get_wrap_u());
8692+
me.add_uint8(s.get_wrap_v());
8693+
me.add_uint8(s.get_wrap_w());
8694+
me.add_uint8(s.get_minfilter());
8695+
me.add_uint8(s.get_magfilter());
8696+
me.add_int16(s.get_anisotropic_degree());
8697+
s.get_border_color().write_datagram(me);
8698+
}
86778699

86788700
me.add_uint8(cdata->_compression);
86798701
me.add_uint8(cdata->_quality_level);
@@ -8685,7 +8707,9 @@ do_write_datagram_body(CData *cdata, BamWriter *manager, Datagram &me) {
86858707
me.add_uint8(cdata->_usage_hint);
86868708
}
86878709

8688-
me.add_uint8(cdata->_auto_texture_scale);
8710+
if (manager->get_file_minor_ver() >= 28) {
8711+
me.add_uint8(cdata->_auto_texture_scale);
8712+
}
86898713
me.add_uint32(cdata->_orig_file_x_size);
86908714
me.add_uint32(cdata->_orig_file_y_size);
86918715

@@ -8711,11 +8735,15 @@ do_write_datagram_rawdata(CData *cdata, BamWriter *manager, Datagram &me) {
87118735
me.add_uint32(cdata->_y_size);
87128736
me.add_uint32(cdata->_z_size);
87138737

8714-
me.add_uint32(cdata->_pad_x_size);
8715-
me.add_uint32(cdata->_pad_y_size);
8716-
me.add_uint32(cdata->_pad_z_size);
8738+
if (manager->get_file_minor_ver() >= 30) {
8739+
me.add_uint32(cdata->_pad_x_size);
8740+
me.add_uint32(cdata->_pad_y_size);
8741+
me.add_uint32(cdata->_pad_z_size);
8742+
}
87178743

8718-
me.add_uint32(cdata->_num_views);
8744+
if (manager->get_file_minor_ver() >= 26) {
8745+
me.add_uint32(cdata->_num_views);
8746+
}
87198747
me.add_uint8(cdata->_component_type);
87208748
me.add_uint8(cdata->_component_width);
87218749
me.add_uint8(cdata->_ram_image_compression);

panda/src/gobj/textureStage.cxx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,10 @@ write_datagram(BamWriter *manager, Datagram &me) {
438438
me.add_uint8(_rgb_scale);
439439
me.add_uint8(_alpha_scale);
440440
me.add_bool(_saved_result);
441-
me.add_int32(_tex_view_offset);
441+
442+
if (manager->get_file_minor_ver() >= 26) {
443+
me.add_int32(_tex_view_offset);
444+
}
442445

443446
me.add_uint8(_combine_rgb_mode);
444447
me.add_uint8(_num_combine_rgb_operands);

panda/src/grutil/movieTexture.cxx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,10 @@ do_write_datagram_rawdata(Texture::CData *cdata_tex, BamWriter *manager, Datagra
816816
CDReader cdata(_cycler);
817817

818818
dg.add_uint16(cdata_tex->_z_size);
819-
dg.add_uint16(cdata_tex->_num_views);
819+
if (manager->get_file_minor_ver() >= 26) {
820+
dg.add_uint16(cdata_tex->_num_views);
821+
}
822+
820823
nassertv(cdata->_pages.size() == (size_t)(cdata_tex->_z_size * cdata_tex->_num_views));
821824
for (size_t n = 0; n < cdata->_pages.size(); ++n) {
822825
const VideoPage &page = cdata->_pages[n];

panda/src/pgraph/clipPlaneAttrib.cxx

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -872,18 +872,32 @@ write_datagram(BamWriter *manager, Datagram &dg) {
872872

873873
// write the number of off_planes
874874
dg.add_uint16(get_num_off_planes());
875+
875876
// write the off planes pointers if any
876877
Planes::const_iterator fi;
877-
for (fi = _off_planes.begin(); fi != _off_planes.end(); ++fi) {
878-
(*fi).write_datagram(manager, dg);
878+
if (manager->get_file_minor_ver() < 40) {
879+
for (fi = _off_planes.begin(); fi != _off_planes.end(); ++fi) {
880+
manager->write_pointer(dg, fi->node());
881+
}
882+
} else {
883+
for (fi = _off_planes.begin(); fi != _off_planes.end(); ++fi) {
884+
(*fi).write_datagram(manager, dg);
885+
}
879886
}
880887

881888
// write the number of on planes
882889
dg.add_uint16(get_num_on_planes());
890+
883891
// write the on planes pointers if any
884892
Planes::const_iterator nti;
885-
for (nti = _on_planes.begin(); nti != _on_planes.end(); ++nti) {
886-
(*nti).write_datagram(manager, dg);
893+
if (manager->get_file_minor_ver() < 40) {
894+
for (nti = _on_planes.begin(); nti != _on_planes.end(); ++nti) {
895+
manager->write_pointer(dg, nti->node());
896+
}
897+
} else {
898+
for (nti = _on_planes.begin(); nti != _on_planes.end(); ++nti) {
899+
(*nti).write_datagram(manager, dg);
900+
}
887901
}
888902
}
889903

panda/src/pgraph/depthOffsetAttrib.cxx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,10 @@ write_datagram(BamWriter *manager, Datagram &dg) {
162162
RenderAttrib::write_datagram(manager, dg);
163163

164164
dg.add_int32(_offset);
165-
dg.add_stdfloat(_min_value);
166-
dg.add_stdfloat(_max_value);
165+
if (manager->get_file_minor_ver() >= 31) {
166+
dg.add_stdfloat(_min_value);
167+
dg.add_stdfloat(_max_value);
168+
}
167169
}
168170

169171
/**

panda/src/pgraph/light.cxx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,13 @@ fill_viz_geom(GeomNode *) {
206206
*/
207207
void Light::
208208
write_datagram(BamWriter *manager, Datagram &dg) {
209-
dg.add_bool(_has_color_temperature);
210-
if (_has_color_temperature) {
211-
dg.add_stdfloat(_color_temperature);
209+
if (manager->get_file_minor_ver() >= 39) {
210+
dg.add_bool(_has_color_temperature);
211+
if (_has_color_temperature) {
212+
dg.add_stdfloat(_color_temperature);
213+
} else {
214+
manager->write_cdata(dg, _cycler);
215+
}
212216
} else {
213217
manager->write_cdata(dg, _cycler);
214218
}

0 commit comments

Comments
 (0)