void idle() { //hack to make it only draw once static int once=0; if(!once) { draw_scene(); if(mode == MODE_JPEG) save_jpg(); } once=1; }
int main(void) { BITMAP *bmp; allegro_init(); install_keyboard(); jpgalleg_init(); set_color_depth(32); if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0)) { set_color_depth(16); if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0)) { set_color_depth(15); if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0)) { allegro_message("Unable to init truecolor 640x480 gfx mode: %s", allegro_error); return -1; } } } clear(screen); bmp = load_bitmap("cat.tga", NULL); if (!bmp) { set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); allegro_message("Error loading cat.tga\n"); return -1; } blit(bmp, screen, 0, 0, 0, 0, bmp->w, bmp->h); readkey(); if (save_jpg("savedcat.jpg", bmp, NULL)) { set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); allegro_message("Error saving savedcat.jpg (error code %d)\n", jpgalleg_error); return -1; } destroy_bitmap(bmp); return 0; }
void grabber() { GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); int width = (int) viewport[2]; int height = (int) viewport[3]; int pixelsqty; int i, j, k; int fwdvalue; FILE *fp_bmp; GLubyte *pixels; GLubyte *revpixels; /* Determine pixels quantity */ pixelsqty = 3 * width * height; /* Set up Alignment format for bitmaps */ glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); /* Define pixel array for a no extra byte. Mode 1. */ pixels = (GLubyte *) malloc(pixelsqty); if (pixels == NULL) { printf("No enough memory \n"); exit(0); } /* Define revpixel array for a no extra byte. Mode 1. */ revpixels = (GLubyte*) malloc(pixelsqty); if (revpixels == NULL) { printf("No enough memory \n"); exit(0); } /* Store Full Image from the back buffer */ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); /* Store image in memory */ glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels); /* Save pixels' RGB values inverse to an array */ // TODO There has to be a better way than this. for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { for (k = 0; k < 3; k++) { fwdvalue = getelem2d(i, j, k, (int) width, height, 3, pixels); putelem2d(fwdvalue, i, j, (2 - k), width, height, 3, revpixels); } } } /* Write 24-bit BMP file */ save_jpg(); /* Close file and free memory */ fclose(fp_bmp); free(pixels); free(revpixels); }
//MODIFY THIS FUNCTION void draw_scene() { double curY = topLeftCornerPos->getY(); for(int i = 0; i < HEIGHT * MINIPIXELS; i++) { double curX = topLeftCornerPos->getX(); for(int j = 0; j < WIDTH * MINIPIXELS; j++) { //DO RAY THINGS vector* currentPos = new vector(curX,curY,-1.0); vector* direction = eyePos->subtract(currentPos); direction->normalize(); ray* curRay = new ray(direction->getX(),direction->getY(),direction->getZ()); trace(curRay,j,i); delete curRay; delete currentPos; delete direction; curX += (screenWidth/(WIDTH * MINIPIXELS)); } curY -= (screenHeight/(HEIGHT * MINIPIXELS)); } int x = 0; int y = 0; for(int k = 0; k < HEIGHT * MINIPIXELS; k+= MINIPIXELS) { glPointSize(2.0); glBegin(GL_POINTS); x = 0; for(int l = 0; l < WIDTH * MINIPIXELS; l+= MINIPIXELS) { double rValue = 0.0; double gValue = 0.0; double bValue = 0.0; for(int m = 0; m < MINIPIXELS; m++) { for(int n = 0; n < MINIPIXELS; n++) { rValue += myImage->getPixel(l+m,k+n).getX(); gValue += myImage->getPixel(l+m,k+n).getY(); bValue += myImage->getPixel(l+m,k+n).getZ(); } } rValue /= (MINIPIXELS*MINIPIXELS); gValue /= (MINIPIXELS*MINIPIXELS); bValue /= (MINIPIXELS*MINIPIXELS); //plot_pixel(l,((HEIGHT - 1) - k),myImage->getPixel(l,k).getX(),myImage->getPixel(l,k).getY(),myImage->getPixel(l,k).getZ()); plot_pixel(x,((HEIGHT - 1) - y),rValue,gValue,bValue); buffer[y][x][0] = rValue; buffer[y][x][1] = gValue; buffer[y][x][2] = bValue; x++; } y++; glEnd(); glFlush(); } if(mode == MODE_JPEG) { save_jpg(); } }