Panda3D
txaFileFilter.cxx
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file txaFileFilter.cxx
10  * @author drose
11  * @date 2006-07-27
12  */
13 
14 #include "txaFileFilter.h"
15 #include "palettizer.h"
16 #include "txaFile.h"
17 #include "textureImage.h"
18 #include "sourceTextureImage.h"
19 #include "texturePool.h"
20 #include "dconfig.h"
21 #include "configVariableFilename.h"
22 #include "virtualFileSystem.h"
23 #include "config_putil.h"
24 
25 NotifyCategoryDeclNoExport(txafile);
26 NotifyCategoryDef(txafile, "");
27 
28 // A few lines to register this filter type with the TexturePool when the
29 // shared library is loaded.
30 Configure(config_txaFileFilter);
31 ConfigureFn(config_txaFileFilter) {
32  TxaFileFilter::init_type();
34  pool->register_filter(new TxaFileFilter);
35 }
36 
37 TypeHandle TxaFileFilter::_type_handle;
38 TxaFile *TxaFileFilter::_txa_file;
39 bool TxaFileFilter::_got_txa_file;
40 
41 /**
42  * This method is called after each texture has been loaded from disk, via the
43  * TexturePool, for the first time. By the time this method is called, the
44  * Texture has already been fully read from disk. This method should return
45  * the Texture pointer that the TexturePool should actually return (usually it
46  * is the same as the pointer supplied).
47  */
48 PT(Texture) TxaFileFilter::
49 post_load(Texture *tex) {
50  if (!_got_txa_file) {
51  read_txa_file();
52  }
53 
54  TextureImage tex_image;
55  std::string name = tex->get_filename().get_basename_wo_extension();
56  tex_image.set_name(name);
57 
58  SourceTextureImage *source = tex_image.get_source
59  (tex->get_fullpath(), tex->get_alpha_fullpath(), 0);
60  PNMImage pnm_image;
61  tex->store(pnm_image);
62  source->set_header(pnm_image);
63  tex_image.set_source_image(pnm_image);
64 
65  tex_image.pre_txa_file();
66 
67  bool matched = _txa_file->match_texture(&tex_image);
68  if (txafile_cat.is_debug()) {
69  if (!matched) {
70  txafile_cat.debug()
71  << "Not matched: " << name << "\n";
72  } else {
73  txafile_cat.debug()
74  << "Matched: " << name << "\n";
75  }
76  }
77 
78  tex_image.post_txa_file();
79 
80  PNMImage dest(tex_image.get_x_size(),
81  tex_image.get_y_size(),
82  tex_image.get_num_channels(),
83  pnm_image.get_maxval());
84  dest.quick_filter_from(pnm_image);
85 
86  tex->load(dest);
87 
88  // Create an EggTexture to pass back the requested alpha mode to the egg
89  // loader, if the texture is now being loaded from an egg file.
90  PT_EggTexture egg_tex = new EggTexture(tex->get_name(), tex->get_fullpath());
91  const TextureProperties &props = tex_image.get_properties();
92 
93  egg_tex->set_alpha_mode(tex_image.get_alpha_mode());
94  egg_tex->set_format(props._format);
95  egg_tex->set_minfilter(props._minfilter);
96  egg_tex->set_minfilter(props._magfilter);
97  egg_tex->set_anisotropic_degree(props._anisotropic_degree);
98 
99  tex->set_aux_data("egg", egg_tex);
100 
101  return tex;
102 }
103 
104 /**
105  * Reads the textures.txa file named by the variable txa-file. Called only
106  * once, at startup.
107  */
108 void TxaFileFilter::
109 read_txa_file() {
111 
112  // We need to create a global Palettizer object to hold some of the global
113  // properties that may be specified in a txa file.
114  if (pal == nullptr) {
115  pal = new Palettizer;
116  }
117 
118  _txa_file = new TxaFile;
119  _got_txa_file = true;
120 
121  ConfigVariableFilename txa_file
122  ("txa-file", Filename("textures.txa"),
123  PRC_DESC("Specify the name of the txa file to load when the txafile texture filter"
124  "is in effect."));
125 
126  Filename filename = txa_file;
127  vfs->resolve_filename(filename, get_model_path());
128 
129  if (!vfs->exists(filename)) {
130  txafile_cat.warning()
131  << "Filename " << filename << " not found.\n";
132  } else {
133  filename.set_text();
134  std::istream *ifile = vfs->open_read_file(filename, true);
135  if (ifile == nullptr) {
136  txafile_cat.warning()
137  << "Filename " << filename << " cannot be read.\n";
138  } else {
139  if (!_txa_file->read(*ifile, filename)) {
140  txafile_cat.warning()
141  << "Syntax errors in " << filename << "\n";
142  } else {
143  txafile_cat.info()
144  << "Read " << filename << "\n";
145  }
146  vfs->close_read_file(ifile);
147  }
148  }
149 }
Filename::set_text
void set_text()
Indicates that the filename represents a text file.
Definition: filename.I:424
texturePool.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
ImageFile::get_y_size
int get_y_size() const
Returns the size of the image file in pixels in the Y direction.
Definition: imageFile.cxx:92
TextureImage::get_source
SourceTextureImage * get_source(const Filename &filename, const Filename &alpha_filename, int alpha_file_channel)
Returns the SourceTextureImage corresponding to the given filename(s).
Definition: textureImage.cxx:519
config_putil.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
txaFile.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Texture::store
bool store(PNMImage &pnmimage) const
Saves the texture to the indicated PNMImage, but does not write it to disk.
Definition: texture.I:432
PT
PT(Texture) TxaFileFilter
This method is called after each texture has been loaded from disk, via the TexturePool,...
Definition: txaFileFilter.cxx:48
TxaFile::match_texture
bool match_texture(TextureImage *texture) const
Searches for a matching line in the .txa file for the given texture and applies its specifications.
Definition: txaFile.cxx:149
PNMImageHeader::get_maxval
get_maxval
Returns the maximum channel value allowable for any pixel in this image; for instance,...
Definition: pnmImageHeader.h:70
Texture::get_filename
get_filename
Returns the filename that has been set.
Definition: texture.h:312
TextureImage::pre_txa_file
void pre_txa_file()
Updates any internal state prior to reading the .txa file.
Definition: textureImage.cxx:265
Palettizer
This is the main engine behind egg-palettize.
Definition: palettizer.h:39
Texture::get_alpha_fullpath
get_alpha_fullpath
Returns the alpha_fullpath that has been set.
Definition: texture.h:330
TxaFile
This represents the .txa file (usually textures.txa) that contains the user instructions for resizing...
Definition: txaFile.h:30
Texture
Represents a texture object, which is typically a single 2-d image but may also represent a 1-d or 3-...
Definition: texture.h:71
ImageFile::get_num_channels
int get_num_channels() const
Returns the number of channels of the image.
Definition: imageFile.cxx:111
textureImage.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
VirtualFileSystem::exists
bool exists(const Filename &filename) const
Convenience function; returns true if the named file exists.
Definition: virtualFileSystem.I:18
TxaFileFilter
This is an abstract base class, a placeholder for any number of different classes that may wish to im...
Definition: txaFileFilter.h:41
SourceTextureImage::set_header
void set_header(const PNMImageHeader &header)
Sets the header information associated with this image, as if it were loaded from the disk.
Definition: sourceTextureImage.cxx:127
Texture::load
bool load(const PNMImage &pnmimage, const LoaderOptions &options=LoaderOptions())
Replaces the texture with the indicated image.
Definition: texture.I:357
PNMImage
The name of this class derives from the fact that we originally implemented it as a layer on top of t...
Definition: pnmImage.h:58
TexturePool
This is the preferred interface for loading textures from image files.
Definition: texturePool.h:37
PNMImage::quick_filter_from
void quick_filter_from(const PNMImage &copy, int xborder=0, int yborder=0)
Resizes from the given image, with a fixed radius of 0.5.
Definition: pnm-image-filter.cxx:754
SourceTextureImage
This is a texture image reference as it appears in an egg file: the source image of the texture.
Definition: sourceTextureImage.h:28
TextureImage::post_txa_file
void post_txa_file()
Once the .txa file has been read and the TextureImage matched against it, considers applying the requ...
Definition: textureImage.cxx:289
TexturePool::register_filter
void register_filter(TexturePoolFilter *filter)
Records a TexturePoolFilter object that may operate on texture images as they are loaded from disk.
Definition: texturePool.cxx:70
TypeHandle
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
VirtualFileSystem
A hierarchy of directories and files that appears to be one continuous file system,...
Definition: virtualFileSystem.h:40
Texture::set_aux_data
set_aux_data
Records an arbitrary object in the Texture, associated with a specified key.
Definition: texture.h:544
palettizer.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
ImageFile::get_properties
const TextureProperties & get_properties() const
Returns the grouping properties of the image.
Definition: imageFile.cxx:119
TxaFile::read
bool read(std::istream &in, const std::string &filename)
Reads the indicated stream, and returns true if successful, or false if there is an error.
Definition: txaFile.cxx:37
TextureImage::set_source_image
void set_source_image(const PNMImage &image)
Accepts the indicated source image as if it had been read from disk.
Definition: textureImage.cxx:742
TexturePool::get_global_ptr
static TexturePool * get_global_ptr()
Initializes and/or returns the global pointer to the one TexturePool object in the system.
Definition: texturePool.cxx:146
sourceTextureImage.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
ConfigVariableFilename
This is a convenience class to specialize ConfigVariable as a Filename type.
Definition: configVariableFilename.h:27
TextureProperties
This is the set of characteristics of a texture that, if different from another texture,...
Definition: textureProperties.h:30
dconfig.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
VirtualFileSystem::get_global_ptr
static VirtualFileSystem * get_global_ptr()
Returns the default global VirtualFileSystem.
Definition: virtualFileSystem.cxx:742
virtualFileSystem.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
VirtualFileSystem::close_read_file
static void close_read_file(std::istream *stream)
Closes a file opened by a previous call to open_read_file().
Definition: virtualFileSystem.cxx:867
EggTexture
Defines a texture map that may be applied to geometry.
Definition: eggTexture.h:30
ImageFile::get_x_size
int get_x_size() const
Returns the size of the image file in pixels in the X direction.
Definition: imageFile.cxx:82
VirtualFileSystem::resolve_filename
bool resolve_filename(Filename &filename, const DSearchPath &searchpath, const std::string &default_extension=std::string()) const
Searches the given search path for the filename.
Definition: virtualFileSystem.cxx:641
VirtualFileSystem::open_read_file
std::istream * open_read_file(const Filename &filename, bool auto_unwrap) const
Convenience function; returns a newly allocated istream if the file exists and can be read,...
Definition: virtualFileSystem.cxx:847
configVariableFilename.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
txaFileFilter.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Texture::get_fullpath
get_fullpath
Returns the fullpath that has been set.
Definition: texture.h:324
TextureImage::get_alpha_mode
EggRenderMode::AlphaMode get_alpha_mode() const
Returns the alpha mode that should be used to render objects with this texture, as specified by the u...
Definition: textureImage.cxx:490
TextureImage
This represents a single source texture that is referenced by one or more egg files.
Definition: textureImage.h:46
Filename
The name of a file, such as a texture file or an Egg file.
Definition: filename.h:39