source: libcaca/trunk/examples/trifiller.c @ 3926

Last change on this file since 3926 was 3926, checked in by Jean-Yves Lamoureux, 10 years ago
  • Make caca_fill_triangle_textured use less arguments, examples/trifiller modified accordingly
File size: 6.5 KB
Line 
1/*
2 *  trifiller     texture mapping features
3 *  Copyright (c) 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
4 *                All Rights Reserved
5 *
6 *  $Id: trifiller.c 2821 2008-09-27 13:12:46Z sam $
7 *
8 *  This program is free software. It comes without any warranty, to
9 *  the extent permitted by applicable law. You can redistribute it
10 *  and/or modify it under the terms of the Do What The Fuck You Want
11 *  To Public License, Version 2, as published by Sam Hocevar. See
12 *  http://sam.zoy.org/wtfpl/COPYING for more details.
13 */
14
15
16#include "config.h"
17
18#if !defined(__KERNEL__)
19#   include <stdio.h>
20#   include <string.h>
21#endif
22
23/* libcaca header */
24#include "caca.h"
25
26/* Image loading functions */
27#include "../src/common-image.h"
28
29/* M_PI / cos / sin */
30#include <math.h>
31
32
33#define SQUARE_SIZE 20
34
35int main(int argc, char *argv[])
36{
37   
38    /* libcaca/libcaca contexts */
39    caca_canvas_t *cv; caca_display_t *dp;
40    caca_canvas_t *tex;
41   
42    /* cached canvas size */
43    int ww, wh, tw, th;
44   
45    /* logic */
46    int quit  = 0;
47    int update = 1;
48    int px, py;
49    float angle = 0;
50   
51   
52    float square[6][2] = {
53        {-SQUARE_SIZE, -SQUARE_SIZE},
54        { SQUARE_SIZE, -SQUARE_SIZE},
55        { SQUARE_SIZE,  SQUARE_SIZE},
56        {-SQUARE_SIZE,  SQUARE_SIZE},
57    };
58    float uv1[6] = {
59        0, 0,
60        1, 0,
61        1, 1
62    };
63    float uv2[6] = {
64        0, 0,
65        1, 1,
66        0, 1
67    };
68   
69   
70    float rotated[4][2];
71    int coords1[6], coords2[6];
72   
73    /* Create displayed canvas */
74    cv = caca_create_canvas(0, 0);
75    if(!cv)
76    {
77        fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]);
78        return 1;
79    }
80   
81    /* Create texture holding canvas */
82    tex = caca_create_canvas(16, 16);
83    if(!tex)
84    {
85        fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]);
86        return 1;
87    }
88   
89    /* Open window */
90    dp = caca_create_display(cv);
91    if(!dp)
92    {
93        fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]);
94        return 1;
95    }
96   
97   
98   
99    /* Set the window title */
100    caca_set_display_title(dp, "trifiller");
101   
102    /* Frame duration */
103    caca_set_display_time(dp, 10000);
104   
105    /* Get displayed canvas size */
106    ww = caca_get_canvas_width(cv);
107    wh = caca_get_canvas_height(cv);
108   
109    /* Texture size */
110    tw = caca_get_canvas_width(tex);
111    th = caca_get_canvas_height(tex);
112   
113    /* Load texture if any */
114    if(argc == 2)
115    {
116        struct image *im = load_image(argv[1]);
117        if(!im)
118        {
119            fprintf(stderr, "%s: unable to load image '%s'\n", argv[0], argv[1]);
120            return 1;
121        }
122       
123        caca_set_dither_algorithm(im->dither,
124                                  caca_get_dither_algorithm_list(NULL)[4]);
125        caca_dither_bitmap(tex,
126                           0, 0,
127                           tw, th, 
128                           im->dither, im->pixels);
129        unload_image(im);
130    }
131    /* or generate one */
132    else
133    {
134       
135        int i;
136        for(i = 0; i < 16; i ++)
137        {
138            caca_set_color_ansi(tex, (i+1)%0xF, i);
139            caca_put_str(tex, 0, i, "123456789ABCDEF");
140        }
141    }
142   
143
144    px = 0;
145    py = 0;
146   
147    while(!quit)
148    {
149        caca_event_t ev;
150        unsigned int const event_mask = CACA_EVENT_KEY_PRESS
151        | CACA_EVENT_RESIZE
152        | CACA_EVENT_QUIT;
153        int event;
154       
155        if(update)
156            event = caca_get_event(dp, event_mask, &ev, 0);
157        else
158            event = caca_get_event(dp, event_mask, &ev, -1);
159       
160        while(event)
161        {
162            if(caca_get_event_type(&ev) & CACA_EVENT_KEY_PRESS)
163                switch(caca_get_event_key_ch(&ev))
164            {
165                case 'q':
166                case 'Q':
167                case CACA_KEY_ESCAPE:
168                    quit = 1;
169                    break;
170                case CACA_KEY_UP:
171                    py--;
172                    break;
173                case CACA_KEY_DOWN:
174                    py++;
175                    break;
176                case CACA_KEY_LEFT:
177                    px--;
178                    break;
179                case CACA_KEY_RIGHT:
180                    px++;
181                    break;
182                case 'a':
183                    angle+=1.0f;
184                    break;
185                case 's':
186                    angle-=1.0f;
187                    break;                   
188            }
189            else if(caca_get_event_type(&ev) == CACA_EVENT_RESIZE)
190            {
191                caca_refresh_display(dp);
192                ww = caca_get_event_resize_width(&ev);
193                wh = caca_get_event_resize_height(&ev);
194                update = 1;
195            }
196            else if(caca_get_event_type(&ev) & CACA_EVENT_QUIT)
197                quit = 1;
198           
199            event = caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, 0);
200        }
201       
202       
203       
204        /* 2D Rotation around screen center */
205        int p;
206        for(p=0; p<4; p++)
207        {
208            rotated[p][0] = square[p][0] * cos(angle*M_PI/180.0f) - square[p][1] * sin(angle*M_PI/180.0f);
209            rotated[p][1] = square[p][0] * sin(angle*M_PI/180.0f) + square[p][1] * cos(angle*M_PI/180.0f);
210           
211            rotated[p][0] += ww/2 + px;
212            rotated[p][1] += wh/2 + py;
213        }
214       
215        angle+=1.0f;
216       
217       
218        /* Reaarange coordinates to fit libcaca's format */
219        coords1[0] = rotated[0][0]; coords1[1] = rotated[0][1];
220        coords1[2] = rotated[1][0]; coords1[3] = rotated[1][1];
221        coords1[4] = rotated[2][0]; coords1[5] = rotated[2][1];
222       
223        coords2[0] = rotated[0][0]; coords2[1] = rotated[0][1];
224        coords2[2] = rotated[2][0]; coords2[3] = rotated[2][1];
225        coords2[4] = rotated[3][0]; coords2[5] = rotated[3][1];
226       
227        /* Display two triangles */
228        caca_fill_triangle_textured(cv,      /* canvas */
229                                    coords1, /* triangle coordinates */
230                                    tex,     /* texture canvas */
231                                    uv1);    /* texture coordinates */
232        caca_fill_triangle_textured(cv,
233                                    coords2,
234                                    tex,
235                                    uv2);
236       
237        /* Refresh display and clear for next frame */
238        caca_refresh_display(dp);
239        caca_clear_canvas(cv);
240       
241    }
242   
243    caca_free_display(dp);
244    caca_free_canvas(cv);
245    caca_free_canvas(tex);
246   
247    return 0;
248}
Note: See TracBrowser for help on using the repository browser.