From 7a175fb65e93f954e22bca97a4283cab1ef2d697 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Thu, 11 Feb 2010 09:18:49 +0000 Subject: [PATCH] Add pairwise collision test: void btCollisionWorld::contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback) cmake: improve feedback for Maya Plugin handling if the Maya base path is not detected --- Extras/MayaPlugin/CMakeLists.txt | 118 ++++++++++-------- .../CollisionDispatch/btCollisionWorld.cpp | 19 +++ .../CollisionDispatch/btCollisionWorld.h | 5 + 3 files changed, 87 insertions(+), 55 deletions(-) diff --git a/Extras/MayaPlugin/CMakeLists.txt b/Extras/MayaPlugin/CMakeLists.txt index f2eee2239..c404183ca 100644 --- a/Extras/MayaPlugin/CMakeLists.txt +++ b/Extras/MayaPlugin/CMakeLists.txt @@ -15,70 +15,78 @@ FIND_PATH(MAYA_BASE_DIR include/maya/MFn.h PATH /usr/autodesk/maya "C:/Program Files/Autodesk/Maya2008" "C:/Program Files/Autodesk/Maya2009" - "C:/Program Files/Autodesk/Maya8.5") + "C:/Program Files/Autodesk/Maya8.5" + "C:/Program Files (x86)/Autodesk/Maya2010" + ) -SET(MAYA_INC_DIR ${MAYA_BASE_DIR}/include) -SET(MAYA_LIB_DIR ${MAYA_BASE_DIR}/lib) +IF (MAYA_BASE_DIR) + message ("Maya found at location " ${MAYA_BASE_DIR}) -INCLUDE_DIRECTORIES(${MAYA_INC_DIR} ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Extras/MayaPlugin ) -LINK_DIRECTORIES(${MAYA_LIB_DIR}) + SET(MAYA_INC_DIR ${MAYA_BASE_DIR}/include) + SET(MAYA_LIB_DIR ${MAYA_BASE_DIR}/lib) -ADD_DEFINITIONS(-D_BOOL) -ADD_DEFINITIONS(-DREQUIRE_IOSTREAM) + INCLUDE_DIRECTORIES(${MAYA_INC_DIR} ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Extras/MayaPlugin ) + LINK_DIRECTORIES(${MAYA_LIB_DIR}) -SET(TARGET_H - box_shape.h bt_sphere_shape.h dSolverNode.h rigid_body_impl.h - box_shape_impl.h collision_shape.h mathUtils.h rigidBodyNode.h - bt_box_shape.h collision_shape_impl.h mayaUtils.h solver.h - bt_collision_shape.h collisionShapeNode.h mesh_shape.h solver_impl.h - bt_convex_hull_shape.h convex_hull_shape.h mesh_shape_impl.h sphere_shape.h - bt_mesh_shape.h convex_hull_shape_impl.h plane_shape.h sphere_shape_impl.h - bt_plane_shape.h dRigidBodyArrayCmd.h plane_shape_impl.h - bt_rigid_body.h dRigidBodyCmd.h rigidBodyArrayNode.h - bt_solver.h dSolverCmd.h rigid_body.h pdbIO.h - shared_ptr.h drawUtils.h -) + ADD_DEFINITIONS(-D_BOOL) + ADD_DEFINITIONS(-DREQUIRE_IOSTREAM) -SET(TARGET_SRC - pluginMain.cpp bulletExport.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp - solver.cpp bt_solver.cpp dSolverNode.cpp dSolverCmd.cpp dRigidBodyCmd.cpp dRigidBodyArrayCmd.cpp - pdbIO.cpp drawUtils.cpp constraint/dHingeConstraintCmd.cpp constraint/dSliderConstraintCmd.cpp - constraint/hingeConstraintNode.cpp constraint/sixdofConstraintNode.cpp constraint/dNailConstraintCmd.cpp - constraint/dsixdofConstraintCmd.cpp constraint/nailConstraintNode.cpp constraint/sliderConstraintNode.cpp -) + SET(TARGET_H + box_shape.h bt_sphere_shape.h dSolverNode.h rigid_body_impl.h + box_shape_impl.h collision_shape.h mathUtils.h rigidBodyNode.h + bt_box_shape.h collision_shape_impl.h mayaUtils.h solver.h + bt_collision_shape.h collisionShapeNode.h mesh_shape.h solver_impl.h + bt_convex_hull_shape.h convex_hull_shape.h mesh_shape_impl.h sphere_shape.h + bt_mesh_shape.h convex_hull_shape_impl.h plane_shape.h sphere_shape_impl.h + bt_plane_shape.h dRigidBodyArrayCmd.h plane_shape_impl.h + bt_rigid_body.h dRigidBodyCmd.h rigidBodyArrayNode.h + bt_solver.h dSolverCmd.h rigid_body.h pdbIO.h + shared_ptr.h drawUtils.h + ) -ADD_LIBRARY(BulletMayaPlugin SHARED ${TARGET_H} ${TARGET_SRC}) + SET(TARGET_SRC + pluginMain.cpp bulletExport.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp + solver.cpp bt_solver.cpp dSolverNode.cpp dSolverCmd.cpp dRigidBodyCmd.cpp dRigidBodyArrayCmd.cpp + pdbIO.cpp drawUtils.cpp constraint/dHingeConstraintCmd.cpp constraint/dSliderConstraintCmd.cpp + constraint/hingeConstraintNode.cpp constraint/sixdofConstraintNode.cpp constraint/dNailConstraintCmd.cpp + constraint/dsixdofConstraintCmd.cpp constraint/nailConstraintNode.cpp constraint/sliderConstraintNode.cpp + ) + + ADD_LIBRARY(BulletMayaPlugin SHARED ${TARGET_H} ${TARGET_SRC}) -IF (WIN32) - SET(MAYA_LIBS OpenMaya Foundation OpenMayaAnim OpenMayaFX OpenMayaUI) - IF (CMAKE_CL_64) - SET_TARGET_PROPERTIES(BulletMayaPlugin PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS /MACHINE:X64") - ELSE (CMAKE_CL_64) - SET_TARGET_PROPERTIES(BulletMayaPlugin PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS /MACHINE:X86") - ENDIF (CMAKE_CL_64) - SET_TARGET_PROPERTIES(BulletMayaPlugin PROPERTIES SUFFIX ".mll") + IF (WIN32) + SET(MAYA_LIBS OpenMaya Foundation OpenMayaAnim OpenMayaFX OpenMayaUI) + IF (CMAKE_CL_64) + SET_TARGET_PROPERTIES(BulletMayaPlugin PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS /MACHINE:X64") + ELSE (CMAKE_CL_64) + SET_TARGET_PROPERTIES(BulletMayaPlugin PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS /MACHINE:X86") + ENDIF (CMAKE_CL_64) + SET_TARGET_PROPERTIES(BulletMayaPlugin PROPERTIES SUFFIX ".mll") - LINK_DIRECTORIES(${MAYA_LIB_DIR}) - TARGET_LINK_LIBRARIES(BulletMayaPlugin BulletDynamics BulletCollision LinearMath ${MAYA_LIBS} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) - SET(CMAKE_SHARED_LINKER_FLAGS "/export:initializePlugin /export:uninitializePlugin") -ELSE (WIN32) - SET(MAYA_LIBS OpenMayalib Foundation OpenMayaAnim OpenMayaFX OpenMayaUI) - LINK_DIRECTORIES(${MAYA_LIB_DIR}) - TARGET_LINK_LIBRARIES(BulletMayaPlugin BulletDynamics BulletCollision LinearMath ${MAYA_LIBS} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) -ENDIF(WIN32) + LINK_DIRECTORIES(${MAYA_LIB_DIR}) + TARGET_LINK_LIBRARIES(BulletMayaPlugin BulletDynamics BulletCollision LinearMath ${MAYA_LIBS} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) + SET(CMAKE_SHARED_LINKER_FLAGS "/export:initializePlugin /export:uninitializePlugin") + ELSE (WIN32) + SET(MAYA_LIBS OpenMayalib Foundation OpenMayaAnim OpenMayaFX OpenMayaUI) + LINK_DIRECTORIES(${MAYA_LIB_DIR}) + TARGET_LINK_LIBRARIES(BulletMayaPlugin BulletDynamics BulletCollision LinearMath ${MAYA_LIBS} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) + ENDIF(WIN32) -#OPTION(BUILD_STANDALONE "Build a standalone exporter program") -# -#IF (BUILD_STANDALONE) -# IF (WIN32) -# -# ELSE (WIN32) -# SET(MAYA_LIBS OpenMayalib Foundation OpenMayaAnim) -# ADD_EXECUTABLE(me ${TARGET_H} ${TARGET_SRC} standalone.cpp) -# LINK_DIRECTORIES(${MAYA_LIB_DIR}) -# TARGET_LINK_LIBRARIES(me ${MAYA_LIBS} pthread m imf) -# ENDIF (WIN32) -#ENDIF (BUILD_STANDALONE) + #OPTION(BUILD_STANDALONE "Build a standalone exporter program") + # + #IF (BUILD_STANDALONE) + # IF (WIN32) + # + # ELSE (WIN32) + # SET(MAYA_LIBS OpenMayalib Foundation OpenMayaAnim) + # ADD_EXECUTABLE(me ${TARGET_H} ${TARGET_SRC} standalone.cpp) + # LINK_DIRECTORIES(${MAYA_LIB_DIR}) + # TARGET_LINK_LIBRARIES(me ${MAYA_LIBS} pthread m imf) + # ENDIF (WIN32) + #ENDIF (BUILD_STANDALONE) +ELSE() + MESSAGE("Maya not found, try adding your Maya path in Bullet/Extras/MayaPlugin/CMakeListst.txt under FIND_PATH(MAYA_BASE_DIR ...") +ENDIF() \ No newline at end of file diff --git a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp index d60c01184..a81fc505c 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp +++ b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp @@ -1017,6 +1017,25 @@ void btCollisionWorld::contactTest( btCollisionObject* colObj, ContactResultCall } +///contactTest performs a discrete collision test between two collision objects and calls the resultCallback if overlap if detected. +///it reports one or more contact points (including the one with deepest penetration) +void btCollisionWorld::contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback) +{ + btCollisionAlgorithm* algorithm = getDispatcher()->findAlgorithm(colObjA,colObjB); + if (algorithm) + { + btBridgedManifoldResult contactPointResult(colObjA,colObjB, resultCallback); + //discrete collision detection query + algorithm->processCollision(colObjA,colObjB, getDispatchInfo(),&contactPointResult); + + algorithm->~btCollisionAlgorithm(); + getDispatcher()->freeCollisionAlgorithm(algorithm); + } + +} + + + class DebugDrawcallback : public btTriangleCallback, public btInternalTriangleIndexCallback { diff --git a/src/BulletCollision/CollisionDispatch/btCollisionWorld.h b/src/BulletCollision/CollisionDispatch/btCollisionWorld.h index 630b255f9..ba970de7f 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionWorld.h +++ b/src/BulletCollision/CollisionDispatch/btCollisionWorld.h @@ -403,6 +403,11 @@ public: ///it reports one or more contact points for every overlapping object (including the one with deepest penetration) void contactTest(btCollisionObject* colObj, ContactResultCallback& resultCallback); + ///contactTest performs a discrete collision test between two collision objects and calls the resultCallback if overlap if detected. + ///it reports one or more contact points (including the one with deepest penetration) + void contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback); + + /// rayTestSingle performs a raycast call and calls the resultCallback. It is used internally by rayTest. /// In a future implementation, we consider moving the ray test as a virtual method in btCollisionShape. /// This allows more customization.