Two patches in one - bugfix and enhancement (?)

beaugard

15-07-2007 23:13:11

I have just started using OgreBullet, and I am incredibly happy with it! Thin and nice wrapper...

Anyhow, I ran into a bug when deleting an object - the destructor removes the bullet rigid body pointer from the BulletCollisionsWorld, but not the CollisionsBody pointer from OgreBullets collisions world. This results in a hanging pointer in the mObjects deque of CollisionsWorld which crashes the app at the next update. I fixed it by adding a removeObject(Object*) to CollisionsWorld.

Second, I added a new constructor to MeshToShapeConverter which accepts a Renderable* instead of an Entity*. I also changed addVertexData so it doesn't crash if mEntity is null. Tuan Kuranes, could you check this second patch to confirm that it doesn't break anything?

Where do I send the patch? It is clumsily made - containing some changes I made to the .sln files, etc. Maybe I can mail it to Tuan Kuranes?

rti

26-07-2007 00:11:11

you could also paste the diff in here. :D

beaugard

26-07-2007 16:32:44

allright. Since you requested it, here it comes. I suppose finding the relevant parts is not so difficult after all.

? lib
? Collisions/bin
? Collisions/obj
? Collisions/scripts/VC8/OgreBulletCollisions_CVS_Eihort.vcproj.VILGOT.martin.user
? Demos/Dynamics_Demos/bin
? Demos/Dynamics_Demos/obj
? Demos/Dynamics_Demos/scripts/VC8/Ogre_Bullet_Dynamics_Demos_CVS_Eihort.vcproj.VILGOT.martin.user
? Dynamics/bin
? Dynamics/obj
? Dynamics/scripts/VC8/OgreBulletDynamics_CVS_Eihort.vcproj.VILGOT.martin.user
Index: OgreBullet_CVS_Eihort.suo
===================================================================
RCS file: /cvsroot/ogre/ogreaddons/ogrebullet/OgreBullet_CVS_Eihort.suo,v
retrieving revision 1.1
diff -u -r1.1 OgreBullet_CVS_Eihort.suo
Binary files /tmp/cvswZlMPl and OgreBullet_CVS_Eihort.suo differ
Index: Collisions/include/OgreBulletCollisionsWorld.h
===================================================================
RCS file: /cvsroot/ogre/ogreaddons/ogrebullet/Collisions/include/OgreBulletCollisionsWorld.h,v
retrieving revision 1.2
diff -u -r1.2 OgreBulletCollisionsWorld.h
--- Collisions/include/OgreBulletCollisionsWorld.h 14 Mar 2007 21:09:14 -0000 1.2
+++ Collisions/include/OgreBulletCollisionsWorld.h 14 Jul 2007 11:23:54 -0000
@@ -42,6 +42,9 @@

void addObject(Object *obj);

+ /// Returns false if obj was not found.
+ bool removeObject(Object *obj);
+
void discreteCollide();

bool isObjectregistered(Object *) const;
Index: Collisions/include/Utils/OgreBulletCollisionsMeshToShapeConverter.h
===================================================================
RCS file: /cvsroot/ogre/ogreaddons/ogrebullet/Collisions/include/Utils/OgreBulletCollisionsMeshToShapeConverter.h,v
retrieving revision 1.2
diff -u -r1.2 OgreBulletCollisionsMeshToShapeConverter.h
--- Collisions/include/Utils/OgreBulletCollisionsMeshToShapeConverter.h 14 Mar 2007 21:09:15 -0000 1.2
+++ Collisions/include/Utils/OgreBulletCollisionsMeshToShapeConverter.h 14 Jul 2007 15:39:13 -0000
@@ -33,6 +33,7 @@
class MeshToShapeConverter
{
public:
+ MeshToShapeConverter(Ogre::Renderable *rend, const Ogre::Matrix4 &transform = Ogre::Matrix4::IDENTITY);
MeshToShapeConverter(Ogre::Entity *entity,const Ogre::Matrix4 &transform = Ogre::Matrix4::IDENTITY);
MeshToShapeConverter();
~MeshToShapeConverter();
Index: Collisions/scripts/VC8/OgreBulletCollisions_CVS_Eihort.vcproj
===================================================================
RCS file: /cvsroot/ogre/ogreaddons/ogrebullet/Collisions/scripts/VC8/OgreBulletCollisions_CVS_Eihort.vcproj,v
retrieving revision 1.1
diff -u -r1.1 OgreBulletCollisions_CVS_Eihort.vcproj
--- Collisions/scripts/VC8/OgreBulletCollisions_CVS_Eihort.vcproj 28 Feb 2007 14:56:47 -0000 1.1
+++ Collisions/scripts/VC8/OgreBulletCollisions_CVS_Eihort.vcproj 8 Jul 2007 22:19:55 -0000
@@ -146,7 +146,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy $(TargetPath) &quot;../../../lib/$(ConfigurationName)&quot;"
+ CommandLine="copy $(TargetPath) &quot;$(OGRE_SRC)/lib/&quot;"
/>
</Configuration>
</Configurations>
Index: Collisions/src/OgreBulletCollisionsObject.cpp
===================================================================
RCS file: /cvsroot/ogre/ogreaddons/ogrebullet/Collisions/src/OgreBulletCollisionsObject.cpp,v
retrieving revision 1.1
diff -u -r1.1 OgreBulletCollisionsObject.cpp
--- Collisions/src/OgreBulletCollisionsObject.cpp 28 Feb 2007 14:56:48 -0000 1.1
+++ Collisions/src/OgreBulletCollisionsObject.cpp 14 Jul 2007 11:36:08 -0000
@@ -72,6 +72,7 @@
}

getBulletCollisionWorld()->removeCollisionObject( mObject );
+ getCollisionWorld()->removeObject(this);

delete mObject;
delete mShape;
Index: Collisions/src/OgreBulletCollisionsWorld.cpp
===================================================================
RCS file: /cvsroot/ogre/ogreaddons/ogrebullet/Collisions/src/OgreBulletCollisionsWorld.cpp,v
retrieving revision 1.1
diff -u -r1.1 OgreBulletCollisionsWorld.cpp
--- Collisions/src/OgreBulletCollisionsWorld.cpp 28 Feb 2007 14:56:48 -0000 1.1
+++ Collisions/src/OgreBulletCollisionsWorld.cpp 14 Jul 2007 11:30:48 -0000
@@ -116,6 +116,15 @@
mWorld->addCollisionObject(obj->getBulletObject());
}
// -------------------------------------------------------------------------
+ bool CollisionsWorld::removeObject(Object *obj)
+ {
+ std::deque<Object*>::iterator it = find(mObjects.begin(), mObjects.end(), obj);
+ if (it == mObjects.end())
+ return false;
+ mObjects.erase(it);
+ return true;
+ }
+ // -------------------------------------------------------------------------
bool CollisionsWorld::isObjectregistered(Object *obj) const
{
std::deque<Object *>::const_iterator itRes = std::find(mObjects.begin(), mObjects.end(), obj);
Index: Collisions/src/Shapes/OgreBulletCollisionsTrimeshShape.cpp
===================================================================
RCS file: /cvsroot/ogre/ogreaddons/ogrebullet/Collisions/src/Shapes/OgreBulletCollisionsTrimeshShape.cpp,v
retrieving revision 1.2
diff -u -r1.2 OgreBulletCollisionsTrimeshShape.cpp
--- Collisions/src/Shapes/OgreBulletCollisionsTrimeshShape.cpp 24 Apr 2007 12:30:26 -0000 1.2
+++ Collisions/src/Shapes/OgreBulletCollisionsTrimeshShape.cpp 8 Jul 2007 22:16:41 -0000
@@ -64,7 +64,7 @@
}

const bool useQuantizedAABB = true;
- mShape = new btBvhTriangleMeshShape(mTriMesh, useQuantizedAABB);
+ mShape = new btBvhTriangleMeshShape(mTriMesh);//, useQuantizedAABB);
}
// -------------------------------------------------------------------------
TriangleMeshCollisionShape::~TriangleMeshCollisionShape()
Index: Collisions/src/Utils/OgreBulletCollisionsMeshToShapeConverter.cpp
===================================================================
RCS file: /cvsroot/ogre/ogreaddons/ogrebullet/Collisions/src/Utils/OgreBulletCollisionsMeshToShapeConverter.cpp,v
retrieving revision 1.1
diff -u -r1.1 OgreBulletCollisionsMeshToShapeConverter.cpp
--- Collisions/src/Utils/OgreBulletCollisionsMeshToShapeConverter.cpp 28 Feb 2007 14:56:48 -0000 1.1
+++ Collisions/src/Utils/OgreBulletCollisionsMeshToShapeConverter.cpp 14 Jul 2007 15:38:50 -0000
@@ -84,7 +84,7 @@
}

// Get the bone index element
- if (mEntity->hasSkeleton())
+ if (mEntity && mEntity->hasSkeleton())
{

Ogre::MeshPtr mesh = mEntity->getMesh ();
@@ -283,6 +283,25 @@
addEntity(entity, transform);
}
//------------------------------------------------------------------------------------------------
+ MeshToShapeConverter::MeshToShapeConverter(Renderable *rend, const Matrix4 &transform) :
+ mEntity (0),
+ mVertexBuffer (0),
+ mIndexBuffer (0),
+ mVertexCount (0),
+ mIndexCount (0),
+ mBounds (Vector3(-1,-1,-1)),
+ mBoundRadius (-1),
+ mBoneIndex (0),
+ mTransform (transform)
+{
+ RenderOperation op;
+ rend->getRenderOperation(op);
+ addVertexData(op.vertexData);
+ if(op.useIndexes)
+ addIndexData(op.indexData);
+
+}
+//------------------------------------------------------------------------------------------------
MeshToShapeConverter::MeshToShapeConverter() :
mVertexBuffer (0),
mIndexBuffer (0),
Index: Demos/Dynamics_Demos/scripts/VC8/Ogre_Bullet_Dynamics_Demos_CVS_Eihort.vcproj
===================================================================
RCS file: /cvsroot/ogre/ogreaddons/ogrebullet/Demos/Dynamics_Demos/scripts/VC8/Ogre_Bullet_Dynamics_Demos_CVS_Eihort.vcproj,v
retrieving revision 1.1
diff -u -r1.1 Ogre_Bullet_Dynamics_Demos_CVS_Eihort.vcproj
--- Demos/Dynamics_Demos/scripts/VC8/Ogre_Bullet_Dynamics_Demos_CVS_Eihort.vcproj 28 Feb 2007 14:56:48 -0000 1.1
+++ Demos/Dynamics_Demos/scripts/VC8/Ogre_Bullet_Dynamics_Demos_CVS_Eihort.vcproj 13 Jul 2007 10:46:41 -0000
@@ -40,7 +40,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="&quot;$(BULLET_HOME)\src&quot;;..\include;..\..\include;..\..\..\include;..\..\..\..\include;..\..\..\..\Collisions\include;..\..\..\..\Dynamics\include;..\..\..\..\..\..\Ogrenew\OgreMain\include;..\..\..\..\..\..\Ogrenew\Samples\Common\include"
+ AdditionalIncludeDirectories="&quot;$(BULLET_HOME)\src&quot;;..\include;..\..\include;..\..\..\include;..\..\..\..\include;..\..\..\..\Collisions\include;..\..\..\..\Dynamics\include;&quot;$(OGRE_SRC)\OgreMain\include&quot;;&quot;$(OGRE_SRC)\Samples\Common\include&quot;;&quot;$(OGRE_SRC)\Dependencies\include&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@@ -64,10 +64,10 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="OgreMain_d.lib ois_static_d.lib OgreBulletCollisions_d.lib OgreBulletDynamics_d.lib libbulletcollision_d.lib libbulletdynamics_d.lib libbulletmath_d.lib"
+ AdditionalDependencies="OgreMain_d.lib ois_d.lib OgreBulletCollisions_d.lib OgreBulletDynamics_d.lib libbulletcollision_d.lib libbulletdynamics_d.lib libbulletmath_d.lib"
OutputFile="$(OutDir)/OgreBulletDynamicsDemo.exe"
LinkIncremental="2"
- AdditionalLibraryDirectories="&quot;..\..\..\..\lib\$(ConfigurationName)&quot;;..\..\..\..\..\..\Ogrenew\lib;&quot;$(BULLET_HOME)\out\$(ConfigurationName)8\libs&quot;"
+ AdditionalLibraryDirectories="&quot;..\..\..\..\lib\$(ConfigurationName)&quot;;&quot;$(OGRE_SRC)\Dependencies\lib\$(ConfigurationName)&quot;;&quot;$(OGRE_SRC)\lib&quot;;&quot;$(BULLET_HOME)\out\$(ConfigurationName)8\libs&quot;"
IgnoreAllDefaultLibraries="false"
IgnoreDefaultLibraryNames=""
GenerateDebugInformation="true"
@@ -131,7 +131,7 @@
InlineFunctionExpansion="1"
FavorSizeOrSpeed="1"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="&quot;$(BULLET_HOME)\src&quot;;..\include;..\..\include;..\..\..\include;..\..\..\..\include;..\..\..\..\Collisions\include;..\..\..\..\Dynamics\include;..\..\..\..\..\..\Ogrenew\OgreMain\include;..\..\..\..\..\..\Ogrenew\Samples\Common\include"
+ AdditionalIncludeDirectories="&quot;$(BULLET_HOME)\src&quot;;..\include;..\..\include;..\..\..\include;..\..\..\..\include;..\..\..\..\Collisions\include;..\..\..\..\Dynamics\include;&quot;$(OGRE_SRC)\OgreMain\include&quot;;&quot;$(OGRE_SRC)\Samples\Common\include&quot;;&quot;$(OGRE_SRC)\Dependencies\include&quot;"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_PRECOMP"
StringPooling="true"
MinimalRebuild="true"
@@ -157,10 +157,10 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="OgreMain.lib ois_static.lib OgreBulletCollisions.lib OgreBulletDynamics.lib libbulletcollision.lib libbulletdynamics.lib libbulletmath.lib"
+ AdditionalDependencies="OgreMain.lib ois.lib OgreBulletCollisions.lib OgreBulletDynamics.lib libbulletcollision.lib libbulletdynamics.lib libbulletmath.lib"
OutputFile="$(OutDir)/OgreBulletDynamicsDemo.exe"
LinkIncremental="1"
- AdditionalLibraryDirectories="&quot;..\..\..\..\lib\$(ConfigurationName)&quot;;..\..\..\..\..\..\Ogrenew\lib;&quot;$(BULLET_HOME)\out\$(ConfigurationName)8\libs&quot;"
+ AdditionalLibraryDirectories="&quot;..\..\..\..\lib\$(ConfigurationName)&quot;;&quot;$(OGRE_SRC)\Dependencies\lib\$(ConfigurationName)&quot;;&quot;$(OGRE_SRC)\lib&quot;;&quot;$(BULLET_HOME)\out\$(ConfigurationName)8\libs&quot;"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -192,7 +192,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy $(TargetPath) ..\..\..\..\..\..\Ogrenew\Samples\Common\bin\$(ConfigurationName)"
+ CommandLine="copy $(TargetPath) $(OGRE_SRC)\Samples\Common\bin\$(ConfigurationName)"
/>
</Configuration>
</Configurations>
Index: Demos/include/OgreBulletInputListener.h
===================================================================
RCS file: /cvsroot/ogre/ogreaddons/ogrebullet/Demos/include/OgreBulletInputListener.h,v
retrieving revision 1.2
diff -u -r1.2 OgreBulletInputListener.h
--- Demos/include/OgreBulletInputListener.h 14 Mar 2007 21:09:15 -0000 1.2
+++ Demos/include/OgreBulletInputListener.h 8 Jul 2007 22:22:53 -0000
@@ -53,7 +53,7 @@

#else

- #include "ois.h"
+ #include "OIS\ois.h"
namespace OIS
{
class Keyboard;
Index: Dynamics/scripts/VC8/OgreBulletDynamics_CVS_Eihort.vcproj
===================================================================
RCS file: /cvsroot/ogre/ogreaddons/ogrebullet/Dynamics/scripts/VC8/OgreBulletDynamics_CVS_Eihort.vcproj,v
retrieving revision 1.1
diff -u -r1.1 OgreBulletDynamics_CVS_Eihort.vcproj
--- Dynamics/scripts/VC8/OgreBulletDynamics_CVS_Eihort.vcproj 28 Feb 2007 14:56:54 -0000 1.1
+++ Dynamics/scripts/VC8/OgreBulletDynamics_CVS_Eihort.vcproj 8 Jul 2007 22:20:16 -0000
@@ -146,7 +146,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy $(TargetPath) &quot;../../../lib/$(ConfigurationName)&quot;"
+ CommandLine="copy $(TargetPath) &quot;$(OGRE_SRC)/lib/&quot;"
/>
</Configuration>
</Configurations>

rti

31-07-2007 22:20:49

thanks a lot.
8)

rti

01-08-2007 20:40:54

I added those changes to my codebase without any problems for now.

Thanks again.