00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef CONST_
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,
00035 *up;
00036 point3d *ctlpoints;
00037
00038 vector3d *normalvect;
00039
00040 double u0, u1, v0, v1;
00041 Box3d bbox;
00042 point3d pcent;
00043 vector3d nvcent;
00044 double maxder;
00045 short int level;
00046 char divdir;
00047
00048 boolean leaf;
00049 } BezPatchTreeVertexd, *BezPatchTreeVertexdp;
00050
00051 typedef struct {
00052 int object_id;
00053 unsigned char n, m;
00054 unsigned int cpsize;
00055 unsigned char vn, vm;
00056 unsigned int nvsize;
00057
00058 BezPatchTreeVertexdp root;
00059 } BezPatchTreed, *BezPatchTreedp;
00060
00061
00062 typedef struct _RBezPatchTreeVertexd {
00063 struct _RBezPatchTreeVertexd *left, *right,
00064 *up;
00065 point4d *ctlpoints;
00066
00067 vector3d *normalvect;
00068
00069 double u0, u1, v0, v1;
00070 Box3d bbox;
00071 point3d pcent;
00072 vector3d nvcent;
00073 double maxder;
00074 short int level;
00075 char divdir;
00076
00077 boolean leaf;
00078 } RBezPatchTreeVertexd, *RBezPatchTreeVertexdp;
00079
00080 typedef struct {
00081 int object_id;
00082 unsigned char n, m;
00083 unsigned int cpsize;
00084 unsigned char vn, vm;
00085 unsigned int nvsize;
00086
00087 RBezPatchTreeVertexdp root;
00088 } RBezPatchTreed, *RBezPatchTreedp;
00089
00090
00091 typedef struct _BezCurveTreeVertexd {
00092 struct _BezCurveTreeVertexd *left, *right,
00093 *up;
00094 point3d *ctlpoints;
00095 double t0, t1;
00096 Box3d bbox;
00097 point3d ccent;
00098 double maxder;
00099 short level;
00100 boolean leaf;
00101 char pad;
00102 } BezCurveTreeVertexd, *BezCurveTreeVertexdp;
00103
00104 typedef struct {
00105 int object_id;
00106 short degree;
00107 short cpsize;
00108 double ext;
00109 BezCurveTreeVertexdp root;
00110 } BezCurveTreed, *BezCurveTreedp;
00111
00112
00113 typedef struct _RBezCurveTreeVertexd {
00114 struct _RBezCurveTreeVertexd *left, *right,
00115 *up;
00116 point4d *ctlpoints;
00117 double t0, t1;
00118 Box3d bbox;
00119 point3d ccent;
00120 double maxder;
00121 short level;
00122 boolean leaf;
00123 char pad;
00124 } RBezCurveTreeVertexd, *RBezCurveTreeVertexdp;
00125
00126 typedef struct {
00127 int object_id;
00128 short degree;
00129 short cpsize;
00130 double ext;
00131 RBezCurveTreeVertexdp root;
00132 } RBezCurveTreed, *RBezCurveTreedp;
00133
00134
00135 typedef struct {
00136 int object_id;
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