mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 16:58:40 -04:00
*** empty log message ***
This commit is contained in:
parent
289095dfe2
commit
6f70e0a28f
@ -7,6 +7,8 @@
|
|||||||
#include "textureImage.h"
|
#include "textureImage.h"
|
||||||
#include "paletteGroup.h"
|
#include "paletteGroup.h"
|
||||||
#include "texturePlacement.h"
|
#include "texturePlacement.h"
|
||||||
|
#include "textureReference.h"
|
||||||
|
#include "sourceTextureImage.h"
|
||||||
#include "palettizer.h"
|
#include "palettizer.h"
|
||||||
#include "filenameUnifier.h"
|
#include "filenameUnifier.h"
|
||||||
|
|
||||||
@ -242,8 +244,9 @@ is_stale() const {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: EggFile::build_cross_links
|
// Function: EggFile::build_cross_links
|
||||||
// Access: Public
|
// Access: Public
|
||||||
// Description: Calls TextureImage::note_egg_file() for each texture
|
// Description: Calls TextureImage::note_egg_file() and
|
||||||
// the egg file references, and
|
// SourceTextureImage::increment_egg_count() for each
|
||||||
|
// texture the egg file references, and
|
||||||
// PaletteGroup::increment_egg_count() for each palette
|
// PaletteGroup::increment_egg_count() for each palette
|
||||||
// group it wants. This sets up some of the back
|
// group it wants. This sets up some of the back
|
||||||
// references to support determining an ideal texture
|
// references to support determining an ideal texture
|
||||||
@ -265,6 +268,12 @@ build_cross_links() {
|
|||||||
Textures::const_iterator ti;
|
Textures::const_iterator ti;
|
||||||
for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
|
for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
|
||||||
(*ti)->get_texture()->note_egg_file(this);
|
(*ti)->get_texture()->note_egg_file(this);
|
||||||
|
|
||||||
|
// Actually, this may count the same egg file multiple times for a
|
||||||
|
// particular SourceTextureImage, since a given texture may be
|
||||||
|
// reference multiples times within an egg file. No harm done,
|
||||||
|
// however.
|
||||||
|
(*ti)->get_source()->increment_egg_count();
|
||||||
}
|
}
|
||||||
|
|
||||||
PaletteGroups::const_iterator gi;
|
PaletteGroups::const_iterator gi;
|
||||||
|
@ -358,14 +358,30 @@ run() {
|
|||||||
okflag = false;
|
okflag = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!state_file.open_write(state_filename) ||
|
// Make up a temporary filename to write the state file to, then
|
||||||
|
// move the state file into place. We do this in case the user
|
||||||
|
// interrupts us (or we core dump) before we're done; that way we
|
||||||
|
// won't leave the state file incompletely written.
|
||||||
|
string dirname = state_filename.get_dirname();
|
||||||
|
if (dirname.empty()) {
|
||||||
|
dirname = ".";
|
||||||
|
}
|
||||||
|
char *name = tempnam(dirname.c_str(), "pi");
|
||||||
|
Filename temp_filename(name);
|
||||||
|
|
||||||
|
if (!state_file.open_write(temp_filename) ||
|
||||||
!state_file.write_object(pal)) {
|
!state_file.write_object(pal)) {
|
||||||
nout << "Unable to write palettization information to " << state_filename
|
nout << "Unable to write palettization information to " << temp_filename
|
||||||
<< "\n";
|
<< "\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
state_file.close();
|
state_file.close();
|
||||||
|
if (!temp_filename.rename_to(state_filename)) {
|
||||||
|
nout << "Unable to rename temporary file " << temp_filename << " to "
|
||||||
|
<< state_filename << "\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (!okflag) {
|
if (!okflag) {
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -218,6 +218,13 @@ process_command_line_eggs(bool force_texture_read) {
|
|||||||
egg_file->post_txa_file();
|
egg_file->post_txa_file();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Now that all of our egg files are read in, build in all the cross
|
||||||
|
// links and back pointers and stuff.
|
||||||
|
EggFiles::const_iterator efi;
|
||||||
|
for (efi = _egg_files.begin(); efi != _egg_files.end(); ++efi) {
|
||||||
|
(*efi).second->build_cross_links();
|
||||||
|
}
|
||||||
|
|
||||||
// Now match each of the textures mentioned in those egg files
|
// Now match each of the textures mentioned in those egg files
|
||||||
// against a line in the .txa file.
|
// against a line in the .txa file.
|
||||||
CommandLineTextures::iterator ti;
|
CommandLineTextures::iterator ti;
|
||||||
@ -235,13 +242,6 @@ process_command_line_eggs(bool force_texture_read) {
|
|||||||
texture->post_txa_file();
|
texture->post_txa_file();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now that all of our data is read in, build in all the cross links
|
|
||||||
// and back pointers and stuff.
|
|
||||||
EggFiles::const_iterator efi;
|
|
||||||
for (efi = _egg_files.begin(); efi != _egg_files.end(); ++efi) {
|
|
||||||
(*efi).second->build_cross_links();
|
|
||||||
}
|
|
||||||
|
|
||||||
// And now, assign each of the current set of textures to an
|
// And now, assign each of the current set of textures to an
|
||||||
// appropriate group or groups.
|
// appropriate group or groups.
|
||||||
for (ti = _command_line_textures.begin();
|
for (ti = _command_line_textures.begin();
|
||||||
@ -310,6 +310,12 @@ process_all(bool force_texture_read) {
|
|||||||
egg_file->post_txa_file();
|
egg_file->post_txa_file();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Now that all of our egg files are read in, build in all the cross
|
||||||
|
// links and back pointers and stuff.
|
||||||
|
for (efi = _egg_files.begin(); efi != _egg_files.end(); ++efi) {
|
||||||
|
(*efi).second->build_cross_links();
|
||||||
|
}
|
||||||
|
|
||||||
// Now match each of the textures in the world against a line in the
|
// Now match each of the textures in the world against a line in the
|
||||||
// .txa file.
|
// .txa file.
|
||||||
Textures::iterator ti;
|
Textures::iterator ti;
|
||||||
@ -325,12 +331,6 @@ process_all(bool force_texture_read) {
|
|||||||
texture->post_txa_file();
|
texture->post_txa_file();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now that all of our data is read in, build in all the cross links
|
|
||||||
// and back pointers and stuff.
|
|
||||||
for (efi = _egg_files.begin(); efi != _egg_files.end(); ++efi) {
|
|
||||||
(*efi).second->build_cross_links();
|
|
||||||
}
|
|
||||||
|
|
||||||
// And now, assign each texture to an appropriate group or groups.
|
// And now, assign each texture to an appropriate group or groups.
|
||||||
for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
|
for (ti = _textures.begin(); ti != _textures.end(); ++ti) {
|
||||||
TextureImage *texture = (*ti).second;
|
TextureImage *texture = (*ti).second;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "sourceTextureImage.h"
|
#include "sourceTextureImage.h"
|
||||||
#include "textureImage.h"
|
#include "textureImage.h"
|
||||||
|
#include "filenameUnifier.h"
|
||||||
|
|
||||||
#include <pnmImageHeader.h>
|
#include <pnmImageHeader.h>
|
||||||
#include <datagram.h>
|
#include <datagram.h>
|
||||||
@ -24,6 +25,7 @@ SourceTextureImage::
|
|||||||
SourceTextureImage() {
|
SourceTextureImage() {
|
||||||
_texture = (TextureImage *)NULL;
|
_texture = (TextureImage *)NULL;
|
||||||
|
|
||||||
|
_egg_count = 0;
|
||||||
_read_header = false;
|
_read_header = false;
|
||||||
_successfully_read_header = false;
|
_successfully_read_header = false;
|
||||||
}
|
}
|
||||||
@ -40,6 +42,7 @@ SourceTextureImage(TextureImage *texture, const Filename &filename,
|
|||||||
{
|
{
|
||||||
_filename = filename;
|
_filename = filename;
|
||||||
_alpha_filename = alpha_filename;
|
_alpha_filename = alpha_filename;
|
||||||
|
_egg_count = 0;
|
||||||
_read_header = false;
|
_read_header = false;
|
||||||
_successfully_read_header = false;
|
_successfully_read_header = false;
|
||||||
}
|
}
|
||||||
@ -55,6 +58,28 @@ get_texture() const {
|
|||||||
return _texture;
|
return _texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: SourceTextureImage::increment_egg_count
|
||||||
|
// Access: Public
|
||||||
|
// Description: Increments by one the number of egg files that are
|
||||||
|
// known to reference this SourceTextureImage.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void SourceTextureImage::
|
||||||
|
increment_egg_count() {
|
||||||
|
_egg_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: SourceTextureImage::get_egg_count
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the number of egg files that share this
|
||||||
|
// SourceTextureImage.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
int SourceTextureImage::
|
||||||
|
get_egg_count() const {
|
||||||
|
return _egg_count;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: SourceTextureImage::get_size
|
// Function: SourceTextureImage::get_size
|
||||||
// Access: Public
|
// Access: Public
|
||||||
@ -105,7 +130,7 @@ read_header() {
|
|||||||
_properties._got_num_channels = true;
|
_properties._got_num_channels = true;
|
||||||
_properties._num_channels = header.get_num_channels();
|
_properties._num_channels = header.get_num_channels();
|
||||||
|
|
||||||
if (!_alpha_filename.empty()) {
|
if (!_alpha_filename.empty() && _alpha_filename.exists()) {
|
||||||
// Assume if we have an alpha filename, that we have an additional
|
// Assume if we have an alpha filename, that we have an additional
|
||||||
// alpha channel.
|
// alpha channel.
|
||||||
if (_properties._num_channels == 1 || _properties._num_channels == 3) {
|
if (_properties._num_channels == 1 || _properties._num_channels == 3) {
|
||||||
@ -144,6 +169,9 @@ write_datagram(BamWriter *writer, Datagram &datagram) {
|
|||||||
ImageFile::write_datagram(writer, datagram);
|
ImageFile::write_datagram(writer, datagram);
|
||||||
writer->write_pointer(datagram, _texture);
|
writer->write_pointer(datagram, _texture);
|
||||||
|
|
||||||
|
// We don't store _egg_count; instead, we count these up again each
|
||||||
|
// session.
|
||||||
|
|
||||||
// We don't store _read_header or _successfully_read_header in the
|
// We don't store _read_header or _successfully_read_header in the
|
||||||
// Bam file; these are transitory and we need to reread the image
|
// Bam file; these are transitory and we need to reread the image
|
||||||
// header for each session (in case the image files change between
|
// header for each session (in case the image files change between
|
||||||
@ -175,7 +203,7 @@ complete_pointers(vector_typedWriteable &plist, BamReader *manager) {
|
|||||||
// allocate and return a new object with all the data
|
// allocate and return a new object with all the data
|
||||||
// read.
|
// read.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
TypedWriteable* SourceTextureImage::
|
TypedWriteable *SourceTextureImage::
|
||||||
make_SourceTextureImage(const FactoryParams ¶ms) {
|
make_SourceTextureImage(const FactoryParams ¶ms) {
|
||||||
SourceTextureImage *me = new SourceTextureImage;
|
SourceTextureImage *me = new SourceTextureImage;
|
||||||
BamReader *manager;
|
BamReader *manager;
|
||||||
|
@ -26,14 +26,18 @@ public:
|
|||||||
const Filename &alpha_filename);
|
const Filename &alpha_filename);
|
||||||
|
|
||||||
TextureImage *get_texture() const;
|
TextureImage *get_texture() const;
|
||||||
|
|
||||||
|
void increment_egg_count();
|
||||||
|
int get_egg_count() const;
|
||||||
|
|
||||||
bool get_size();
|
bool get_size();
|
||||||
bool read_header();
|
bool read_header();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
TextureImage *_texture;
|
||||||
|
int _egg_count;
|
||||||
bool _read_header;
|
bool _read_header;
|
||||||
bool _successfully_read_header;
|
bool _successfully_read_header;
|
||||||
TextureImage *_texture;
|
|
||||||
|
|
||||||
// The TypedWriteable interface follows.
|
// The TypedWriteable interface follows.
|
||||||
public:
|
public:
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "eggFile.h"
|
#include "eggFile.h"
|
||||||
#include "paletteGroup.h"
|
#include "paletteGroup.h"
|
||||||
#include "texturePlacement.h"
|
#include "texturePlacement.h"
|
||||||
|
#include "filenameUnifier.h"
|
||||||
|
|
||||||
#include <indent.h>
|
#include <indent.h>
|
||||||
#include <datagram.h>
|
#include <datagram.h>
|
||||||
@ -377,7 +378,6 @@ is_surprise() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: TextureImage::get_source
|
// Function: TextureImage::get_source
|
||||||
// Access: Public
|
// Access: Public
|
||||||
@ -389,7 +389,8 @@ is_surprise() const {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
SourceTextureImage *TextureImage::
|
SourceTextureImage *TextureImage::
|
||||||
get_source(const Filename &filename, const Filename &alpha_filename) {
|
get_source(const Filename &filename, const Filename &alpha_filename) {
|
||||||
string key = filename.get_fullpath() + ":" + alpha_filename.get_fullpath();
|
string key = get_source_key(filename, alpha_filename);
|
||||||
|
|
||||||
Sources::iterator si;
|
Sources::iterator si;
|
||||||
si = _sources.find(key);
|
si = _sources.find(key);
|
||||||
if (si != _sources.end()) {
|
if (si != _sources.end()) {
|
||||||
@ -423,13 +424,65 @@ get_preferred_source() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Now examine all of the various source images available to us and
|
// Now examine all of the various source images available to us and
|
||||||
// pick the most suitable.
|
// pick the most suitable. We base this on the following criteria:
|
||||||
|
|
||||||
// **** For now, we arbitrarily pick the first one.
|
// (1) A suitable source image must be referenced by at least one
|
||||||
if (!_sources.empty()) {
|
// egg file, unless no source images are referenced by any egg file.
|
||||||
_preferred_source = (*_sources.begin()).second;
|
|
||||||
|
// (2) A larger source image is preferable to a smaller one.
|
||||||
|
|
||||||
|
// (3) Given two source images of the same size, the more recent one
|
||||||
|
// is preferable.
|
||||||
|
|
||||||
|
// Are any source images referenced by an egg file?
|
||||||
|
|
||||||
|
bool any_referenced = false;
|
||||||
|
Sources::iterator si;
|
||||||
|
for (si = _sources.begin(); si != _sources.end() && !any_referenced; ++si) {
|
||||||
|
SourceTextureImage *source = (*si).second;
|
||||||
|
if (source->get_egg_count() > 0) {
|
||||||
|
any_referenced = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SourceTextureImage *best = (SourceTextureImage *)NULL;
|
||||||
|
int best_size;
|
||||||
|
|
||||||
|
for (si = _sources.begin(); si != _sources.end() && !any_referenced; ++si) {
|
||||||
|
SourceTextureImage *source = (*si).second;
|
||||||
|
|
||||||
|
if (source->get_egg_count() > 0 || !any_referenced) {
|
||||||
|
// Rule (1) passes.
|
||||||
|
|
||||||
|
if (source->exists() && source->get_size()) {
|
||||||
|
int source_size = source->get_x_size() * source->get_y_size();
|
||||||
|
if (best == (SourceTextureImage *)NULL) {
|
||||||
|
best = source;
|
||||||
|
best_size = source_size;
|
||||||
|
|
||||||
|
} else if (source_size > best_size) {
|
||||||
|
// Rule (2) passes.
|
||||||
|
best = source;
|
||||||
|
best_size = source_size;
|
||||||
|
|
||||||
|
} else if (source_size == best_size &&
|
||||||
|
source->get_filename().compare_timestamps(best->get_filename()) > 0) {
|
||||||
|
// Rule (3) passes.
|
||||||
|
best = source;
|
||||||
|
best_size = source_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (best == (SourceTextureImage *)NULL && !_sources.empty()) {
|
||||||
|
// If we didn't pick any that pass, it must be that all of them
|
||||||
|
// are unreadable. In this case, it really doesn't matter which
|
||||||
|
// one we pick.
|
||||||
|
best = (*_sources.begin()).second;
|
||||||
|
}
|
||||||
|
|
||||||
|
_preferred_source = best;
|
||||||
return _preferred_source;
|
return _preferred_source;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -880,6 +933,20 @@ copy_new_dests(const TextureImage::Dests &a, const TextureImage::Dests &b) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: TextureImage::get_source_key
|
||||||
|
// Access: Private
|
||||||
|
// Description: Returns the key that a SourceTextureImage should be
|
||||||
|
// stored in, given its one or two filenames.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
string TextureImage::
|
||||||
|
get_source_key(const Filename &filename, const Filename &alpha_filename) {
|
||||||
|
Filename f = FilenameUnifier::make_bam_filename(filename);
|
||||||
|
Filename a = FilenameUnifier::make_bam_filename(alpha_filename);
|
||||||
|
|
||||||
|
return f.get_fullpath() + ":" + a.get_fullpath();
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: TextureImage::register_with_read_factory
|
// Function: TextureImage::register_with_read_factory
|
||||||
// Access: Public, Static
|
// Access: Public, Static
|
||||||
@ -976,18 +1043,20 @@ complete_pointers(vector_typedWriteable &plist, BamReader *manager) {
|
|||||||
for (i = 0; i < _num_sources; i++) {
|
for (i = 0; i < _num_sources; i++) {
|
||||||
SourceTextureImage *source;
|
SourceTextureImage *source;
|
||||||
DCAST_INTO_R(source, plist[index], index);
|
DCAST_INTO_R(source, plist[index], index);
|
||||||
string key = source->get_filename().get_fullpath() + ":" +
|
string key = get_source_key(source->get_filename(),
|
||||||
source->get_alpha_filename().get_fullpath();
|
source->get_alpha_filename());
|
||||||
|
|
||||||
_sources.insert(Sources::value_type(key, source));
|
bool inserted = _sources.insert(Sources::value_type(key, source)).second;
|
||||||
index++;
|
index++;
|
||||||
|
nassertr(inserted, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < _num_dests; i++) {
|
for (i = 0; i < _num_dests; i++) {
|
||||||
DestTextureImage *dest;
|
DestTextureImage *dest;
|
||||||
DCAST_INTO_R(dest, plist[index], index);
|
DCAST_INTO_R(dest, plist[index], index);
|
||||||
_dests.insert(Dests::value_type(dest->get_filename(), dest));
|
bool inserted = _dests.insert(Dests::value_type(dest->get_filename(), dest)).second;
|
||||||
index++;
|
index++;
|
||||||
|
nassertr(inserted, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
return index;
|
return index;
|
||||||
@ -1001,7 +1070,7 @@ complete_pointers(vector_typedWriteable &plist, BamReader *manager) {
|
|||||||
// allocate and return a new object with all the data
|
// allocate and return a new object with all the data
|
||||||
// read.
|
// read.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
TypedWriteable* TextureImage::
|
TypedWriteable *TextureImage::
|
||||||
make_TextureImage(const FactoryParams ¶ms) {
|
make_TextureImage(const FactoryParams ¶ms) {
|
||||||
TextureImage *me = new TextureImage;
|
TextureImage *me = new TextureImage;
|
||||||
BamReader *manager;
|
BamReader *manager;
|
||||||
|
@ -87,6 +87,9 @@ private:
|
|||||||
void remove_old_dests(const Dests &a, const Dests &b);
|
void remove_old_dests(const Dests &a, const Dests &b);
|
||||||
void copy_new_dests(const Dests &a, const Dests &b);
|
void copy_new_dests(const Dests &a, const Dests &b);
|
||||||
|
|
||||||
|
string get_source_key(const Filename &filename,
|
||||||
|
const Filename &alpha_filename);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TextureRequest _request;
|
TextureRequest _request;
|
||||||
TextureProperties _pre_txa_properties;
|
TextureProperties _pre_txa_properties;
|
||||||
|
@ -322,7 +322,7 @@ match_texture(TextureImage *texture) const {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ST_scale:
|
case ST_scale:
|
||||||
if (source->get_size()) {
|
if (source != (SourceTextureImage *)NULL && source->get_size()) {
|
||||||
request._got_size = true;
|
request._got_size = true;
|
||||||
request._x_size = (int)(source->get_x_size() * _scale / 100.0);
|
request._x_size = (int)(source->get_x_size() * _scale / 100.0);
|
||||||
request._y_size = (int)(source->get_y_size() * _scale / 100.0);
|
request._y_size = (int)(source->get_y_size() * _scale / 100.0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user