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

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