www.pudn.com > etree_src.zip > TitlePlane.cpp


//**************************************************************************** 
//  TitlePlane.cpp: implementation of the CTitlePlane class. 
// 
//  Copyright (c) Boris J. Wang (e_boris2002@hotmail.com) 2002 - 2003 
//  From Institute of Computing Technology, Chinese Academy of Sciences 
//                                                Beijing 100871, China 
// 
//  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF  
//  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO  
//  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A  
//  PARTICULAR PURPOSE. 
//**************************************************************************** 
 
#include "stdafx.h" 
#include "opengl.h" 
#include "TitlePlane.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CTitlePlane::CTitlePlane(LPCTSTR bmp,int Type,GLfloat PosZ = -0.2):Bitmap(bmp,Type,0) 
{ 
	RenderPos = PosZ; 
} 
 
void CTitlePlane::Render(GLfloat Zoom,GLfloat Aspect,GLfloat Alpha) 
{ 
	glDisable(GL_LIGHTING); 
	glDisable(GL_DEPTH_TEST); 
 
	Bitmap.Apply(); 
 
	glEnable(GL_BLEND); 
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
 
	glScalef(Zoom*Aspect,Zoom,1.0); 
	glColor4f(1.0,1.0,1.0,Alpha); 
	glBegin(GL_QUADS); 
		glTexCoord2f(0.0f,0.0f);  
		glVertex3f(-1.0,-1.0,RenderPos);  
 
		glTexCoord2f(0.0f,1.0f);  
		glVertex3f(-1.0,1.0,RenderPos);  
 
		glTexCoord2f(1.0f,1.0f);  
		glVertex3f(1.0,1.0,RenderPos);  
 
		glTexCoord2f(1.0f,0.0f);  
		glVertex3f(1.0,-1.0,RenderPos); 
	glEnd(); 
 
 
	glDisable(GL_BLEND); 
	glEnable(GL_DEPTH_TEST); 
	glEnable(GL_LIGHTING); 
} 
 
void CTitlePlane::Popup(GLfloat Zoom, GLfloat Aspect, GLfloat Alpha) 
{ 
	glDisable(GL_LIGHTING); 
	glDisable(GL_DEPTH_TEST); 
 
	Bitmap.Apply(); 
	glEnable(GL_BLEND); 
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
 
	GLfloat Sa,A_inc; 
	Sa = 0.2; 
	A_inc = (Alpha - Sa)/20.0; 
	glScalef(Zoom*Aspect,Zoom,1.0); 
	for(int i=20;i>=1;i--) 
	{ 
		glPushMatrix(); 
			Sleep(30); 
			Sa += A_inc; 
			glColor4f(1.0,1.0,1.0,Sa); 
			glBegin(GL_QUADS); 
				glTexCoord2f(0.0f,0.0f);  
				glVertex3f(-1.0,-1.0,RenderPos);  
 
				glTexCoord2f(0.0f,1.0f);  
				glVertex3f(-1.0,1.0,RenderPos);  
 
				glTexCoord2f(1.0f,1.0f);  
				glVertex3f(1.0,1.0,RenderPos);  
 
				glTexCoord2f(1.0f,0.0f);  
				glVertex3f(1.0,-1.0,RenderPos); 
			glEnd(); 
		glPopMatrix(); 
 
		glFinish(); 
		SwapBuffers(wglGetCurrentDC()); 
 
	} 
 
	glDisable(GL_BLEND); 
	glEnable(GL_DEPTH_TEST); 
} 
 
void CTitlePlane::SetAbsPosition(int  h_align, int v_align , int h_len , int v_len) 
{ 
	h_Align=  h_align; 
	v_Align=  v_align; 
	h_Len=	   h_len; 
	v_Len=	   v_len; 
} 
 
CTitlePlane::ABS_POSITION_CTX CTitlePlane::BeginRenderAbsPosition(CWnd * wnd) 
{ 
	ASSERT(wnd); 
	return BeginRenderAbsPosition(wnd->GetSafeHwnd()); 
} 
 
CTitlePlane::ABS_POSITION_CTX CTitlePlane::BeginRenderAbsPosition(HWND hwnd) 
{ 
	ASSERT(hwnd); 
	RECT rc; 
	::GetClientRect(hwnd,&rc); 
 
	ASSERT(rc.left == 0); 
	ASSERT(rc.top == 0); 
 
    glMatrixMode(GL_MODELVIEW); 
 
	glPushMatrix(); 
 
	glScaled(1.0/rc.right,1.0/rc.bottom,1); 
 
	return (((DWORD)rc.right)<<16)|((DWORD)rc.bottom); 
} 
 
void CTitlePlane::EndRenderAbsPosition(void) 
{ 
	glMatrixMode(GL_MODELVIEW); 
 
	glPopMatrix(); 
 
} 
 
void CTitlePlane::RenderAbsPosition(CTitlePlane::ABS_POSITION_CTX ctx,GLfloat Alpha,const RECT * TexPxRect,GLfloat Zoom,GLfloat Aspect) 
{ 
	glDisable(GL_LIGHTING); 
	glDisable(GL_DEPTH_TEST); 
 
	Bitmap.Apply(); 
 
	glEnable(GL_POLYGON_SMOOTH);   
	glEnable(GL_BLEND); 
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
 
	int left,top,right,bottom,w,h; 
	GLfloat	TexLt = 0.0,TexRt = 1.0,TexUp = 1.0,TexDn = 0.0; 
 
	if(TexPxRect) 
	{ 
		TexLt = ((GLfloat)TexPxRect->left)/((GLfloat)Bitmap.w); 
		TexRt = ((GLfloat)TexPxRect->right)/((GLfloat)Bitmap.w); 
		TexUp = 1.0 - ((GLfloat)TexPxRect->top)/((GLfloat)Bitmap.h); 
		TexDn = 1.0 - ((GLfloat)TexPxRect->bottom)/((GLfloat)Bitmap.h); 
	} 
 
	w = ctx>>17; 
	h = (ctx&0xffff)>>1; 
 
	////// Set V 
	{ 
		if(v_Align == TP_ALIGN_MID) 
		{ 
			bottom = (v_Len>>1); 
			top = -(v_Len>>1); 
		} 
		else 
		{ 
			if(v_Align == TP_ALIGN_BTM) 
			{ 
				top = -h; 
				bottom = v_Len-h; 
			} 
			else 
			{ 
				ASSERT(v_Align == TP_ALIGN_TOP); 
				bottom = h; 
				top = h - v_Len; 
			} 
		} 
 
	} 
 
	////////////// Set H 
	{ 
		if(h_Align == TP_ALIGN_MID) 
		{ 
			right = (h_Len>>1); 
			left = -(h_Len>>1); 
		} 
		else 
		{ 
			if(h_Align == TP_ALIGN_TOP) 
			{ 
				left = -w; 
				right = h_Len-w; 
			} 
			else 
			{ 
				ASSERT(h_Align == TP_ALIGN_BTM); 
				right = w; 
				left = w - h_Len; 
			} 
		} 
	} 
 
	glPushMatrix(); 
 
		glScalef(Zoom*Aspect,Zoom,1.0); 
		glColor4f(1.0,1.0,1.0,Alpha); 
 
		glBegin(GL_QUADS); 
			glTexCoord2f(TexLt,TexDn);  
			glVertex3i(left,top,RenderPos);  
 
			glTexCoord2f(TexLt,TexUp);  
			glVertex3i(left,bottom,RenderPos);  
 
			glTexCoord2f(TexRt,TexUp);  
			glVertex3i(right,bottom,RenderPos);  
 
			glTexCoord2f(TexRt,TexDn);  
			glVertex3i(right,top,RenderPos); 
		glEnd(); 
 
	glPopMatrix(); 
 
	glDisable(GL_POLYGON_SMOOTH); 
	glDisable(GL_BLEND); 
	glEnable(GL_DEPTH_TEST); 
	glEnable(GL_LIGHTING); 
}