diff --git a/panda/src/putil/string_utils.cxx b/panda/src/putil/string_utils.cxx index a6db3ebd3f..ccf98f6fac 100644 --- a/panda/src/putil/string_utils.cxx +++ b/panda/src/putil/string_utils.cxx @@ -242,3 +242,17 @@ string_to_double(const string &str, double &result) { result = string_to_double(str, tail); return tail.empty(); } + +//////////////////////////////////////////////////////////////////// +// Function: string_to_float +// Description: Another flavor of string_to_float(), this one +// returns true if the string is a perfectly valid +// number (and sets result to that value), or false +// otherwise. +//////////////////////////////////////////////////////////////////// +bool +string_to_float(const string &str, float &result) { + string tail; + result = string_to_double(str, tail); + return tail.empty(); +} diff --git a/panda/src/putil/string_utils.h b/panda/src/putil/string_utils.h index c763f3378b..ce149ce351 100644 --- a/panda/src/putil/string_utils.h +++ b/panda/src/putil/string_utils.h @@ -40,6 +40,7 @@ EXPCL_PANDA int string_to_int(const string &str, string &tail); EXPCL_PANDA bool string_to_int(const string &str, int &result); EXPCL_PANDA double string_to_double(const string &str, string &tail); EXPCL_PANDA bool string_to_double(const string &str, double &result); +EXPCL_PANDA bool string_to_float(const string &str, float &result); // Convenience function to make a string from anything that has an // ostream operator. diff --git a/pandatool/src/egg-mkfont/eggMakeFont.h b/pandatool/src/egg-mkfont/eggMakeFont.h index 1842019331..24eb19c67d 100644 --- a/pandatool/src/egg-mkfont/eggMakeFont.h +++ b/pandatool/src/egg-mkfont/eggMakeFont.h @@ -60,7 +60,7 @@ private: Filename _output_image_filename; Filename _input_font_filename; bool _got_output_size; - Colord _fg, _bg; + Colorf _fg, _bg; bool _use_alpha; int _output_xsize, _output_ysize, _output_zsize; double _buffer_pixels; diff --git a/pandatool/src/eggprogs/eggTextureCards.cxx b/pandatool/src/eggprogs/eggTextureCards.cxx new file mode 100644 index 0000000000..e8efd4710d --- /dev/null +++ b/pandatool/src/eggprogs/eggTextureCards.cxx @@ -0,0 +1,149 @@ +// Filename: eggTextureCards.cxx +// Created by: drose (21Feb01) +// +//////////////////////////////////////////////////////////////////// + +#include "eggTextureCards.h" + +#include +#include +#include +#include +#include + +//////////////////////////////////////////////////////////////////// +// Function: EggTextureCards::Constructor +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +EggTextureCards:: +EggTextureCards() : EggWriter(true, true) { + set_program_description + ("egg-texture-cards generates an egg file consisting of several " + "square polygons, one for each texture name that appears on the " + "command line.\n\n" + + "This is a handy thing to have for importing texture images through " + "egg-palettize, even when those textures do not appear on any real " + "geometry; it can also be used for creating a lot of simple polygons " + "for rendering click buttons and similar interfaces."); + + clear_runlines(); + add_runline("[opts] texture [texture ...] output.egg"); + add_runline("[opts] -o output.egg texture [texture ...]"); + add_runline("[opts] texture [texture ...] >output.egg"); + + add_option + ("g", "left,right,bottom,top", 0, + "Specifies the geometry of each polygon. The default is a unit polygon " + "centered on the origin: -0.5,0.5,-0.5,0.5. Polygons are always created " + "on the X-Y plane.", + &EggTextureCards::dispatch_double_quad, NULL, &_polygon_geometry[0]); + + add_option + ("c", "r,g,b[,a]", 0, + "Specifies the color of each polygon. The default is white: 1,1,1,1.", + &EggTextureCards::dispatch_color, NULL, &_polygon_color[0]); + + _polygon_geometry.set(-0.5, 0.5, -0.5, 0.5); + _polygon_color.set(1.0, 1.0, 1.0, 1.0); +} + +//////////////////////////////////////////////////////////////////// +// Function: EggTextureCards::handle_args +// Access: Protected, Virtual +// Description: Does something with the additional arguments on the +// command line (after all the -options have been +// parsed). Returns true if the arguments are good, +// false otherwise. +//////////////////////////////////////////////////////////////////// +bool EggTextureCards:: +handle_args(ProgramBase::Args &args) { + if (!check_last_arg(args)) { + return false; + } + + if (args.empty()) { + nout << "No texture names specified on the command line.\n"; + return false; + } + + _texture_names.insert(_texture_names.end(), args.begin(), args.end()); + + return true; +} + +//////////////////////////////////////////////////////////////////// +// Function: EggTextureCards::run +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +void EggTextureCards:: +run() { + // First, create an enclosing group and a vertex pool with four + // vertices. We can use the same four vertices on all polygons. + + EggGroup *group = new EggGroup(); + _data.add_child(group); + EggVertexPool *vpool = new EggVertexPool("vpool"); + group->add_child(vpool); + + // + // 1 4 + // + // + // 2 3 + // + + EggVertex *v1 = vpool->make_new_vertex + (LPoint3d(_polygon_geometry[0], _polygon_geometry[3], 0.0)); + EggVertex *v2 = vpool->make_new_vertex + (LPoint3d(_polygon_geometry[0], _polygon_geometry[2], 0.0)); + EggVertex *v3 = vpool->make_new_vertex + (LPoint3d(_polygon_geometry[1], _polygon_geometry[2], 0.0)); + EggVertex *v4 = vpool->make_new_vertex + (LPoint3d(_polygon_geometry[1], _polygon_geometry[3], 0.0)); + + v1->set_uv(TexCoordd(0.0, 1.0)); + v2->set_uv(TexCoordd(0.0, 0.0)); + v3->set_uv(TexCoordd(1.0, 0.0)); + v4->set_uv(TexCoordd(1.0, 1.0)); + + // Now, create a texture reference and a polygon for each texture. + // We don't really care whether the texture files actually exist at + // this point yet. + + vector_string::const_iterator ti; + for (ti = _texture_names.begin(); ti != _texture_names.end(); ++ti) { + Filename filename = (*ti); + string name = filename.get_basename_wo_extension(); + + EggTexture *tref = new EggTexture(name, filename); + group->add_child(tref); + + // Each polygon gets placed in its own sub-group. This will make + // pulling them out by name at runtime possible. + EggGroup *sub_group = new EggGroup(name); + group->add_child(sub_group); + EggPolygon *poly = new EggPolygon(); + sub_group->add_child(poly); + poly->set_texture(tref); + poly->set_color(_polygon_color); + + poly->add_vertex(v1); + poly->add_vertex(v2); + poly->add_vertex(v3); + poly->add_vertex(v4); + } + + // Done! + _data.write_egg(get_output()); +} + + +int main(int argc, char *argv[]) { + EggTextureCards prog; + prog.parse_command_line(argc, argv); + prog.run(); + return 0; +} diff --git a/pandatool/src/eggprogs/eggTextureCards.h b/pandatool/src/eggprogs/eggTextureCards.h new file mode 100644 index 0000000000..4d81dca774 --- /dev/null +++ b/pandatool/src/eggprogs/eggTextureCards.h @@ -0,0 +1,36 @@ +// Filename: eggTextureCards.h +// Created by: drose (21Feb01) +// +//////////////////////////////////////////////////////////////////// + +#ifndef EGGTEXTURECARDS_H +#define EGGTEXTURECARDS_H + +#include + +#include +#include + +//////////////////////////////////////////////////////////////////// +// Class : EggTextureCards +// Description : Generates an egg file featuring a number of polygons, +// one for each named texture. This is a support +// program for getting textures through egg-palettize. +//////////////////////////////////////////////////////////////////// +class EggTextureCards : public EggWriter { +public: + EggTextureCards(); + +protected: + virtual bool handle_args(Args &args); + +public: + void run(); + + LVecBase4d _polygon_geometry; + Colorf _polygon_color; + vector_string _texture_names; +}; + +#endif + diff --git a/pandatool/src/progbase/programBase.cxx b/pandatool/src/progbase/programBase.cxx index ac8bb911ea..54db94ef64 100644 --- a/pandatool/src/progbase/programBase.cxx +++ b/pandatool/src/progbase/programBase.cxx @@ -707,12 +707,12 @@ dispatch_double_quad(const string &opt, const string &arg, void *var) { // Access: Protected, Static // Description: Standard dispatch function for an option that takes a // color, either as r,g,b or as r,g,b,a. The data -// pointer is to an array of four doubles, e.g. a -// Colord. +// pointer is to an array of four floats, e.g. a +// Colorf. //////////////////////////////////////////////////////////////////// bool ProgramBase:: dispatch_color(const string &opt, const string &arg, void *var) { - double *ip = (double *)var; + float *ip = (float *)var; vector_string words; tokenize(arg, words, ","); @@ -720,16 +720,16 @@ dispatch_color(const string &opt, const string &arg, void *var) { bool okflag = false; if (words.size() == 4) { okflag = - string_to_double(words[0], ip[0]) && - string_to_double(words[1], ip[1]) && - string_to_double(words[2], ip[2]) && - string_to_double(words[3], ip[3]); + string_to_float(words[0], ip[0]) && + string_to_float(words[1], ip[1]) && + string_to_float(words[2], ip[2]) && + string_to_float(words[3], ip[3]); } else if (words.size() == 3) { okflag = - string_to_double(words[0], ip[0]) && - string_to_double(words[1], ip[1]) && - string_to_double(words[2], ip[2]); + string_to_float(words[0], ip[0]) && + string_to_float(words[1], ip[1]) && + string_to_float(words[2], ip[2]); ip[3] = 1.0; }