Crazy MFC level editor rendering problem!

Started by
2 comments, last by Andybean9 19 years, 6 months ago
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
Advertisement
i dont know about the 4 windows but your problem seems like a standard gl problem, with lighting enabled colors dont work unless u enable color materials, see the red book, also check the faq at www.opengl.org
I tried that and it didn't seem to really fix the problem. Now when I load up my editor the colors seem to work until I load up a model. When I load up the model all my grid lines go black and the colors don't work anymore. If you need more information please let me know!

-Andrew
Actually, nevermind I got it to work, there was a call in the wrong spot in my code, thank you very much for the reply!

-Andrew

This topic is closed to new replies.

Advertisement