Panda3D
Loading...
Searching...
No Matches
eggWriter.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 eggWriter.cxx
10 * @author drose
11 * @date 2000-02-14
12 */
13
14#include "eggWriter.h"
15
16#include "string_utils.h"
17#include "compose_matrix.h"
18#include "globPattern.h"
19
20/**
21 * Egg-writing type programs may specify their output file using either the
22 * last-filename convention, the -o convention, and/or implicitly writing the
23 * result to standard output. Not all interfaces are appropriate for all
24 * applications; some may be confusing or dangerous.
25 *
26 * The calling application should pass allow_last_param true to allow the user
27 * to specify the output filename as the last parameter on the command line
28 * (the most dangerous, but convenient, method), and allow_stdout true to
29 * allow the user to omit the output filename altogether and have the output
30 * implicitly go to standard output (not terribly dangerous, but inappropriate
31 * when writing binary file formats).
32 */
34EggWriter(bool allow_last_param, bool allow_stdout) :
35 WithOutputFile(allow_last_param, allow_stdout, false)
36{
37 // Indicate the extension name we expect the user to supply for output
38 // files.
39 _preferred_extension = ".egg";
40
41 clear_runlines();
42 if (_allow_last_param) {
43 add_runline("[opts] output.egg");
44 }
45 add_runline("[opts] -o output.egg");
46 if (_allow_stdout) {
47 add_runline("[opts] >output.egg");
48 }
49
50 std::string o_description;
51
52 if (_allow_stdout) {
53 if (_allow_last_param) {
54 o_description =
55 "Specify the filename to which the resulting egg file will be written. "
56 "If this option is omitted, the last parameter name is taken to be the "
57 "name of the output file, or standard output is used if there are no "
58 "other parameters.";
59 } else {
60 o_description =
61 "Specify the filename to which the resulting egg file will be written. "
62 "If this option is omitted, the egg file is written to standard output.";
63 }
64 } else {
65 if (_allow_last_param) {
66 o_description =
67 "Specify the filename to which the resulting egg file will be written. "
68 "If this option is omitted, the last parameter name is taken to be the "
69 "name of the output file.";
70 } else {
71 o_description =
72 "Specify the filename to which the resulting egg file will be written.";
73 }
74 }
75
76 add_option
77 ("o", "filename", 50, o_description,
78 &EggWriter::dispatch_filename, &_got_output_filename, &_output_filename);
79
80 redescribe_option
81 ("cs",
82 "Specify the coordinate system of the resulting egg file. This may be "
83 "one of 'y-up', 'z-up', 'y-up-left', or 'z-up-left'. The default is "
84 "y-up.");
85}
86
87
88/**
89 * Returns this object as an EggWriter pointer, if it is in fact an EggWriter,
90 * or NULL if it is not.
91 *
92 * This is intended to work around the C++ limitation that prevents downcasts
93 * past virtual inheritance. Since both EggReader and EggWriter inherit
94 * virtually from EggSingleBase, we need functions like this to downcast to
95 * the appropriate pointer.
96 */
98as_writer() {
99 return this;
100}
101
102/**
103 * Performs any processing of the egg file that is appropriate before writing
104 * it out. This includes any normal adjustments the user requested via -np,
105 * etc.
106 *
107 * Normally, you should not need to call this function directly;
108 * write_egg_file() calls it for you. You should call this only if you do not
109 * use write_egg_file() to write out the resulting egg file.
110 */
113 if (_got_transform) {
114 nout << "Applying transform matrix:\n";
115 _transform.write(nout, 2);
116 LVecBase3d scale, hpr, translate;
117 if (decompose_matrix(_transform, scale, hpr, translate,
118 _data->get_coordinate_system())) {
119 nout << "(scale " << scale << ", hpr " << hpr << ", translate "
120 << translate << ")\n";
121 }
122 _data->transform(_transform);
123 }
124
125 if (_make_points) {
126 nout << "Making points\n";
127 _data->make_point_primitives();
128 }
129
130 bool needs_remove = false;
131
132 switch (_normals_mode) {
133 case NM_strip:
134 nout << "Stripping normals.\n";
135 _data->strip_normals();
136 needs_remove = true;
137 break;
138
139 case NM_polygon:
140 nout << "Recomputing polygon normals.\n";
141 _data->recompute_polygon_normals();
142 needs_remove = true;
143 break;
144
145 case NM_vertex:
146 nout << "Recomputing vertex normals.\n";
147 _data->recompute_vertex_normals(_normals_threshold);
148 needs_remove = true;
149 break;
150
151 case NM_preserve:
152 // Do nothing.
153 break;
154 }
155
156 if (_got_tbnall) {
157 needs_remove |= _data->recompute_tangent_binormal(GlobPattern("*"));
158 } else {
159 if (_got_tbnauto) {
160 needs_remove |= _data->recompute_tangent_binormal_auto();
161 }
162 needs_remove |= _data->recompute_tangent_binormal(_tbn_names);
163 }
164
165 if (needs_remove) {
166 _data->remove_unused_vertices(true);
167 }
168}
169
170/**
171 * Writes out the egg file as the normal result of the program. This calls
172 * post_process_egg_file() to perform any last minute processing (like normal
173 * computation) and then writes out the file to the output stream returned by
174 * get_output().
175 */
179 _data->write_egg(get_output());
180}
181
182/**
183 * Does something with the additional arguments on the command line (after all
184 * the -options have been parsed). Returns true if the arguments are good,
185 * false otherwise.
186 */
187bool EggWriter::
188handle_args(ProgramBase::Args &args) {
189 if (!check_last_arg(args, 0)) {
190 return false;
191 }
192
193 if (!args.empty()) {
194 nout << "Unexpected arguments on command line:\n";
195 Args::const_iterator ai;
196 for (ai = args.begin(); ai != args.end(); ++ai) {
197 nout << (*ai) << " ";
198 }
199 nout << "\r";
200 return false;
201 }
202
203 if (!_got_path_directory && _got_output_filename) {
204 // Put in the name of the output directory.
205 _path_replace->_path_directory = _output_filename.get_dirname();
206 }
207
208 return true;
209}
210
211/**
212 *
213 */
214bool EggWriter::
215post_command_line() {
216 if (!_allow_stdout && !_got_output_filename) {
217 nout << "You must specify the filename to write with -o.\n";
218 return false;
219 }
220
221 append_command_comment(_data);
222
223 return EggSingleBase::post_command_line();
224}
This is the base class for a program that generates an egg file output, but doesn't read any for inpu...
Definition eggWriter.h:28
virtual void post_process_egg_file()
Performs any processing of the egg file that is appropriate before writing it out.
EggWriter(bool allow_last_param=false, bool allow_stdout=true)
Egg-writing type programs may specify their output file using either the last-filename convention,...
Definition eggWriter.cxx:34
virtual EggWriter * as_writer()
Returns this object as an EggWriter pointer, if it is in fact an EggWriter, or NULL if it is not.
Definition eggWriter.cxx:98
void write_egg_file()
Writes out the egg file as the normal result of the program.
This class can be used to test for string matches against standard Unix- shell filename globbing conv...
Definition globPattern.h:32
This is the bare functionality (intended to be inherited from along with ProgramBase or some derivati...
std::ostream & get_output()
Returns an output stream that corresponds to the user's intended egg file output–either stdout,...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.