/* render a tile of the grid */ void draw_square(BITMAP *bmp, MATRIX_f *camera, int x, int z) { V3D_f v[4]; int c; /* set up four vertices with the world-space position of the tile */ v[0].x = x - GRID_SIZE/2; v[0].y = 0; v[0].z = z - GRID_SIZE/2; v[1].x = x - GRID_SIZE/2 + TILE_SIZE; v[1].y = 0; v[1].z = z - GRID_SIZE/2; v[2].x = x - GRID_SIZE/2 + TILE_SIZE; v[2].y = 0; v[2].z = z - GRID_SIZE/2 + TILE_SIZE; v[3].x = x - GRID_SIZE/2; v[3].y = 0; v[3].z = z - GRID_SIZE/2 + TILE_SIZE; /* for each vertex... */ for (c=0; c<4; c++) { /* apply the camera matrix, translating world space -> view space */ apply_matrix_f(camera, v[c].x, v[c].y, v[c].z, &v[c].x, &v[c].y, &v[c].z); /* reject anything too close to us or behind us. Really this ought * to do a proper 3d clip, but I have yet to write the code for that :-) */ if (v[c].z < 0.01) return; /* project view space -> screen space */ persp_project_f(v[c].x, v[c].y, v[c].z, &v[c].x, &v[c].y); } if (v[0].c = (((x + z) / TILE_SIZE) & 1)) { /* every second square */ v[0].c = 1; v[1].c = 43; v[2].c = 85; v[3].c = 127; } else { v[0].c = 127 + 1; v[1].c = 127 + 43; v[2].c = 127 + 85; v[3].c = 127 + 127; } /* render the square */ quad3d_f(bmp, POLYTYPE_GCOL, NULL, &v[0], &v[1], &v[2], &v[3]); }
int main(void) { BITMAP *textura, *back_buffer; int x, y, c; // para rellenar la textura int tecla; int nPol; int i; char angulo_x = 0, angulo_y = 0, angulo_z = 0; POLIGONO3D cara[6]; // un cubo PUNTO3D ver_t[4]; // v‚rtices transformados para un pol¡gono V3D_f ver_p[4]; // v‚rtices proyectados (2d) para un pol¡gono PUNTO3D cam_p; // posici¢n de la camara VECTOR cam_f; // vector frente de la camara VECTOR cam_a; // vector arriba de la camara MATRIX_f matriz; printf("\nEjemplo de c mara en un solo plano."); printf("\n\nControles:"); printf("\n Flechas: mover la camara."); printf("\n\n\nPresione una tecla para comenzar...\n"); getch(); // inicializar allegro y otras cosas allegro_init(); set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0); install_keyboard(); install_timer(); install_int(&cont_frames, 1000); LOCK_VARIABLE(nFrames); LOCK_VARIABLE(nFramesPorSegundo); LOCK_FUNCTION(cont_frames); back_buffer = create_bitmap(SCREEN_W, SCREEN_H); clear(back_buffer); // crear una textura textura = create_bitmap(TEX_W, TEX_H); clear(textura); c = 1; // color for(x = 0; x < TEX_W; x++) { for(y = 0; y < TEX_H; y++) { putpixel(textura, x, y, c); if(c++ > 64) c = 1; } } line(textura, 0, 0, TEX_W, TEX_H, 4); line(textura, TEX_W, 0, 0, TEX_H, 4); line(textura, 0, 0, 0, TEX_H, 4); line(textura, 0, 0, TEX_W, 0, 4); line(textura, 0, TEX_H - 1, TEX_W - 1, TEX_H - 1, 4); line(textura, TEX_W - 1, TEX_H - 1, TEX_W - 1, 0, 4); textprintf(textura, font, 1, 1, 13, "Textura"); // inicializar las coordenadas 3d del cubo cara[0].ver[0].x = -2; cara[0].ver[0].y = -2; cara[0].ver[0].z = -2; cara[0].ver[1].x = 2; cara[0].ver[1].y = -2; cara[0].ver[1].z = -2; cara[0].ver[2].x = 2; cara[0].ver[2].y = 2; cara[0].ver[2].z = -2; cara[0].ver[3].x = -2; cara[0].ver[3].y = 2; cara[0].ver[3].z = -2; cara[1].ver[0].x = 2; cara[1].ver[0].y = -2; cara[1].ver[0].z = 2; cara[1].ver[1].x = -2; cara[1].ver[1].y = -2; cara[1].ver[1].z = 2; cara[1].ver[2].x = -2; cara[1].ver[2].y = 2; cara[1].ver[2].z = 2; cara[1].ver[3].x = 2; cara[1].ver[3].y = 2; cara[1].ver[3].z = 2; cara[2].ver[0].x = -2; cara[2].ver[0].y = -2; cara[2].ver[0].z = 2; cara[2].ver[1].x = -2; cara[2].ver[1].y = -2; cara[2].ver[1].z = -2; cara[2].ver[2].x = -2; cara[2].ver[2].y = 2; cara[2].ver[2].z = -2; cara[2].ver[3].x = -2; cara[2].ver[3].y = 2; cara[2].ver[3].z = 2; cara[3].ver[0].x = 2; cara[3].ver[0].y = -2; cara[3].ver[0].z = -2; cara[3].ver[1].x = 2; cara[3].ver[1].y = -2; cara[3].ver[1].z = 2; cara[3].ver[2].x = 2; cara[3].ver[2].y = 2; cara[3].ver[2].z = 2; cara[3].ver[3].x = 2; cara[3].ver[3].y = 2; cara[3].ver[3].z = -2; cara[4].ver[0].x = -2; cara[4].ver[0].y = -2; cara[4].ver[0].z = 2; cara[4].ver[1].x = 2; cara[4].ver[1].y = -2; cara[4].ver[1].z = 2; cara[4].ver[2].x = 2; cara[4].ver[2].y = -2; cara[4].ver[2].z = -2; cara[4].ver[3].x = -2; cara[4].ver[3].y = -2; cara[4].ver[3].z = -2; cara[5].ver[0].x = -2; cara[5].ver[0].y = 2; cara[5].ver[0].z = -2; cara[5].ver[1].x = 2; cara[5].ver[1].y = 2; cara[5].ver[1].z = -2; cara[5].ver[2].x = 2; cara[5].ver[2].y = 2; cara[5].ver[2].z = 2; cara[5].ver[3].x = -2; cara[5].ver[3].y = 2; cara[5].ver[3].z = 2; // inicializar las coordenadas de la textura ver_p[0].u = 0; ver_p[0].v = 0; ver_p[1].u = TEX_W; ver_p[1].v = 0; ver_p[2].u = TEX_W; ver_p[2].v = TEX_H; ver_p[3].u = 0; ver_p[3].v = TEX_H; // inicializar c mara cam_p.x = 0; cam_p.y = 0; cam_p.z = -35; cam_f.x = 0; cam_f.y = 0; cam_f.z = 1; cam_a.x = 0; cam_a.y = -1; cam_a.z = 0; set_projection_viewport(0, 0, SCREEN_W, SCREEN_H); do { // teclado if(key[KEY_RIGHT]) { get_rotation_matrix_f(&matriz, 0, -1, 0); apply_matrix_f(&matriz, cam_f.x, cam_f.y, cam_f.z, &cam_f.x, &cam_f.y, &cam_f.z); } if(key[KEY_LEFT]) { get_rotation_matrix_f(&matriz, 0, 1, 0); apply_matrix_f(&matriz, cam_f.x, cam_f.y, cam_f.z, &cam_f.x, &cam_f.y, &cam_f.z); } if(key[KEY_UP]) { cam_p.x += cam_f.x; cam_p.y += cam_f.y; cam_p.z += cam_f.z; } if(key[KEY_DOWN]) { cam_p.x -= cam_f.x; cam_p.y -= cam_f.y; cam_p.z -= cam_f.z; } get_camera_matrix_f(&matriz, cam_p.x, cam_p.y, cam_p.z, cam_f.x, cam_f.y, cam_f.z, cam_a.x, cam_a.y, cam_a.z, 32, 1); for(nPol = 0; nPol < 6; nPol++) { // cada pol¡gono for(i = 0; i < 4; i++) { // cada v‚rtice del pol¡gono // transformaci¢n apply_matrix_f(&matriz, cara[nPol].ver[i].x, cara[nPol].ver[i].y, cara[nPol].ver[i].z, &ver_t[i].x, &ver_t[i].y, &ver_t[i].z); // proyecci¢n persp_project_f(ver_t[i].x, ver_t[i].y, ver_t[i].z, &ver_p[i].x, &ver_p[i].y); ver_p[i].z = ver_t[i].z; // requerido para renderizar la textura } // backface culling if(polygon_z_normal_f(&ver_p[0], &ver_p[1], &ver_p[2]) > 0) { quad3d_f(back_buffer, POLYTYPE_PTEX, textura, &ver_p[0], &ver_p[1], &ver_p[2], &ver_p[3]); } } textprintf(back_buffer, font, 0, 190, 2, "%d FPS", nFramesPorSegundo); blit(back_buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); nFrames++; clear(back_buffer); } while(!key[KEY_ESC]); allegro_exit(); return 0; }
int main(void) { BITMAP *textura, *back_buffer; int x, y, c; // para rellenar la textura int tecla; int nPol; int i; char angulo_x = 0, angulo_y = 0, angulo_z = 0; float trans_z = 12.1; POLIGONO3D cara[6]; // un cubo PUNTO3D ver_t[4]; // v‚rtices transformados para un pol¡gono V3D_f ver_p[4]; // v‚rtices proyectados (2d) para un pol¡gono MATRIX_f matriz; printf("\nEjemplo de: backface culling (eliminaci¢n de caras posteriores)"); printf("\n\nControles:"); printf("\n Q, W, flechas = rotar cubo."); printf("\n A, Z = z++, z--."); printf("\n\n\nPresione una tecla para comenzar...\n"); getch(); // inicializar allegro y otras cosas allegro_init(); set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0); install_keyboard(); install_timer(); install_int(&cont_frames, 1000); LOCK_VARIABLE(nFrames); LOCK_VARIABLE(nFramesPorSegundo); LOCK_FUNCTION(cont_frames); back_buffer = create_bitmap(SCREEN_W, SCREEN_H); clear(back_buffer); // crear una textura textura = create_bitmap(TEX_W, TEX_H); clear(textura); c = 1; // color for(x = 0; x < TEX_W; x++) { for(y = 0; y < TEX_H; y++) { putpixel(textura, x, y, c); if(c++ > 64) c = 1; } } line(textura, 0, 0, TEX_W, TEX_H, 4); line(textura, TEX_W, 0, 0, TEX_H, 4); line(textura, 0, 0, 0, TEX_H, 4); line(textura, 0, 0, TEX_W, 0, 4); line(textura, 0, TEX_H - 1, TEX_W - 1, TEX_H - 1, 4); line(textura, TEX_W - 1, TEX_H - 1, TEX_W - 1, 0, 4); textprintf(textura, font, 1, 1, 13, "Textura"); // inicializar las coordenadas 3d del cubo cara[0].ver[0].x = -2; cara[0].ver[0].y = -2; cara[0].ver[0].z = -2; cara[0].ver[1].x = 2; cara[0].ver[1].y = -2; cara[0].ver[1].z = -2; cara[0].ver[2].x = 2; cara[0].ver[2].y = 2; cara[0].ver[2].z = -2; cara[0].ver[3].x = -2; cara[0].ver[3].y = 2; cara[0].ver[3].z = -2; cara[1].ver[0].x = 2; cara[1].ver[0].y = -2; cara[1].ver[0].z = 2; cara[1].ver[1].x = -2; cara[1].ver[1].y = -2; cara[1].ver[1].z = 2; cara[1].ver[2].x = -2; cara[1].ver[2].y = 2; cara[1].ver[2].z = 2; cara[1].ver[3].x = 2; cara[1].ver[3].y = 2; cara[1].ver[3].z = 2; cara[2].ver[0].x = -2; cara[2].ver[0].y = -2; cara[2].ver[0].z = 2; cara[2].ver[1].x = -2; cara[2].ver[1].y = -2; cara[2].ver[1].z = -2; cara[2].ver[2].x = -2; cara[2].ver[2].y = 2; cara[2].ver[2].z = -2; cara[2].ver[3].x = -2; cara[2].ver[3].y = 2; cara[2].ver[3].z = 2; cara[3].ver[0].x = 2; cara[3].ver[0].y = -2; cara[3].ver[0].z = -2; cara[3].ver[1].x = 2; cara[3].ver[1].y = -2; cara[3].ver[1].z = 2; cara[3].ver[2].x = 2; cara[3].ver[2].y = 2; cara[3].ver[2].z = 2; cara[3].ver[3].x = 2; cara[3].ver[3].y = 2; cara[3].ver[3].z = -2; cara[4].ver[0].x = -2; cara[4].ver[0].y = -2; cara[4].ver[0].z = 2; cara[4].ver[1].x = 2; cara[4].ver[1].y = -2; cara[4].ver[1].z = 2; cara[4].ver[2].x = 2; cara[4].ver[2].y = -2; cara[4].ver[2].z = -2; cara[4].ver[3].x = -2; cara[4].ver[3].y = -2; cara[4].ver[3].z = -2; cara[5].ver[0].x = -2; cara[5].ver[0].y = 2; cara[5].ver[0].z = -2; cara[5].ver[1].x = 2; cara[5].ver[1].y = 2; cara[5].ver[1].z = -2; cara[5].ver[2].x = 2; cara[5].ver[2].y = 2; cara[5].ver[2].z = 2; cara[5].ver[3].x = -2; cara[5].ver[3].y = 2; cara[5].ver[3].z = 2; // inicializar las coordenadas de la textura ver_p[0].u = 0; ver_p[0].v = 0; ver_p[1].u = TEX_W; ver_p[1].v = 0; ver_p[2].u = TEX_W; ver_p[2].v = TEX_H; ver_p[3].u = 0; ver_p[3].v = TEX_H; set_projection_viewport(0, 0, SCREEN_W, SCREEN_H); do { // teclado if(key[KEY_UP]) { angulo_x++; } if(key[KEY_DOWN]) { angulo_x--; } if(key[KEY_RIGHT]) { angulo_y--; } if(key[KEY_LEFT]) { angulo_y++; } if(key[KEY_Q]) { angulo_z++; } if(key[KEY_W]) { angulo_z--; } if(key[KEY_A]) { trans_z+=0.2; } if(key[KEY_Z]) { trans_z-=0.2; } get_transformation_matrix_f(&matriz, 1, // escala angulo_x, // angulo rotaci¢n x angulo_y, // angulo rotaci¢n y angulo_z, // angulo rotaci¢n z 0, // translaci¢n x 0, // translaci¢n y trans_z); // translaci¢n z for(nPol = 0; nPol < 6; nPol++) { // cada pol¡gono for(i = 0; i < 4; i++) { // cada v‚rtice del pol¡gono // transformaci¢n apply_matrix_f(&matriz, cara[nPol].ver[i].x, cara[nPol].ver[i].y, cara[nPol].ver[i].z, &ver_t[i].x, &ver_t[i].y, &ver_t[i].z); // proyecci¢n persp_project_f(ver_t[i].x, ver_t[i].y, ver_t[i].z, &ver_p[i].x, &ver_p[i].y); ver_p[i].z = ver_t[i].z; // requerido para renderizar la textura } // si la normal al pol¡gono es positiva -> pintar if(polygon_z_normal_f(&ver_p[0], &ver_p[1], &ver_p[2]) > 0) { quad3d_f(back_buffer, POLYTYPE_PTEX, textura, &ver_p[0], &ver_p[1], &ver_p[2], &ver_p[3]); } } textprintf(back_buffer, font, 0, 190, 2, "%d FPS", nFramesPorSegundo); blit(back_buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); nFrames++; clear(back_buffer); } while(!key[KEY_ESC]); allegro_exit(); return 0; }
void draw_fiend_beam(BITMAP *dest, BITMAP *img, int x1, int y1,int x2, int y2) { int i; V3D_f point[4]; V3D_f temp_point[2]; VERTEX the_point[4]; float angle; angle = compute_angle(x2,y2,x1,y1); // set points of a point... temp_point[0].y = 0; temp_point[0].x = -img->w/2; temp_point[1].y = 0; temp_point[1].x = img->w/2; //rotate the points for(i=0;i<2;i++) { point[i].x = (temp_point[i].x*COS(angle)-temp_point[i].y*SIN(angle)); point[i].y = (temp_point[i].y*COS(angle)+temp_point[i].x*SIN(angle)); } //give the other point thses cords... point[2].x = point[0].x; point[2].y = point[0].y; point[3].x = point[1].x; point[3].y = point[1].y; //transform to world space.. point[0].x += x1; point[0].y += y1; point[1].x += x1; point[1].y += y1; point[2].x += x2; point[2].y += y2; point[3].x += x2; point[3].y += y2; //set the u,v cords (texture cords) for(i=0;i<4;i++) point[i].c = makecol(255,0,0); point[0].u = 0; point[0].v = 0; point[1].u = img->w; point[1].v = 0; point[2].u = 0; point[2].v = distance(point[0].x,point[0].y,point[2].x,point[2].y ); point[3].u = img->w; point[3].v = distance(point[1].x,point[1].y,point[3].x,point[3].y ); for(i=0;i<4;i++) { the_point[i].x = point[i].x; the_point[i].y = point[i].y; the_point[i].u = point[i].u; the_point[i].v = point[i].v; } quad3d_f(dest,POLYTYPE_ATEX_MASK,img, &point[0], &point[1], &point[3],&point[2] ); //fiend_quad3d(dest,img, &the_point[0], &the_point[1], &the_point[3],&the_point[2] ); //for(i=0;i<4;i++) //circlefill(dest,point[i].x,point[i].y,3,makecol(255,0,255)); }