⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cube.cpp

📁 此程序需要Brew sdk2.1版本以上,是关于OpenGL的手机编程.
💻 CPP
字号:
/*=================================================================================
FILE:			cube.cpp
  
DESCRIPTION:	This file is provide as a standard sample Brew source file. 
				Please refer to this OpenGL(R)ES brew sample application as a 
				reference on how to use the standard OpenGL-ES and EGL APIs.
                          
ABSTRACT:		The cube member functions 

AUTHOR:			QUALCOMM
                        
				Copyright (c) 2004 QUALCOMM Incorporated.
					   All Rights Reserved.
					QUALCOMM Proprietary/GTDR
=================================================================================*/

/*-------------------------------------------------------------------------------*
 *                      I N C L U D E   F I L E S                                *
 *-------------------------------------------------------------------------------*/
#include "ogles_demo_02.h"

/*===========================================================================
FUNCTION: cube::KeyEvent
  
DESCRIPTION:
	All key events to the cube demo are handled in this function. 
	The number keys "1","2","3" are used for this demo to change textures.
   
PROTOTYPE:
	boolean cube::KeyEvent( uint16 wParam,MM_STATE m_eState,IMenuCtl* m_pMenuCtl)
      
PARAMETERS:
	wParam:		Event specific data.
            
DEPENDENCIES
	none
              
RETURN VALUE
	TRUE	: If the event has been processed 
	FALSE	: If the event was not vaild or processed
                
===========================================================================*/
boolean cube::KeyEvent( uint16 wParam)
{
	
	switch(wParam)
	{
		case AVK_CLR:
			if (m_pDDBitmap)  IBITMAP_Release( m_pDDBitmap );
			if (m_pIFileMgr) IFILEMGR_Release( m_pIFileMgr );
			glDeleteTextures(7, texID);
			return FALSE;
			break;

		case AVK_SELECT:
			m_auto=TRUE;
			return TRUE;
			break;
			
		case AVK_LEFT:
			m_auto=FALSE;
			m_left_right-=m_spinFactor*3;
			return TRUE;
			break;
			
		case AVK_RIGHT:
			m_auto=FALSE;
			m_left_right+=m_spinFactor*3;
			return TRUE;
			break;
			
		case AVK_UP:
			m_auto=FALSE;
			m_up_down+=m_spinFactor*3;
			return TRUE;
			break;
			
		case AVK_DOWN:
			m_auto=FALSE;
			m_up_down-=m_spinFactor*3;
			return TRUE;
			break;
			
		case AVK_1:
			m_offset = 0;
			return TRUE;
			break;
			
		case AVK_2:
			m_offset = 1;
			return TRUE;
			break;
			
		case AVK_3:
			m_offset = -1;
			return TRUE;
			break;
			
		case AVK_4:
		case AVK_5:
		case AVK_6:
		case AVK_7:
		case AVK_8:
		case AVK_9:
		case AVK_STAR:
		case AVK_0:
		case AVK_POUND:
			
		default:
			return TRUE;
			break;
	}

	return FALSE;
	
}


/*===========================================================================
FUNCTION: cube::LoadTextures
  
DESCRIPTION:
	All textures for the cube are loaded using this function. 
   
PROTOTYPE:
	void cube::LoadTextures()
      
PARAMETERS:
	pIShell	: pointer to the IShell Interface object
            
DEPENDENCIES
	none
              
RETURN VALUE
	none
                
===========================================================================*/
void cube::LoadTextures(IShell *pIShell)
{
	
	int i;

	if (!isLoaded)
	{
		
		DBGPRINTF("_X_LOADTEXTURE __BEGIN");

		for(i=0;i<7;i++)
		{
			m_images[i].m_pIShell = pIShell;

			DBGPRINTF("_X_LOADTEXTURE __NEW_TGA=%d",i);
		}
		
		DBGPRINTF("_X_LOADTEXTURE __ALL created ");

		m_images[0].Load("ogles_demo_02_t0.tga"); // box texture
		DBGPRINTF("_X_LOADTEXTURE __0 loaded ");
		
		m_images[1].Load("ogles_demo_02_t1.tga"); // photo textures
		DBGPRINTF("_X_LOADTEXTURE __1 loaded ");
		m_images[2].Load("ogles_demo_02_t1.tga");
		DBGPRINTF("_X_LOADTEXTURE __2 loaded ");
		m_images[3].Load("ogles_demo_02_t2.tga");
		DBGPRINTF("_X_LOADTEXTURE __3 loaded ");
		m_images[4].Load("ogles_demo_02_t2.tga");
		DBGPRINTF("_X_LOADTEXTURE __4 loaded ");
		m_images[5].Load("ogles_demo_02_t3.tga");
		DBGPRINTF("_X_LOADTEXTURE __5 loaded ");
		m_images[6].Load("ogles_demo_02_t3.tga");
		DBGPRINTF("_X_LOADTEXTURE __6 loaded ");
		
		isLoaded = TRUE;
		m_offset = 1;

		glGenTextures(7, texID);

		for (int j=0;j <7;j++)
		{
			glBindTexture(GL_TEXTURE_2D, texID[j]);
			glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
			glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
			glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
			glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
			glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
			
			glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

			glTexImage2D(GL_TEXTURE_2D, 
				0, 
				m_images[j].GetDataFormat(),
				m_images[j].GetWidth(), 
				m_images[j].GetHeight(),
				0, 
				m_images[j].GetDataFormat(), 
				m_images[j].GetDataType(),
				m_images[j].GetData());
		}
	}

	DBGPRINTF("_X_LOADTEXTURE __COMPLETE___ ");
	DBGPRINTF("_X_LOADTEXTURE __COMPLETE___ ");
	
}

/*===========================================================================
FUNCTION: cube::Init
  
DESCRIPTION:
	The init function for cube class. The default constructor is not valid. 
   
PROTOTYPE:
	cube::cube(AEEApplet applet)
      
PARAMETERS:
	applet:  handle to applet
            
DEPENDENCIES
	Application must be created first
              
RETURN VALUE
	none
                
===========================================================================*/
void cube::Init(AEEApplet* applet)
{
    int v;// = ITOX(2);

	//DBGPRINTF("_X_cube __CONSTRUCTOR_START___ ");
	
	GLint _vertices[72]= {
			// bottom
		    -ITOX(2), -ITOX(2), ITOX(2),
			-ITOX(2), -ITOX(2), -ITOX(2),
			ITOX(2),  -ITOX(2), -ITOX(2),
			ITOX(2),  -ITOX(2), ITOX(2),
			// top
			-ITOX(2), ITOX(2), ITOX(2),
			ITOX(2),  ITOX(2), ITOX(2),
			ITOX(2),  ITOX(2), -ITOX(2),
			-ITOX(2), ITOX(2), -ITOX(2),
			// left
			-ITOX(2), -ITOX(2), -ITOX(2),
			-ITOX(2), -ITOX(2), ITOX(2),
			-ITOX(2), ITOX(2), ITOX(2),
			-ITOX(2), ITOX(2), -ITOX(2),
			//right
			ITOX(2), -ITOX(2), ITOX(2),
			ITOX(2), -ITOX(2), -ITOX(2),
			ITOX(2), ITOX(2), -ITOX(2),
			ITOX(2), ITOX(2), ITOX(2),
			// front
			-ITOX(2), -ITOX(2), ITOX(2),
			ITOX(2),  -ITOX(2), ITOX(2),
			ITOX(2),  ITOX(2), ITOX(2),
			-ITOX(2), ITOX(2), ITOX(2),
			// back
			ITOX(2),  -ITOX(2), -ITOX(2),
			-ITOX(2), -ITOX(2), -ITOX(2),
			-ITOX(2), ITOX(2), -ITOX(2),
			ITOX(2),  ITOX(2), -ITOX(2) };
				
	GLubyte _indices[24] = {
			0, 1, 2, 3,
			4, 5, 6, 7,
			8, 9, 10, 11,
			12, 13, 14, 15,
			16, 17, 18, 19,
			20, 21, 22, 23 };
			
	GLint _colors[96] = {
			// bottom
			ITOX(0), ITOX(0), ITOX(1), ITOX(33),
			ITOX(0), ITOX(0), ITOX(0), ITOX(0),
			ITOX(1), ITOX(0), ITOX(0), ITOX(33),
			ITOX(1), ITOX(0), ITOX(1), ITOX(67),
			// top
			ITOX(0), ITOX(1), ITOX(1), ITOX(67),
			ITOX(1), ITOX(1), ITOX(1), ITOX(1),
			ITOX(1), ITOX(1), ITOX(0), ITOX(67),
			ITOX(1), ITOX(1), ITOX(0), ITOX(67),
			// left
			ITOX(0), ITOX(0), ITOX(0), ITOX(0),
			ITOX(0), ITOX(0), ITOX(1), ITOX(33),
			ITOX(0), ITOX(1), ITOX(1), ITOX(67),
			ITOX(1), ITOX(1), ITOX(0), ITOX(67),
			//right
			ITOX(1), ITOX(0), ITOX(1), ITOX(67),
			ITOX(1), ITOX(0), ITOX(0), ITOX(33),
			ITOX(1), ITOX(1), ITOX(0), ITOX(67),
			ITOX(1), ITOX(1), ITOX(1), ITOX(1),
			// front
			ITOX(0), ITOX(0), ITOX(1), ITOX(33),
			ITOX(1), ITOX(0), ITOX(1), ITOX(67),
			ITOX(1), ITOX(1), ITOX(1), ITOX(1),
			ITOX(0), ITOX(1), ITOX(1), ITOX(67),
			// back
			ITOX(1), ITOX(0), ITOX(0), ITOX(33),
			ITOX(0), ITOX(0), ITOX(0), ITOX(0),
			ITOX(1), ITOX(1), ITOX(0), ITOX(67),
			ITOX(1), ITOX(1), ITOX(0), ITOX(67) };
				
	GLshort _texCoords[48] = {
			0, 0, 1, 0, 1, 1, 0, 1,
			0, 0, 1, 0, 1, 1, 0, 1,
			0, 0, 1, 0, 1, 1, 0, 1,
			0, 0, 1, 0, 1, 1, 0, 1,
			0, 0, 1, 0, 1, 1, 0, 1,
			0, 0, 1, 0, 1, 1, 0, 1	};

	DBGPRINTF("_X_cube __CONSTRUCTOR_MEMCPY___ ");

	for (v=0;v<72;v++)
	{
		vertices[v] = _vertices[v];
	}

	for (v=0;v<24;v++)
	{
		indices[v] = _indices[v];
	}

	for (v=0;v<96;v++)
	{
		colors[v] = _colors[v];
	}

	for (v=0;v<48;v++)
	{
		texCoords[v] = _texCoords[v];
	}

	//DBGPRINTF("_X_cube __CONSTRUCTOR_MEMCPY_COMPLETE___ ");
	
	m_offset = 1;
#ifdef AEE_SIMULATOR
	m_spinFactor = 1;
#else
   m_spinFactor = 1;
#endif
	counter=0;
	isLoaded = FALSE;
	m_applet = applet;
	m_auto = TRUE;
								
}


/*===========================================================================
FUNCTION: cube::~cube
  
DESCRIPTION:
	The cube default deconstructor.  
   
PROTOTYPE:
	cube::~cube()
      
PARAMETERS:
	none
            
DEPENDENCIES
	none
              
RETURN VALUE
	none
                
===========================================================================*/
cube::~cube()
{
	FreeData();	
}


/*===========================================================================
FUNCTION: cube::FreeData
  
DESCRIPTION:
	This function free the data of textures
   
PROTOTYPE:
	cube::FreeData()
      
PARAMETERS:
	none
            
DEPENDENCIES
	none
              
RETURN VALUE
	none
                
===========================================================================*/
void cube::FreeData( void )
{

	glDeleteTextures(7, texID);
	
	for (int i=0; i<7; i++)
	{
		m_images[i].FreeData();
	}
}

/*===========================================================================
FUNCTION: cube::Render
  
DESCRIPTION:
	The rendering routine for the cube classe. Draws a 3D cube.  
   
PROTOTYPE:
	void cube::Render()
      
PARAMETERS:
	none
            
DEPENDENCIES
	none
              
RETURN VALUE
	none
                
===========================================================================*/
void cube::Render()
{

	int index=0;

	glEnable( GL_DEPTH_TEST );
	glEnable( GL_CULL_FACE );
	glCullFace(GL_BACK);

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glPushMatrix();

	glLoadIdentity();
	glTranslatex( 0,	0,	ITOX(-15));


	m_pos1 = ITOX(counter )+ITOX(m_left_right);
	m_pos2 = ITOX(counter )+ITOX(m_up_down);

	if (m_auto)
	{
		counter+=m_spinFactor;
		glRotatex(m_pos1, 0, ITOX(2), 0);
		glRotatex(m_pos2, ITOX(3), ITOX(1), ITOX(1));
	}
	else
	{
		glRotatex(m_pos1, 0, ITOX(2), 0);
		glRotatex(m_pos2, ITOX(3), ITOX(1), ITOX(1));
	}

	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_COLOR_ARRAY);

	if (m_offset != -1)
	{
		glEnable(GL_TEXTURE_2D);
		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
		glTexCoordPointer(2, GL_SHORT, 0, texCoords);
	}

	glColorPointer(4, GL_FIXED, 0, colors);
	glVertexPointer(3, GL_FIXED, 0, vertices);


	for (int side = 0; side < 6; ++side)
	{
		if (m_offset==0) 
			index=0;
		else 
			index=side+m_offset;						

		if (m_offset != -1)
			glBindTexture(GL_TEXTURE_2D, texID[index]);
		else
			glShadeModel( GL_SMOOTH );

		glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, indices + side * 4);
	}	
	
	glDisableClientState(GL_VERTEX_ARRAY);
	glDisableClientState(GL_COLOR_ARRAY);
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisable(GL_TEXTURE_2D);

	glPopMatrix();
		  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -