mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -04:00
*** empty log message ***
This commit is contained in:
parent
8702491c5b
commit
88d5abcd22
384
pandatool/src/eggprogs/eggToC.cxx
Normal file
384
pandatool/src/eggprogs/eggToC.cxx
Normal file
@ -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;
|
||||||
|
}
|
62
pandatool/src/eggprogs/eggToC.h
Normal file
62
pandatool/src/eggprogs/eggToC.h
Normal file
@ -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<EggVertexPool *, int> VertexPools;
|
||||||
|
VertexPools _vertex_pools;
|
||||||
|
int _next_vpool_index;
|
||||||
|
int _next_bin_index;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user