Changeset 3914 for neercs/trunk


Ignore:
Timestamp:
Nov 17, 2009, 4:36:37 PM (11 years ago)
Author:
Jean-Yves Lamoureux
Message:
  • Added 'cube' window manager (needs latest svn libcaca for caca_fill_triangle_textured), at last.
Location:
neercs/trunk/src
Files:
9 edited

Legend:

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

    r3896 r3914  
    291291            else if(IS_VALUE("vsplit")) screen_list->wm_type = WM_VSPLIT;
    292292            else if(IS_VALUE("card"))   screen_list->wm_type = WM_CARD;
    293 
     293            else if(IS_VALUE("cube"))   screen_list->wm_type = WM_CUBE;
    294294            else fprintf(stderr, "Unknown window manager '%s'\n", option->key);
    295295
  • neercs/trunk/src/effects.c

    r3895 r3914  
    143143        case WM_VSPLIT:
    144144            strcpy(text, "vsplit");
     145            break;
     146        case WM_CUBE:
     147            strcpy(text, "cube");
    145148            break;
    146149        case WM_FULL:
  • neercs/trunk/src/input.c

    r3899 r3914  
    108108        screen_list->prevpty = screen_list->pty;
    109109        screen_list->pty = (screen_list->pty + 1) % screen_list->count;
     110            if(screen_list->pty!=screen_list->prevpty) {
     111        screen_list->last_switch = get_us();
     112        screen_list->cube.in_switch = 1;
     113        screen_list->cube.side = 0;
     114            }
    110115        refresh = 1;
    111116        break;
     
    114119        screen_list->prevpty = screen_list->pty;
    115120        screen_list->pty = (screen_list->pty + screen_list->count - 1) % screen_list->count;
     121            if(screen_list->pty!=screen_list->prevpty) {
     122        screen_list->last_switch = get_us();
     123        screen_list->cube.in_switch = 1;
     124        screen_list->cube.side = 1;   
     125            }
    116126        refresh = 1;
    117127        break;
  • neercs/trunk/src/main.c

    r3896 r3914  
    8585#define NEERCS_RECV_BUFSIZE 128*1024
    8686    char * buf = NULL;
    87 
     87   
    8888    screen_list = create_screen_list();
    8989    screen_list->default_shell = getenv("SHELL");
     
    251251            }
    252252        }
     253       
    253254        if(ret)
    254255            break;
     
    400401    screen_list->attach = 0;
    401402    screen_list->forceattach = 0;
     403   
     404    screen_list->force_refresh = 0;
     405    screen_list->cube.in_switch = 0;
     406    screen_list->cube.first=0;
     407    screen_list->cube.second=0;
    402408
    403409
  • neercs/trunk/src/neercs.h

    r3896 r3914  
    2424    WM_HSPLIT,
    2525    WM_VSPLIT,
     26    WM_CUBE,
    2627
    2728    WM_MAX,
     
    146147};
    147148
     149struct cube_props
     150{
     151    int in_switch;
     152        int side;
     153    int first, second;
     154};
     155
    148156struct screen_list
    149157{
     
    153161    int changed;                 /* Global redraw needed (e.g. adding a screen) */
    154162    int delay;                   /* Minimal time between two refresh (ms) */
     163    int force_refresh;
    155164
    156165    /* Detaching */
     
    176185    int cur_in_list;             /* Window list */
    177186    char *title;                 /* Window title */
     187    struct cube_props cube;      /* Cube */
     188    long long unsigned int last_switch; /* Cube */
    178189
    179190    /* ScreenSaver stuff */
     
    264275void update_windows_props_full(struct screen_list *screen_list);
    265276void update_windows_props_vsplit(struct screen_list *screen_list);
     277void update_windows_props_cube(struct screen_list *screen_list);
     278
     279void wm_refresh(struct screen_list *screen_list);
     280void wm_refresh_card(struct screen_list *screen_list);
     281void wm_refresh_cube(struct screen_list *screen_list);
     282void wm_refresh_full(struct screen_list *screen_list);
     283void wm_refresh_hsplit(struct screen_list *screen_list);
     284void wm_refresh_vsplit(struct screen_list *screen_list);
     285int switch_screen_recurrent(struct screen_list* screen_list, struct recurrent* rec, void *user, long long unsigned int t);
     286
    266287
    267288/* Effects and addons */
  • neercs/trunk/src/neercsrc

    r2500 r3914  
    1010
    1111[windows]
    12 window_manager = hsplit   ; full card  hsplit vsplit
     12window_manager = cube   ; full card  hsplit vsplit cube
    1313status_bar = true         ; Activate status bar
    1414autolock_timeout = 120    ; Lock session after 100 seconds
  • neercs/trunk/src/screens.c

    r3893 r3914  
    187187    screen_list->height = caca_get_canvas_height(screen_list->cv) - (screen_list->mini*6) - screen_list->status;
    188188
    189     if(!screen_list->dont_update_coords)
     189    if(!screen_list->dont_update_coords)
     190    {
    190191        update_windows_props(screen_list);
     192    }
    191193
    192194    if(screen_list->changed)
     
    197199    caca_set_color_ansi(screen_list->cv, CACA_LIGHTRED, CACA_BLACK);
    198200
    199     for(i = screen_list->count - 1; i >=0; i--)
    200     {
    201         if(i!=screen_list->pty && screen_list->screen[i]->visible &&
    202            (screen_list->screen[i]->changed || screen_list->changed || screen_list->wm_type==WM_CARD))
    203         {
    204             caca_blit(screen_list->cv,
    205                        screen_list->screen[i]->x,
    206                        screen_list->screen[i]->y,
    207                        screen_list->screen[i]->cv, NULL);
    208 
    209             caca_draw_cp437_box(screen_list->cv,
    210                                  screen_list->screen[i]->x - 1,
    211                                  screen_list->screen[i]->y - 1,
    212                                  screen_list->screen[i]->w + 2,
    213                                  screen_list->screen[i]->h + 2);
    214             if(screen_list->screen[i]->title)
    215                 caca_printf(screen_list->cv,
    216                              screen_list->screen[i]->x,
    217                              screen_list->screen[i]->y - 1,
    218                              " %.*s ",
    219                              screen_list->screen[i]->w - 3,
    220                              screen_list->screen[i]->title);
    221         }
    222     }
    223 
    224     if(screen_list->screen[screen_list->pty]->changed || screen_list->changed || screen_list->wm_type==WM_CARD)
    225         caca_blit(screen_list->cv,
    226                   screen_list->screen[screen_list->pty]->x,
    227                   screen_list->screen[screen_list->pty]->y,
    228                   screen_list->screen[screen_list->pty]->cv, NULL);
    229 
    230     if(screen_list->screen[screen_list->pty]->bell)
    231     {
    232         caca_set_color_ansi(screen_list->cv, CACA_RED, CACA_BLACK);
    233         screen_list->screen[screen_list->pty]->bell = 0;
    234         screen_list->in_bell--;
    235     }
    236     else
    237     {
    238         caca_set_color_ansi(screen_list->cv, CACA_LIGHTGREEN, CACA_BLACK);
    239     }
    240 
    241     caca_draw_cp437_box(screen_list->cv,
    242                          screen_list->screen[screen_list->pty]->x - 1,
    243                          screen_list->screen[screen_list->pty]->y - 1,
    244                          screen_list->screen[screen_list->pty]->w + 2,
    245                          screen_list->screen[screen_list->pty]->h + 2);
    246 
    247     if(screen_list->screen[screen_list->pty]->title)
    248     {
    249         caca_printf(screen_list->cv,
    250                      screen_list->screen[screen_list->pty]->x,
    251                      screen_list->screen[screen_list->pty]->y - 1,
    252                      " %.*s ",
    253                      screen_list->screen[screen_list->pty]->w - 3,
    254                      screen_list->screen[screen_list->pty]->title);
    255     }
    256 
     201    wm_refresh(screen_list);
     202   
    257203    caca_gotoxy(screen_list->cv,
    258                  screen_list->screen[screen_list->pty]->x +
    259                  caca_get_cursor_x(screen_list->screen[screen_list->pty]->cv),
    260                  screen_list->screen[screen_list->pty]->y +
    261                  caca_get_cursor_y(screen_list->screen[screen_list->pty]->cv));
    262 
    263 
     204                screen_list->screen[screen_list->pty]->x +
     205                caca_get_cursor_x(screen_list->screen[screen_list->pty]->cv),
     206                screen_list->screen[screen_list->pty]->y +
     207                caca_get_cursor_y(screen_list->screen[screen_list->pty]->cv));
     208   
     209     
    264210    if(screen_list->mini)
    265211    {
  • neercs/trunk/src/server.c

    r3896 r3914  
    261261        /* Read program output */
    262262        refresh |= update_screens_contents(screen_list);
    263 
     263       
    264264        /* Check if we got something from the client */
    265265        while (screen_list->socket[SOCK_SERVER] && (n = read(screen_list->socket[SOCK_SERVER], buf, sizeof(buf)-1)) > 0)
     
    376376        refresh |= update_terms(screen_list);
    377377
    378         /* Launch reccurents if any */
     378        /* Launch recurrents if any */
    379379        refresh |= handle_recurrents(screen_list);
    380380
     
    432432                else
    433433                    debug("Skipping refresh (%lld < %d)", tdiff, screen_list->delay);
    434             }
    435         }
     434            }
     435           
     436        }
     437       
     438        if(screen_list->force_refresh)
     439        {
     440            wm_refresh(screen_list);
     441            request_refresh(screen_list);   
     442        }
     443       
    436444        eof = 1;
    437445        for(i=0; i < screen_list->count; i++)
  • neercs/trunk/src/wm.c

    r3551 r3914  
    1818#include <caca.h>
    1919#include <stdlib.h>
     20#include <math.h>
    2021
    2122#include "neercs.h"
     
    5253void update_windows_props(struct screen_list *screen_list)
    5354{
     55    debug("%s, %d screens, type %d\n", __FUNCTION__, screen_list->count, screen_list->wm_type);
     56   
    5457    if(!screen_list->count) return;
    5558
     
    6568        update_windows_props_vsplit(screen_list);
    6669        break;
     70    case WM_CUBE:
     71        update_windows_props_cube(screen_list);
     72        break;
    6773    case WM_FULL:
    6874    default:
     
    159165}
    160166
     167void update_windows_props_cube(struct screen_list *screen_list)
     168{
     169    int i;
     170    int w = screen_list->width - 2;
     171    int h = screen_list->height - 2;
     172   
     173    for(i = 0; i < screen_list->count; i++)
     174    {
     175        screen_list->screen[i]->visible = 0;
     176        screen_list->screen[i]->x = 1;
     177        screen_list->screen[i]->y = 1;
     178       
     179        resize_screen(screen_list->screen[i],
     180                      w, h);
     181    }
     182    screen_list->screen[screen_list->pty]->visible = 1;
     183}
     184
     185/* Window managers refresh */
     186
     187void wm_refresh(struct screen_list *screen_list)
     188{
     189    switch (screen_list->wm_type) {
     190        case WM_CARD:
     191            wm_refresh_card(screen_list);
     192            break;
     193        case WM_FULL:
     194            wm_refresh_full(screen_list);
     195            break;
     196        case WM_HSPLIT:
     197            wm_refresh_hsplit(screen_list);
     198            break;
     199        case WM_VSPLIT:
     200            wm_refresh_hsplit(screen_list);
     201            break;
     202        case WM_CUBE:
     203            wm_refresh_cube(screen_list);
     204            break;
     205        default:
     206            wm_refresh_full(screen_list);
     207            break;
     208    }
     209}
     210
     211void wm_refresh_card(struct screen_list *screen_list)
     212{
     213    int i;
     214   
     215    for(i = screen_list->count - 1; i >=0; i--)
     216    {
     217        if(i!=screen_list->pty && screen_list->screen[i]->visible &&
     218           (screen_list->screen[i]->changed || screen_list->changed))
     219        {
     220            caca_blit(screen_list->cv,
     221                      screen_list->screen[i]->x,
     222                      screen_list->screen[i]->y,
     223                      screen_list->screen[i]->cv, NULL);
     224           
     225            caca_draw_cp437_box(screen_list->cv,
     226                                screen_list->screen[i]->x - 1,
     227                                screen_list->screen[i]->y - 1,
     228                                screen_list->screen[i]->w + 2,
     229                                screen_list->screen[i]->h + 2);
     230            if(screen_list->screen[i]->title)
     231                caca_printf(screen_list->cv,
     232                            screen_list->screen[i]->x,
     233                            screen_list->screen[i]->y - 1,
     234                            " %.*s ",
     235                            screen_list->screen[i]->w - 3,
     236                            screen_list->screen[i]->title);
     237        }
     238    }
     239   
     240    if(screen_list->screen[screen_list->pty]->changed || screen_list->changed)
     241        caca_blit(screen_list->cv,
     242                  screen_list->screen[screen_list->pty]->x,
     243                  screen_list->screen[screen_list->pty]->y,
     244                  screen_list->screen[screen_list->pty]->cv, NULL);
     245   
     246    if(screen_list->screen[screen_list->pty]->bell)
     247    {
     248        caca_set_color_ansi(screen_list->cv, CACA_RED, CACA_BLACK);
     249        screen_list->screen[screen_list->pty]->bell = 0;
     250        screen_list->in_bell--;
     251    }
     252    else
     253    {
     254        caca_set_color_ansi(screen_list->cv, CACA_LIGHTGREEN, CACA_BLACK);
     255    }
     256   
     257    caca_draw_cp437_box(screen_list->cv,
     258                        screen_list->screen[screen_list->pty]->x - 1,
     259                        screen_list->screen[screen_list->pty]->y - 1,
     260                        screen_list->screen[screen_list->pty]->w + 2,
     261                        screen_list->screen[screen_list->pty]->h + 2);
     262   
     263    if(screen_list->screen[screen_list->pty]->title)
     264    {
     265        caca_printf(screen_list->cv,
     266                    screen_list->screen[screen_list->pty]->x,
     267                    screen_list->screen[screen_list->pty]->y - 1,
     268                    " %.*s ",
     269                    screen_list->screen[screen_list->pty]->w - 3,
     270                    screen_list->screen[screen_list->pty]->title);
     271    }
     272   
     273   
     274}
     275
     276
     277void wm_refresh_full(struct screen_list *screen_list)
     278{
     279    int i;
     280   
     281    for(i = screen_list->count - 1; i >=0; i--)
     282    {
     283        if(i!=screen_list->pty && screen_list->screen[i]->visible &&
     284           (screen_list->screen[i]->changed || screen_list->changed))
     285        {
     286            caca_blit(screen_list->cv,
     287                      screen_list->screen[i]->x,
     288                      screen_list->screen[i]->y,
     289                      screen_list->screen[i]->cv, NULL);
     290           
     291            caca_draw_cp437_box(screen_list->cv,
     292                                screen_list->screen[i]->x - 1,
     293                                screen_list->screen[i]->y - 1,
     294                                screen_list->screen[i]->w + 2,
     295                                screen_list->screen[i]->h + 2);
     296            if(screen_list->screen[i]->title)
     297                caca_printf(screen_list->cv,
     298                            screen_list->screen[i]->x,
     299                            screen_list->screen[i]->y - 1,
     300                            " %.*s ",
     301                            screen_list->screen[i]->w - 3,
     302                            screen_list->screen[i]->title);
     303        }
     304    }
     305   
     306    if(screen_list->screen[screen_list->pty]->changed || screen_list->changed)
     307        caca_blit(screen_list->cv,
     308                  screen_list->screen[screen_list->pty]->x,
     309                  screen_list->screen[screen_list->pty]->y,
     310                  screen_list->screen[screen_list->pty]->cv, NULL);
     311   
     312    if(screen_list->screen[screen_list->pty]->bell)
     313    {
     314        caca_set_color_ansi(screen_list->cv, CACA_RED, CACA_BLACK);
     315        screen_list->screen[screen_list->pty]->bell = 0;
     316        screen_list->in_bell--;
     317    }
     318    else
     319    {
     320        caca_set_color_ansi(screen_list->cv, CACA_LIGHTGREEN, CACA_BLACK);
     321    }
     322   
     323    caca_draw_cp437_box(screen_list->cv,
     324                        screen_list->screen[screen_list->pty]->x - 1,
     325                        screen_list->screen[screen_list->pty]->y - 1,
     326                        screen_list->screen[screen_list->pty]->w + 2,
     327                        screen_list->screen[screen_list->pty]->h + 2);
     328   
     329    if(screen_list->screen[screen_list->pty]->title)
     330    {
     331        caca_printf(screen_list->cv,
     332                    screen_list->screen[screen_list->pty]->x,
     333                    screen_list->screen[screen_list->pty]->y - 1,
     334                    " %.*s ",
     335                    screen_list->screen[screen_list->pty]->w - 3,
     336                    screen_list->screen[screen_list->pty]->title);
     337    }
     338   
     339   
     340}
     341
     342void wm_refresh_vsplit(struct screen_list *screen_list)
     343{
     344    int i;
     345   
     346    for(i = screen_list->count - 1; i >=0; i--)
     347    {
     348        if(i!=screen_list->pty && screen_list->screen[i]->visible &&
     349           (screen_list->screen[i]->changed || screen_list->changed))
     350        {
     351            caca_blit(screen_list->cv,
     352                      screen_list->screen[i]->x,
     353                      screen_list->screen[i]->y,
     354                      screen_list->screen[i]->cv, NULL);
     355           
     356            caca_draw_cp437_box(screen_list->cv,
     357                                screen_list->screen[i]->x - 1,
     358                                screen_list->screen[i]->y - 1,
     359                                screen_list->screen[i]->w + 2,
     360                                screen_list->screen[i]->h + 2);
     361            if(screen_list->screen[i]->title)
     362                caca_printf(screen_list->cv,
     363                            screen_list->screen[i]->x,
     364                            screen_list->screen[i]->y - 1,
     365                            " %.*s ",
     366                            screen_list->screen[i]->w - 3,
     367                            screen_list->screen[i]->title);
     368        }
     369    }
     370   
     371    if(screen_list->screen[screen_list->pty]->changed || screen_list->changed)
     372        caca_blit(screen_list->cv,
     373                  screen_list->screen[screen_list->pty]->x,
     374                  screen_list->screen[screen_list->pty]->y,
     375                  screen_list->screen[screen_list->pty]->cv, NULL);
     376   
     377    if(screen_list->screen[screen_list->pty]->bell)
     378    {
     379        caca_set_color_ansi(screen_list->cv, CACA_RED, CACA_BLACK);
     380        screen_list->screen[screen_list->pty]->bell = 0;
     381        screen_list->in_bell--;
     382    }
     383    else
     384    {
     385        caca_set_color_ansi(screen_list->cv, CACA_LIGHTGREEN, CACA_BLACK);
     386    }
     387   
     388    caca_draw_cp437_box(screen_list->cv,
     389                        screen_list->screen[screen_list->pty]->x - 1,
     390                        screen_list->screen[screen_list->pty]->y - 1,
     391                        screen_list->screen[screen_list->pty]->w + 2,
     392                        screen_list->screen[screen_list->pty]->h + 2);
     393   
     394    if(screen_list->screen[screen_list->pty]->title)
     395    {
     396        caca_printf(screen_list->cv,
     397                    screen_list->screen[screen_list->pty]->x,
     398                    screen_list->screen[screen_list->pty]->y - 1,
     399                    " %.*s ",
     400                    screen_list->screen[screen_list->pty]->w - 3,
     401                    screen_list->screen[screen_list->pty]->title);
     402    }
     403   
     404   
     405}
     406
     407void wm_refresh_hsplit(struct screen_list *screen_list)
     408{
     409    int i;
     410   
     411    for(i = screen_list->count - 1; i >=0; i--)
     412    {
     413        if(i!=screen_list->pty && screen_list->screen[i]->visible &&
     414           (screen_list->screen[i]->changed || screen_list->changed))
     415        {
     416            caca_blit(screen_list->cv,
     417                      screen_list->screen[i]->x,
     418                      screen_list->screen[i]->y,
     419                      screen_list->screen[i]->cv, NULL);
     420           
     421            caca_draw_cp437_box(screen_list->cv,
     422                                screen_list->screen[i]->x - 1,
     423                                screen_list->screen[i]->y - 1,
     424                                screen_list->screen[i]->w + 2,
     425                                screen_list->screen[i]->h + 2);
     426            if(screen_list->screen[i]->title)
     427                caca_printf(screen_list->cv,
     428                            screen_list->screen[i]->x,
     429                            screen_list->screen[i]->y - 1,
     430                            " %.*s ",
     431                            screen_list->screen[i]->w - 3,
     432                            screen_list->screen[i]->title);
     433        }
     434    }
     435   
     436    if(screen_list->screen[screen_list->pty]->changed || screen_list->changed)
     437        caca_blit(screen_list->cv,
     438                  screen_list->screen[screen_list->pty]->x,
     439                  screen_list->screen[screen_list->pty]->y,
     440                  screen_list->screen[screen_list->pty]->cv, NULL);
     441   
     442    if(screen_list->screen[screen_list->pty]->bell)
     443    {
     444        caca_set_color_ansi(screen_list->cv, CACA_RED, CACA_BLACK);
     445        screen_list->screen[screen_list->pty]->bell = 0;
     446        screen_list->in_bell--;
     447    }
     448    else
     449    {
     450        caca_set_color_ansi(screen_list->cv, CACA_LIGHTGREEN, CACA_BLACK);
     451    }
     452   
     453    caca_draw_cp437_box(screen_list->cv,
     454                        screen_list->screen[screen_list->pty]->x - 1,
     455                        screen_list->screen[screen_list->pty]->y - 1,
     456                        screen_list->screen[screen_list->pty]->w + 2,
     457                        screen_list->screen[screen_list->pty]->h + 2);
     458   
     459    if(screen_list->screen[screen_list->pty]->title)
     460    {
     461        caca_printf(screen_list->cv,
     462                    screen_list->screen[screen_list->pty]->x,
     463                    screen_list->screen[screen_list->pty]->y - 1,
     464                    " %.*s ",
     465                    screen_list->screen[screen_list->pty]->w - 3,
     466                    screen_list->screen[screen_list->pty]->title);
     467    }
     468   
     469   
     470}
     471
     472float get_direction(float p1x, float p1y, float p2x, float p2y, float p3x, float p3y) {
     473    float d1x, d1y, d2x, d2y;
     474   
     475        d1x = p3x - p1x;
     476        d1y = p3y - p1y;
     477        d2x = p3x - p2x;
     478        d2y = p3y - p2y;
     479    return (d1x * d2y) - (d1y * d2x);
     480}
     481
     482/* 3D Cube. Yeah I know, it's a mess. Just look anywhere else. */
     483void wm_refresh_cube(struct screen_list *screen_list)
     484{
     485    int i;
     486       
     487    if(!screen_list->cube.in_switch) {
     488        if(screen_list->screen[screen_list->pty]->changed || screen_list->changed) {
     489            caca_blit(screen_list->cv,
     490                      screen_list->screen[screen_list->pty]->x,
     491                      screen_list->screen[screen_list->pty]->y,
     492                      screen_list->screen[screen_list->pty]->cv, NULL);
     493           
     494        }
     495       
     496        if(screen_list->screen[screen_list->pty]->bell)
     497        {
     498            caca_set_color_ansi(screen_list->cv, CACA_RED, CACA_BLACK);
     499            screen_list->screen[screen_list->pty]->bell = 0;
     500            screen_list->in_bell--;
     501        }
     502        else
     503        {
     504            caca_set_color_ansi(screen_list->cv, CACA_LIGHTGREEN, CACA_BLACK);
     505        }
     506       
     507        caca_draw_cp437_box(screen_list->cv,
     508                            screen_list->screen[screen_list->pty]->x - 1,
     509                            screen_list->screen[screen_list->pty]->y - 1,
     510                            screen_list->screen[screen_list->pty]->w + 2,
     511                            screen_list->screen[screen_list->pty]->h + 2);
     512       
     513        if(screen_list->screen[screen_list->pty]->title)
     514        {
     515            caca_printf(screen_list->cv,
     516                        screen_list->screen[screen_list->pty]->x,
     517                        screen_list->screen[screen_list->pty]->y - 1,
     518                        " %.*s ",
     519                        screen_list->screen[screen_list->pty]->w - 3,
     520                        screen_list->screen[screen_list->pty]->title);
     521        }
     522        screen_list->force_refresh = 0;
     523    } else {
     524       
     525#define CUBE_TIME 1000000
     526
     527       
     528       
     529        long long unsigned int cur_time = get_us() - screen_list->last_switch;
     530       
     531        if(cur_time >= CUBE_TIME || screen_list->count==1) {
     532            screen_list->changed = 1 ;     
     533            screen_list->force_refresh = 1;
     534            screen_list->cube.in_switch = 0;
     535        } else {
     536           
     537            float cube[12][3] = {
     538                {-1, -1,  1}, 
     539                {1,  -1,  1}, 
     540                {1,   1,  1},
     541                {-1,  1,  1},
     542               
     543                {1,  -1,  1},
     544                {1,  -1,  -1},
     545                {1,   1,  -1},
     546                {1,   1,  1},
     547               
     548                {-1,  -1,  1},
     549                {-1,  -1,  -1},
     550                {-1,   1,  -1},
     551                {-1,   1,  1},
     552            };
     553            float cube_transformed[12][3];
     554            float cube_projected[12][2];
     555            float fov = 0.5f;
     556            float angle = 90.0f * ((float)cur_time / (float)CUBE_TIME);
     557            angle*= (M_PI/180.0f);
     558           
     559            if(screen_list->cube.side==1)
     560                angle = -angle;
     561           
     562           
     563            for(i = 0; i < 12; i++) {
     564           
     565                cube_transformed[i][2] = cube[i][2]*cos(angle) - cube[i][0]*sin(angle);
     566                cube_transformed[i][0] = cube[i][2]*sin(angle) + cube[i][0]*cos(angle);
     567                cube_transformed[i][1] = cube[i][1];
     568               
     569                cube_transformed[i][2] -= 3;
     570               
     571                cube_projected[i][0] = cube_transformed[i][0] / (cube_transformed[i][2] * fov);   
     572                cube_projected[i][1] = cube_transformed[i][1] / (cube_transformed[i][2] * fov); 
     573               
     574                cube_projected[i][0] /=2.0f; cube_projected[i][1] /=2.0f;
     575                cube_projected[i][0] +=0.5f; cube_projected[i][1] +=0.5f;
     576               
     577                cube_projected[i][0] *= screen_list->width;
     578                cube_projected[i][1] *= screen_list->height;
     579               
     580
     581            }
     582            caca_clear_canvas(screen_list->cv);
     583           
     584            caca_canvas_t *first =  screen_list->screen[screen_list->prevpty]->cv;
     585            caca_canvas_t *second = screen_list->screen[screen_list->pty]->cv;
     586           
     587            if(get_direction(cube_projected[0][0], cube_projected[0][1],
     588                             cube_projected[1][0], cube_projected[1][1],
     589                             cube_projected[2][0], cube_projected[2][1]) >=0) {
     590                caca_fill_triangle_textured(screen_list->cv,
     591                                            cube_projected[0][0], cube_projected[0][1],
     592                                            cube_projected[1][0], cube_projected[1][1],
     593                                            cube_projected[2][0], cube_projected[2][1],
     594                                            1, 1,
     595                                            0, 1,
     596                                            0, 0,
     597                                            first);
     598                caca_fill_triangle_textured(screen_list->cv,
     599                                            cube_projected[0][0], cube_projected[0][1],
     600                                            cube_projected[2][0], cube_projected[2][1],
     601                                            cube_projected[3][0], cube_projected[3][1],
     602                                            1, 1,
     603                                            0, 0,
     604                                            1, 0,
     605                                            first);
     606               
     607               
     608                caca_set_color_ansi(screen_list->cv, CACA_LIGHTGREEN, CACA_BLACK);
     609                caca_draw_thin_line(screen_list->cv,
     610                                    cube_projected[0][0], cube_projected[0][1],
     611                                    cube_projected[1][0], cube_projected[1][1]);
     612                caca_draw_thin_line(screen_list->cv,
     613                                    cube_projected[1][0], cube_projected[1][1],
     614                                    cube_projected[2][0], cube_projected[2][1]);
     615                caca_draw_thin_line(screen_list->cv,
     616                                    cube_projected[2][0], cube_projected[2][1],
     617                                    cube_projected[3][0], cube_projected[3][1]);
     618                caca_draw_thin_line(screen_list->cv,
     619                                    cube_projected[3][0], cube_projected[3][1],
     620                                    cube_projected[0][0], cube_projected[0][1]);
     621            }
     622           
     623           
     624           
     625            if(screen_list->cube.side)
     626            {
     627                if(get_direction(cube_projected[4][0], cube_projected[4][1],
     628                                 cube_projected[5][0], cube_projected[5][1],
     629                                 cube_projected[6][0], cube_projected[6][1]) >=0) {
     630                caca_fill_triangle_textured(screen_list->cv,
     631                                            cube_projected[4][0], cube_projected[4][1],
     632                                            cube_projected[5][0], cube_projected[5][1],
     633                                            cube_projected[6][0], cube_projected[6][1],
     634                                            1, 1,
     635                                            0, 1,
     636                                            0, 0,
     637                                            second);
     638                caca_fill_triangle_textured(screen_list->cv,
     639                                            cube_projected[4][0], cube_projected[4][1],
     640                                            cube_projected[6][0], cube_projected[6][1],
     641                                            cube_projected[7][0], cube_projected[7][1],
     642                                            1, 1,
     643                                            0, 0,
     644                                            1, 0,
     645                                            second);
     646                caca_set_color_ansi(screen_list->cv, CACA_RED, CACA_BLACK);
     647
     648                caca_draw_thin_line(screen_list->cv,
     649                                    cube_projected[4][0], cube_projected[4][1],
     650                                    cube_projected[5][0], cube_projected[5][1]);
     651                caca_draw_thin_line(screen_list->cv,
     652                                    cube_projected[5][0], cube_projected[5][1],
     653                                    cube_projected[6][0], cube_projected[6][1]);
     654                caca_draw_thin_line(screen_list->cv,
     655                                    cube_projected[6][0], cube_projected[6][1],
     656                                    cube_projected[7][0], cube_projected[7][1]);
     657                caca_draw_thin_line(screen_list->cv,
     658                                    cube_projected[7][0], cube_projected[7][1],
     659                                    cube_projected[4][0], cube_projected[4][1]);
     660                }
     661               
     662               
     663            } else
     664            {
     665                if(get_direction(cube_projected[9][0], cube_projected[9][1],
     666                                 cube_projected[8][0], cube_projected[8][1],
     667                                 cube_projected[10][0], cube_projected[10][1])) {
     668                caca_fill_triangle_textured(screen_list->cv,
     669                                            cube_projected[9][0], cube_projected[9][1],
     670                                            cube_projected[8][0], cube_projected[8][1],
     671                                            cube_projected[10][0], cube_projected[10][1],
     672                                            1, 1,
     673                                            0, 1,
     674                                            1, 0,
     675                                            second);
     676                caca_fill_triangle_textured(screen_list->cv,
     677                                            cube_projected[8][0], cube_projected[8][1],
     678                                            cube_projected[10][0], cube_projected[10][1],
     679                                            cube_projected[11][0], cube_projected[11][1],
     680                                            0, 1,
     681                                            1, 0,
     682                                            0, 0,
     683                                            second);
     684                caca_set_color_ansi(screen_list->cv, CACA_RED, CACA_BLACK);
     685                caca_draw_thin_line(screen_list->cv,
     686                                    cube_projected[8][0], cube_projected[8][1],
     687                                    cube_projected[9][0], cube_projected[9][1]);
     688                caca_draw_thin_line(screen_list->cv,
     689                                    cube_projected[9][0], cube_projected[9][1],
     690                                    cube_projected[10][0], cube_projected[10][1]);
     691                caca_draw_thin_line(screen_list->cv,
     692                                    cube_projected[10][0], cube_projected[10][1],
     693                                    cube_projected[11][0], cube_projected[11][1]);
     694                caca_draw_thin_line(screen_list->cv,
     695                                    cube_projected[11][0], cube_projected[11][1],
     696                                    cube_projected[8][0], cube_projected[8][1]);
     697                }
     698            }
     699           
     700            screen_list->changed =1 ;     
     701            screen_list->force_refresh = 1;
     702            screen_list->cube.in_switch = 1;
     703        }
     704       
     705    }
     706}
     707
Note: See TracChangeset for help on using the changeset viewer.