/***********************************************************************/ /* This program demonstrates how to use BIOS calls for programming the */ /* Atari Portfolio in graphics mode. The program should be compiled */ /* with Turbo C 1.0 */ /* Simple 3D engine implementation by RayeR (C) 2000 */ /***********************************************************************/ #include #include #include #include #define GFX 0x04 #define TXT 0x07 #define XRES 240 #define YRES 64 #define MAXX (XRES-1) #define MAXY (YRES-1) #define MIDX XRES/2 #define MIDY YRES/2 /* camera position */ #define CX 10 #define CY 2 #define CZ 200 /* krychle - 8 vertexu, 12 faces */ #define VNUM 8 #define FNUM 12 int i,j; int v[VNUM][3]; /* 3D vertexy */ int f[FNUM][3]; /* fejsy */ int p[VNUM][2]; /* 2D transformovane body */ int sintbl[91]={ /* predpocitana tabulka sinus */ 0, 4, 8, 13, 17, 22, 26, 31, 35, 40, 44, 48, 53, 57, 61, 66, 70, 74, 79, 83, 87, 91, 95, 100, 104, 108, 112, 116, 120, 124, 127, 131, 135, 139, 143, 146, 150, 154, 157, 161, 164, 167, 171, 174, 177, 181, 184, 187, 190, 193, 196, 198, 201, 204, 207, 209, 212, 214, 217, 219, 221, 223, 226, 228, 230, 232, 233, 235, 237, 238, 240, 242, 243, 244, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 254, 255, 255, 255, 255, 255, 256 }; void setmode(int mode) /* set mode GFX/TXT */ { __dpmi_regs regs; regs.h.ah = 0; regs.h.al = mode; __dpmi_int(0x10,®s); } void putpix(int x, int y, int color) /* putpixel 0/1 */ { __dpmi_regs regs; regs.h.ah = 0x0c; regs.h.al = color; regs.h.bh = 0; regs.x.cx = x; regs.x.dx = y; __dpmi_int(0x10,®s); } int getpix(int x, int y) /* get pixel color 0/1 */ { __dpmi_regs regs; regs.h.ah = 0x0d; regs.h.bh = 0; regs.x.cx = x; regs.x.dx = y; __dpmi_int(0x10,®s); return(regs.h.al); } void line(int x1, int y1, int x2, int y2, int color) /* line */ { int x, y, d, a, b; int dx_diag, dy_diag; int dx_nondiag, dy_nondiag; int diag_inc, nondiag_inc; int i, swap; x = x1; y = y1; a = x2-x1; b = y2-y1; if (a<0) { a = -a; dx_diag = -1; } else dx_diag = 1; if (b<0) { b = -b; dy_diag = -1; } else dy_diag = 1; if (a>8)+CZ); p[i][0]=(int)( CZ*((v[i][0]>>8)+CX)/zdivider+MIDX); p[i][1]=(int)(-CZ*((v[i][1]>>8)+CY)/zdivider+MIDY); } } void render(int color) { int i; for (i=0; i0) v[i][0]=v[i][0]<>-xm; if (ym>0) v[i][1]=v[i][1]<>-ym; if (zm>0) v[i][2]=v[i][2]<>-zm; } } int isin(int x) { if (x>0) return(sintbl[x]); else return(-sintbl[-x]); } int icos(int x) { if (x>0) return(sintbl[90-x]); else return(sintbl[90+x]); } void rotatex(int alfa) { int i,temp; for (i=0; i>8)*icos(alfa)-(v[i][1]>>8)*isin(alfa); v[i][1]=(v[i][2]>>8)*isin(alfa)+(v[i][1]>>8)*icos(alfa); v[i][2]=temp; } } void rotatey(int alfa) { int i,temp; for (i=0; i>8)*icos(alfa)-(v[i][2]>>8)*isin(alfa); v[i][2]=(v[i][0]>>8)*isin(alfa)+(v[i][2]>>8)*icos(alfa); v[i][0]=temp; } } void rotatez(int alfa) { int i,temp; for (i=0; i>8)*icos(alfa)-(v[i][1]>>8)*isin(alfa); v[i][1]=(v[i][0]>>8)*isin(alfa)+(v[i][1]>>8)*icos(alfa); v[i][0]=temp; } } main() { /* definice krychle */ v[0][0]=-2500; v[0][1]=2500; v[0][2]=2500; v[1][0]=2500; v[1][1]=2500; v[1][2]=2500; v[2][0]=2500; v[2][1]=-2500; v[2][2]=2500; v[3][0]=-2500; v[3][1]=-2500; v[3][2]=2500; v[4][0]=-2500; v[4][1]=2500; v[4][2]=-2500; v[5][0]=2500; v[5][1]=2500; v[5][2]=-2500; v[6][0]=2500; v[6][1]=-2500; v[6][2]=-2500; v[7][0]=-2500; v[7][1]=-2500; v[7][2]=-2500; f[0][0]=0; f[0][1]=4; f[0][2]=2; f[1][0]=0; f[1][1]=1; f[1][2]=2; f[2][0]=1; f[2][1]=5; f[2][2]=6; f[3][0]=1; f[3][1]=2; f[3][2]=6; f[4][0]=0; f[4][1]=4; f[4][2]=7; f[5][0]=0; f[5][1]=3; f[5][2]=7; f[6][0]=4; f[6][1]=5; f[6][2]=6; f[7][0]=4; f[7][1]=7; f[7][2]=6; f[8][0]=0; f[8][1]=1; f[8][2]=5; f[9][0]=0; f[9][1]=4; f[9][2]=5; f[10][0]=3; f[10][1]=2; f[10][2]=6; f[11][0]=3; f[11][1]=7; f[11][2]=6; setmode(GFX); // scale(-1,-1,-1); // move(-100,-10,200); for (i=0; i<100; i++) { move(-1,0,0); setmode(GFX); transform(); render(1); } delay(2000); setmode(TXT); return(0); }