Errors: OgreBullet + Bullet 2.81 [HELP!]

jorgerosa

03-12-2012 22:01:27

Hello all. This is my first post here :)

I´m using: Windows7 + Code::Blocks SVN4589 + MinGW GCC 4.7.2 + Bullet Physics 2.81 + OgreBullet Rev.2978 (All updated to the very lattest versions!)

1 • Compiling Bullet and OgreBullet give me errors like this: (Caused because I´m using: Bullet Physics 2.81)
(...)
OgreBulletCollisionsRay.cpp||In member function 'OgreBulletCollisions::Object* OgreBulletCollisions::CollisionClosestRayResultCallback::getCollidedObject() const':|
OgreBulletCollisionsRay.cpp|96|error: invalid conversion from 'const btCollisionObject*' to 'btCollisionObject*' [-fpermissive]|
(...)
Note the: "error: invalid conversion from 'const btCollisionObject*' to 'btCollisionObject*'"


2 • I´ve edited some OgreBullet files, just like the next example, and seems to work ok: (for example in "OgreBulletDynamicsWorld.cpp")
#if BT_BULLET_VERSION>=281
const btCollisionObject* obA = contactManifold->getBody0(); // For newer Bullet versions
const btCollisionObject* obB = contactManifold->getBody1(); // For newer Bullet versions
#else
btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0()); // For older Bullet versions (original code)
btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1()); // For older Bullet versions (original code)
#endif


3 • I´m stuck here at file "(...) OgreBullet\Collisions\src\OgreBulletCollisionsRay.cpp" at line 87, and I´m trying to edit it like:
Object *CollisionClosestRayResultCallback::getCollidedObject () const
{

#if BT_BULLET_VERSION>=281
return <---- ??? NOW,WHAT SHOULD I ADD HERE ??? ---- THANKS !!!
#else
return mWorld->findObject(static_cast<btCollisionWorld::ClosestRayResultCallback *> (mRayResultCallback)->m_collisionObject); // For older Bullet versions (original code)
#endif

}
Note: If I remove or coment that lines, everything compiles ok (but things will be broken, in later use in my project, of course)

QUESTION: What code should I add in that line? (Been trying lots of ideas, all fail here...)
OR... I´m doing everything wrong?...
OR... There is an updated (maybe unofficial) OgreBullet version? (If exists, I can´t find...)
THANKYOU!

dermont

04-12-2012 06:44:16

Did you try the changes in the following thread?
viewtopic.php?f=12&t=14207

jorgerosa

04-12-2012 17:25:39

Did you try the changes in the following thread?
viewtopic.php?f=12&t=14207

Thanks for the tip dermont, in fact, my fix is based on that topic. (I´ve searched a lot from OgreBullet , other forums, googling, etc, etc) Maybe I am missing something simple... Still I´m stuck in the above code.

dermont

04-12-2012 17:59:08

Did you try the changes in the following thread?
viewtopic.php?f=12&t=14207

Thanks for the tip dermont, in fact, my fix is based on that topic. (I´ve searched a lot from OgreBullet , other forums, googling, etc, etc) Maybe I am missing something simple... Still I´m stuck in the above code.


Fair enough I'll check my version of OgreBullet again but I thought that the patch already contained a fix for this in the OgreBulletCollisionsWorld header file(?).


Index: Collisions/src/OgreBulletCollisionsWorld.cpp
===================================================================
--- Collisions/src/OgreBulletCollisionsWorld.cpp (revision 2978)
+++ Collisions/src/OgreBulletCollisionsWorld.cpp (working copy)
@@ -182,7 +182,11 @@
return false;
}
// -------------------------------------------------------------------------
+#if BT_BULLET_VERSION>=281
+Object *CollisionsWorld::findObject(const btCollisionObject *object) const
+#else
Object *CollisionsWorld::findObject(btCollisionObject *object) const
+#endif
{
std::deque<Object *>::const_iterator it = mObjects.begin();
while (it != mObjects.end())
@@ -223,9 +227,16 @@
{
btPersistentManifold* contactManifold = mWorld->getDispatcher()->getManifoldByIndexInternal(i);

+#if BT_BULLET_VERSION>=281
+ const btCollisionObject* obA = contactManifold->getBody0();
+ const btCollisionObject* obB = contactManifold->getBody1();
+
+#else
btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0());
btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1());
+#endif

+
contactManifold->refreshContactPoints(obA->getWorldTransform(),obB->getWorldTransform());

const unsigned int numContacts = contactManifold->getNumContacts();
+}
Index: Collisions/include/OgreBulletCollisionsWorld.h
===================================================================
--- Collisions/include/OgreBulletCollisionsWorld.h (revision 2978)
+++ Collisions/include/OgreBulletCollisionsWorld.h (working copy)
@@ -58,9 +58,12 @@

bool isObjectregistered(Object *) const;
Object *findObject(Ogre::SceneNode *node) const;
+#if BT_BULLET_VERSION>=281
+ Object *findObject(const btCollisionObject *object) const;
+#else
Object *findObject(btCollisionObject *object) const;
+#endif

-
// mShowDebugContactPoints getter
bool getShowDebugContactPoints() const { return mShowDebugContactPoints; }
// mShowDebugContactPoints setter
Index: Dynamics/src/OgreBulletDynamicsWorld.cpp
===================================================================
--- Dynamics/src/OgreBulletDynamicsWorld.cpp (revision 2978)
+++ Dynamics/src/OgreBulletDynamicsWorld.cpp (working copy)
@@ -108,9 +108,14 @@
{
btPersistentManifold* contactManifold = mWorld->getDispatcher()->getManifoldByIndexInternal(i);

+#if BT_BULLET_VERSION>=281
+ const btCollisionObject* obA = contactManifold->getBody0();
+ const btCollisionObject* obB = contactManifold->getBody1();
+
+#else
btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0());
btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1());
-
+#endif
contactManifold->refreshContactPoints(obA->getWorldTransform(),obB->getWorldTransform());

const unsigned int numContacts = contactManifold->getNumContacts();

hyst329

18-12-2012 17:22:31

i've just removed the const attribute using const_cast and it seems to work!


//OgreBulletDynamicsWorld

#if BT_BULLET_VERSION>=281
btCollisionObject* obA = const_cast<btCollisionObject*>(contactManifold->getBody0());; // For newer Bullet versions
btCollisionObject* obB = const_cast<btCollisionObject*>(contactManifold->getBody1()); // For newer Bullet versions
#else
btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0()); // For older Bullet versions (original code)
btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1()); // For older Bullet versions (original code)
#endif

//OgreBulletCollisionsRay

#if BT_BULLET_VERSION>=281
return mWorld->findObject(const_cast<btCollisionObject*>(static_cast<btCollisionWorld::ClosestRayResultCallback *> (mRayResultCallback)->m_collisionObject));
#else
return mWorld->findObject(static_cast<btCollisionWorld::ClosestRayResultCallback *> (mRayResultCallback)->m_collisionObject);
#endif


and in dynamics demo used (with Ogre 1.8.1) commandline compiler argument /wd4251 (and also /wd4244) to disable tons of warnings