From d1b8bf8bf6e996e5ccfa69510a98967fa491c59a Mon Sep 17 00:00:00 2001 From: David Rose Date: Sat, 28 Apr 2001 01:45:35 +0000 Subject: [PATCH] *** empty log message *** --- pandatool/src/fltegg/fltToEggConverter.cxx | 30 ++++++- pandatool/src/fltegg/fltToEggConverter.h | 7 +- pandatool/src/lwoegg/cLwoPolygons.cxx | 44 ++++++---- pandatool/src/lwoegg/cLwoSurface.cxx | 12 ++- pandatool/src/lwoegg/cLwoSurface.h | 5 +- pandatool/src/lwoegg/lwoToEggConverter.cxx | 95 +++++++++++++--------- pandatool/src/lwoegg/lwoToEggConverter.h | 2 + 7 files changed, 135 insertions(+), 60 deletions(-) diff --git a/pandatool/src/fltegg/fltToEggConverter.cxx b/pandatool/src/fltegg/fltToEggConverter.cxx index 422fa616c0..20116369ce 100644 --- a/pandatool/src/fltegg/fltToEggConverter.cxx +++ b/pandatool/src/fltegg/fltToEggConverter.cxx @@ -36,6 +36,16 @@ FltToEggConverter:: FltToEggConverter() { } +//////////////////////////////////////////////////////////////////// +// Function: FltToEggConverter::Destructor +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +FltToEggConverter:: +~FltToEggConverter() { + cleanup(); +} + //////////////////////////////////////////////////////////////////// // Function: FltToEggConverter::get_name @@ -103,7 +113,7 @@ convert_flt(const FltHeader *flt_header) { // Generate a default vertex pool. _main_egg_vpool = new EggVertexPool("vpool"); - _egg_data->add_child(_main_egg_vpool); + _egg_data->add_child(_main_egg_vpool.p()); // We could populate the vertex pool right away, but it's better to // defer each vertex until we encounter it, since some of the @@ -118,12 +128,28 @@ convert_flt(const FltHeader *flt_header) { if (_main_egg_vpool->empty()) { // If we didn't get any global vertices, remove the vertex pool // just for cleanliness. - _egg_data->remove_child(_main_egg_vpool); + _egg_data->remove_child(_main_egg_vpool.p()); } + cleanup(); + return !_error; } +//////////////////////////////////////////////////////////////////// +// Function: FltToEggConverter::cleanup +// Access: Private +// Description: Frees all the internal data structures after we're +// done converting, and resets the converter to its +// initial state. +//////////////////////////////////////////////////////////////////// +void FltToEggConverter:: +cleanup() { + _flt_header.clear(); + _main_egg_vpool.clear(); + _textures.clear(); +} + //////////////////////////////////////////////////////////////////// // Function: FltToEggConverter::convert_record // Access: Private diff --git a/pandatool/src/fltegg/fltToEggConverter.h b/pandatool/src/fltegg/fltToEggConverter.h index 9b4598912d..72b23a5d25 100644 --- a/pandatool/src/fltegg/fltToEggConverter.h +++ b/pandatool/src/fltegg/fltToEggConverter.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -29,7 +30,6 @@ class FltExternalReference; class FltTexture; class EggGroupNode; class EggPrimitive; -class EggVertexPool; //////////////////////////////////////////////////////////////////// // Class : FltToEggConverter @@ -41,6 +41,7 @@ class EggVertexPool; class FltToEggConverter : public SomethingToEggConverter { public: FltToEggConverter(); + ~FltToEggConverter(); virtual string get_name() const; virtual string get_extension() const; @@ -49,6 +50,8 @@ public: bool convert_flt(const FltHeader *flt_header); private: + void cleanup(); + typedef vector< PT(EggVertex) > EggVertices; void convert_record(const FltRecord *flt_record, FltToEggLevelState &state); @@ -79,7 +82,7 @@ private: CPT(FltHeader) _flt_header; - EggVertexPool *_main_egg_vpool; + PT(EggVertexPool) _main_egg_vpool; typedef map Textures; Textures _textures; diff --git a/pandatool/src/lwoegg/cLwoPolygons.cxx b/pandatool/src/lwoegg/cLwoPolygons.cxx index f54831d7d2..8601d6f9fc 100644 --- a/pandatool/src/lwoegg/cLwoPolygons.cxx +++ b/pandatool/src/lwoegg/cLwoPolygons.cxx @@ -139,9 +139,9 @@ make_faces() { float smooth_angle = -1.0; int num_polygons = _polygons->get_num_polygons(); - for (int i = 0; i < num_polygons; i++) { - LwoPolygons::Polygon *poly = _polygons->get_polygon(i); - CLwoSurface *surface = get_surface(i); + for (int pindex = 0; pindex < num_polygons; pindex++) { + LwoPolygons::Polygon *poly = _polygons->get_polygon(pindex); + CLwoSurface *surface = get_surface(pindex); bool is_valid = true; @@ -154,38 +154,50 @@ make_faces() { // clockwise ordering convention. We also want to start with the // last vertex, so that the first convex angle is the first angle // in the EggPolygon (for determining correct normals). - int num_vertices = poly->_vertices.size(); PT(EggPrimitive) egg_prim; - if (num_vertices == 1) { + if (poly->_vertices.size() == 1) { egg_prim = new EggPoint; } else { egg_prim = new EggPolygon; } - if (surface != (CLwoSurface *)NULL) { - surface->apply_properties(egg_prim, smooth_angle); - } + surface->check_texture(); + // First, we have to create a temporary vector of vertices for the + // polygon, so we can possibly adjust the properties of these + // vertices (like the UV's) in the shader before we create them. + vector_PT_EggVertex egg_vertices; + + int num_vertices = poly->_vertices.size(); for (int vi = num_vertices; vi > 0; vi--) { int vindex = poly->_vertices[vi % num_vertices]; if (vindex < 0 || vindex >= num_points) { nout << "Invalid vertex index " << vindex << " in polygon.\n"; is_valid = false; - } else { - EggVertex egg_vert; + PT(EggVertex) egg_vertex = new EggVertex; LPoint3d pos = LCAST(double, points->get_point(vindex)); - egg_vert.set_pos(pos); - if (surface != (CLwoSurface *)NULL && surface->has_uvs()) { - egg_vert.set_uv(surface->get_uv(pos)); - } - EggVertex *new_vert = egg_vpool->create_unique_vertex(egg_vert); - egg_prim->add_vertex(new_vert); + egg_vertex->set_pos(pos); + + egg_vertices.push_back(egg_vertex); } } if (is_valid) { + if (surface != (CLwoSurface *)NULL) { + surface->apply_properties(egg_prim, egg_vertices, smooth_angle); + } + + // Now add all the vertices officially to the primitive. + vector_PT_EggVertex::const_iterator evi; + for (evi = egg_vertices.begin(); evi != egg_vertices.end(); ++evi) { + EggVertex *egg_vertex = (*evi); + EggVertex *new_vertex = egg_vpool->create_unique_vertex(*egg_vertex); + egg_prim->add_vertex(new_vertex); + } + + // And add the primitive to its parent. _egg_group->add_child(egg_prim.p()); } } diff --git a/pandatool/src/lwoegg/cLwoSurface.cxx b/pandatool/src/lwoegg/cLwoSurface.cxx index 9ed032c3b1..4a9aba41b1 100644 --- a/pandatool/src/lwoegg/cLwoSurface.cxx +++ b/pandatool/src/lwoegg/cLwoSurface.cxx @@ -135,13 +135,14 @@ CLwoSurface:: // angle is greater than that specified. //////////////////////////////////////////////////////////////////// void CLwoSurface:: -apply_properties(EggPrimitive *egg_prim, float &smooth_angle) { +apply_properties(EggPrimitive *egg_prim, vector_PT_EggVertex &egg_vertices, + float &smooth_angle) { if (!_surface->_source.empty()) { // This surface is derived from another surface; apply that one // first. CLwoSurface *parent = _converter->get_surface(_surface->_source); if (parent != (CLwoSurface *)NULL && parent != this) { - parent->apply_properties(egg_prim, smooth_angle); + parent->apply_properties(egg_prim, egg_vertices, smooth_angle); } } @@ -165,6 +166,13 @@ apply_properties(EggPrimitive *egg_prim, float &smooth_angle) { // Texture overrides the primitive's natural color. egg_prim->set_texture(_egg_texture); egg_prim->clear_color(); + + // Assign UV's to the vertices. + vector_PT_EggVertex::const_iterator vi; + for (vi = egg_vertices.begin(); vi != egg_vertices.end(); ++vi) { + EggVertex *egg_vertex = (*vi); + egg_vertex->set_uv(get_uv(egg_vertex->get_pos3())); + } } if ((_flags & F_transparency) != 0) { diff --git a/pandatool/src/lwoegg/cLwoSurface.h b/pandatool/src/lwoegg/cLwoSurface.h index 8c01044334..bda3e6d505 100644 --- a/pandatool/src/lwoegg/cLwoSurface.h +++ b/pandatool/src/lwoegg/cLwoSurface.h @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -32,7 +33,9 @@ public: INLINE const string &get_name() const; - void apply_properties(EggPrimitive *egg_prim, float &smooth_angle); + void apply_properties(EggPrimitive *egg_prim, + vector_PT_EggVertex &egg_vertices, + float &smooth_angle); bool check_texture(); INLINE bool has_uvs() const; diff --git a/pandatool/src/lwoegg/lwoToEggConverter.cxx b/pandatool/src/lwoegg/lwoToEggConverter.cxx index 6631db86fd..aee1477bda 100644 --- a/pandatool/src/lwoegg/lwoToEggConverter.cxx +++ b/pandatool/src/lwoegg/lwoToEggConverter.cxx @@ -39,43 +39,7 @@ LwoToEggConverter() { //////////////////////////////////////////////////////////////////// LwoToEggConverter:: ~LwoToEggConverter() { - if (_generic_layer != (CLwoLayer *)NULL) { - delete _generic_layer; - } - - Layers::iterator li; - for (li = _layers.begin(); li != _layers.end(); ++li) { - CLwoLayer *layer = (*li); - if (layer != (CLwoLayer *)NULL) { - delete layer; - } - } - - Clips::iterator ci; - for (ci = _clips.begin(); ci != _clips.end(); ++ci) { - CLwoClip *clip = (*ci); - if (clip != (CLwoClip *)NULL) { - delete clip; - } - } - - Points::iterator pi; - for (pi = _points.begin(); pi != _points.end(); ++pi) { - CLwoPoints *points = (*pi); - delete points; - } - - Polygons::iterator gi; - for (gi = _polygons.begin(); gi != _polygons.end(); ++gi) { - CLwoPolygons *polygons = (*gi); - delete polygons; - } - - Surfaces::iterator si; - for (si = _surfaces.begin(); si != _surfaces.end(); ++si) { - CLwoSurface *surface = (*si).second; - delete surface; - } + cleanup(); } //////////////////////////////////////////////////////////////////// @@ -164,6 +128,7 @@ convert_lwo(const LwoHeader *lwo_header) { connect_egg(); _egg_data->remove_unused_vertices(); + cleanup(); return !_error; } @@ -212,6 +177,62 @@ get_surface(const string &name) const { return (CLwoSurface *)NULL; } +//////////////////////////////////////////////////////////////////// +// Function: LwoToEggConverter::cleanup +// Access: Private +// Description: Frees all the internal data structures after we're +// done converting, and resets the converter to its +// initial state. +//////////////////////////////////////////////////////////////////// +void LwoToEggConverter:: +cleanup() { + _lwo_header.clear(); + + if (_generic_layer != (CLwoLayer *)NULL) { + delete _generic_layer; + _generic_layer = (CLwoLayer *)NULL; + } + + Layers::iterator li; + for (li = _layers.begin(); li != _layers.end(); ++li) { + CLwoLayer *layer = (*li); + if (layer != (CLwoLayer *)NULL) { + delete layer; + } + } + _layers.clear(); + + Clips::iterator ci; + for (ci = _clips.begin(); ci != _clips.end(); ++ci) { + CLwoClip *clip = (*ci); + if (clip != (CLwoClip *)NULL) { + delete clip; + } + } + _clips.clear(); + + Points::iterator pi; + for (pi = _points.begin(); pi != _points.end(); ++pi) { + CLwoPoints *points = (*pi); + delete points; + } + _points.clear(); + + Polygons::iterator gi; + for (gi = _polygons.begin(); gi != _polygons.end(); ++gi) { + CLwoPolygons *polygons = (*gi); + delete polygons; + } + _polygons.clear(); + + Surfaces::iterator si; + for (si = _surfaces.begin(); si != _surfaces.end(); ++si) { + CLwoSurface *surface = (*si).second; + delete surface; + } + _surfaces.clear(); +} + //////////////////////////////////////////////////////////////////// // Function: LwoToEggConverter::collect_lwo // Access: Private diff --git a/pandatool/src/lwoegg/lwoToEggConverter.h b/pandatool/src/lwoegg/lwoToEggConverter.h index 16db8e6d66..6694bfaccc 100644 --- a/pandatool/src/lwoegg/lwoToEggConverter.h +++ b/pandatool/src/lwoegg/lwoToEggConverter.h @@ -46,6 +46,8 @@ public: CLwoSurface *get_surface(const string &name) const; private: + void cleanup(); + void collect_lwo(); void make_egg(); void connect_egg();