00001 #ifndef FLOAT_MATH_LIB_H
00002
00003 #define FLOAT_MATH_LIB_H
00004
00005
00006 #include <float.h>
00007 #include <stdint.h>
00008
00009 namespace FLOAT_MATH
00010 {
00011
00012 enum FM_ClipState
00013 {
00014 FMCS_XMIN = (1<<0),
00015 FMCS_XMAX = (1<<1),
00016 FMCS_YMIN = (1<<2),
00017 FMCS_YMAX = (1<<3),
00018 FMCS_ZMIN = (1<<4),
00019 FMCS_ZMAX = (1<<5),
00020 };
00021
00022 enum FM_Axis
00023 {
00024 FM_XAXIS = (1<<0),
00025 FM_YAXIS = (1<<1),
00026 FM_ZAXIS = (1<<2)
00027 };
00028
00029 enum LineSegmentType
00030 {
00031 LS_START,
00032 LS_MIDDLE,
00033 LS_END
00034 };
00035
00036
00037 const float FM_PI = 3.1415926535897932384626433832795028841971693993751f;
00038 const float FM_DEG_TO_RAD = ((2.0f * FM_PI) / 360.0f);
00039 const float FM_RAD_TO_DEG = (360.0f / (2.0f * FM_PI));
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 FM_Axis fm_getDominantAxis(const float normal[3]);
00050 FM_Axis fm_getDominantAxis(const double normal[3]);
00051
00052 void fm_decomposeTransform(const float local_transform[16],float trans[3],float rot[4],float scale[3]);
00053 void fm_decomposeTransform(const double local_transform[16],double trans[3],double rot[4],double scale[3]);
00054
00055 void fm_multiplyTransform(const float *pA,const float *pB,float *pM);
00056 void fm_multiplyTransform(const double *pA,const double *pB,double *pM);
00057
00058 void fm_inverseTransform(const float matrix[16],float inverse_matrix[16]);
00059 void fm_inverseTransform(const double matrix[16],double inverse_matrix[16]);
00060
00061 void fm_identity(float matrix[16]);
00062 void fm_identity(double matrix[16]);
00063
00064 void fm_inverseRT(const float matrix[16], const float pos[3], float t[3]);
00065 void fm_inverseRT(const double matrix[16],const double pos[3],double t[3]);
00066
00067 void fm_transform(const float matrix[16], const float pos[3], float t[3]);
00068 void fm_transform(const double matrix[16],const double pos[3],double t[3]);
00069
00070 float fm_getDeterminant(const float matrix[16]);
00071 double fm_getDeterminant(const double matrix[16]);
00072
00073 void fm_getSubMatrix(int32_t ki,int32_t kj,float pDst[16],const float matrix[16]);
00074 void fm_getSubMatrix(int32_t ki,int32_t kj,double pDst[16],const float matrix[16]);
00075
00076 void fm_rotate(const float matrix[16],const float pos[3],float t[3]);
00077 void fm_rotate(const double matri[16],const double pos[3],double t[3]);
00078
00079 void fm_eulerToMatrix(float ax,float ay,float az,float matrix[16]);
00080 void fm_eulerToMatrix(double ax,double ay,double az,double matrix[16]);
00081
00082 void fm_getAABB(uint32_t vcount,const float *points,uint32_t pstride,float bmin[3],float bmax[3]);
00083 void fm_getAABB(uint32_t vcount,const double *points,uint32_t pstride,double bmin[3],double bmax[3]);
00084
00085 void fm_getAABBCenter(const float bmin[3],const float bmax[3],float center[3]);
00086 void fm_getAABBCenter(const double bmin[3],const double bmax[3],double center[3]);
00087
00088 void fm_transformAABB(const float bmin[3],const float bmax[3],const float matrix[16],float tbmin[3],float tbmax[3]);
00089 void fm_transformAABB(const double bmin[3],const double bmax[3],const double matrix[16],double tbmin[3],double tbmax[3]);
00090
00091 void fm_eulerToQuat(float x,float y,float z,float quat[4]);
00092 void fm_eulerToQuat(double x,double y,double z,double quat[4]);
00093
00094 void fm_quatToEuler(const float quat[4],float &ax,float &ay,float &az);
00095 void fm_quatToEuler(const double quat[4],double &ax,double &ay,double &az);
00096
00097 void fm_eulerToQuat(const float euler[3],float quat[4]);
00098 void fm_eulerToQuat(const double euler[3],double quat[4]);
00099
00100 void fm_scale(float x,float y,float z,float matrix[16]);
00101 void fm_scale(double x,double y,double z,double matrix[16]);
00102
00103 void fm_eulerToQuatDX(float x,float y,float z,float quat[4]);
00104 void fm_eulerToQuatDX(double x,double y,double z,double quat[4]);
00105
00106 void fm_eulerToMatrixDX(float x,float y,float z,float matrix[16]);
00107 void fm_eulerToMatrixDX(double x,double y,double z,double matrix[16]);
00108
00109 void fm_quatToMatrix(const float quat[4],float matrix[16]);
00110 void fm_quatToMatrix(const double quat[4],double matrix[16]);
00111
00112 void fm_quatRotate(const float quat[4],const float v[3],float r[3]);
00113 void fm_quatRotate(const double quat[4],const double v[3],double r[3]);
00114
00115 void fm_getTranslation(const float matrix[16],float t[3]);
00116 void fm_getTranslation(const double matrix[16],double t[3]);
00117
00118 void fm_setTranslation(const float *translation,float matrix[16]);
00119 void fm_setTranslation(const double *translation,double matrix[16]);
00120
00121 void fm_multiplyQuat(const float *qa,const float *qb,float *quat);
00122 void fm_multiplyQuat(const double *qa,const double *qb,double *quat);
00123
00124 void fm_matrixToQuat(const float matrix[16],float quat[4]);
00125 void fm_matrixToQuat(const double matrix[16],double quat[4]);
00126
00127 float fm_sphereVolume(float radius);
00128 double fm_sphereVolume(double radius);
00129
00130 float fm_cylinderVolume(float radius,float h);
00131 double fm_cylinderVolume(double radius,double h);
00132
00133 float fm_capsuleVolume(float radius,float h);
00134 double fm_capsuleVolume(double radius,double h);
00135
00136 float fm_distance(const float p1[3],const float p2[3]);
00137 double fm_distance(const double p1[3],const double p2[3]);
00138
00139 float fm_distanceSquared(const float p1[3],const float p2[3]);
00140 double fm_distanceSquared(const double p1[3],const double p2[3]);
00141
00142 float fm_distanceSquaredXZ(const float p1[3],const float p2[3]);
00143 double fm_distanceSquaredXZ(const double p1[3],const double p2[3]);
00144
00145 float fm_computePlane(const float p1[3],const float p2[3],const float p3[3],float *n);
00146 double fm_computePlane(const double p1[3],const double p2[3],const double p3[3],double *n);
00147
00148 float fm_distToPlane(const float plane[4],const float pos[3]);
00149 double fm_distToPlane(const double plane[4],const double pos[3]);
00150
00151 float fm_dot(const float p1[3],const float p2[3]);
00152 double fm_dot(const double p1[3],const double p2[3]);
00153
00154 void fm_cross(float cross[3],const float a[3],const float b[3]);
00155 void fm_cross(double cross[3],const double a[3],const double b[3]);
00156
00157 void fm_computeNormalVector(float n[3],const float p1[3],const float p2[3]);
00158 void fm_computeNormalVector(double n[3],const double p1[3],const double p2[3]);
00159
00160 bool fm_computeWindingOrder(const float p1[3],const float p2[3],const float p3[3]);
00161 bool fm_computeWindingOrder(const double p1[3],const double p2[3],const double p3[3]);
00162
00163 float fm_normalize(float n[3]);
00164 double fm_normalize(double n[3]);
00165
00166 float fm_normalizeQuat(float n[4]);
00167 double fm_normalizeQuat(double n[4]);
00168
00169 void fm_matrixMultiply(const float A[16],const float B[16],float dest[16]);
00170 void fm_matrixMultiply(const double A[16],const double B[16],double dest[16]);
00171
00172 void fm_composeTransform(const float position[3],const float quat[4],const float scale[3],float matrix[16]);
00173 void fm_composeTransform(const double position[3],const double quat[4],const double scale[3],double matrix[16]);
00174
00175 float fm_computeArea(const float p1[3],const float p2[3],const float p3[3]);
00176 double fm_computeArea(const double p1[3],const double p2[3],const double p3[3]);
00177
00178 void fm_lerp(const float p1[3],const float p2[3],float dest[3],float lerpValue);
00179 void fm_lerp(const double p1[3],const double p2[3],double dest[3],double lerpValue);
00180
00181 bool fm_insideTriangleXZ(const float test[3],const float p1[3],const float p2[3],const float p3[3]);
00182 bool fm_insideTriangleXZ(const double test[3],const double p1[3],const double p2[3],const double p3[3]);
00183
00184 bool fm_insideAABB(const float pos[3],const float bmin[3],const float bmax[3]);
00185 bool fm_insideAABB(const double pos[3],const double bmin[3],const double bmax[3]);
00186
00187 bool fm_insideAABB(const float obmin[3],const float obmax[3],const float tbmin[3],const float tbmax[3]);
00188 bool fm_insideAABB(const double obmin[3],const double obmax[3],const double tbmin[3],const double tbmax[3]);
00189
00190 uint32_t fm_clipTestPoint(const float bmin[3],const float bmax[3],const float pos[3]);
00191 uint32_t fm_clipTestPoint(const double bmin[3],const double bmax[3],const double pos[3]);
00192
00193 uint32_t fm_clipTestPointXZ(const float bmin[3],const float bmax[3],const float pos[3]);
00194 uint32_t fm_clipTestPointXZ(const double bmin[3],const double bmax[3],const double pos[3]);
00195
00196
00197 uint32_t fm_clipTestAABB(const float bmin[3],const float bmax[3],const float p1[3],const float p2[3],const float p3[3],uint32_t &andCode);
00198 uint32_t fm_clipTestAABB(const double bmin[3],const double bmax[3],const double p1[3],const double p2[3],const double p3[3],uint32_t &andCode);
00199
00200
00201 bool fm_lineTestAABBXZ(const float p1[3],const float p2[3],const float bmin[3],const float bmax[3],float &time);
00202 bool fm_lineTestAABBXZ(const double p1[3],const double p2[3],const double bmin[3],const double bmax[3],double &time);
00203
00204 bool fm_lineTestAABB(const float p1[3],const float p2[3],const float bmin[3],const float bmax[3],float &time);
00205 bool fm_lineTestAABB(const double p1[3],const double p2[3],const double bmin[3],const double bmax[3],double &time);
00206
00207
00208 void fm_initMinMax(const float p[3],float bmin[3],float bmax[3]);
00209 void fm_initMinMax(const double p[3],double bmin[3],double bmax[3]);
00210
00211 void fm_initMinMax(float bmin[3],float bmax[3]);
00212 void fm_initMinMax(double bmin[3],double bmax[3]);
00213
00214 void fm_minmax(const float p[3],float bmin[3],float bmax[3]);
00215 void fm_minmax(const double p[3],double bmin[3],double bmax[3]);
00216
00217
00218
00219 void fm_inflateMinMax(float bmin[3], float bmax[3], float ratio);
00220 void fm_inflateMinMax(double bmin[3], double bmax[3], double ratio);
00221
00222 float fm_solveX(const float plane[4],float y,float z);
00223 double fm_solveX(const double plane[4],double y,double z);
00224
00225 float fm_solveY(const float plane[4],float x,float z);
00226 double fm_solveY(const double plane[4],double x,double z);
00227
00228 float fm_solveZ(const float plane[4],float x,float y);
00229 double fm_solveZ(const double plane[4],double x,double y);
00230
00231 bool fm_computeBestFitPlane(uint32_t vcount,
00232 const float *points,
00233 uint32_t vstride,
00234 const float *weights,
00235 uint32_t wstride,
00236 float plane[4]);
00237
00238 bool fm_computeBestFitPlane(uint32_t vcount,
00239 const double *points,
00240 uint32_t vstride,
00241 const double *weights,
00242 uint32_t wstride,
00243 double plane[4]);
00244
00245 bool fm_computeCentroid(uint32_t vcount,
00246 const float *points,
00247 uint32_t vstride,
00248 float *center);
00249
00250 bool fm_computeCentroid(uint32_t vcount,
00251 const double *points,
00252 uint32_t vstride,
00253 double *center);
00254
00255
00256 float fm_computeBestFitAABB(uint32_t vcount,const float *points,uint32_t pstride,float bmin[3],float bmax[3]);
00257 double fm_computeBestFitAABB(uint32_t vcount,const double *points,uint32_t pstride,double bmin[3],double bmax[3]);
00258
00259 float fm_computeBestFitSphere(uint32_t vcount,const float *points,uint32_t pstride,float center[3]);
00260 double fm_computeBestFitSphere(uint32_t vcount,const double *points,uint32_t pstride,double center[3]);
00261
00262 bool fm_lineSphereIntersect(const float center[3],float radius,const float p1[3],const float p2[3],float intersect[3]);
00263 bool fm_lineSphereIntersect(const double center[3],double radius,const double p1[3],const double p2[3],double intersect[3]);
00264
00265 bool fm_intersectRayAABB(const float bmin[3],const float bmax[3],const float pos[3],const float dir[3],float intersect[3]);
00266 bool fm_intersectLineSegmentAABB(const float bmin[3],const float bmax[3],const float p1[3],const float p2[3],float intersect[3]);
00267
00268 bool fm_lineIntersectsTriangle(const float rayStart[3],const float rayEnd[3],const float p1[3],const float p2[3],const float p3[3],float sect[3]);
00269 bool fm_lineIntersectsTriangle(const double rayStart[3],const double rayEnd[3],const double p1[3],const double p2[3],const double p3[3],double sect[3]);
00270
00271 bool fm_rayIntersectsTriangle(const float origin[3],const float dir[3],const float v0[3],const float v1[3],const float v2[3],float &t);
00272 bool fm_rayIntersectsTriangle(const double origin[3],const double dir[3],const double v0[3],const double v1[3],const double v2[3],double &t);
00273
00274 bool fm_raySphereIntersect(const float center[3],float radius,const float pos[3],const float dir[3],float distance,float intersect[3]);
00275 bool fm_raySphereIntersect(const double center[3],double radius,const double pos[3],const double dir[3],double distance,double intersect[3]);
00276
00277 void fm_catmullRom(float out_vector[3],const float p1[3],const float p2[3],const float p3[3],const float *p4, const float s);
00278 void fm_catmullRom(double out_vector[3],const double p1[3],const double p2[3],const double p3[3],const double *p4, const double s);
00279
00280 bool fm_intersectAABB(const float bmin1[3],const float bmax1[3],const float bmin2[3],const float bmax2[3]);
00281 bool fm_intersectAABB(const double bmin1[3],const double bmax1[3],const double bmin2[3],const double bmax2[3]);
00282
00283
00284
00285 void fm_rotationArc(const float v0[3],const float v1[3],float quat[4]);
00286 void fm_rotationArc(const double v0[3],const double v1[3],double quat[4]);
00287
00288 float fm_distancePointLineSegment(const float Point[3],const float LineStart[3],const float LineEnd[3],float intersection[3],LineSegmentType &type,float epsilon);
00289 double fm_distancePointLineSegment(const double Point[3],const double LineStart[3],const double LineEnd[3],double intersection[3],LineSegmentType &type,double epsilon);
00290
00291
00292 bool fm_colinear(const double p1[3],const double p2[3],const double p3[3],double epsilon=0.999);
00293 bool fm_colinear(const float p1[3],const float p2[3],const float p3[3],float epsilon=0.999f);
00294
00295 bool fm_colinear(const float a1[3],const float a2[3],const float b1[3],const float b2[3],float epsilon=0.999f);
00296 bool fm_colinear(const double a1[3],const double a2[3],const double b1[3],const double b2[3],double epsilon=0.999);
00297
00298 enum IntersectResult
00299 {
00300 IR_DONT_INTERSECT,
00301 IR_DO_INTERSECT,
00302 IR_COINCIDENT,
00303 IR_PARALLEL,
00304 };
00305
00306 IntersectResult fm_intersectLineSegments2d(const float a1[3], const float a2[3], const float b1[3], const float b2[3], float intersectionPoint[3]);
00307 IntersectResult fm_intersectLineSegments2d(const double a1[3],const double a2[3],const double b1[3],const double b2[3],double intersectionPoint[3]);
00308
00309 IntersectResult fm_intersectLineSegments2dTime(const float a1[3], const float a2[3], const float b1[3], const float b2[3],float &t1,float &t2);
00310 IntersectResult fm_intersectLineSegments2dTime(const double a1[3],const double a2[3],const double b1[3],const double b2[3],double &t1,double &t2);
00311
00312
00313
00314 enum PlaneTriResult
00315 {
00316 PTR_ON_PLANE,
00317 PTR_FRONT,
00318 PTR_BACK,
00319 PTR_SPLIT,
00320 };
00321
00322 PlaneTriResult fm_planeTriIntersection(const float plane[4],
00323 const float *triangle,
00324 uint32_t tstride,
00325 float epsilon,
00326 float *front,
00327 uint32_t &fcount,
00328 float *back,
00329 uint32_t &bcount);
00330
00331
00332 PlaneTriResult fm_planeTriIntersection(const double plane[4],
00333 const double *triangle,
00334 uint32_t tstride,
00335 double epsilon,
00336 double *front,
00337 uint32_t &fcount,
00338 double *back,
00339 uint32_t &bcount);
00340
00341
00342 void fm_intersectPointPlane(const float p1[3],const float p2[3],float *split,const float plane[4]);
00343 void fm_intersectPointPlane(const double p1[3],const double p2[3],double *split,const double plane[4]);
00344
00345 PlaneTriResult fm_getSidePlane(const float p[3],const float plane[4],float epsilon);
00346 PlaneTriResult fm_getSidePlane(const double p[3],const double plane[4],double epsilon);
00347
00348
00349 void fm_computeBestFitOBB(uint32_t vcount,const float *points,uint32_t pstride,float *sides,float matrix[16],bool bruteForce=true);
00350 void fm_computeBestFitOBB(uint32_t vcount,const double *points,uint32_t pstride,double *sides,double matrix[16],bool bruteForce=true);
00351
00352 void fm_computeBestFitOBB(uint32_t vcount,const float *points,uint32_t pstride,float *sides,float pos[3],float quat[4],bool bruteForce=true);
00353 void fm_computeBestFitOBB(uint32_t vcount,const double *points,uint32_t pstride,double *sides,double pos[3],double quat[4],bool bruteForce=true);
00354
00355 void fm_computeBestFitABB(uint32_t vcount,const float *points,uint32_t pstride,float *sides,float pos[3]);
00356 void fm_computeBestFitABB(uint32_t vcount,const double *points,uint32_t pstride,double *sides,double pos[3]);
00357
00358
00359
00360 void fm_computeBestFitCapsule(uint32_t vcount,const float *points,uint32_t pstride,float &radius,float &height,float matrix[16],bool bruteForce=true);
00361 void fm_computeBestFitCapsule(uint32_t vcount,const double *points,uint32_t pstride,float &radius,float &height,double matrix[16],bool bruteForce=true);
00362
00363
00364 void fm_planeToMatrix(const float plane[4],float matrix[16]);
00365 void fm_planeToQuat(const float plane[4],float quat[4],float pos[3]);
00366
00367 void fm_planeToMatrix(const double plane[4],double matrix[16]);
00368 void fm_planeToQuat(const double plane[4],double quat[4],double pos[3]);
00369
00370 inline void fm_doubleToFloat3(const double p[3],float t[3]) { t[0] = (float) p[0]; t[1] = (float)p[1]; t[2] = (float)p[2]; };
00371 inline void fm_floatToDouble3(const float p[3],double t[3]) { t[0] = (double)p[0]; t[1] = (double)p[1]; t[2] = (double)p[2]; };
00372
00373
00374 void fm_eulerMatrix(float ax,float ay,float az,float matrix[16]);
00375 void fm_eulerMatrix(double ax,double ay,double az,double matrix[16]);
00376
00377
00378 float fm_computeMeshVolume(const float *vertices,uint32_t tcount,const uint32_t *indices);
00379 double fm_computeMeshVolume(const double *vertices,uint32_t tcount,const uint32_t *indices);
00380
00381
00382 #define FM_DEFAULT_GRANULARITY 0.001f // 1 millimeter is the default granularity
00383
00384 class fm_VertexIndex
00385 {
00386 public:
00387 virtual uint32_t getIndex(const float pos[3],bool &newPos) = 0;
00388 virtual uint32_t getIndex(const double pos[3],bool &newPos) = 0;
00389 virtual const float * getVerticesFloat(void) const = 0;
00390 virtual const double * getVerticesDouble(void) const = 0;
00391 virtual const float * getVertexFloat(uint32_t index) const = 0;
00392 virtual const double * getVertexDouble(uint32_t index) const = 0;
00393 virtual uint32_t getVcount(void) const = 0;
00394 virtual bool isDouble(void) const = 0;
00395 virtual bool saveAsObj(const char *fname,uint32_t tcount,uint32_t *indices) = 0;
00396 };
00397
00398 fm_VertexIndex * fm_createVertexIndex(double granularity,bool snapToGrid);
00399 fm_VertexIndex * fm_createVertexIndex(float granularity,bool snapToGrid);
00400 void fm_releaseVertexIndex(fm_VertexIndex *vindex);
00401
00402
00403 class fm_Triangulate
00404 {
00405 public:
00406 virtual const double * triangulate3d(uint32_t pcount,
00407 const double *points,
00408 uint32_t vstride,
00409 uint32_t &tcount,
00410 bool consolidate,
00411 double epsilon) = 0;
00412
00413 virtual const float * triangulate3d(uint32_t pcount,
00414 const float *points,
00415 uint32_t vstride,
00416 uint32_t &tcount,
00417 bool consolidate,
00418 float epsilon) = 0;
00419 };
00420
00421 fm_Triangulate * fm_createTriangulate(void);
00422 void fm_releaseTriangulate(fm_Triangulate *t);
00423
00424
00425 const float * fm_getPoint(const float *points,uint32_t pstride,uint32_t index);
00426 const double * fm_getPoint(const double *points,uint32_t pstride,uint32_t index);
00427
00428 bool fm_insideTriangle(float Ax, float Ay,float Bx, float By,float Cx, float Cy,float Px, float Py);
00429 bool fm_insideTriangle(double Ax, double Ay,double Bx, double By,double Cx, double Cy,double Px, double Py);
00430 float fm_areaPolygon2d(uint32_t pcount,const float *points,uint32_t pstride);
00431 double fm_areaPolygon2d(uint32_t pcount,const double *points,uint32_t pstride);
00432
00433 bool fm_pointInsidePolygon2d(uint32_t pcount,const float *points,uint32_t pstride,const float *point,uint32_t xindex=0,uint32_t yindex=1);
00434 bool fm_pointInsidePolygon2d(uint32_t pcount,const double *points,uint32_t pstride,const double *point,uint32_t xindex=0,uint32_t yindex=1);
00435
00436 uint32_t fm_consolidatePolygon(uint32_t pcount,const float *points,uint32_t pstride,float *dest,float epsilon=0.999999f);
00437 uint32_t fm_consolidatePolygon(uint32_t pcount,const double *points,uint32_t pstride,double *dest,double epsilon=0.999999);
00438
00439
00440 bool fm_computeSplitPlane(uint32_t vcount,const double *vertices,uint32_t tcount,const uint32_t *indices,double *plane);
00441 bool fm_computeSplitPlane(uint32_t vcount,const float *vertices,uint32_t tcount,const uint32_t *indices,float *plane);
00442
00443 void fm_nearestPointInTriangle(const float *pos,const float *p1,const float *p2,const float *p3,float *nearest);
00444 void fm_nearestPointInTriangle(const double *pos,const double *p1,const double *p2,const double *p3,double *nearest);
00445
00446 float fm_areaTriangle(const float *p1,const float *p2,const float *p3);
00447 double fm_areaTriangle(const double *p1,const double *p2,const double *p3);
00448
00449 void fm_subtract(const float *A,const float *B,float *diff);
00450 void fm_subtract(const double *A,const double *B,double *diff);
00451
00452 void fm_multiply(float *A,float scaler);
00453 void fm_multiply(double *A,double scaler);
00454
00455 void fm_add(const float *A,const float *B,float *sum);
00456 void fm_add(const double *A,const double *B,double *sum);
00457
00458 void fm_copy3(const float *source,float *dest);
00459 void fm_copy3(const double *source,double *dest);
00460
00461
00462
00463
00464 uint32_t fm_copyUniqueVertices(uint32_t vcount,const float *input_vertices,float *output_vertices,uint32_t tcount,const uint32_t *input_indices,uint32_t *output_indices);
00465 uint32_t fm_copyUniqueVertices(uint32_t vcount,const double *input_vertices,double *output_vertices,uint32_t tcount,const uint32_t *input_indices,uint32_t *output_indices);
00466
00467 bool fm_isMeshCoplanar(uint32_t tcount,const uint32_t *indices,const float *vertices,bool doubleSided);
00468 bool fm_isMeshCoplanar(uint32_t tcount,const uint32_t *indices,const double *vertices,bool doubleSided);
00469
00470 bool fm_samePlane(const float p1[4],const float p2[4],float normalEpsilon=0.01f,float dEpsilon=0.001f,bool doubleSided=false);
00471 bool fm_samePlane(const double p1[4],const double p2[4],double normalEpsilon=0.01,double dEpsilon=0.001,bool doubleSided=false);
00472
00473 void fm_OBBtoAABB(const float obmin[3],const float obmax[3],const float matrix[16],float abmin[3],float abmax[3]);
00474
00475
00476 class fm_Tesselate
00477 {
00478 public:
00479 virtual const uint32_t * tesselate(fm_VertexIndex *vindex,uint32_t tcount,const uint32_t *indices,float longEdge,uint32_t maxDepth,uint32_t &outcount) = 0;
00480 };
00481
00482 fm_Tesselate * fm_createTesselate(void);
00483 void fm_releaseTesselate(fm_Tesselate *t);
00484
00485 void fm_computeMeanNormals(uint32_t vcount,
00486 const float *vertices,
00487 uint32_t vstride,
00488 float *normals,
00489 uint32_t nstride,
00490 uint32_t tcount,
00491 const uint32_t *indices);
00492
00493 void fm_computeMeanNormals(uint32_t vcount,
00494 const double *vertices,
00495 uint32_t vstride,
00496 double *normals,
00497 uint32_t nstride,
00498 uint32_t tcount,
00499 const uint32_t *indices);
00500
00501
00502 bool fm_isValidTriangle(const float *p1,const float *p2,const float *p3,float epsilon=0.00001f);
00503 bool fm_isValidTriangle(const double *p1,const double *p2,const double *p3,double epsilon=0.00001f);
00504
00505 };
00506
00507 #endif