﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-imtangchen</title><link>http://www.cppblog.com/imtangchen/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 11:06:45 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 11:06:45 GMT</pubDate><ttl>60</ttl><item><title>贴图</title><link>http://www.cppblog.com/imtangchen/archive/2009/09/11/95930.html</link><dc:creator>我可能长大了</dc:creator><author>我可能长大了</author><pubDate>Fri, 11 Sep 2009 07:35:00 GMT</pubDate><guid>http://www.cppblog.com/imtangchen/archive/2009/09/11/95930.html</guid><wfw:comment>http://www.cppblog.com/imtangchen/comments/95930.html</wfw:comment><comments>http://www.cppblog.com/imtangchen/archive/2009/09/11/95930.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/imtangchen/comments/commentRss/95930.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/imtangchen/services/trackbacks/95930.html</trackback:ping><description><![CDATA[<p>///////////////////////////////////////////////////////<br>gltools.h<br>///////////////////////////////////////////////////////<br><br><br>#ifndef __GLTOOLS__<br>#define __GLTOOLS__</p>
<p>#include&lt;windows.h&gt;<br>#include&lt;stdio.h&gt;<br>#include"glew.h"<br>#include"glut.h"<br>#include"math.h"<br>#pragma comment( lib , "glew32.lib" )</p>
<p>&nbsp;</p>
<p>GLubyte *gltLoadBMP( const char *szFileName , GLint *iWidth , GLint *iHeight , GLint *iComponents , GLenum *eFormat )<br>{<br>&nbsp;GLubyte *pbBmp = NULL;//返回值<br>&nbsp;tagBITMAPFILEHEADER bmpFileHeader;<br>&nbsp;tagBITMAPINFOHEADER bmpInfoHeader;<br>&nbsp;tagRGBQUAD bmpRGBQUAD;<br>&nbsp;int iRead = 0 , sDepth = 0;</p>
<p>&nbsp;FILE *rp = fopen( szFileName , "rb" );<br>&nbsp;if( NULL == rp )<br>&nbsp;{<br>&nbsp;&nbsp;MessageBox( NULL , L"无法打开文件！" , L"GL_Tools" , MB_OK );<br>&nbsp;&nbsp;return NULL;<br>&nbsp;}//if</p>
<p>&nbsp;iRead = fread( &amp;bmpFileHeader , sizeof(tagBITMAPFILEHEADER) , 1 , rp );<br>&nbsp;iRead = fread( &amp;bmpInfoHeader , sizeof(tagBITMAPINFOHEADER) , 1 , rp );<br>&nbsp;fseek( rp , bmpFileHeader.bfOffBits , SEEK_SET );</p>
<p>&nbsp;*iWidth =&nbsp; bmpInfoHeader.biWidth;<br>&nbsp;*iHeight =&nbsp; bmpInfoHeader.biHeight;<br>&nbsp;sDepth = bmpInfoHeader.biBitCount / 8;</p>
<p>&nbsp;if( 24 != bmpInfoHeader.biBitCount &amp;&amp; 32 != bmpInfoHeader.biBitCount )<br>&nbsp;&nbsp;return NULL;</p>
<p>&nbsp;int biSizeImage = bmpInfoHeader.biHeight * ( ( bmpInfoHeader.biWidth * bmpInfoHeader.biBitCount / 8 + 3 ) / 4 ) * 4;<br>&nbsp;pbBmp = new GLubyte[ biSizeImage ];<br>&nbsp;if( NULL == pbBmp )<br>&nbsp;&nbsp;return NULL;</p>
<p>&nbsp;int ret = fread( pbBmp , 1 , biSizeImage , rp );</p>
<p>&nbsp;switch( sDepth )<br>&nbsp;{<br>&nbsp;&nbsp;case 3:<br>&nbsp;&nbsp;&nbsp;*eFormat = GL_BGR_EXT;<br>&nbsp;&nbsp;&nbsp;*iComponents = GL_RGB8;<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 4:<br>&nbsp;&nbsp;&nbsp;*eFormat = GL_BGRA_EXT;<br>&nbsp;&nbsp;&nbsp;*iComponents = GL_RGBA8;<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;}//switch</p>
<p>&nbsp;fclose( rp );</p>
<p>&nbsp;/*FILE *wp = fopen( "C:\\Documents and Settings\\iI0000002\\My Documents\\Visual Studio 2005\\Projects\\gl_3\\gl_3\\out.bmp" , "wb" );<br>&nbsp;fwrite( &amp;bmpFileHeader , sizeof(tagBITMAPFILEHEADER) , 1 , wp );<br>&nbsp;fwrite( &amp;bmpInfoHeader , sizeof(tagBITMAPINFOHEADER) , 1 , wp );<br>&nbsp;fwrite( pbBmp , bmpInfoHeader.biSizeImage , 1 , wp );<br>&nbsp;fclose( wp );*/</p>
<p>&nbsp;return pbBmp;<br>}</p>
<p>#endif<br><br><br><br><br>//////////////////////////////////////////////////<br>draw.h<br>//////////////////////////////////////////////////<br><br><br>#include"gltools.h"</p>
<p>&nbsp;</p>
<p><br>#define SIZE_SPACE_X 200.0f<br>#define SIZE_SPACE_Y 90.0f<br>#define SIZE_SPACE_Z 200.0f</p>
<p>#define STEP_GROUND 25.0f<br>#define STEP_WALL 100.0f<br>#define STEP_SKY 5.0f</p>
<p>#define BUFFER_COUNT 7</p>
<p>#define VERTEX_DATA 0<br>#define TEXTURE_DATA_GROUND 1<br>#define TEXTURE_DATA_WALL 2<br>#define TEXTURE_DATA_SKY 3<br>#define INDEX_DATA_GROUND 4<br>#define INDEX_DATA_WALL 5<br>#define INDEX_DATA_SKY 6</p>
<p>&nbsp;</p>
<p><br>GLfloat vertexSpace[ 24 ] = {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-SIZE_SPACE_X ,&nbsp; 0 ,&nbsp; SIZE_SPACE_Z ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SIZE_SPACE_X ,&nbsp; 0 ,&nbsp; SIZE_SPACE_Z ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SIZE_SPACE_X ,&nbsp; 0 , -SIZE_SPACE_Z ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-SIZE_SPACE_X ,&nbsp; 0 , -SIZE_SPACE_Z ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-SIZE_SPACE_X , SIZE_SPACE_Y ,&nbsp; SIZE_SPACE_Z ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SIZE_SPACE_X , SIZE_SPACE_Y ,&nbsp; SIZE_SPACE_Z ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SIZE_SPACE_X , SIZE_SPACE_Y , -SIZE_SPACE_Z ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-SIZE_SPACE_X , SIZE_SPACE_Y , -SIZE_SPACE_Z<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>GLuint indexGround[ 4 ] = {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 1 , 2 , 3 //下<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>GLfloat texCoordGround[ 8 ] = {//下<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 0 ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2*SIZE_SPACE_X/STEP_GROUND , 0 ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2*SIZE_SPACE_X/STEP_GROUND , 2*SIZE_SPACE_Z/STEP_GROUND ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 2*SIZE_SPACE_Z/STEP_GROUND<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};</p>
<p>GLuint indexWall[ 16 ] = {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3 , 2 , 6 , 7 , //后<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 1 , 5 , 4 , //前<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 , 1 , 5 , 6 , //右<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 3 , 7 , 4&nbsp;&nbsp; //左<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};</p>
<p>GLfloat texCoordWall[ 16 ] = {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 0 ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2*SIZE_SPACE_X/STEP_WALL , 0 ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 0 ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2*SIZE_SPACE_X/STEP_WALL , 0 ,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 2*SIZE_SPACE_Y/STEP_WALL ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2*SIZE_SPACE_X/STEP_WALL , 2*SIZE_SPACE_Y/STEP_WALL ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 2*SIZE_SPACE_Y/STEP_WALL ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2*SIZE_SPACE_X/STEP_WALL , 2*SIZE_SPACE_Y/STEP_WALL<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>GLuint indexSky[ 4 ] = {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4 , 5 , 6 , 7 //上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};</p>
<p>GLfloat texCoordSky[ 16 ] = {//上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 0 ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 0 ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 0 ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 0 ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 0 ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 , 0 ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 , 1 ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 , 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>GLuint vboSpace[ BUFFER_COUNT ] = { 0 };</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>#define TEXTURE_GROUND 0<br>#define TEXTURE_WALL 1<br>#define TEXTURE_SKY 2<br>#define TEXTURE_COUNT 3</p>
<p>&nbsp;</p>
<p><br>GLuint texObj[ TEXTURE_COUNT ] = { 0 };<br>const char *szTexFiles[ TEXTURE_COUNT ] = {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"wood.bmp" ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"wall2.bmp" ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"sky2.bmp"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;</p>
<p><br>void DrawSpace()<br>{<br>&nbsp;glColor4f( 1 , 1 , 1 , 1 );<br>&nbsp;glPolygonMode( GL_FRONT_AND_BACK , GL_FILL );<br>&nbsp;//glBegin( GL_TRIANGLES );<br>&nbsp;//&nbsp;glVertex3f( 10 , 0 , 0 );<br>&nbsp;//&nbsp;glVertex3f( 0 , 10 , 0 );<br>&nbsp;//&nbsp;glVertex3f( 0 , 0 , 10 );<br>&nbsp;//glEnd();</p>
<p>&nbsp;glBindBuffer( GL_ARRAY_BUFFER , vboSpace[ VERTEX_DATA ] );<br>&nbsp;glVertexPointer( 3 , GL_FLOAT , 0 , 0 );</p>
<p>&nbsp;glBindBuffer( GL_ARRAY_BUFFER , vboSpace[ TEXTURE_DATA_GROUND ] );<br>&nbsp;glTexCoordPointer( 2 , GL_FLOAT , 0 , 0 );</p>
<p>&nbsp;glBindBuffer( GL_ELEMENT_ARRAY_BUFFER , vboSpace[ INDEX_DATA_GROUND ] );<br>&nbsp;glBindTexture( GL_TEXTURE_2D , texObj[ TEXTURE_GROUND ] );<br>&nbsp;glDrawElements( GL_QUADS , 4 , GL_UNSIGNED_INT , 0 );</p>
<p>&nbsp;glBindBuffer( GL_ARRAY_BUFFER , vboSpace[ TEXTURE_DATA_WALL ] );<br>&nbsp;glTexCoordPointer( 2 , GL_FLOAT , 0 , 0 );</p>
<p>&nbsp;glBindBuffer( GL_ELEMENT_ARRAY_BUFFER , vboSpace[ INDEX_DATA_WALL ] );<br>&nbsp;glBindTexture( GL_TEXTURE_2D , texObj[ TEXTURE_WALL ] );<br>&nbsp;glDrawElements( GL_QUADS , 16 , GL_UNSIGNED_INT , 0 );</p>
<p>&nbsp;glBindBuffer( GL_ARRAY_BUFFER , vboSpace[ TEXTURE_DATA_SKY ] );<br>&nbsp;glTexCoordPointer( 2 , GL_FLOAT , 0 , 0 );</p>
<p>&nbsp;glBindBuffer( GL_ELEMENT_ARRAY_BUFFER , vboSpace[ INDEX_DATA_SKY ] );<br>&nbsp;glBindTexture( GL_TEXTURE_2D , texObj[ TEXTURE_SKY ] );<br>&nbsp;glDrawElements( GL_QUADS , 4 , GL_UNSIGNED_INT , 0 );<br>}<br><br><br><br><br>//////////////////////////////////////////////<br>config.h<br>//////////////////////////////////////////////<br><br><br>#include"draw.h"</p>
<p>&nbsp;</p>
<p>/////////////////////////////<br>#define START_X 0.0f<br>#define START_Y -30.0f<br>#define START_Z -30.0f</p>
<p>#define KEY_STEP 5.0f<br>/////////////////////////////</p>
<p>GLfloat speeed[ 4 ] = { 0 };</p>
<p>GLint iWin;<br>GLint mx=0 , my=0;<br>GLfloat yRot = 0;<br>GLint iList = 0;<br>GLint iCount = 0;</p>
<p>&nbsp;</p>
<p>void Timer( int value )<br>{<br>&nbsp;printf( "%d fps\n" , iCount );<br>&nbsp;iCount = 0;<br>&nbsp;glutTimerFunc( 1000 , Timer , 0 );<br>}</p>
<p><br>void Display()<br>{<br>&nbsp;++iCount;</p>
<p>&nbsp;GLfloat lastMatrix[16];</p>
<p>&nbsp;glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );</p>
<p>&nbsp;glPushMatrix();<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;glMatrixMode( GL_MODELVIEW );<br>&nbsp;&nbsp;glGetFloatv( GL_MODELVIEW_MATRIX , lastMatrix );<br>&nbsp;&nbsp;glLoadIdentity();<br>&nbsp;&nbsp;glRotatef( yRot , 1 , 0 , 0 );<br>&nbsp;&nbsp;glMultMatrixf( lastMatrix );</p>
<p>&nbsp;&nbsp;DrawSpace();</p>
<p>&nbsp;glPopMatrix();</p>
<p>&nbsp;glutSwapBuffers();<br>}</p>
<p>&nbsp;</p>
<p>void Reshape( int w , int h )<br>{<br>&nbsp;GLfloat fAspect;<br>&nbsp;if( 0 == h ) h = 1;<br>&nbsp;glViewport( 0 , 0 , w , h );<br>&nbsp;fAspect = (GLfloat)w / (GLfloat)h;</p>
<p>&nbsp;glMatrixMode( GL_PROJECTION );<br>&nbsp;glLoadIdentity();<br>&nbsp;gluPerspective( 60 , fAspect , 1 , 800 );</p>
<p>&nbsp;glMatrixMode( GL_MODELVIEW );<br>&nbsp;glLoadIdentity();<br>&nbsp;glTranslatef( 0 , START_Y , START_Z );</p>
<p>&nbsp;glutPostRedisplay();<br>}</p>
<p>&nbsp;</p>
<p>void Motion( int x , int y )<br>{<br>&nbsp;GLfloat lastMatrix[ 16 ];<br>&nbsp;<br>&nbsp;glMatrixMode( GL_MODELVIEW );<br>&nbsp;glGetFloatv( GL_MODELVIEW_MATRIX , lastMatrix );<br>&nbsp;glLoadIdentity();</p>
<p>&nbsp;yRot += (y - my) / 5;<br>&nbsp;if( yRot &gt;= 90 )<br>&nbsp;&nbsp;yRot = 90;<br>&nbsp;else if( yRot &lt;= -90 )<br>&nbsp;&nbsp;yRot = -90;</p>
<p>&nbsp;glRotatef( (GLfloat)(x-mx) , 0.0f , 1.0f , 0.0f );</p>
<p>&nbsp;glMultMatrixf(lastMatrix);</p>
<p>&nbsp;glutPostRedisplay();</p>
<p>&nbsp;mx = x;<br>&nbsp;my = y;<br>}</p>
<p>&nbsp;</p>
<p>void Mouse( int button , int state , int x , int y )<br>{<br>&nbsp;if( GLUT_LEFT_BUTTON == button )<br>&nbsp;{<br>&nbsp;&nbsp;if( GLUT_DOWN == state )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;mx = x;<br>&nbsp;&nbsp;&nbsp;my = y;<br>&nbsp;&nbsp;}//if<br>&nbsp;}//if<br>}</p>
<p>&nbsp;</p>
<p><br>void Keyboard( unsigned char key , int x , int y )<br>{<br>&nbsp;GLfloat lastMatrix[16] = {0};<br>&nbsp;glMatrixMode( GL_MODELVIEW );<br>&nbsp;glGetFloatv( GL_MODELVIEW_MATRIX , lastMatrix );<br>&nbsp;glLoadIdentity();<br>&nbsp;switch( key )<br>&nbsp;{<br>&nbsp;&nbsp;case 'w':<br>&nbsp;&nbsp;&nbsp;glTranslatef( 0 , 0 , KEY_STEP );<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 'a':<br>&nbsp;&nbsp;&nbsp;glTranslatef( KEY_STEP , 0 , 0 );<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 's':<br>&nbsp;&nbsp;&nbsp;glTranslatef( 0 , 0 , -KEY_STEP );<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 'd':<br>&nbsp;&nbsp;&nbsp;glTranslatef( -KEY_STEP , 0 , 0 );<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 'f':<br>&nbsp;&nbsp;&nbsp;glutFullScreen();<br>&nbsp;&nbsp;&nbsp;glutSetCursor( GLUT_CURSOR_NONE );<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 'q':<br>&nbsp;&nbsp;&nbsp;glutSetCursor( GLUT_CURSOR_LEFT_ARROW );<br>&nbsp;&nbsp;&nbsp;glutReshapeWindow( 800 , 600 );<br>&nbsp;&nbsp;&nbsp;glutPositionWindow( 200 , 100 );</p>
<p>&nbsp;&nbsp;default:<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;}//switch<br>&nbsp;glMultMatrixf( lastMatrix );<br>&nbsp;glutPostRedisplay();<br>}</p>
<p>&nbsp;</p>
<p><br>static GLfloat stepSlowdown[3] = { 0 };<br>static GLuint slowdownFlag = 0;</p>
<p>void SlowdownTimer( int value )<br>{<br>&nbsp;slowdownFlag = 1;</p>
<p>&nbsp;if( 0 == stepSlowdown[0] &amp;&amp; 0 == stepSlowdown[1] &amp;&amp; 0 == stepSlowdown[2] )<br>&nbsp;{<br>&nbsp;&nbsp;slowdownFlag = 0;<br>&nbsp;&nbsp;return;<br>&nbsp;}//if</p>
<p>&nbsp;GLfloat lastMatrix[16] = {0};<br>&nbsp;glMatrixMode( GL_MODELVIEW );<br>&nbsp;glGetFloatv( GL_MODELVIEW_MATRIX , lastMatrix );<br>&nbsp;glLoadIdentity();<br>&nbsp;&nbsp;glTranslatef( stepSlowdown[0] , stepSlowdown[1] , stepSlowdown[2] );<br>&nbsp;glMultMatrixf( lastMatrix );<br>&nbsp;glutPostRedisplay();</p>
<p>&nbsp;if( 0 &lt; stepSlowdown[0] )<br>&nbsp;{<br>&nbsp;&nbsp;stepSlowdown[0] -= 0.5;<br>&nbsp;}//if<br>&nbsp;else if( 0 &gt; stepSlowdown[0] )<br>&nbsp;{<br>&nbsp;&nbsp;stepSlowdown[0] += 0.5;<br>&nbsp;}</p>
<p>&nbsp;if( 0.001 &gt; stepSlowdown[0] &amp;&amp; -0.001 &lt; stepSlowdown[0])<br>&nbsp;&nbsp;stepSlowdown[0] = 0;</p>
<p>&nbsp;if( 0 &lt; stepSlowdown[2] )<br>&nbsp;{<br>&nbsp;&nbsp;stepSlowdown[2] -= 0.5;<br>&nbsp;}//if<br>&nbsp;else if( 0 &gt; stepSlowdown[2] )<br>&nbsp;{<br>&nbsp;&nbsp;stepSlowdown[2] += 0.5;<br>&nbsp;}</p>
<p>&nbsp;if( 0.001 &gt; stepSlowdown[2] &amp;&amp; -0.001 &lt; stepSlowdown[2])<br>&nbsp;&nbsp;stepSlowdown[2] = 0;</p>
<p>&nbsp;glutTimerFunc( 30 , SlowdownTimer , 0 );<br>}</p>
<p>&nbsp;</p>
<p>void KeyboardUp( unsigned char key , int x , int y )<br>{<br>&nbsp;switch( key )<br>&nbsp;{<br>&nbsp;&nbsp;case 'w':<br>&nbsp;&nbsp;&nbsp;stepSlowdown[2] = KEY_STEP;<br>&nbsp;&nbsp;&nbsp;if( 0 == slowdownFlag )<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;glutTimerFunc( 1 , SlowdownTimer , 0 );<br>&nbsp;&nbsp;&nbsp;}//if<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 'a':<br>&nbsp;&nbsp;&nbsp;stepSlowdown[0] = KEY_STEP;<br>&nbsp;&nbsp;&nbsp;if( 0 == slowdownFlag )<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;glutTimerFunc( 1 , SlowdownTimer , 0 );<br>&nbsp;&nbsp;&nbsp;}//if<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 's':<br>&nbsp;&nbsp;&nbsp;stepSlowdown[2] = -KEY_STEP;<br>&nbsp;&nbsp;&nbsp;if( 0 == slowdownFlag )<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;glutTimerFunc( 1 , SlowdownTimer , 0 );<br>&nbsp;&nbsp;&nbsp;}//if<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 'd':<br>&nbsp;&nbsp;&nbsp;stepSlowdown[0] = -KEY_STEP;<br>&nbsp;&nbsp;&nbsp;if( 0 == slowdownFlag )<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;glutTimerFunc( 1 , SlowdownTimer , 0 );<br>&nbsp;&nbsp;&nbsp;}//if<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 'f':<br>&nbsp;&nbsp;&nbsp;glutFullScreen();<br>&nbsp;&nbsp;&nbsp;glutSetCursor( GLUT_CURSOR_NONE );<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 'q':<br>&nbsp;&nbsp;&nbsp;glutSetCursor( GLUT_CURSOR_LEFT_ARROW );<br>&nbsp;&nbsp;&nbsp;glutReshapeWindow( 800 , 600 );<br>&nbsp;&nbsp;&nbsp;glutPositionWindow( 200 , 100 );<br>&nbsp;&nbsp;&nbsp;//glutDestroyWindow( iWin );<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;default:<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;}//switch<br>}<br><br><br><br>////////////////////////////////////////////////<br>main.cpp<br>////////////////////////////////////////////////<br><br><br>#include"gltools.h"<br>#include"config.h"</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br>void Init()<br>{<br>&nbsp;glEnable( GL_DEPTH_TEST );<br>&nbsp;glClearColor( 0 , 0 , 0 , 0 );</p>
<p>&nbsp;//////////////////////////////////////</p>
<p>&nbsp;//纹理初始化<br>&nbsp;GLubyte *pBytes;<br>&nbsp;GLint iWidth , iHeight , iComponents;<br>&nbsp;GLenum eFormat;</p>
<p>&nbsp;glEnable( GL_TEXTURE_2D );<br>&nbsp;glTexEnvi( GL_TEXTURE_ENV , GL_TEXTURE_ENV_MODE , GL_REPLACE );</p>
<p>&nbsp;glGenTextures( TEXTURE_COUNT , texObj );<br>&nbsp;for( int i=0; i&lt;TEXTURE_COUNT; ++i )<br>&nbsp;{<br>&nbsp;&nbsp;glBindTexture( GL_TEXTURE_2D , texObj[ i ] );<br>&nbsp;&nbsp;pBytes = gltLoadBMP( szTexFiles[ i ] , &amp;iWidth , &amp;iHeight , &amp;iComponents , &amp;eFormat );<br>&nbsp;&nbsp;glTexImage2D( GL_TEXTURE_2D , 0 , iComponents , iWidth , iHeight , 0 , eFormat , GL_UNSIGNED_BYTE , pBytes );</p>
<p>&nbsp;&nbsp;glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR );<br>&nbsp;&nbsp;glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR );<br>&nbsp;&nbsp;glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_WRAP_S , GL_REPEAT );<br>&nbsp;&nbsp;glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_WRAP_T , GL_REPEAT );</p>
<p>&nbsp;&nbsp;delete[] pBytes;<br>&nbsp;}//for</p>
<p>&nbsp;//////////////////////////////////////</p>
<p>&nbsp;//VBO初始化<br>&nbsp;glEnableClientState( GL_VERTEX_ARRAY );<br>&nbsp;glEnableClientState( GL_TEXTURE_COORD_ARRAY );</p>
<p>&nbsp;glGenBuffers( BUFFER_COUNT , vboSpace );</p>
<p>&nbsp;glBindBuffer( GL_ARRAY_BUFFER , vboSpace[ VERTEX_DATA ] );<br>&nbsp;glBufferData( GL_ARRAY_BUFFER , sizeof(GLfloat)*24 , vertexSpace , GL_STATIC_DRAW );</p>
<p>&nbsp;glBindBuffer( GL_ARRAY_BUFFER , vboSpace[ TEXTURE_DATA_GROUND ] );<br>&nbsp;glBufferData( GL_ARRAY_BUFFER , sizeof(GLfloat)*8 , texCoordGround , GL_STATIC_DRAW );</p>
<p>&nbsp;glBindBuffer( GL_ARRAY_BUFFER , vboSpace[ TEXTURE_DATA_WALL ] );<br>&nbsp;glBufferData( GL_ARRAY_BUFFER , sizeof(GLfloat)*16 , texCoordWall , GL_STATIC_DRAW );</p>
<p>&nbsp;glBindBuffer( GL_ARRAY_BUFFER , vboSpace[ TEXTURE_DATA_SKY ] );<br>&nbsp;glBufferData( GL_ARRAY_BUFFER , sizeof(GLfloat)*16 , texCoordSky , GL_STATIC_DRAW );</p>
<p>&nbsp;glBindBuffer( GL_ELEMENT_ARRAY_BUFFER , vboSpace[ INDEX_DATA_GROUND ] );<br>&nbsp;glBufferData( GL_ELEMENT_ARRAY_BUFFER , sizeof(GLuint)*4 , indexGround , GL_STATIC_DRAW );</p>
<p>&nbsp;glBindBuffer( GL_ELEMENT_ARRAY_BUFFER , vboSpace[ INDEX_DATA_WALL ] );<br>&nbsp;glBufferData( GL_ELEMENT_ARRAY_BUFFER , sizeof(GLuint)*16 , indexWall , GL_STATIC_DRAW );</p>
<p>&nbsp;glBindBuffer( GL_ELEMENT_ARRAY_BUFFER , vboSpace[ INDEX_DATA_SKY ] );<br>&nbsp;glBufferData( GL_ELEMENT_ARRAY_BUFFER , sizeof(GLuint)*4 , indexSky , GL_STATIC_DRAW );</p>
<p>&nbsp;//////////////////////////////////////<br>}</p>
<p>&nbsp;</p>
<p><br>void Exit()<br>{<br>&nbsp;glDeleteTextures( TEXTURE_COUNT , texObj );<br>&nbsp;glDeleteBuffers( BUFFER_COUNT , vboSpace );<br>}</p>
<p>&nbsp;</p>
<p><br>int main( int argc , char** argv )<br>{<br>&nbsp;glutInit( &amp;argc , argv );<br>&nbsp;glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE | GLUT_MULTISAMPLE );<br>&nbsp;glutInitWindowSize( 800 , 600 );<br>&nbsp;glutInitWindowPosition( 200 , 100 );<br>&nbsp;glutCreateWindow( "Tom" );<br>&nbsp;iWin = glutGetWindow();</p>
<p>&nbsp;glewInit();</p>
<p>&nbsp;glutDisplayFunc( Display );<br>&nbsp;glutReshapeFunc( Reshape );<br>&nbsp;glutMouseFunc( Mouse );<br>&nbsp;glutMotionFunc( Motion );<br>&nbsp;glutKeyboardFunc( Keyboard );<br>&nbsp;glutKeyboardUpFunc( KeyboardUp );<br>&nbsp;//glutTimerFunc( 1000 , Timer , 0 );</p>
<p>&nbsp;Init();<br>&nbsp;glutMainLoop();<br>&nbsp;Exit();<br>&nbsp;return 0;<br>}</p>
<img src ="http://www.cppblog.com/imtangchen/aggbug/95930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/imtangchen/" target="_blank">我可能长大了</a> 2009-09-11 15:35 <a href="http://www.cppblog.com/imtangchen/archive/2009/09/11/95930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>球2</title><link>http://www.cppblog.com/imtangchen/archive/2009/09/11/95929.html</link><dc:creator>我可能长大了</dc:creator><author>我可能长大了</author><pubDate>Fri, 11 Sep 2009 07:32:00 GMT</pubDate><guid>http://www.cppblog.com/imtangchen/archive/2009/09/11/95929.html</guid><wfw:comment>http://www.cppblog.com/imtangchen/comments/95929.html</wfw:comment><comments>http://www.cppblog.com/imtangchen/archive/2009/09/11/95929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/imtangchen/comments/commentRss/95929.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/imtangchen/services/trackbacks/95929.html</trackback:ping><description><![CDATA[<p>#include"glut.h"<br>#include"math.h"</p>
<p>#define RADIUS 500<br>#define PI 3.141592654f<br>#define R 10.0f</p>
<p>#define Y_GROUND -3.0f<br>#define F_EXTENT 70.0f<br>#define F_STEP 5.0f</p>
<p>GLfloat Rot = 0.0f;<br>GLint mx = 0 , my = 0;<br>GLint mz = -RADIUS;<br>GLfloat keyStep = 0.5f;</p>
<p>GLfloat lightPos[] = { -20 , 30 , -10 , 1 };<br>GLfloat spotDir[] = { 50 , -200 , 50 };<br>GLfloat specular[] = { 1 , 1 , 1 , 1 };<br>GLfloat specref[] = { 1 , 1 , 1 , 1 };<br>GLfloat ambientLight[] = { 0.5 , 0.5 , 0.5 , 1 };</p>
<p>//void MyTimer( int value )<br>//{<br>//&nbsp;if( abs(Rot) &gt;= 60 )<br>//&nbsp;&nbsp;step *= -1;<br>//&nbsp;Rot += step;<br>//&nbsp;glutPostRedisplay();<br>//&nbsp;glutTimerFunc( 100 , MyTimer , 0 );<br>//}</p>
<p>void init()<br>{<br>&nbsp;glEnable( GL_DEPTH_TEST );<br>&nbsp;glEnable( GL_BLEND );<br>&nbsp;/*glFrontFace( GL_CCW );<br>&nbsp;glEnable( GL_CULL_FACE );*/</p>
<p>&nbsp;glEnable( GL_LIGHTING );<br>&nbsp;glLightModelfv( GL_LIGHT_MODEL_AMBIENT , ambientLight );//定义一个全局光源，让所有物体都能够被看见<br>&nbsp;glLightfv( GL_LIGHT0 , GL_DIFFUSE , ambientLight );<br>&nbsp;glLightfv( GL_LIGHT0 , GL_SPECULAR , specular );<br>&nbsp;glLightfv( GL_LIGHT0 , GL_POSITION , lightPos );<br>&nbsp;//glLightfv( GL_LIGHT0 , GL_SPOT_DIRECTION , spotDir );<br>&nbsp;//glLightf( GL_LIGHT0 , GL_SPOT_CUTOFF , 90.0f );//光源点的cutoff角<br>&nbsp;glEnable( GL_LIGHT0 );</p>
<p>&nbsp;glEnable( GL_COLOR_MATERIAL );<br>&nbsp;glColorMaterial( GL_FRONT , GL_AMBIENT_AND_DIFFUSE );<br>&nbsp;glMaterialfv( GL_FRONT , GL_SPECULAR , specular );<br>&nbsp;glMateriali( GL_FRONT , GL_SHININESS , 180 );</p>
<p>&nbsp;glClearColor( 0.0f , 0.0f , 0.0f , 0.0f );<br>}</p>
<p>void DrawGround()<br>{<br>&nbsp;GLint iLine;</p>
<p>&nbsp;glColor4f( 0.5 , 0.5 , 0.5 , 0.6 );<br>&nbsp;glPolygonMode( GL_FRONT_AND_BACK , GL_FILL );<br>&nbsp;glBegin( GL_QUADS );<br>&nbsp;glVertex3f( -F_EXTENT , Y_GROUND-0.05 , -F_EXTENT );<br>&nbsp;glVertex3f( -F_EXTENT , Y_GROUND-0.05 , F_EXTENT );<br>&nbsp;glVertex3f( F_EXTENT , Y_GROUND-0.05 , F_EXTENT );<br>&nbsp;glVertex3f( F_EXTENT , Y_GROUND-0.05 , -F_EXTENT );<br>&nbsp;glEnd();</p>
<p>&nbsp;glColor4f( 1.0 , 1.0 , 1.0 , 0.6 );<br>&nbsp;glPolygonMode( GL_FRONT_AND_BACK , GL_LINE );<br>&nbsp;glBegin( GL_LINES );<br>&nbsp;for( iLine = -F_EXTENT; iLine &lt;= F_EXTENT; iLine += F_STEP )<br>&nbsp;{<br>&nbsp;&nbsp;glVertex3f( iLine , Y_GROUND , F_EXTENT );<br>&nbsp;&nbsp;glVertex3f( iLine , Y_GROUND , -F_EXTENT );</p>
<p>&nbsp;&nbsp;glVertex3f( F_EXTENT , Y_GROUND , iLine );<br>&nbsp;&nbsp;glVertex3f( -F_EXTENT , Y_GROUND , iLine );<br>&nbsp;}//for<br>&nbsp;glEnd();<br>}</p>
<p>void Display()<br>{<br>&nbsp;GLfloat x1 , y1 , x2 , y2 , z , r , angle;<br>&nbsp;GLfloat xx1 , zz1 , xx2 , zz2;<br>&nbsp;glEnable( GL_DEPTH_TEST );</p>
<p>&nbsp;glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );</p>
<p>&nbsp;//加入fog效果<br>&nbsp;GLfloat fBackColor[] = { 0.0f , 0.0f , 0.0f , 0.0f };<br>&nbsp;glEnable( GL_FOG );<br>&nbsp;glFogfv( GL_FOG_COLOR , fBackColor );<br>&nbsp;glFogf( GL_FOG_START , 5.0f );<br>&nbsp;glFogf( GL_FOG_END , 70.0f );<br>&nbsp;glFogi( GL_FOG_MODE , GL_LINEAR );</p>
<p>&nbsp;glPushMatrix();<br>&nbsp;glColor4f( 0.2 , 0.5 , 0.8 , 0.0 );<br>&nbsp;for( angle = 0; angle &lt;= 2*PI; angle += (PI/18) )<br>&nbsp;{<br>&nbsp;&nbsp;glPolygonMode( GL_FRONT , GL_FILL );<br>&nbsp;&nbsp;glBegin( GL_TRIANGLE_STRIP );<br>&nbsp;&nbsp;for( z = -R; z &lt;= R; z += 0.5 )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;r = sqrt( R*R - z*z );<br>&nbsp;&nbsp;&nbsp;x1 = r*cos(angle);<br>&nbsp;&nbsp;&nbsp;y1 = r*sin(angle)+7;<br>&nbsp;&nbsp;&nbsp;x2 = r*cos(angle+(PI/18));<br>&nbsp;&nbsp;&nbsp;y2 = r*sin(angle+(PI/18))+7;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;glVertex3f( x1 , -y1-7 , z );<br>&nbsp;&nbsp;&nbsp;glVertex3f( x2 , -y2-7 , z );<br>&nbsp;&nbsp;}//for<br>&nbsp;&nbsp;glEnd();<br>&nbsp;}//for</p>
<p>&nbsp;glDisable( GL_LIGHTING );<br>&nbsp;glEnable( GL_BLEND );<br>&nbsp;glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA );</p>
<p>&nbsp;&nbsp;DrawGround();</p>
<p>&nbsp;glDisable( GL_BLEND );<br>&nbsp;glEnable( GL_LIGHTING );</p>
<p>&nbsp;glPopMatrix();</p>
<p>&nbsp;glPushMatrix();<br>&nbsp;&nbsp;//glLoadIdentity();<br>&nbsp;&nbsp;glLightfv( GL_LIGHT0 , GL_POSITION , lightPos );<br>&nbsp;&nbsp;glLightfv( GL_LIGHT0 , GL_SPOT_DIRECTION , spotDir );</p>
<p>&nbsp;&nbsp;glTranslatef( lightPos[0] , lightPos[1] , lightPos[2] );</p>
<p>&nbsp;&nbsp;glPushAttrib( GL_LIGHTING_BIT );<br>&nbsp;&nbsp;&nbsp;glDisable( GL_LIGHTING );<br>&nbsp;&nbsp;&nbsp;glColor3ub( 255 , 255 , 0 );<br>&nbsp;&nbsp;&nbsp;glPolygonMode( GL_FRONT , GL_FILL );<br>&nbsp;&nbsp;&nbsp;glutSolidSphere( 3.0f , 15 , 15 );<br>&nbsp;&nbsp;glPopAttrib();<br>&nbsp;glPopMatrix();</p>
<p>&nbsp;//glPolygonMode( GL_FRONT , GL_FILL );<br>&nbsp;for( angle = 0; angle &lt;= 2*PI; angle += (PI/18) )<br>&nbsp;{<br>&nbsp;&nbsp;glPolygonMode( GL_FRONT , GL_FILL );<br>&nbsp;&nbsp;glColor3f( 0.2 , 0.5 , 0.8 );<br>&nbsp;&nbsp;glBegin( GL_TRIANGLE_STRIP );<br>&nbsp;&nbsp;for( z = -R; z &lt;= R; z += 0.5 )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;r = sqrt( R*R - z*z );<br>&nbsp;&nbsp;&nbsp;x1 = r*cos(angle);<br>&nbsp;&nbsp;&nbsp;y1 = r*sin(angle)+7;<br>&nbsp;&nbsp;&nbsp;x2 = r*cos(angle+(PI/18));<br>&nbsp;&nbsp;&nbsp;y2 = r*sin(angle+(PI/18))+7;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;glVertex3f( x1 , y1 , z );<br>&nbsp;&nbsp;&nbsp;glVertex3f( x2 , y2 , z );<br>&nbsp;&nbsp;}//for<br>&nbsp;&nbsp;glEnd();</p>
<p>&nbsp;&nbsp;//画影子<br>&nbsp;&nbsp;glColor3f( 0.0 , 0.0 , 0.0 );<br>&nbsp;&nbsp;glDisable( GL_LIGHTING );<br>&nbsp;&nbsp;glBegin( GL_TRIANGLE_STRIP );<br>&nbsp;&nbsp;for( z = -R; z &lt;= R; z += 0.5 )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;r = sqrt( R*R - z*z );<br>&nbsp;&nbsp;&nbsp;x1 = r*cos(angle);<br>&nbsp;&nbsp;&nbsp;y1 = r*sin(angle)+7;<br>&nbsp;&nbsp;&nbsp;x2 = r*cos(angle+(PI/18));<br>&nbsp;&nbsp;&nbsp;y2 = r*sin(angle+(PI/18))+7;</p>
<p>&nbsp;&nbsp;&nbsp;xx1 = ( (x1-lightPos[0])/(y1-lightPos[1]) ) * ( Y_GROUND-lightPos[1] ) + x1;<br>&nbsp;&nbsp;&nbsp;zz1 = ( (z-lightPos[0])/(y1-lightPos[1]) ) * ( Y_GROUND-lightPos[1] ) + z;</p>
<p>&nbsp;&nbsp;&nbsp;xx2 = ( (x2-lightPos[0])/(y2-lightPos[1]) ) * ( Y_GROUND-lightPos[1] ) + x2;<br>&nbsp;&nbsp;&nbsp;zz2 = ( (z-lightPos[0])/(y2-lightPos[1]) ) * ( Y_GROUND-lightPos[1] ) + z;<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;glVertex3f( xx1 , Y_GROUND , zz1 );<br>&nbsp;&nbsp;&nbsp;glVertex3f( xx2 , Y_GROUND , zz2 );<br>&nbsp;&nbsp;}//for<br>&nbsp;&nbsp;glEnd();<br>&nbsp;&nbsp;glEnable( GL_LIGHTING );<br>&nbsp;}//for</p>
<p>&nbsp;/*glBegin( GL_POINTS );*/<br>&nbsp;//GLfloat i , j , k;<br>&nbsp;//for( i=0; i&lt;255; i+=3 )<br>&nbsp;//&nbsp;for( j=0; j&lt;255; j+=3 )<br>&nbsp;//&nbsp;&nbsp;for( k=0; k&lt;255; k+=3 )<br>&nbsp;//&nbsp;&nbsp;{<br>&nbsp;//&nbsp;&nbsp;&nbsp;glColor3ub( i , j , k );<br>&nbsp;//&nbsp;&nbsp;&nbsp;glVertex3f( i/50 , j/50 , k/50-10 );<br>&nbsp;//&nbsp;&nbsp;}//for<br>&nbsp;/*glEnd();*/</p>
<p>&nbsp;glutSwapBuffers();<br>}</p>
<p>void Resize( int w , int h )<br>{<br>&nbsp;GLfloat fAspect;<br>&nbsp;if( 0 == h )&nbsp; h = 1;<br>&nbsp;glViewport( 0 , 0 , w ,h );<br>&nbsp;fAspect = (GLfloat)w / (GLfloat)h;</p>
<p>&nbsp;glMatrixMode( GL_PROJECTION );<br>&nbsp;glLoadIdentity();</p>
<p>&nbsp;gluPerspective( 60.0f , fAspect , 1.0 , 400.0 );</p>
<p>&nbsp;glMatrixMode( GL_MODELVIEW );<br>&nbsp;glLoadIdentity();<br>&nbsp;glTranslatef( 0 , 0 , -30 );</p>
<p>&nbsp;::glutPostRedisplay();<br>}</p>
<p>void Key( unsigned char k , int x , int y )<br>{<br>&nbsp;GLfloat lastMatrix[ 16 ];<br>&nbsp;glMatrixMode( GL_MODELVIEW );<br>&nbsp;glGetFloatv( GL_MODELVIEW_MATRIX , lastMatrix );<br>&nbsp;glLoadIdentity();<br>&nbsp;switch( k )<br>&nbsp;{<br>&nbsp;&nbsp;case 'w':<br>&nbsp;&nbsp;&nbsp;glTranslatef( 0.0f , 0.0f , keyStep );<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 'a':<br>&nbsp;&nbsp;&nbsp;glTranslatef( keyStep , 0.0f , 0.0f );<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 's':<br>&nbsp;&nbsp;&nbsp;glTranslatef( 0.0f , 0.0f , -keyStep );<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;case 'd':<br>&nbsp;&nbsp;&nbsp;glTranslatef( -keyStep , 0.0f , 0.0f );<br>&nbsp;&nbsp;&nbsp;break;</p>
<p>&nbsp;&nbsp;default:<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;}//switch<br>&nbsp;glMultMatrixf( lastMatrix );<br>&nbsp;glutPostRedisplay();<br>}</p>
<p>void Motion( int x , int y )<br>{<br>&nbsp;GLfloat lastMatrix[ 16 ];<br>&nbsp;<br>&nbsp;glMatrixMode(GL_MODELVIEW);<br>&nbsp;glGetFloatv(GL_MODELVIEW_MATRIX,lastMatrix);<br>&nbsp;glLoadIdentity();<br>&nbsp;glRotatef( (GLfloat)(y-my)/10 , 1.0f , 0.0f , 0.0f );<br>&nbsp;glRotatef( (GLfloat)(x-mx) , 0.0f , 1.0f , 0.0f );<br>&nbsp;glMultMatrixf(lastMatrix);<br>&nbsp;glutPostRedisplay();</p>
<p>&nbsp;mx = x;<br>&nbsp;my = y;<br>}</p>
<p>void Mouse( int button , int state , int x , int y )<br>{<br>&nbsp;if( GLUT_LEFT_BUTTON == button )<br>&nbsp;{<br>&nbsp;&nbsp;if( GLUT_DOWN == state )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;mx = x;<br>&nbsp;&nbsp;&nbsp;my = y;<br>&nbsp;&nbsp;}//if<br>&nbsp;}//if<br>}</p>
<p>int main( int argc , char** argv )<br>{<br>&nbsp;glutInit( &amp;argc , argv );<br>&nbsp;glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE );<br>&nbsp;glutInitWindowSize( 800 , 600 );<br>&nbsp;glutInitWindowPosition( 200 , 100 );<br>&nbsp;glutCreateWindow( "Tom" );</p>
<p>&nbsp;init();</p>
<p>&nbsp;glutDisplayFunc( Display );<br>&nbsp;glutReshapeFunc( Resize );<br>&nbsp;glutKeyboardFunc( Key );<br>&nbsp;glutMotionFunc( Motion );<br>&nbsp;glutMouseFunc( Mouse );<br>&nbsp;//glutTimerFunc( 100 , MyTimer , 0 );</p>
<p>&nbsp;glutMainLoop();</p>
<p>&nbsp;return 0;<br>}<br></p>
<img src ="http://www.cppblog.com/imtangchen/aggbug/95929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/imtangchen/" target="_blank">我可能长大了</a> 2009-09-11 15:32 <a href="http://www.cppblog.com/imtangchen/archive/2009/09/11/95929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>球</title><link>http://www.cppblog.com/imtangchen/archive/2009/09/08/95579.html</link><dc:creator>我可能长大了</dc:creator><author>我可能长大了</author><pubDate>Tue, 08 Sep 2009 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/imtangchen/archive/2009/09/08/95579.html</guid><wfw:comment>http://www.cppblog.com/imtangchen/comments/95579.html</wfw:comment><comments>http://www.cppblog.com/imtangchen/archive/2009/09/08/95579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/imtangchen/comments/commentRss/95579.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/imtangchen/services/trackbacks/95579.html</trackback:ping><description><![CDATA[<p>#include&lt;windows.h&gt;<br>#include"glut.h"<br>#include&lt;math.h&gt;</p>
<p>#define PI 3.141592654f<br>#define R 50<br>#define RADIUS 500</p>
<p>GLfloat mx , my , mz;<br>bool mFlag;</p>
<p>void init()<br>{<br>&nbsp;glClearColor( 0.0f , 0.0f , 0.0f , 0.0f );<br>&nbsp;glPolygonMode( GL_FRONT , GL_LINE );<br>&nbsp;glPolygonMode( GL_BACK , GL_LINE );<br>}</p>
<p>void Resize( int w , int h )<br>{<br>&nbsp;if(0==w || 0==h)<br>&nbsp;&nbsp;return;<br>&nbsp;glViewport( 0 , 0 , w , h );</p>
<p>&nbsp;glMatrixMode(GL_PROJECTION);<br>&nbsp;glLoadIdentity();<br>&nbsp;if( w &gt; h )<br>&nbsp;&nbsp;glOrtho( -100*w/h , 100*w/h , -100 , 100 , 100 , -100 );<br>&nbsp;else<br>&nbsp;&nbsp;glOrtho( -100 , 100 , -100*h/w , 100*h/w , 100 , -100 );<br>&nbsp;glMatrixMode(GL_MODELVIEW);<br>&nbsp;glLoadIdentity();<br>&nbsp;glutPostRedisplay();<br>}</p>
<p>void Display()<br>{<br>&nbsp;GLfloat z , r , angle;<br>&nbsp;glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );<br>&nbsp;glEnable( GL_DEPTH_TEST );</p>
<p>&nbsp;glMatrixMode(GL_MODELVIEW);<br>&nbsp;for( angle = 0; angle &lt;= 2*PI; angle += (PI/18) )<br>&nbsp;{<br>&nbsp;&nbsp;glBegin( GL_TRIANGLE_STRIP );<br>&nbsp;&nbsp;for( z = -R; z &lt;= R; z += 5 )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;r = sqrt( R*R - z*z );<br>&nbsp;&nbsp;&nbsp;glVertex3f( r*cos(angle) , r*sin(angle) , z );<br>&nbsp;&nbsp;&nbsp;glVertex3f( r*cos(angle+(PI/18)) , r*sin(angle+(PI/18)) , z );<br>&nbsp;&nbsp;}//for<br>&nbsp;&nbsp;glEnd();<br>&nbsp;}//for<br>&nbsp;glutSwapBuffers();<br>}</p>
<p>void Motion( int x , int y )<br>{<br>&nbsp;if( false == mFlag )<br>&nbsp;&nbsp;return;<br>&nbsp;x = x-400;<br>&nbsp;y = y-300;<br>&nbsp;GLfloat z = sqrt( (GLfloat)(RADIUS*RADIUS - x*x - y*y ));<br>&nbsp;//GLfloat Rot = 100 * acos( (mx*x + my*y + mz*z) / ( sqrt(mx*mx + my*my + mz*z) * sqrt(x*x + y*y + z*z) ) );<br>&nbsp;GLfloat Rot = sqrt( (GLfloat)((x-mx)*(x-mx) + (y-my)*(y-my)) ) / 3;<br>&nbsp;GLfloat lastMatrix[ 16 ];<br>&nbsp;<br>&nbsp;glMatrixMode(GL_MODELVIEW);<br>&nbsp;glGetFloatv(GL_MODELVIEW_MATRIX,lastMatrix);<br>&nbsp;glLoadIdentity();<br>&nbsp;glRotatef( Rot , (my*z-y*mz) , (mx*z-x*mz) , (mx*y-x*my) );<br>&nbsp;::glMultMatrixf(lastMatrix);</p>
<p>&nbsp;mx = x;<br>&nbsp;my = y;<br>&nbsp;mz = z;<br>&nbsp;glutPostRedisplay();<br>}</p>
<p>void Mouse( int button , int state , int x , int y )<br>{<br>&nbsp;if( GLUT_LEFT_BUTTON == button )<br>&nbsp;{<br>&nbsp;&nbsp;if( GLUT_DOWN == state )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;mx = x-400;<br>&nbsp;&nbsp;&nbsp;my = y-300;<br>&nbsp;&nbsp;&nbsp;mz = sqrt( RADIUS*RADIUS - mx*mx - my*my );<br>&nbsp;&nbsp;&nbsp;mFlag = true;<br>&nbsp;&nbsp;}//if<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;mFlag = false;<br>&nbsp;&nbsp;}//else<br>&nbsp;}//if<br>}</p>
<p><br>int main( int argc , char** argv )<br>{<br>&nbsp;glutInit( &amp;argc , argv );<br>&nbsp;glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );<br>&nbsp;glutInitWindowSize( 800 , 600 );<br>&nbsp;glutCreateWindow( "Tom" );</p>
<p>&nbsp;init();</p>
<p>&nbsp;glutDisplayFunc( Display );<br>&nbsp;glutReshapeFunc( Resize );<br>&nbsp;glutMotionFunc( Motion );<br>&nbsp;glutMouseFunc( Mouse );</p>
<p>&nbsp;glutShowWindow();<br>&nbsp;glutMainLoop();</p>
<p>&nbsp;return 0;<br>}</p>
<img src ="http://www.cppblog.com/imtangchen/aggbug/95579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/imtangchen/" target="_blank">我可能长大了</a> 2009-09-08 15:37 <a href="http://www.cppblog.com/imtangchen/archive/2009/09/08/95579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Client</title><link>http://www.cppblog.com/imtangchen/archive/2009/08/25/94418.html</link><dc:creator>我可能长大了</dc:creator><author>我可能长大了</author><pubDate>Tue, 25 Aug 2009 15:46:00 GMT</pubDate><guid>http://www.cppblog.com/imtangchen/archive/2009/08/25/94418.html</guid><wfw:comment>http://www.cppblog.com/imtangchen/comments/94418.html</wfw:comment><comments>http://www.cppblog.com/imtangchen/archive/2009/08/25/94418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/imtangchen/comments/commentRss/94418.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/imtangchen/services/trackbacks/94418.html</trackback:ping><description><![CDATA[<p>&nbsp;#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br>#include&lt;windows.h&gt;</p>
<p>#pragma comment( lib , "kernel32.lib" )</p>
<p>#define PIPE_NAME_SERVER_READ L"<a>\\\\.\\Pipe\\Read</a>"<br>#define PIPE_NAME_SERVER_WRITE L"<a>\\\\.\\Pipe\\Write</a>"</p>
<p>::HANDLE qqPipeHandleRead , qqPipeHandleWrite;</p>
<p>::DWORD WINAPI procRead( ::LPVOID lpParameter )<br>{<br>&nbsp;::printf( "Client reading is running!\n" );</p>
<p>&nbsp;::DWORD BytesRead;<br>&nbsp;::CHAR Buffer[ 1024 ];<br>&nbsp;while(1)<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "Client reading is running!\n" );<br>&nbsp;&nbsp;if( ::ReadFile( qqPipeHandleRead , Buffer , sizeof(Buffer) , &amp;BytesRead , NULL ) &gt; 0 )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;Buffer[ BytesRead ] = '\0';<br>&nbsp;&nbsp;&nbsp;::printf( "%s\t\t%d\n" , Buffer , BytesRead );<br>&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;}//if<br>&nbsp;}//while<br>&nbsp;return 0;<br>}</p>
<p>::DWORD WINAPI procWrite( ::LPVOID lpParameter )<br>{<br>&nbsp;::printf( "Client writing is running!\n" );</p>
<p>&nbsp;::DWORD BytesWritten;<br>&nbsp;::CHAR Buffer[ 1024 ];<br>&nbsp;int count = 0;<br>&nbsp;while(1)<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "Client writing is running!\n" );<br>&nbsp;&nbsp;::scanf( "%s" , Buffer );<br>&nbsp;&nbsp;count = 0;<br>&nbsp;&nbsp;for( int i=0; Buffer[i] != '\0' ; ++i )<br>&nbsp;&nbsp;&nbsp;++count;<br>&nbsp;&nbsp;if( ::WriteFile( qqPipeHandleWrite , Buffer , count , &amp;BytesWritten , NULL ) == 0 )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;::printf( "WirteFile failed with error %d !\n" , ::GetLastError() );<br>&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;}//if<br>&nbsp;}//while<br>&nbsp;return 0;<br>}</p>
<p>int main()<br>{<br>&nbsp;::HANDLE hRead , hWrite;<br>&nbsp;::DWORD idRead , idWrite;</p>
<p>&nbsp;if( ::WaitNamedPipe( PIPE_NAME_SERVER_WRITE , NMPWAIT_WAIT_FOREVER ) == 0 )<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "WaitNamedPipe failed with error %d !" , ::GetLastError() );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}//if</p>
<p>&nbsp;if( ::WaitNamedPipe( PIPE_NAME_SERVER_READ , NMPWAIT_WAIT_FOREVER ) == 0 )<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "WaitNamedPipe failed with error %d !" , ::GetLastError() );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}//if</p>
<p>&nbsp;qqPipeHandleRead = ::CreateFile( PIPE_NAME_SERVER_WRITE , GENERIC_READ | GENERIC_WRITE , 0 , (LPSECURITY_ATTRIBUTES)NULL ,<br>&nbsp;&nbsp;OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , (HANDLE)NULL );<br>&nbsp;if( qqPipeHandleRead == INVALID_HANDLE_VALUE )<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "CreateFile failed with error %d !" , ::GetLastError() );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}//if</p>
<p>&nbsp;qqPipeHandleWrite = ::CreateFile( PIPE_NAME_SERVER_READ , GENERIC_READ | GENERIC_WRITE , 0 , (LPSECURITY_ATTRIBUTES)NULL ,<br>&nbsp;&nbsp;OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , (HANDLE)NULL );<br>&nbsp;if( qqPipeHandleWrite == INVALID_HANDLE_VALUE )<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "CreateFile failed with error %d !" , ::GetLastError() );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}//if<br>&nbsp;::printf( "Client is running!\n" );</p>
<p>&nbsp;hRead = ::CreateThread( NULL , 0 , procRead , NULL , 0 , &amp;idRead );<br>&nbsp;if( hRead == NULL )<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "CreateThread failed with error %d !\n" , ::GetLastError() );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}//if</p>
<p>&nbsp;hWrite = ::CreateThread( NULL , 0 , procWrite , NULL , 0 , &amp;idWrite );<br>&nbsp;if( hWrite == NULL )<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "CreateThread failed with error %d !\n" , ::GetLastError() );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}//if</p>
<p>&nbsp;<br>&nbsp;while(1)<br>&nbsp;{<br>&nbsp;}//while<br>&nbsp;return 0;<br>}</p>
<img src ="http://www.cppblog.com/imtangchen/aggbug/94418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/imtangchen/" target="_blank">我可能长大了</a> 2009-08-25 23:46 <a href="http://www.cppblog.com/imtangchen/archive/2009/08/25/94418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Server</title><link>http://www.cppblog.com/imtangchen/archive/2009/08/25/94417.html</link><dc:creator>我可能长大了</dc:creator><author>我可能长大了</author><pubDate>Tue, 25 Aug 2009 15:46:00 GMT</pubDate><guid>http://www.cppblog.com/imtangchen/archive/2009/08/25/94417.html</guid><wfw:comment>http://www.cppblog.com/imtangchen/comments/94417.html</wfw:comment><comments>http://www.cppblog.com/imtangchen/archive/2009/08/25/94417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/imtangchen/comments/commentRss/94417.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/imtangchen/services/trackbacks/94417.html</trackback:ping><description><![CDATA[<p>#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br>#include&lt;windows.h&gt;</p>
<p>#pragma comment( lib , "kernel32.lib" )</p>
<p>#define PIPE_NUM 10<br>#define PIPE_NAME_SERVER_READ L"<a>\\\\.\\Pipe\\Read</a>"<br>#define PIPE_NAME_SERVER_WRITE L"<a>\\\\.\\Pipe\\Write</a>"</p>
<p>::HANDLE qqPipeHandleRead , qqPipeHandleWrite;</p>
<p>::DWORD WINAPI procRead( ::LPVOID lpParameter )<br>{<br>&nbsp;::printf( "Server reading is running!\n" );</p>
<p>&nbsp;::DWORD BytesRead;<br>&nbsp;::CHAR Buffer[ 1024 ];<br>&nbsp;while(1)<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "Server reading is running!\n" );<br>&nbsp;&nbsp;if( ::ReadFile( qqPipeHandleRead , Buffer , sizeof(Buffer) , &amp;BytesRead , NULL ) &gt; 0 )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;Buffer[ BytesRead ] = '\0';<br>&nbsp;&nbsp;&nbsp;::printf( "%s\t\t%d\n" , Buffer , BytesRead );<br>&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;}//if<br>&nbsp;}//while<br>&nbsp;return 0;<br>}</p>
<p>::DWORD WINAPI procWrite( ::LPVOID lpParameter )<br>{<br>&nbsp;::printf( "Server writing is running!\n" );</p>
<p>&nbsp;::DWORD BytesWritten;<br>&nbsp;::CHAR Buffer[ 1024 ];<br>&nbsp;int count = 0;<br>&nbsp;while(1)<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "Server writing is running!\n" );<br>&nbsp;&nbsp;::scanf( "%s" , Buffer );<br>&nbsp;&nbsp;count = 0;<br>&nbsp;&nbsp;for( int i=0; Buffer[i] != '\0' ; ++i )<br>&nbsp;&nbsp;&nbsp;++count;<br>&nbsp;&nbsp;if( ::WriteFile( qqPipeHandleWrite , Buffer , count , &amp;BytesWritten , NULL ) == 0 )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;::printf( "WirteFile failed with error %d !\n" , ::GetLastError() );<br>&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;}//if<br>&nbsp;}//while<br>&nbsp;return 0;<br>}</p>
<p>int main()<br>{<br>&nbsp;::HANDLE hRead , hWrite;<br>&nbsp;::DWORD idRead , idWrite;</p>
<p>&nbsp;qqPipeHandleRead = ::CreateNamedPipe( PIPE_NAME_SERVER_READ , <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PIPE_ACCESS_DUPLEX , <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PIPE_TYPE_BYTE | PIPE_READMODE_BYTE ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PIPE_NUM , 0 , 0 , 1000 , NULL );<br>&nbsp;if( INVALID_HANDLE_VALUE == qqPipeHandleRead )<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "CreateNamedPipeW failed with error %d !\n" , ::GetLastError() );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}//if</p>
<p>&nbsp;qqPipeHandleWrite = ::CreateNamedPipe( PIPE_NAME_SERVER_WRITE , <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PIPE_ACCESS_DUPLEX , <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PIPE_TYPE_BYTE | PIPE_READMODE_BYTE ,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PIPE_NUM , 0 , 0 , 1000 , NULL );<br>&nbsp;if( INVALID_HANDLE_VALUE == qqPipeHandleWrite )<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "CreateNamedPipeW failed with error %d !\n" , ::GetLastError() );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}//if<br>&nbsp;::printf( "Server is running!\n" );</p>
<p>&nbsp;hRead = ::CreateThread( NULL , 0 , procRead , NULL , 0 , &amp;idRead );<br>&nbsp;if( hRead == NULL )<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "CreateThread failed with error %d !\n" , ::GetLastError() );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}//if</p>
<p>&nbsp;hWrite = ::CreateThread( NULL , 0 , procWrite , NULL , 0 , &amp;idWrite );<br>&nbsp;if( hWrite == NULL )<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "CreateThread failed with error %d !\n" , ::GetLastError() );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}//if</p>
<p>&nbsp;if( ::ConnectNamedPipe( qqPipeHandleRead , NULL ) == 0 )<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "ConnectNamedPipe failed with error %d !\n" , ::GetLastError() );<br>&nbsp;}//if</p>
<p>&nbsp;if( ::ConnectNamedPipe( qqPipeHandleWrite , NULL ) == 0 )<br>&nbsp;{<br>&nbsp;&nbsp;::printf( "ConnectNamedPipe failed with error %d !\n" , ::GetLastError() );<br>&nbsp;}//if</p>
<p>&nbsp;while(1)<br>&nbsp;{<br>&nbsp;}//while<br>&nbsp;return 0;<br>}<br></p>
<img src ="http://www.cppblog.com/imtangchen/aggbug/94417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/imtangchen/" target="_blank">我可能长大了</a> 2009-08-25 23:46 <a href="http://www.cppblog.com/imtangchen/archive/2009/08/25/94417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>