📄 dynwater.cpp
字号:
#include "StdAfx.h"
#include "DynWater.h"
#include "Game/Game.h"
//#include <windows.h>
#include "Rendering/GL/myGL.h"
#include "Game/Camera.h"
#include "Rendering/GL/VertexArray.h"
#include "Map/ReadMap.h"
#include "LogOutput.h"
#include "Map/BaseGroundDrawer.h"
#include "Rendering/Env/BaseSky.h"
#include "Rendering/UnitModels/UnitDrawer.h"
#include "Sim/Projectiles/ProjectileHandler.h"
#include "Sim/Misc/FeatureHandler.h"
#include "Game/UI/MouseHandler.h"
#include "Game/GameHelper.h"
#include "Rendering/ShadowHandler.h"
#include "Rendering/Textures/Bitmap.h"
#include "Lua/LuaCallInHandler.h"
#include "Sim/Units/UnitHandler.h"
#include "Sim/Units/Unit.h"
#include "Sim/Units/UnitDef.h"
extern GLfloat FogLand[];
#define W_SIZE 5
#define WF_SIZE 5120
#define WH_SIZE 2560
/*/
#define W_SIZE 4
#define WF_SIZE 4096
#define WH_SIZE 2048
/**/
CDynWater::CDynWater(void)
{
lastWaveFrame=0;
noWakeProjectiles=true;
firstDraw=true;
drawSolid=true;
camPosBig=float3(2048,0,2048);
refractSize=gu->viewSizeY>=1024 ? 1024:512;
glGenTextures(1, &reflectTexture);
glBindTexture(GL_TEXTURE_2D, reflectTexture);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8 ,512, 512, 0,GL_RGBA, GL_UNSIGNED_BYTE, 0);
glGenTextures(1, &refractTexture);
glBindTexture(GL_TEXTURE_2D, refractTexture);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8 ,refractSize, refractSize, 0,GL_RGBA, GL_UNSIGNED_BYTE, 0);
glGenTextures(1, &detailNormalTex);
glBindTexture(GL_TEXTURE_2D, detailNormalTex);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB ,256, 256, 0,GL_RGBA, GL_FLOAT, 0);
glGenerateMipmapEXT(GL_TEXTURE_2D);
float* temp=SAFE_NEW float[1024*1024*4];
for(int y=0;y<64;++y){
for(int x=0;x<64;++x){
temp[(y*64+x)*4+0]=(sin(x*PI*2.0f/64.0f)) + (x<32 ? -1:1)*0.3f;
temp[(y*64+x)*4+1]=temp[(y*64+x)*4+0];
temp[(y*64+x)*4+2]=(cos(x*PI*2.0f/64.0f)) + (x<32 ? 16-x:x-48)/16.0f*0.3f;
temp[(y*64+x)*4+3]=0;
}
}
glGenTextures(3, rawBumpTexture);
glBindTexture(GL_TEXTURE_2D, rawBumpTexture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB ,64, 64, 0,GL_RGBA, GL_FLOAT, temp);
unsigned char* scrap=SAFE_NEW unsigned char[256*256*4];
CBitmap foam;
if (!foam.Load("bitmaps/foam.jpg") || foam.xsize != 256 || foam.ysize != 256)
throw content_error("Could not load foam from file bitmaps/foam.jpg");
for(int a=0;a<256*256;++a)
scrap[a]=foam.mem[a*4];
glGenTextures(1, &foamTex);
glBindTexture(GL_TEXTURE_2D, foamTex);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_LUMINANCE,256, 256, GL_LUMINANCE, GL_UNSIGNED_BYTE, scrap);
delete[] scrap;
if(ProgramStringIsNative(GL_VERTEX_PROGRAM_ARB,"waterDyn.vp"))
waterVP=LoadVertexProgram("waterDyn.vp");
else
waterVP=LoadVertexProgram("waterDynNT.vp");
waterFP=LoadFragmentProgram("waterDyn.fp");
waveFP=LoadFragmentProgram("waterDynWave.fp");
waveVP=LoadVertexProgram("waterDynWave.vp");
waveFP2=LoadFragmentProgram("waterDynWave2.fp");
waveVP2=LoadVertexProgram("waterDynWave2.vp");
waveNormalFP=LoadFragmentProgram("waterDynNormal.fp");
waveNormalVP=LoadVertexProgram("waterDynNormal.vp");
waveCopyHeightFP=LoadFragmentProgram("waterDynWave3.fp");
waveCopyHeightVP=LoadVertexProgram("waterDynWave3.vp");
dwGroundRefractVP=LoadVertexProgram("dwgroundrefract.vp");
dwGroundReflectIVP=LoadVertexProgram("dwgroundreflectinverted.vp");
dwDetailNormalFP=LoadFragmentProgram("dwDetailNormal.fp");
dwDetailNormalVP=LoadVertexProgram("dwDetailNormal.vp");
dwAddSplashFP=LoadFragmentProgram("dwAddSplash.fp");
dwAddSplashVP=LoadVertexProgram("dwAddSplash.vp");
waterSurfaceColor = readmap->waterSurfaceColor;
for(int y=0;y<1024;++y){
for(int x=0;x<1024;++x){
temp[(y*1024+x)*4+0]=0;
temp[(y*1024+x)*4+1]=0;
temp[(y*1024+x)*4+2]=0;
temp[(y*1024+x)*4+3]=0;
}
}
glGenTextures(1, &waveHeight32);
glBindTexture(GL_TEXTURE_2D, waveHeight32);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32F_ARB ,256, 256, 0,GL_RGBA, GL_FLOAT, temp);
glGenTextures(1, &waveTex1);
glBindTexture(GL_TEXTURE_2D, waveTex1);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB ,1024, 1024, 0,GL_RGBA, GL_FLOAT, temp);
for(int y=0;y<1024;++y){
for(int x=0;x<1024;++x){
//float dist=(x-500)*(x-500)+(y-450)*(y-450);
temp[(y*1024+x)*4+0]=0;//max(0.0f,15-sqrt(dist));//sin(y*PI*2.0f/64.0f)*0.5f+0.5f;
temp[(y*1024+x)*4+1]=0;
temp[(y*1024+x)*4+2]=0;
temp[(y*1024+x)*4+3]=0;
}
}
glGenTextures(1, &waveTex2);
glBindTexture(GL_TEXTURE_2D, waveTex2);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB ,1024, 1024, 0,GL_RGBA, GL_FLOAT, temp);
for(int y=0;y<1024;++y){
for(int x=0;x<1024;++x){
temp[(y*1024+x)*4+0]=0;
temp[(y*1024+x)*4+1]=1;
temp[(y*1024+x)*4+2]=0;
temp[(y*1024+x)*4+3]=0;
}
}
glGenTextures(1, &waveTex3);
glBindTexture(GL_TEXTURE_2D, waveTex3);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB ,1024, 1024, 0,GL_RGBA, GL_FLOAT, temp);
for(int y=0;y<64;++y){
float dy=y-31.5f;
for(int x=0;x<64;++x){
float dx=x-31.5f;
float dist=sqrt(dx*dx+dy*dy);
temp[(y*64+x)*4+0]=max(0.0f,1-dist/30.f)*max(0.0f,1-dist/30.f);
temp[(y*64+x)*4+1]=max(0.0f,1-dist/30.f);
temp[(y*64+x)*4+2]=max(0.0f,1-dist/30.f)*max(0.0f,1-dist/30.f);
temp[(y*64+x)*4+3]=0;
}
}
glGenTextures(1, &splashTex);
glBindTexture(GL_TEXTURE_2D, splashTex);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR/*_MIPMAP_NEAREST*/);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
//gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA32F_ARB ,64, 64, GL_RGBA, GL_FLOAT, temp);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB ,64, 64, 0,GL_RGBA, GL_FLOAT, temp);
unsigned char temp2[]={0,0,0,0};
glGenTextures(1, &zeroTex);
glBindTexture(GL_TEXTURE_2D, zeroTex);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR/*_MIPMAP_NEAREST*/);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8 ,1, 1, 0,GL_RGBA, GL_UNSIGNED_BYTE, temp2);
unsigned char temp3[]={0,255,0,0};
glGenTextures(1, &fixedUpTex);
glBindTexture(GL_TEXTURE_2D, fixedUpTex);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR/*_MIPMAP_NEAREST*/);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8 ,1, 1, 0,GL_RGBA, GL_UNSIGNED_BYTE, temp3);
CBitmap bm;
if (!bm.Load("bitmaps/boatshape.bmp"))
throw content_error("Could not load boatshape from file bitmaps/boatshape.bmp");
for(int a=0;a<bm.xsize*bm.ysize;++a){
bm.mem[a*4+2]=bm.mem[a*4];
bm.mem[a*4+3]=bm.mem[a*4];
}
boatShape=bm.CreateTexture();
CBitmap bm2;
if (!bm.Load("bitmaps/hovershape.bmp"))
throw content_error("Could not load hovershape from file bitmaps/hovershape.bmp");
for(int a=0;a<bm2.xsize*bm2.ysize;++a){
bm2.mem[a*4+2]=bm2.mem[a*4];
bm2.mem[a*4+3]=bm2.mem[a*4];
}
hoverShape=bm2.CreateTexture();
delete[] temp;
glGenFramebuffersEXT(1,&frameBuffer);
}
CDynWater::~CDynWater(void)
{
glDeleteTextures (1, &reflectTexture);
glDeleteTextures (1, &refractTexture);
glDeleteTextures (3, rawBumpTexture);
glDeleteTextures (1, &detailNormalTex);
glDeleteTextures (1, &waveTex1);
glDeleteTextures (1, &waveTex2);
glDeleteTextures (1, &waveTex3);
glDeleteTextures (1, &waveHeight32);
glDeleteTextures (1, &splashTex);
glDeleteTextures (1, &foamTex);
glDeleteTextures (1, &boatShape);
glDeleteTextures (1, &hoverShape);
glDeleteTextures (1, &zeroTex);
glDeleteTextures (1, &fixedUpTex);
glSafeDeleteProgram( waterFP );
glSafeDeleteProgram( waterVP );
glSafeDeleteProgram( waveFP );
glSafeDeleteProgram( waveVP );
glSafeDeleteProgram( waveFP2 );
glSafeDeleteProgram( waveVP2 );
glSafeDeleteProgram( waveNormalFP );
glSafeDeleteProgram( waveNormalVP );
glSafeDeleteProgram( waveCopyHeightFP );
glSafeDeleteProgram( waveCopyHeightVP );
glSafeDeleteProgram( dwGroundReflectIVP );
glSafeDeleteProgram( dwGroundRefractVP );
glSafeDeleteProgram( dwDetailNormalVP );
glSafeDeleteProgram( dwDetailNormalFP );
glSafeDeleteProgram( dwAddSplashVP );
glSafeDeleteProgram( dwAddSplashFP );
glDeleteFramebuffersEXT(1,&frameBuffer);
}
void CDynWater::Draw()
{
if(readmap->minheight>10)
return;
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
glEnable(GL_FOG);
glBindTexture(GL_TEXTURE_2D, waveTex3);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D,reflectTexture);
glActiveTextureARB(GL_TEXTURE2_ARB);
glBindTexture(GL_TEXTURE_2D,waveHeight32);
glActiveTextureARB(GL_TEXTURE3_ARB);
glBindTexture(GL_TEXTURE_2D,refractTexture);
glActiveTextureARB(GL_TEXTURE4_ARB);
glBindTexture(GL_TEXTURE_2D,readmap->GetShadingTexture ());
glActiveTextureARB(GL_TEXTURE5_ARB);
glBindTexture(GL_TEXTURE_2D,foamTex);
glActiveTextureARB(GL_TEXTURE6_ARB);
glBindTexture(GL_TEXTURE_2D,detailNormalTex);
glActiveTextureARB(GL_TEXTURE7_ARB);
glBindTexture(GL_TEXTURE_2D,shadowHandler->shadowTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);
glActiveTextureARB(GL_TEXTURE0_ARB);
glColor4f(1,1,1,0.5f);
glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, waterFP );
glEnable( GL_FRAGMENT_PROGRAM_ARB );
glBindProgramARB( GL_VERTEX_PROGRAM_ARB, waterVP );
glEnable( GL_VERTEX_PROGRAM_ARB );
float dx=float(gu->viewSizeX)/gu->viewSizeY * camera->GetTanHalfFov();
float dy=float(gu->viewSizeY)/gu->viewSizeY * camera->GetTanHalfFov();
glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, 10, 1.0f/(W_SIZE*256),1.0f/(W_SIZE*256), 0, 0);
glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, 11, -camPosX/256.0f+0.5f,-camPosZ/256.0f+0.5f, 0, 0);
glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, 12, 1.0f/WF_SIZE,1.0f/WF_SIZE, 0, 0);
glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, 13, -(camPosBig.x-WH_SIZE)/WF_SIZE,-(camPosBig.z-WH_SIZE)/WF_SIZE, 0, 0);
glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, 14, 1.0f/(gs->pwr2mapx*SQUARE_SIZE),1.0f/(gs->pwr2mapy*SQUARE_SIZE), 0, 0);
// glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,0, 1.0f/4096.0f,1.0f/4096.0f,0,0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,1, camera->pos.x,camera->pos.y,camera->pos.z,0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,2, reflectRight.x,reflectRight.y,reflectRight.z,0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,3, reflectUp.x,reflectUp.y,reflectUp.z,0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,4, 0.5f/dx,0.5f/dy,1,1);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,5, reflectForward.x,reflectForward.y,reflectForward.z,0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,6, 0.05f, 1-0.05f, 0, 0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,7, 0.2f, 0, 0, 0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,8, 0.5f, 0.6f, 0.8f, 0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,9, gs->sunVector.x, gs->sunVector.y, gs->sunVector.z, 0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,10, readmap->sunColor.x, readmap->sunColor.y, readmap->sunColor.z, 0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,11, readmap->ambientColor.x, readmap->ambientColor.y, readmap->ambientColor.z, 0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,12, refractRight.x,refractRight.y,refractRight.z,0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,13, refractUp.x,refractUp.y,refractUp.z,0);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,14, 0.5f/dx,0.5f/dy,1,1);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB,15, refractForward.x,refractForward.y,refractForward.z,0);
DrawWaterSurface();
glBindTexture(GL_TEXTURE_2D, fixedUpTex);
DrawOuterSurface();
glDisable( GL_FRAGMENT_PROGRAM_ARB );
glDisable( GL_VERTEX_PROGRAM_ARB );
glBindTexture(GL_TEXTURE_2D, 0);
glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D,0);
glActiveTextureARB(GL_TEXTURE2_ARB);
glBindTexture(GL_TEXTURE_2D,0);
glActiveTextureARB(GL_TEXTURE3_ARB);
glBindTexture(GL_TEXTURE_2D,0);
glActiveTextureARB(GL_TEXTURE4_ARB);
glBindTexture(GL_TEXTURE_2D,0);
glActiveTextureARB(GL_TEXTURE5_ARB);
glBindTexture(GL_TEXTURE_2D,0);
glActiveTextureARB(GL_TEXTURE6_ARB);
glBindTexture(GL_TEXTURE_2D,0);
glActiveTextureARB(GL_TEXTURE7_ARB);
glBindTexture(GL_TEXTURE_2D,0);
glActiveTextureARB(GL_TEXTURE0_ARB);
}
void CDynWater::UpdateWater(CGame* game)
{
if (readmap->minheight > 10 || readmap->voidWater)
return;
glDisable(GL_DEPTH_TEST);
glDepthMask(0);
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
DrawHeightTex();
if(firstDraw){
firstDraw=false;
DrawDetailNormalTex();
}
glEnable(GL_DEPTH_TEST);
glDepthMask(1);
DrawRefraction(game);
DrawReflection(game);
}
void CDynWater::Update()
{
if(readmap->minheight>10)
return;
oldCamPosBig=camPosBig;
camPosBig.x=floor(max((float)WH_SIZE, min((float)gs->mapx*SQUARE_SIZE-WH_SIZE, (float)camera->pos.x))/(W_SIZE*16))*(W_SIZE*16);
camPosBig.z=floor(max((float)WH_SIZE, min((float)gs->mapy*SQUARE_SIZE-WH_SIZE, (float)camera->pos.z))/(W_SIZE*16))*(W_SIZE*16);
glDisable(GL_DEPTH_TEST);
glDepthMask(0);
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
/* if(mouse->buttons[0].pressed){
float3 pos=camera->pos+mouse->dir*(-camera->pos.y/mouse->dir.y);
AddSplash(pos,20,1);
}*/
AddShipWakes();
AddExplosions();
DrawDetailNormalTex();
DrawWaves();
glEnable(GL_DEPTH_TEST);
glDepthMask(1);
}
void CDynWater::DrawReflection(CGame* game)
{
CCamera *realCam = camera;
camera = new CCamera(*realCam);
camera->up.x=0;
camera->up.y=1;
camera->up.z=0;
camera->forward.y*=-1;
camera->pos.y*=-1;
camera->pos.y+=0.2f;
camera->Update(false);
reflectRight=camera->right;
reflectUp=camera->up;
reflectForward=camera->forward;
glViewport(0,0,512,512);
glClearColor(0.5f,0.6f,0.8f,0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
game->SetDrawMode(CGame::reflectionDraw);
sky->Draw();
glEnable(GL_CLIP_PLANE2);
double plane2[4]={0,-1,0,1.0f};
glClipPlane(GL_CLIP_PLANE2 ,plane2);
drawReflection=true;
bool drawShadows=shadowHandler->drawShadows;
shadowHandler->drawShadows=false;
CBaseGroundDrawer *gd = readmap->GetGroundDrawer ();
gd->Draw(true,false,dwGroundReflectIVP);
double plane[4]={0,1,0,1.0f};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -