45 _first_txa_match =
false;
46 _default_group =
nullptr;
60 const std::string &egg_comment) {
63 remove_backstage(_data);
69 _source_filename = source_filename;
70 _source_filename.make_absolute();
71 _dest_filename = dest_filename;
77 _egg_comment = egg_comment;
82 _default_group = pal->get_default_group();
92 return _source_filename;
103 nassertv(_data !=
nullptr);
114 Textures new_textures;
116 EggTextureCollection::iterator eti;
117 for (eti = tc.begin(); eti != tc.end(); ++eti) {
121 ref->
from_egg(
this, _data, egg_tex);
130 new_textures.push_back(ref);
136 sort(new_textures.begin(), new_textures.end(),
141 sort(_textures.begin(), _textures.end(),
145 Textures combined_textures;
146 Textures::const_iterator ai = _textures.begin();
147 Textures::const_iterator bi = new_textures.begin();
149 while (ai != _textures.end() && bi != new_textures.end()) {
153 if ((*aref) < (*bref)) {
159 }
else if ((*bref) < (*aref)) {
162 combined_textures.push_back(bref);
171 combined_textures.push_back(aref);
176 combined_textures.push_back(bref);
184 while (bi != new_textures.end()) {
188 combined_textures.push_back(bref);
192 while (ai != _textures.end()) {
200 _textures.swap(combined_textures);
211 Textures::const_iterator ti;
212 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
213 result.insert((*ti)->get_texture());
223 _first_txa_match =
true;
232 if (_first_txa_match) {
237 _explicitly_assigned_groups.clear();
238 _first_txa_match =
false;
241 _explicitly_assigned_groups.make_union(_explicitly_assigned_groups, groups);
258 return _explicitly_assigned_groups;
267 return _default_group;
277 return _complete_groups;
286 _is_surprise =
false;
326 if (_explicitly_assigned_groups.empty()) {
329 _complete_groups.clear();
330 _complete_groups.insert(_default_group);
331 _complete_groups.make_complete(_complete_groups);
334 _complete_groups.make_complete(_explicitly_assigned_groups);
337 Textures::const_iterator ti;
338 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
341 nassertv(texture !=
nullptr);
347 reference->get_source()->increment_egg_count();
350 PaletteGroups::const_iterator gi;
351 for (gi = _complete_groups.begin();
352 gi != _complete_groups.end();
354 (*gi)->increment_egg_count();
365 Textures::const_iterator ti;
366 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
382 Textures::const_iterator ti;
383 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
387 if (
reference->get_placement() !=
nullptr &&
400 if (groups.
empty()) {
408 if (!groups.
empty()) {
416 nassertv(placement !=
nullptr);
430 return (_data !=
nullptr);
448 nassertv(_data !=
nullptr);
450 Textures::iterator ti;
451 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
463 Textures::iterator ti;
464 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
481 nassertr(_data ==
nullptr,
false);
482 nassertr(!_source_filename.empty(),
false);
487 if (!_source_filename.exists()) {
488 nout << user_source_filename <<
" does not exist.\n";
493 if (!data->read(_source_filename, user_source_filename)) {
498 if (noabs && data->original_had_absolute_pathnames()) {
499 nout << _source_filename.get_basename()
500 <<
" references textures using absolute pathnames!\n";
513 Textures new_textures;
522 data->resolve_filenames(dir);
526 data->force_filenames(_current_directory);
528 if (!data->load_externals()) {
535 remove_backstage(_data);
539 _data->insert(_data->begin(), comment);
541 if (!_textures.empty()) {
554 if (_data !=
nullptr) {
557 Textures::iterator ti;
558 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
570 nassertr(_data !=
nullptr,
false);
571 nassertr(!_dest_filename.empty(),
false);
573 _dest_filename.make_dir();
576 if (!_data->write_egg(_dest_filename)) {
592 indent(out, indent_level) << get_name() <<
": ";
593 if (_explicitly_assigned_groups.empty()) {
594 if (_default_group !=
nullptr) {
595 out << _default_group->get_name();
598 out << _explicitly_assigned_groups;
602 out <<
" (needs update)";
613 Textures::const_iterator ti;
614 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
627 EggGroupNode::iterator ci;
629 while (ci != node->end()) {
631 bool remove_child =
false;
633 if (child->
is_of_type(EggGroup::get_class_type())) {
635 DCAST_INTO_V(egg_group, child);
640 ci = node->erase(ci);
642 if (child->
is_of_type(EggGroupNode::get_class_type())) {
644 remove_backstage(DCAST(EggGroupNode, child));
657 nassertv(_data !=
nullptr);
660 EggTextureCollection tc;
666 typedef pmap<std::string, TextureReference *> ByTRefName;
667 ByTRefName by_tref_name;
668 for (Textures::const_iterator ti = _textures.begin();
669 ti != _textures.end();
671 TextureReference *ref = (*ti);
675 EggTextureCollection::iterator eti;
676 for (eti = tc.begin(); eti != tc.end(); ++eti) {
677 EggTexture *egg_tex = (*eti);
679 ByTRefName::const_iterator tni = by_tref_name.find(egg_tex->get_name());
680 if (tni == by_tref_name.end()) {
682 nout << _source_filename.get_basename()
683 <<
" modified during session--TRef " << egg_tex->get_name()
687 TextureReference *ref = (*tni).second;
699 register_factory(get_class_type(), make_EggFile);
719 Textures::iterator ti;
720 for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
724 _explicitly_assigned_groups.write_datagram(writer, datagram);
744 _textures.reserve(_num_textures);
745 for (i = 0; i < _num_textures; i++) {
747 DCAST_INTO_R(texture, p_list[pi], pi);
748 _textures.push_back(texture);
752 pi += _explicitly_assigned_groups.complete_pointers(p_list + pi, manager);
754 if (p_list[pi] !=
nullptr) {
755 DCAST_INTO_R(_default_group, p_list[pi], pi);
774 me->fillin(scan, manager);
789 if (Palettizer::_read_pi_version >= 9) {
796 _explicitly_assigned_groups.fillin(scan, manager);
802 if (Palettizer::_read_pi_version < 11) {
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void parse_params(const FactoryParams ¶ms, DatagramIterator &scan, BamReader *&manager)
Takes in a FactoryParams, passed from a WritableFactory into any TypedWritable's make function,...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
void read_pointers(DatagramIterator &scan, int count)
A convenience function to read a contiguous list of pointers.
bool read_pointer(DatagramIterator &scan)
The interface for reading a pointer to another object from a Bam file.
static WritableFactory * get_factory()
Returns the global WritableFactory for generating TypedWritable objects.
void write_pointer(Datagram &packet, const TypedWritable *dest)
The interface for writing a pointer to another object to a Bam file.
This class stores a list of directories that can be searched, in order, to locate a particular file.
void append_directory(const Filename &directory)
Adds a new directory to the end of the search list.
A class to retrieve the individual data elements previously stored in a Datagram.
uint32_t get_uint32()
Extracts an unsigned 32-bit integer.
bool get_bool()
Extracts a boolean value.
std::string get_string()
Extracts a variable-length string.
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
void add_uint32(uint32_t value)
Adds an unsigned 32-bit integer to the datagram.
void add_bool(bool value)
Adds a boolean value to the datagram.
void add_string(const std::string &str)
Adds a variable-length string to the datagram.
This is the primary interface into all the egg data, and the root of the egg file structure.
This represents a single egg file known to the palettizer.
void remove_egg()
Removes this egg file from all things that reference it, in preparation for removing it from the data...
void match_txa_groups(const PaletteGroups &groups)
Adds the indicated set of groups, read from the .txa file, to the set of groups to which the egg file...
void pre_txa_file()
Does some processing prior to scanning the .txa file.
bool from_command_line(EggData *data, const Filename &source_filename, const Filename &dest_filename, const std::string &egg_comment)
Accepts the information about the egg file as supplied from the command line.
void choose_placements()
Once all the textures have been assigned to groups (but before they may actually be placed),...
bool is_stale() const
Returns true if the egg file needs to be updated, i.e.
virtual void write_datagram(BamWriter *writer, Datagram &datagram)
Fills the indicated datagram up with a binary representation of the current object,...
void get_textures(pset< TextureImage * > &result) const
Fills up the indicated set with the set of textures referenced by this egg file.
void write_description(std::ostream &out, int indent_level=0) const
Writes a one-line description of the egg file and its group assignments to the indicated output strea...
const Filename & get_source_filename() const
Returns the filename this egg file was read from.
const PaletteGroups & get_complete_groups() const
Returns the complete set of PaletteGroups that the egg file is assigned to.
void update_egg()
Once all textures have been placed appropriately, updates the egg file with all the information to re...
void apply_properties_to_source()
Calls apply_properties_to_source() for each texture reference, updating all the referenced source tex...
void clear_surprise()
Removes the 'surprise' flag; this file has been successfully matched against a line in the ....
PaletteGroup * get_default_group() const
Returns the PaletteGroup that was specified as the default group on the command line at the time the ...
void build_cross_links()
Calls TextureImage::note_egg_file() and SourceTextureImage::increment_egg_count() for each texture th...
const PaletteGroups & get_explicit_groups() const
Returns the set of PaletteGroups that the egg file has been explicitly assigned to in the ....
void release_egg_data()
Releases the memory that was loaded by a previous call to read_egg().
void scan_textures()
Scans the egg file for texture references and updates the _textures list appropriately.
void write_texture_refs(std::ostream &out, int indent_level=0) const
Writes the list of texture references to the indicated output stream, one per line.
bool had_data() const
Returns true if the EggData for this EggFile has ever been loaded in this session.
bool is_surprise() const
Returns true if this particular egg file is a 'surprise', i.e.
static void register_with_read_factory()
Registers the current object as something that can be read from a Bam file.
virtual int complete_pointers(TypedWritable **p_list, BamReader *manager)
Called after the object is otherwise completely read from a Bam file, this function's job is to store...
bool write_egg()
Writes out the egg file to its _dest_filename.
void mark_stale()
Marks this particular egg file as stale, meaning that something has changed, such as the location of ...
void post_txa_file()
Once the egg file has been matched against all of the matching lines the .txa file,...
bool read_egg(bool noabs)
Reads in the egg file from its _source_filename.
bool has_data() const
Returns true if the EggData for this EggFile has been loaded, and not yet released.
A base class for nodes in the hierarchy that are not leaf nodes.
The main glue of the egg hierarchy, this corresponds to the <Group>, <Instance>, and <Joint> type nod...
bool has_object_type(const std::string &object_type) const
Returns true if the indicated object type has been added to the group, or false otherwise.
A base class for things that may be directly added into the egg hierarchy.
This is a collection of textures by TRef name.
int find_used_textures(EggNode *node)
Walks the egg hierarchy beginning at the indicated node, looking for textures that are referenced by ...
void uniquify_trefs()
Guarantees that each texture in the collection has a unique TRef name.
Defines a texture map that may be applied to geometry.
get_cwd
Returns the name of the current working directory.
An instance of this class is passed to the Factory when requesting it to do its business and construc...
static Filename get_bam_filename(Filename filename)
Returns an absolute pathname based on the given relative pathname, presumably read from the bam file ...
static Filename make_bam_filename(Filename filename)
Returns a new filename that's made relative to the bam file itself, suitable for writing to the bam f...
static Filename make_user_filename(Filename filename)
Returns a new filename that's made relative to the current directory, suitable for reporting to the u...
The name of a file, such as a texture file or an Egg file.
void make_absolute()
Converts the filename to a fully-qualified pathname from the root (if it is a relative pathname),...
An STL function object class, this is intended to be used on any ordered collection of pointers to cl...
This is the highest level of grouping for TextureImages.
iterator begin() const
Returns an iterator suitable for traversing the set.
size_type count(PaletteGroup *group) const
Returns the number of times the given group appears in the set.
void make_intersection(const PaletteGroups &a, const PaletteGroups &b)
Computes the intersection of PaletteGroups a and b, and stores the result in this object.
bool empty() const
Returns true if the set is empty, false otherwise.
This represents a single source texture that is referenced by one or more egg files.
void note_egg_file(EggFile *egg_file)
Records that a particular egg file references this texture.
const PaletteGroups & get_groups() const
Once assign_groups() has been called, this returns the actual set of groups the TextureImage has been...
TexturePlacement * get_placement(PaletteGroup *group) const
Gets the TexturePlacement object which represents the assignment of this texture to the indicated gro...
This corresponds to a particular assignment of a TextureImage with a PaletteGroup,...
void remove_egg(TextureReference *reference)
Notes that a particular egg file is no longer using this particular TexturePlacement.
This is the particular reference of a texture filename by an egg file.
bool has_uvs() const
Returns true if this TextureReference actually uses the texture on geometry, with UV's and everything...
const std::string & get_tref_name() const
Returns the name of the EggTexture entry that references this texture.
bool is_equivalent(const TextureReference &other) const
Returns true if all essential properties of this TextureReference are the same as that of the other,...
void from_egg(EggFile *egg_file, EggData *data, EggTexture *egg_tex)
Sets up the TextureReference using information extracted from an egg file.
void rebind_egg_data(EggData *data, EggTexture *egg_tex)
After an EggData has previously been released via release_egg_data(), this can be called to indicate ...
void from_egg_quick(const TextureReference &other)
Sets up the pointers within the TextureReference to the same egg file pointers indicated by the other...
TypeHandle is the identifier used to differentiate C++ class types.
bool is_of_type(TypeHandle handle) const
Returns true if the current object is or derives from the indicated type.
Base class for objects that can be written to and read from Bam files.
virtual void fillin(DatagramIterator &scan, BamReader *manager)
This internal function is intended to be called by each class's make_from_bam() method to read in all...
virtual void write_datagram(BamWriter *manager, Datagram &dg)
Writes the contents of this object to the datagram for shipping out to a Bam file.
virtual int complete_pointers(TypedWritable **p_list, BamReader *manager)
Receives an array of pointers, one for each time manager->read_pointer() was called in fillin().
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
std::ostream & indent(std::ostream &out, int indent_level)
A handy function for doing text formatting.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.