From 88d5abcd223dedadca800a0b005b76606dcd8ef8 Mon Sep 17 00:00:00 2001 From: David Rose Date: Fri, 3 Aug 2001 22:34:06 +0000 Subject: [PATCH] *** empty log message *** --- pandatool/src/eggprogs/eggToC.cxx | 384 ++++++++++++++++++++++++++++++ pandatool/src/eggprogs/eggToC.h | 62 +++++ 2 files changed, 446 insertions(+) create mode 100644 pandatool/src/eggprogs/eggToC.cxx create mode 100644 pandatool/src/eggprogs/eggToC.h diff --git a/pandatool/src/eggprogs/eggToC.cxx b/pandatool/src/eggprogs/eggToC.cxx new file mode 100644 index 0000000000..2dd6021a07 --- /dev/null +++ b/pandatool/src/eggprogs/eggToC.cxx @@ -0,0 +1,384 @@ +// Filename: eggToC.cxx +// Created by: drose (03Aug01) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved +// +// All use of this software is subject to the terms of the Panda 3d +// Software license. You should have received a copy of this license +// along with this source code; you will also find a current copy of +// the license at http://www.panda3d.org/license.txt . +// +// To contact the maintainers of this program write to +// panda3d@yahoogroups.com . +// +//////////////////////////////////////////////////////////////////// + +#include "eggToC.h" + +#include "eggVertexPool.h" +#include "eggVertex.h" +#include "eggPolygon.h" +#include "eggPrimitive.h" +#include "eggGroupNode.h" +#include "eggPolysetMaker.h" +#include "eggBin.h" +#include "string_utils.h" + +//////////////////////////////////////////////////////////////////// +// Function: EggToC::Constructor +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +EggToC:: +EggToC() : + EggToSomething("C", ".c", true, true) +{ + set_program_description + ("This program reads Egg files and outputs code that will almost " + "compile as a C or C++ program. You get to define the data structures " + "for the program after the fact; the program only generates tables " + "of vertices and polygons."); + + // -f is always in effect for egg2c. It doesn't make sense to + // provide it as an option to the user. + remove_option("f"); + + add_option + ("v", "", 0, + "Generate a table of vertex positions.", + &EggToC::dispatch_none, &_vertices); + + add_option + ("u", "", 0, + "Generate a table of UV's per each vertex.", + &EggToC::dispatch_none, &_uvs); + + add_option + ("vn", "", 0, + "Generate a table of normals per each vertex.", + &EggToC::dispatch_none, &_vertex_normals); + + add_option + ("vc", "", 0, + "Generate a table of colors per each vertex.", + &EggToC::dispatch_none, &_vertex_colors); + + add_option + ("pn", "", 0, + "Generate a table of normals per each polygon.", + &EggToC::dispatch_none, &_polygon_normals); + + add_option + ("pc", "", 0, + "Generate a table of colors per each polygon.", + &EggToC::dispatch_none, &_polygon_colors); + + add_option + ("p", "", 0, + "Generate a table of polygons that index into the above tables.", + &EggToC::dispatch_none, &_polygons); + + add_option + ("t", "", 0, + "Output only triangles by subdividing higher-order polygons.", + &EggToC::dispatch_none, &_triangulate_polygons); +} + +//////////////////////////////////////////////////////////////////// +// Function: EggToC::run +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +void EggToC:: +run() { + nout << "Removing invalid primitives.\n"; + int num_removed = _data.remove_invalid_primitives(); + nout << " (" << num_removed << " removed.)\n"; + + if (_triangulate_polygons) { + nout << "Triangulating polygons.\n"; + int num_produced = _data.triangulate_polygons(true); + nout << " (" << num_produced << " triangles produced.)\n"; + } + + _data.apply_texmats(); + _data.flatten_transforms(); + _data.remove_unused_vertices(); + + // Collect all the polygons together into polysets. + EggPolysetMaker pmaker; + pmaker.set_properties(0); + pmaker.make_bins(&_data); + + get_output() + << "/*\n" + << " * Generated by:\n" + << " * " << get_exec_command() << "\n" + << " *\n" + << " */\n\n"; + + _next_vpool_index = 0; + _next_bin_index = 0; + traverse(&_data); +} + +//////////////////////////////////////////////////////////////////// +// Function: EggToC::traverse +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +void EggToC:: +traverse(EggNode *node) { + if (node->is_of_type(EggVertexPool::get_class_type())) { + write_vertex_pool(DCAST(EggVertexPool, node)); + + } else if (node->is_of_type(EggBin::get_class_type())) { + write_bin(DCAST(EggBin, node)); + + } else if (node->is_of_type(EggGroupNode::get_class_type())) { + EggGroupNode *group = DCAST(EggGroupNode, node); + + EggGroupNode::const_iterator ci; + for (ci = group->begin(); ci != group->end(); ++ci) { + traverse(*ci); + } + } +} + +//////////////////////////////////////////////////////////////////// +// Function: EggToC::write_vertex_pool +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +void EggToC:: +write_vertex_pool(EggVertexPool *vpool) { + int highest_index = vpool->get_highest_index(); + int i; + + ostream &out = get_output(); + out << "/* Vertex pool index " << _next_vpool_index + << ": " << vpool->get_name() << " */\n"; + _vertex_pools[vpool] = _next_vpool_index; + _next_vpool_index++; + + if (_vertices) { + out << "/* Vertex definition for " << vpool->get_name() << " */\n" + << "vertex vertices_" << vpool->get_name() << "[" << highest_index + << "] = {\n"; + for (i = 0; i < highest_index; i++) { + EggVertex *vert = vpool->get_vertex(i); + if (vert == (EggVertex *)NULL) { + out << " vertex(), /* " << i << " */\n"; + } else { + LPoint4d p = vert->get_pos4(); + switch (vert->get_num_dimensions()) { + case 1: + out << " vertex(" << p[0] << "), /* " << i << " */\n"; + break; + + case 2: + out << " vertex(" << p[0] << ", " << p[1] + << "), /* " << i << " */\n"; + break; + + case 3: + out << " vertex(" << p[0] << ", " << p[1] << ", " << p[2] + << "), /* " << i << " */\n"; + break; + + case 4: + out << " vertex(" << p[0] << ", " << p[1] << ", " << p[2] + << ", " << p[3] << "), /* " << i << " */\n"; + break; + + default: + out << " vertex(), /* error */\n"; + } + } + } + out << "};\n\n"; + } + + if (_uvs) { + out << "/* UV's for " << vpool->get_name() << " */\n" + << "uv uvs_" << vpool->get_name() << "[" << highest_index + << "] = {\n"; + for (i = 0; i < highest_index; i++) { + EggVertex *vert = vpool->get_vertex(i); + if (vert == (EggVertex *)NULL || !vert->has_uv()) { + out << " uv(), /* " << i << " */\n"; + } else { + TexCoordd uv = vert->get_uv(); + out << " uv(" << uv[0] << ", " << uv[1] + << "), /* " << i << " */\n"; + } + } + out << "};\n\n"; + } + + if (_vertex_normals) { + out << "/* Vertex normals for " << vpool->get_name() << " */\n" + << "normal normals_" << vpool->get_name() << "[" << highest_index + << "] = {\n"; + for (i = 0; i < highest_index; i++) { + EggVertex *vert = vpool->get_vertex(i); + if (vert == (EggVertex *)NULL || !vert->has_normal()) { + out << " normal(), /* " << i << " */\n"; + } else { + Normald n = vert->get_normal(); + out << " normal(" << n[0] << ", " << n[1] << ", " << n[2] + << "), /* " << i << " */\n"; + } + } + out << "};\n\n"; + } + + if (_vertex_colors) { + out << "/* Vertex colors for " << vpool->get_name() << " */\n" + << "color colors_" << vpool->get_name() << "[" << highest_index + << "] = {\n"; + for (i = 0; i < highest_index; i++) { + EggVertex *vert = vpool->get_vertex(i); + if (vert == (EggVertex *)NULL || !vert->has_color()) { + out << " color(), /* " << i << " */\n"; + } else { + Colorf c = vert->get_color(); + out << " color(" << c[0] << ", " << c[1] << ", " << c[2] + << ", " << c[3] << "), /* " << i << " */\n"; + } + } + out << "};\n\n"; + } +} + + +//////////////////////////////////////////////////////////////////// +// Function: EggToC::write_bin +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +void EggToC:: +write_bin(EggBin *bin) { + ostream &out = get_output(); + string bin_name = bin->get_name(); + if (bin_name.empty()) { + bin_name = format_string(_next_bin_index); + _next_bin_index++; + } + + out << "/* Polygon group " << bin_name << " */\n"; + + size_t num_children = bin->size(); + + if (_polygons) { + out << "/* Polygon definitions for " << bin_name << " */\n"; + string prim_type = "polygon"; + if (_triangulate_polygons) { + prim_type = "triangle"; + } + + out << prim_type << " polys_" << bin_name << "[" << num_children + << "] = {\n"; + + if (_triangulate_polygons) { + out << " /* vpool index, vertex0, vertex1, vertex2 */\n"; + } else { + out << " /* vpool index, num vertices, vertex0, vertex1, vertex2, ... */\n"; + } + + EggGroupNode::const_iterator ci; + size_t prim_index = 0; + for (ci = bin->begin(); ci != bin->end(); ++ci) { + EggNode *child = (*ci); + if (!child->is_of_type(EggPrimitive::get_class_type())) { + out << " " << prim_type << "(), /* error */\n"; + } else { + EggPrimitive *prim = DCAST(EggPrimitive, child); + EggVertexPool *vpool = prim->get_pool(); + int vpool_index = -1; + VertexPools::const_iterator pi = _vertex_pools.find(vpool); + if (pi != _vertex_pools.end()) { + vpool_index = (*pi).second; + } + + out << " " << prim_type << "(" << vpool_index; + if (!_triangulate_polygons) { + out << ", " << prim->size(); + } + EggPrimitive::const_iterator vi; + for (vi = prim->begin(); vi != prim->end(); ++vi) { + EggVertex *vert = (*vi); + out << ", " << vert->get_index(); + } + out << "), /* " << prim_index << " */\n"; + prim_index++; + } + } + out << "};\n\n"; + } + + if (_polygon_normals) { + ostream &out = get_output(); + out << "/* Polygon normals for " << bin_name << " */\n"; + out << "normal polys_" << bin_name << "[" << num_children + << "] = {\n"; + + EggGroupNode::const_iterator ci; + size_t prim_index = 0; + for (ci = bin->begin(); ci != bin->end(); ++ci) { + EggNode *child = (*ci); + if (!child->is_of_type(EggPrimitive::get_class_type())) { + out << " normal(), /* error */\n"; + } else { + EggPrimitive *prim = DCAST(EggPrimitive, child); + if (!prim->has_normal()) { + out << " normal(), /* " << prim_index << " */\n"; + } else { + Normald n = prim->get_normal(); + out << " normal(" << n[0] << ", " << n[1] << ", " << n[2] + << "), /* " << prim_index << " */\n"; + } + prim_index++; + } + } + out << "};\n\n"; + } + + if (_polygon_colors) { + ostream &out = get_output(); + out << "/* Polygon colors for " << bin_name << " */\n"; + out << "color polys_" << bin_name << "[" << num_children + << "] = {\n"; + + EggGroupNode::const_iterator ci; + size_t prim_index = 0; + for (ci = bin->begin(); ci != bin->end(); ++ci) { + EggNode *child = (*ci); + if (!child->is_of_type(EggPrimitive::get_class_type())) { + out << " color(), /* error */\n"; + } else { + EggPrimitive *prim = DCAST(EggPrimitive, child); + if (!prim->has_color()) { + out << " color(), /* " << prim_index << " */\n"; + } else { + Colorf c = prim->get_color(); + out << " color(" << c[0] << ", " << c[1] << ", " << c[2] + << ", " << c[3] << "), /* " << prim_index << " */\n"; + } + prim_index++; + } + } + out << "};\n\n"; + } +} + + +int main(int argc, char *argv[]) { + EggToC prog; + prog.parse_command_line(argc, argv); + prog.run(); + return 0; +} diff --git a/pandatool/src/eggprogs/eggToC.h b/pandatool/src/eggprogs/eggToC.h new file mode 100644 index 0000000000..d1078177c3 --- /dev/null +++ b/pandatool/src/eggprogs/eggToC.h @@ -0,0 +1,62 @@ +// Filename: eggToC.h +// Created by: drose (03Aug01) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved +// +// All use of this software is subject to the terms of the Panda 3d +// Software license. You should have received a copy of this license +// along with this source code; you will also find a current copy of +// the license at http://www.panda3d.org/license.txt . +// +// To contact the maintainers of this program write to +// panda3d@yahoogroups.com . +// +//////////////////////////////////////////////////////////////////// + +#ifndef EGGTOC_H +#define EGGTOC_H + +#include "pandatoolbase.h" + +#include "eggToSomething.h" + +#include "pmap.h" + +class EggNode; +class EggVertexPool; +class EggBin; + +//////////////////////////////////////////////////////////////////// +// Class : EggToC +// Description : +//////////////////////////////////////////////////////////////////// +class EggToC : public EggToSomething { +public: + EggToC(); + + void run(); + + void traverse(EggNode *node); + void write_vertex_pool(EggVertexPool *vpool); + void write_bin(EggBin *bin); + + bool _vertices; + bool _uvs; + bool _vertex_normals; + bool _vertex_colors; + bool _polygons; + bool _polygon_normals; + bool _polygon_colors; + + bool _triangulate_polygons; + + typedef pmap VertexPools; + VertexPools _vertex_pools; + int _next_vpool_index; + int _next_bin_index; +}; + +#endif