summaryrefslogtreecommitdiff
path: root/packages/libndsfpc/examples/graphics/3D/Ortho/Ortho.pp
diff options
context:
space:
mode:
Diffstat (limited to 'packages/libndsfpc/examples/graphics/3D/Ortho/Ortho.pp')
-rw-r--r--packages/libndsfpc/examples/graphics/3D/Ortho/Ortho.pp167
1 files changed, 167 insertions, 0 deletions
diff --git a/packages/libndsfpc/examples/graphics/3D/Ortho/Ortho.pp b/packages/libndsfpc/examples/graphics/3D/Ortho/Ortho.pp
new file mode 100644
index 0000000000..be1a67493e
--- /dev/null
+++ b/packages/libndsfpc/examples/graphics/3D/Ortho/Ortho.pp
@@ -0,0 +1,167 @@
+program Ortho;
+{$L build/drunkenlogo.pcx.o}
+
+{$mode objfpc}
+
+uses
+ ctypes, nds9;
+
+{$include inc/drunkenlogo.pcx.inc}
+
+var
+ xrot: cfloat; // X Rotation
+ yrot: cfloat; // Y Rotation
+ zrot: cfloat; // Z Rotation
+
+ texture: array [0..0] of cint; // Storage For One Texture
+
+// Load PCX files And Convert To Textures
+function LoadGLTextures(): boolean;
+var
+ pcx: sImage;
+begin
+ //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);
+
+ imageDestroy(@pcx);
+
+ result := true;
+end;
+
+
+function DrawGLScene(): boolean; // Here's Where We Do All The Drawing
+begin
+ glTranslatef(0.0,0.0,-5.0);
+
+ glRotatef(xrot,1.0,0.0,0.0);
+ glRotatef(yrot,0.0,1.0,0.0);
+ glRotatef(zrot,0.0,0.0,1.0);
+
+ glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ glBegin(GL_QUADS);
+ // Front Face
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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 + 0.3;
+ yrot := yrot + 0.2;
+ zrot := zrot + 0.4;
+ result := true;
+end;
+
+begin
+ // Setup the Main screen for 3D
+ videoSetMode(MODE_0_3D);
+ vramSetBankA(VRAM_A_TEXTURE); // reserve some memory for textures
+
+ // initialize gl
+ 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);
+
+ glLight(0, RGB15(31,31,31) , 0, floattov10(-1.0), 0);
+ glLight(1, RGB15(31,31,31) , 0, 0, floattov10(-1.0));
+ glLight(2, RGB15(31,31,31) , 0, 0, floattov10( 1.0));
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+
+ //need to set up some material properties since DS does not have them set by default
+ glMaterialf(GL_AMBIENT, RGB15(16,16,16));
+ glMaterialf(GL_DIFFUSE, RGB15(16,16,16));
+ 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 our viewport to be the same size as the screen
+ glViewport(0,0,255,191);
+
+ LoadGLTextures();
+
+ // set the vertex color to white
+ glColor3f(1,1,1);
+
+ while true do
+ begin
+ scanKeys();
+
+ //reset the projection matrix
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ // set the projection matrix as either ortho or perspective
+ if (keysHeld() and KEY_R) = 0 then
+ gluPerspective(70, 256.0 / 192.0, 0.1, 100)
+ else
+ glOrtho(-3, 3,-2, 2, 0.1, 100);
+
+ // Set the current matrix to be the model matrix
+ glMatrixMode(GL_MODELVIEW);
+
+ //ds specific, several attributes can be set here
+ if (keysHeld() and KEY_L) <> 0 then
+ glPolyFmt(POLY_ALPHA(0) or POLY_CULL_NONE or POLY_FORMAT_LIGHT0 or POLY_FORMAT_LIGHT1 or POLY_FORMAT_LIGHT2)
+ else
+ glPolyFmt(POLY_ALPHA(31) or POLY_CULL_NONE or POLY_FORMAT_LIGHT0 or POLY_FORMAT_LIGHT1 or POLY_FORMAT_LIGHT2);
+
+
+ //Push our original Matrix onto the stack (save state)
+ glPushMatrix();
+
+ DrawGLScene();
+
+ // Pop our Matrix from the stack (restore state)
+ glPopMatrix(1);
+
+ // flush to screen
+ glFlush(0);
+ end;
+end.