home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mesa5.zip / mesa5src.zip / nurbs.h < prev    next >
C/C++ Source or Header  |  2000-07-11  |  6KB  |  254 lines

  1. /* $Id: nurbs.h,v 1.3 2000/07/11 14:11:04 brianp Exp $ */
  2.  
  3. /*
  4.  * Mesa 3-D graphics library
  5.  * Version:  3.3
  6.  * Copyright (C) 1995-2000  Brian Paul
  7.  *
  8.  * This library is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Library General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2 of the License, or (at your option) any later version.
  12.  *
  13.  * This library is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Library General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Library General Public
  19.  * License along with this library; if not, write to the Free
  20.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  */
  22.  
  23.  
  24. /*
  25.  * NURBS implementation written by Bogdan Sikorski (bogdan@cira.it)
  26.  * See README2 for more info.
  27.  */
  28.  
  29.  
  30. #ifndef NURBS_H
  31. #define NURBS_H
  32.  
  33.  
  34. #define EPSILON 1e-06        /* epsilon for double precision compares */
  35.  
  36. typedef enum
  37. {
  38.    GLU_NURBS_CURVE, GLU_NURBS_SURFACE, GLU_NURBS_TRIM, GLU_NURBS_NO_TRIM,
  39.    GLU_NURBS_TRIM_DONE, GLU_NURBS_NONE
  40. }
  41. GLU_nurbs_enum;
  42.  
  43. typedef enum
  44. {
  45.    GLU_TRIM_NURBS, GLU_TRIM_PWL
  46. }
  47. GLU_trim_enum;
  48.  
  49. typedef struct
  50. {
  51.    GLint sknot_count;
  52.    GLfloat *sknot;
  53.    GLint tknot_count;
  54.    GLfloat *tknot;
  55.    GLint s_stride;
  56.    GLint t_stride;
  57.    GLfloat *ctrlarray;
  58.    GLint sorder;
  59.    GLint torder;
  60.    GLint dim;
  61.    GLenum type;
  62. }
  63. surface_attribs;
  64.  
  65. typedef struct
  66. {
  67.    surface_attribs geom;
  68.    surface_attribs color;
  69.    surface_attribs texture;
  70.    surface_attribs normal;
  71. }
  72. nurbs_surface;
  73.  
  74. typedef struct
  75. {
  76.    GLint knot_count;
  77.    GLfloat *knot;
  78.    GLint stride;
  79.    GLfloat *ctrlarray;
  80.    GLint order;
  81.    GLint dim;
  82.    GLenum type;
  83. }
  84. curve_attribs;
  85.  
  86. typedef struct
  87. {
  88.    GLint pt_count;
  89.    GLfloat *ctrlarray;
  90.    GLint stride;
  91.    GLint dim;
  92.    GLenum type;
  93. }
  94. pwl_curve_attribs;
  95.  
  96. typedef struct
  97. {
  98.    curve_attribs geom;
  99.    curve_attribs color;
  100.    curve_attribs texture;
  101.    curve_attribs normal;
  102. }
  103. nurbs_curve;
  104.  
  105. typedef struct trim_list_str
  106. {
  107.    GLU_trim_enum trim_type;
  108.    union
  109.    {
  110.       pwl_curve_attribs pwl_curve;
  111.       curve_attribs nurbs_curve;
  112.    }
  113.    curve;
  114.    struct trim_list_str *next;
  115. }
  116. trim_list;
  117.  
  118. typedef struct seg_trim_str
  119. {
  120.    GLfloat *points;
  121.    GLint pt_cnt, seg_array_len;
  122.    struct seg_trim_str *next;
  123. }
  124. trim_segments;
  125.  
  126. typedef struct nurbs_trim_str
  127. {
  128.    trim_list *trim_loop;
  129.    trim_segments *segments;
  130.    struct nurbs_trim_str *next;
  131. }
  132. nurbs_trim;
  133.  
  134. typedef struct
  135. {
  136.    GLfloat model[16], proj[16], viewport[4];
  137. }
  138. culling_and_sampling_str;
  139.  
  140. struct GLUnurbs
  141. {
  142.    GLboolean culling;
  143.    GLenum error;
  144.    void (GLCALLBACK * error_callback) (GLenum err);
  145.    GLenum display_mode;
  146.    GLU_nurbs_enum nurbs_type;
  147.    GLboolean auto_load_matrix;
  148.      culling_and_sampling_str sampling_matrices;
  149.    GLenum sampling_method;
  150.    GLfloat sampling_tolerance;
  151.    GLfloat parametric_tolerance;
  152.    GLint u_step, v_step;
  153.    nurbs_surface surface;
  154.    nurbs_curve curve;
  155.    nurbs_trim *trim;
  156. };
  157.  
  158. typedef struct
  159. {
  160.    GLfloat *knot;
  161.    GLint nknots;
  162.    GLfloat *unified_knot;
  163.    GLint unified_nknots;
  164.    GLint order;
  165.    GLint t_min, t_max;
  166.    GLint delta_nknots;
  167.    GLboolean open_at_begin, open_at_end;
  168.    GLfloat *new_knot;
  169.    GLfloat *alpha;
  170. }
  171. knot_str_type;
  172.  
  173. typedef struct
  174. {
  175.    GLfloat *geom_ctrl;
  176.    GLint geom_s_stride, geom_t_stride;
  177.    GLfloat **geom_offsets;
  178.    GLint geom_s_pt_cnt, geom_t_pt_cnt;
  179.    GLfloat *color_ctrl;
  180.    GLint color_s_stride, color_t_stride;
  181.    GLfloat **color_offsets;
  182.    GLint color_s_pt_cnt, color_t_pt_cnt;
  183.    GLfloat *normal_ctrl;
  184.    GLint normal_s_stride, normal_t_stride;
  185.    GLfloat **normal_offsets;
  186.    GLint normal_s_pt_cnt, normal_t_pt_cnt;
  187.    GLfloat *texture_ctrl;
  188.    GLint texture_s_stride, texture_t_stride;
  189.    GLfloat **texture_offsets;
  190.    GLint texture_s_pt_cnt, texture_t_pt_cnt;
  191.    GLint s_bezier_cnt, t_bezier_cnt;
  192. }
  193. new_ctrl_type;
  194.  
  195. extern void call_user_error(GLUnurbsObj * nobj, GLenum error);
  196.  
  197. extern GLenum test_knot(GLint nknots, GLfloat * knot, GLint order);
  198.  
  199. extern GLenum explode_knot(knot_str_type * the_knot);
  200.  
  201. extern GLenum calc_alphas(knot_str_type * the_knot);
  202.  
  203. extern GLenum calc_new_ctrl_pts(GLfloat * ctrl, GLint stride,
  204.                 knot_str_type * the_knot, GLint dim,
  205.                 GLfloat ** new_ctrl, GLint * ncontrol);
  206.  
  207. extern GLenum glu_do_sampling_crv(GLUnurbsObj * nobj, GLfloat * new_ctrl,
  208.                   GLint n_ctrl, GLint order, GLint dim,
  209.                   GLint ** factors);
  210.  
  211. extern GLenum glu_do_sampling_3D(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl,
  212.                  int **sfactors, GLint ** tfactors);
  213.  
  214. extern GLenum glu_do_sampling_uv(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl,
  215.                  int **sfactors, GLint ** tfactors);
  216.  
  217. extern GLenum glu_do_sampling_param_3D(GLUnurbsObj * nobj,
  218.                        new_ctrl_type * new_ctrl,
  219.                        int **sfactors, GLint ** tfactors);
  220.  
  221. extern GLboolean fine_culling_test_2D(GLUnurbsObj * nobj, GLfloat * ctrl,
  222.                       GLint n_ctrl, GLint stride, GLint dim);
  223.  
  224. extern GLboolean fine_culling_test_3D(GLUnurbsObj * nobj, GLfloat * ctrl,
  225.                       GLint s_n_ctrl, GLint t_n_ctrl,
  226.                       GLint s_stride, GLint t_stride,
  227.                       GLint dim);
  228.  
  229. extern void do_nurbs_curve(GLUnurbsObj * nobj);
  230.  
  231. extern void do_nurbs_surface(GLUnurbsObj * nobj);
  232.  
  233. extern GLenum patch_trimming(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl,
  234.                  GLint * sfactors, GLint * tfactors);
  235.  
  236. extern void collect_unified_knot(knot_str_type * dest, knot_str_type * src,
  237.                  GLfloat maximal_min_knot,
  238.                  GLfloat minimal_max_knot);
  239.  
  240. extern GLenum select_knot_working_range(GLUnurbsObj * nobj,
  241.                     knot_str_type * geom_knot,
  242.                     knot_str_type * color_knot,
  243.                     knot_str_type * normal_knot,
  244.                     knot_str_type * texture_knot);
  245.  
  246. extern void free_unified_knots(knot_str_type * geom_knot,
  247.                    knot_str_type * color_knot,
  248.                    knot_str_type * normal_knot,
  249.                    knot_str_type * texture_knot);
  250.  
  251.  
  252.  
  253. #endif
  254.