Browse Source

*** empty log message ***

David Rose 24 years ago
parent
commit
88d5abcd22
2 changed files with 446 additions and 0 deletions
  1. 384 0
      pandatool/src/eggprogs/eggToC.cxx
  2. 62 0
      pandatool/src/eggprogs/eggToC.h

+ 384 - 0
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
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#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;
+}

+ 62 - 0
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
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#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<EggVertexPool *, int> VertexPools;
+  VertexPools _vertex_pools;
+  int _next_vpool_index;
+  int _next_bin_index;
+};
+
+#endif