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 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,
00035 *up;
00036 point3f *ctlpoints;
00037
00038 vector3f *normalvect;
00039
00040 float u0, u1, v0, v1;
00041 Box3f bbox;
00042 point3f pcent;
00043 vector3f nvcent;
00044 float maxder;
00045 short int level;
00046 char divdir;
00047
00048 boolean leaf;
00049 } BezPatchTreeVertexf, *BezPatchTreeVertexfp;
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 BezPatchTreeVertexfp root;
00059 } BezPatchTreef, *BezPatchTreefp;
00060
00061
00062 typedef struct _RBezPatchTreeVertexf {
00063 struct _RBezPatchTreeVertexf *left, *right,
00064 *up;
00065 point4f *ctlpoints;
00066
00067 vector3f *normalvect;
00068
00069 float u0, u1, v0, v1;
00070 Box3f bbox;
00071 point3f pcent;
00072 vector3f nvcent;
00073 float maxder;
00074 short int level;
00075 char divdir;
00076
00077 boolean leaf;
00078 } RBezPatchTreeVertexf, *RBezPatchTreeVertexfp;
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 RBezPatchTreeVertexfp root;
00088 } RBezPatchTreef, *RBezPatchTreefp;
00089
00090
00091 typedef struct _BezCurveTreeVertexf {
00092 struct _BezCurveTreeVertexf *left, *right,
00093 *up;
00094 point3f *ctlpoints;
00095 float t0, t1;
00096 Box3f bbox;
00097 point3f ccent;
00098 float maxder;
00099 short level;
00100 boolean leaf;
00101 char pad;
00102 } BezCurveTreeVertexf, *BezCurveTreeVertexfp;
00103
00104 typedef struct {
00105 int object_id;
00106 short degree;
00107 short cpsize;
00108 float ext;
00109 BezCurveTreeVertexfp root;
00110 } BezCurveTreef, *BezCurveTreefp;
00111
00112
00113 typedef struct _RBezCurveTreeVertexf {
00114 struct _RBezCurveTreeVertexf *left, *right,
00115 *up;
00116 point4f *ctlpoints;
00117 float t0, t1;
00118 Box3f bbox;
00119 point3f ccent;
00120 float maxder;
00121 short level;
00122 boolean leaf;
00123 char pad;
00124 } RBezCurveTreeVertexf, *RBezCurveTreeVertexfp;
00125
00126 typedef struct {
00127 int object_id;
00128 short degree;
00129 short cpsize;
00130 float ext;
00131 RBezCurveTreeVertexfp root;
00132 } RBezCurveTreef, *RBezCurveTreefp;
00133
00134
00135 typedef struct {
00136 int object_id;
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