00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "palettizer.h"
00020 #include "eggFile.h"
00021 #include "textureImage.h"
00022 #include "pal_string_utils.h"
00023 #include "paletteGroup.h"
00024 #include "filenameUnifier.h"
00025 #include "textureMemoryCounter.h"
00026
00027 #include <pnmImage.h>
00028 #include <pnmFileTypeRegistry.h>
00029 #include <pnmFileType.h>
00030 #include <eggData.h>
00031 #include <datagram.h>
00032 #include <datagramIterator.h>
00033 #include <bamReader.h>
00034 #include <bamWriter.h>
00035 #include <indent.h>
00036
00037 Palettizer *pal = (Palettizer *)NULL;
00038
00039
00040
00041
00042
00043
00044 int Palettizer::_pi_version = 10;
00045
00046
00047
00048
00049 int Palettizer::_min_pi_version = 8;
00050
00051
00052 int Palettizer::_read_pi_version = 0;
00053
00054 TypeHandle Palettizer::_type_handle;
00055
00056 ostream &operator << (ostream &out, Palettizer::RemapUV remap) {
00057 switch (remap) {
00058 case Palettizer::RU_never:
00059 return out << "never";
00060
00061 case Palettizer::RU_group:
00062 return out << "per group";
00063
00064 case Palettizer::RU_poly:
00065 return out << "per polygon";
00066
00067 case Palettizer::RU_invalid:
00068 return out << "(invalid)";
00069 }
00070
00071 return out << "**invalid**(" << (int)remap << ")";
00072 }
00073
00074
00075
00076 class SortGroupsByDependencyOrder {
00077 public:
00078 bool operator ()(PaletteGroup *a, PaletteGroup *b) {
00079 if (a->get_dependency_order() != b->get_dependency_order()) {
00080 return a->get_dependency_order() < b->get_dependency_order();
00081 }
00082 return a->get_name() < b->get_name();
00083 }
00084 };
00085
00086
00087 class SortGroupsByPreference {
00088 public:
00089 bool operator ()(PaletteGroup *a, PaletteGroup *b) {
00090 return !a->is_preferred_over(*b);
00091 }
00092 };
00093
00094
00095
00096
00097
00098
00099 Palettizer::
00100 Palettizer() {
00101 _map_dirname = "%g";
00102 _shadow_dirname = "shadow";
00103 _margin = 2;
00104 _omit_solitary = false;
00105 _coverage_threshold = 2.5;
00106 _aggressively_clean_mapdir = true;
00107 _force_power_2 = true;
00108 _color_type = PNMFileTypeRegistry::get_ptr()->get_type_from_extension("rgb");
00109 _alpha_type = (PNMFileType *)NULL;
00110 _shadow_color_type = (PNMFileType *)NULL;
00111 _shadow_alpha_type = (PNMFileType *)NULL;
00112 _pal_x_size = _pal_y_size = 512;
00113
00114 _round_uvs = true;
00115 _round_unit = 0.1;
00116 _round_fuzz = 0.01;
00117 _remap_uv = RU_poly;
00118 _remap_char_uv = RU_poly;
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128 void Palettizer::
00129 report_pi() const {
00130
00131
00132 EggFiles::const_iterator efi;
00133 for (efi = _egg_files.begin(); efi != _egg_files.end(); ++efi) {
00134 (*efi).second->build_cross_links();
00135 }
00136
00137 cout
00138 << "\nparams\n"
00139 << " map directory: " << _map_dirname << "\n"
00140 << " shadow directory: "
00141 << FilenameUnifier::make_user_filename(_shadow_dirname) << "\n"
00142 << " egg relative directory: "
00143 << FilenameUnifier::make_user_filename(_rel_dirname) << "\n"
00144 << " palettize size: " << _pal_x_size << " by " << _pal_y_size << "\n"
00145 << " margin: " << _margin << "\n"
00146 << " coverage threshold: " << _coverage_threshold << "\n"
00147 << " force textures to power of 2: " << yesno(_force_power_2) << "\n"
00148 << " aggressively clean the map directory: "
00149 << yesno(_aggressively_clean_mapdir) << "\n"
00150 << " round UV area: " << yesno(_round_uvs) << "\n";
00151 if (_round_uvs) {
00152 cout << " round UV area to nearest " << _round_unit << " with fuzz "
00153 << _round_fuzz << "\n";
00154 }
00155 cout << " remap UV's: " << _remap_uv << "\n"
00156 << " remap UV's for characters: " << _remap_char_uv << "\n";
00157
00158 if (_color_type != (PNMFileType *)NULL) {
00159 cout << " generate image files of type: "
00160 << _color_type->get_suggested_extension();
00161 if (_alpha_type != (PNMFileType *)NULL) {
00162 cout << "," << _alpha_type->get_suggested_extension();
00163 }
00164 cout << "\n";
00165 }
00166
00167 if (_shadow_color_type != (PNMFileType *)NULL) {
00168 cout << " generate shadow palette files of type: "
00169 << _shadow_color_type->get_suggested_extension();
00170 if (_shadow_alpha_type != (PNMFileType *)NULL) {
00171 cout << "," << _shadow_alpha_type->get_suggested_extension();
00172 }
00173 cout << "\n";
00174 }
00175
00176 cout << "\ntexture source pathnames and assignments\n";
00177 Textures::const_iterator ti;
00178 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
00179 TextureImage *texture = (*ti).second;
00180 if (texture->is_used()) {
00181 cout << " " << texture->get_name() << ":\n";
00182 texture->write_source_pathnames(cout, 4);
00183 }
00184 }
00185
00186 cout << "\negg files and textures referenced\n";
00187 EggFiles::const_iterator ei;
00188 for (ei = _egg_files.begin(); ei != _egg_files.end(); ++ei) {
00189 EggFile *egg_file = (*ei).second;
00190 egg_file->write_description(cout, 2);
00191 egg_file->write_texture_refs(cout, 4);
00192 }
00193
00194
00195
00196 pvector<PaletteGroup *> sorted_groups;
00197 Groups::const_iterator gi;
00198 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00199 sorted_groups.push_back((*gi).second);
00200 }
00201 sort(sorted_groups.begin(), sorted_groups.end(),
00202 SortGroupsByPreference());
00203
00204 cout << "\npalette groups\n";
00205 pvector<PaletteGroup *>::iterator si;
00206 for (si = sorted_groups.begin(); si != sorted_groups.end(); ++si) {
00207 PaletteGroup *group = (*si);
00208 if (si != sorted_groups.begin()) {
00209 cout << "\n";
00210 }
00211 cout << " " << group->get_name()
00212
00213 << ": " << group->get_groups() << "\n";
00214 group->write_image_info(cout, 4);
00215 }
00216
00217 cout << "\ntextures\n";
00218 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
00219 TextureImage *texture = (*ti).second;
00220 texture->write_scale_info(cout, 2);
00221 }
00222
00223 cout << "\nsurprises\n";
00224 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
00225 TextureImage *texture = (*ti).second;
00226 if (texture->is_surprise()) {
00227 cout << " " << texture->get_name() << "\n";
00228 }
00229 }
00230 for (ei = _egg_files.begin(); ei != _egg_files.end(); ++ei) {
00231 EggFile *egg_file = (*ei).second;
00232 if (egg_file->is_surprise()) {
00233 cout << " " << egg_file->get_name() << "\n";
00234 }
00235 }
00236
00237 cout << "\n";
00238 }
00239
00240
00241
00242
00243
00244
00245
00246 void Palettizer::
00247 report_statistics() const {
00248
00249
00250 pvector<PaletteGroup *> sorted_groups;
00251
00252 Groups::const_iterator gi;
00253 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00254 sorted_groups.push_back((*gi).second);
00255 }
00256
00257 sort(sorted_groups.begin(), sorted_groups.end(),
00258 SortGroupsByDependencyOrder());
00259
00260 Placements overall_placements;
00261
00262 pvector<PaletteGroup *>::const_iterator si;
00263 for (si = sorted_groups.begin();
00264 si != sorted_groups.end();
00265 ++si) {
00266 PaletteGroup *group = (*si);
00267
00268 Placements placements;
00269 group->get_placements(placements);
00270 if (!placements.empty()) {
00271 group->get_placements(overall_placements);
00272
00273 cout << "\n" << group->get_name() << ", by itself:\n";
00274 compute_statistics(cout, 2, placements);
00275
00276 PaletteGroups complete;
00277 complete.make_complete(group->get_groups());
00278
00279 if (complete.size() > 1) {
00280 Placements complete_placements;
00281 group->get_complete_placements(complete_placements);
00282 if (complete_placements.size() != placements.size()) {
00283 cout << "\n" << group->get_name()
00284 << ", with dependents (" << complete << "):\n";
00285 compute_statistics(cout, 2, complete_placements);
00286 }
00287 }
00288 }
00289 }
00290
00291 cout << "\nOverall:\n";
00292 compute_statistics(cout, 2, overall_placements);
00293
00294 cout << "\n";
00295 }
00296
00297
00298
00299
00300
00301
00302
00303
00304 void Palettizer::
00305 read_txa_file(const Filename &txa_filename) {
00306
00307
00308 Groups::iterator gi;
00309 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00310 PaletteGroup *group = (*gi).second;
00311 group->clear_depends();
00312 }
00313
00314
00315 _shadow_color_type = (PNMFileType *)NULL;
00316 _shadow_alpha_type = (PNMFileType *)NULL;
00317
00318 if (!_txa_file.read(txa_filename)) {
00319 exit(1);
00320 }
00321
00322 if (_color_type == (PNMFileType *)NULL) {
00323 nout << "No valid output image file type available; cannot run.\n"
00324 << "Use :imagetype command in .txa file.\n";
00325 exit(1);
00326 }
00327
00328
00329
00330 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00331 PaletteGroup *group = (*gi).second;
00332 group->reset_dependency_level();
00333 }
00334
00335 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00336 PaletteGroup *group = (*gi).second;
00337 group->set_dependency_level(1);
00338 }
00339
00340 bool any_changed;
00341 do {
00342 any_changed = false;
00343 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00344 PaletteGroup *group = (*gi).second;
00345 if (group->set_dependency_order()) {
00346 any_changed = true;
00347 }
00348 }
00349 } while (any_changed);
00350 }
00351
00352
00353
00354
00355
00356
00357
00358
00359 void Palettizer::
00360 all_params_set() {
00361
00362 Groups::iterator gi;
00363 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00364 PaletteGroup *group = (*gi).second;
00365 group->setup_shadow_images();
00366 }
00367 }
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380 void Palettizer::
00381 process_command_line_eggs(bool force_texture_read, const Filename &state_filename) {
00382 _command_line_textures.clear();
00383
00384
00385
00386 CommandLineEggs::const_iterator ei;
00387 for (ei = _command_line_eggs.begin();
00388 ei != _command_line_eggs.end();
00389 ++ei) {
00390 EggFile *egg_file = (*ei);
00391
00392 egg_file->scan_textures();
00393 egg_file->get_textures(_command_line_textures);
00394
00395 egg_file->pre_txa_file();
00396 _txa_file.match_egg(egg_file);
00397 egg_file->post_txa_file();
00398 }
00399
00400
00401
00402 EggFiles::const_iterator efi;
00403 for (efi = _egg_files.begin(); efi != _egg_files.end(); ++efi) {
00404 (*efi).second->build_cross_links();
00405 }
00406
00407
00408
00409 CommandLineTextures::iterator ti;
00410 for (ti = _command_line_textures.begin();
00411 ti != _command_line_textures.end();
00412 ++ti) {
00413 TextureImage *texture = *ti;
00414
00415 if (force_texture_read || texture->is_newer_than(state_filename)) {
00416
00417
00418 texture->read_source_image();
00419 } else {
00420
00421 texture->read_header();
00422 }
00423
00424 texture->pre_txa_file();
00425 _txa_file.match_texture(texture);
00426 texture->post_txa_file();
00427 }
00428
00429
00430
00431 for (ti = _command_line_textures.begin();
00432 ti != _command_line_textures.end();
00433 ++ti) {
00434 TextureImage *texture = *ti;
00435 texture->assign_groups();
00436 }
00437
00438
00439
00440
00441
00442 for (efi = _egg_files.begin(); efi != _egg_files.end(); ++efi) {
00443 (*efi).second->choose_placements();
00444 }
00445
00446
00447
00448 for (ti = _command_line_textures.begin();
00449 ti != _command_line_textures.end();
00450 ++ti) {
00451 TextureImage *texture = *ti;
00452 texture->determine_placement_size();
00453 }
00454
00455
00456
00457 Groups::iterator gi;
00458 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00459 PaletteGroup *group = (*gi).second;
00460 group->update_unknown_textures(_txa_file);
00461 group->place_all();
00462 }
00463 }
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474 void Palettizer::
00475 process_all(bool force_texture_read, const Filename &state_filename) {
00476
00477
00478
00479 Textures::iterator ti;
00480 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
00481 TextureImage *texture = (*ti).second;
00482 texture->clear_source_basic_properties();
00483 }
00484
00485
00486
00487 CommandLineEggs::const_iterator ei;
00488 for (ei = _command_line_eggs.begin();
00489 ei != _command_line_eggs.end();
00490 ++ei) {
00491 EggFile *egg_file = (*ei);
00492
00493 egg_file->scan_textures();
00494 egg_file->get_textures(_command_line_textures);
00495 }
00496
00497
00498 EggFiles::const_iterator efi;
00499 for (efi = _egg_files.begin(); efi != _egg_files.end(); ++efi) {
00500 EggFile *egg_file = (*efi).second;
00501
00502 egg_file->pre_txa_file();
00503 _txa_file.match_egg(egg_file);
00504 egg_file->post_txa_file();
00505 }
00506
00507
00508
00509 for (efi = _egg_files.begin(); efi != _egg_files.end(); ++efi) {
00510 (*efi).second->build_cross_links();
00511
00512
00513
00514
00515 (*efi).second->apply_properties_to_source();
00516 }
00517
00518
00519
00520 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
00521 TextureImage *texture = (*ti).second;
00522
00523 if (force_texture_read || texture->is_newer_than(state_filename)) {
00524 texture->read_source_image();
00525 }
00526
00527 texture->pre_txa_file();
00528 _txa_file.match_texture(texture);
00529 texture->post_txa_file();
00530 }
00531
00532
00533 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
00534 TextureImage *texture = (*ti).second;
00535 texture->assign_groups();
00536 }
00537
00538
00539
00540
00541
00542 for (efi = _egg_files.begin(); efi != _egg_files.end(); ++efi) {
00543 (*efi).second->choose_placements();
00544 }
00545
00546
00547
00548 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
00549 TextureImage *texture = (*ti).second;
00550 texture->determine_placement_size();
00551 }
00552
00553
00554
00555 Groups::iterator gi;
00556 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00557 PaletteGroup *group = (*gi).second;
00558 group->update_unknown_textures(_txa_file);
00559 group->place_all();
00560 }
00561 }
00562
00563
00564
00565
00566
00567
00568
00569 void Palettizer::
00570 optimal_resize() {
00571 Groups::iterator gi;
00572 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00573 PaletteGroup *group = (*gi).second;
00574 group->optimal_resize();
00575 }
00576 }
00577
00578
00579
00580
00581
00582
00583
00584
00585 void Palettizer::
00586 reset_images() {
00587 Groups::iterator gi;
00588 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00589 PaletteGroup *group = (*gi).second;
00590 group->reset_images();
00591 }
00592 }
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602 void Palettizer::
00603 generate_images(bool redo_all) {
00604 Groups::iterator gi;
00605 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00606 PaletteGroup *group = (*gi).second;
00607 group->update_images(redo_all);
00608 }
00609
00610 Textures::iterator ti;
00611 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
00612 TextureImage *texture = (*ti).second;
00613 texture->copy_unplaced(redo_all);
00614 }
00615 }
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629 bool Palettizer::
00630 read_stale_eggs(bool redo_all) {
00631 bool okflag = true;
00632
00633 pvector<EggFiles::iterator> invalid_eggs;
00634
00635 EggFiles::iterator ei;
00636 for (ei = _egg_files.begin(); ei != _egg_files.end(); ++ei) {
00637 EggFile *egg_file = (*ei).second;
00638 if (!egg_file->has_data() &&
00639 (egg_file->is_stale() || redo_all)) {
00640 if (!egg_file->read_egg()) {
00641 invalid_eggs.push_back(ei);
00642
00643 } else {
00644 egg_file->scan_textures();
00645 egg_file->choose_placements();
00646 }
00647 }
00648 }
00649
00650
00651 pvector<EggFiles::iterator>::iterator ii;
00652 for (ii = invalid_eggs.begin(); ii != invalid_eggs.end(); ++ii) {
00653 EggFiles::iterator ei = (*ii);
00654 EggFile *egg_file = (*ei).second;
00655 nout << "Removing " << (*ei).first << "\n";
00656 egg_file->remove_egg();
00657 _egg_files.erase(ei);
00658 }
00659
00660 return okflag;
00661 }
00662
00663
00664
00665
00666
00667
00668
00669
00670 bool Palettizer::
00671 write_eggs() {
00672 bool okflag = true;
00673
00674 EggFiles::iterator ei;
00675 for (ei = _egg_files.begin(); ei != _egg_files.end(); ++ei) {
00676 EggFile *egg_file = (*ei).second;
00677 if (egg_file->has_data()) {
00678 egg_file->update_egg();
00679 if (!egg_file->write_egg()) {
00680 okflag = false;
00681 }
00682 }
00683 }
00684
00685 return okflag;
00686 }
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696 EggFile *Palettizer::
00697 get_egg_file(const string &name) {
00698 EggFiles::iterator ei = _egg_files.find(name);
00699 if (ei != _egg_files.end()) {
00700 return (*ei).second;
00701 }
00702
00703 EggFile *file = new EggFile;
00704 file->set_name(name);
00705 _egg_files.insert(EggFiles::value_type(name, file));
00706 return file;
00707 }
00708
00709
00710
00711
00712
00713
00714
00715
00716 bool Palettizer::
00717 remove_egg_file(const string &name) {
00718 EggFiles::iterator ei = _egg_files.find(name);
00719 if (ei != _egg_files.end()) {
00720 EggFile *file = (*ei).second;
00721 file->remove_egg();
00722 _egg_files.erase(ei);
00723 return true;
00724 }
00725
00726 return false;
00727 }
00728
00729
00730
00731
00732
00733
00734
00735
00736 PaletteGroup *Palettizer::
00737 get_palette_group(const string &name) {
00738 Groups::iterator gi = _groups.find(name);
00739 if (gi != _groups.end()) {
00740 return (*gi).second;
00741 }
00742
00743 PaletteGroup *group = new PaletteGroup;
00744 group->set_name(name);
00745 _groups.insert(Groups::value_type(name, group));
00746 return group;
00747 }
00748
00749
00750
00751
00752
00753
00754
00755
00756 PaletteGroup *Palettizer::
00757 test_palette_group(const string &name) const {
00758 Groups::const_iterator gi = _groups.find(name);
00759 if (gi != _groups.end()) {
00760 return (*gi).second;
00761 }
00762
00763 return (PaletteGroup *)NULL;
00764 }
00765
00766
00767
00768
00769
00770
00771
00772 PaletteGroup *Palettizer::
00773 get_default_group() {
00774 PaletteGroup *default_group = get_palette_group(_default_groupname);
00775 if (!_default_groupdir.empty() && !default_group->has_dirname()) {
00776 default_group->set_dirname(_default_groupdir);
00777 }
00778 return default_group;
00779 }
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790 TextureImage *Palettizer::
00791 get_texture(const string &name) {
00792 Textures::iterator ti = _textures.find(name);
00793 if (ti != _textures.end()) {
00794 return (*ti).second;
00795 }
00796
00797 TextureImage *image = new TextureImage;
00798 image->set_name(name);
00799
00800 _textures.insert(Textures::value_type(name, image));
00801 return image;
00802 }
00803
00804
00805
00806
00807
00808
00809
00810 const char *Palettizer::
00811 yesno(bool flag) {
00812 return flag ? "yes" : "no";
00813 }
00814
00815
00816
00817
00818
00819
00820
00821
00822 Palettizer::RemapUV Palettizer::
00823 string_remap(const string &str) {
00824 if (str == "never") {
00825 return RU_never;
00826
00827 } else if (str == "group") {
00828 return RU_group;
00829
00830 } else if (str == "poly") {
00831 return RU_poly;
00832
00833 } else {
00834 return RU_invalid;
00835 }
00836 }
00837
00838
00839
00840
00841
00842
00843
00844
00845 void Palettizer::
00846 compute_statistics(ostream &out, int indent_level,
00847 const Palettizer::Placements &placements) const {
00848 TextureMemoryCounter counter;
00849
00850 Placements::const_iterator pi;
00851 for (pi = placements.begin(); pi != placements.end(); ++pi) {
00852 TexturePlacement *placement = (*pi);
00853 counter.add_placement(placement);
00854 }
00855
00856 counter.report(out, indent_level);
00857 }
00858
00859
00860
00861
00862
00863
00864
00865 void Palettizer::
00866 register_with_read_factory() {
00867 BamReader::get_factory()->
00868 register_factory(get_class_type(), make_Palettizer);
00869 }
00870
00871
00872
00873
00874
00875
00876
00877
00878 void Palettizer::
00879 write_datagram(BamWriter *writer, Datagram &datagram) {
00880 TypedWritable::write_datagram(writer, datagram);
00881
00882 datagram.add_int32(_pi_version);
00883 datagram.add_string(_map_dirname);
00884 datagram.add_string(FilenameUnifier::make_bam_filename(_shadow_dirname));
00885 datagram.add_string(FilenameUnifier::make_bam_filename(_rel_dirname));
00886 datagram.add_int32(_pal_x_size);
00887 datagram.add_int32(_pal_y_size);
00888 datagram.add_int32(_margin);
00889 datagram.add_bool(_omit_solitary);
00890 datagram.add_float64(_coverage_threshold);
00891 datagram.add_bool(_force_power_2);
00892 datagram.add_bool(_aggressively_clean_mapdir);
00893 datagram.add_bool(_round_uvs);
00894 datagram.add_float64(_round_unit);
00895 datagram.add_float64(_round_fuzz);
00896 datagram.add_int32((int)_remap_uv);
00897 datagram.add_int32((int)_remap_char_uv);
00898
00899 writer->write_pointer(datagram, _color_type);
00900 writer->write_pointer(datagram, _alpha_type);
00901 writer->write_pointer(datagram, _shadow_color_type);
00902 writer->write_pointer(datagram, _shadow_alpha_type);
00903
00904 datagram.add_int32(_egg_files.size());
00905 EggFiles::const_iterator ei;
00906 for (ei = _egg_files.begin(); ei != _egg_files.end(); ++ei) {
00907 writer->write_pointer(datagram, (*ei).second);
00908 }
00909
00910
00911
00912
00913 datagram.add_int32(_groups.size());
00914 Groups::const_iterator gi;
00915 for (gi = _groups.begin(); gi != _groups.end(); ++gi) {
00916 writer->write_pointer(datagram, (*gi).second);
00917 }
00918
00919 datagram.add_int32(_textures.size());
00920 Textures::const_iterator ti;
00921 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
00922 writer->write_pointer(datagram, (*ti).second);
00923 }
00924 }
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935 int Palettizer::
00936 complete_pointers(TypedWritable **p_list, BamReader *manager) {
00937 int index = TypedWritable::complete_pointers(p_list, manager);
00938
00939 if (p_list[index] != (TypedWritable *)NULL) {
00940 DCAST_INTO_R(_color_type, p_list[index], index);
00941 }
00942 index++;
00943
00944 if (p_list[index] != (TypedWritable *)NULL) {
00945 DCAST_INTO_R(_alpha_type, p_list[index], index);
00946 }
00947 index++;
00948
00949 if (p_list[index] != (TypedWritable *)NULL) {
00950 DCAST_INTO_R(_shadow_color_type, p_list[index], index);
00951 }
00952 index++;
00953
00954 if (p_list[index] != (TypedWritable *)NULL) {
00955 DCAST_INTO_R(_shadow_alpha_type, p_list[index], index);
00956 }
00957 index++;
00958
00959 int i;
00960 for (i = 0; i < _num_egg_files; i++) {
00961 EggFile *egg_file;
00962 DCAST_INTO_R(egg_file, p_list[index], index);
00963 _egg_files.insert(EggFiles::value_type(egg_file->get_name(), egg_file));
00964 index++;
00965 }
00966
00967 for (i = 0; i < _num_groups; i++) {
00968 PaletteGroup *group;
00969 DCAST_INTO_R(group, p_list[index], index);
00970 _groups.insert(Groups::value_type(group->get_name(), group));
00971 index++;
00972 }
00973
00974 for (i = 0; i < _num_textures; i++) {
00975 TextureImage *texture;
00976 DCAST_INTO_R(texture, p_list[index], index);
00977
00978 _textures.insert(Textures::value_type(texture->get_name(), texture));
00979 index++;
00980 }
00981
00982 return index;
00983 }
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993 TypedWritable* Palettizer::
00994 make_Palettizer(const FactoryParams ¶ms) {
00995 Palettizer *me = new Palettizer;
00996 DatagramIterator scan;
00997 BamReader *manager;
00998
00999 parse_params(params, scan, manager);
01000 me->fillin(scan, manager);
01001 return me;
01002 }
01003
01004
01005
01006
01007
01008
01009
01010
01011 void Palettizer::
01012 fillin(DatagramIterator &scan, BamReader *manager) {
01013 TypedWritable::fillin(scan, manager);
01014
01015 _read_pi_version = scan.get_int32();
01016 _map_dirname = scan.get_string();
01017 _shadow_dirname = FilenameUnifier::get_bam_filename(scan.get_string());
01018 _rel_dirname = FilenameUnifier::get_bam_filename(scan.get_string());
01019 FilenameUnifier::set_rel_dirname(_rel_dirname);
01020 _pal_x_size = scan.get_int32();
01021 _pal_y_size = scan.get_int32();
01022 _margin = scan.get_int32();
01023 _omit_solitary = scan.get_bool();
01024 _coverage_threshold = scan.get_float64();
01025 _force_power_2 = scan.get_bool();
01026 _aggressively_clean_mapdir = scan.get_bool();
01027 _round_uvs = scan.get_bool();
01028 _round_unit = scan.get_float64();
01029 _round_fuzz = scan.get_float64();
01030 _remap_uv = (RemapUV)scan.get_int32();
01031 _remap_char_uv = (RemapUV)scan.get_int32();
01032
01033 manager->read_pointer(scan);
01034 manager->read_pointer(scan);
01035 manager->read_pointer(scan);
01036 manager->read_pointer(scan);
01037
01038 _num_egg_files = scan.get_int32();
01039 manager->read_pointers(scan, _num_egg_files);
01040
01041 _num_groups = scan.get_int32();
01042 manager->read_pointers(scan, _num_groups);
01043
01044 _num_textures = scan.get_int32();
01045 manager->read_pointers(scan, _num_textures);
01046 }
01047