📄 ogles_demo_03.cpp
字号:
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 + -