⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rendergl.cpp

📁 是3D游戏一书中所讲的游戏引擎fly3D 包括fly3D引擎的源码及应用此引擎开发出来的游戏实例 有fly3D引擎的教程,易于step by step跟学
💻 CPP
字号:
#include "../Fly3D.h"

/* ARB_multitexture command function pointers */
FLY_API PFNGLMULTITEXCOORD2IARBPROC glMultiTexCoord2iARB;
FLY_API PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;
FLY_API PFNGLMULTITEXCOORD3FARBPROC glMultiTexCoord3fARB;
FLY_API PFNGLMULTITEXCOORD2FVARBPROC glMultiTexCoord2fvARB;
FLY_API PFNGLMULTITEXCOORD3FVARBPROC glMultiTexCoord3fvARB;
FLY_API PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;

/* NV_register_combiners command function pointers */
FLY_API PFNGLCOMBINERPARAMETERFVNVPROC glCombinerParameterfvNV;
FLY_API PFNGLCOMBINERPARAMETERIVNVPROC glCombinerParameterivNV;
FLY_API PFNGLCOMBINERPARAMETERFNVPROC glCombinerParameterfNV;
FLY_API PFNGLCOMBINERPARAMETERINVPROC glCombinerParameteriNV;
FLY_API PFNGLCOMBINERINPUTNVPROC glCombinerInputNV;
FLY_API PFNGLCOMBINEROUTPUTNVPROC glCombinerOutputNV;
FLY_API PFNGLFINALCOMBINERINPUTNVPROC glFinalCombinerInputNV;
FLY_API PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC glGetCombinerInputParameterfvNV;
FLY_API PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC glGetCombinerInputParameterivNV;
FLY_API PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC glGetCombinerOutputParameterfvNV;
FLY_API PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC glGetCombinerOutputParameterivNV;
FLY_API PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC glGetFinalCombinerInputfvNV;
FLY_API PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC glGetFinalCombinerInputivNV;

void FlyGetProfile(LPTSTR section, LPTSTR key, LPBYTE lpData, DWORD cbData);

int renderGL::CreateView()
{
	int i,j;
	
	hdc=GetDC(hFlyWnd);
	colorbits=GetDeviceCaps(hdc,BITSPIXEL);

	int color;
	FlyGetProfile("Settings","colorbits", (unsigned char *)&color, sizeof(int));
	if (colorbits!=color)
	{
		MessageBox(hFlyWnd,"Fly3D render configuration not set or display color depth has been changed.\nShould run flyConfig.exe to select a new render mode.","Fly3D",MB_OK|MB_ICONINFORMATION);
		selrendermode=0;
	}

	i=0;
	numvideomodes=0;
	while (EnumDisplaySettings(NULL,i,&videomodes[numvideomodes]))
	{
		if ((int)videomodes[numvideomodes].dmBitsPerPel==colorbits)
			numvideomodes++;
		i++;
	}

	i=1;
	j=DescribePixelFormat(hdc,i,sizeof(PIXELFORMATDESCRIPTOR),&rendermodes[i]);
	numrendermodes=0;
	while(i<j)
	{
		DescribePixelFormat(hdc,i,sizeof(PIXELFORMATDESCRIPTOR),&rendermodes[numrendermodes]);
		if (rendermodes[numrendermodes].iPixelType==0 && 
			rendermodes[numrendermodes].cColorBits==colorbits &&
			(rendermodes[numrendermodes].dwFlags&PFD_DOUBLEBUFFER))
			rendermodesindx[numrendermodes++]=i;
		i++;
	}

	if (selvideomode>numvideomodes)
		selvideomode=0;
	if (selrendermode>numrendermodes)
		selrendermode=0;

	if (SetPixelFormat(hdc, rendermodesindx[selrendermode], &rendermodes[selrendermode]) == FALSE) 
		return FALSE;

	m_hRC = wglCreateContext( hdc );
	wglMakeCurrent( hdc, m_hRC );

	RECT rect;
	GetClientRect(hFlyWnd,&rect);
	ResizeView(rect.right,rect.bottom);

	glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
	glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
	glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);

	glDisable(GL_LIGHTING);
	glEnable(GL_POINT_SMOOTH);

	glPixelTransferf(GL_RED_SCALE,brightness);
	glPixelTransferf(GL_GREEN_SCALE,brightness);
	glPixelTransferf(GL_BLUE_SCALE,brightness);
	
	GetExtensions();

	glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV,&nregcomb);
	glGetIntegerv(GL_MAX_LIGHTS,&nhwlights);
	if (nhwlights>MAX_HWLIGHTS)
		nhwlights=MAX_HWLIGHTS;

	glGetIntegerv(GL_DEPTH_BITS,&depthbits);
	glGetIntegerv(GL_STENCIL_BITS,&stencilbits);
	
	glGetIntegerv(GL_ALPHA_BITS,&alphabits);
	glGetIntegerv(GL_ACCUM_ALPHA_BITS,&i);
	accumbits=i;
	glGetIntegerv(GL_ACCUM_RED_BITS,&i);
	accumbits+=i;
	glGetIntegerv(GL_ACCUM_BLUE_BITS,&i);
	accumbits+=i;
	glGetIntegerv(GL_ACCUM_GREEN_BITS,&i);
	accumbits+=i;

	return 1;
}

void renderGL::DeleteView()
{
	if (m_hRC==0)
		return;

	wglMakeCurrent(NULL, NULL);
	wglDeleteContext(m_hRC);
	m_hRC=0;

	ReleaseDC(hFlyWnd,hdc);
	hdc=0;
}

void renderGL::ResizeView(int sx,int sy)
{
	if (m_hRC==0)
		return;
    glViewport(0, 0, sx, sy);
	if (sy==0)
		flyengine->aspect=1;
	else flyengine->aspect=(float)sx/sy;
	screen_sx=sx;
	screen_sy=sy;
}

void renderGL::InitView()
{
	glClearColor( flyengine->background.x, flyengine->background.y, flyengine->background.z, 1 );
    glClearDepth( 1 );

	if (flyengine->antialias)
		glEnable(GL_LINE_SMOOTH);
		
	else
		glDisable(GL_LINE_SMOOTH);

	glEnable(GL_CULL_FACE);
	glCullFace(GL_BACK);

	glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
	glDepthMask(GL_TRUE);

	glShadeModel(GL_SMOOTH);
	glPolygonMode(GL_FRONT,flyengine->wireframe?GL_LINE:GL_FILL);
	glPolygonMode(GL_BACK,flyengine->wireframe?GL_LINE:GL_FILL);
	glPointSize(1.0f);

	glEnable(GL_TEXTURE_2D);

	vector c(1,1,1,1);
	glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,&c.x);
	glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,&c.x);
	glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,16);

	if (flyengine->fog)
		{
		glEnable(GL_FOG);
		glFogi(GL_FOG_MODE,GL_LINEAR );
		glFogf(GL_FOG_START,flyengine->viewmaxdist*0.7f);
		glFogf(GL_FOG_END,flyengine->viewmaxdist);
		flyengine->background.w=1;
		glFogfv(GL_FOG_COLOR,&flyengine->background.x );
		}
	else glDisable(GL_FOG);

	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
}

void renderGL::DrawView()
{
	if (m_hRC==0)
		return;
	
	int clear=GL_DEPTH_BUFFER_BIT;
	if (flyengine->clearbk)
		clear|=GL_COLOR_BUFFER_BIT;
	if (flyengine->stencil)
		clear|=GL_STENCIL_BUFFER_BIT;
	InitView();
	glClear( clear );

	if (flyengine->bsp && flyengine->cam && flyengine->player)
		{
		flyengine->cur_frame_base=++flyengine->cur_frame;
		flyengine->dll.send_message(FLYM_DRAWSCENE,0,0);
		
		flyengine->start_text_mode();
		if (flyengine->status)
			flyengine->dll.send_message(FLYM_DRAWTEXT,0,0);
		flyengine->end_text_mode();
		}

	glFinish();
	SwapBuffers(hdc);
}

void renderGL::SetFullScreen()
{
	if (videomodes && selvideomode<numvideomodes)
	{
	if (fullscreen)
		{
		GetWindowRect(hFlyWnd,&winrect);
		if (DISP_CHANGE_SUCCESSFUL==ChangeDisplaySettings(&videomodes[selvideomode],CDS_FULLSCREEN))
			{
			screen_sx=videomodes[selvideomode].dmPelsWidth;
			screen_sy=videomodes[selvideomode].dmPelsHeight;
			SetWindowLong(hFlyWnd,GWL_STYLE,WS_POPUP|WS_CLIPSIBLINGS|WS_CLIPCHILDREN);
			ShowWindow(hFlyWnd,SW_SHOWMAXIMIZED);
			}
		else fullscreen=0;
		}
	else
		{
		ChangeDisplaySettings(NULL,CDS_FULLSCREEN);
		SetWindowLong(hFlyWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
		ShowWindow(hFlyWnd,SW_RESTORE);
		SetWindowPos(hFlyWnd,HWND_TOP,winrect.left,winrect.top,winrect.right-winrect.left,winrect.bottom-winrect.top,SWP_SHOWWINDOW);
		}
	}
}

void renderGL::GetExtensions()
{
	char* pszExt;
	pszExt = (char*)glGetString( GL_EXTENSIONS );
	if (pszExt==0) return;

	if ( strstr(pszExt,"GL_ARB_multitexture") == 0 )
		ntextureunits=1;
	else
	{
	glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB,&ntextureunits);
	glMultiTexCoord2iARB =
		(PFNGLMULTITEXCOORD2IARBPROC)
		wglGetProcAddress("glMultiTexCoord2iARB");
	glMultiTexCoord3fARB =
		(PFNGLMULTITEXCOORD3FARBPROC)
		wglGetProcAddress("glMultiTexCoord3fARB");
	glMultiTexCoord3fvARB =
		(PFNGLMULTITEXCOORD3FVARBPROC)
		wglGetProcAddress("glMultiTexCoord3fvARB");
	glActiveTextureARB =
		(PFNGLACTIVETEXTUREARBPROC)
		wglGetProcAddress("glActiveTextureARB");
	glMultiTexCoord2fvARB = 
		(PFNGLMULTITEXCOORD2FVARBPROC)
		wglGetProcAddress("glMultiTexCoord2fvARB");
	glMultiTexCoord2fARB = 
		(PFNGLMULTITEXCOORD2FARBPROC)
		wglGetProcAddress("glMultiTexCoord2fARB");
	}

	if ( strstr(pszExt,"GL_NV_register_combiners") )
	{
	glCombinerParameterfvNV =
		(PFNGLCOMBINERPARAMETERFVNVPROC)
		wglGetProcAddress("glCombinerParameterfvNV");
	glCombinerParameterivNV =
		(PFNGLCOMBINERPARAMETERIVNVPROC)
		wglGetProcAddress("glCombinerParameterivNV");
	glCombinerParameterfNV =
		(PFNGLCOMBINERPARAMETERFNVPROC)
		wglGetProcAddress("glCombinerParameterfNV");
	glCombinerParameteriNV =
		(PFNGLCOMBINERPARAMETERINVPROC)
		wglGetProcAddress("glCombinerParameteriNV");
	glCombinerInputNV =
		(PFNGLCOMBINERINPUTNVPROC)
		wglGetProcAddress("glCombinerInputNV");
	glCombinerOutputNV =
		(PFNGLCOMBINEROUTPUTNVPROC)
		wglGetProcAddress("glCombinerOutputNV");
	glFinalCombinerInputNV =
		(PFNGLFINALCOMBINERINPUTNVPROC)
		wglGetProcAddress("glFinalCombinerInputNV");
	glGetCombinerInputParameterfvNV =
		(PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)
		wglGetProcAddress("glGetCombinerInputParameterfvNV");
	glGetCombinerInputParameterivNV =
		(PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)
		wglGetProcAddress("glGetCombinerInputParameterivNV");
	glGetCombinerOutputParameterfvNV =
		(PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)
		wglGetProcAddress("glGetCombinerOutputParameterfvNV");
	glGetCombinerOutputParameterivNV =
		(PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)
		wglGetProcAddress("glGetCombinerOutputParameterivNV");
	glGetFinalCombinerInputfvNV =
		(PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)
		wglGetProcAddress("glGetFinalCombinerInputfvNV");
	glGetFinalCombinerInputivNV =
		(PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)
		wglGetProcAddress("glGetFinalCombinerInputivNV");
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -