raybezf.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 RAYBEZF_H
00019 #define RAYBEZF_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 _BezPatchTreeVertexf {
00034   struct _BezPatchTreeVertexf *left, *right,  /* pointers to subtrees */
00035             *up;                              /* and up */
00036   point3f   *ctlpoints;                       /* pointer to array */
00037                                               /* of control points */
00038   vector3f  *normalvect;                      /* optional patch to describe */
00039                                               /* the normal vector */
00040   float     u0, u1, v0, v1;                   /* patch piece domain */
00041   Box3f     bbox;                             /* bounding box */
00042   point3f   pcent;                            /* patch central point */
00043   vector3f  nvcent;
00044   float     maxder;                           /* maximal derivative */
00045   short int level;
00046   char      divdir;                           /* 0 - divide u */
00047                                               /* 1 - divide v */
00048   boolean   leaf;
00049 } BezPatchTreeVertexf, *BezPatchTreeVertexfp;
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   BezPatchTreeVertexfp root;       /* root vertex representing the whole patch */
00059 } BezPatchTreef, *BezPatchTreefp;
00060 
00061 
00062 typedef struct _RBezPatchTreeVertexf {
00063   struct _RBezPatchTreeVertexf *left, *right,  /* pointers to subtrees */
00064             *up;                              /* and up */
00065   point4f   *ctlpoints;                       /* pointer to array */
00066                                               /* of control points */
00067   vector3f  *normalvect;                      /* optional patch to describe */
00068                                               /* the normal vector */
00069   float     u0, u1, v0, v1;                   /* patch piece domain */
00070   Box3f     bbox;                             /* bounding box */
00071   point3f   pcent;                            /* patch central point */
00072   vector3f  nvcent;
00073   float     maxder;                           /* maximal derivative */
00074   short int level;
00075   char      divdir;                           /* 0 - divide u */
00076                                               /* 1 - divide v */
00077   boolean   leaf;
00078 } RBezPatchTreeVertexf, *RBezPatchTreeVertexfp;
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   RBezPatchTreeVertexfp root;      /* root vertex representing the whole patch */
00088 } RBezPatchTreef, *RBezPatchTreefp;
00089 
00090 
00091 typedef struct _BezCurveTreeVertexf {
00092     struct _BezCurveTreeVertexf *left, *right,
00093                                 *up;    /* pointers to subtrees and up */
00094     point3f *ctlpoints;                 /* pointer to array of control points */
00095     float   t0, t1;                     /* parameter range */
00096     Box3f   bbox;                       /* bounding box */
00097     point3f ccent;                      /* curve central point */
00098     float   maxder;
00099     short   level;                      /* subdivision level */
00100     boolean leaf;
00101     char    pad;
00102   } BezCurveTreeVertexf, *BezCurveTreeVertexfp;
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     float ext;                  /* box extension */
00109     BezCurveTreeVertexfp root;  /* root vertex */
00110   } BezCurveTreef, *BezCurveTreefp;
00111 
00112 
00113 typedef struct _RBezCurveTreeVertexf {
00114     struct _RBezCurveTreeVertexf *left, *right,
00115                                  *up;   /* pointers to subtrees and up */
00116     point4f *ctlpoints;                 /* pointer to array of control points */
00117     float   t0, t1;                     /* parameter range */
00118     Box3f   bbox;                       /* bounding box */
00119     point3f ccent;                      /* curve central point */
00120     float   maxder;
00121     short   level;                      /* subdivision level */
00122     boolean leaf;
00123     char    pad;
00124   } RBezCurveTreeVertexf, *RBezCurveTreeVertexfp;
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     float  ext;                  /* box extension */
00131     RBezCurveTreeVertexfp root;  /* root vertex */
00132   } RBezCurveTreef, *RBezCurveTreefp;
00133 
00134 
00135 typedef struct {
00136   int      object_id;  /* to be used by applications */
00137   point3f  p;
00138   vector3f nv;
00139   float    u, v, t;
00140 } RayObjectIntersf, *RayObjectIntersfp;
00141 
00142 
00143 BezPatchTreefp
00144   rbez_NewBezPatchTreef ( int object_id,
00145                           unsigned char n, unsigned char m,
00146                           float u0, float u1, float v0, float v1,
00147                           CONST_ point3f *ctlpoints );
00148 
00149 void rbez_DestroyBezPatchTreef ( BezPatchTreefp tree );
00150 
00151 BezPatchTreeVertexfp
00152   rbez_GetBezLeftVertexf ( BezPatchTreefp tree,
00153                            BezPatchTreeVertexfp vertex );
00154 BezPatchTreeVertexfp
00155   rbez_GetBezRightVertexf ( BezPatchTreefp tree,
00156                             BezPatchTreeVertexfp vertex );
00157 
00158 int rbez_FindRayBezPatchIntersf ( BezPatchTreef *tree, ray3f *ray,
00159                                   int maxlevel, int maxinters,
00160                                   int *ninters, RayObjectIntersf *inters );
00161 
00162 
00163 RBezPatchTreefp
00164   rbez_NewRBezPatchTreef ( int object_id,
00165                            unsigned char n, unsigned char m,
00166                            float u0, float u1, float v0, float v1,
00167                            CONST_ point4f *ctlpoints );
00168 
00169 void rbez_DestroyRBezPatchTreef ( RBezPatchTreefp tree );
00170 
00171 RBezPatchTreeVertexfp
00172   rbez_GetRBezLeftVertexf ( RBezPatchTreefp tree,
00173                             RBezPatchTreeVertexfp vertex );
00174 RBezPatchTreeVertexfp
00175   rbez_GetRBezRightVertexf ( RBezPatchTreefp tree,
00176                              RBezPatchTreeVertexfp vertex );
00177 
00178 int rbez_FindRayRBezPatchIntersf ( RBezPatchTreef *tree, ray3f *ray,
00179                                    int maxlevel, int maxinters,
00180                                    int *ninters, RayObjectIntersf *inters );
00181 
00182 
00183 BezCurveTreefp rbez_NewBezCurveTreef ( int object_id, short degree,
00184                                        float t0, float t1, float ext,
00185                                        CONST_ point3f *ctlpoints );
00186 
00187 void rbez_DestroyBezCurveTreef ( BezCurveTreefp tree );
00188 
00189 BezCurveTreeVertexfp rbez_GetBezCurveLeftVertexf ( BezCurveTreefp tree,
00190                                                    BezCurveTreeVertexfp vertex );
00191 BezCurveTreeVertexfp rbez_GetBezCurveRightVertexf ( BezCurveTreefp tree,
00192                                                     BezCurveTreeVertexfp vertex );
00193 
00194 int rbez_FindRayBezcOffsetIntersf ( BezCurveTreefp tree, ray3f *ray,
00195                                     int maxlevel, int maxinters,
00196                                     int *ninters, RayObjectIntersf *inters );
00197 
00198 RBezCurveTreefp rbez_NewRBezCurveTreef ( int object_id, short degree,
00199                                         float t0, float t1, float ext,
00200                                         CONST_ point4f *ctlpoints );
00201 
00202 void rbez_DestroyRBezCurveTreef ( RBezCurveTreefp tree );
00203 
00204 RBezCurveTreeVertexfp rbez_GetRBezCurveLeftVertexf ( RBezCurveTreefp tree,
00205                                                      RBezCurveTreeVertexfp vertex );
00206 RBezCurveTreeVertexfp rbez_GetRBezCurveRightVertexf ( RBezCurveTreefp tree,
00207                                                       RBezCurveTreeVertexfp vertex );
00208 
00209 int rbez_FindRayRBezcOffsetIntersf ( RBezCurveTreefp tree, ray3f *ray,
00210                                      int maxlevel, int maxinters,
00211                                      int *ninters, RayObjectIntersf *inters );
00212 
00213 /* ////////////////////////////////////////////////////////////////////////// */
00214 char rbez_TestRayBBoxf ( ray3f *ray, Box3f *box );
00215 
00216 /* ////////////////////////////////////////////////////////////////////////// */
00217 typedef struct {
00218     float u0, u1, v0, v1;
00219     float s0, s1, t0, t1;
00220     int   npoints;
00221   } rbiIntersArcf;
00222 
00223 typedef void rbiArcOutf ( void *usrptr, rbiIntersArcf *arc, vector4f *ipt );
00224 
00225 boolean rbi_FindRBezIntersectionf ( int n1, int m1, point4f *p1,
00226                                     int n2, int m2, point4f *p2,
00227                                     float epsilon, byte maxlevel,
00228                                     rbiArcOutf *outproc, void *usrptr );
00229 
00230 /* ////////////////////////////////////////////////////////////////////////// */
00231 boolean rbez_HomotopicClosedBSC3f ( int degree, int lastknot, float *knots,
00232                                     point3f *cpoints0, point3f *cpoints1,   
00233                                     float *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