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

  1. #ifndef K3DSDK_NURBS_CURVE_H
  2. #define K3DSDK_NURBS_CURVE_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 "mesh.h"
  24.  
  25. namespace k3d
  26. {
  27.  
  28. namespace nurbs_curve
  29. {
  30.  
  31. /// Gathers the member arrays of a nurbs_curve primitive into a convenient package
  32. class const_primitive
  33. {
  34. public:
  35.     const_primitive(
  36.         const mesh::indices_t& FirstCurves,
  37.         const mesh::counts_t& CurveCounts,
  38.         const mesh::materials_t& Materials,
  39.         const mesh::indices_t& CurveFirstPoints,
  40.         const mesh::counts_t& CurvePointCounts,
  41.         const mesh::orders_t& CurveOrders,
  42.         const mesh::indices_t& CurveFirstKnots,
  43.         const mesh::selection_t& CurveSelections,
  44.         const mesh::indices_t& CurvePoints,
  45.         const mesh::weights_t& CurvePointWeights,
  46.         const mesh::knots_t& CurveKnots,
  47.         const mesh::attribute_arrays_t& ConstantData,
  48.         const mesh::attribute_arrays_t& UniformData,
  49.         const mesh::attribute_arrays_t& VaryingData
  50.         );
  51.  
  52.     const mesh::indices_t& first_curves;
  53.     const mesh::counts_t& curve_counts;
  54.     const mesh::materials_t& materials;
  55.     const mesh::indices_t& curve_first_points;
  56.     const mesh::counts_t& curve_point_counts;
  57.     const mesh::orders_t& curve_orders;
  58.     const mesh::indices_t& curve_first_knots;
  59.     const mesh::selection_t& curve_selections;
  60.     const mesh::indices_t& curve_points;
  61.     const mesh::weights_t& curve_point_weights;
  62.     const mesh::knots_t& curve_knots;
  63.     const mesh::attribute_arrays_t& constant_data;
  64.     const mesh::attribute_arrays_t& uniform_data;
  65.     const mesh::attribute_arrays_t& varying_data;
  66. };
  67.  
  68. /// Gathers the member arrays of a nurbs_curve primitive into a convenient package
  69. class primitive
  70. {
  71. public:
  72.     primitive(
  73.         mesh::indices_t& FirstCurves,
  74.         mesh::counts_t& CurveCounts,
  75.         mesh::materials_t& Materials,
  76.         mesh::indices_t& CurveFirstPoints,
  77.         mesh::counts_t& CurvePointCounts,
  78.         mesh::orders_t& CurveOrders,
  79.         mesh::indices_t& CurveFirstKnots,
  80.         mesh::selection_t& CurveSelections,
  81.         mesh::indices_t& CurvePoints,
  82.         mesh::weights_t& CurvePointWeights,
  83.         mesh::knots_t& CurveKnots,
  84.         mesh::attribute_arrays_t& ConstantData,
  85.         mesh::attribute_arrays_t& UniformData,
  86.         mesh::attribute_arrays_t& VaryingData
  87.         );
  88.  
  89.  
  90.     mesh::indices_t& first_curves;
  91.     mesh::counts_t& curve_counts;
  92.     mesh::materials_t& materials;
  93.     mesh::indices_t& curve_first_points;
  94.     mesh::counts_t& curve_point_counts;
  95.     mesh::orders_t& curve_orders;
  96.     mesh::indices_t& curve_first_knots;
  97.     mesh::selection_t& curve_selections;
  98.     mesh::indices_t& curve_points;
  99.     mesh::weights_t& curve_point_weights;
  100.     mesh::knots_t& curve_knots;
  101.     mesh::attribute_arrays_t& constant_data;
  102.     mesh::attribute_arrays_t& uniform_data;
  103.     mesh::attribute_arrays_t& varying_data;
  104. };
  105.  
  106. /// Creates a new nurbs_curve mesh primitive, returning references to its member arrays.
  107. /// The caller is responsible for the lifetime of the returned object.
  108. primitive* create(mesh& Mesh);
  109.  
  110. /** \deprecated This method exists for the sole purpose of easing the transition to generic primitives. */
  111. const_primitive* validate(const mesh& Mesh);
  112. /** \deprecated This method exists for the sole purpose of easing the transition to generic primitives. */
  113. primitive* validate(mesh& Mesh);
  114.  
  115. /*
  116. /// Tests the given mesh primitive to see if it is a valid nurbs_curve primitive, returning references to its member arrays, or NULL.
  117. /// The caller is responsible for the lifetime of the returned object.
  118. const_primitive* validate(const mesh::primitive& GenericPrimitive);
  119. /// Tests the given mesh primitive to see if it is a valid nurbs_curve primitive, returning references to its member arrays, or NULL.
  120. /// The caller is responsible for the lifetime of the returned object.
  121. primitive* validate(mesh::primitive& GenericPrimitive);
  122. */
  123.  
  124. /// Adds a curve to an existing primitive, specified using the order of the curve and a set of control points.
  125. /// Control points will be assigned unity weights and an open uniform knot vector is automatically supplied.
  126. void add_curve(mesh& Mesh, primitive& Primitive, const uint_t Order, const mesh::points_t& ControlPoints, const uint_t RepeatPoints = 0);
  127. /// Adds a curve to an existing primitive, specified using the order of the curve and a set of control points and control point weights.
  128. /// An open uniform knot vector is automatically supplied.
  129. void add_curve(mesh& Mesh, primitive& Primitive, const uint_t Order, const mesh::points_t& ControlPoints, const mesh::weights_t& Weights, const uint_t RepeatPoints = 0);
  130. /// Adds a curve to an existing primitive, specified using the order of the curve and a set of control points, control point weights, and knot vector.
  131. void add_curve(mesh& Mesh, primitive& Primitive, const uint_t Order, const mesh::points_t& ControlPoints, const mesh::weights_t& Weights, const mesh::knots_t& Knots, const uint_t RepeatPoints = 0);
  132.  
  133. /** Computes a set of control points, weights, and knots that define an order-3 circular arc centered at the origin
  134.     \param X Defines the X axis of the plane containing the arc
  135.     \param Y Defines the Y axis of the plane containing the arc
  136.     \param StartAngle Start angle of the arc in radians
  137.     \param EndAngle End angle of the arc in radians
  138.     \param Segments The number of NURBS segments in the resulting arc
  139.     \param Knots Output container for the resulting arc knot vector
  140.     \param Weights Output container for the resulting arc control point weights
  141.     \param ControlPoints Output container for the resulting arc control point positions
  142. */
  143. void circular_arc(const vector3& X, const vector3& Y, const double_t StartAngle, const double_t EndAngle, const uint_t Segments, mesh::knots_t& Knots, mesh::weights_t& Weights, mesh::points_t& ControlPoints);
  144.  
  145. } // namespace nurbs_curve
  146.  
  147. } // namespace k3d
  148.  
  149. #endif // !K3DSDK_NURBS_CURVE_H
  150.  
  151.