www.pudn.com > 林海血原源代码.zip > House.cpp


// House.cpp: implementation of the CHouse class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "House.h" 
#include "math.h" 
#include "texture.h" 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CHouse::CHouse() 
{ 
 
} 
 
CHouse::~CHouse() 
{ 
 
} 
bool CHouse::InitHouse(VERTEX position) 
{ 
	m_position=position; 
 
    CTexture cTexture; 
    if(!cTexture.MakeTextureBind("texture/rock0.bmp",         &m_texParticles[0]))return false; 
    if(!cTexture.MakeTextureBind("texture/rock1.bmp",         &m_texParticles[1]))return false; 
    if(!cTexture.MakeAlphaTextureBind("texture/smoke.bmp",    &m_texParticles[2]))return false; 
    if(!cTexture.MakeAlphaTextureBind("texture/smoke02.bmp",    &m_texParticles[3]))return false; 
 
	if(!m_ms3dHouse.Load("model/ms3d/house.ms3d")) 
	{ 
		MessageBox(0, "Init ms3d failed", "Error", MB_OK | MB_ICONERROR); 
		return FALSE; 
	} 
	if(!m_smoke.InitParticle(SMOKE_P,VERTEX(0,0,0),m_texParticles)) 
	{ 
		MessageBox(0, "Init smoke failed", "Error", MB_OK | MB_ICONERROR); 
		return FALSE; 
	} 
    m_chimneyPos.xpos=m_ms3dHouse.m_boundary.minx*0.5f; 
    m_chimneyPos.ypos=m_ms3dHouse.m_boundary.maxy*0.95f; 
    m_chimneyPos.zpos=m_ms3dHouse.m_boundary.minz*0.55f; 
 
	m_ms3dHouse.m_boundary.minx += m_position.xpos; 
	m_ms3dHouse.m_boundary.maxx += m_position.xpos; 
	m_ms3dHouse.m_boundary.miny += m_position.ypos; 
	m_ms3dHouse.m_boundary.maxy += m_position.ypos; 
	m_ms3dHouse.m_boundary.minz += m_position.zpos; 
	m_ms3dHouse.m_boundary.maxz += m_position.zpos; 
 
	return true; 
 
} 
void CHouse::DrawHouse() 
{ 
    if(!m_cHmap.IsInFrustum(m_position))return; 
 
    NORMAL direction; 
    direction.nx=-cosf((*m_cHmap.m_pViewRotX)*0.0174533f)*sinf((*m_cHmap.m_pViewRotY)*0.0174533f); 
    direction.ny=-sinf((*m_cHmap.m_pViewRotX)*0.0174533f); 
    direction.nz=-cosf((*m_cHmap.m_pViewRotX)*0.0174533f)*cosf((*m_cHmap.m_pViewRotY)*0.0174533f); 
 
    glPushMatrix();	 
	glTranslatef(m_position.xpos,m_position.ypos,m_position.zpos); 
        m_ms3dHouse.Render(direction); 
	 
    glDisable(GL_LIGHTING); 
    glDisable(GL_LIGHT0); 
    	glTranslatef(m_chimneyPos.xpos, 
			         m_chimneyPos.ypos, 
					 m_chimneyPos.zpos); 
     	glRotatef(*m_cHmap.m_pViewRotY,  0.0f,1.0f,0.0f); 
    	glRotatef(-*m_cHmap.m_pViewRotX,  1.0f,0.0f,0.0f); 
		m_smoke.DrawParticles(); 
    glPopMatrix(); 
	 
//	m_ms3dHouse.DrawBoundary(); 
 
	CheckSunVisible(); 
 
} 
void CHouse::CheckSunVisible() 
{ 
	if(!m_cHmap.m_bSunVisible)return; 
 
    if(m_cMath.IsLineSegmentCutBy3DBoundary(*m_cHmap.m_pViewPos , 
	    	                                *m_cHmap.m_pSunPos, 
										    m_ms3dHouse.m_boundary)) 
        m_cHmap.m_bSunVisible=false; 
 
}