home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <dos.h>
- #include <conio.h>
- #include <mem.h>
- #include <stdlib.h>
- char *ctable=" ·-■+o░▒O$@▓█";
- //char *ctable=" ░░░░▒▒▒▒▓▓▓▓██";
- #include "torus.dat"
- extern void waittof(void);
- #define COSADD (256)
-
- #define put_char(x,y,character) \
- ((*(unsigned char far *) MK_FP(0xb800,160*(y)+2*(x)))=(character))
- #define put_color(x,y,color) \
- ((*(unsigned char far *) MK_FP(0xb800,160*(y)+2*(x)+1))=(color))
-
-
- extern int cos[1025];
- extern int sin[1025];
- unsigned char buffer[16000];
- struct vertex_data_s rotated_vertex_data[VERTEXES];
-
- void rotate(int angle,int zoomfactor,int moveplc)
- {
- for (int i=0;i<VERTEXES;i++)
- {
- struct vertex_data_s *dest=&rotated_vertex_data[i];
- struct vertex_data_s *src=&vertex_data[i];
- float X=src->Z*(sin[zoomfactor]+32000.0)/16384.0;
- float Y=src->X*(sin[zoomfactor]+32000.0)/16384.0;
- float Z=src->Y*(sin[zoomfactor]+32000.0)/16384.0;
-
- dest->X=(X*sin[(angle+COSADD)&1023]+Z*sin[angle&1023])/32768.0;
- dest->Y=Y/8.0;
- dest->Z=(-X*sin[angle&1023]+Z*sin[(angle+COSADD)&1023])/32768.0;
-
- //X=dest->X;
- //Y=dest->Y;
- //Z=dest->Z;
-
- //dest->X=X;
- //dest->Y=(X*sin[(angle/2+COSADD)&1023]+Y*sin[(angle/2)&1023])/32768.0;
- //dest->Z=(-X*sin[(angle/2)&1023]+Y*sin[(angle/2+COSADD)&1023])/32768.0;
-
- dest->X=dest->X/8.0+40.0+((50.0*sin[moveplc&1023])/16384.0);
- dest->Y=dest->Y/2+25.0+((20.0*sin[(moveplc*2)&1023])/16384.0);
- dest->Z=dest->Z/2;
- }
- }
- void fline(int x1,int x2,int y,int color)
- {
- register int x;
- if (x1>x2) {int temp=x1;x1=x2;x2=temp;}
- if (x1<0) x1=0;
- if (x2>79) x2=79;
- if (x2<0) return;
- if (x1>79) return;
- if (x1>x2) return;
- if (y<0 || y>50) return;
- if (x1==x2) return;
- unsigned *p=//(unsigned far *)MK_FP(0xb800,160*y+x1*2);
- (unsigned *)(buffer+160*y+x1*2);
- register unsigned value=0x1000+ctable[color];
- for (x=x1;x<=x2;x++) {
- *p++=value;
- }
- }
-
- struct face_data_s sorted_face_data[FACES];
-
-
- int compare_face(const void *a,const void *b)
- {
- struct face_data_s *A=(struct face_data_s*)a,*B=(struct face_data_s*)b;
- if (rotated_vertex_data[A->A].Z > rotated_vertex_data[B->A].Z)
- return -1;
- else if (rotated_vertex_data[A->A].Z < rotated_vertex_data[B->A].Z)
- return 1;
- return 0;
- }
-
- void sortfaces(void)
- {
- struct face_data_s *src=face_data;
- struct face_data_s *dest=sorted_face_data;
- memcpy(dest,src,sizeof(struct face_data_s)*FACES);
- qsort((void*)dest,FACES,sizeof(struct face_data_s),compare_face);
- }
-
-
-
- #define min(x,y) ((x)<(y)?(x):(y))
- void fillpoly(int facenbr,int color)
- {
- int y;
- struct face_data_s *face=&sorted_face_data[facenbr];
- struct vertex_data_s *A=&rotated_vertex_data[face->A];
- struct vertex_data_s *B=&rotated_vertex_data[face->B];
- struct vertex_data_s *C=&rotated_vertex_data[face->C];
-
- struct vertex_data_s E,F;
-
- E.X=A->X - B->X;
- E.Y=A->Y - B->Y;
- //E.Z=A->Z - B->Z;
- F.X=A->X - C->X;
- F.Y=A->Y - C->Y;
- //F.Z=A->Z - C->Z;
-
- //float rx=E.Y*F.Z - E.Z*F.Y;
- //float ry=E.Z*F.X - E.X*F.Z;
- float rz=E.X*F.Y - E.Y*F.X;
-
- if (rz > 0) return;
- color=(int)(-A->Z/16+5)&15;
-
- struct vertex_data_s *AA = (A->Y <= B->Y) ? A : B;
- AA = (AA->Y < C->Y) ? AA : C;
-
- struct vertex_data_s *CC = (A->Y >= B->Y) ? A : B;
- CC = (CC->Y > C->Y) ? CC : C;
-
- if (AA->Y==CC->Y) return;
- struct vertex_data_s *BB=A;
- if ((BB==AA) || (BB==CC)) BB=B;
- if ((BB==AA) || (BB==CC)) BB=C;
-
- int height1=BB->Y - AA->Y;
- int height2=CC->Y - BB->Y;
- int height3=CC->Y - AA->Y;
- int CX1=AA->X*256,CX2=AA->X*256;
- int DX1;
- if (height1==0) DX1=0; else DX1=(BB->X - AA->X)*256/height1/2;
- int DX2;
- if (height3==0) DX2=0; else DX2=(CC->X - AA->X)*256/height3/2;
- for (y=AA->Y; y<=BB->Y; y++)
- {
- fline(CX1/256,CX2/256,y,color);
- CX1+=DX1; CX2+=DX2;
- }
- if (height2==0) DX1=0; else DX1 = (CC->X - BB->X)*256 / height2;
- CX1=BB->X*256;
- for ( ; y<=CC->Y ;y++)
- {
- fline(CX1/256,CX2/256,y,color);
- CX1+=DX1; CX2+=DX2;
- }
- }
- void rotating_torus(int frame)
- {
- // face_data[0].A=0;
- // face_data[0].B=1;
- // face_data[0].C=2;
- // rotated_vertex_data[0].X=70;
- // rotated_vertex_data[0].Y=5;
- // rotated_vertex_data[0].Z=4;
- // rotated_vertex_data[1].X=72-frame;
- // rotated_vertex_data[1].Y=19.5;
- // rotated_vertex_data[1].Z=5;
- // rotated_vertex_data[2].X=25;
- // rotated_vertex_data[2].Y=20;
- // rotated_vertex_data[2].Z=5;
- // rotate(frame);
- // fillpoly(0,5);
-
- // getch();
- // _fmemset(MK_FP(0xb800,0),' ',8000);
- // return;
- int i;
- rotate(frame*15,frame,frame*4);
- sortfaces();
- waittof();
- _fmemcpy(MK_FP(0xb800,0),buffer,8000);
- memset(buffer,' ',8000);
- for (i=0;i<FACES;i++)
- {
- fillpoly(i,31-((i>>3)&31));
- }
- }
-
-
-
-
-