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

Last change on this file since 3994 was 3994, checked in by Jean-Yves Lamoureux, 10 years ago
  • Removed trailing spaces (fsking GNU Ident) (GNU, COINCIDENCE ? I THINK NOT!) and lonely tab
File size: 6.2 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;
40    caca_display_t *dp;
41    caca_canvas_t *tex;
42
43    /* cached canvas size */
44    int ww, wh, tw, th;
45
46    /* logic */
47    int quit = 0;
48    int update = 1;
49    int px, py;
50    float angle = 0;
51
52
53    float square[6][2] = {
54        {-SQUARE_SIZE, -SQUARE_SIZE},
55        {SQUARE_SIZE, -SQUARE_SIZE},
56        {SQUARE_SIZE, SQUARE_SIZE},
57        {-SQUARE_SIZE, SQUARE_SIZE},
58    };
59    float uv1[6] = {
60        0, 0,
61        1, 0,
62        1, 1
63    };
64    float uv2[6] = {
65        0, 0,
66        1, 1,
67        0, 1
68    };
69
70
71    float rotated[4][2];
72    int coords1[6], coords2[6];
73
74    /* Create displayed canvas */
75    cv = caca_create_canvas(0, 0);
76    if (!cv)
77    {
78        fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]);
79        return 1;
80    }
81
82    /* Create texture holding canvas */
83    tex = caca_create_canvas(16, 16);
84    if (!tex)
85    {
86        fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]);
87        return 1;
88    }
89
90    /* Open window */
91    dp = caca_create_display(cv);
92    if (!dp)
93    {
94        fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]);
95        return 1;
96    }
97
98
99
100    /* Set the window title */
101    caca_set_display_title(dp, "trifiller");
102
103    /* Frame duration */
104    caca_set_display_time(dp, 10000);
105
106    /* Get displayed canvas size */
107    ww = caca_get_canvas_width(cv);
108    wh = caca_get_canvas_height(cv);
109
110    /* Texture size */
111    tw = caca_get_canvas_width(tex);
112    th = caca_get_canvas_height(tex);
113
114    /* Load texture if any */
115    if (argc == 2)
116    {
117        struct image *im = load_image(argv[1]);
118        if (!im)
119        {
120            fprintf(stderr, "%s: unable to load image '%s'\n", argv[0],
121                    argv[1]);
122            return 1;
123        }
124
125        caca_set_dither_algorithm(im->dither,
126                                  caca_get_dither_algorithm_list(NULL)[4]);
127        caca_dither_bitmap(tex, 0, 0, tw, th, im->dither, im->pixels);
128        unload_image(im);
129    }
130    /* or generate one */
131    else
132    {
133
134        int i;
135        for (i = 0; i < 16; i++)
136        {
137            caca_set_color_ansi(tex, (i + 1) % 0xF, i % 0xF);
138            caca_put_str(tex, 0, i, "0123456789ABCDEF");
139        }
140    }
141
142
143    px = 0;
144    py = 0;
145
146    while (!quit)
147    {
148        caca_event_t ev;
149        unsigned int const event_mask = CACA_EVENT_KEY_PRESS
150            | CACA_EVENT_RESIZE | CACA_EVENT_QUIT;
151        int event;
152
153        if (update)
154            event = caca_get_event(dp, event_mask, &ev, 0);
155        else
156            event = caca_get_event(dp, event_mask, &ev, -1);
157
158        while (event)
159        {
160            if (caca_get_event_type(&ev) & CACA_EVENT_KEY_PRESS)
161                switch (caca_get_event_key_ch(&ev))
162                {
163                case 'q':
164                case 'Q':
165                case CACA_KEY_ESCAPE:
166                    quit = 1;
167                    break;
168                case CACA_KEY_UP:
169                    py--;
170                    break;
171                case CACA_KEY_DOWN:
172                    py++;
173                    break;
174                case CACA_KEY_LEFT:
175                    px--;
176                    break;
177                case CACA_KEY_RIGHT:
178                    px++;
179                    break;
180                case 'a':
181                    angle += 1.0f;
182                    break;
183                case 's':
184                    angle -= 1.0f;
185                    break;
186                }
187            else if (caca_get_event_type(&ev) == CACA_EVENT_RESIZE)
188            {
189                caca_refresh_display(dp);
190                ww = caca_get_event_resize_width(&ev);
191                wh = caca_get_event_resize_height(&ev);
192                update = 1;
193            }
194            else if (caca_get_event_type(&ev) & CACA_EVENT_QUIT)
195                quit = 1;
196
197            event = caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, 0);
198        }
199
200
201
202        /* 2D Rotation around screen center */
203        int p;
204        for (p = 0; p < 4; p++)
205        {
206            rotated[p][0] =
207                square[p][0] * cos(angle * M_PI / 180.0f) -
208                square[p][1] * sin(angle * M_PI / 180.0f);
209            rotated[p][1] =
210                square[p][0] * sin(angle * M_PI / 180.0f) +
211                square[p][1] * cos(angle * M_PI / 180.0f);
212
213            rotated[p][0] += ww / 2 + px;
214            rotated[p][1] += wh / 2 + py;
215        }
216
217        angle += 1.0f;
218
219
220        /* Reaarange coordinates to fit libcaca's format */
221        coords1[0] = rotated[0][0];
222        coords1[1] = rotated[0][1];
223        coords1[2] = rotated[1][0];
224        coords1[3] = rotated[1][1];
225        coords1[4] = rotated[2][0];
226        coords1[5] = rotated[2][1];
227
228        coords2[0] = rotated[0][0];
229        coords2[1] = rotated[0][1];
230        coords2[2] = rotated[2][0];
231        coords2[3] = rotated[2][1];
232        coords2[4] = rotated[3][0];
233        coords2[5] = rotated[3][1];
234
235        /* Display two triangles */
236        caca_fill_triangle_textured(cv, /* canvas */
237                                    coords1,    /* triangle coordinates */
238                                    tex,        /* texture canvas */
239                                    uv1);       /* texture coordinates */
240        caca_fill_triangle_textured(cv, coords2, tex, uv2);
241
242        /* Refresh display and clear for next frame */
243        caca_refresh_display(dp);
244        caca_clear_canvas(cv);
245
246    }
247
248    caca_free_display(dp);
249    caca_free_canvas(cv);
250    caca_free_canvas(tex);
251
252    return 0;
253}
Note: See TracBrowser for help on using the repository browser.