Sign in to follow this  
ic0de

dealing with multiple sub-systems and sharing data between them

Recommended Posts

In my game I use the Bullet physics engine to do physics. Bullet has a class called btRigidBody which represents a single rigid object in the physics world. My enemy class contains a pointer to a btRigidBody which represents the enemy's physical body. I also have some code to create an explosion, the code gathers all btRigidBodys close to the center of the explosion and apply's a force to them proportional to their distance from the center. The problem is that at this point the explosion code can only obtain a reference to a btRigidBody but not the class that contains it. I need access to the enemy that contains the btRigidBody so I can apply damage to it. At this time what I do is look through my list of enemies until I find one that contains a btRigidBody with the same address as the one which is being hit with the explosion and then apply damage to that enemy. While this seems works pretty reliably it is terribly inefficient and doesn't scale well when the list of enemies becomes larger. given that I cannot actually modify the btRigidBody class how can I store a reference to its owner in order to avoid an expensive search?

Edited by ic0de

Share this post


Link to post
Share on other sites

Seems like you are allowing things to see the rigid bodies that shouldn't be. Seems like the explosion management system should instead gather up [i]objects[/i] within the radius, and pass them damage and force events instead, and let the objects physics components worry about translating a force event to an actual force impulse on the physics bodies. Anything outside of the physics component system shouldn't even know what a btRigidBody is.

Share this post


Link to post
Share on other sites

I don't know how bullet physics does it, but with other physics library, they often have a user data pointer in their body structure that can point to whatever the programmer wants.

 

So, in this case, the user data pointer would point to the object that owns it; no need to search objects to find it.  I would assume bullet has something like that as well.

Share this post


Link to post
Share on other sites

Or, why not have the code that creates an explosion gather all the enemies close to the center of the explosion, and then get the btRigidBody member from it when you apply the physics. If you're wanting to apply both the physical force and the damage from the same method, then you don't really want the rigid body, but the enemy. Otherwise, and perhaps better, would be to separate concerns and not apply forces and deal damage in the same method.

Share this post


Link to post
Share on other sites

Or, why not have the code that creates an explosion gather all the enemies close to the center of the explosion, and then get the btRigidBody member from it when you apply the physics. If you're wanting to apply both the physical force and the damage from the same method, then you don't really want the rigid body, but the enemy. Otherwise, and perhaps better, would be to separate concerns and not apply forces and deal damage in the same method.

 

I don't actually apply forces and deal damage in the same function I just notify the enemy that it has been hit and how hard. The enemy class itself decides how damage is dealt. The reason I gather up rigidBodys instead of enemies is because bullet has a simple way to gather all the objects that overlap with an arbitrary collision shape. I'll look into BeerNutts suggestion. 

 

EDIT: I looked into it and bullet provides setUserPointer/getUserPointer functions, I'm surprised I overlooked that.

Edited by ic0de

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this