int main(int argc, const char * argv[]) { //insert code here... //Test3::rgbimage("..\\"); //Test1::vector(); //Test2::color(); //int a; //std::cin >> a; Scene ModelScene(20); RGBImage Image(640, 480); SimpleRayTracer Raytracer(1); Raytracer.traceScene(ModelScene, Image); Image.saveToDisk("../raytracing_image.bmp"); return 0; }
int main() { WindowPtr win; #if !TARGET_API_MAC_CARBON InitGraf(&qd.thePort); InitFonts(); InitWindows(); InitMenus(); Rect r = qd.screenBits.bounds; #else BitMap bm; GetQDGlobalsScreenBits(&bm); Rect r = bm.bounds; #endif SetRect(&r, r.left + 5, r.top + 45, r.right - 5, r.bottom -5); win = NewWindow(NULL, &r, "\pRaytracer (C Version)", true, 0, (WindowPtr)-1, false, 0); #if !TARGET_API_MAC_CARBON SetPort(win); r = win->portRect; #else SetPortWindowPort(win); GetPortBounds(GetWindowPort(win), &r); #endif EraseRect(&r); float accum = 0.0f; short cx = r.right /2; short cy = r.bottom / 2; int x,y; lenl = 1.0f / sqrtf(lx*lx + ly*ly + lz*lz); lxn = lx*lenl, lyn = ly*lenl, lzn = lz*lenl; long startTime = TickCount(); float *accumV = calloc(sizeof(float), r.right); for(y = 0; y < r.bottom; y++) { for(x = 0; x < r.right; x++) { float pixel; // cam = (0,0,0) // ray = t * (x-r.right/2, - (y-r.bottom/2), -1) // plane: y = -2 float dx = x - cx; float dy = - (y - cy); float dz = -cx; float n1 = 1.0f / sqrtf(dx*dx + dy*dy + dz*dz); pixel = ray(1,0,0,0,n1*dx,n1*dy,n1*dz); #if 0 accum += pixel; if(accum >= 0.5f) accum -= 1.0f; else { MoveTo(x,y); Line(0,0); } #elif 0 accum += pixel; accum += accumV[x]; if(accum >= 0.5f) accum -= 1.0f; else { MoveTo(x,y); Line(0,0); } accumV[x] = accum = accum / 2; #elif 0 //if(pixel < Random() / 32767.0) if(pixel < (float)std::rand() / (32767.0f * 65536.0f)) { MoveTo(x,y); Line(0,0); } #else float thresh = (float)rand() / (32767.0f * 65536.0f); thresh = 0.5f + 0.4f * (thresh - 0.5f); accum += pixel; accum += accumV[x]; if(accum >= thresh) accum -= 1.0f; else { MoveTo(x,y); Line(0,0); } accumV[x] = accum = accum / 2; #endif } if(Button()) return 0; #if TARGET_API_MAC_CARBON QDFlushPortBuffer(GetWindowPort(win),NULL); #endif } long endTime = TickCount(); char buf[256]; unsigned char* pstr = (unsigned char*)buf; sprintf(buf+1, "pps = %d", (int)( (float)r.right * r.bottom / (endTime - startTime) * 60.0f )); buf[0] = strlen(buf+1); SetRect(&r, 10, 10, 10 + StringWidth(pstr) + 10, 30); PaintRect(&r); PenMode(patXor); FrameRect(&r); MoveTo(15,25); TextMode(srcBic); DrawString(pstr); #if TARGET_API_MAC_CARBON QDFlushPortBuffer(GetWindowPort(win),NULL); #endif while(!Button()) ; FlushEvents(everyEvent, -1); return 0; }