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

📄 ogles_demo_03.cpp

📁 此程序需要Brew sdk2.1版本以上,是关于OpenGL的手机编程.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			break;
    }
	
	return FALSE;
   
}


/*===========================================================================
FUNCTION: ogles_demo_03::SetupEGL
  
DESCRIPTION:
	This routine is used for EGL setup.  
   
PROTOTYPE:
	boolean ogles_demo_03::SetupEGL()
      
PARAMETERS:
	none
            
DEPENDENCIES
	none
              
RETURN VALUE
	TRUE	: if no errors
	FALSE	: if an error occured
                
===========================================================================*/
boolean ogles_demo_03::SetupEGL(void)
{

	EGLConfig myConfig;
	EGLint ncfg = 1;
	EGLint params[5] = {EGL_NONE,EGL_NONE,EGL_NONE,EGL_NONE,EGL_NONE};
	
	// Init State Data
	m_eglDisplay		= EGL_NO_DISPLAY;
	m_eglSurface		= EGL_NO_SURFACE;
	m_eglContext		= EGL_NO_CONTEXT;
	
	// Main Display
	m_eglDisplay = eglGetDisplay( m_applet.m_pIDisplay );
	if( m_eglDisplay == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS ) 
		return FALSE;
	
	if( eglInitialize( m_eglDisplay, NULL, NULL ) == EGL_FALSE || eglGetError() != EGL_SUCCESS )
		return FALSE;
	
	// Get Configuration	
	eglGetConfigs( m_eglDisplay, &myConfig, 1, &ncfg );
	
	
	// Window Surface
	{
		IDIB *pDIB;
		
		if( IBITMAP_QueryInterface(m_pDDBitmap, AEECLSID_DIB, (void**)&pDIB) != SUCCESS )
			return EFAILED;
		
		m_eglSurface = eglCreateWindowSurface( m_eglDisplay, myConfig, pDIB, params );
		
		IDIB_Release( pDIB );
		
		if( m_eglSurface == EGL_NO_SURFACE || eglGetError() != EGL_SUCCESS )
			return FALSE;
	}
	
	// Context
	m_eglContext = eglCreateContext( m_eglDisplay, myConfig, 0, 0 );
	if( m_eglContext == EGL_NO_CONTEXT || eglGetError() != EGL_SUCCESS )
		return FALSE;
	
	if( eglMakeCurrent( m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext ) == EGL_FALSE || eglGetError() != EGL_SUCCESS )
		return FALSE;
	
	return TRUE;
}

/*===========================================================================
FUNCTION: ogles_demo_03::SetupGL
  
DESCRIPTION:
	This routine is used for GL setup.  
   
PROTOTYPE:
	boolean ogles_demo_03::SetupGL()
      
PARAMETERS:
	none
            
DEPENDENCIES
	none
              
RETURN VALUE
	TRUE	: if no errors
	FALSE	: if an error occured
                
===========================================================================*/
boolean ogles_demo_03::SetupGL(void)
{
	
	// Smooth shading
	glShadeModel( GL_SMOOTH );
	
	// Depth Test
	glEnable( GL_DEPTH_TEST );
	
	// Perspective Correction
	glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
	
	// GL Initialization
	glViewport( 0, 0, GetScreenWidth(), GetScreenHeight() );
	
	// Init Projection Matrix
	glMatrixMode( GL_PROJECTION );
	glLoadIdentity();
	
	
	glDisable(GL_LIGHTING);
	glDisable(GL_BLEND);
		
	// GL Initialization
	glViewport( 0, 0, GetScreenWidth(), GetScreenHeight() );
	
	// Init Projection Matrix
	glMatrixMode( GL_PROJECTION );
	glLoadIdentity();
	
	glFrustumx(		INT_TO_Q16(-5),	INT_TO_Q16(5),
					INT_TO_Q16(-5),	INT_TO_Q16(5),
					INT_TO_Q16(10),	INT_TO_Q16(100)	);
	
	glMatrixMode( GL_MODELVIEW );
	glLoadIdentity();
	
	if (glGetError() != EGL_SUCCESS) return FALSE;
	
	return TRUE;
	

}

/*===========================================================================
FUNCTION: ogles_demo_03::NextFrame
  
DESCRIPTION:
	This routine sets up the frame timer, and then renders the next frame  
   
PROTOTYPE:
	void ogles_demo_03::NextFrame(ogles_demo_03* p)
      
PARAMETERS:
	p: pointer to the ogles_demo_03 application instance
            
DEPENDENCIES
	static fucntion
              
RETURN VALUE
	none
                
===========================================================================*/
void ogles_demo_03::NextFrame(ogles_demo_03* p)
{	
	p->RenderFrame();

	if (p->m_key_state ==1) 
		p->KeyEvent(p->m_key_wParam);

	ISHELL_SetTimer( p->m_applet.m_pIShell, p->m_frame_time,(PFNNOTIFY) NextFrame,(void*)p);
}


/*===========================================================================
FUNCTION: ogles_demo_03::RenderFrame
  
DESCRIPTION:
	The main rendering routine for the ogles_demo_03 application  
   
PROTOTYPE:
	void ogles_demo_03::RenderFrame()
      
PARAMETERS:
	none
            
DEPENDENCIES
	none
              
RETURN VALUE
	none
                
===========================================================================*/
void ogles_demo_03::RenderFrame(void)
{

    RenderSkybox();
		
	// Swap the Buffers
	eglSwapBuffers( m_eglDisplay, m_eglSurface );	
}

/*===========================================================================
FUNCTION: ogles_demo_03::LoadTextures
  
DESCRIPTION:
	This function loads the textures for this application 

PROTOTYPE:
	void ogles_demo_03::LoadTextures()
      
PARAMETERS:
	none
            
DEPENDENCIES
	none
              
RETURN VALUE
	none
                
===========================================================================*/
void ogles_demo_03::LoadTextures(void)
{
	DBGPRINTF("LoadTextures() step=%d\n",1);
	if (!isLoaded)
	{

		isLoaded = TRUE;
		DBGPRINTF("LoadTextures() step=load true\n");

		int imageW, imageH;

		for (int i=0; i<6; i++)
		{
			if (i == 0)			
			{
				imageData[i] = PPMToTexture( m_applet.m_pIShell, "skybox_top.ppm", &imageW, &imageH );
				glGenTextures(1, &m_boxTopTexture);
				glBindTexture(GL_TEXTURE_2D, m_boxTopTexture);
			}
			else if (i == 1)			
			{
				imageData[i] = PPMToTexture( m_applet.m_pIShell, "skybox_bottom.ppm", &imageW, &imageH );
				glGenTextures(1, &m_boxBottomTexture);
				glBindTexture(GL_TEXTURE_2D, m_boxBottomTexture);
			}
			else if (i == 2)			
			{
				imageData[i] = PPMToTexture( m_applet.m_pIShell, "skybox_left.ppm", &imageW, &imageH );
				glGenTextures(1, &m_boxLeftTexture);
				glBindTexture(GL_TEXTURE_2D, m_boxLeftTexture);
			}
			else if (i == 3)			
			{
				imageData[i] = PPMToTexture( m_applet.m_pIShell, "skybox_right.ppm", &imageW, &imageH );
				glGenTextures(1, &m_boxRightTexture);
				glBindTexture(GL_TEXTURE_2D, m_boxRightTexture);
			}
			else if (i == 4)			
			{
				imageData[i] = PPMToTexture( m_applet.m_pIShell, "skybox_front.ppm", &imageW, &imageH );
				glGenTextures(1, &m_boxFrontTexture);
				glBindTexture(GL_TEXTURE_2D, m_boxFrontTexture);
			}
			else if (i == 5)			
			{
				imageData[i] = PPMToTexture( m_applet.m_pIShell, "skybox_back.ppm", &imageW, &imageH );
				glGenTextures(1, &m_boxBackTexture);
				glBindTexture(GL_TEXTURE_2D, m_boxBackTexture);
			}

			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);

			if(imageData[i])
			{
				glTexImage2D(	GL_TEXTURE_2D,		// target
								0,					// level
								GL_RGB,				// internalformat
								imageW,				// width
								imageH,				// height
								0,					// border
								GL_RGB,				// format
								GL_UNSIGNED_BYTE,	// datatype
								imageData[i]);		// pixels
			}
		}

		m_skybox.m_textures[skybox::SKY_TOP]	= m_boxTopTexture;
		m_skybox.m_textures[skybox::SKY_BOTTOM]	= m_boxBottomTexture;
		m_skybox.m_textures[skybox::SKY_FRONT]	= m_boxBackTexture;
		m_skybox.m_textures[skybox::SKY_BACK]	= m_boxFrontTexture;
		m_skybox.m_textures[skybox::SKY_RIGHT]	= m_boxRightTexture;
		m_skybox.m_textures[skybox::SKY_LEFT]	= m_boxLeftTexture;
	}
}

/*===========================================================================
FUNCTION: ogles_demo_03::RenderSkybox
  
DESCRIPTION:
	The rendering the sky box routine for the ogles_demo_03 application  
   
PROTOTYPE:
	void ogles_demo_03::RenderSkybox()
      
PARAMETERS:
	none
            
DEPENDENCIES
	none
              
RETURN VALUE
	none
                
===========================================================================*/

void ogles_demo_03::RenderSkybox(void)
{
	
	//DBGPRINTF("RenderCube() step=%d\n",1);		  
	int v=0;
	int32 ViewMatrixFx[16];

	glDisable( GL_DEPTH_TEST );

	m_frame_time =1 ;
	glShadeModel( GL_FLAT );

	glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

	glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glPushMatrix();

	glMatrixMode( GL_MODELVIEW );
	glLoadIdentity();

    // Constrain how far we allow zooming like movement
	if(m_skyboxMove>7)			m_skyboxMove=7;
	else if (m_skyboxMove <-7)	m_skyboxMove=-7;

    // Constrain how far up and down we allow the skybox to rotate
	if(m_skyboxRotY>12)			m_skyboxRotY=12;
	else if (m_skyboxRotY <-12)	m_skyboxRotY=-12;

    // Create a view matrix of where to look at
	xxgluLookAtMatrixFx(ViewMatrixFx, 
                        0,0,INT_TO_Q16(m_skyboxMove-10),    // position of viewer

                        0, (m_skyboxRotY << 14), 0,         // Where to look
                                                            // Note: the shift left by 14
                                                            //       is so that the rotation
                                                            //       goes 1/4 the speed 
                                                            //       of using INT_TO_Q16

                        0, INT_TO_Q16(1), 0 );              // Up axis

    // Apply the view matrix
	glMultMatrixx((GLfixed*)ViewMatrixFx);

	v = INT_TO_Q16(12);

	m_autoboxrotx = INT_TO_Q16(counter)+INT_TO_Q16(m_skyboxRotX);

	if (m_boxauto)
	{
		counter+=m_BoxspinFactor;
		glRotatex(m_autoboxrotx, INT_TO_Q16(0), INT_TO_Q16(1), INT_TO_Q16(0));
	}
	else
	{
		glRotatex(m_autoboxrotx, INT_TO_Q16(0), INT_TO_Q16(1), INT_TO_Q16(0));
	}


	{
		GLint vertices[72] = {
			// bottom
			-v, -v, v,		-v, -v, -v,		v,  -v, -v,		v,  -v, v,
			// top
			-v, v, v,		v,  v, v,		v,  v, -v,		-v, v, -v,
			// left
			-v, -v, -v,		-v, -v, v,		-v, v, v,		-v, v, -v,
			//right
			v, -v, v,		v, -v, -v,		v, v, -v,		v, v, v,
			// front
			-v, -v, v,		v,  -v, v,		v,  v, v,		-v, v, v,
			// back
			v,  -v, -v,		-v, -v, -v,		-v, v, -v,		v,  v, -v };

		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 };

		GLshort texCoords [48] = {
			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, 0, 0, 1, 0
			};


		glEnableClientState(GL_VERTEX_ARRAY);

		glEnable(GL_TEXTURE_2D);
		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
		glTexCoordPointer(2, GL_SHORT, 0, texCoords);

		glVertexPointer(3, GL_FIXED, 0, vertices);

		glBindTexture(GL_TEXTURE_2D, m_boxBottomTexture);
		glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, indices + 0 * 4);				

		glBindTexture(GL_TEXTURE_2D, m_boxTopTexture);
		glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, indices + 1 * 4);

		glBindTexture(GL_TEXTURE_2D, m_boxRightTexture);
		glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, indices + 2 * 4);

		glBindTexture(GL_TEXTURE_2D, m_boxLeftTexture);
		glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, indices + 3 * 4);

		glBindTexture(GL_TEXTURE_2D, m_boxFrontTexture);
		glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, indices + 4 * 4);

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

	glPopMatrix();

	glShadeModel( GL_FLAT );

}

⌨️ 快捷键说明

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