Changeset 3934


Ignore:
Timestamp:
11/18/09 14:43:02 (4 years ago)
Author:
jylam
Message:
  • Factorise cube stuff, minor optimizations
File:
1 edited

Legend:

Unmodified
Added
Removed
  • neercs/trunk/src/wm.c

    r3932 r3934  
    437437 
    438438/* 3D Cube. Yeah I know, it's a mess. Just look anywhere else. */ 
     439static void draw_face(caca_canvas_t * cv, 
     440                      int p1x, int p1y, 
     441                      int p2x, int p2y, 
     442                      int p3x, int p3y, 
     443                      int p4x, int p4y, caca_canvas_t * tex, int color) 
     444{ 
     445    if (get_direction(p1x, p1y, p2x, p2y, p3x, p3y) >= 0) 
     446    { 
     447        int coords[6]; 
     448        float uv[6]; 
     449        coords[0] = p1x; 
     450        coords[1] = p1y; 
     451        coords[2] = p2x; 
     452        coords[3] = p2y; 
     453        coords[4] = p3x; 
     454        coords[5] = p3y; 
     455        uv[0] = 1; 
     456        uv[1] = 1; 
     457        uv[2] = 0; 
     458        uv[3] = 1; 
     459        uv[4] = 0; 
     460        uv[5] = 0; 
     461#if defined HAVE_CACA_TRIANGLE_TEXTURING 
     462        caca_fill_triangle_textured(cv, coords, tex, uv); 
     463#endif 
     464 
     465        coords[0] = p1x; 
     466        coords[1] = p1y; 
     467        coords[2] = p3x; 
     468        coords[3] = p3y, coords[4] = p4x; 
     469        coords[5] = p4y; 
     470        uv[0] = 1; 
     471        uv[1] = 1; 
     472        uv[2] = 0; 
     473        uv[3] = 0; 
     474        uv[4] = 1; 
     475        uv[5] = 0; 
     476#if defined HAVE_CACA_TRIANGLE_TEXTURING 
     477        caca_fill_triangle_textured(cv, coords, tex, uv); 
     478#endif 
     479        caca_set_color_ansi(cv, color, CACA_BLACK); 
     480        caca_draw_thin_line(cv, p1x, p1y, p2x, p2y); 
     481        caca_draw_thin_line(cv, p2x, p2y, p3x, p3y); 
     482        caca_draw_thin_line(cv, p3x, p3y, p4x, p4y); 
     483        caca_draw_thin_line(cv, p4x, p4y, p1x, p1y); 
     484    } 
     485} 
     486 
     487#define CUBE_TIME 1000000 
    439488void wm_refresh_cube(struct screen_list *screen_list) 
    440489{ 
     
    448497    else 
    449498    { 
    450  
    451 #define CUBE_TIME 1000000 
    452499 
    453500        long long unsigned int cur_time = get_us() - screen_list->last_switch; 
     
    472519                {1, 1, 1}, 
    473520 
     521                {-1, -1, -1}, 
    474522                {-1, -1, 1}, 
    475                 {-1, -1, -1}, 
     523                {-1, 1, 1}, 
    476524                {-1, 1, -1}, 
    477                 {-1, 1, 1}, 
    478525            }; 
    479              
     526 
    480527            float cube_transformed[12][3]; 
    481528            float cube_projected[12][2]; 
     
    488535                angle = -angle; 
    489536 
     537            float sina = sin(angle); 
     538            float cosa = cos(angle); 
     539 
    490540            for (i = 0; i < 12; i++) 
    491541            { 
    492                 cube_transformed[i][2] = 
    493                     cube[i][2] * cos(angle) - cube[i][0] * sin(angle); 
    494                 cube_transformed[i][0] = 
    495                     cube[i][2] * sin(angle) + cube[i][0] * cos(angle); 
     542                cube_transformed[i][2] = cube[i][2] * cosa - cube[i][0] * sina; 
     543                cube_transformed[i][0] = cube[i][2] * sina + cube[i][0] * cosa; 
    496544                cube_transformed[i][1] = cube[i][1]; 
    497545 
     
    515563            caca_clear_canvas(screen_list->cv); 
    516564 
    517 #if defined HAVE_CACA_TRIANGLE_TEXTURING 
    518  
    519565            caca_canvas_t *first = 
    520566                screen_list->screen[screen_list->prevpty]->cv; 
    521567            caca_canvas_t *second = screen_list->screen[screen_list->pty]->cv; 
    522568 
    523             int coords[6]; 
    524  
    525             float uv[6]; 
    526  
    527  
    528             if (get_direction(cube_projected[0][0], cube_projected[0][1], 
    529                               cube_projected[1][0], cube_projected[1][1], 
    530                               cube_projected[2][0], cube_projected[2][1]) >= 0) 
    531             { 
    532                 coords[0] = cube_projected[0][0]; 
    533                 coords[1] = cube_projected[0][1]; 
    534                 coords[2] = cube_projected[1][0]; 
    535                 coords[3] = cube_projected[1][1]; 
    536                 coords[4] = cube_projected[2][0]; 
    537                 coords[5] = cube_projected[2][1]; 
    538                 uv[0] = 1; 
    539                 uv[1] = 1; 
    540                 uv[2] = 0; 
    541                 uv[3] = 1; 
    542                 uv[4] = 0; 
    543                 uv[5] = 0; 
    544                 caca_fill_triangle_textured(screen_list->cv, 
    545                                             coords, first, uv); 
    546  
    547                 coords[0] = cube_projected[0][0]; 
    548                 coords[1] = cube_projected[0][1]; 
    549                 coords[2] = cube_projected[2][0]; 
    550                 coords[3] = cube_projected[2][1], 
    551                 coords[4] = cube_projected[3][0]; 
    552                 coords[5] = cube_projected[3][1]; 
    553                 uv[0] = 1; 
    554                 uv[1] = 1; 
    555                 uv[2] = 0; 
    556                 uv[3] = 0; 
    557                 uv[4] = 1; 
    558                 uv[5] = 0; 
    559                 caca_fill_triangle_textured(screen_list->cv, 
    560                                             coords, first, uv); 
    561                 caca_set_color_ansi(screen_list->cv, CACA_LIGHTGREEN, 
    562                                     CACA_BLACK); 
    563                 caca_draw_thin_line(screen_list->cv, cube_projected[0][0], 
    564                                     cube_projected[0][1], cube_projected[1][0], 
    565                                     cube_projected[1][1]); 
    566                 caca_draw_thin_line(screen_list->cv, cube_projected[1][0], 
    567                                     cube_projected[1][1], cube_projected[2][0], 
    568                                     cube_projected[2][1]); 
    569                 caca_draw_thin_line(screen_list->cv, cube_projected[2][0], 
    570                                     cube_projected[2][1], cube_projected[3][0], 
    571                                     cube_projected[3][1]); 
    572                 caca_draw_thin_line(screen_list->cv, cube_projected[3][0], 
    573                                     cube_projected[3][1], cube_projected[0][0], 
    574                                     cube_projected[0][1]); 
    575             } 
     569 
     570            draw_face(screen_list->cv, 
     571                      cube_projected[0][0], cube_projected[0][1], 
     572                      cube_projected[1][0], cube_projected[1][1], 
     573                      cube_projected[2][0], cube_projected[2][1], 
     574                      cube_projected[3][0], cube_projected[3][1], 
     575                      first, CACA_LIGHTGREEN); 
     576 
     577 
    576578            if (screen_list->cube.side) 
    577579            { 
    578                 if (get_direction(cube_projected[4][0], cube_projected[4][1], 
    579                                   cube_projected[5][0], cube_projected[5][1], 
    580                                   cube_projected[6][0], 
    581                                   cube_projected[6][1]) >= 0) 
    582                 { 
    583                     coords[0] = cube_projected[4][0]; 
    584                     coords[1] = cube_projected[4][1]; 
    585                     coords[2] = cube_projected[5][0]; 
    586                     coords[3] = cube_projected[5][1]; 
    587                     coords[4] = cube_projected[6][0]; 
    588                     coords[5] = cube_projected[6][1]; 
    589                     uv[0] = 1; 
    590                     uv[1] = 1; 
    591                     uv[2] = 0; 
    592                     uv[3] = 1; 
    593                     uv[4] = 0; 
    594                     uv[5] = 0; 
    595  
    596  
    597                     caca_fill_triangle_textured(screen_list->cv, 
    598                                                 coords, second, uv); 
    599                     coords[0] = cube_projected[4][0]; 
    600                     coords[1] = cube_projected[4][1]; 
    601                     coords[2] = cube_projected[6][0]; 
    602                     coords[3] = cube_projected[6][1]; 
    603                     coords[4] = cube_projected[7][0]; 
    604                     coords[5] = cube_projected[7][1]; 
    605                     uv[0] = 1; 
    606                     uv[1] = 1; 
    607                     uv[2] = 0; 
    608                     uv[3] = 0; 
    609                     uv[4] = 1; 
    610                     uv[5] = 0; 
    611                     caca_fill_triangle_textured(screen_list->cv, 
    612                                                 coords, second, uv); 
    613                     caca_set_color_ansi(screen_list->cv, CACA_RED, CACA_BLACK); 
    614  
    615                     caca_draw_thin_line(screen_list->cv, 
    616                                         cube_projected[4][0], 
    617                                         cube_projected[4][1], 
    618                                         cube_projected[5][0], 
    619                                         cube_projected[5][1]); 
    620                     caca_draw_thin_line(screen_list->cv, cube_projected[5][0], 
    621                                         cube_projected[5][1], 
    622                                         cube_projected[6][0], 
    623                                         cube_projected[6][1]); 
    624                     caca_draw_thin_line(screen_list->cv, cube_projected[6][0], 
    625                                         cube_projected[6][1], 
    626                                         cube_projected[7][0], 
    627                                         cube_projected[7][1]); 
    628                     caca_draw_thin_line(screen_list->cv, cube_projected[7][0], 
    629                                         cube_projected[7][1], 
    630                                         cube_projected[4][0], 
    631                                         cube_projected[4][1]); 
    632                 } 
     580                draw_face(screen_list->cv, 
     581                          cube_projected[4][0], cube_projected[4][1], 
     582                          cube_projected[5][0], cube_projected[5][1], 
     583                          cube_projected[6][0], cube_projected[6][1], 
     584                          cube_projected[7][0], cube_projected[7][1], 
     585                          second, CACA_RED); 
    633586            } 
    634587            else 
    635588            { 
    636                 if (get_direction(cube_projected[9][0], cube_projected[9][1], 
    637                                   cube_projected[8][0], cube_projected[8][1], 
    638                                   cube_projected[10][0], 
    639                                   cube_projected[10][1]) > 0.0f) 
    640                 { 
    641                     coords[0] = cube_projected[9][0]; 
    642                     coords[1] = cube_projected[9][1]; 
    643                     coords[2] = cube_projected[8][0]; 
    644                     coords[3] = cube_projected[8][1]; 
    645                     coords[4] = cube_projected[10][0]; 
    646                     coords[5] = cube_projected[10][1]; 
    647                     uv[0] = 1; 
    648                     uv[1] = 1; 
    649                     uv[2] = 0; 
    650                     uv[3] = 1; 
    651                     uv[4] = 1; 
    652                     uv[5] = 0; 
    653  
    654                     caca_fill_triangle_textured(screen_list->cv, 
    655                                                 coords, second, uv); 
    656  
    657                     coords[0] = cube_projected[8][0]; 
    658                     coords[1] = cube_projected[8][1]; 
    659                     coords[2] = cube_projected[10][0]; 
    660                     coords[3] = cube_projected[10][1]; 
    661                     coords[4] = cube_projected[11][0]; 
    662                     coords[5] = cube_projected[11][1]; 
    663                     uv[0] = 0; 
    664                     uv[1] = 1; 
    665                     uv[2] = 1; 
    666                     uv[3] = 0; 
    667                     uv[4] = 0; 
    668                     uv[5] = 0; 
    669  
    670                     caca_fill_triangle_textured(screen_list->cv, 
    671                                                 coords, second, uv); 
    672                     caca_set_color_ansi(screen_list->cv, CACA_RED, CACA_BLACK); 
    673                     caca_draw_thin_line(screen_list->cv, 
    674                                         cube_projected[8][0], 
    675                                         cube_projected[8][1], 
    676                                         cube_projected[9][0], 
    677                                         cube_projected[9][1]); 
    678                     caca_draw_thin_line(screen_list->cv, cube_projected[9][0], 
    679                                         cube_projected[9][1], 
    680                                         cube_projected[10][0], 
    681                                         cube_projected[10][1]); 
    682                     caca_draw_thin_line(screen_list->cv, cube_projected[10][0], 
    683                                         cube_projected[10][1], 
    684                                         cube_projected[11][0], 
    685                                         cube_projected[11][1]); 
    686                     caca_draw_thin_line(screen_list->cv, cube_projected[11][0], 
    687                                         cube_projected[11][1], 
    688                                         cube_projected[8][0], 
    689                                         cube_projected[8][1]); 
    690                 } 
     589                draw_face(screen_list->cv, 
     590                          cube_projected[8][0], cube_projected[8][1], 
     591                          cube_projected[9][0], cube_projected[9][1], 
     592                          cube_projected[10][0], cube_projected[10][1], 
     593                          cube_projected[11][0], cube_projected[11][1], 
     594                          second, CACA_RED); 
    691595            } 
    692 #else 
    693 #warning temporary : HAVE_CACA_TRIANGLE_TEXTURING is not defined 
    694 #endif 
    695596 
    696597            screen_list->changed = 1; 
Note: See TracChangeset for help on using the changeset viewer.