Discuz! Board
标题:
[MetaHook]画天空盒子|Draw a Skybox
[打印本页]
作者:
Jerry小坏
时间:
2017-7-14 16:48
标题:
[MetaHook]画天空盒子|Draw a Skybox
#include <exportfuncs.h>
#include <gl/glaux.h>
#include "surface.h"
#include "qgl.h"
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "GLu32.lib")
#pragma comment(lib, "GLaux.lib")
cl_enginefunc_t gEngfuncs;
AUX_RGBImageRec *Sky_rt, *Sky_lf, *Sky_ft, *Sky_bk, *Sky_up, *Sky_dn;
int Initialize(struct cl_enginefuncs_s *pEnginefuncs, int iVersion)
{
memcpy(&gEngfuncs, pEnginefuncs, sizeof(gEngfuncs));
return gExportfuncs.Initialize(pEnginefuncs, iVersion);
}
int HUD_VidInit(void)
{
QGL_Init();
if( strcmp( gEngfuncs.pfnGetCvarString( "sv_skyname" ), "SkyName" ) ) return gExportfuncs.HUD_VidInit();
// >> 装入位图
Sky_rt = auxDIBImageLoadA( "esf/gfx/env/SkyName_rt.bmp" );
Sky_lf = auxDIBImageLoadA( "esf/gfx/env/SkyName_lf.bmp" );
Sky_ft = auxDIBImageLoadA( "esf/gfx/env/SkyName_ft.bmp" );
Sky_bk = auxDIBImageLoadA( "esf/gfx/env/SkyName_bk.bmp" );
Sky_up = auxDIBImageLoadA( "esf/gfx/env/SkyName_up.bmp" );
Sky_dn = auxDIBImageLoadA( "esf/gfx/env/SkyName_dn.bmp" );
if ( Sky_rt == NULL || Sky_lf == NULL || Sky_ft == NULL || Sky_bk == NULL || Sky_up == NULL || Sky_dn == NULL )
return gExportfuncs.HUD_VidInit();
// >> 设置纹理环境
qglTexEnvi( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_ENV, GL_REPLACE );
qglTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
qglTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
qglTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
qglTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
qglTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE );
// >> 加载纹理贴图
qglTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, Sky_lf->sizeX, Sky_lf->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Sky_lf->data );
qglTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, Sky_rt->sizeX, Sky_rt->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Sky_rt->data );
qglTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, Sky_ft->sizeX, Sky_ft->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Sky_ft->data );
qglTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, Sky_bk->sizeX, Sky_bk->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Sky_bk->data );
qglTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, Sky_dn->sizeX, Sky_dn->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Sky_dn->data );
qglTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, Sky_up->sizeX, Sky_up->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Sky_up->data );
return gExportfuncs.HUD_VidInit();
}
void HUD_DrawNormalTriangles(void)
{
if ( Sky_rt == NULL || Sky_lf == NULL || Sky_ft == NULL || Sky_bk == NULL || Sky_up == NULL || Sky_dn == NULL )
return gExportfuncs.HUD_DrawNormalTriangles();
qglDisable( GL_CULL_FACE );// 禁止剔除表面
qglEnable( GL_TEXTURE_CUBE_MAP );// 启用立方体贴图[]
// >> 禁止自动生成纹理坐标
qglDisable( GL_TEXTURE_GEN_S );
qglDisable( GL_TEXTURE_GEN_T );
qglDisable( GL_TEXTURE_GEN_R );
qglBegin( GL_QUADS );
// >> 右面 rt
qglTexCoord3f( -1.0f, 1.0f, -1.0f ); qglVertex3f( 25400.0f, 25330.0f, -25000.0f );
qglTexCoord3f( -1.0f, -1.0f, -1.0f ); qglVertex3f( 25400.0f, 25330.0f, 25000.0f );
qglTexCoord3f( -1.0f, -1.0f, 1.0f ); qglVertex3f( 25400.0f, -25430.0f, 25000.0f );
qglTexCoord3f( -1.0f, 1.0f, 1.0f ); qglVertex3f( 25400.0f, -25430.0f, -25000.0f );
// >> 左面 lf
qglTexCoord3f( 1.0f, 1.0f, 1.0f ); qglVertex3f( -25400.0f, -25430.0f, -25000.0f );
qglTexCoord3f( 1.0f, -1.0f, 1.0f ); qglVertex3f( -25400.0f, -25430.0f, 25000.0f );
qglTexCoord3f( 1.0f, -1.0f, -1.0f ); qglVertex3f( -25400.0f, 25330.0f, 25000.0f );
qglTexCoord3f( 1.0f, 1.0f, -1.0f ); qglVertex3f( -25400.0f, 25330.0f, -25000.0f );
// >> 前面 ft
qglTexCoord3f( -1.0f, 1.0f, -1.0f ); qglVertex3f( 25400.0f, -25430.0f, -25000.0f );
qglTexCoord3f( -1.0f, 1.0f, 1.0f ); qglVertex3f( 25400.0f, -25430.0f, 25000.0f );
qglTexCoord3f( 1.0f, 1.0f, 1.0f ); qglVertex3f( -25400.0f, -25430.0f, 25000.0f );
qglTexCoord3f( 1.0f, 1.0f, -1.0f ); qglVertex3f( -25400.0f, -25430.0f, -25000.0f );
// >> 后面 bk
qglTexCoord3f( -1.0f, -1.0f, 1.0f ); qglVertex3f( -25400.0f, 25330.0f, -25000.0f );
qglTexCoord3f( -1.0f, -1.0f, -1.0f ); qglVertex3f( -25400.0f, 25330.0f, 25000.0f );
qglTexCoord3f( 1.0f, -1.0f, -1.0f ); qglVertex3f( 25400.0f, 25330.0f, 25000.0f );
qglTexCoord3f( 1.0f, -1.0f, 1.0f ); qglVertex3f( 25400.0f, 25330.0f, -25000.0f );
// >> 顶面 up
qglTexCoord3f( 1.0f, 1.0f, -1.0f ); qglVertex3f( 25400.0f, 25330.0f, 25000.0f );
qglTexCoord3f( -1.0f, 1.0f, -1.0f ); qglVertex3f( 25400.0f, -25430.0f, 25000.0f );
qglTexCoord3f( -1.0f, -1.0f, -1.0f ); qglVertex3f( -25400.0f, -25430.0f, 25000.0f );
qglTexCoord3f( 1.0f, -1.0f, -1.0f ); qglVertex3f( -25400.0f, 25330.0f, 25000.0f );
// >> 底面 dn
qglTexCoord3f( -1.0f, -1.0f, 1.0f ); qglVertex3f( 25400.0f, 25330.0f, -25000.0f );
qglTexCoord3f( 1.0f, -1.0f, 1.0f ); qglVertex3f( 25400.0f, -25430.0f, -25000.0f );
qglTexCoord3f( 1.0f, 1.0f, 1.0f ); qglVertex3f( -25400.0f, -25430.0f, -25000.0f );
qglTexCoord3f( -1.0f, 1.0f, 1.0f ); qglVertex3f( -25400.0f, 25330.0f, -25000.0f );
qglEnd();
qglDisable(GL_TEXTURE_CUBE_MAP);// 禁止立方体贴图[]
return gExportfuncs.HUD_DrawNormalTriangles();
}
复制代码
欢迎光临 Discuz! Board (https://esfbbs.foxnyx.top/)
Powered by Discuz! X3.2