diff options
Diffstat (limited to 'packages/libndsfpc/examples/graphics/3D/nehe/lesson07/lesson07.pp')
-rw-r--r-- | packages/libndsfpc/examples/graphics/3D/nehe/lesson07/lesson07.pp | 322 |
1 files changed, 161 insertions, 161 deletions
diff --git a/packages/libndsfpc/examples/graphics/3D/nehe/lesson07/lesson07.pp b/packages/libndsfpc/examples/graphics/3D/nehe/lesson07/lesson07.pp index 6e348e43f7..53fe01bce7 100644 --- a/packages/libndsfpc/examples/graphics/3D/nehe/lesson07/lesson07.pp +++ b/packages/libndsfpc/examples/graphics/3D/nehe/lesson07/lesson07.pp @@ -1,6 +1,6 @@ (**************************************** - * NDS NeHe Lesson 07 * - * Author: Ethos * + * NDS NeHe Lesson 07 * + * Author: Ethos * ****************************************) program Lesson07; @@ -14,182 +14,182 @@ uses {$include inc/drunkenlogo.pcx.inc} var - light: boolean; // Lighting ON/OFF ( NEW ) - lp: boolean; // L Pressed? ( NEW ) + light: boolean; // Lighting ON/OFF ( NEW ) + lp: boolean; // L Pressed? ( NEW ) - xrot: cfloat; // X Rotation - yrot: cfloat; // Y Rotation - xspeed: cfloat; // X Rotation Speed - yspeed: cfloat; // Y Rotation Speed - z: cfloat = -5.0; // Depth Into The Screen + xrot: cfloat; // X Rotation + yrot: cfloat; // Y Rotation + xspeed: cfloat; // X Rotation Speed + yspeed: cfloat; // Y Rotation Speed + z: cfloat = -5.0; // Depth Into The Screen - texture: array [0..2] of integer; // Storage For 3 Textures (only going to use 1 on the DS for this demo) + texture: array [0..2] of integer; // Storage For 3 Textures (only going to use 1 on the DS for this demo) const - LightAmbient: array [0..3] of cfloat = ( 0.5, 0.5, 0.5, 1.0 ); - LightDiffuse: array [0..3] of cfloat = ( 1.0, 1.0, 1.0, 1.0 ); - LightPosition: array [0..3] of cfloat = ( 0.0, 0.0, 2.0, 1.0 ); + LightAmbient: array [0..3] of cfloat = ( 0.5, 0.5, 0.5, 1.0 ); + LightDiffuse: array [0..3] of cfloat = ( 1.0, 1.0, 1.0, 1.0 ); + LightPosition: array [0..3] of cfloat = ( 0.0, 0.0, 2.0, 1.0 ); -function DrawGLScene(): boolean; // Here's Where We Do All The Drawing +function DrawGLScene(): boolean; // Here's Where We Do All The Drawing begin - glLoadIdentity(); // Reset The View - glTranslatef(0.0,0.0,z); - - glRotatef(xrot,1.0,0.0,0.0); - glRotatef(yrot,0.0,1.0,0.0); - - glBindTexture(GL_TEXTURE_2D, texture[0]); //no filters to swtich between - - glBegin(GL_QUADS); - // Front Face - glNormal3f( 0.0, 0.0, 1.0); - glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); - glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); - glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 1.0); - glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); - // Back Face - glNormal3f( 0.0, 0.0,-1.0); - glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); - glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); - glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); - glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0); - // Top Face - glNormal3f( 0.0, 1.0, 0.0); - glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); - glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); - glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0, 1.0); - glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); - // Bottom Face - glNormal3f( 0.0,-1.0, 0.0); - glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0); - glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0); - glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); - glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); - // Right face - glNormal3f( 1.0, 0.0, 0.0); - glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0); - glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); - glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, 1.0); - glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); - // Left Face - glNormal3f(-1.0, 0.0, 0.0); - glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); - glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); - glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); - glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); - glEnd(); - - xrot:=xrot+xspeed; - yrot:=yrot+yspeed; - - - result := true; + glLoadIdentity(); // Reset The View + glTranslatef(0.0,0.0,z); + + glRotatef(xrot,1.0,0.0,0.0); + glRotatef(yrot,0.0,1.0,0.0); + + glBindTexture(GL_TEXTURE_2D, texture[0]); //no filters to swtich between + + glBegin(GL_QUADS); + // Front Face + glNormal3f( 0.0, 0.0, 1.0); + glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); + glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); + glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 1.0); + glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); + // Back Face + glNormal3f( 0.0, 0.0,-1.0); + glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); + glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); + glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); + glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0); + // Top Face + glNormal3f( 0.0, 1.0, 0.0); + glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); + glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); + glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0, 1.0); + glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); + // Bottom Face + glNormal3f( 0.0,-1.0, 0.0); + glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0); + glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0); + glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); + glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); + // Right face + glNormal3f( 1.0, 0.0, 0.0); + glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0); + glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); + glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, 1.0); + glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); + // Left Face + glNormal3f(-1.0, 0.0, 0.0); + glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); + glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); + glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); + glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); + glEnd(); + + xrot:=xrot+xspeed; + yrot:=yrot+yspeed; + + + result := true; end; -function LoadGLTextures(): boolean; // Load PCX files And Convert To Textures +function LoadGLTextures(): boolean; // Load PCX files And Convert To Textures var - pcx: sImage; //////////////(NEW) and different from nehe. + pcx: sImage; //////////////(NEW) and different from nehe. begin - //load our texture - loadPCX(pcuint8(drunkenlogo_pcx), @pcx); - - image8to16(@pcx); + //load our texture + loadPCX(pcuint8(drunkenlogo_pcx), @pcx); + + image8to16(@pcx); - glGenTextures(1, @texture[0]); - glBindTexture(0, texture[0]); - glTexImage2D(0, 0, GL_RGB, TEXTURE_SIZE_128 , TEXTURE_SIZE_128, 0, TEXGEN_TEXCOORD, pcx.image.data8); + glGenTextures(1, @texture[0]); + glBindTexture(0, texture[0]); + glTexImage2D(0, 0, GL_RGB, TEXTURE_SIZE_128 , TEXTURE_SIZE_128, 0, TEXGEN_TEXCOORD, pcx.image.data8); - imageDestroy(@pcx); + imageDestroy(@pcx); - result := true; + result := true; end; +var + pressed: integer; + held: integer; begin - // Setup the Main screen for 3D - videoSetMode(MODE_0_3D); - vramSetBankA(VRAM_A_TEXTURE); //NEW must set up some memory for textures - - // initialize the geometry engine - glInit(); - - // enable textures - glEnable(GL_TEXTURE_2D); - - // enable antialiasing - glEnable(GL_ANTIALIAS); - - // setup the rear plane - glClearColor(0,0,0,31); // BG must be opaque for AA to work - glClearPolyID(63); // BG must have a unique polygon ID for AA to work - glClearDepth($7FFF); - - // Set our viewport to be the same size as the screen - glViewPort(0,0,255,191); - - LoadGLTextures(); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(70, 256.0 / 192.0, 0.1, 100); - - //set up a directional light arguments are light number (0-3), light color, - //and an x,y,z vector that points in the direction of the light, the direction must be normalized - glLight(0, RGB15(31,31,31) , 0, floattov10(-1.0), 0); - - //need to set up some material properties since DS does not have them set by default - glMaterialf(GL_AMBIENT, RGB15(8,8,8)); - glMaterialf(GL_DIFFUSE, RGB15(8,8,8)); - glMaterialf(GL_SPECULAR, BIT(15) or RGB15(8,8,8)); - glMaterialf(GL_EMISSION, RGB15(16,16,16)); - - //ds uses a table for shinyness..this generates a half-ass one - glMaterialShinyness(); - - // Set the current matrix to be the model matrix - glMatrixMode(GL_MODELVIEW); - - while true do - begin - //these little button functions are pretty handy - scanKeys(); - - - if ((keysDown() and KEY_A)) <> 0 then - light := not light; - - if (keysHeld() and KEY_R) <> 0 then - z := z -0.02; - if (keysHeld() and KEY_L) <> 0 then - z := z+0.02; - if (keysHeld() and KEY_LEFT) <> 0 then - xspeed := xspeed-0.01; - if (keysHeld() and KEY_RIGHT) <> 0 then - xspeed := xspeed+0.01; - if (keysHeld() and KEY_UP) <> 0 then - yspeed := yspeed+0.01; - if (keysHeld() and KEY_DOWN) <> 0 then - yspeed := yspeed-0.01; - - - glColor3f(1,1,1); - - if (not light) then - //ds specific, several attributes can be set here including turning on our light - glPolyFmt(POLY_ALPHA(31) or POLY_CULL_BACK) - else - //ds specific, several attributes can be set here including turning on our light - glPolyFmt(POLY_ALPHA(31) or POLY_CULL_BACK or POLY_FORMAT_LIGHT0); - - DrawGLScene(); - - // flush to screen - glFlush(0); - - // wait for the screen to refresh - swiWaitForVBlank(); - end; - + // Setup the Main screen for 3D + videoSetMode(MODE_0_3D); + vramSetBankA(VRAM_A_TEXTURE); //NEW must set up some memory for textures + + // initialize the geometry engine + glInit(); + + // enable textures + glEnable(GL_TEXTURE_2D); + + // enable antialiasing + glEnable(GL_ANTIALIAS); + + // setup the rear plane + glClearColor(0,0,0,31); // BG must be opaque for AA to work + glClearPolyID(63); // BG must have a unique polygon ID for AA to work + glClearDepth($7FFF); + + // Set our viewport to be the same size as the screen + glViewPort(0,0,255,191); + + LoadGLTextures(); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(70, 256.0 / 192.0, 0.1, 100); + + //set up a directional light arguments are light number (0-3), light color, + //and an x,y,z vector that points in the direction of the light, the direction must be normalized + glLight(0, RGB15(31,31,31) , 0, floattov10(-1.0), 0); + + //need to set up some material properties since DS does not have them set by default + glMaterialf(GL_AMBIENT, RGB15(8,8,8)); + glMaterialf(GL_DIFFUSE, RGB15(8,8,8)); + glMaterialf(GL_SPECULAR, BIT(15) or RGB15(8,8,8)); + glMaterialf(GL_EMISSION, RGB15(16,16,16)); + + //ds uses a table for shinyness..this generates a half-ass one + glMaterialShinyness(); + + // Set the current matrix to be the model matrix + glMatrixMode(GL_MODELVIEW); + + while true do + begin + //these little button functions are pretty handy + scanKeys(); + pressed := keysDown(); + + if ((pressed and KEY_A)) <> 0 then light := not light; + + held := keysHeld(); + + if (held and KEY_R) <> 0 then z := z - 0.02; + if (held and KEY_L) <> 0 then z := z + 0.02; + if (held and KEY_LEFT) <> 0 then xspeed := xspeed - 0.01; + if (held and KEY_RIGHT) <> 0 then xspeed := xspeed + 0.01; + if (held and KEY_UP) <> 0 then yspeed := yspeed + 0.01; + if (held and KEY_DOWN) <> 0 then yspeed := yspeed - 0.01; + + + glColor3f(1,1,1); + + if (not light) then + //ds specific, several attributes can be set here including turning on our light + glPolyFmt(POLY_ALPHA(31) or POLY_CULL_BACK) + else + //ds specific, several attributes can be set here including turning on our light + glPolyFmt(POLY_ALPHA(31) or POLY_CULL_BACK or POLY_FORMAT_LIGHT0); + + DrawGLScene(); + + // flush to screen + glFlush(0); + + // wait for the screen to refresh + swiWaitForVBlank(); + + if (pressed and KEY_START) <> 0 then break; + end; + end. |