raybezd.h

Go to the documentation of this file.
00001 
00002 /* ///////////////////////////////////////////////////////////////////////// */
00003 /* This file is a part of the BSTools package                                */
00004 /* written by Przemyslaw Kiciak                                              */
00005 /* ///////////////////////////////////////////////////////////////////////// */
00006 /* (C) Copyright by Przemyslaw Kiciak, 2005, 2013                            */
00007 /* this package is distributed under the terms of the                        */
00008 /* Lesser GNU Public License, see the file COPYING.LIB                       */
00009 /* ///////////////////////////////////////////////////////////////////////// */
00010 
00011 /* Header file for the libraybez library of C procedures -               */
00012 /* ray tracing of Bezier patches                                         */ 
00013 
00014 #ifndef CONST_  /* a dirty trick to suppress many compiler warnings */
00015 #define CONST_ const
00016 #endif
00017 
00018 #ifndef RAYBEZD_H
00019 #define RAYBEZD_H
00020 
00021 #ifndef PKGEOM_H
00022 #include "pkgeom.h"
00023 #endif
00024 
00025 #ifndef MULTIBS_H
00026 #include "multibs.h"
00027 #endif
00028 
00029 #ifdef __cplusplus   
00030 extern "C" {
00031 #endif
00032 
00033 typedef struct _BezPatchTreeVertexd {
00034   struct _BezPatchTreeVertexd *left, *right,  /* pointers to subtrees */
00035             *up;                              /* and up */
00036   point3d   *ctlpoints;                       /* pointer to array */
00037                                               /* of control points */
00038   vector3d  *normalvect;                      /* optional patch to describe */
00039                                               /* the normal vector */
00040   double    u0, u1, v0, v1;                   /* patch piece domain */
00041   Box3d     bbox;                             /* bounding box */
00042   point3d   pcent;                            /* patch central point */
00043   vector3d  nvcent;
00044   double    maxder;                           /* maximal derivative */
00045   short int level;
00046   char      divdir;                           /* 0 - divide u */
00047                                               /* 1 - divide v */
00048   boolean   leaf;
00049 } BezPatchTreeVertexd, *BezPatchTreeVertexdp;
00050 
00051 typedef struct {
00052   int                  object_id;  /* to be used by applications */
00053   unsigned char        n, m;       /* degree of the patch */
00054   unsigned int         cpsize;     /* size of array of control points */
00055   unsigned char        vn, vm;     /* degree of the normal vector patch */
00056   unsigned int         nvsize;     /* size of array of yhe normal vector patch */
00057                                    /* control points */
00058   BezPatchTreeVertexdp root;       /* root vertex representing the whole patch */
00059 } BezPatchTreed, *BezPatchTreedp;
00060 
00061 
00062 typedef struct _RBezPatchTreeVertexd {
00063   struct _RBezPatchTreeVertexd *left, *right,  /* pointers to subtrees */
00064             *up;                              /* and up */
00065   point4d   *ctlpoints;                       /* pointer to array */
00066                                               /* of control points */
00067   vector3d  *normalvect;                      /* optional patch to describe */
00068                                               /* the normal vector */
00069   double    u0, u1, v0, v1;                   /* patch piece domain */
00070   Box3d     bbox;                             /* bounding box */
00071   point3d   pcent;                            /* patch central point */
00072   vector3d  nvcent;
00073   double    maxder;                           /* maximal derivative */
00074   short int level;
00075   char      divdir;                           /* 0 - divide u */
00076                                               /* 1 - divide v */
00077   boolean   leaf;
00078 } RBezPatchTreeVertexd, *RBezPatchTreeVertexdp;
00079 
00080 typedef struct {
00081   int                  object_id;  /* to be used by applications */
00082   unsigned char        n, m;       /* degree of the patch */
00083   unsigned int         cpsize;     /* size of array of control points */
00084   unsigned char        vn, vm;     /* degree of the normal vector patch */
00085   unsigned int         nvsize;     /* size of array of yhe normal vector patch */
00086                                    /* control points */
00087   RBezPatchTreeVertexdp root;      /* root vertex representing the whole patch */
00088 } RBezPatchTreed, *RBezPatchTreedp;
00089 
00090 
00091 typedef struct _BezCurveTreeVertexd {
00092     struct _BezCurveTreeVertexd *left, *right,
00093                                 *up;    /* pointers to subtrees and up */
00094     point3d *ctlpoints;                 /* pointer to array of control points */
00095     double  t0, t1;                     /* parameter range */
00096     Box3d   bbox;                       /* bounding box */
00097     point3d ccent;                      /* curve central point */
00098     double  maxder;
00099     short   level;                      /* subdivision level */
00100     boolean leaf;
00101     char    pad;
00102   } BezCurveTreeVertexd, *BezCurveTreeVertexdp;
00103 
00104 typedef struct {
00105     int    object_id;           /* for applications */
00106     short  degree;              /* curve degree */
00107     short  cpsize;              /* size of array of control points */
00108     double ext;                 /* box extension */
00109     BezCurveTreeVertexdp root;  /* root vertex */
00110   } BezCurveTreed, *BezCurveTreedp;
00111 
00112 
00113 typedef struct _RBezCurveTreeVertexd {
00114     struct _RBezCurveTreeVertexd *left, *right,
00115                                  *up;   /* pointers to subtrees and up */
00116     point4d *ctlpoints;                 /* pointer to array of control points */
00117     double  t0, t1;                     /* parameter range */
00118     Box3d   bbox;                       /* bounding box */
00119     point3d ccent;                      /* curve central point */
00120     double  maxder;
00121     short   level;                      /* subdivision level */
00122     boolean leaf;
00123     char    pad;
00124   } RBezCurveTreeVertexd, *RBezCurveTreeVertexdp;
00125 
00126 typedef struct {
00127     int    object_id;            /* for applications */
00128     short  degree;               /* curve degree */
00129     short  cpsize;               /* size of array of control points */
00130     double ext;                  /* box extension */
00131     RBezCurveTreeVertexdp root;  /* root vertex */
00132   } RBezCurveTreed, *RBezCurveTreedp;
00133 
00134 
00135 typedef struct {
00136   int      object_id;  /* to be used by applications */
00137   point3d  p;
00138   vector3d nv;
00139   double   u, v, t;
00140 } RayObjectIntersd, *RayObjectIntersdp;
00141 
00142 
00143 BezPatchTreedp
00144   rbez_NewBezPatchTreed ( int object_id,
00145                           unsigned char n, unsigned char m,
00146                           double u0, double u1, double v0, double v1,
00147                           CONST_ point3d *ctlpoints );
00148 
00149 void rbez_DestroyBezPatchTreed ( BezPatchTreedp tree );
00150 
00151 BezPatchTreeVertexdp
00152   rbez_GetBezLeftVertexd ( BezPatchTreedp tree,
00153                            BezPatchTreeVertexdp vertex );
00154 BezPatchTreeVertexdp
00155   rbez_GetBezRightVertexd ( BezPatchTreedp tree,
00156                             BezPatchTreeVertexdp vertex );
00157 
00158 int rbez_FindRayBezPatchIntersd ( BezPatchTreed *tree, ray3d *ray,
00159                                   int maxlevel, int maxinters,
00160                                   int *ninters, RayObjectIntersd *inters );
00161 
00162 
00163 RBezPatchTreedp
00164   rbez_NewRBezPatchTreed ( int object_id,
00165                            unsigned char n, unsigned char m,
00166                            double u0, double u1, double v0, double v1,
00167                            CONST_ point4d *ctlpoints );
00168 
00169 void rbez_DestroyRBezPatchTreed ( RBezPatchTreedp tree );
00170 
00171 RBezPatchTreeVertexdp
00172   rbez_GetRBezLeftVertexd ( RBezPatchTreedp tree,
00173                             RBezPatchTreeVertexdp vertex );
00174 RBezPatchTreeVertexdp
00175   rbez_GetRBezRightVertexd ( RBezPatchTreedp tree,
00176                              RBezPatchTreeVertexdp vertex );
00177 
00178 int rbez_FindRayRBezPatchIntersd ( RBezPatchTreed *tree, ray3d *ray,
00179                                    int maxlevel, int maxinters,
00180                                    int *ninters, RayObjectIntersd *inters );
00181 
00182 
00183 BezCurveTreedp rbez_NewBezCurveTreed ( int object_id, short degree,
00184                                        double t0, double t1, double ext,
00185                                        CONST_ point3d *ctlpoints );
00186 
00187 void rbez_DestroyBezCurveTreed ( BezCurveTreedp tree );
00188 
00189 BezCurveTreeVertexdp rbez_GetBezCurveLeftVertexd ( BezCurveTreedp tree,
00190                                                    BezCurveTreeVertexdp vertex );
00191 BezCurveTreeVertexdp rbez_GetBezCurveRightVertexd ( BezCurveTreedp tree,
00192                                                     BezCurveTreeVertexdp vertex );
00193 
00194 int rbez_FindRayBezcOffsetIntersd ( BezCurveTreedp tree, ray3d *ray,
00195                                     int maxlevel, int maxinters,
00196                                     int *ninters, RayObjectIntersd *inters );
00197 
00198 RBezCurveTreedp rbez_NewRBezCurveTreed ( int object_id, short degree,
00199                                         double t0, double t1, double ext,
00200                                         CONST_ point4d *ctlpoints );
00201 
00202 void rbez_DestroyRBezCurveTreed ( RBezCurveTreedp tree );
00203 
00204 RBezCurveTreeVertexdp rbez_GetRBezCurveLeftVertexd ( RBezCurveTreedp tree,
00205                                                      RBezCurveTreeVertexdp vertex );
00206 RBezCurveTreeVertexdp rbez_GetRBezCurveRightVertexd ( RBezCurveTreedp tree,
00207                                                       RBezCurveTreeVertexdp vertex );
00208 
00209 int rbez_FindRayRBezcOffsetIntersd ( RBezCurveTreedp tree, ray3d *ray,
00210                                      int maxlevel, int maxinters,
00211                                      int *ninters, RayObjectIntersd *inters );
00212 
00213 /* ////////////////////////////////////////////////////////////////////////// */
00214 char rbez_TestRayBBoxd ( ray3d *ray, Box3d *box );
00215 
00216 /* ////////////////////////////////////////////////////////////////////////// */
00217 typedef struct {
00218     double u0, u1, v0, v1;
00219     double s0, s1, t0, t1;
00220     int    npoints;
00221   } rbiIntersArcd;
00222 
00223 typedef void rbiArcOutd ( void *usrptr, rbiIntersArcd *arc, vector4d *ipt );
00224 
00225 boolean rbi_FindRBezIntersectiond ( int n1, int m1, point4d *p1,
00226                                     int n2, int m2, point4d *p2,
00227                                     double epsilon, byte maxlevel,
00228                                     rbiArcOutd *outproc, void *usrptr );
00229 
00230 /* ////////////////////////////////////////////////////////////////////////// */
00231 boolean rbez_HomotopicClosedBSC3d ( int degree, int lastknot, double *knots,
00232                                     point3d *cpoints0, point3d *cpoints1,
00233                                     double *tfh, boolean *error );
00234 
00235 /* ////////////////////////////////////////////////////////////////////////// */
00236 #ifndef RAYBEZ_H
00237 boolean raybez_InitMutex ( void );
00238 void raybez_DestroyMutex ( void );
00239 #endif
00240 
00241 #ifdef __cplusplus
00242 }
00243 #endif
00244 
00245 #endif
00246