From 099c36a71e82fb4b64ab0c4a7fbed39e0872a442 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Wed, 20 Jan 2010 19:38:04 +0000 Subject: [PATCH] Add a new flag btCollisionObject::CF_DISABLE_VISUALIZE_OBJECT to give control over what objects are drawn using the debug drawer This solves Issue 238 , thanks to Linzner for the suggestion Remove some warnings from GL_DialogDynamicsWorld. --- Demos/OpenGL/DemoApplication.cpp | 11 ++-- Demos/OpenGL/GL_DialogDynamicsWorld.cpp | 50 ++++++++--------- .../CollisionDispatch/btCollisionObject.h | 3 +- .../CollisionDispatch/btCollisionWorld.cpp | 53 ++++++++++--------- 4 files changed, 62 insertions(+), 55 deletions(-) diff --git a/Demos/OpenGL/DemoApplication.cpp b/Demos/OpenGL/DemoApplication.cpp index 6008e313d..f8ee33b0b 100644 --- a/Demos/OpenGL/DemoApplication.cpp +++ b/Demos/OpenGL/DemoApplication.cpp @@ -1109,11 +1109,14 @@ void DemoApplication::renderscene(int pass) // m_dynamicsWorld->getDebugDrawer()->drawAabb(aabbMin,aabbMax,btVector3(1,1,1)); - switch(pass) + if (!(getDebugMode()& btIDebugDraw::DBG_DrawWireframe)) { - case 0: m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),aabbMin,aabbMax);break; - case 1: m_shapeDrawer->drawShadow(m,m_sundirection*rot,colObj->getCollisionShape(),aabbMin,aabbMax);break; - case 2: m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor*btScalar(0.3),0,aabbMin,aabbMax);break; + switch(pass) + { + case 0: m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),aabbMin,aabbMax);break; + case 1: m_shapeDrawer->drawShadow(m,m_sundirection*rot,colObj->getCollisionShape(),aabbMin,aabbMax);break; + case 2: m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor*btScalar(0.3),0,aabbMin,aabbMax);break; + } } } } diff --git a/Demos/OpenGL/GL_DialogDynamicsWorld.cpp b/Demos/OpenGL/GL_DialogDynamicsWorld.cpp index 7ac3272c9..2625ca681 100644 --- a/Demos/OpenGL/GL_DialogDynamicsWorld.cpp +++ b/Demos/OpenGL/GL_DialogDynamicsWorld.cpp @@ -117,13 +117,13 @@ void GL_DialogDynamicsWorld::setScreenSize(int width, int height) if (body) { m_dynamicsWorld->removeRigidBody(body); - btVector3 newPos = colObj->getWorldTransform().getOrigin() + btVector3(m_screenWidth/2,m_screenHeight/2,0)-btVector3(width/2,height/2,0); + btVector3 newPos = colObj->getWorldTransform().getOrigin() + btVector3(btScalar(m_screenWidth/2.),btScalar(m_screenHeight/2),btScalar(0))-btVector3(btScalar(width/2.),btScalar(height/2.),btScalar(0)); colObj->getWorldTransform().setOrigin(newPos); m_dynamicsWorld->addRigidBody(body); } else { m_dynamicsWorld->removeCollisionObject(colObj); - btVector3 newPos = colObj->getWorldTransform().getOrigin() + btVector3(m_screenWidth/2,m_screenHeight/2,0)-btVector3(width/2,height/2,0); + btVector3 newPos = colObj->getWorldTransform().getOrigin() + btVector3(btScalar(m_screenWidth/2.),btScalar(m_screenHeight/2.),btScalar(0))-btVector3(btScalar(width/2.),btScalar(height/2.),btScalar(0)); colObj->getWorldTransform().setOrigin(newPos); m_dynamicsWorld->addCollisionObject(colObj); } @@ -141,7 +141,7 @@ void GL_DialogDynamicsWorld::setScreenSize(int width, int height) btTransform tr; tr.setIdentity(); - tr.setOrigin(btVector3(0,-height/2,0)); + tr.setOrigin(btVector3(btScalar(0),btScalar(-height/2.),btScalar(0.))); m_upperBorder->setWorldTransform(tr); m_dynamicsWorld->addCollisionObject(m_upperBorder); } @@ -152,7 +152,7 @@ void GL_DialogDynamicsWorld::setScreenSize(int width, int height) btTransform tr; tr.setIdentity(); - tr.setOrigin(btVector3(0,height/2,0)); + tr.setOrigin(btVector3(btScalar(0),btScalar(height/2.),btScalar(0))); m_lowerBorder->setWorldTransform(tr); m_dynamicsWorld->addCollisionObject(m_lowerBorder); } @@ -161,7 +161,7 @@ void GL_DialogDynamicsWorld::setScreenSize(int width, int height) m_dynamicsWorld->removeCollisionObject(m_leftBorder); btTransform tr; tr.setIdentity(); - tr.setOrigin(btVector3(-width/2,0,0)); + tr.setOrigin(btVector3(btScalar(-width/2.),btScalar(0),btScalar(0))); m_leftBorder->setWorldTransform(tr); m_dynamicsWorld->addCollisionObject(m_leftBorder); } @@ -170,7 +170,7 @@ void GL_DialogDynamicsWorld::setScreenSize(int width, int height) m_dynamicsWorld->removeCollisionObject(m_rightBorder); btTransform tr; tr.setIdentity(); - tr.setOrigin(btVector3(width/2,0,0)); + tr.setOrigin(btVector3(btScalar(width/2.),btScalar(0),btScalar(0))); m_rightBorder->setWorldTransform(tr); m_dynamicsWorld->addCollisionObject(m_rightBorder); @@ -185,7 +185,7 @@ void GL_DialogDynamicsWorld::setScreenSize(int width, int height) GL_DialogWindow* GL_DialogDynamicsWorld::createDialog(int horPos,int vertPos,int dialogWidth,int dialogHeight, const char* dialogTitle ) { - btBox2dShape* boxShape = new btBox2dShape(btVector3(dialogWidth/2.,dialogHeight/2.,0.4)); + btBox2dShape* boxShape = new btBox2dShape(btVector3(dialogWidth/2.f,dialogHeight/2.f,0.4f)); btScalar mass = 100.f; btVector3 localInertia; boxShape->calculateLocalInertia(mass,localInertia); @@ -193,12 +193,12 @@ GL_DialogWindow* GL_DialogDynamicsWorld::createDialog(int horPos,int vertPos,int btRigidBody* body = new btRigidBody(rbInfo); btTransform trans; trans.setIdentity(); - trans.setOrigin(btVector3(horPos-m_screenWidth/2+dialogWidth/2, vertPos+m_screenHeight/2.+dialogHeight/2,0.)); + trans.setOrigin(btVector3(btScalar(horPos-m_screenWidth/2+dialogWidth/2), btScalar(vertPos+m_screenHeight/2.+dialogHeight/2),btScalar(0.))); body->setWorldTransform(trans); - body->setDamping(0.999,0.99); + body->setDamping(0.999f,0.99f); //body->setActivationState(ISLAND_SLEEPING); body->setLinearFactor(btVector3(1,1,0)); @@ -215,7 +215,7 @@ GL_DialogWindow* GL_DialogDynamicsWorld::createDialog(int horPos,int vertPos,int GL_SliderControl* GL_DialogDynamicsWorld::createSlider(GL_DialogWindow* dialog, const char* sliderText) { - btBox2dShape* boxShape = new btBox2dShape(btVector3(6,6,0.4)); + btBox2dShape* boxShape = new btBox2dShape(btVector3(6.f,6.f,0.4f)); btScalar mass = .1f; btVector3 localInertia; boxShape->calculateLocalInertia(mass,localInertia); @@ -223,7 +223,7 @@ GL_SliderControl* GL_DialogDynamicsWorld::createSlider(GL_DialogWindow* dialog, btRigidBody* body = new btRigidBody(rbInfo); btTransform trans; trans.setIdentity(); - trans.setOrigin(btVector3(dialog->getDialogHorPos()-m_screenWidth/2+dialog->getDialogWidth()/2, dialog->getDialogVertPos()+m_screenHeight/2.+dialog->getDialogHeight()/2+dialog->getNumControls()*20,-0.2)); + trans.setOrigin(btVector3(dialog->getDialogHorPos()-m_screenWidth/2.f+dialog->getDialogWidth()/2.f, dialog->getDialogVertPos()+m_screenHeight/2.f+dialog->getDialogHeight()/2+dialog->getNumControls()*20.f,-0.2f)); body->setWorldTransform(trans); //body->setDamping(0.999,0.99); @@ -242,7 +242,7 @@ GL_SliderControl* GL_DialogDynamicsWorld::createSlider(GL_DialogWindow* dialog, btTransform frameInA; frameInA.setIdentity(); - btVector3 offset(btVector3(-dialog->getDialogWidth()/2+16,-dialog->getDialogHeight()/2+dialog->getNumControls()*20+36,0.2)); + btVector3 offset(btVector3(-dialog->getDialogWidth()/2.f+16.f,-dialog->getDialogHeight()/2.f+dialog->getNumControls()*20.f+36.f,0.2f)); frameInA.setOrigin(offset); @@ -251,8 +251,8 @@ GL_SliderControl* GL_DialogDynamicsWorld::createSlider(GL_DialogWindow* dialog, //frameInB.setOrigin(-offset/2); bool useFrameA = false; - btScalar lowerLimit = 80; - btScalar upperLimit = 170; + btScalar lowerLimit = 80.f; + btScalar upperLimit = 170.f; #if 0 btGeneric6DofConstraint* constraint = new btGeneric6DofConstraint(*dialogBody,*body,frameInA,frameInB,useFrameA); @@ -277,7 +277,7 @@ GL_ToggleControl* GL_DialogDynamicsWorld::createToggle(GL_DialogWindow* dialog, { - btBox2dShape* boxShape = new btBox2dShape(btVector3(6,6,0.4)); + btBox2dShape* boxShape = new btBox2dShape(btVector3(6.f,6.f,0.4f)); btScalar mass = 0.1f; btVector3 localInertia; boxShape->calculateLocalInertia(mass,localInertia); @@ -285,10 +285,10 @@ GL_ToggleControl* GL_DialogDynamicsWorld::createToggle(GL_DialogWindow* dialog, btRigidBody* body = new btRigidBody(rbInfo); btTransform trans; trans.setIdentity(); - trans.setOrigin(btVector3(dialog->getDialogHorPos()-m_screenWidth/2+dialog->getDialogWidth()/2, dialog->getDialogVertPos()+m_screenHeight/2.+dialog->getDialogHeight()/2+dialog->getNumControls()*20,-0.2)); + trans.setOrigin(btVector3(dialog->getDialogHorPos()-m_screenWidth/2.f+dialog->getDialogWidth()/2.f, dialog->getDialogVertPos()+m_screenHeight/2.f+dialog->getDialogHeight()/2+dialog->getNumControls()*20.f,-0.2f)); body->setWorldTransform(trans); - body->setDamping(0.999,0.99); + body->setDamping(0.999f,0.99f); //body->setActivationState(ISLAND_SLEEPING); body->setLinearFactor(btVector3(1,1,0)); @@ -304,7 +304,7 @@ GL_ToggleControl* GL_DialogDynamicsWorld::createToggle(GL_DialogWindow* dialog, btTransform frameInA; frameInA.setIdentity(); - btVector3 offset(btVector3(+dialog->getDialogWidth()/2-32,-dialog->getDialogHeight()/2+dialog->getNumControls()*20+36,0.2)); + btVector3 offset(btVector3(+dialog->getDialogWidth()/2.f-32.f,-dialog->getDialogHeight()/2.f+dialog->getNumControls()*20.f+36.f,0.2f)); frameInA.setOrigin(offset); @@ -587,7 +587,7 @@ bool GL_DialogDynamicsWorld::mouseFunc(int button, int state, int x, int y) btVector3 GL_DialogDynamicsWorld::getRayTo(int x,int y) { - float cameraDistance = m_screenHeight/2;//m_screenWidth/2;//1.f; + float cameraDistance = m_screenHeight/2.f;//m_screenWidth/2;//1.f; btVector3 cameraTargetPosition(0,0,0); btVector3 cameraUp(0,-1,0); @@ -603,7 +603,7 @@ btVector3 GL_DialogDynamicsWorld::getRayTo(int x,int y) extents.setValue(aspect * 1.0f, 1.0f,0); } else { - cameraDistance = m_screenWidth/2; + cameraDistance = m_screenWidth/2.f; aspect = m_screenHeight / (btScalar)m_screenWidth; extents.setValue(1.0f, aspect*1.f,0); } @@ -629,7 +629,7 @@ btVector3 GL_DialogDynamicsWorld::getRayTo(int x,int y) float bottom = -1.f; float nearPlane = 1.f; float tanFov = (top-bottom)*0.5f / nearPlane; - float fov = 2.0 * atanf (tanFov); + float fov = 2 * atanf (tanFov); btVector3 cameraPosition(0,0,-100); btVector3 rayFrom = cameraPosition; @@ -673,8 +673,8 @@ btVector3 GL_DialogDynamicsWorld::getRayTo(int x,int y) btVector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical; - rayTo += x * dHor; - rayTo -= y * dVert; + rayTo += btScalar(x) * dHor; + rayTo -= btScalar(y) * dVert; //rayTo += y * dVert; return rayTo; @@ -720,8 +720,8 @@ void GL_DialogDynamicsWorld::mouseMotionFunc(int x,int y) } float dx, dy; - dx = x - m_mouseOldX; - dy = y - m_mouseOldY; + dx = btScalar(x) - m_mouseOldX; + dy = btScalar(y) - m_mouseOldY; diff --git a/src/BulletCollision/CollisionDispatch/btCollisionObject.h b/src/BulletCollision/CollisionDispatch/btCollisionObject.h index 47ce89113..83198606d 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionObject.h +++ b/src/BulletCollision/CollisionDispatch/btCollisionObject.h @@ -110,7 +110,8 @@ public: CF_KINEMATIC_OBJECT= 2, CF_NO_CONTACT_RESPONSE = 4, CF_CUSTOM_MATERIAL_CALLBACK = 8,//this allows per-triangle material (friction/restitution) - CF_CHARACTER_OBJECT = 16 + CF_CHARACTER_OBJECT = 16, + CF_DISABLE_VISUALIZE_OBJECT = 32 //disable debug drawing }; enum CollisionObjectTypes diff --git a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp index 4c02c6583..229af8b3f 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp +++ b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp @@ -1196,35 +1196,38 @@ void btCollisionWorld::debugDrawWorld() for ( i=0;igetDebugMode() & btIDebugDraw::DBG_DrawWireframe) + if ((colObj->getCollisionFlags() & btCollisionObject::CF_DISABLE_VISUALIZE_OBJECT)==0) { - btVector3 color(btScalar(1.),btScalar(1.),btScalar(1.)); - switch(colObj->getActivationState()) + if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawWireframe) { - case ACTIVE_TAG: - color = btVector3(btScalar(1.),btScalar(1.),btScalar(1.)); break; - case ISLAND_SLEEPING: - color = btVector3(btScalar(0.),btScalar(1.),btScalar(0.));break; - case WANTS_DEACTIVATION: - color = btVector3(btScalar(0.),btScalar(1.),btScalar(1.));break; - case DISABLE_DEACTIVATION: - color = btVector3(btScalar(1.),btScalar(0.),btScalar(0.));break; - case DISABLE_SIMULATION: - color = btVector3(btScalar(1.),btScalar(1.),btScalar(0.));break; - default: + btVector3 color(btScalar(1.),btScalar(1.),btScalar(1.)); + switch(colObj->getActivationState()) { - color = btVector3(btScalar(1),btScalar(0.),btScalar(0.)); - } - }; + case ACTIVE_TAG: + color = btVector3(btScalar(1.),btScalar(1.),btScalar(1.)); break; + case ISLAND_SLEEPING: + color = btVector3(btScalar(0.),btScalar(1.),btScalar(0.));break; + case WANTS_DEACTIVATION: + color = btVector3(btScalar(0.),btScalar(1.),btScalar(1.));break; + case DISABLE_DEACTIVATION: + color = btVector3(btScalar(1.),btScalar(0.),btScalar(0.));break; + case DISABLE_SIMULATION: + color = btVector3(btScalar(1.),btScalar(1.),btScalar(0.));break; + default: + { + color = btVector3(btScalar(1),btScalar(0.),btScalar(0.)); + } + }; - debugDrawObject(colObj->getWorldTransform(),colObj->getCollisionShape(),color); - } - if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb)) - { - btVector3 minAabb,maxAabb; - btVector3 colorvec(1,0,0); - colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb); - m_debugDrawer->drawAabb(minAabb,maxAabb,colorvec); + debugDrawObject(colObj->getWorldTransform(),colObj->getCollisionShape(),color); + } + if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb)) + { + btVector3 minAabb,maxAabb; + btVector3 colorvec(1,0,0); + colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb); + m_debugDrawer->drawAabb(minAabb,maxAabb,colorvec); + } } }