Ignore:
Timestamp:
Nov 18, 2009, 12:25:58 PM (11 years ago)
Author:
Jean-Yves Lamoureux
Message:
  • Make caca_fill_triangle_textured use less arguments, examples/trifiller modified accordingly
Location:
libcaca/trunk/caca
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/caca.h

    r3909 r3926  
    339339__extern int caca_fill_triangle(caca_canvas_t *, int, int, int, int, int,
    340340                                 int, uint32_t);
    341 __extern int caca_fill_triangle_textured(caca_canvas_t *,
    342                                     int , int ,
    343                                     int , int ,
    344                                     int , int ,
    345                                     float , float ,
    346                                     float , float ,
    347                                     float , float ,
    348                                          caca_canvas_t *);
     341__extern int caca_fill_triangle_textured(caca_canvas_t *cv,
     342                                         int coords[6],
     343                                         caca_canvas_t *tex,
     344                                         float uv[6]);
    349345/*  @} */
    350346
  • libcaca/trunk/caca/triangle.c

    r3925 r3926  
    156156}
    157157
    158 /** \brief Fill a triangle on the canvas using an arbitrary-sized texture.
    159  *
    160  *  This function fails if one or both the canvas are missing
    161  *
    162  *  \param cv  The handle to the libcaca canvas.
    163  *  \param x1  X coordinate of the first point.
    164  *  \param y1  Y coordinate of the first point.
    165  *  \param x2  X coordinate of the second point.
    166  *  \param y2  Y coordinate of the second point.
    167  *  \param x3  X coordinate of the third point.
    168  *  \param y3  Y coordinate of the third point.
    169  *  \param u1  U texture coordinate of the first point.
    170  *  \param v1  V texture coordinate of the first point.
    171  *  \param u2  U texture coordinate of the second point.
    172  *  \param v2  V texture coordinate of the second point.
    173  *  \param u3  U texture coordinate of the third point.
    174  *  \param v3  V texture coordinate of the third point.
    175  *  \param tex The handle of the canvas texture.
    176  *  \return This function return 0 if ok, -1 if canvas or texture are missing.
    177  */
    178 int caca_fill_triangle_textured(caca_canvas_t *cv,
    179                                 int x1, int y1,
     158/* This function actually renders the triangle,
     159 * but is not exported due to sam's pedantic will. */
     160static int caca_fill_triangle_textured_l(caca_canvas_t *cv,
     161                                int x1, int y1,
    180162                                int x2, int y2,
    181                                         int x3, int y3,
    182                                 float u1, float v1,
     163                                        int x3, int y3,
     164                                caca_canvas_t *tex,
     165                                float u1, float v1,
    183166                                float u2, float v2,
    184                                         float u3, float v3,
    185                                 caca_canvas_t *tex)
     167                                        float u3, float v3)
     168                               
    186169{
    187170    uint32_t savedattr;
     
    201184    /* Bubble-sort y1 <= y2 <= y3 */
    202185    if(y1 > y2)
    203         return caca_fill_triangle_textured(cv,
    204                                            x2, y2, x1, y1, x3, y3,
    205                                            u2, v2, u1, v1, u3, v3,
    206                                            tex);
     186        return caca_fill_triangle_textured_l(cv,
     187                                             x2, y2, x1, y1, x3, y3,
     188                                             tex,
     189                                             u2, v2, u1, v1, u3, v3);
    207190    if(y2 > y3)
    208         return caca_fill_triangle_textured(cv,
    209                                            x1, y1, x3, y3, x2, y2,
    210                                            u1, v1, u3, v3, u2, v2,
    211                                            tex);
    212    
     191        return caca_fill_triangle_textured_l(cv,
     192                                             x1, y1, x3, y3, x2, y2,
     193                                             tex,
     194                                             u1, v1, u3, v3, u2, v2);
     195
    213196    savedattr = caca_get_attr(cv, -1, -1);
    214    
     197
    215198    /* Clip texture coordinates */
    216         if(u1<0.0f) u1 = 0.0f; if(v1<0.0f) v1 = 0.0f;
     199    if(u1<0.0f) u1 = 0.0f; if(v1<0.0f) v1 = 0.0f;
    217200    if(u2<0.0f) u2 = 0.0f; if(v2<0.0f) v2 = 0.0f;
    218201    if(u3<0.0f) u3 = 0.0f; if(v3<0.0f) v3 = 0.0f;
    219         if(u1>1.0f) u1 = 1.0f; if(v1>1.0f) v1 = 1.0f;
    220         if(u2>1.0f) u2 = 1.0f; if(v2>1.0f) v2 = 1.0f;
    221         if(u3>1.0f) u3 = 1.0f; if(v3>1.0f) v3 = 1.0f;
     202    if(u1>1.0f) u1 = 1.0f; if(v1>1.0f) v1 = 1.0f;
     203    if(u2>1.0f) u2 = 1.0f; if(v2>1.0f) v2 = 1.0f;
     204    if(u3>1.0f) u3 = 1.0f; if(v3>1.0f) v3 = 1.0f;
    222205   
    223206    /* Convert relative tex coordinates to absolute */
    224         int tw = caca_get_canvas_width(tex);
     207    int tw = caca_get_canvas_width(tex);
    225208    int th = caca_get_canvas_height(tex);
    226209   
    227     u1*=(float)tw; u2*=(float)tw; u3*=(float)tw; 
    228     v1*=(float)th; v2*=(float)th; v3*=(float)th; 
     210    u1*=(float)tw; u2*=(float)tw; u3*=(float)tw;
     211    v1*=(float)th; v2*=(float)th; v3*=(float)th;
    229212   
    230213    int x, y;
     
    252235    float u, v;
    253236   
    254         int s = 0;
     237    int s = 0;
    255238   
    256239    /* Top */
    257     for(y = y1 ; y < y2; y++) 
     240    for(y = y1 ; y < y2; y++)
    258241    {
    259242       
     
    273256       
    274257        /* scanline */
    275         for(x = xa ; x < xb; x++)
     258        for(x = xa ; x < xb; x++)
    276259        {
    277260            u+=tus;
    278261            v+=tvs;
    279262            /* FIXME: use caca_get_canvas_attrs / caca_get_canvas_chars  */
    280                 uint32_t attr = caca_get_attr(tex, u, v);
     263            uint32_t attr = caca_get_attr(tex, u, v);
    281264            uint32_t c    = caca_get_char(tex, u, v);
    282265            caca_set_attr(cv, attr);
     
    291274    }
    292275   
    293     if(s) 
     276    if(s)
    294277    {
    295278        SWAP_F(xb, xa);
    296279        SWAP_F(sl13, sl12);
    297280        SWAP_F(ua, ub);
    298         SWAP_F(va, vb);           
     281        SWAP_F(va, vb);
    299282        SWAP_F(usl13, usl12);
    300283        SWAP_F(vsl13, vsl12);
     
    315298    }
    316299   
    317     for(y = y2 ; y < y3; y++) 
    318     {
    319         if(xb <= xa) 
     300    for(y = y2 ; y < y3; y++)
     301    {
     302        if(xb <= xa)
    320303        {
    321             SWAP_F(xb, xa);   
     304            SWAP_F(xb, xa);
    322305            SWAP_F(sl13, sl23);
    323306            SWAP_F(ua, ub);
    324             SWAP_F(va, vb); 
     307            SWAP_F(va, vb);
    325308            SWAP_F(usl13, usl23);
    326309            SWAP_F(vsl13, vsl23);
     
    332315       
    333316        /* scanline */
    334         for(x = xa ; x < xb; x++)
     317        for(x = xa ; x < xb; x++)
    335318        {   
    336319            u+=tus;
     
    339322            uint32_t attr = caca_get_attr(tex, u, v);
    340323            uint32_t c    = caca_get_char(tex, u, v);
    341             caca_set_attr(cv, attr);   
    342             caca_put_char(cv, x, y, c);   
    343         }
    344        
     324            caca_set_attr(cv, attr);
     325            caca_put_char(cv, x, y, c);
     326        }
     327
    345328        xa+=sl13;
    346329        xb+=sl23;
    347330       
    348331        ua+=usl13; va+=vsl13;
    349         ub+=usl23; vb+=vsl23; 
     332        ub+=usl23; vb+=vsl23;
    350333    }
    351334
     
    354337    return 0;
    355338}
     339
     340/** \brief Fill a triangle on the canvas using an arbitrary-sized texture.
     341 *
     342 *  This function fails if one or both the canvas are missing
     343 *
     344 *  \param cv     The handle to the libcaca canvas.
     345 *  \param coords The coordinates of the triangle (3{x,y})
     346 *  \param tex    The handle of the canvas texture.
     347 *  \param uv     The coordinates of the texture (3{u,v})
     348 *  \return This function return 0 if ok, -1 if canvas or texture are missing.
     349 */
     350int caca_fill_triangle_textured(caca_canvas_t *cv,
     351                                int coords[6],
     352                                caca_canvas_t *tex,
     353                                float uv[6]) {
     354   
     355    return caca_fill_triangle_textured_l(cv,
     356                                         coords[0], coords[1],
     357                                         coords[2], coords[3],
     358                                         coords[4], coords[5],
     359                                         tex,
     360                                         uv[0],     uv[1],
     361                                         uv[2],     uv[3],
     362                                         uv[4],     uv[5]);
     363}
     364
    356365
    357366
Note: See TracChangeset for help on using the changeset viewer.