home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / include / k3d / k3dsdk / polyhedron.h < prev    next >
Encoding:
C/C++ Source or Header  |  2009-03-12  |  10.0 KB  |  205 lines

  1. #ifndef K3DSDK_POLYHEDRON_H
  2. #define K3DSDK_POLYHEDRON_H
  3.  
  4. // K-3D
  5. // Copyright (c) 1995-2008, Timothy M. Shead
  6. //
  7. // Contact: tshead@k-3d.com
  8. //
  9. // This program is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. //
  14. // This program is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17. // General Public License for more details.
  18. //
  19. // You should have received a copy of the GNU General Public
  20. // License along with this program; if not, write to the Free Software
  21. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22.  
  23. /** \file Declares structures to add extra "convenience" data to a mesh
  24.     \author Timothy M. Shead (tshead@k-3d.com)
  25.     \author Bart Janssens (bart.janssens@lid.kviv.be)
  26. */
  27.  
  28. #include "mesh.h"
  29.  
  30. namespace k3d
  31. {
  32.  
  33. namespace polyhedron
  34. {
  35.  
  36. /// Defines allowable polyhedron types
  37. enum polyhedron_type
  38. {
  39.     POLYGONS = 0,
  40.     CATMULL_CLARK = 1,
  41. };
  42.  
  43. class primitive;
  44.  
  45. /// Gathers the member arrays of a polyhedron primitive into a convenient package
  46. class const_primitive
  47. {
  48. public:
  49.     const_primitive(
  50.         const mesh::indices_t& FirstFaces,
  51.         const mesh::counts_t& FaceCounts,
  52. //        const typed_array<int32_t>& PolyhedronTypes,
  53.         const mesh::polyhedra_t::types_t& PolyhedronTypes,
  54.         const mesh::indices_t& FaceFirstLoops,
  55.         const mesh::counts_t& FaceLoopCounts,
  56.         const mesh::selection_t& FaceSelections,
  57.         const mesh::materials_t& FaceMaterials,
  58.         const mesh::indices_t& LoopFirstEdges,
  59.         const mesh::indices_t& EdgePoints,
  60.         const mesh::indices_t& ClockwiseEdges,
  61.         const mesh::selection_t& EdgeSelections,
  62.         const mesh::attribute_arrays_t& ConstantData,
  63.         const mesh::attribute_arrays_t& UniformData,
  64.         const mesh::attribute_arrays_t& FaceVaryingData
  65.         );
  66.  
  67.     /// Implicit conversion
  68.     const_primitive(const primitive& Primitive);
  69.  
  70.     const mesh::indices_t& first_faces;
  71.     const mesh::counts_t& face_counts;
  72. //    const typed_array<int32_t>& polyhedron_types;
  73.     const mesh::polyhedra_t::types_t& polyhedron_types;
  74.     const mesh::indices_t& face_first_loops;
  75.     const mesh::counts_t& face_loop_counts;
  76.     const mesh::selection_t& face_selections;
  77.     const mesh::materials_t& face_materials;
  78.     const mesh::indices_t& loop_first_edges;
  79.     const mesh::indices_t& edge_points;
  80.     const mesh::indices_t& clockwise_edges;
  81.     const mesh::selection_t& edge_selections;
  82.     const mesh::attribute_arrays_t& constant_data;
  83.     const mesh::attribute_arrays_t& uniform_data;
  84.     const mesh::attribute_arrays_t& face_varying_data;
  85. };
  86.  
  87. /// Gathers the member arrays of a polyhedron primitive into a convenient package
  88. class primitive
  89. {
  90. public:
  91.     primitive(
  92.         mesh::indices_t& FirstFaces,
  93.         mesh::counts_t& FaceCounts,
  94. //        typed_array<int32_t>& PolyhedronTypes,
  95.         mesh::polyhedra_t::types_t& PolyhedronTypes,
  96.         mesh::indices_t& FaceFirstLoops,
  97.         mesh::counts_t& FaceLoopCounts,
  98.         mesh::selection_t& FaceSelections,
  99.         mesh::materials_t& FaceMaterials,
  100.         mesh::indices_t& LoopFirstEdges,
  101.         mesh::indices_t& EdgePoints,
  102.         mesh::indices_t& ClockwiseEdges,
  103.         mesh::selection_t& EdgeSelections,
  104.         mesh::attribute_arrays_t& ConstantData,
  105.         mesh::attribute_arrays_t& UniformData,
  106.         mesh::attribute_arrays_t& FaceVaryingData
  107.         );
  108.  
  109.     mesh::indices_t& first_faces;
  110.     mesh::counts_t& face_counts;
  111. //    typed_array<int32_t>& polyhedron_types;
  112.     mesh::polyhedra_t::types_t& polyhedron_types;
  113.     mesh::indices_t& face_first_loops;
  114.     mesh::counts_t& face_loop_counts;
  115.     mesh::selection_t& face_selections;
  116.     mesh::materials_t& face_materials;
  117.     mesh::indices_t& loop_first_edges;
  118.     mesh::indices_t& edge_points;
  119.     mesh::indices_t& clockwise_edges;
  120.     mesh::selection_t& edge_selections;
  121.     mesh::attribute_arrays_t& constant_data;
  122.     mesh::attribute_arrays_t& uniform_data;
  123.     mesh::attribute_arrays_t& face_varying_data;
  124. };
  125.  
  126. /// Creates a new polyhedron mesh primitive, returning references to its member arrays.
  127. /// The caller is responsible for the lifetime of the returned object.
  128. primitive* create(mesh& Mesh);
  129.  
  130. /// Creates a new polyhedron mesh primitive from a list of vertices and face indices, returning references to its member arrays.
  131. /// The caller is responsible for the lifetime of the returned object.
  132. primitive* create(mesh& Mesh, const mesh::points_t& Vertices, const mesh::counts_t& VertexCounts, const mesh::indices_t& VertexIndices, imaterial* const Material);
  133.  
  134. /// Creates a new polyhedron mesh primitive from a list of vertices, texture coordinates, and face indices, returning references to its member arrays.
  135. /// The caller is responsible for the lifetime of the returned object.
  136. primitive* create(mesh& Mesh, const mesh::points_t& Vertices, const mesh::counts_t& VertexCounts, const mesh::indices_t& VertexIndices, const mesh::texture_coordinates_t& TextureCoordinates, imaterial* const Material);
  137.  
  138. /// Creates a new polyhedron mesh primitive whose faces form a topological "grid" with the given number of rows and columns.
  139. /// The geometry (vertex coordinates) of the grid is undefined, and must be set by the caller after create_grid() returns.
  140. /// The caller is responsible for the lifetime of the returned object.
  141. primitive* create_grid(mesh& Mesh, const uint_t Rows, const uint_t Columns, imaterial* const Material);
  142. /// Creates a new polyhedron mesh primitive whose faces form a topological "cylinder" with the given number of rows and columns,
  143. /// and the first and last columns stitched-together.  The geometry (vertex coordinates) of the cylinder is undefined, and must
  144. /// be set by the caller after create_grid() returns.  Note that many surfaces-of-revolution can be represented as topological
  145. /// cylinders, including disks, cones, cylinders, hyperboloids, paraboloids, and spheres.  The caller is responsible for the
  146. /// lifetime of the returned object.
  147. primitive* create_cylinder(mesh& Mesh, const uint_t Rows, const uint_t Columns, imaterial* const Material);
  148.  
  149. /** \deprecated This method exists for the sole purpose of easing the transition to generic primitives. */
  150. const_primitive* validate(const mesh& Mesh);
  151. /** \deprecated This method exists for the sole purpose of easing the transition to generic primitives. */
  152. primitive* validate(mesh& Mesh);
  153.  
  154. /// Returns true iff every face in the given polyhedron is a triangle.
  155. const bool_t is_triangles(const const_primitive& Polyhedron);
  156. /// Returns true iff the given polyhedron is a solid (i.e. it has no topological holes).
  157. const bool_t is_solid(const const_primitive& Polyhedron);
  158. /// Returns true iff the given polyhedron should be rendered as a Subdivision surface
  159. /** \note The implementation looks at the flags set on the first (outer) shell.  We
  160. should consider whether SDS should be set on a per-shell basis? */
  161. const bool_t is_sds(const const_primitive& Polyhedron);
  162.  
  163. /// Calculates the center (average) for an edge loop (returns the origin for degenerate cases).
  164. const point3 center(const mesh::indices_t& EdgePoints, const mesh::indices_t& ClockwiseEdges, const mesh::points_t& Points, const uint_t EdgeIndex);
  165. /// Calculates the normal for an edge loop (returns a zero-length normal for degenerate cases).
  166. const normal3 normal(const mesh::indices_t& EdgePoints, const mesh::indices_t& ClockwiseEdges, const mesh::points_t& Points, const uint_t EdgeIndex);
  167.  
  168. /// Initializes arrays for constant-time lookup from an edge to the adjacent edge (if any)
  169. void create_edge_adjacency_lookup(const mesh::indices_t& EdgePoints, const mesh::indices_t& ClockwiseEdges, mesh::bools_t& BoundaryEdges, mesh::indices_t& AdjacentEdges);
  170.  
  171. /// Initializes an array for constant-time lookup from an edge to the face that owns it
  172. void create_edge_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& ClockwiseEdges, mesh::indices_t& EdgeFaces);
  173.  
  174. /// Initialize arrays for fast lookup from a vertex to its adjacent faces
  175. void create_vertex_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& EdgePoints, const mesh::indices_t& ClockwiseEdges, const mesh::points_t& Points, mesh::indices_t& PointFirstFaces, mesh::counts_t& PointFaceCounts, mesh::indices_t& PointFaces);
  176.  
  177. /// Initialize Valences array for constant time lookup of vertex valence (number of incoming edges)
  178. /**
  179.  * \param PointCount Initial guess for the number of points. Valences will be expanded to the correct size if this is too small
  180.  * \param EdgePoints The indices of the edge points
  181.  * \param Valences will store the number of edges for each point
  182.  */
  183. void create_vertex_valence_lookup(const uint_t PointCount, const mesh::indices_t& EdgePoints, mesh::counts_t& Valences);
  184.  
  185. /// Initialise boundary_faces array for constant time lookup of faces that are on the mesh boundary. BoundaryEdges and AdjacentEdges can be created using create_edge_adjacency_lookup
  186. void create_boundary_face_lookup(const mesh::indices_t& FaceFirstLoops, const mesh::indices_t& FaceLoopCounts, const mesh::indices_t& LoopFirstEdges, const mesh::indices_t& ClockwiseEdges, const mesh::bools_t& BoundaryEdges, const mesh::indices_t& AdjacentEdges, mesh::bools_t& BoundaryFaces);
  187.  
  188. /// Adds edges that are collinear and with points of valence 1 for boundary edges or valence 2 otherwise to EdgeList
  189. void mark_collinear_edges(mesh::indices_t& RedundantEdges, const mesh::selection_t& EdgeSelection, const mesh::points_t& Points, const mesh::indices_t& EdgePoints, const mesh::indices_t& ClockwiseEdges, const mesh::counts_t& VertexValences, const mesh::bools_t& BoundaryEdges, const mesh::indices_t& AdjacentEdges, const double_t Threshold = 1e-8);
  190.  
  191. /// Marks edges that are shared by coplanar faces among the selected faces
  192. void mark_coplanar_edges(const mesh::indices_t& Companions,
  193.         const mesh::bools_t& BoundaryEdges,
  194.         const mesh::normals_t& Normals,
  195.         const mesh::indices_t& EdgeFaces,
  196.         const mesh::selection_t& FaceSelection,
  197.         mesh::indices_t& RedundantEdges,
  198.         const double_t Threshold = 1e-8);
  199.  
  200. } // namespace polyhedron
  201.  
  202. } // namespace k3d
  203.  
  204. #endif // !K3DSDK_POLYHEDRON_H
  205.