I'm having an issue rendering in OpenGL ES 1.1 for an iPhone game that I'm building.
In short, I am rendering 3 items:
- Background (works fine)
- A number of spherical objects (works fine)
- A simple line circle that changes size (I am getting a problem here).
Basically, I am getting an EXC_BAD_ACCESS error when I call drawArrays on the circle. I have tested the code in the basic iPhone OpenGL template and it works just fine, so I can't really track why it's not working here. Can someone point me in the right way?
Here is the drawCircle code used to render the circle.
- (void) drawCircles
{
if (!m_circleEffects.empty())
{
int segments = 24;
for (int i = 0; i < m_circleEffects.size(); i++)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(m_circleEffects[i].position.x, m_circleEffects[i].position.y, 0);
float radius;
if(m_circleEffects[i].isPulseOutward)
radius = cos(m_circleEffects[i].frameCounter * M_PI / 720);
else
radius = sin(m_circleEffects[i].frameCounter * M_PI / 720);
GLfloat circlePoints[segments * 3];
int count = 0;
for (GLfloat i = 0; i < 360.0f; i += (360.0f / segments))
{
circlePoints[count++] = (cos(i * M_PI / 180) * radius);
circlePoints[count++] = (sin(i * M_PI / 180) * radius);
circlePoints[count++] = z + 1;
}
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, circlePoints);
glDrawArrays(GL_LINE_LOOP, 0, segments);
glDisableClientState(GL_VERTEX_ARRAY);
}
m_circleEffects.clear();
}
}
And the following is my other rendering code. It is called prior to the above code in the run loop. Everything in the following seems to work OK.
- (void)passInVisualsToUse:(vector<Visual>)visuals
{
frameCounter += 0.2;
if (frameCounter >= 360)
frameCounter -= 360;
glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glDepthMask(GL_FALSE);
glBindTexture(GL_TEXTURE_2D, m_backgroundTexture);
glDrawTexfOES(0, 0, 0, 480, 320);
glDepthMask(GL_TRUE);
vector<Visual>::const_iterator visual = visuals.begin();
for (int visualIndex = 0;
visual != visuals.end();
++visual, ++visualIndex)
{
if (visual->ObjectType == 1)
glBindTexture(GL_TEXTURE_2D, m_oneTexture);
else if (visual->ObjectType == 2)
glBindTexture(GL_TEXTURE_2D, m_twoTexture);
else if (visual->ObjectType == 3)
glBindTexture(GL_TEXTURE_2D, m_threeTexture);
else
glBindTexture(GL_TEXTURE_2D, m_fourTexture);
// Set the viewport transform.
vec3 position = visual->Position;
// Set the light position.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(position.x, position.y, position.z);
float rotationAngle = visual->RotationAngle;
glRotatef(rotationAngle, 0, 1, 0);
float scale = visual->Scale;
if (visual->ShouldThrob)
{
float scaleFactor = scale + sin(frameCounter) / 25;
glScalef(scaleFactor, scaleFactor, scale);
BOOL isPulseOutward;
if (visual->isPulseOutward)
isPulseOutward = YES;
else
isPulseOutward = NO;
CircleEffect toAdd;
toAdd.position = position;
toAdd.frameCounter = frameCounter;
toAdd.isPulseOutward = isPulseOutward;
m_circleEffects.push_back(toAdd);
}
else
glScalef(scale, scale, scale);
// Set the projection transform.
float h = (float)screenSize.size.height / (float)screenSize.size.width;
mat4 projection = mat4::Ortho(xleft, xright, h * xleft, h * xright, znear, zfar);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(projection.Pointer());
// Draw the surface.
int stride = sizeof(vec3) + sizeof(vec3) + sizeof(vec2);
const GLvoid* texCoordOffset = (const GLvoid*) (2 * sizeof(vec3));
const Drawable& drawable = m_drawables[visualIndex];
glBindBuffer(GL_ARRAY_BUFFER, drawable.VertexBuffer);
glVertexPointer(3, GL_FLOAT, stride, 0);
const GLvoid* normalOffset = (const GLvoid*) sizeof(vec3);
glNormalPointer(GL_FLOAT, stride, normalOffset);
glTexCoordPointer(2, GL_FLOAT, stride, texCoordOffset);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, drawable.IndexBuffer);
glDrawElements(GL_TRIANGLES, drawable.IndexCount, GL_UNSIGNED_SHORT, 0);
}
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
}
The relevant buffers have been set-up elsewhere, and as mentioned, the second code all works fine.
Basically, I am getting an EXC_BAD_ACCESS on the drawArrays code in the top code snippet. Anyone have any ideas why?
Thanks