Jump to content
  • Advertisement
Sign in to follow this  
Andybean9

OpenGL Crazy MFC level editor rendering problem!

This topic is 5000 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!