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

  1. #ifndef K3DSDK_MESH_H
  2. #define K3DSDK_MESH_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. #include "attribute_arrays.h"
  24. #include "bounding_box3.h"
  25. #include "named_attribute_arrays.h"
  26. #include "named_arrays.h"
  27. #include "named_array_types.h"
  28. #include "pipeline_data.h"
  29. #include "typed_array.h"
  30. #include "uint_t_array.h"
  31.  
  32. namespace k3d
  33. {
  34.  
  35. class imaterial;
  36. class mesh_selection;
  37.  
  38. namespace legacy { class mesh; }
  39.  
  40. ////////////////////////////////////////////////////////////////////////////////
  41. // mesh
  42.  
  43. /// Encapsulates a hetereogenous collection of geometric primitives
  44. class mesh
  45. {
  46. public:
  47.     mesh();
  48.  
  49.     /// Defines storage for a collection of indices
  50.     typedef uint_t_array indices_t;
  51.     /// Defines storage for a collection of counts
  52.     typedef uint_t_array counts_t;
  53.     /// Defines storage for a collection of orders
  54.     typedef uint_t_array orders_t;
  55.     /// Defines storage for a collection of weights
  56.     typedef typed_array<double_t> weights_t;
  57.     /// Defines storage for a collection of knot vectors
  58.     typedef typed_array<double_t> knots_t;
  59.     /// Defines storage for gprim selection state
  60.     typedef typed_array<double_t> selection_t;
  61.     /// Defines storage for gprim materials
  62.     typedef typed_array<imaterial*> materials_t;
  63.     /// Defines storage for a generic collection of boolean values
  64.     typedef typed_array<bool_t> bools_t;
  65.     /// Defines storage for a generic collection of colors
  66.     typedef typed_array<color> colors_t;
  67.     /// Defines storage for a generic collection of floating-point values
  68.     typedef typed_array<double_t> doubles_t;
  69.     /// Defines storage for a generic collection of 4x4 matrices
  70.     typedef typed_array<matrix4> matrices_t;
  71.     /// Defines storage for a generic collection of 3D normals
  72.     typedef typed_array<normal3> normals_t;
  73.     /// Defines storage for a generic collection of 2D points
  74.     typedef typed_array<point2> points_2d_t;
  75.     /// Defines storage for a generic collection of 3D points
  76.     typedef typed_array<point3> points_t;
  77.     /// Defines storage for a generic collection of 3D texture coordinates
  78.     typedef typed_array<texture3> texture_coordinates_t;
  79.     /// Defines storage for a generic collection of 3D vectors
  80.     typedef typed_array<vector3> vectors_t;
  81.     /// Defines a heterogeneous collection of named, shared arrays with varying lengths
  82.     typedef k3d::named_arrays named_arrays_t;
  83.     /// Defines a heterogeneous collection of named, shared arrays with identical length
  84.     typedef k3d::attribute_arrays attribute_arrays_t;
  85.     /// Defines a named collection of attribute arrays
  86.     typedef k3d::named_attribute_arrays named_attribute_arrays_t;
  87.  
  88.     /// Defines storage for a generic mesh primitive
  89.     class primitive
  90.     {
  91.     public:
  92.         primitive(const string_t& Type);
  93.  
  94.         /// Stores the primitive type ("point_groups", "polyhedra", "teapot", etc.)
  95.         string_t type;
  96.         /// Stores array data that defines the primitive's structure (topology and geometry)
  97.         named_arrays_t structure;
  98.         /// Stores array data that defines the primitive's attributes
  99.         named_attribute_arrays_t attributes;
  100.  
  101.         /// Compares two primitives for equality using the fuzzy semantics of almost_equal
  102.         const bool_t almost_equal(const primitive& Other, const uint64_t Threshold) const;
  103.     };
  104.  
  105.     /// Defines storage for a collection of primitives
  106.     class primitives_t :
  107.         public std::vector<pipeline_data<primitive> >
  108.     {
  109.     public:
  110.         primitive& create(const string_t& Type);
  111.     };
  112.  
  113.     /// Defines storage for NURBS curve groups
  114.     class nurbs_curve_groups_t
  115.     {
  116.     public:
  117.         /// Stores the set of per-curve-group first points
  118.         pipeline_data<indices_t> first_curves;
  119.         /// Stores the set of per-curve-group curve counts
  120.         pipeline_data<counts_t> curve_counts;
  121.         /// Stores the set of per-curve-group materials
  122.         pipeline_data<materials_t> materials;
  123.         /// Stores user-defined per-curve-group data (maps to RenderMan constant data)
  124.         attribute_arrays_t constant_data;
  125.         /// Stores the set of per-curve first points
  126.         pipeline_data<indices_t> curve_first_points;
  127.         /// Stores the set of per-curve point counts
  128.         pipeline_data<counts_t> curve_point_counts;
  129.         /// Stores the set of per-curve orders
  130.         pipeline_data<orders_t> curve_orders;
  131.         /// Stores the set of per-curve first knots
  132.         pipeline_data<indices_t> curve_first_knots;
  133.         /// Stores per-curve selection state
  134.         pipeline_data<selection_t> curve_selection;
  135.         /// Stores user-defined per-curve data (maps to RenderMan uniform data)
  136.         attribute_arrays_t uniform_data;
  137.         /// Stores per-curve control points
  138.         pipeline_data<indices_t> curve_points;
  139.         /// Stores user-defined per-curve control point data (maps to RenderMan varying data)
  140.         attribute_arrays_t varying_data;
  141.         /// Stores per-curve control point weights
  142.         pipeline_data<weights_t> curve_point_weights;
  143.         /// Stores per-curve knot vectors
  144.         pipeline_data<knots_t> curve_knots;
  145.     };
  146.  
  147.     /// Defines storage for NURBS patches
  148.     class nurbs_patches_t
  149.     {
  150.     public:
  151.         /// Stores the set of per-patch first points
  152.         pipeline_data<indices_t> patch_first_points;
  153.         /// Stores the set of per-patch point counts in the U parametric direction
  154.         pipeline_data<counts_t> patch_u_point_counts;
  155.         /// Stores the set of per-patch point counts in the V parametric direction
  156.         pipeline_data<counts_t> patch_v_point_counts;
  157.         /// Stores the set of per-patch orders in the U parametric direction
  158.         pipeline_data<orders_t> patch_u_orders;
  159.         /// Stores the set of per-patch orders in the V parametric direction
  160.         pipeline_data<orders_t> patch_v_orders;
  161.         /// Stores the set of per-patch first knots in the U parametric direction
  162.         pipeline_data<indices_t> patch_u_first_knots;
  163.         /// Stores the set of per-patch first knots in the V parametric direction
  164.         pipeline_data<indices_t> patch_v_first_knots;
  165.         /// Stores per-patch selection state
  166.         pipeline_data<selection_t> patch_selection;
  167.         /// Stores per-patch materials
  168.         pipeline_data<materials_t> patch_materials;
  169.         /// Stores user-defined per-patch data (maps to RenderMan constant data)
  170.         attribute_arrays_t constant_data;
  171.         /// Stores user-defined per-patch data (maps to RenderMan uniform data)
  172.         attribute_arrays_t uniform_data;
  173.         /// Stores per-patch control points
  174.         pipeline_data<indices_t> patch_points;
  175.         /// Stores per-patch control point weights
  176.         pipeline_data<weights_t> patch_point_weights;
  177.         /// Stores per-patch knot vectors in the U parametric direction
  178.         pipeline_data<knots_t> patch_u_knots;
  179.         /// Stores per-patch knot vectors in the V parametric direction
  180.         pipeline_data<knots_t> patch_v_knots;
  181.         /// Stores user-defined per-parametric-corner data (maps to RenderMan varying data)
  182.         attribute_arrays_t varying_data;
  183.         /// Stores the number of trim curve loops for each patch
  184.         pipeline_data<counts_t> patch_trim_curve_loop_counts;
  185.         /// Stores the first trim curve loop (index into first_trim_curves) for each patch
  186.         pipeline_data<indices_t> patch_first_trim_curve_loops;
  187.         /// Stores the trim curve control points, expressed in parameter space
  188.         pipeline_data<points_2d_t> trim_points;
  189.         /// Stores the trim curve control point selection
  190.         pipeline_data<selection_t> trim_point_selection;
  191.         /// Stores the set of per-curve-loop first curves (index into trim_curve_first_points)
  192.         pipeline_data<indices_t> first_trim_curves;
  193.         /// Stores the set of per-curve-loop curve counts
  194.         pipeline_data<counts_t> trim_curve_counts;
  195.         /// Stores per-curve-loop selection
  196.         pipeline_data<selection_t> trim_curve_loop_selection;
  197.         /// Stores the set of per-curve first points
  198.         pipeline_data<indices_t> trim_curve_first_points;
  199.         /// Stores the set of per-curve point counts
  200.         pipeline_data<counts_t> trim_curve_point_counts;
  201.         /// Stores the set of per-curve orders
  202.         pipeline_data<orders_t> trim_curve_orders;
  203.         /// Stores the set of per-curve first knots
  204.         pipeline_data<indices_t> trim_curve_first_knots;
  205.         /// Stores per-curve selection state
  206.         pipeline_data<selection_t> trim_curve_selection;
  207.         /// Stores per-curve control points
  208.         pipeline_data<indices_t> trim_curve_points;
  209.         /// Stores per-curve control point weights
  210.         pipeline_data<weights_t> trim_curve_point_weights;
  211.         /// Stores per-curve knot vectors
  212.         pipeline_data<knots_t> trim_curve_knots;
  213.     };
  214.  
  215.     /// Defines storage for polyhedra (polygons and subdivision surfaces)
  216.     class polyhedra_t
  217.     {
  218.     public:
  219.         /// Defines allowable polyhedron types
  220.         typedef enum
  221.         {
  222.             POLYGONS,
  223.             CATMULL_CLARK,
  224.         } polyhedron_type;
  225.  
  226.         /// Defines storage for per-polyhedron types
  227.         typedef typed_array<polyhedron_type> types_t;
  228.  
  229.         /// Stores per-polyhedron first faces
  230.         pipeline_data<indices_t> first_faces;
  231.         /// Stores per-polyhedron face counts
  232.         pipeline_data<counts_t> face_counts;
  233.         /// Stores per-polyhedron types
  234.         pipeline_data<types_t> types;
  235.         /// Stores user-defined per-polyhedron data (maps to RenderMan constant data)
  236.         attribute_arrays_t constant_data;
  237.         /// Stores per-face first loops
  238.         pipeline_data<indices_t> face_first_loops;
  239.         /// Stores per-face loop counts
  240.         pipeline_data<counts_t> face_loop_counts;
  241.         /// Stores per-face selection state
  242.         pipeline_data<selection_t> face_selection;
  243.         /// Stores per-face materials
  244.         pipeline_data<materials_t> face_materials;
  245.         /// Stores user-defined per-face data (maps to RenderMan uniform data)
  246.         attribute_arrays_t uniform_data;
  247.         /// Stores per-loop first edges
  248.         pipeline_data<indices_t> loop_first_edges;
  249.         /// Stores the start point of each edge
  250.         pipeline_data<indices_t> edge_points;
  251.         /// Stores the next edge in clockwise direction
  252.         pipeline_data<indices_t> clockwise_edges;
  253.         /// Stores per-edge selection state
  254.         pipeline_data<selection_t> edge_selection;
  255.         /// Stores user-defined per-edge data (maps to RenderMan facevarying data)
  256.         attribute_arrays_t face_varying_data;
  257.     };
  258.  
  259.     /// Stores the set of mesh points
  260.     pipeline_data<points_t> points;
  261.     /// Stores per-point selection state
  262.     pipeline_data<selection_t> point_selection;
  263.     /// Stores user-defined per-point data (maps to RenderMan vertex data)
  264.     attribute_arrays_t vertex_data;
  265.     /// Stores mesh primitives
  266.     primitives_t primitives;
  267.  
  268.     /// Stores nurbs curve groups
  269.     pipeline_data<nurbs_curve_groups_t> nurbs_curve_groups;
  270.     /// Stores nurbs patches
  271.     pipeline_data<nurbs_patches_t> nurbs_patches;
  272.     /// Stores polyhedra
  273.     pipeline_data<polyhedra_t> polyhedra;
  274.  
  275.     /// Compares two meshes for equality using the fuzzy semantics of almost_equal
  276.     const bool_t almost_equal(const mesh& Other, const uint64_t Threshold) const;
  277.  
  278.     /// Conversion from a legacy mesh to a new mesh
  279.     mesh& operator=(const k3d::legacy::mesh& RHS);
  280.  
  281.     /// Returns a bounding-box containing every point in the given mesh.
  282.     static const bounding_box3 bounds(const mesh& Mesh);
  283.     /// Returns a bounding-box containing every point in the given array.
  284.     static const bounding_box3 bounds(const points_t& Points);
  285.     /// Initialize an array to mark unused mesh points (points not used by any primitive).
  286.     static void lookup_unused_points(const mesh& Mesh, mesh::bools_t& UnusedPoints);
  287.     /// Remove unused points from a mesh, adjusting point indices in all remaining primitives.
  288.     static void delete_unused_points(mesh& Mesh);
  289.     /// Performs a deep-copy from one mesh to another (the new mesh doesn't share any memory with the old).
  290.     static void deep_copy(const mesh& From, mesh& To);
  291.  
  292.     /// Iterates over every array in a generic mesh primitive, passing the array name and array to a functor.
  293.     template<typename FunctorT>
  294.     static void visit_arrays(const mesh::primitive& Primitive, FunctorT Functor)
  295.     {
  296.         for(mesh::named_arrays_t::const_iterator array = Primitive.structure.begin(); array != Primitive.structure.end(); ++array)
  297.             Functor(array->first, array->second);
  298.  
  299.         for(mesh::named_attribute_arrays_t::const_iterator attributes = Primitive.attributes.begin(); attributes != Primitive.attributes.end(); ++attributes)
  300.         {
  301.             for(mesh::attribute_arrays_t::const_iterator array = attributes->second.begin(); array != attributes->second.end(); ++array)
  302.                 Functor(array->first, array->second);
  303.         }
  304.     }
  305.  
  306.     /// Iterates over every array in a generic mesh primitive, passing the array name and array to a functor.
  307.     template<typename FunctorT>
  308.     static void visit_arrays(mesh::primitive& Primitive, FunctorT Functor)
  309.     {
  310.         for(mesh::named_arrays_t::iterator array = Primitive.structure.begin(); array != Primitive.structure.end(); ++array)
  311.             Functor(array->first, array->second);
  312.  
  313.         for(mesh::named_attribute_arrays_t::iterator attributes = Primitive.attributes.begin(); attributes != Primitive.attributes.end(); ++attributes)
  314.         {
  315.             for(mesh::attribute_arrays_t::iterator array = attributes->second.begin(); array != attributes->second.end(); ++array)
  316.                 Functor(array->first, array->second);
  317.         }
  318.     }
  319.  
  320.     /// Iterates over every array in every generic primitive in the given mesh, passing the array name and array to a functor.
  321.     template<typename FunctorT>
  322.     static void visit_arrays(const mesh& Mesh, FunctorT Functor)
  323.     {
  324.         for(mesh::primitives_t::const_iterator p = Mesh.primitives.begin(); p != Mesh.primitives.end(); ++p)
  325.             visit_arrays(**p, Functor);
  326.     }
  327.  
  328.     /// Iterates over every array in every generic primitive in the given mesh, passing the array name and array to a functor.
  329.     template<typename FunctorT>
  330.     static void visit_arrays(mesh& Mesh, FunctorT Functor)
  331.     {
  332.         for(mesh::primitives_t::iterator p = Mesh.primitives.begin(); p != Mesh.primitives.end(); ++p)
  333.             visit_arrays(p->writable(), Functor);
  334.     }
  335. };
  336.  
  337. /// Stream serialization
  338. std::ostream& operator<<(std::ostream& Stream, const mesh::polyhedra_t::polyhedron_type& RHS);
  339. /// Stream extraction
  340. std::istream& operator>>(std::istream& Stream, mesh::polyhedra_t::polyhedron_type& RHS);
  341.  
  342. /// Stream serialization
  343. std::ostream& operator<<(std::ostream& Stream, const mesh& RHS);
  344.  
  345. template<>
  346. class almost_equal<mesh::polyhedra_t::polyhedron_type>
  347. {
  348. public:
  349.     almost_equal(const uint64_t) { } 
  350.     inline const bool_t operator()(const mesh::polyhedra_t::polyhedron_type A, const mesh::polyhedra_t::polyhedron_type B) const { return A == B; }
  351. };
  352.  
  353. /// Specialization of almost_equal that tests k3d::mesh for equality
  354. template<>
  355. class almost_equal<mesh>
  356. {
  357.     typedef mesh T;
  358.  
  359. public:
  360.     almost_equal(const uint64_t Threshold) :
  361.         threshold(Threshold)
  362.     {
  363.     }
  364.  
  365.     inline const bool_t operator()(const T& A, const T& B) const
  366.     {
  367.         return A.almost_equal(B, threshold);
  368.     }
  369.  
  370.     const uint64_t threshold;
  371. };
  372.  
  373. /// Specialization of almost_equal that tests k3d::mesh::primitive for equality
  374. template<>
  375. class almost_equal<mesh::primitive>
  376. {
  377.     typedef mesh::primitive T;
  378.  
  379. public:
  380.     almost_equal(const uint64_t Threshold) :
  381.         threshold(Threshold)
  382.     {
  383.     }
  384.  
  385.     inline const bool_t operator()(const T& A, const T& B) const
  386.     {
  387.         return A.almost_equal(B, threshold);
  388.     }
  389.  
  390.     const uint64_t threshold;
  391. };
  392.  
  393. } // namespace k3d
  394.  
  395. #endif // !K3DSDK_MESH_H
  396.  
  397.