📄 rendergl.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 + -