Skip to main content
GameDev.net gamedev.net
🔒 Locked

Some issues

Started by Calsmurf2904 Nov 21, 2008 at 8:48 AM 4 replies 1.1k views
Original Post
Calsmurf2904
Calsmurf2904
Hello, Its a long time since my last post here. I am creating a Game in the Ogre engine and when I am on the pc that is too slow to program with Ogre then I am learning OpenGL. This is my issue : I have two classes called PXVertex and PXVertexBuffer. PXVertexBuffer has a std::Vector that contains PXVertex objects. The main problem is that when I am trying to draw the buffer is keeps giving me Access Violation at 0x00000000. This is my current Code : Adding vertex to buffer

	void PXVertexBuffer::addVertex(PXVector mVec)
	{
	        if((mVertexes.size() + 1) > mVertexes.capacity())
		{
			totalVertexes++;
			mVertexes.resize(totalVertexes);
		}
		mVertexes.push_back(new PXVertex(mVec.getX(),mVec.getY(),mVec.getZ(),mVec.getColor()));
	};
Retrieving vertex from buffer

	PXVertex* PXVertexBuffer::getVertex(int id)
	{
		return mVertexes.at(id);
	};
Drawing Vertexes

		bool _Update()
		{
			glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
			glLoadIdentity();
			glTranslatef(-1.5f,0.0f,-6.0f);
			int i = 1;
			int i2 = 1;
			VVertexBuffer::iterator mIt = mBuffers.begin();
			while(mIt != mBuffers.end())
			{
				glBegin(GL_TRIANGLES);
				VVertex::iterator mIt2 = mBuffers.at(i)->getBeginIterator();
				i2 = 0;
				for(mIt2 = mBuffers.at(i)->getBeginIterator();mIt2 != mBuffers.at(i)->getEndIterator();++mIt2)
				{
					float x,y,z;
					PXVertex* mVertex = *mIt2;
					x = mVertex->getX();
					y = mVertex->getY();
					z = mVertex->getZ();
					glVertex3f(x,y,z);
					mIt2++;
				        i2++;
				};
				glEnd();
				mIt++;
				i++;
			};
			if(!_UpdateRenderWindows()) return false;
			return true;
		};
The buffers are placed in a vector of PXVertexBuffer objects. The vector variable is named mBuffers. The problem is in mVertex->getX()/Y/Z; One more thing : How can I color the vertex ? I thought glColor4f(r,g,b,a); but I am not sure.
Calvin Baart
Double Bluff Studios
David_pb
David_pb
Maybe you should start at index 0 instead of 1, or even better: replace the calls mBuffers.at(i) and use your iterator (mIt). For your vertexcolor: Yes, glColor(xn) is a possibility.
Calsmurf2904
Calsmurf2904
still getting it :(
This is my current code :
			VVertexBuffer::iterator mIt = mBuffers.begin();			for(mIt = mBuffers.begin();mIt != mBuffers.end();++mIt)			{				glBegin(GL_TRIANGLES);				VVertex::iterator mIt2 = (*mIt)->getBeginIterator();				for(mIt2 = (*mIt)->getBeginIterator();mIt2 != (*mIt)->getEndIterator();++mIt2)				{					float x,y,z,r,g,b,a;					PXVertex* mVertex = *mIt2;					x = mVertex->getX();					y = mVertex->getY();					z = mVertex->getZ();                                        r = mVertex->getColor().getR();                                        g = mVertex->getColor().getG();                                        b = mVertex->getColor().getB();                                        a = mVertex->getColor().getA();                                        glColor4f(r,g,b,a);					glVertex3f(x,y,z);				};				glEnd();			};

I am starting to think that the error is in the addVertex code.

Edit:
Okay....I am looking into some other more optimized methods for rendering.
I am thinking about using VBO's to draw the vertexes.
However would it be possible to copy the vector as a array to the vbo ?
Here:
http://www.ozone3d.net/tutorials/opengl_vbo_p2.php
they use a simple array of static GLFloat's.
Would it be use instead of a array of GLFloat's a vector ?

Edit2:
Created a test code :
			int vertexes = 0;			VVertexBuffer::iterator mIt = mBuffers.begin();			for(mIt = mBuffers.begin();mIt != mBuffers.end();++mIt)			{				glBindBuffer(GL_ARRAY_BUFFER,(*mIt)->VBOVertexId);				glBufferData(GL_ARRAY_BUFFER,(*mIt)->getTotalVertexes()*sizeof((*mIt)->getVertexArray()),(*mIt)->getVertexArray(),GL_DYNAMIC_DRAW);				glVertexPointer(3,GL_FLOAT,sizeof(PXVertex),0);				glBindBuffer(GL_ARRAY_BUFFER,(*mIt)->VBOColorId);				glBufferData(GL_ARRAY_BUFFER,(*mIt)->getTotalVertexes()*sizeof((*mIt)->createColorArray()),(*mIt)->createColorArray(),GL_DYNAMIC_DRAW);				glColorPointer(4,GL_FLOAT,sizeof(PXColor),0);				vertexes += (*mIt)->getTotalVertexes();			};			glEnableClientState(GL_VERTEX_ARRAY);			glEnableClientState(GL_COLOR_ARRAY);			glDrawArrays(GL_TRIANGLES,0,vertexes);			glDisableClientState(GL_COLOR_ARRAY);			glDisableClientState(GL_VERTEX_ARRAY);

Here are the problems with this code :
It keeps complaining that GL_ARRAY_BUFFER and GL_DYNAMIC_DRAW is undefined.
It also keeps saying that glBindBuffer and glBufferData doesn't exist.
What am I doing wrong ?
I am using Visual C++ 2008 sp1 on Windows (Kinda obvious).

Edit3:
Okay....added glew 1.5.1 and the errors are now gone (well....new errors appeared lol).
Trying to fix them now....will post here later with the result.

[Edited by - Calsmurf2904 on November 21, 2008 11:28:25 AM]
Calvin Baart
Double Bluff Studios
Calsmurf2904
Calsmurf2904
Okay fixed the issues...I can now succesfully compile it :)
However there is a new access violation.
The access violation this time is in this code :
			totalBuffers++;			mBuffers.resize(totalBuffers);			mBuffers.push_back(mVertexBuffer);			GLuint BufferIds2[1] = {0};			glGenBuffers(1,BufferIds2); //VertexBuffer <-------- There			BufferIds[totalBuffersId+1] = BufferIds2[0];			glGenBuffers(1,BufferIds2); //ColorBuffer			BufferIds[totalBuffersId+2] = BufferIds2[0];			totalBuffersId++;			totalBuffersId++;

This code is to add the vertex buffer to the vector.
I thought then I need to generate the VBO's here.
So when I try to generate them it gives me :
Quote:

Access violation reading location 0x00000000
Calvin Baart
Double Bluff Studios
Calsmurf2904
Calsmurf2904
ok...finally got it running by disabling VBO and using Vertex Arrays instead.
However there still isn't anything drawn to the screen.
This is my initialisation code :
Quote:

PXMesh* mMesh = mRoot->createMesh("ProjectXTestMesh.PX");
mMesh->getVertexBuffer()->addVertex(PXVector4(0.0f,1.0f,0.0f,PXColor(100,100,100,1))); mMesh->getVertexBuffer()->addVertex(PXVector4(-1.0f,-1.0f,0.0f,PXColor(100,100,100,1)));
mMesh->getVertexBuffer()->addVertex(PXVector4(1.0f,-1.0f,0.0f,PXColor(100,100,100,1)));

and then the code to draw it :
Quote:

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
VVertexBuffer::iterator mIt = mBuffers.begin();
int Vertexes = 0;
for(mIt = mBuffers.begin();mIt != mBuffers.end();++mIt)
{
glVertexPointer(3,GL_FLOAT,sizeof(PXVertex),&(*mIt)->getVertexArray());
glColorPointer(3,GL_FLOAT,sizeof(PXVertex),&(*mIt)->getVertexArray().at(0).r);
Vertexes += (*mIt)->getTotalVertexes();
};
glDrawArrays(GL_TRIANGLES,0,Vertexes);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
Calvin Baart
Double Bluff Studios
Calsmurf2904
Calsmurf2904
anyone?
Calvin Baart
Double Bluff Studios

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.