diff --git a/panda/src/gobj/geom.cxx b/panda/src/gobj/geom.cxx index 4ca257fc1d..9ce461801e 100644 --- a/panda/src/gobj/geom.cxx +++ b/panda/src/gobj/geom.cxx @@ -16,23 +16,19 @@ // //////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////// -// Includes -//////////////////////////////////////////////////////////////////// - #include "geom.h" #include "config_gobj.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "graphicsStateGuardianBase.h" +#include "geometricBoundingVolume.h" +#include "datagram.h" +#include "datagramIterator.h" +#include "bamReader.h" +#include "bamWriter.h" +#include "ioPtaDatagramShort.h" +#include "ioPtaDatagramInt.h" +#include "ioPtaDatagramLinMath.h" +#include "indent.h" //////////////////////////////////////////////////////////////////// // Static variables @@ -202,6 +198,70 @@ operator = (const Geom ©) { make_dirty(); } +//////////////////////////////////////////////////////////////////// +// Function: Geom::calc_tight_bounds +// Access: Public +// Description: Expands min_point and max_point to include all of the +// vertices in the Geom, if any. found_any is set true +// if any points are found. It is the caller's +// responsibility to initialize min_point, max_point, +// and found_any before calling this function. +//////////////////////////////////////////////////////////////////// +void Geom:: +calc_tight_bounds(LPoint3f &min_point, LPoint3f &max_point, + bool &found_any) const { + Geom::VertexIterator vi = make_vertex_iterator(); + int num_prims = get_num_prims(); + + for (int p = 0; p < num_prims; p++) { + int length = get_length(p); + for (int v = 0; v < length; v++) { + Vertexf vertex = get_next_vertex(vi); + + if (found_any) { + min_point.set(min(min_point[0], vertex[0]), + min(min_point[1], vertex[1]), + min(min_point[2], vertex[2])); + max_point.set(max(max_point[0], vertex[0]), + max(max_point[1], vertex[1]), + max(max_point[2], vertex[2])); + } else { + min_point = vertex; + max_point = vertex; + found_any = true; + } + } + } +} + +//////////////////////////////////////////////////////////////////// +// Function: Geom::transform_vertices +// Access: Public +// Description: Applies the indicated transform to all of the +// vertices in the Geom. If the Geom happens to share a +// vertex table with another Geom, this operation will +// duplicate the vertex table instead of breaking the +// other Geom; however, if multiple Geoms with shared +// tables are transformed by the same matrix, they will +// no longer share tables after the operation. Consider +// using the GeomTransformer if you will be applying the +// same transform to multiple Geoms. +//////////////////////////////////////////////////////////////////// +void Geom:: +transform_vertices(const LMatrix4f &mat) { + PTA_Vertexf coords; + PTA_ushort index; + get_coords(coords, index); + PTA_Vertexf new_coords; + new_coords.reserve(coords.size()); + PTA_Vertexf::const_iterator vi; + for (vi = coords.begin(); vi != coords.end(); ++vi) { + new_coords.push_back((*vi) * mat); + } + nassertv(new_coords.size() == coords.size()); + set_coords(new_coords, index); +} + //////////////////////////////////////////////////////////////////// // Function: Geom::set_coords // Access: Public @@ -899,32 +959,3 @@ write_verbose(ostream &out, int indent_level) const { describe_attr(out, this, bind_normals, g_normals, true, indent_level + 2); } } - -//////////////////////////////////////////////////////////////////// -// Function: Geom::get_min_max -// Access: Public -// Description: Expands min and max, if necessary, to include the -// complete bounding rectangle that encloses all the -// vertices. -//////////////////////////////////////////////////////////////////// -void Geom:: -get_min_max(Vertexf &min, Vertexf &max) const { - int numv = _coords.size(); - - for (int i = 0; i < numv; i++) { - if (_coords[i][0] < min[0]) - min[0] = _coords[i][0]; - else if (_coords[i][0] > max[0]) - max[0] = _coords[i][0]; - - if (_coords[i][1] < min[1]) - min[1] = _coords[i][1]; - else if (_coords[i][1] > max[1]) - max[1] = _coords[i][1]; - - if (_coords[i][2] < min[2]) - min[2] = _coords[i][2]; - else if (_coords[i][2] > max[2]) - max[2] = _coords[i][2]; - } -} diff --git a/panda/src/gobj/geom.h b/panda/src/gobj/geom.h index 02e6ac3a25..f20bdaa95d 100644 --- a/panda/src/gobj/geom.h +++ b/panda/src/gobj/geom.h @@ -17,25 +17,22 @@ //////////////////////////////////////////////////////////////////// #ifndef GEOM_H #define GEOM_H -// -//////////////////////////////////////////////////////////////////// -// Includes -//////////////////////////////////////////////////////////////////// -#include + +#include "pandabase.h" #include "drawable.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "vector_typedWritable.h" +#include "pointerTo.h" +#include "pointerToArray.h" +#include "typedef.h" +#include "luse.h" +#include "pta_Vertexf.h" +#include "pta_Normalf.h" +#include "pta_Colorf.h" +#include "pta_TexCoordf.h" +#include "pta_ushort.h" +#include "pta_int.h" #include "texture.h" class Datagram; @@ -137,8 +134,10 @@ public: virtual void print_draw_immediate() const = 0; public: - - void get_min_max(Vertexf &min, Vertexf &max) const; + + void calc_tight_bounds(LPoint3f &min_point, LPoint3f &max_point, + bool &found_any) const; + void transform_vertices(const LMatrix4f &mat); void set_coords(const PTA_Vertexf &coords, const PTA_ushort &vindex =