[SOLVED] - Help with Invalid Pointer Reference

Post Reply
tmason
Posts: 19
Joined: Wed Aug 27, 2014 5:02 pm

[SOLVED] - Help with Invalid Pointer Reference

Post by tmason »

Hello,

I have a rather interesting problem that I am not sure where the problem is.

I am building a basic OpenGL/Bullet Physics engine just to learn the two systems. The project loads fine.

The problem is when I try to add my "PhysicsBox" object which is an inherited class.

I initialize the object like so; although I don't believe the problem is there:

Code: Select all

/*

Constructor for my PhysicsBox class.

*/
PhysicsBox::PhysicsBox(btDiscreteDynamicsWorld* PhysicsWorld, glm::vec3 SizeOfBox, glm::vec3 PositionOfBox, glm::vec3 InertiaOfBox, GLfloat MassOfBox) {

	Vertices = new float[108] {
		-1.0f, -1.0f, -1.0f,	// triangle 1 : begin
			-1.0f, -1.0f, 1.0f,
			-1.0f, 1.0f, 1.0f,		// triangle 1 : end
			1.0f, 1.0f, -1.0f,		// triangle 2 : begin
			-1.0f, -1.0f, -1.0f,
			-1.0f, 1.0f, -1.0f,		// triangle 2 : end
			1.0f, -1.0f, 1.0f,		// triangle 3 : begin
			-1.0f, -1.0f, -1.0f,
			1.0f, -1.0f, -1.0f,		// triangle 3 : end
			1.0f, 1.0f, -1.0f,		// triangle 4 : begin
			1.0f, -1.0f, -1.0f,
			-1.0f, -1.0f, -1.0f,	// triangle 4 : end
			-1.0f, -1.0f, -1.0f,	// triangle 5 : begin
			-1.0f, 1.0f, 1.0f,
			-1.0f, 1.0f, -1.0f,		// triangle 5 : end
			1.0f, -1.0f, 1.0f,		// triangle 6 : begin
			-1.0f, -1.0f, 1.0f,
			-1.0f, -1.0f, -1.0f,	// triangle 6 : end
			-1.0f, 1.0f, 1.0f,		// triangle 7 : begin
			-1.0f, -1.0f, 1.0f,
			1.0f, -1.0f, 1.0f,		// triangle 7 : end
			1.0f, 1.0f, 1.0f,		// triangle 8 : begin
			1.0f, -1.0f, -1.0f,
			1.0f, 1.0f, -1.0f,		// triangle 8 : end
			1.0f, -1.0f, -1.0f,		// triangle 9 : begin
			1.0f, 1.0f, 1.0f,
			1.0f, -1.0f, 1.0f,		// triangle 9 : end
			1.0f, 1.0f, 1.0f,		// triangle 10 : begin
			1.0f, 1.0f, -1.0f,
			-1.0f, 1.0f, -1.0f,		// triangle 10 : end
			1.0f, 1.0f, 1.0f,		// triangle 11 : begin
			-1.0f, 1.0f, -1.0f,
			-1.0f, 1.0f, 1.0f,		// triangle 11 : end
			1.0f, 1.0f, 1.0f,		// triangle 12 : begin
			-1.0f, 1.0f, 1.0f,
			1.0f, -1.0f, 1.0f		// triangle 12 : end
	};
	NumOfVertices = 108;
	Colors = new float[108] {
		0.583f, 0.771f, 0.014f,
			0.609f, 0.115f, 0.436f,
			0.327f, 0.483f, 0.844f,
			0.822f, 0.569f, 0.201f,
			0.435f, 0.602f, 0.223f,
			0.310f, 0.747f, 0.185f,
			0.597f, 0.770f, 0.761f,
			0.559f, 0.436f, 0.730f,
			0.359f, 0.583f, 0.152f,
			0.483f, 0.596f, 0.789f,
			0.559f, 0.861f, 0.639f,
			0.195f, 0.548f, 0.859f,
			0.014f, 0.184f, 0.576f,
			0.771f, 0.328f, 0.970f,
			0.406f, 0.615f, 0.116f,
			0.676f, 0.977f, 0.133f,
			0.971f, 0.572f, 0.833f,
			0.140f, 0.616f, 0.489f,
			0.997f, 0.513f, 0.064f,
			0.945f, 0.719f, 0.592f,
			0.543f, 0.021f, 0.978f,
			0.279f, 0.317f, 0.505f,
			0.167f, 0.620f, 0.077f,
			0.347f, 0.857f, 0.137f,
			0.055f, 0.953f, 0.042f,
			0.714f, 0.505f, 0.345f,
			0.783f, 0.290f, 0.734f,
			0.722f, 0.645f, 0.174f,
			0.302f, 0.455f, 0.848f,
			0.225f, 0.587f, 0.040f,
			0.517f, 0.713f, 0.338f,
			0.053f, 0.959f, 0.120f,
			0.393f, 0.621f, 0.362f,
			0.673f, 0.211f, 0.457f,
			0.820f, 0.883f, 0.371f,
			0.982f, 0.099f, 0.879f
	};
	NumOfColors = 108;
	CurrentPhysicsWorld = PhysicsWorld;
	HalfExtents = btVector3(SizeOfBox.x/2,
		SizeOfBox.y/2,
		SizeOfBox.z/2);
	BoxPosition = btVector3(PositionOfBox.x,
		PositionOfBox.y,
		PositionOfBox.z);
	BoxInertia = btVector3(InertiaOfBox.x,
		InertiaOfBox.y,
		InertiaOfBox.z);
	ModelMatrix = glm::mat4(1.0f);
	ModelMatrix = glm::translate(PositionOfBox) * glm::scale(SizeOfBox);
	PhysicsBoxShape = new btBoxShape(HalfExtents);
	PhysicsBoxMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), BoxPosition));
	PhysicsBoxShape->calculateLocalInertia(MassOfBox, BoxInertia);
	PhysicsBoxCI = new btRigidBody::btRigidBodyConstructionInfo(MassOfBox, PhysicsBoxMotionState, PhysicsBoxShape, BoxInertia);
	PhysicsBoxRigidBody = new btRigidBody((*PhysicsBoxCI));
	PhysicsBoxRigidBody->setUserPointer(this);
	CurrentPhysicsWorld->addRigidBody(PhysicsBoxRigidBody);
	PhysicsWorldID = CurrentPhysicsWorld->getCollisionObjectArray().size() - 1;
}
So, long story short at this point the box I have should be initialized and added into the Physics world.

The problem is when I try and use the "PhysicsBoxRigidBody" pointer above to get the position in the world. I get an access violation.

I confirmed that the pointer itself is invalid via stepping my code.

Code: Select all

void PhysicsBox::GetPhysicsPosition(void) {

	if (PhysicsBoxRigidBody && PhysicsBoxRigidBody->getMotionState()) {
		btTransform CurrentPhysicsPosition;

/*

Access violation here.

*/

		PhysicsBoxRigidBody->getMotionState()->getWorldTransform(CurrentPhysicsPosition);

/*

End Access violation.

*/

		ModelMatrix *= glm::translate(glm::vec3(CurrentPhysicsPosition.getOrigin().getX(),
			CurrentPhysicsPosition.getOrigin().getY(),
			CurrentPhysicsPosition.getOrigin().getZ()
			));
	}

}
In order to better facilitate troubleshooting of the problem the COMPLETE project is available via GitHub here: https://github.com/tmason101/QuickPhysics

Feel free to clone and use on your own; I would hope that you can help me find the bug(s)!

The project is ready to run right away if you clone and open with Visual Studio's C++ 2013.

Thank you for your time.
Last edited by tmason on Sun Aug 31, 2014 9:28 am, edited 1 time in total.
tmason
Posts: 19
Joined: Wed Aug 27, 2014 5:02 pm

Re: Help with Invalid Pointer Reference for OpenGL/Bullet Ph

Post by tmason »

Never mind, I figured this out. Problem was I had my PhysicsBox class instance getting deleted right after creation.
Post Reply