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
00038 #ifndef COLLISION_CHECKING_SELF_COLLISION_H
00039 #define COLLISION_CHECKING_SELF_COLLISION_H
00040
00041
00042 #include "collision_checking/collision_primitive.h"
00043 #include <iostream>
00044
00046 namespace collision_checking
00047 {
00048
00050 template<typename BV>
00051 int continuousCollide(BVHModel<BV>& model1, BVHModel<BV>& model2, BVH_CollideResult* res, BVHFrontList* front_list = NULL)
00052 {
00053
00054 if(model1.getModelType() == BVH_MODEL_POINTCLOUD && model2.getModelType() == BVH_MODEL_POINTCLOUD)
00055 {
00056 std::cerr << "BVH Error: Continuous collision only supported between two triangle models or one triangle model and one point cloud." << std::endl;
00057 return BVH_ERR_UNSUPPORTED_FUNCTION;
00058 }
00059
00060
00061 if(model1.build_state == BVH_BUILD_STATE_PROCESSED && model2.build_state == BVH_BUILD_STATE_PROCESSED)
00062 {
00063 std::cerr << "BVH Error: Continuous collision must have at least one object moving!" << std::endl;
00064 return BVH_ERR_UNSUPPORTED_FUNCTION;
00065 }
00066 else if(model1.build_state == BVH_BUILD_STATE_UPDATED && model2.build_state == BVH_BUILD_STATE_UPDATED)
00067 {
00068
00069 }
00070 else if(model1.build_state == BVH_BUILD_STATE_PROCESSED && model2.build_state == BVH_BUILD_STATE_UPDATED)
00071 {
00072
00073 model1.prev_vertices = model1.vertices;
00074 }
00075 else if(model1.build_state == BVH_BUILD_STATE_UPDATED && model2.build_state == BVH_BUILD_STATE_PROCESSED)
00076 {
00077 model2.prev_vertices = model2.vertices;
00078 }
00079 else
00080 {
00081 std::cerr << "BVH Error: Must finish BVH model construction before call collide()!" << std::endl;
00082 return BVH_ERR_BUILD_OUT_OF_SEQUENCE;
00083 }
00084
00085 res->resetRecord();
00086
00087 if(front_list && front_list->size() > 0)
00088 continuousPropagateBVHFrontList(model1.bvs, model2.bvs, model1.vertices, model2.vertices, model1.prev_vertices, model2.prev_vertices, model1.tri_indices, model2.tri_indices, res, front_list);
00089 else
00090 continuousCollideRecurse(model1.bvs, model2.bvs, 0, 0, model1.vertices, model2.vertices, model1.prev_vertices, model2.prev_vertices, model1.tri_indices, model2.tri_indices, res, front_list);
00091
00092 if(model1.build_state == BVH_BUILD_STATE_PROCESSED && model2.build_state == BVH_BUILD_STATE_UPDATED)
00093 {
00094
00095 model1.prev_vertices = NULL;
00096 }
00097 else if(model1.build_state == BVH_BUILD_STATE_UPDATED && model2.build_state == BVH_BUILD_STATE_PROCESSED)
00098 {
00099 model2.prev_vertices = NULL;
00100 }
00101
00102 return BVH_OK;
00103 }
00104
00106 template<typename BV>
00107 int continuousSelfCollide(BVHModel<BV>& model, BVH_CollideResult* res, BVHFrontList* front_list = NULL)
00108 {
00109
00110 if(model.getModelType() != BVH_MODEL_TRIANGLES)
00111 {
00112 std::cerr << "BVH Error: Continuous self collision only supported for a triangle model." << std::endl;
00113 return BVH_ERR_UNSUPPORTED_FUNCTION;
00114 }
00115
00116 if(model.build_state != BVH_BUILD_STATE_UPDATED)
00117 {
00118 if(model.build_state == BVH_BUILD_STATE_PROCESSED)
00119 {
00120 std::cerr << "BVH Error: Continuous self collision only handles moving object!" << std::endl;
00121 return BVH_ERR_UNSUPPORTED_FUNCTION;
00122 }
00123 else
00124 {
00125 std::cerr << "BVH Error: Must finish BVH model construction before call collide()!" << std::endl;
00126 return BVH_ERR_BUILD_OUT_OF_SEQUENCE;
00127 }
00128 }
00129
00130 res->resetRecord();
00131
00132 if(front_list && front_list->size() > 0)
00133 continuousPropagateBVHFrontList(model.bvs, model.bvs, model.vertices, model.vertices, model.prev_vertices, model.prev_vertices, model.tri_indices, model.tri_indices, res, front_list);
00134 else
00135 continuousSelfCollideRecurse(model.bvs, 0, model.vertices, model.prev_vertices, model.tri_indices, res, front_list);
00136
00137 return BVH_OK;
00138 }
00139
00140
00141
00142 }
00143
00144 #endif