#include #include #include #include //for pow //#include //for video #include "avi.h" #define VIDEO 0 #define NUMFRAMES 2800//60 // /30 for 1 second #define FRAMESIZE 352*240*3 #define BMAPS 0 #define MAKEINDEX 0 #define CONSTVEL 1 #define GALAXY 0 #define TWOATOMS 0 #define PI 3.14159265 typedef struct _point3d { int a,b,d; }point3d; typedef struct _point3df { float a,b,d; }point3df; typedef struct _matrix3df { float a[3]; float b[3]; float d[3]; }matrix3df; typedef struct tagAVIHEAD { unsigned long riff; unsigned long fsize; unsigned long avi; unsigned long list; unsigned long listlen; //? unsigned long hdrl; unsigned long avih; //unsigned long more; //? }AVIHEAD; typedef struct tagLISTSTR { unsigned long list; unsigned long listlen; unsigned long strl; //strl unsigned long strh; //strh unsigned long strhlen; }LISTSTR; typedef struct tagmovi { unsigned long list; //LIST unsigned long listsize; unsigned long movi; //movi }MOVI; #if 0 struct _aviindex_chunk { FOURCC fcc; DWORD cb; WORD wLongsPerEntry; // size of each entry in aIndex array BYTE bIndexSubType; // future use. must be 0 BYTE bIndexType; // one of AVI_INDEX_* codes DWORD nEntriesInUse; // index of first unused member in aIndex array DWORD dwChunkId; // fcc of what is indexed DWORD dwReserved[3]; // meaning differs for each index // type/subtype. 0 if unused struct _aviindex_entry { DWORD adw[wLongsPerEntry]; } aIndex[ ]; }AVISTDINDEX, * PAVISTDINDEX; #endif AVIINDEXENTRY avindex; #if 0 unsigned long parm[8]; unsigned long numframes; unsigned long caps; unsigned long streams; unsigned long framesize; unsigned long width; unsigned long height; unsigned long scale,rate; unsigned long dwlength; unsigned long editcount; unsigned long list2; unsigned long parm2[10]; unsigned long fps; unsigned long fps0; unsigned long numframes2; unsigned long framesize2; unsigned long parm3[9]; unsigned long width2; unsigned long height2; unsigned long weird1; unsigned long weird2; unsigned long framesize3; unsigned long weird3[4]; // unsigned long junk; // unsigned long junklen; // unsigned long zero[964]; unsigned long list3; unsigned long fsize1; unsigned long movi; }AVIHEAD; #endif AVIHEAD head; MainAVIHeader head2; LISTSTR head3; AVIStreamHeader head4; BITMAPINFOHEADER bmpihead; unsigned long strf; MOVI head5; #if 0 typedef struct _BMPFRAME { unsigned int tag; unsigned int framesize' }BMPFRAME; #endif char head7[8]={ 0x30, 0x30, 0x64, 0x62,FRAMESIZE,FRAMESIZE>>8,FRAMESIZE>>16,FRAMESIZE>>24}; int curframe; //prototypes LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); void draw(void); void init_points(void); void transform_draw_points(void); void update_screen(void); void move_points(void); void pmmult(point3df p1,point3df *p2,matrix3df m); void mrotb(matrix3df *m, float a); void mmult(matrix3df m1, matrix3df m2,matrix3df *m3); void angle2matrix(point3df viewera,matrix3df *trot); LPBYTE lpBuf,lpScreen,lpChr[4]; LPBITMAPINFO lpDIB; LPRGBQUAD lpRGB; HDC hdcWin,hdcMem; HWND hwMain; HBITMAP hBMP; BYTE *screen;//[240*3][352];//[352][240*3]; DWORD dwTime,dwPreTime; int DW=352; int DH=240; int DW2=176; int DH2=120; int numpoints; int a,b,d; point3df p[10000]; point3df v[10000]; point3df p2[10000]; point3df v2[10000]; point3df viewer; float scale; float gravity; FILE *fptr,*fptr2; matrix3df viewerm,ident; point3df viewera; float direk; //amount of influence current direction has for constveloc float cveloc; //constant velocity of photons/pieces of matter int dexp=2.0; //distance exponent 2=distance squared int bmnum; char tstr[255],bmfile[255],bfn[20]; BITMAPFILEHEADER bmphead; char lfile[255]; //unsigned char aviblock[515]; unsigned int aviblock[128]; int track; int trackpoint; //WINAPI int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASS wc ; // wc.cbSize = sizeof(wndclass); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "Draw3D"; //"CWindow"; wc.hIcon = NULL; RegisterClass (&wc); hwMain = CreateWindowEx( WS_EX_APPWINDOW, "Draw3D", "Draw3D", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, DW,//WinX,640,//GetSystemMetrics(SM_CXSCREEN), //100 DH,//WinY,480,//GetSystemMetrics(SM_CYSCREEN), //100 NULL, NULL, hInstance, NULL ); screen=(unsigned char *)malloc(DW*DH*3); init_points(); #if VIDEO //open the video file fptr=fopen("c:\\temparea\\test.avi","wb"); //add avi header head.riff=0x46464952; head.fsize=0x0; head.fsize=sizeof(AVIHEAD)+ sizeof(MainAVIHeader)+ sizeof(LISTSTR)+sizeof(AVIStreamHeader)+4+ sizeof(BITMAPINFOHEADER)+sizeof(MOVI)+4+FRAMESIZE*NUMFRAMES; //this number is 0x738 (1848) too large //head.fsize=0x7ecf0; head.avi=0x20495641; head.list=0x5453494c; head.listlen=0xc0;//0xc0; //0x16e; //0xc0; //what is this? got to be c0! head.hdrl = 0x6c726468; //hdrl head.avih = 0x68697661; //avih //head.more=0; fwrite(&head,sizeof(AVIHEAD),1,fptr); head2.dwMicroSecPerFrame =0x38; head2.dwMaxBytesPerSec =0x1046b;//0x8235;//0x30D40;//0x1046b; head2.dwPaddingGranularity =0;//0xD160;//0;//dwReserved1 head2.dwFlags =0;//0x810; //0; //? head2.dwTotalFrames =0x810;//NUMFRAMES; head2.dwInitialFrames =NUMFRAMES;//0;//0x5f;//0; head2.noidea = 0; head2.dwStreams = 1; head2.dwSuggestedBufferSize = FRAMESIZE; head2.dwWidth =DW; head2.dwHeight =DH; head2.dwScale =0;//0xbff6241a; head2.dwRate = 0;//0xbff6241a; head2.dwStart = 0; head2.dwLength = 0; //? //head2.dwReserved2 =0; //memset(head2.dwReserved,0,32); fwrite(&head2,sizeof(MainAVIHeader),1,fptr); head3.list = 0x5453494c; head3.listlen = sizeof(LISTSTR)+sizeof(AVIStreamHeader)+sizeof(bmpihead); //this LIST minus LIST and len plus streamheader + strf + 0x28 + bitmapinfoheader head3.strl = 0x6c727473; //strl head3.strh= 0x68727473; //strh head3.strhlen = 0x38;//0x40; fwrite(&head3,sizeof(LISTSTR),1,fptr); #if 0 AVISTREAMINFO headt; //stream header headt.fccType = 0x73646976; //vids headt.fccHandler = 0x6d737663; //DIB 0x20424944; //msvc headt.dwFlags = 0; headt.dwCaps =0; headt.wPriority =0; headt.wLanguage=0; headt.dwScale =1; headt.dwRate = 30; //fps headt.dwStart = 0; headt.dwLength=NUMFRAMES; headt.dwInitialFrames=0; headt.dwSuggestedBufferSize = FRAMESIZE; headt.dwQuality =0; headt.dwSampleSize =0; RECT rctB = {0,0,352,240}; headt.rcFrame=rctB; //headt.EditCount=0; //headt.dwFormatChangeCount=0; //memcpy(headt.szName,0,32); //fwrite(&headt,sizeof(AVISTREAMINFO),1,fptr); #endif // // head4.dwReserved2 =DW;//0; // head4.dwReserved3 =DH;//0; //head4.dwReserved4=0; //#if 0 //stream header head4.fccType = 0x73646976; //vids //head4.fccHandler = 0x20424944; //DIB 0x6376736d;//msvc head4.fccHandler = 0;//tph - 0x20424944; //DIB 0x6376736d;//msvc head4.dwFlags = 0; head4.dwReserved1 =0; head4.dwInitialFrames =0; head4.dwScale =1; head4.dwRate = 30; //fps head4.dwStart = 0; head4.dwLength=NUMFRAMES; head4.dwSuggestedBufferSize = FRAMESIZE; head4.dwQuality =0; head4.dwSampleSize =0; //head4.dwReserved2 =DW;//0; //head4.dwReserved3 =DH;//0; // RECT rctB = {0,0,DW,DH}; // head4.rcFrame=rctB; head4.sx =0; head4.sy =0; head4.ex =DW; head4.ey =DH; //head4.dwReserved4=0; fwrite(&head4,sizeof(AVIStreamHeader),1,fptr); //#endif //stream format strf=0x66727473; //strf fwrite(&strf,4,1,fptr); memset(&bmpihead,0,sizeof(bmpihead)); bmpihead.biSize=0x28; bmpihead.biWidth=DW; bmpihead.biHeight=DH; bmpihead.biPlanes=1; bmpihead.biBitCount=24; bmpihead.biCompression=0; bmpihead.biSizeImage=DW*DH*3;//0; bmpihead.biXPelsPerMeter=0;//0xb12; bmpihead.biYPelsPerMeter=0;//0xb12; bmpihead.biClrUsed=0;//0x100; bmpihead.biClrImportant=0;//0x100; fwrite(&bmpihead.biSize,4,1,fptr); //0x28 = size of header? fwrite(&bmpihead,sizeof(BITMAPINFOHEADER),1,fptr); //add JUNK unsigned int junk; unsigned char dt; int junksize; junk=0x4b4e554a; dt=0; junksize=1816; //0x718 fwrite(&junk,4,1,fptr); fwrite(&junksize,4,1,fptr); for (a=0;a<1816;a++) //should be a 0x7f4 (2048) { fwrite(&dt,1,1,fptr); } //END AVI HEADER head5.list = 0x5453494c; //LIST head5.listsize = 4+sizeof(head7)+FRAMESIZE*NUMFRAMES;//0;//head7=8 //?was 12+ head5.movi = 0x69766f6d; //movi //NUMFRAMES*FRAMESIZE+ //NUMFRAMES*sizeof(head7)-8; fwrite(&head5,sizeof(MOVI),1,fptr); curframe=0; #endif ShowWindow (hwMain,iCmdShow); UpdateWindow (hwMain); SetFocus( hwMain); memset(screen,0,DH*DW*3); hdcWin=GetDC(hwMain); hdcMem = CreateCompatibleDC(hdcWin); //NULL); while (1) { if (PeekMessage (&msg,NULL,0,0,PM_NOREMOVE)) { if (!GetMessage (&msg,NULL,0,0)) return msg.wParam ; TranslateMessage(&msg); DispatchMessage(&msg); } transform_draw_points(); move_points(); update_screen(); } #if BMAPS //fclose(fptr2); #endif } void move_points(void) { float dist,dist2; float da,db,dd; float denom,denom2; for (a=0;a 1.0 because the influences are added // dist=dist*dist; //for inverse distance squared denom=fabs(da)+fabs(db)+fabs(dd); if (denom==0) {denom=1.0;} v2[a].a = v2[a].a + (da / denom)/dist; v2[a].b = v2[a].b + (db / denom)/dist; v2[a].d = v2[a].d + (dd / denom)/dist; //more distance between 2 photons = less influence #else //dist2 = dist * dist; v2[a].a = v2[a].a + (da / dist); v2[a].b = v2[a].b + (db / dist); v2[a].d = v2[a].d + (dd / dist); #endif //'End If } //end if different photons } //end for b } //end for a for (a=0;a-1;b--) { for(a=0;a1 add Chunklength=0x20 //for each frame for (a=1;a-1;b--) { for(a=0;a100) {x=-100; y+=yi;} if (x>xmax) {x=xmin; y+=yi;} //if (z>100) {z=-100; y+=yi;} //if (y>100) //{x=-100; y=-100; z+=zi;} if (y>ymax) {x=xmin; y=ymin; z+=zi;} //if (y>100) //{z=-100; y=-100; x+=xi;} p[a].a = -x; p[a].b = y; p[a].d = z; denom=abs(x)+abs(y)+abs(z); v[a].a=0;//(x*2)/denom; v[a].b=0;//(y*2)/denom; v[a].d=0;//(z*2)/denom; } p[numpoints-1].a = -50000.0; #if 0 //line of points to left //numpoints=500; for (a=numpoints;a100) {x=-100; y+=yi;} if (y>100) {x=-100; y=-100; z+=zi;} p[a].a = -x; p[a].b = y; p[a].d = z; v[a].a=0.0; v[a].b=0.0; v[a].d=0.0; v[a].a=-y/8;//(ym-y)/20; v[a].b=-x/8; //-(xm-x)/20; } a=numpoints; numpoints+=100; //200 more points for(b=a;b(xs+np2*xi)) {x=xs; y+=yi;} p[a].a = x; p[a].b = y; p[a].d = 0; v[a].a=(ym-y)/20; v[a].b=-(xm-x)/20; } np3=(int)(numpoints/2); np2=(int)pow(np3,0.5); xi=15.0; yi=15.0; xm=2000; //-DW2*1000; ym=0; //-DH2*1000; xs=xm-(np2*xi)/2; ys=ym-(np2*yi)/2; x=xs; y=ys; for (a=np3;a(xs+np2*xi)) {x=xs; y+=yi;} p[a].a = x; p[a].b = y; p[a].d = 0; v[a].a=(ym-y)/20; v[a].b=-(xm-x)/20; } #endif //TWOATOMS #if BMAPS bmnum=0; bmphead.bfOffBits =sizeof(BITMAPFILEHEADER); bmphead.bfReserved1 =0; bmphead.bfReserved2 =0; bmphead.bfSize = DW*DH*3+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); bmphead.bfType =19778; // "BM" 19778 memset(&bmpihead,0,sizeof(bmpihead)); bmpihead.biSize=0x28; bmpihead.biWidth=DW; bmpihead.biHeight=DH; bmpihead.biPlanes=1; bmpihead.biBitCount=24; bmpihead.biCompression=0; bmpihead.biSizeImage=DW*DH*3;//0; bmpihead.biXPelsPerMeter=0;//0xb12; bmpihead.biYPelsPerMeter=0;//0xb12; bmpihead.biClrUsed=0;//0x100; bmpihead.biClrImportant=0;//0x100; //write out to bitmap files strcpy(bfn,"aaaaaaaa"); //fptr2=fopen("bmplist.txt","wb"); #endif } void transform_draw_points(void) { int ox,oy,oz; unsigned char * offst; float tz; point3df p2,p3; //clear screen memset(screen,0,FRAMESIZE);//DH*DW*3); for(a=0;a-1 && ox < DW && oy>-1 && oya=p1.a*m.a[0] + p1.b*m.b[0] + p1.d*m.d[0]; p2->b=p1.a*m.a[1] + p1.b*m.b[1] + p1.d*m.d[1]; p2->d=p1.a*m.a[2] + p1.b*m.b[2] + p1.d*m.d[2]; } void mrota(matrix3df *m, float a) { //rotation matrix m->a[0]=1.0; m->a[1]=0.0; m->a[2]=sin(a); m->b[0]=0.0; m->b[1]=cos(a); m->b[2]=-sin(a); m->d[0]=0.0; m->d[1]=sin(a); m->d[2]=cos(a); } void mrotb(matrix3df *m, float a) { //rotation matrix m->a[0]=cos(a); m->a[1]=0.0; m->a[2]=sin(a); m->b[0]=0.0; m->b[1]=1.0; m->b[2]=0.0; m->d[0]=-sin(a); m->d[1]=0.0; m->d[2]=cos(a); } void mrotd(matrix3df *m, float a) { //rotation matrix m->a[0]=cos(a); m->a[1]=-sin(a); m->a[2]=0.0; m->b[0]=sin(a); m->b[1]=cos(a); m->b[2]=0.0; m->d[0]=0.0; m->d[1]=0.0; m->d[2]=1.0; } void mmult(matrix3df m1, matrix3df m2,matrix3df *m3) { m3->a[0]=m1.a[0]*m2.a[0]+m1.a[1]*m2.b[0]+m1.a[2]*m2.d[0]; m3->a[1]=m1.a[0]*m2.a[1]+m1.a[1]*m2.b[1]+m1.a[2]*m2.d[1]; m3->a[2]=m1.a[0]*m2.a[2]+m1.a[1]*m2.b[2]+m1.a[2]*m2.d[2]; m3->b[0]=m1.b[0]*m2.a[0]+m1.b[1]*m2.b[0]+m1.b[2]*m2.d[0]; m3->b[1]=m1.b[0]*m2.a[1]+m1.b[1]*m2.b[1]+m1.b[2]*m2.d[1]; m3->b[2]=m1.b[0]*m2.a[2]+m1.b[1]*m2.b[2]+m1.b[2]*m2.d[2]; m3->d[0]=m1.d[0]*m2.a[0]+m1.a[1]*m2.d[0]+m1.a[2]*m2.d[0]; m3->d[1]=m1.d[0]*m2.a[1]+m1.a[1]*m2.d[1]+m1.a[2]*m2.d[1]; m3->d[2]=m1.d[0]*m2.a[2]+m1.a[1]*m2.d[2]+m1.a[2]*m2.d[2]; } void angle2matrix(point3df viewera,matrix3df *trot) { matrix3df tm,tm2; mrota(&tm,viewera.a); *trot=tm; mrotb(&tm,viewera.b); mmult(*trot,tm,&tm2); mrotd(&tm,viewera.d); mmult(tm2,tm,trot); } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { matrix3df trot,tview; float difdist0,difdist1; switch (iMsg) { case WM_KEYDOWN://0x0100: //WM_KEYDOWN switch( wParam ) //0x84 { case VK_ESCAPE: case VK_F12: //QUIT=1; PostMessage(hwnd, WM_CLOSE, 0, 0); //free(MemoryStart); break; case VK_NUMPAD5: //Z+ //scale*=2.0; viewer.d/=2.0; break; case VK_NUMPAD0: //Z- case VK_INSERT: //scale/=2.0; viewer.d*=2.0; break; case VK_DOWN: case VK_NUMPAD2: viewer.b-=(viewer.d/100.0); break; case VK_UP: case VK_NUMPAD8: viewer.b+=(viewer.d/100.0); break; case VK_LEFT: case VK_NUMPAD4: viewer.a+=(viewer.d/100.0); break; case VK_RIGHT: case VK_NUMPAD6: viewer.a-=(viewer.d/100.0); break; case 99: //rt dn viewer.a-=(viewer.d/100.0); viewer.b-=(viewer.d/100.0); break; case 105: //rt up viewer.a-=(viewer.d/100.0); viewer.b+=(viewer.d/100.0); break; case 103: //lt up viewer.a+=(viewer.d/100.0); viewer.b+=(viewer.d/100.0); break; case 97: //lt dn viewer.a+=(viewer.d/100.0); viewer.b-=(viewer.d/100.0); break; case 65: //a viewera.b+=0.1; if (viewera.b>2*PI) {viewera.b=0.0;} angle2matrix(viewera,&trot); mmult(ident,trot,&viewerm); //rotate on y axis break; case 68: //d viewera.b-=0.1; if (viewera.b<-2*PI) {viewera.b=0.0;} angle2matrix(viewera,&trot); mmult(ident,trot,&viewerm); //rotate on y axis break; case 84: //t track a point track=!track; if (track==1) { difdist0=0; for(a=0;a2*PI) {viewera.a=0.0;} angle2matrix(viewera,&trot); mmult(ident,trot,&viewerm); //rotate on x axis break; case 88: //x viewera.a-=0.1; if (viewera.a<-2*PI) {viewera.a=0.0;} angle2matrix(viewera,&trot); mmult(ident,trot,&viewerm); //rotate on x axis break; } break; case WM_DESTROY : //test ReleaseDC(hwMain,hdcWin); DeleteDC(hdcMem); // DeleteObject(hBMP); PostQuitMessage(0); return 0; break; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }