Hello everyone,
My problem is very confusing to me and have had it for quite some time. I am finishing up work on a 3D level editor and am having some weird drawing problems. I have 4 windows each derived from COpenGLWnd class. They all have an OpenGLInit() function that does the usual OpenGL initialization stuff. Now all is fine with that, except when I draw textured objects they are not lit. The only way I could get objects to be lit was in my RenderDrawList() function that actually draws all the geometry. Now this works except now none of my glColor calls do anything at all.
Here is some code
This is the code that initializes OpenGL for each window
BOOL COpenGLWnd::InitOpenGL()
{
//Get a DC for the Client Area
m_pDC = new CClientDC(this);
//Failure to Get DC
if( m_pDC == NULL )
return FALSE;
if( !SetupPixelFormat() )
return FALSE;
//Create Rendering Context
m_hRC = ::wglCreateContext( m_pDC->GetSafeHdc() );
//Failure to Create Rendering Context
if( m_hRC == 0 )
return FALSE;
//Make the RC Current
if( ::wglMakeCurrent( m_pDC->GetSafeHdc(), CRenderFunctions::GetInstance()->m_hRC ) == FALSE )
return FALSE;
float ambient[] = {1.0f, 1.0f, 1.0f, 1.0f};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
// Usual OpenGL stuff
glClearColor( 0.5f, 0.5f, 0.5f, 0.0f );
glClearDepth(1.0f);
glEnable( GL_DEPTH_TEST );
glEnable( GL_TEXTURE_2D );
glEnable(GL_LIGHTING);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
::wglShareLists(CRenderFunctions::GetInstance()->m_hRC, m_hRC);
SetTimer(0, 30, 0);
return TRUE;
}
This is the code that is called each frame to render
// Will draw the scene's render list
void CRenderFunctions::DrawRenderList(CLevelEditorDoc* doc)
{
CRenderFunctions::GetInstance()->pDoc = doc;
glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if(CRenderFunctions::GetInstance()->m_bDrawSolid)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
else
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
// I hate my life and when OpenGL overrides my settings, so they are here, yes, good great grand wonderful!
float ambient[] = {1.0f, 1.0f, 1.0f, 1.0f};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
float groundsize = 20.0f;
float stepsize = 1.0f;
// Draw the ground
glPushMatrix();
for(float x = -groundsize; x < groundsize; x += stepsize)
{
if(x == 0)
glColor3f(1.0f, 0.0f, 0.0f);
else
glColor3f(0.4f, 0.4f, 0.4f);
glBegin(GL_LINES);
glVertex3f(x, 0.0f, -groundsize);
glVertex3f(x, 0.0f, groundsize);
glVertex3f(groundsize, 0.0f, x);
glVertex3f(-groundsize, 0.0f, x);
glEnd();
}
glPopMatrix();
int iTriangles = 0;
// Lists for rendered geometry
CArray<Triangle> TriList;
CArray<Vertex> vertMesh;
// Draw
glPushMatrix();
if(CRenderFunctions::GetInstance()->m_bDrawStartEnd)
{
// Draw the start and end locations, shown by spheres
glPushMatrix();
glTranslatef(CRenderFunctions::GetInstance()->pDoc->tSEL.start[0], CRenderFunctions::GetInstance()->pDoc->tSEL.start[1], CRenderFunctions::GetInstance()->pDoc->tSEL.start[2]);
CRenderFunctions::GetInstance()->DrawSphere(0.5);
glPopMatrix();
glPushMatrix();
glTranslatef(CRenderFunctions::GetInstance()->pDoc->tSEL.goal[0], CRenderFunctions::GetInstance()->pDoc->tSEL.goal[1], CRenderFunctions::GetInstance()->pDoc->tSEL.goal[2]);
CRenderFunctions::GetInstance()->DrawSphere(0.3);
glPopMatrix();
}
CLList<CEditorObject *>::CIterator iter;
for (iter = CRenderFunctions::GetInstance()->DrawList.Front(); !iter.End(); iter++)
{
glPushMatrix();
// Object Transform
glMultMatrixf(iter.Element()->RotMatrix);
// Get the model's mesh and apply cel-shading
int iTexID = 0;
CModelManager::GetInstance()->GetMesh(TriList, vertMesh, iter.Element()->ModelTag, &iTexID);
CTextureManager::GetInstance()->IsOneD(iTexID);
// Draw the model
CTextureManager::GetInstance()->BindTexture(iTexID);
glBegin(GL_TRIANGLES);
for (int j = 0; j < TriList.Size(); j++)
{
if(iter.Element()->m_bSelected)
{
glDisable(GL_TEXTURE_2D);
glColor3f(0.0f, 0.0f, 0.6f);
}
else
{
glEnable(GL_TEXTURE_2D);
glColor3fv(TriList[j].RGB);
}
for (int k = 0; k < 3; k++)
{
glTexCoord3fv(vertMesh[TriList[j].points[k]].UV);
glVertex3fv(vertMesh[TriList[j].points[k]].pos);
}
// Increment the face count
iTriangles++;
}
glEnd();
glPopMatrix();
// If this is an enemy draw the waypoints
if(iter.Element()->Enemy && CRenderFunctions::GetInstance()->m_pCurObj == iter.Element())
{
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glPushMatrix();
glTranslatef(iter.Element()->Waypoint1[0], iter.Element()->Waypoint1[1], iter.Element()->Waypoint1[2]);
CRenderFunctions::GetInstance()->DrawSphere(0.5);
glPopMatrix();
glPushMatrix();
glTranslatef(iter.Element()->Waypoint2[0], iter.Element()->Waypoint2[1], iter.Element()->Waypoint2[2]);
CRenderFunctions::GetInstance()->DrawSphere(0.5);
glPopMatrix();
glBegin(GL_LINES);
glVertex3f(iter.Element()->Waypoint1[0], iter.Element()->Waypoint1[1], iter.Element()->Waypoint1[2]);
glVertex3f(iter.Element()->Waypoint2[0], iter.Element()->Waypoint2[1], iter.Element()->Waypoint2[2]);
glEnd();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
}
glPopMatrix();
}
Another thing I should mention is that I am using 5 RC's, 1 global one that all the textures get loaded into and 4 for each window that uses wglShareLists with the main one to get texture data from. I appreciate any help or pointers I can get from anyone, thank you!
-Andrew