35 set_program_brief(
"convert .egg geometry into compilable C tables");
36 set_program_description
37 (
"This program reads Egg files and outputs code that will almost "
38 "compile as a C or C++ program. You get to define the data structures "
39 "for the program after the fact; the program only generates tables "
40 "of vertices and polygons.");
48 "Generate a table of vertex positions.",
49 &EggToC::dispatch_none, &_vertices);
53 "Generate a table of UV's per each vertex.",
54 &EggToC::dispatch_none, &_uvs);
58 "Generate a table of normals per each vertex.",
59 &EggToC::dispatch_none, &_vertex_normals);
63 "Generate a table of colors per each vertex.",
64 &EggToC::dispatch_none, &_vertex_colors);
68 "Generate a table of polygons that index into the above tables.",
69 &EggToC::dispatch_none, &_polygons);
73 "Generate a table of normals per each polygon.",
74 &EggToC::dispatch_none, &_polygon_normals);
78 "Generate a table of colors per each polygon.",
79 &EggToC::dispatch_none, &_polygon_colors);
83 "Output only triangles by subdividing higher-order polygons.",
84 &EggToC::dispatch_none, &_triangulate_polygons);
92 nout <<
"Removing invalid primitives.\n";
93 int num_removed = _data->remove_invalid_primitives(
true);
94 nout <<
" (" << num_removed <<
" removed.)\n";
96 if (_triangulate_polygons) {
97 nout <<
"Triangulating polygons.\n";
98 int num_produced = _data->triangulate_polygons(~0);
99 nout <<
" (" << num_produced <<
" triangles produced.)\n";
102 _data->apply_texmats();
103 _data->flatten_transforms();
104 _data->remove_unused_vertices(
true);
113 <<
" * Generated by:\n"
118 _next_vpool_index = 0;
128 if (node->
is_of_type(EggVertexPool::get_class_type())) {
131 }
else if (node->
is_of_type(EggBin::get_class_type())) {
132 write_bin(DCAST(
EggBin, node));
134 }
else if (node->
is_of_type(EggGroupNode::get_class_type())) {
137 EggGroupNode::const_iterator ci;
138 for (ci = group->begin(); ci != group->end(); ++ci) {
153 out <<
"/* Vertex pool index " << _next_vpool_index
154 <<
": " << vpool->get_name() <<
" */\n";
155 _vertex_pools[vpool] = _next_vpool_index;
159 out <<
"/* Vertex definition for " << vpool->get_name() <<
" */\n"
160 <<
"vertex vertices_" << vpool->get_name() <<
"[" << highest_index
162 for (i = 0; i < highest_index; i++) {
164 if (vert ==
nullptr) {
165 out <<
" vertex(), /* " << i <<
" */\n";
170 out <<
" vertex(" << p[0] <<
"), /* " << i <<
" */\n";
174 out <<
" vertex(" << p[0] <<
", " << p[1]
175 <<
"), /* " << i <<
" */\n";
179 out <<
" vertex(" << p[0] <<
", " << p[1] <<
", " << p[2]
180 <<
"), /* " << i <<
" */\n";
184 out <<
" vertex(" << p[0] <<
", " << p[1] <<
", " << p[2]
185 <<
", " << p[3] <<
"), /* " << i <<
" */\n";
189 out <<
" vertex(), /* error */\n";
197 out <<
"/* UV's for " << vpool->get_name() <<
" */\n"
198 <<
"uv uvs_" << vpool->get_name() <<
"[" << highest_index
200 for (i = 0; i < highest_index; i++) {
202 if (vert ==
nullptr || !vert->
has_uv()) {
203 out <<
" uv(), /* " << i <<
" */\n";
205 LTexCoordd uv = vert->
get_uv();
206 out <<
" uv(" << uv[0] <<
", " << uv[1]
207 <<
"), /* " << i <<
" */\n";
213 if (_vertex_normals) {
214 out <<
"/* Vertex normals for " << vpool->get_name() <<
" */\n"
215 <<
"normal normals_" << vpool->get_name() <<
"[" << highest_index
217 for (i = 0; i < highest_index; i++) {
219 if (vert ==
nullptr || !vert->has_normal()) {
220 out <<
" normal(), /* " << i <<
" */\n";
222 LNormald n = vert->get_normal();
223 out <<
" normal(" << n[0] <<
", " << n[1] <<
", " << n[2]
224 <<
"), /* " << i <<
" */\n";
230 if (_vertex_colors) {
231 out <<
"/* Vertex colors for " << vpool->get_name() <<
" */\n"
232 <<
"color colors_" << vpool->get_name() <<
"[" << highest_index
234 for (i = 0; i < highest_index; i++) {
236 if (vert ==
nullptr || !vert->has_color()) {
237 out <<
" color(), /* " << i <<
" */\n";
240 out <<
" color(" << c[0] <<
", " << c[1] <<
", " << c[2]
241 <<
", " << c[3] <<
"), /* " << i <<
" */\n";
255 string bin_name = bin->get_name();
256 if (bin_name.empty()) {
257 bin_name = format_string(_next_bin_index);
261 out <<
"/* Polygon group " << bin_name <<
" */\n";
263 size_t num_children = bin->size();
266 out <<
"/* Polygon definitions for " << bin_name <<
" */\n";
267 string prim_type =
"polygon";
268 if (_triangulate_polygons) {
269 prim_type =
"triangle";
272 out << prim_type <<
" polys_" << bin_name <<
"[" << num_children
275 if (_triangulate_polygons) {
276 out <<
" /* vpool index, vertex0, vertex1, vertex2 */\n";
278 out <<
" /* vpool index, num vertices, vertex0, vertex1, vertex2, ... */\n";
281 EggGroupNode::const_iterator ci;
282 size_t prim_index = 0;
283 for (ci = bin->begin(); ci != bin->end(); ++ci) {
285 if (!child->
is_of_type(EggPrimitive::get_class_type())) {
286 out <<
" " << prim_type <<
"(), /* error */\n";
290 int vpool_index = -1;
291 VertexPools::const_iterator pi = _vertex_pools.find(vpool);
292 if (pi != _vertex_pools.end()) {
293 vpool_index = (*pi).second;
296 out <<
" " << prim_type <<
"(" << vpool_index;
297 if (!_triangulate_polygons) {
298 out <<
", " << prim->size();
300 EggPrimitive::const_iterator vi;
301 for (vi = prim->begin(); vi != prim->end(); ++vi) {
305 out <<
"), /* " << prim_index <<
" */\n";
312 if (_polygon_normals) {
314 out <<
"/* Polygon normals for " << bin_name <<
" */\n";
315 out <<
"normal polys_" << bin_name <<
"[" << num_children
318 EggGroupNode::const_iterator ci;
319 size_t prim_index = 0;
320 for (ci = bin->begin(); ci != bin->end(); ++ci) {
322 if (!child->
is_of_type(EggPrimitive::get_class_type())) {
323 out <<
" normal(), /* error */\n";
326 if (!prim->has_normal()) {
327 out <<
" normal(), /* " << prim_index <<
" */\n";
329 LNormald n = prim->get_normal();
330 out <<
" normal(" << n[0] <<
", " << n[1] <<
", " << n[2]
331 <<
"), /* " << prim_index <<
" */\n";
339 if (_polygon_colors) {
341 out <<
"/* Polygon colors for " << bin_name <<
" */\n";
342 out <<
"color polys_" << bin_name <<
"[" << num_children
345 EggGroupNode::const_iterator ci;
346 size_t prim_index = 0;
347 for (ci = bin->begin(); ci != bin->end(); ++ci) {
349 if (!child->
is_of_type(EggPrimitive::get_class_type())) {
350 out <<
" color(), /* error */\n";
353 if (!prim->has_color()) {
354 out <<
" color(), /* " << prim_index <<
" */\n";
357 out <<
" color(" << c[0] <<
", " << c[1] <<
", " << c[2]
358 <<
", " << c[3] <<
"), /* " << prim_index <<
" */\n";
368 int main(
int argc,
char *argv[]) {