31 EggTextureCards() :
EggWriter(true, true) {
32 set_program_brief(
"generate an .egg file containing texture cards");
33 set_program_description
34 (
"egg-texture-cards generates an egg file consisting of several " 35 "square polygons, one for each texture name that appears on the " 38 "This is a handy thing to have for importing texture images through " 39 "egg-palettize, even when those textures do not appear on any real " 40 "geometry; it can also be used for creating a lot of simple polygons " 41 "for rendering click buttons and similar interfaces.");
44 add_runline(
"[opts] texture [texture ...] output.egg");
45 add_runline(
"[opts] -o output.egg texture [texture ...]");
46 add_runline(
"[opts] texture [texture ...] >output.egg");
49 (
"g",
"left,right,bottom,top", 0,
50 "Specifies the geometry of each polygon. The default is a unit polygon " 51 "centered on the origin: -0.5,0.5,-0.5,0.5. Polygons are always created " 52 "on the X-Y plane. If -p is not also specified, all polygons will be " 53 "the same size and shape.",
54 &EggTextureCards::dispatch_double_quad,
nullptr, &_polygon_geometry[0]);
57 (
"p",
"xpixels,ypixels", 0,
58 "Indicates that polygons should be sized in proportion to the pixel " 59 "size of the texture image. This will potentially create a " 60 "different size and shape polygon for each texture. The coordinate " 61 "pair represents the image size in " 62 "pixels that will exactly fill up the polygon described with -g (or the " 63 "default polygon if -g is not specified); smaller images will be " 64 "given proportionately smaller polygons, and larger images will be " 65 "given proportionately larger polygons.",
66 &EggTextureCards::dispatch_double_pair, &_got_pixel_scale, &_pixel_scale[0]);
69 (
"suffix",
"string", 0,
70 "Normally, each polygon is given a name based on the basename of its " 71 "corresponding texture's filename (without the filename extension). " 72 "This option specifies an ignorable suffix in the texture filename(s); " 73 "if this suffix is present, it is not included in the polygon's name. " 74 "This option may be repeated multiple times.",
75 &EggTextureCards::dispatch_vector_string,
nullptr, &_suffixes);
79 "Specifies the color of each polygon. The default is white: 1,1,1,1.",
80 &EggTextureCards::dispatch_color,
nullptr, &_polygon_color[0]);
84 "Indicates the wrap mode of the texture: \"repeat\", \"clamp\", " 85 "or any of the other modes supported by egg syntax. " 86 "The default is to leave this unspecified.",
87 &EggTextureCards::dispatch_wrap_mode,
nullptr, &_wrap_mode);
91 "Indicates the wrap mode of the texture in the U direction. This " 92 "overrides -wm, if specified.",
93 &EggTextureCards::dispatch_wrap_mode,
nullptr, &_wrap_u);
97 "Indicates the wrap mode of the texture in the V direction. This " 98 "overrides -wm, if specified.",
99 &EggTextureCards::dispatch_wrap_mode,
nullptr, &_wrap_v);
102 (
"minf",
"filter", 0,
103 "Indicates the minfilter mode of the texture: \"linear\", \"mipmap\", " 104 "or any of the other modes supported by egg syntax. " 105 "The default is to leave this unspecified.",
106 &EggTextureCards::dispatch_filter_type,
nullptr, &_minfilter);
109 (
"magf",
"filter", 0,
110 "Indicates the magfilter mode of the texture: \"linear\" or \"nearest\". " 111 "The default is to leave this unspecified.",
112 &EggTextureCards::dispatch_filter_type,
nullptr, &_magfilter);
115 (
"aniso",
"degree", 0,
116 "Indicates the anisotropic degree of the texture. " 117 "The default is to leave this unspecified.",
118 &EggTextureCards::dispatch_int, &_got_aniso_degree, &_aniso_degree);
121 (
"ql",
"[default | fastest | normal | best]", 0,
122 "Specifies the quality level of the texture. This mainly affects " 123 "the tinydisplay software renderer.",
124 &EggTextureCards::dispatch_quality_level,
nullptr, &_quality_level);
128 "Indicates the format for all textures: typical choices are \"rgba12\" " 129 "or \"rgb5\" or \"alpha\". The default is to leave this unspecified.",
130 &EggTextureCards::dispatch_format,
nullptr, &_format);
134 "Indicates the format for one-channel textures only. If specified, this " 135 "overrides the format specified by -f.",
136 &EggTextureCards::dispatch_format,
nullptr, &_format_1);
140 "Indicates the format for two-channel textures only. If specified, this " 141 "overrides the format specified by -f.",
142 &EggTextureCards::dispatch_format,
nullptr, &_format_2);
146 "Indicates the format for three-channel textures only. If specified, this " 147 "overrides the format specified by -f.",
148 &EggTextureCards::dispatch_format,
nullptr, &_format_3);
152 "Indicates the format for four-channel textures only. If specified, this " 153 "overrides the format specified by -f.",
154 &EggTextureCards::dispatch_format,
nullptr, &_format_4);
158 "Make the textured polygons backfaced (two-sided).",
159 &EggTextureCards::dispatch_none, &_apply_bface);
162 (
"fps",
"frame-rate", 0,
163 "Normally, all of the texture cards are created as a series of nodes " 164 "beneath a SequenceNode. This allows all of the cards to be viewed, " 165 "one at a time, if the output file is loaded in pview. It also has the " 166 "nice side-effect of creating an automatic texture flip that can be " 167 "used directly by applications; use this parameter to specify the " 168 "frame rate of that texture flip.",
169 &EggTextureCards::dispatch_double,
nullptr, &_frame_rate);
173 "Don't treat it as an error if the input file references pathnames " 174 "(e.g. textures) that don't exist. Normally, this will be flagged as " 175 "an error and the command aborted; with this option, an egg file will " 176 "be generated anyway, referencing pathnames that do not exist.",
177 &EggTextureCards::dispatch_none, &_noexist);
179 _polygon_geometry.set(-0.5, 0.5, -0.5, 0.5);
180 _polygon_color.set(1.0, 1.0, 1.0, 1.0);
181 _wrap_mode = EggTexture::WM_unspecified;
182 _wrap_u = EggTexture::WM_unspecified;
183 _wrap_v = EggTexture::WM_unspecified;
184 _minfilter = EggTexture::FT_unspecified;
185 _magfilter = EggTexture::FT_unspecified;
187 _quality_level = EggTexture::QL_unspecified;
188 _format = EggTexture::F_unspecified;
189 _format_1 = EggTexture::F_unspecified;
190 _format_2 = EggTexture::F_unspecified;
191 _format_3 = EggTexture::F_unspecified;
192 _format_4 = EggTexture::F_unspecified;
201 bool EggTextureCards::
203 if (!check_last_arg(args, 0)) {
208 nout <<
"No texture names specified on the command line.\n";
212 ProgramBase::Args::iterator ai;
213 for (ai = args.begin(); ai != args.end(); ++ai) {
225 bool EggTextureCards::
226 dispatch_wrap_mode(
const string &opt,
const string &arg,
void *var) {
227 EggTexture::WrapMode *wmp = (EggTexture::WrapMode *)var;
230 if (*wmp == EggTexture::WM_unspecified) {
233 *wmp = EggTexture::WM_repeat;
234 }
else if (arg ==
"c") {
235 *wmp = EggTexture::WM_clamp;
237 nout <<
"Invalid wrap mode parameter for -" << opt <<
": " 251 bool EggTextureCards::
252 dispatch_filter_type(
const string &opt,
const string &arg,
void *var) {
253 EggTexture::FilterType *ftp = (EggTexture::FilterType *)var;
256 if (*ftp == EggTexture::FT_unspecified) {
258 nout <<
"Invalid filter type parameter for -" << opt <<
": " 271 bool EggTextureCards::
272 dispatch_quality_level(
const string &opt,
const string &arg,
void *var) {
273 EggTexture::QualityLevel *qlp = (EggTexture::QualityLevel *)var;
276 if (*qlp == EggTexture::QL_unspecified) {
277 nout <<
"Invalid quality level parameter for -" << opt <<
": " 290 bool EggTextureCards::
291 dispatch_format(
const string &opt,
const string &arg,
void *var) {
292 EggTexture::Format *fp = (EggTexture::Format *)var;
295 if (*fp == EggTexture::F_unspecified) {
296 nout <<
"Invalid format parameter for -" << opt <<
": " 312 bool EggTextureCards::
313 scan_texture(
const Filename &filename, LVecBase4d &geometry,
317 nout <<
"Unable to read image " << filename <<
"\n";
323 double xscale = header.
get_x_size() / _pixel_scale[0];
324 double yscale = header.
get_y_size() / _pixel_scale[1];
326 geometry.set(_polygon_geometry[0] * xscale,
327 _polygon_geometry[1] * xscale,
328 _polygon_geometry[2] * yscale,
329 _polygon_geometry[3] * yscale);
337 void EggTextureCards::
338 make_vertices(
const LPoint4d &geometry,
EggVertexPool *vpool,
343 (LPoint3d(geometry[0], geometry[3], 0.0));
345 (LPoint3d(geometry[0], geometry[2], 0.0));
347 (LPoint3d(geometry[1], geometry[2], 0.0));
349 (LPoint3d(geometry[1], geometry[3], 0.0));
351 v1->
set_uv(LTexCoordd(0.0, 1.0));
352 v2->
set_uv(LTexCoordd(0.0, 0.0));
353 v3->
set_uv(LTexCoordd(1.0, 0.0));
354 v4->
set_uv(LTexCoordd(1.0, 1.0));
360 void EggTextureCards::
367 _data->add_child(group);
372 if (_texture_names.size() > 1) {
373 group->set_switch_flag(
true);
374 group->set_switch_fps(_frame_rate);
382 if (!_got_pixel_scale) {
385 make_vertices(_polygon_geometry, vpool, v1, v2, v3, v4);
390 vector_string::const_iterator ti;
391 for (ti = _texture_names.begin(); ti != _texture_names.end(); ++ti) {
396 vector_string::const_iterator si;
397 for (si = _suffixes.begin(); si != _suffixes.end(); ++si) {
398 const string &suffix = (*si);
399 int prefix = (int)name.length() - (int)suffix.length();
400 if (prefix > 0 && name.substr(prefix) == suffix) {
401 name = name.substr(0, prefix);
408 bool texture_ok = scan_texture(filename, geometry, num_channels);
413 if (_got_pixel_scale) {
415 make_vertices(geometry, vpool, v1, v2, v3, v4);
417 make_vertices(_polygon_geometry, vpool, v1, v2, v3, v4);
422 tref->set_wrap_mode(_wrap_mode);
423 tref->set_wrap_u(_wrap_u);
424 tref->set_wrap_v(_wrap_v);
425 tref->set_minfilter(_minfilter);
426 tref->set_magfilter(_magfilter);
427 if (_got_aniso_degree) {
430 tref->set_quality_level(_quality_level);
433 switch (num_channels) {
435 tref->set_format(_format_1);
439 tref->set_format(_format_2);
443 tref->set_format(_format_3);
447 tref->set_format(_format_4);
452 if (tref->get_format() == EggTexture::F_unspecified) {
453 tref->set_format(_format);
465 poly->set_color(_polygon_color);
477 if (all_ok || _noexist) {
480 nout <<
"Some textures not found; not generating egg file.\n";
486 int main(
int argc,
char *argv[]) {
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
virtual void parse_command_line(int argc, char **argv)
Dispatches on each of the options on the command line, and passes the remaining parameters to handle_...
Defines a texture map that may be applied to geometry.
std::string get_basename_wo_extension() const
Returns the basename part of the filename, without the file extension.
void set_texture(EggTexture *texture)
Replaces the current list of textures with the indicated texture.
set_bface_flag
Sets the backfacing flag of the polygon.
static QualityLevel string_quality_level(const std::string &string)
Returns the TexGen value associated with the given string representation, or ET_unspecified if the st...
static WrapMode string_wrap_mode(const std::string &string)
Returns the WrapMode value associated with the given string representation, or WM_unspecified if the ...
set_anisotropic_degree
Sets the degree of anisotropic filtering for this texture.
EggVertex * make_new_vertex()
Allocates and returns a new vertex from the pool.
The main glue of the egg hierarchy, this corresponds to the <Group>, <Instance>, and <Joint> type nod...
The name of a file, such as a texture file or an Egg file.
Any one-, two-, three-, or four-component vertex, possibly with attributes such as a normal.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
static Format string_format(const std::string &string)
Returns the Format value associated with the given string representation, or F_unspecified if the str...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void write_egg_file()
Writes out the egg file as the normal result of the program.
EggNode * add_child(EggNode *node)
Adds the indicated child to the group and returns it.
Generates an egg file featuring a number of polygons, one for each named texture.
This is the base class for a program that generates an egg file output, but doesn't read any for inpu...
static FilterType string_filter_type(const std::string &string)
Returns the FilterType value associated with the given string representation, or FT_unspecified if th...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void set_uv(const LTexCoordd &texCoord)
Replaces the unnamed UV coordinate pair on the vertex with the indicated value.
A collection of vertices.
EggVertex * add_vertex(EggVertex *vertex)
Adds the indicated vertex to the end of the primitive's list of vertices, and returns it.
static Filename from_os_specific(const std::string &os_specific, Type type=T_general)
This named constructor returns a Panda-style filename (that is, using forward slashes,...