From 174bdd8807726dbb3be0440cfbb4631b897adacd Mon Sep 17 00:00:00 2001 From: David Rose Date: Wed, 22 Nov 2000 02:51:04 +0000 Subject: [PATCH] *** empty log message *** --- dtool/pptempl/Template.models.pp | 8 +- panda/src/egg2sg/Sources.pp | 2 +- panda/src/egg2sg/config_egg2sg.cxx | 53 +++--- panda/src/egg2sg/config_egg2sg.h | 47 ++--- panda/src/egg2sg/eggLoader.cxx | 10 + panda/src/gobj/Sources.pp | 8 +- panda/src/gobj/config_gobj.h | 4 +- panda/src/gobj/imageBuffer.I | 61 ++++++ panda/src/gobj/imageBuffer.cxx | 19 +- panda/src/gobj/imageBuffer.h | 12 +- panda/src/gobj/pixelBuffer.cxx | 1 + panda/src/gobj/texture.cxx | 16 +- panda/src/putil/Sources.pp | 3 +- panda/src/putil/bam.h | 5 +- pandatool/src/bam/eggToBam.cxx | 16 ++ pandatool/src/bam/eggToBam.h | 2 + pandatool/src/egg-palettize/attribFile.cxx | 178 ++++++++++++++---- pandatool/src/egg-palettize/attribFile.h | 6 +- pandatool/src/egg-palettize/sourceEgg.cxx | 5 + pandatool/src/egg-palettize/textureEggRef.cxx | 4 +- pandatool/src/egg-palettize/textureEggRef.h | 2 +- pandatool/src/eggbase/eggMultiFilter.cxx | 8 +- 22 files changed, 363 insertions(+), 107 deletions(-) create mode 100644 panda/src/gobj/imageBuffer.I diff --git a/dtool/pptempl/Template.models.pp b/dtool/pptempl/Template.models.pp index 16811653b8..3fee7b3ec6 100644 --- a/dtool/pptempl/Template.models.pp +++ b/dtool/pptempl/Template.models.pp @@ -222,9 +222,9 @@ $[target] : $[sources] #define target $[pal_egg_dir]/$[egg] $[target] : $[source] $[pt] #if $[PHASE] - egg-palettize-new -C -dm $[install_dir]/%s/maps -g phase_$[PHASE] -gdir phase_$[PHASE] -P256,256 -2 -o $[target] $[texattrib_file] $[source] + egg-palettize-new $[PALETTIZE_OPTS] -C -dr $[install_dir] -dm $[install_dir]/%s/maps -g phase_$[PHASE] -gdir phase_$[PHASE] -P256,256 -2 -o $[target] $[texattrib_file] $[source] #else - egg-palettize-new -C -dm $[install_dir]/maps -P256,256 -2 -o $[target] $[texattrib_file] $[source] + egg-palettize-new $[PALETTIZE_OPTS] -C -dr $[install_dir] -dm $[install_dir]/maps -P256,256 -2 -o $[target] $[texattrib_file] $[source] #endif $[pt] : @@ -350,10 +350,10 @@ install-misc : $[subdirs:%=install-misc-%] install : egg $[subdirs:%=install-%] uninstall : $[subdirs:%=uninstall-%] -optimize-palettes : regen-palettes pal +optimize-palettes : regen-palettes install regen-palettes : - egg-palettize-new -C -fRt $[texattrib_file] + egg-palettize-new $[PALETTIZE_OPTS] -C -fRt $[texattrib_file] // Somehow, something in the cttools confuses some shells, so that // when we are attached, 'cd foo' doesn't work, but 'cd ./foo' does. diff --git a/panda/src/egg2sg/Sources.pp b/panda/src/egg2sg/Sources.pp index 5ea34451e9..e1fda2fb2a 100644 --- a/panda/src/egg2sg/Sources.pp +++ b/panda/src/egg2sg/Sources.pp @@ -15,7 +15,7 @@ load_egg_file.h loaderFileTypeEgg.cxx loaderFileTypeEgg.h #define INSTALL_HEADERS \ - load_egg_file.h + load_egg_file.h config_egg2sg.h #end lib_target diff --git a/panda/src/egg2sg/config_egg2sg.cxx b/panda/src/egg2sg/config_egg2sg.cxx index 7b4d8393d8..3537149610 100644 --- a/panda/src/egg2sg/config_egg2sg.cxx +++ b/panda/src/egg2sg/config_egg2sg.cxx @@ -13,31 +13,40 @@ ConfigureDef(config_egg2sg); NotifyCategoryDef(egg2sg, ""); -const bool egg_mesh = config_egg2sg.GetBool("egg-mesh", true); -const bool egg_retesselate_coplanar = config_egg2sg.GetBool("egg-retesselate-coplanar", true); -const bool egg_unroll_fans = config_egg2sg.GetBool("egg-unroll-fans", true); -const bool egg_show_tstrips = config_egg2sg.GetBool("egg-show-tstrips", false); -const bool egg_show_qsheets = config_egg2sg.GetBool("egg-show-qsheets", false); -const bool egg_show_quads = config_egg2sg.GetBool("egg-show-quads", false); -const bool egg_false_color = (egg_show_tstrips | egg_show_qsheets | egg_show_quads); -const bool egg_show_normals = config_egg2sg.GetBool("egg-show-normals", false); -const double egg_normal_scale = config_egg2sg.GetDouble("egg-normal-scale", 1.0); -const bool egg_subdivide_polys = config_egg2sg.GetBool("egg-subdivide-polys", true); -const bool egg_consider_fans = config_egg2sg.GetBool("egg-consider-fans", true); -const double egg_max_tfan_angle = config_egg2sg.GetDouble("egg-max-tfan-angle", 40.0); -const int egg_min_tfan_tris = config_egg2sg.GetInt("egg-min-tfan-tris", 4); -const double egg_coplanar_threshold = config_egg2sg.GetDouble("egg-coplanar-threshold", 0.01); -const bool egg_ignore_mipmaps = config_egg2sg.GetBool("egg-ignore-mipmaps", false); -const bool egg_ignore_filters = config_egg2sg.GetBool("egg-ignore-filters", false); -const bool egg_ignore_clamp = config_egg2sg.GetBool("egg-ignore-clamp", false); -const bool egg_always_decal_textures = config_egg2sg.GetBool("egg-always-decal-textures", false); -const bool egg_ignore_decals = config_egg2sg.GetBool("egg-ignore-decals", false); -const bool egg_flatten = config_egg2sg.GetBool("egg-flatten", true); +bool egg_mesh = config_egg2sg.GetBool("egg-mesh", true); +bool egg_retesselate_coplanar = config_egg2sg.GetBool("egg-retesselate-coplanar", true); +bool egg_unroll_fans = config_egg2sg.GetBool("egg-unroll-fans", true); +bool egg_show_tstrips = config_egg2sg.GetBool("egg-show-tstrips", false); +bool egg_show_qsheets = config_egg2sg.GetBool("egg-show-qsheets", false); +bool egg_show_quads = config_egg2sg.GetBool("egg-show-quads", false); +bool egg_false_color = (egg_show_tstrips | egg_show_qsheets | egg_show_quads); +bool egg_show_normals = config_egg2sg.GetBool("egg-show-normals", false); +double egg_normal_scale = config_egg2sg.GetDouble("egg-normal-scale", 1.0); +bool egg_subdivide_polys = config_egg2sg.GetBool("egg-subdivide-polys", true); +bool egg_consider_fans = config_egg2sg.GetBool("egg-consider-fans", true); +double egg_max_tfan_angle = config_egg2sg.GetDouble("egg-max-tfan-angle", 40.0); +int egg_min_tfan_tris = config_egg2sg.GetInt("egg-min-tfan-tris", 4); +double egg_coplanar_threshold = config_egg2sg.GetDouble("egg-coplanar-threshold", 0.01); +bool egg_ignore_mipmaps = config_egg2sg.GetBool("egg-ignore-mipmaps", false); +bool egg_ignore_filters = config_egg2sg.GetBool("egg-ignore-filters", false); +bool egg_ignore_clamp = config_egg2sg.GetBool("egg-ignore-clamp", false); +bool egg_always_decal_textures = config_egg2sg.GetBool("egg-always-decal-textures", false); +bool egg_ignore_decals = config_egg2sg.GetBool("egg-ignore-decals", false); +bool egg_flatten = config_egg2sg.GetBool("egg-flatten", true); // It is almost always a bad idea to set this true. -const bool egg_flatten_siblings = config_egg2sg.GetBool("egg-flatten-siblings", false); +bool egg_flatten_siblings = config_egg2sg.GetBool("egg-flatten-siblings", false); -const bool egg_show_collision_solids = config_egg2sg.GetBool("egg-show-collision-solids", false); +bool egg_show_collision_solids = config_egg2sg.GetBool("egg-show-collision-solids", false); + +// When this is true, keep texture pathnames exactly the same as they +// appeared in the egg file, in particular leaving them as relative +// paths, rather than letting them reflect the full path at which they +// were found. This is particularly useful when generating bam files. +// However, if the same texture is named by two different relative +// paths, these will still be collapsed into one texture (using one of +// the relative paths, chosen arbitrarily). +bool egg_keep_texture_pathnames = config_egg2sg.GetBool("egg-keep-texture-pathnames", false); CoordinateSystem egg_coordinate_system; diff --git a/panda/src/egg2sg/config_egg2sg.h b/panda/src/egg2sg/config_egg2sg.h index 751d74eff5..342e279dfe 100644 --- a/panda/src/egg2sg/config_egg2sg.h +++ b/panda/src/egg2sg/config_egg2sg.h @@ -16,29 +16,30 @@ ConfigureDecl(config_egg2sg, EXPCL_PANDAEGG, EXPTP_PANDAEGG); NotifyCategoryDecl(egg2sg, EXPCL_PANDAEGG, EXPTP_PANDAEGG); -extern const bool egg_mesh; -extern const bool egg_retesselate_coplanar; -extern const bool egg_unroll_fans; -extern const bool egg_show_tstrips; -extern const bool egg_show_qsheets; -extern const bool egg_show_quads; -extern const bool egg_false_color; -extern const bool egg_show_normals; -extern const double egg_normal_scale; -extern const bool egg_subdivide_polys; -extern const bool egg_consider_fans; -extern const double egg_max_tfan_angle; -extern const int egg_min_tfan_tris; -extern const double egg_coplanar_threshold; -extern CoordinateSystem egg_coordinate_system; -extern const bool egg_ignore_mipmaps; -extern const bool egg_ignore_filters; -extern const bool egg_ignore_clamp; -extern const bool egg_always_decal_textures; -extern const bool egg_ignore_decals; -extern const bool egg_flatten; -extern const bool egg_flatten_siblings; -extern const bool egg_show_collision_solids; +extern EXPCL_PANDAEGG bool egg_mesh; +extern EXPCL_PANDAEGG bool egg_retesselate_coplanar; +extern EXPCL_PANDAEGG bool egg_unroll_fans; +extern EXPCL_PANDAEGG bool egg_show_tstrips; +extern EXPCL_PANDAEGG bool egg_show_qsheets; +extern EXPCL_PANDAEGG bool egg_show_quads; +extern EXPCL_PANDAEGG bool egg_false_color; +extern EXPCL_PANDAEGG bool egg_show_normals; +extern EXPCL_PANDAEGG double egg_normal_scale; +extern EXPCL_PANDAEGG bool egg_subdivide_polys; +extern EXPCL_PANDAEGG bool egg_consider_fans; +extern EXPCL_PANDAEGG double egg_max_tfan_angle; +extern EXPCL_PANDAEGG int egg_min_tfan_tris; +extern EXPCL_PANDAEGG double egg_coplanar_threshold; +extern EXPCL_PANDAEGG CoordinateSystem egg_coordinate_system; +extern EXPCL_PANDAEGG bool egg_ignore_mipmaps; +extern EXPCL_PANDAEGG bool egg_ignore_filters; +extern EXPCL_PANDAEGG bool egg_ignore_clamp; +extern EXPCL_PANDAEGG bool egg_always_decal_textures; +extern EXPCL_PANDAEGG bool egg_ignore_decals; +extern EXPCL_PANDAEGG bool egg_flatten; +extern EXPCL_PANDAEGG bool egg_flatten_siblings; +extern EXPCL_PANDAEGG bool egg_show_collision_solids; +extern EXPCL_PANDAEGG bool egg_keep_texture_pathnames; diff --git a/panda/src/egg2sg/eggLoader.cxx b/panda/src/egg2sg/eggLoader.cxx index 80656e38ef..9c08fd5f79 100644 --- a/panda/src/egg2sg/eggLoader.cxx +++ b/panda/src/egg2sg/eggLoader.cxx @@ -515,6 +515,16 @@ load_texture(TextureDef &def, const EggTexture *egg_tex) { if (tex == (Texture *)NULL) { return false; } + + if (egg_keep_texture_pathnames) { + tex->set_name(egg_tex->get_filename()); + if (egg_tex->has_alpha_file()) { + tex->set_alpha_name(egg_tex->get_alpha_file()); + } else { + tex->clear_alpha_name(); + } + } + PT(TextureApplyTransition) apply = new TextureApplyTransition(TextureApplyProperty::M_modulate); diff --git a/panda/src/gobj/Sources.pp b/panda/src/gobj/Sources.pp index 945c7d379a..bda6cbeb99 100644 --- a/panda/src/gobj/Sources.pp +++ b/panda/src/gobj/Sources.pp @@ -12,7 +12,8 @@ geomPoint.cxx geomPoint.h geomPolygon.cxx geomPolygon.h \ geomQuad.cxx geomQuad.h geomSphere.cxx geomSphere.h geomSprite.I \ geomSprite.cxx geomSprite.h geomTri.cxx geomTri.h geomTrifan.cxx \ - geomTrifan.h geomTristrip.cxx geomTristrip.h imageBuffer.cxx \ + geomTrifan.h geomTristrip.cxx geomTristrip.h \ + imageBuffer.I imageBuffer.cxx \ imageBuffer.h material.I material.cxx material.h orthoProjection.I \ orthoProjection.cxx orthoProjection.h perspectiveProjection.I \ perspectiveProjection.cxx perspectiveProjection.h pixelBuffer.I \ @@ -21,10 +22,11 @@ texturePool.I texturePool.cxx texturePool.h #define INSTALL_HEADERS \ - LOD.I LOD.h drawable.h fog.I fog.h geom.I geom.h geomLine.h \ + LOD.I LOD.h config_gobj.h \ + drawable.h fog.I fog.h geom.I geom.h geomLine.h \ geomLinestrip.h geomPoint.h geomPolygon.h geomQuad.h geomSphere.h \ geomSprite.I geomSprite.h geomTri.h geomTrifan.h geomTristrip.h \ - geomprimitives.h imageBuffer.h material.I material.h \ + geomprimitives.h imageBuffer.I imageBuffer.h material.I material.h \ orthoProjection.I orthoProjection.h perspectiveProjection.I \ perspectiveProjection.h pixelBuffer.I pixelBuffer.h projection.h \ texture.I texture.h texturePool.I texturePool.h diff --git a/panda/src/gobj/config_gobj.h b/panda/src/gobj/config_gobj.h index fabae31ca1..d9eb9c5a92 100644 --- a/panda/src/gobj/config_gobj.h +++ b/panda/src/gobj/config_gobj.h @@ -12,14 +12,14 @@ NotifyCategoryDecl(gobj, EXPCL_PANDA, EXPTP_PANDA); // Configure variables for gobj package. -extern const int max_texture_dimension; +extern EXPCL_PANDA const int max_texture_dimension; enum BamTextureMode { BTM_fullpath, BTM_relative, BTM_basename }; -extern BamTextureMode bam_texture_mode; +extern EXPCL_PANDA BamTextureMode bam_texture_mode; #endif diff --git a/panda/src/gobj/imageBuffer.I b/panda/src/gobj/imageBuffer.I new file mode 100644 index 0000000000..1c183b6c04 --- /dev/null +++ b/panda/src/gobj/imageBuffer.I @@ -0,0 +1,61 @@ +// Filename: imageBuffer.I +// Created by: drose (21Nov00) +// +//////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////// +// Function: ImageBuffer::set_alpha_name +// Access: Public +// Description: Sets the name of the file that contains the image's +// alpha channel contents. Normally, this is set +// automatically when the image is loaded, for instance +// via Texture::read(). +// +// The ImageBuffer's get_name() function, by convention, +// returns the name of the image file that was loaded +// into the buffer. In the case where a texture +// specified two separate files to load, a 1- or +// 3-channel color image and a 1-channel alpha image, +// this string is update to contain the name of the +// image file that was loaded into the buffer's alpha +// channel. +//////////////////////////////////////////////////////////////////// +INLINE void ImageBuffer:: +set_alpha_name(const string &alpha_name) { + _alpha_name = alpha_name; +} + +//////////////////////////////////////////////////////////////////// +// Function: ImageBuffer::clear_alpha_name +// Access: Public +// Description: Removes the alpha filename, if it was previously set. +// See set_alpha_name(). +//////////////////////////////////////////////////////////////////// +INLINE void ImageBuffer:: +clear_alpha_name() { + _alpha_name = string(); +} + +//////////////////////////////////////////////////////////////////// +// Function: ImageBuffer::has_alpha_name +// Access: Public +// Description: Returns true if the alpha_name has been set and +// is available. See set_alpha_name(). +//////////////////////////////////////////////////////////////////// +INLINE bool ImageBuffer:: +has_alpha_name() const { + return !_alpha_name.empty(); +} + +//////////////////////////////////////////////////////////////////// +// Function: ImageBuffer::get_alpha_name +// Access: Public +// Description: Returns the alpha_name that has been set. Use +// this in conjunction with get_name() to get the names +// of the file(s) that were loaded into the buffer. See +// set_alpha_name(). +//////////////////////////////////////////////////////////////////// +INLINE const string &ImageBuffer:: +get_alpha_name() const { + return _alpha_name; +} diff --git a/panda/src/gobj/imageBuffer.cxx b/panda/src/gobj/imageBuffer.cxx index db8f68bd5c..91f57a507a 100644 --- a/panda/src/gobj/imageBuffer.cxx +++ b/panda/src/gobj/imageBuffer.cxx @@ -14,6 +14,7 @@ #include #include +#include //////////////////////////////////////////////////////////////////// // Static variables @@ -30,6 +31,7 @@ void ImageBuffer:: write_datagram(BamWriter *, Datagram &me) { Filename filename = get_name(); + Filename alpha_filename = get_alpha_name(); switch (bam_texture_mode) { case BTM_fullpath: @@ -42,10 +44,17 @@ write_datagram(BamWriter *, Datagram &me) gobj_cat.debug() << "Texture file " << get_name() << " found as " << filename << "\n"; } + alpha_filename.find_on_searchpath(get_texture_path()); + alpha_filename.find_on_searchpath(get_model_path()); + if (gobj_cat.is_debug()) { + gobj_cat.debug() + << "Alpha image " << get_alpha_name() << " found as " << alpha_filename << "\n"; + } break; case BTM_basename: filename = filename.get_basename(); + alpha_filename = alpha_filename.get_basename(); break; default: @@ -54,6 +63,7 @@ write_datagram(BamWriter *, Datagram &me) } me.add_string(filename); + me.add_string(alpha_filename); } //////////////////////////////////////////////////////////////////// @@ -65,7 +75,12 @@ write_datagram(BamWriter *, Datagram &me) // place //////////////////////////////////////////////////////////////////// void ImageBuffer:: -fillin(DatagramIterator& scan, BamReader*) -{ +fillin(DatagramIterator &scan, BamReader *manager) { set_name(scan.get_string()); + + if (manager->get_file_minor_ver() >= 3) { + set_alpha_name(scan.get_string()); + } else { + clear_alpha_name(); + } } diff --git a/panda/src/gobj/imageBuffer.h b/panda/src/gobj/imageBuffer.h index 1196523229..17593b579c 100644 --- a/panda/src/gobj/imageBuffer.h +++ b/panda/src/gobj/imageBuffer.h @@ -41,12 +41,20 @@ public: virtual void copy(GraphicsStateGuardianBase *, const DisplayRegion *)=0; virtual void copy(GraphicsStateGuardianBase *, const DisplayRegion *, - const RenderBuffer &rb)=0; + const RenderBuffer &rb)=0; virtual void draw(GraphicsStateGuardianBase *)=0; virtual void draw(GraphicsStateGuardianBase *, const DisplayRegion *)=0; virtual void draw(GraphicsStateGuardianBase *, const DisplayRegion *, const RenderBuffer &rb)=0; + INLINE void set_alpha_name(const string &alpha_name); + INLINE void clear_alpha_name(); + INLINE bool has_alpha_name() const; + INLINE const string &get_alpha_name() const; + +private: + string _alpha_name; + public: //Abstract class, so no factory methods for Reading and Writing virtual void write_datagram(BamWriter* manager, Datagram &me); @@ -76,6 +84,8 @@ private: static TypeHandle _type_handle; }; +#include "imageBuffer.I" + #endif diff --git a/panda/src/gobj/pixelBuffer.cxx b/panda/src/gobj/pixelBuffer.cxx index 25587868c7..35ac2e0a7f 100644 --- a/panda/src/gobj/pixelBuffer.cxx +++ b/panda/src/gobj/pixelBuffer.cxx @@ -40,6 +40,7 @@ bool PixelBuffer::read(const string& name) } set_name(name); + clear_alpha_name(); return load(pnmimage); } diff --git a/panda/src/gobj/texture.cxx b/panda/src/gobj/texture.cxx index 2785fdb524..c93016cd6f 100644 --- a/panda/src/gobj/texture.cxx +++ b/panda/src/gobj/texture.cxx @@ -82,6 +82,7 @@ bool Texture::read(const string& name) } set_name(name); + clear_alpha_name(); return load(pnmimage); } @@ -161,6 +162,7 @@ bool Texture::read(const string &name, const string &gray) { } set_name(name); + set_alpha_name(gray); return load(pnmimage); } @@ -425,7 +427,19 @@ make_Texture(const FactoryParams ¶ms) DatagramIterator scan(packet); string name = scan.get_string(); - PT(Texture) me = TexturePool::load_texture(name); + string alpha_name; + if (manager->get_file_minor_ver() >= 3) { + alpha_name = scan.get_string(); + } + + PT(Texture) me; + + if (alpha_name.empty()) { + me = TexturePool::load_texture(name); + } else { + me = TexturePool::load_texture(name, alpha_name); + } + if (me == (Texture *)NULL) { // Oops, we couldn't load the texture; we'll just return NULL. // But we do need a dummy texture to read in and ignore all of the diff --git a/panda/src/putil/Sources.pp b/panda/src/putil/Sources.pp index 342e0ba484..80b3e55bd7 100644 --- a/panda/src/putil/Sources.pp +++ b/panda/src/putil/Sources.pp @@ -5,7 +5,8 @@ #define TARGET putil #define SOURCES \ - bamReader.I bamReader.N bamReader.cxx bamReader.h bamReaderParam.I \ + bam.h bamReader.I bamReader.N bamReader.cxx \ + bamReader.h bamReaderParam.I \ bamReaderParam.cxx bamReaderParam.h bamWriter.I bamWriter.cxx \ bamWriter.h bitMask.I bitMask.cxx bitMask.h buttonEvent.I \ buttonEvent.cxx buttonEvent.h buttonHandle.I buttonHandle.cxx \ diff --git a/panda/src/putil/bam.h b/panda/src/putil/bam.h index d0e0ce6268..c7c63c662e 100644 --- a/panda/src/putil/bam.h +++ b/panda/src/putil/bam.h @@ -9,15 +9,18 @@ #ifndef _BAM_H #define _BAM_H +#include + //The magic number for a BAM file and a carriage return and newline //for detecting files damaged due to ASCII/Binary conversion static const string _bam_header = string("pbj\0\n\r", 6); static const unsigned short _bam_major_ver = 2; // Bumped to major version 2 on 7/6/00 due to major changes in Character. -static const unsigned short _bam_minor_ver = 2; +static const unsigned short _bam_minor_ver = 3; // Bumped to minor version 1 on 7/19/00 to quantize channel files. // Bumped to minor version 2 on 8/21/00 for CollisionNode::_collide_geom. +// Bumped to minor version 3 on 11/21/00 for dual-image textures. #endif diff --git a/pandatool/src/bam/eggToBam.cxx b/pandatool/src/bam/eggToBam.cxx index e965ad0242..f4354ea126 100644 --- a/pandatool/src/bam/eggToBam.cxx +++ b/pandatool/src/bam/eggToBam.cxx @@ -8,6 +8,8 @@ #include #include #include +#include +#include //////////////////////////////////////////////////////////////////// // Function: EggToBam::Constructor @@ -28,6 +30,13 @@ EggToBam() : "option may also be repeated to add multiple paths.", &EggToBam::dispatch_search_path, NULL, &get_texture_path()); + add_option + ("kp", "", 0, + "Keep the texture paths exactly as they are specified in the egg file, " + "as relative paths, rather than storing them as full paths or as " + "whatever is specified by the bam-texture-mode Configrc variable.", + &EggToBam::dispatch_none, &_keep_paths); + redescribe_option ("cs", "Specify the coordinate system of the resulting " + _format_name + @@ -43,6 +52,13 @@ EggToBam() : //////////////////////////////////////////////////////////////////// void EggToBam:: run() { + if (_keep_paths) { + // If the user specified -kp, we need to set a couple of Configrc + // variables directly to achieve this. + egg_keep_texture_pathnames = true; + bam_texture_mode = BTM_fullpath; + } + if (!_got_coordinate_system) { // If the user didn't specify otherwise, ensure the coordinate // system is Z-up. diff --git a/pandatool/src/bam/eggToBam.h b/pandatool/src/bam/eggToBam.h index 60954a12a9..788b212492 100644 --- a/pandatool/src/bam/eggToBam.h +++ b/pandatool/src/bam/eggToBam.h @@ -19,6 +19,8 @@ public: EggToBam(); void run(); + + bool _keep_paths; }; #endif diff --git a/pandatool/src/egg-palettize/attribFile.cxx b/pandatool/src/egg-palettize/attribFile.cxx index adacc4f112..cdbc9a0a43 100644 --- a/pandatool/src/egg-palettize/attribFile.cxx +++ b/pandatool/src/egg-palettize/attribFile.cxx @@ -30,6 +30,11 @@ #include #endif +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::Constructor +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// AttribFile:: AttribFile(const Filename &filename) { _name = filename.get_basename_wo_extension(); @@ -61,11 +66,24 @@ AttribFile(const Filename &filename) { _alpha_type = (PNMFileType *)NULL; } +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::get_name +// Access: Public +// Description: Returns the name of the AttribFile. This is derived +// from, but is not equivalent to, the filename. +//////////////////////////////////////////////////////////////////// string AttribFile:: get_name() const { return _name; } +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::open_and_lock +// Access: Public +// Description: Opens the .txa file and simultaneously locks it (if +// lock is true) for exclusive read/write access. +// Returns true if successful, false on failure. +//////////////////////////////////////////////////////////////////// bool AttribFile:: open_and_lock(bool lock) { if (!_txa_filename.exists()) { @@ -135,6 +153,12 @@ open_and_lock(bool lock) { return true; } +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::close_and_unlock +// Access: Public +// Description: Simultaneously closes the .txa file and releases the +// lock. +//////////////////////////////////////////////////////////////////// bool AttribFile:: close_and_unlock() { // Closing the fstream will close the fd, and thus release all the @@ -145,45 +169,71 @@ close_and_unlock() { return true; } +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::rewind_and_truncate +// Access: Public +// Description: Rewinds the .txa file to the beginning and truncates +// it in preparation for rewriting it, without releasing +// the lock. +//////////////////////////////////////////////////////////////////// +bool AttribFile:: +rewind_and_truncate() { +#ifdef WIN32_VC + // In Windows, since we're not implementing file locking right now, + // we might as well just close and reopen the file. Which is good + // since I don't know how to truncate an already-opened file in + // Windows. + _txa_fstrm.close(); + _txa_filename.unlink(); + _txa_filename.open_read_write(_txa_fstrm); +#else + // In Unix, we need to keep the file open so we don't lose the lock, + // so we just rewind and then explicitly truncate the file with a + // system call. + _txa_fstrm.clear(); + _txa_fstrm.seekp(0, ios::beg); + ftruncate(_txa_fd, 0); +#endif + return true; +} + +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::read +// Access: Public +// Description: Reads the .txa and .pi files. +//////////////////////////////////////////////////////////////////// bool AttribFile:: read(bool force_redo_all) { bool okflag = true; okflag = read_txa(_txa_fstrm); - { - if (!_pi_filename.exists()) { - nout << "Palette information file " << _pi_filename << " does not exist.\n"; - } else { - ifstream infile; - if (!_pi_filename.open_read(infile)) { - nout << "Palette information file " << _pi_filename << " exists, but cannot be read.\n"; - return false; - } - - okflag = read_pi(infile, force_redo_all); + if (!_pi_filename.exists()) { + nout << "Palette information file " << _pi_filename << " does not exist.\n"; + } else { + ifstream infile; + if (!_pi_filename.open_read(infile)) { + nout << "Palette information file " << _pi_filename << " exists, but cannot be read.\n"; + return false; } + + okflag = read_pi(infile, force_redo_all); } return okflag; } +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::write +// Access: Public +// Description: Rewrites the .txa and .pi files, if necessary. +//////////////////////////////////////////////////////////////////// bool AttribFile:: write() { bool okflag = true; if (_txa_needs_rewrite) { - // Rewind and truncate the file for writing. -#ifdef WIN32_VC - _txa_fstrm.close(); - _txa_filename.unlink(); - _txa_filename.open_read_write(_txa_fstrm); -#else - _txa_fstrm.clear(); - _txa_fstrm.seekp(0, ios::beg); - ftruncate(_txa_fd, 0); -#endif - + rewind_and_truncate(); okflag = write_txa(_txa_fstrm) && okflag; _txa_fstrm << flush; } @@ -243,6 +293,13 @@ write_egg_filename(Filename filename) const { return filename; } +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::update_params +// Access: Public +// Description: Reads the program parameters from the command line +// (if they were specified), overriding whatever was +// read from the .pi file. +//////////////////////////////////////////////////////////////////// void AttribFile:: update_params(EggPalettize *prog) { if (prog->_got_map_dirname) { @@ -384,9 +441,14 @@ get_size_requests() { } } -// Update the unused flags on all textures to accurately reflect -// those that are unused by any egg files. Omit unused textures -// from the palettizing set. + +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::update_texture_flags +// Access: Public +// Description: Update the unused flags on all textures to accurately +// reflect those that are unused by any egg files. Omit +// unused textures from the palettizing set. +//////////////////////////////////////////////////////////////////// void AttribFile:: update_texture_flags() { // First, clear all the flags. @@ -418,9 +480,14 @@ update_texture_flags() { } } -// Clear out all the old packing order and start again from the top. -// This should get as nearly optimal a packing as this poor little -// algorithm can manage. + +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::repack_all_textures +// Access: Public +// Description: Clear out all the old packing order and start again +// from the top. This should get as nearly optimal a +// packing as this poor little algorithm can manage. +//////////////////////////////////////////////////////////////////// void AttribFile:: repack_all_textures() { // First, empty all the existing palette groups. @@ -447,10 +514,15 @@ repack_all_textures() { _optimal = true; } -// Add new textures into the palettes without disturbing whatever was -// already there. This won't generate an optimal palette, but it -// won't require rebuilding every egg file that already uses this -// palette. + +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::repack_some_textures +// Access: Public +// Description: Add new textures into the palettes without disturbing +// whatever was already there. This won't generate an +// optimal palette, but it won't require rebuilding +// every egg file that already uses this palette. +//////////////////////////////////////////////////////////////////// void AttribFile:: repack_some_textures() { bool empty_before = _groups.empty(); @@ -473,6 +545,11 @@ repack_some_textures() { _optimal = (empty_before || !any_added); } +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::optimal_resize +// Access: Public +// Description: Resizes each palette texture as small as it can be. +//////////////////////////////////////////////////////////////////// void AttribFile:: optimal_resize() { Groups::iterator gi; @@ -481,6 +558,12 @@ optimal_resize() { } } +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::finalize_palettes +// Access: Public +// Description: Sets up some final state on each palette, necessary +// before writing them out. +//////////////////////////////////////////////////////////////////// void AttribFile:: finalize_palettes() { Groups::iterator gi; @@ -489,6 +572,14 @@ finalize_palettes() { } } +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::remove_unused_lines +// Access: Public +// Description: Removes any lines from the .txa file that weren't +// used by any texture, presumably in response to -k on +// the command line and in preparation for rewriting the +// .txa file. +//////////////////////////////////////////////////////////////////// void AttribFile:: remove_unused_lines() { UserLines::iterator read, write; @@ -541,11 +632,15 @@ prepare_repack(bool force_optimal) { return needs_repack; } - -// Updates the timestamp on each egg file that will need to be -// rebuilt, so that a future make process will pick it up. This is -// only necessary to update egg files that may not have been included -// on the command line, and which we don't have direct access to. +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::touch_dirty_egg_files +// Access: Public +// Description: Updates the timestamp on each egg file that will need +// to be rebuilt, so that a future make process will +// pick it up. This is only necessary to update egg +// files that may not have been included on the command +// line, and which we don't have direct access to. +//////////////////////////////////////////////////////////////////// void AttribFile:: touch_dirty_egg_files(bool force_redo_all, bool eggs_include_images) { @@ -564,7 +659,14 @@ touch_dirty_egg_files(bool force_redo_all, } } - +//////////////////////////////////////////////////////////////////// +// Function: AttribFile::get_texture +// Access: Public +// Description: Returns a pointer to the particular texture with the +// indicated name. If the named PTexture does not exist +// in the AttribFile structure, creates one and returns +// it. +//////////////////////////////////////////////////////////////////// PTexture *AttribFile:: get_texture(const string &name) { PTextures::iterator ti; diff --git a/pandatool/src/egg-palettize/attribFile.h b/pandatool/src/egg-palettize/attribFile.h index b3023d4d01..5db174c0bb 100644 --- a/pandatool/src/egg-palettize/attribFile.h +++ b/pandatool/src/egg-palettize/attribFile.h @@ -26,7 +26,10 @@ class PNMFileType; //////////////////////////////////////////////////////////////////// // Class : AttribFile -// Description : +// Description : The primary driving object behind egg-palettize, this +// class represents both a .txa file and its associated +// .pi file, as well as containing pointers to all the +// textures, palettes, and egg files referenced. //////////////////////////////////////////////////////////////////// class AttribFile { public: @@ -36,6 +39,7 @@ public: bool open_and_lock(bool lock); bool close_and_unlock(); + bool rewind_and_truncate(); bool read(bool force_redo_all); bool write(); diff --git a/pandatool/src/egg-palettize/sourceEgg.cxx b/pandatool/src/egg-palettize/sourceEgg.cxx index 768cb06793..058e47e63f 100644 --- a/pandatool/src/egg-palettize/sourceEgg.cxx +++ b/pandatool/src/egg-palettize/sourceEgg.cxx @@ -302,6 +302,11 @@ update_trefs() { Palette *palette = packing->get_palette(); eggtex->set_filename(_attrib_file->write_egg_filename(palette->get_filename())); + if (palette->has_alpha_filename()) { + eggtex->set_alpha_file(_attrib_file->write_egg_filename(palette->get_alpha_filename())); + } else { + eggtex->clear_alpha_file(); + } // Set the texture attributes to be uniform across all palettes. eggtex->set_minfilter(EggTexture::FT_mipmap_trilinear); diff --git a/pandatool/src/egg-palettize/textureEggRef.cxx b/pandatool/src/egg-palettize/textureEggRef.cxx index 77ac9f39f3..5b3547b916 100644 --- a/pandatool/src/egg-palettize/textureEggRef.cxx +++ b/pandatool/src/egg-palettize/textureEggRef.cxx @@ -63,7 +63,7 @@ require_groups(PaletteGroup *preferred, const PaletteGroups &groups) { // For now, we arbitrarily pick the preferred group. Later, maybe // we'll try to be smart about this and do some kind of graph - // minimization to choose the group the leads to the least redundant - // packing. + // minimization to choose the group that leads to the least + // redundant packing. _packing = _texture->add_to_group(preferred); } diff --git a/pandatool/src/egg-palettize/textureEggRef.h b/pandatool/src/egg-palettize/textureEggRef.h index 1c13df8550..eb0738ca32 100644 --- a/pandatool/src/egg-palettize/textureEggRef.h +++ b/pandatool/src/egg-palettize/textureEggRef.h @@ -20,7 +20,7 @@ class EggTexture; //////////////////////////////////////////////////////////////////// // Class : TextureEggRef // Description : This associates a texture with the egg files it is -// placed on, and also associated an egg file with the +// placed on, and also associates an egg file with the // various textures it contains. //////////////////////////////////////////////////////////////////// class TextureEggRef { diff --git a/pandatool/src/eggbase/eggMultiFilter.cxx b/pandatool/src/eggbase/eggMultiFilter.cxx index 06f26354c7..663ea4e3aa 100644 --- a/pandatool/src/eggbase/eggMultiFilter.cxx +++ b/pandatool/src/eggbase/eggMultiFilter.cxx @@ -38,10 +38,10 @@ EggMultiFilter(bool allow_empty) : _allow_empty(allow_empty) { add_option ("inplace", "", 50, - "If this option is given, the input files will be rewritten in place with " - "the results. This obviates the need to specify -d for an output " - "directory; however, it's risky because the original input " - "files are lost.", + "If this option is given, the input egg files will be rewritten in " + "place with the results. This obviates the need to specify -d " + "for an output directory; however, it's risky because the original " + "input egg files are lost.", &EggMultiFilter::dispatch_none, &_inplace); }