/***********************************************************************/ /* 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 */ /***********************************************************************/ // budem prekladat pro portfolio ? #define PORTFOLIO #include #include #include typedef unsigned char Byte; #define GFX 0x04 // videomody #define TXT 0x07 #define XRES 240 #define YRES 64 #define VRAMSIZE 1920 #define MIDX (XRES/2) #define MIDY (YRES/2) #define FP 10 // fixed point 6:10 #define FPR 6 // na kolik bitu bude platny sin/cos #define FPPI (8-FPR) #define XOFFSET 10 // doladeni polohy 2D obrazu #define YOFFSET (-3) // doladeni polohy 2D obrazu /* camera position */ #define CX 20 #define CY -2 #define CZ 80 /* krychle - 8 vertexu, 12 faces */ #define VNUM 8 #define FNUM 12 #define HEDGE (19<>3; vram[ofs]=vram[ofs]|(0x80>>bytenum); } #endif void putimg(void) { int r=XRES>>3; register Byte i,j; for (j=0; j>FP)+CZ); p[i][0]=(int)( CZ*((v[i][0]>>FP)+CX)/zdivider+MIDX)+XOFFSET; p[i][1]=(int)(-CZ*((v[i][1]>>FP)+CY)/zdivider+MIDY)+YOFFSET; } } void render(Byte color) { Byte 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; } } */ void iscale(int xm, int ym , int zm) { int i; for (i=0; i0) v[i][0]+=xm; else if (v[i][0]<0) v[i][0]-=xm; if (v[i][1]>0) v[i][1]+=ym; else if (v[i][1]<0) v[i][1]-=ym; if (v[i][2]>0) v[i][2]+=zm; else if (v[i][2]<0) v[i][2]-=zm; } } int isin(char x) { if (x>0) return(sintbl[x]>>FPPI); else return(-sintbl[-x]>>FPPI); } int icos(char x) { if (x>0) return(sintbl[90-x]>>FPPI); else return(sintbl[90+x]>>FPPI); } void rotatex(Byte alfa) { int i,temp; for (i=0; i>FPR)*icos(alfa)-(v[i][1]>>FPR)*isin(alfa); v[i][1]=(v[i][2]>>FPR)*isin(alfa)+(v[i][1]>>FPR)*icos(alfa); v[i][2]=temp; } } void rotatey(Byte alfa) { int i,temp; for (i=0; i>FPR)*icos(alfa)-(v[i][2]>>FPR)*isin(alfa); v[i][2]=(v[i][0]>>FPR)*isin(alfa)+(v[i][2]>>FPR)*icos(alfa); v[i][0]=temp; } } void rotatez(Byte alfa) { int i,temp; for (i=0; i>FPR)*icos(alfa)-(v[i][1]>>FPR)*isin(alfa); v[i][1]=(v[i][0]>>FPR)*isin(alfa)+(v[i][1]>>FPR)*icos(alfa); v[i][0]=temp; } } void makebox(void) { initint61(); v[0][0]=-HEDGE; v[0][1]=HEDGE; v[0][2]=HEDGE; v[1][0]=HEDGE; v[1][1]=HEDGE; v[1][2]=HEDGE; v[2][0]=HEDGE; v[2][1]=-HEDGE; v[2][2]=HEDGE; v[3][0]=-HEDGE; v[3][1]=-HEDGE; v[3][2]=HEDGE; v[4][0]=-HEDGE; v[4][1]=HEDGE; v[4][2]=-HEDGE; v[5][0]=HEDGE; v[5][1]=HEDGE; v[5][2]=-HEDGE; v[6][0]=HEDGE; v[6][1]=-HEDGE; v[6][2]=-HEDGE; v[7][0]=-HEDGE; v[7][1]=-HEDGE; v[7][2]=-HEDGE; } main(int argc) { /* definice faces krychle */ f[0][0]=0; f[0][1]=3; 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; makebox(); setmode(GFX); j=0; k=0; while (!kbhit()) { for (i=0; i<16; i++) { rotatey(6); iscale(220,0,220); // korekce XZ chyby rotace transform(); #ifndef PORTFOLIO setmode(GFX); // jako cls line(0,0,XRES-1,0,1); line(XRES-1,0,XRES-1,YRES-1,1); line(XRES-1,YRES-1,0,YRES-1,1); line(0,YRES-1,0,0,1); #else cls(0); #endif render(1); putimg(); refresh(); if (argc>1) { k++; if ((k%MELODYLEN)==0) k=0; playtone(melody[k],4); } else { #ifndef PORTFOLIO delay(20); #else // pfdelay(1000); #endif } } makebox(); j++; if ((j%4)==0) j=0; for (l=0; l