Ignore:
Timestamp:
Nov 18, 2009, 2:43:02 PM (10 years ago)
Author:
Jean-Yves Lamoureux
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.