www.pudn.com > 林海血原源代码.zip > LensFlare.cpp
// LensFlare.cpp: implementation of the CLensFlare class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "LensFlare.h"
#include "texture.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CLensFlare::CLensFlare()
{
}
CLensFlare::~CLensFlare()
{
}
bool CLensFlare::InitLensFlare()
{
CTexture cTexture;
char filename[64];
for(int i=0;i<7;i++)
{
wsprintf(filename,"flare/flare%d.bmp",i);
if(!cTexture.MakeAlphaTextureBind(filename,&m_texFlare[i]))return false;
}
m_LightPos=VERTEX(128000,30000,-72000);
m_cHmap.m_pSunPos->xpos= m_LightPos.xpos;
m_cHmap.m_pSunPos->ypos= m_LightPos.ypos;
m_cHmap.m_pSunPos->zpos= m_LightPos.zpos;
return true;
}
void CLensFlare::UpdateLensFlare()
{
if(!CheckLightVisible())
{
m_cHmap.m_bSunVisible=true; //restore
return;
}
m_cHmap.m_bSunVisible=true; //restore
float size=0.06f;
float offset=1;
// glAlphaFunc(GL_GEQUAL,0.25f);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
glPushMatrix();
glTranslatef(m_cHmap.m_pViewPos->xpos,m_cHmap.m_pViewPos->ypos,m_cHmap.m_pViewPos->zpos);
glRotatef(*m_cHmap.m_pViewRotY, 0.0f,1.0f,0.0f);
glRotatef(-*m_cHmap.m_pViewRotX, 1.0f,0.0f,0.0f);
/////////////////////1
glBindTexture(GL_TEXTURE_2D, m_texFlare[1]);
glColor3f(0.05f,0.3f,0.5f);
offset=1.3f;
size=0.08f;
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3f(sx*offset-size,sy*offset-size,-1.03923f);
glTexCoord2f(1,0);
glVertex3f(sx*offset+size,sy*offset-size,-1.03923f);
glTexCoord2f(1,1);
glVertex3f(sx*offset+size,sy*offset+size,-1.03923f);
glTexCoord2f(0,1);
glVertex3f(sx*offset-size,sy*offset+size,-1.03923f);
glEnd();
/////////////////////2
glBindTexture(GL_TEXTURE_2D, m_texFlare[2]);
glColor3f(0.0f,0.3f,0.5f);
offset=0.7f;
size=0.03f;
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3f(sx*offset-size,sy*offset-size,-1.03923f);
glTexCoord2f(1,0);
glVertex3f(sx*offset+size,sy*offset-size,-1.03923f);
glTexCoord2f(1,1);
glVertex3f(sx*offset+size,sy*offset+size,-1.03923f);
glTexCoord2f(0,1);
glVertex3f(sx*offset-size,sy*offset+size,-1.03923f);
glEnd();
/////////////////////3
glBindTexture(GL_TEXTURE_2D, m_texFlare[3]);
glColor3f(0.05f,0.3f,0.5f);
offset=0.5f;
size=0.04f;
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3f(sx*offset-size,sy*offset-size,-1.03923f);
glTexCoord2f(1,0);
glVertex3f(sx*offset+size,sy*offset-size,-1.03923f);
glTexCoord2f(1,1);
glVertex3f(sx*offset+size,sy*offset+size,-1.03923f);
glTexCoord2f(0,1);
glVertex3f(sx*offset-size,sy*offset+size,-1.03923f);
glEnd();
/////////////////////4
glBindTexture(GL_TEXTURE_2D, m_texFlare[4]);
glColor3f(0.4f,0.1f,0.0f);
offset=0.1f;
size=0.06f;
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3f(sx*offset-size,sy*offset-size,-1.03923f);
glTexCoord2f(1,0);
glVertex3f(sx*offset+size,sy*offset-size,-1.03923f);
glTexCoord2f(1,1);
glVertex3f(sx*offset+size,sy*offset+size,-1.03923f);
glTexCoord2f(0,1);
glVertex3f(sx*offset-size,sy*offset+size,-1.03923f);
glEnd();
/////////////////////5
glBindTexture(GL_TEXTURE_2D, m_texFlare[5]);
glColor3f(0.3f,0.05f,0.0f);
offset=-0.3f;
size=0.12f;
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3f(sx*offset-size,sy*offset-size,-1.03923f);
glTexCoord2f(1,0);
glVertex3f(sx*offset+size,sy*offset-size,-1.03923f);
glTexCoord2f(1,1);
glVertex3f(sx*offset+size,sy*offset+size,-1.03923f);
glTexCoord2f(0,1);
glVertex3f(sx*offset-size,sy*offset+size,-1.03923f);
glEnd();
/////////////////////6
glBindTexture(GL_TEXTURE_2D, m_texFlare[6]);
glColor3f(0.3f,0.0f,0.0f);
offset=-0.9f;
size=0.14f;
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3f(sx*offset-size,sy*offset-size,-1.03923f);
glTexCoord2f(1,0);
glVertex3f(sx*offset+size,sy*offset-size,-1.03923f);
glTexCoord2f(1,1);
glVertex3f(sx*offset+size,sy*offset+size,-1.03923f);
glTexCoord2f(0,1);
glVertex3f(sx*offset-size,sy*offset+size,-1.03923f);
glEnd();
////////////////////////////////////////////////
/////////////////////Draw light Shine
glBindTexture(GL_TEXTURE_2D, m_texFlare[0]);
glTranslatef(sx,sy,0);
glRotatef((*m_cHmap.m_pViewRotY+*m_cHmap.m_pViewRotX)*2, 0.0f,0.0f,1.0f);
glColor3f(0.7f,0.4f,0.0f);
size=0.15f;
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3f(-size,-size,-1.03923f);
glTexCoord2f(1,0);
glVertex3f(+size,-size,-1.03923f);
glTexCoord2f(1,1);
glVertex3f(+size,+size,-1.03923f);
glTexCoord2f(0,1);
glVertex3f(-size,+size,-1.03923f);
glEnd();
////////////////////////////////////////////////
glColor3f(1,1,1);
glPopMatrix();
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
}
bool CLensFlare::CheckLightVisible()
{
VERTEX v0=VERTEX(m_LightPos.xpos-m_cHmap.m_pViewPos->xpos,
m_LightPos.ypos-m_cHmap.m_pViewPos->ypos,
m_LightPos.zpos-m_cHmap.m_pViewPos->zpos);
float rotx=*m_cHmap.m_pViewRotX;
float roty=*m_cHmap.m_pViewRotY;
//////// y rotate
VERTEX v1=VERTEX(v0.xpos*cosf(roty*0.0174533f)-
v0.zpos*sinf(roty*0.0174533f),
v0.ypos,
v0.xpos*sinf(roty*0.0174533f)+
v0.zpos*cosf(roty*0.0174533f));
//////// x rotate
VERTEX v2=VERTEX(v1.xpos,
v1.ypos*cosf(rotx*0.0174533f)-
v1.zpos*sinf(rotx*0.0174533f),
v1.ypos*sinf(rotx*0.0174533f)+
v1.zpos*cosf(rotx*0.0174533f));
////////////////////
if(v2.zpos>-1)return false;
double scale=-1.03923/v2.zpos;
sx=float(v2.xpos*scale);
sy=float(v2.ypos*scale);
if(sx>0.8f || sx<-0.8f)return false;
if(sy>0.6f || sy<-0.6f)return false;
//////// Check Visible
if(!m_cHmap.CheckSunVisible())
return false;
return true;
}