00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00038 #ifndef FCL_BV_FITTER_H
00039 #define FCL_BV_FITTER_H
00040
00041 #include "fcl/BVH/BVH_internal.h"
00042 #include "fcl/BV/kIOS.h"
00043 #include "fcl/BV/OBBRSS.h"
00044 #include <iostream>
00045
00046 namespace fcl
00047 {
00048
00050 template<typename BV>
00051 void fit(Vec3f* ps, int n, BV& bv)
00052 {
00053 for(int i = 0; i < n; ++i)
00054 {
00055 bv += ps[i];
00056 }
00057 }
00058
00059 template<>
00060 void fit<OBB>(Vec3f* ps, int n, OBB& bv);
00061
00062 template<>
00063 void fit<RSS>(Vec3f* ps, int n, RSS& bv);
00064
00065 template<>
00066 void fit<kIOS>(Vec3f* ps, int n, kIOS& bv);
00067
00068 template<>
00069 void fit<OBBRSS>(Vec3f* ps, int n, OBBRSS& bv);
00070
00071
00073 template<typename BV>
00074 class BVFitterBase
00075 {
00076 public:
00078 virtual void set(Vec3f* vertices_, Triangle* tri_indices_, BVHModelType type_) = 0;
00079
00081 virtual void set(Vec3f* vertices_, Vec3f* prev_vertices_, Triangle* tri_indices_, BVHModelType type_) = 0;
00082
00084 virtual BV fit(unsigned int* primitive_indices, int num_primitives) = 0;
00085
00087 virtual void clear() = 0;
00088 };
00089
00091 template<typename BV>
00092 class BVFitter : public BVFitterBase<BV>
00093 {
00094 public:
00096 virtual ~BVFitter() {}
00097
00099 void set(Vec3f* vertices_, Triangle* tri_indices_, BVHModelType type_)
00100 {
00101 vertices = vertices_;
00102 prev_vertices = NULL;
00103 tri_indices = tri_indices_;
00104 type = type_;
00105 }
00106
00108 void set(Vec3f* vertices_, Vec3f* prev_vertices_, Triangle* tri_indices_, BVHModelType type_)
00109 {
00110 vertices = vertices_;
00111 prev_vertices = prev_vertices_;
00112 tri_indices = tri_indices_;
00113 type = type_;
00114 }
00115
00118 BV fit(unsigned int* primitive_indices, int num_primitives)
00119 {
00120 BV bv;
00121
00122 if(type == BVH_MODEL_TRIANGLES)
00123 {
00124 for(int i = 0; i < num_primitives; ++i)
00125 {
00126 Triangle t = tri_indices[primitive_indices[i]];
00127 bv += vertices[t[0]];
00128 bv += vertices[t[1]];
00129 bv += vertices[t[2]];
00130
00131 if(prev_vertices)
00132 {
00133 bv += prev_vertices[t[0]];
00134 bv += prev_vertices[t[1]];
00135 bv += prev_vertices[t[2]];
00136 }
00137 }
00138 }
00139 else if(type == BVH_MODEL_POINTCLOUD)
00140 {
00141 for(int i = 0; i < num_primitives; ++i)
00142 {
00143 bv += vertices[primitive_indices[i]];
00144
00145 if(prev_vertices)
00146 {
00147 bv += prev_vertices[primitive_indices[i]];
00148 }
00149 }
00150 }
00151
00152 return bv;
00153 }
00154
00156 void clear()
00157 {
00158 vertices = NULL;
00159 prev_vertices = NULL;
00160 tri_indices = NULL;
00161 type = BVH_MODEL_UNKNOWN;
00162 }
00163
00164 private:
00165
00166 Vec3f* vertices;
00167 Vec3f* prev_vertices;
00168 Triangle* tri_indices;
00169 BVHModelType type;
00170 };
00171
00172
00174 template<>
00175 class BVFitter<OBB> : public BVFitterBase<OBB>
00176 {
00177 public:
00179 void set(Vec3f* vertices_, Triangle* tri_indices_, BVHModelType type_)
00180 {
00181 vertices = vertices_;
00182 prev_vertices = NULL;
00183 tri_indices = tri_indices_;
00184 type = type_;
00185 }
00186
00188 void set(Vec3f* vertices_, Vec3f* prev_vertices_, Triangle* tri_indices_, BVHModelType type_)
00189 {
00190 vertices = vertices_;
00191 prev_vertices = prev_vertices_;
00192 tri_indices = tri_indices_;
00193 type = type_;
00194 }
00195
00198 OBB fit(unsigned int* primitive_indices, int num_primitives);
00199
00201 void clear()
00202 {
00203 vertices = NULL;
00204 prev_vertices = NULL;
00205 tri_indices = NULL;
00206 type = BVH_MODEL_UNKNOWN;
00207 }
00208
00209 private:
00210
00211 Vec3f* vertices;
00212 Vec3f* prev_vertices;
00213 Triangle* tri_indices;
00214 BVHModelType type;
00215 };
00216
00217
00219 template<>
00220 class BVFitter<RSS> : public BVFitterBase<RSS>
00221 {
00222 public:
00224 void set(Vec3f* vertices_, Triangle* tri_indices_, BVHModelType type_)
00225 {
00226 vertices = vertices_;
00227 prev_vertices = NULL;
00228 tri_indices = tri_indices_;
00229 type = type_;
00230 }
00231
00233 void set(Vec3f* vertices_, Vec3f* prev_vertices_, Triangle* tri_indices_, BVHModelType type_)
00234 {
00235 vertices = vertices_;
00236 prev_vertices = prev_vertices_;
00237 tri_indices = tri_indices_;
00238 type = type_;
00239 }
00240
00243 RSS fit(unsigned int* primitive_indices, int num_primitives);
00244
00246 void clear()
00247 {
00248 vertices = NULL;
00249 prev_vertices = NULL;
00250 tri_indices = NULL;
00251 type = BVH_MODEL_UNKNOWN;
00252 }
00253
00254 private:
00255
00256 Vec3f* vertices;
00257 Vec3f* prev_vertices;
00258 Triangle* tri_indices;
00259 BVHModelType type;
00260 };
00261
00262
00264 template<>
00265 class BVFitter<kIOS> : public BVFitterBase<kIOS>
00266 {
00267 public:
00269 void set(Vec3f* vertices_, Triangle* tri_indices_, BVHModelType type_)
00270 {
00271 vertices = vertices_;
00272 prev_vertices = NULL;
00273 tri_indices = tri_indices_;
00274 type = type_;
00275 }
00276
00278 void set(Vec3f* vertices_, Vec3f* prev_vertices_, Triangle* tri_indices_, BVHModelType type_)
00279 {
00280 vertices = vertices_;
00281 prev_vertices = prev_vertices_;
00282 tri_indices = tri_indices_;
00283 type = type_;
00284 }
00285
00288 kIOS fit(unsigned int* primitive_indices, int num_primitives);
00289
00291 void clear()
00292 {
00293 vertices = NULL;
00294 prev_vertices = NULL;
00295 tri_indices = NULL;
00296 type = BVH_MODEL_UNKNOWN;
00297 }
00298
00299 private:
00300 Vec3f* vertices;
00301 Vec3f* prev_vertices;
00302 Triangle* tri_indices;
00303 BVHModelType type;
00304 };
00305
00306
00308 template<>
00309 class BVFitter<OBBRSS> : public BVFitterBase<OBBRSS>
00310 {
00311 public:
00313 void set(Vec3f* vertices_, Triangle* tri_indices_, BVHModelType type_)
00314 {
00315 vertices = vertices_;
00316 prev_vertices = NULL;
00317 tri_indices = tri_indices_;
00318 type = type_;
00319 }
00320
00322 void set(Vec3f* vertices_, Vec3f* prev_vertices_, Triangle* tri_indices_, BVHModelType type_)
00323 {
00324 vertices = vertices_;
00325 prev_vertices = prev_vertices_;
00326 tri_indices = tri_indices_;
00327 type = type_;
00328 }
00329
00332 OBBRSS fit(unsigned int* primitive_indices, int num_primitives);
00333
00335 void clear()
00336 {
00337 vertices = NULL;
00338 prev_vertices = NULL;
00339 tri_indices = NULL;
00340 type = BVH_MODEL_UNKNOWN;
00341 }
00342
00343 private:
00344
00345 Vec3f* vertices;
00346 Vec3f* prev_vertices;
00347 Triangle* tri_indices;
00348 BVHModelType type;
00349 };
00350
00351 }
00352
00353 #endif