00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "palettePage.h"
00016 #include "texturePlacement.h"
00017 #include "textureImage.h"
00018 #include "paletteImage.h"
00019 #include "paletteGroup.h"
00020
00021 #include "indent.h"
00022 #include "datagram.h"
00023 #include "datagramIterator.h"
00024 #include "bamReader.h"
00025 #include "bamWriter.h"
00026
00027 #include <algorithm>
00028
00029 TypeHandle PalettePage::_type_handle;
00030
00031
00032
00033
00034
00035
00036
00037 PalettePage::
00038 PalettePage() {
00039 _group = (PaletteGroup *)NULL;
00040 }
00041
00042
00043
00044
00045
00046
00047 PalettePage::
00048 PalettePage(PaletteGroup *group, const TextureProperties &properties) :
00049 Namable(properties.get_string()),
00050 _group(group),
00051 _properties(properties)
00052 {
00053 }
00054
00055
00056
00057
00058
00059
00060
00061 PaletteGroup *PalettePage::
00062 get_group() const {
00063 return _group;
00064 }
00065
00066
00067
00068
00069
00070
00071
00072 const TextureProperties &PalettePage::
00073 get_properties() const {
00074 return _properties;
00075 }
00076
00077
00078
00079
00080
00081
00082
00083 void PalettePage::
00084 assign(TexturePlacement *placement) {
00085 _assigned.push_back(placement);
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095 void PalettePage::
00096 place_all() {
00097
00098
00099 sort(_assigned.begin(), _assigned.end(), SortPlacementBySize());
00100
00101 Assigned::const_iterator ai;
00102 for (ai = _assigned.begin(); ai != _assigned.end(); ++ai) {
00103 TexturePlacement *placement = (*ai);
00104 place(placement);
00105 }
00106
00107 _assigned.clear();
00108
00109
00110
00111
00112 Images::iterator ii;
00113 for (ii = _images.begin(); ii != _images.end(); ++ii) {
00114 PaletteImage *image = (*ii);
00115 image->check_solitary();
00116 }
00117 }
00118
00119
00120
00121
00122
00123
00124
00125 void PalettePage::
00126 place(TexturePlacement *placement) {
00127 nassertv(placement->get_omit_reason() == OR_working);
00128
00129
00130 Images::iterator ii;
00131 for (ii = _images.begin(); ii != _images.end(); ++ii) {
00132 PaletteImage *image = (*ii);
00133 if (image->place(placement)) {
00134 return;
00135 }
00136 }
00137
00138
00139 PaletteImage *image = new PaletteImage(this, _images.size());
00140 _images.push_back(image);
00141
00142 bool placed = image->place(placement);
00143
00144
00145 nassertv(placed);
00146 }
00147
00148
00149
00150
00151
00152
00153
00154
00155 void PalettePage::
00156 unplace(TexturePlacement *placement) {
00157 nassertv(placement->is_placed() && placement->get_page() == this);
00158 placement->get_image()->unplace(placement);
00159 }
00160
00161
00162
00163
00164
00165
00166
00167
00168 void PalettePage::
00169 write_image_info(ostream &out, int indent_level) const {
00170 Images::const_iterator ii;
00171 for (ii = _images.begin(); ii != _images.end(); ++ii) {
00172 PaletteImage *image = (*ii);
00173 if (!image->is_empty()) {
00174 indent(out, indent_level);
00175 image->output_filename(out);
00176 out << "\n";
00177 image->write_placements(out, indent_level + 2);
00178 }
00179 }
00180 }
00181
00182
00183
00184
00185
00186
00187
00188 void PalettePage::
00189 optimal_resize() {
00190 Images::iterator ii;
00191 for (ii = _images.begin(); ii != _images.end(); ++ii) {
00192 PaletteImage *image = (*ii);
00193 image->optimal_resize();
00194 }
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204 void PalettePage::
00205 reset_images() {
00206 Images::iterator ii;
00207 for (ii = _images.begin(); ii != _images.end(); ++ii) {
00208 PaletteImage *image = (*ii);
00209 image->reset_image();
00210 delete image;
00211 }
00212
00213 _images.clear();
00214 }
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224 void PalettePage::
00225 setup_shadow_images() {
00226 Images::iterator ii;
00227 for (ii = _images.begin(); ii != _images.end(); ++ii) {
00228 PaletteImage *image = (*ii);
00229 image->setup_shadow_image();
00230 }
00231 }
00232
00233
00234
00235
00236
00237
00238
00239 void PalettePage::
00240 update_images(bool redo_all) {
00241 Images::iterator ii;
00242 for (ii = _images.begin(); ii != _images.end(); ++ii) {
00243 PaletteImage *image = (*ii);
00244 image->update_image(redo_all);
00245 }
00246 }
00247
00248
00249
00250
00251
00252
00253
00254 void PalettePage::
00255 register_with_read_factory() {
00256 BamReader::get_factory()->
00257 register_factory(get_class_type(), make_PalettePage);
00258 }
00259
00260
00261
00262
00263
00264
00265
00266
00267 void PalettePage::
00268 write_datagram(BamWriter *writer, Datagram &datagram) {
00269 TypedWritable::write_datagram(writer, datagram);
00270 datagram.add_string(get_name());
00271
00272 writer->write_pointer(datagram, _group);
00273 _properties.write_datagram(writer, datagram);
00274
00275
00276
00277 datagram.add_uint32(_images.size());
00278 Images::const_iterator ii;
00279 for (ii = _images.begin(); ii != _images.end(); ++ii) {
00280 writer->write_pointer(datagram, *ii);
00281 }
00282 }
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293 int PalettePage::
00294 complete_pointers(TypedWritable **p_list, BamReader *manager) {
00295 int pi = TypedWritable::complete_pointers(p_list, manager);
00296
00297 if (p_list[pi] != (TypedWritable *)NULL) {
00298 DCAST_INTO_R(_group, p_list[pi], pi);
00299 }
00300 pi++;
00301
00302 pi += _properties.complete_pointers(p_list + pi, manager);
00303
00304 int i;
00305 _images.reserve(_num_images);
00306 for (i = 0; i < _num_images; i++) {
00307 PaletteImage *image;
00308 DCAST_INTO_R(image, p_list[pi++], pi);
00309 _images.push_back(image);
00310 }
00311
00312 return pi;
00313 }
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323 TypedWritable* PalettePage::
00324 make_PalettePage(const FactoryParams ¶ms) {
00325 PalettePage *me = new PalettePage;
00326 DatagramIterator scan;
00327 BamReader *manager;
00328
00329 parse_params(params, scan, manager);
00330 me->fillin(scan, manager);
00331 return me;
00332 }
00333
00334
00335
00336
00337
00338
00339
00340
00341 void PalettePage::
00342 fillin(DatagramIterator &scan, BamReader *manager) {
00343 TypedWritable::fillin(scan, manager);
00344 set_name(scan.get_string());
00345
00346 manager->read_pointer(scan);
00347 _properties.fillin(scan, manager);
00348
00349 _num_images = scan.get_uint32();
00350 manager->read_pointers(scan, _num_images);
00351 }