I have this line of code:
boneHierarchy = BoneHierarchy(Point3D(24.5f,
84.0f + HumanBoundingBox::HEIGHT/2.0f ,24.5f
),
CompassRadians(0.0f),
renderingEngine
);
BoneHierarchy has some vectors as private members. I take the address of the vectors and pass them to a rendering class. But I’m getting garbage when the when I call the size member function of the vector. I am taking the address of the vectors and not the elements in it.
BoneHierarchy::BoneHierarchy(Point3D const& position,
CompassRadians const& heading,
Renderer* renderingEngine) : counter(0), renderingEngine(renderingEngine)
{
CoordinateSystem bodyCoordSys = CoordinateSystem(
Vector3D(0.0f,1.0f,0.0f),
Vector3D(0.0f,0.0f,1.0f));
map<Normal3D::enumeration, TextureCoordinates> cubeTextureKind;
Normal3D::enumeration normal;
for (normal = Normal3D::begin(); normal != Normal3D::end(); ++normal)
{
cubeTextureKind[normal] = TextureAtlas::textureAtlasCoordLookup(WOOD);
}
Bone body = Bone(
Vector3D(0.0f, HumanBoundingBox::HEIGHT/2.0f,0.0f),
HumanBoundingBox::DIM,
Euler3D(0.0f,0.0f,0.0f),
cubeTextureKind,
bodyCoordSys);
//TODO there are two positions for the human, one here and one in mesh vbo, unify these into one.
body.setPosition(Vector3D(position.getX(),position.getY(),position.getZ()));
body.setEuler(Euler3D((float) (Math::toDegrees(heading.getValue())),0.0f,0.0f));
drawBone(body,UPDATE_ALL);
root = body;
map<string,Renderer::Buffer> vboVariableMap;
vboVariableMap["aVertexPosition"] = Renderer::Buffer(verticesBuf);
vboVariableMap["aTextureCoord"] = Renderer::Buffer(texCoordsBuf);
vboVariableMap["index"] = Renderer::Buffer(indicesBuf);
cout << "aBoneIndex " << boneIndexBuf.size() << endl;
vboVariableMap["aBoneIndex"] = Renderer::Buffer(boneIndexBuf);
vboVariableMap["uBoneMatrix0"] = Renderer::Buffer(transformMatrixBuf);
GLuint textureID = 0;
Renderer::VBODescription vboDescription = Renderer::VBODescription("boneShader",
vboVariableMap,
GL_DYNAMIC_DRAW,
indicesBuf.size(),
textureID);
bufferID = renderingEngine->registerBuffer(vboDescription);
cout << "bufferID " << bufferID << endl;
renderingEngine->printBoneIndexSize();
cout << &(getBoneIndexBuf()) << endl;
}
Renderer::Buffer::Buffer(vector<GLfloat> const& data):
floatData(&data), ushortData(NULL), target(GL_ARRAY_BUFFER)
{
printf("pointer: %p, size: %lu\n", floatData, floatData->size());
}
Renderer::Buffer::Buffer(vector<GLushort> const& data):
floatData(NULL), ushortData(&data), target(GL_ELEMENT_ARRAY_BUFFER)
{
}
If the
BoneHierarchyconstructor that accepts aPoint3Dand aCompassRadianscomputes the addresses of its own vector members, that’s fine. Their addresses won’t change.The code also shows an assignment statement. The addresses of the vector members of the temporary
BoneHierarchyon the right will be different from those of theBoneHierarchyobject stored inboneHierarchyon the left. Make sure you’re not copying the addresses in your assignment operator, or else theboneHierarchyobject will end up referring to the vector members of a temporary object that doesn’t exist anymore. You’ll also want to check your copy constructor.