diff options
| author | Björn Stenberg <bjorn@haxx.se> | 2003-06-29 16:33:04 +0000 |
|---|---|---|
| committer | Björn Stenberg <bjorn@haxx.se> | 2003-06-29 16:33:04 +0000 |
| commit | ba371fb595affd68c823926b85718d1d613dc7d3 (patch) | |
| tree | cfda303d0603d623cdb12f3928905d3ae02f1d87 /apps/plugins/cube.c | |
| parent | 9bcbe3fd723d23a709873a0855f27b86bc5c96f1 (diff) | |
| download | rockbox-ba371fb595affd68c823926b85718d1d613dc7d3.zip rockbox-ba371fb595affd68c823926b85718d1d613dc7d3.tar.gz rockbox-ba371fb595affd68c823926b85718d1d613dc7d3.tar.bz2 rockbox-ba371fb595affd68c823926b85718d1d613dc7d3.tar.xz | |
Added plugin loader. Moved games, demos and the text viewer to loadable plugins. Copy your *.rock files to /.rockbox/rocks/
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3769 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/cube.c')
| -rw-r--r-- | apps/plugins/cube.c | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c new file mode 100644 index 0000000..996a1a8 --- /dev/null +++ b/apps/plugins/cube.c @@ -0,0 +1,338 @@ +/*************************************************************************** +* __________ __ ___. +* Open \______ \ ____ ____ | | _\_ |__ _______ ___ +* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +* \/ \/ \/ \/ \/ +* $Id$ +* +* Copyright (C) 2002 Damien Teney +* modified to use int instead of float math by Andreas Zwirtes +* +* All files in this archive are subject to the GNU General Public License. +* See the file COPYING in the source tree root for full license agreement. +* +* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +* KIND, either express or implied. +* +***************************************************************************/ +#include "plugin.h" + +#ifdef HAVE_LCD_BITMAP + +/* Loops that the values are displayed */ +#define DISP_TIME 30 + +struct point_3D { + long x, y, z; +}; + +struct point_2D { + long x, y; +}; + +static struct point_3D sommet[8]; +static struct point_3D point3D[8]; +static struct point_2D point2D[8]; + +static long matrice[3][3]; + +static int nb_points = 8; + +static int x_off = 56; +static int y_off = 95; +static int z_off = 600; + +/* Precalculated sine and cosine * 10000 (four digit fixed point math) */ +static int sin_table[91] = +{ + 0, 174, 348, 523, 697, + 871,1045,1218,1391,1564, + 1736,1908,2079,2249,2419, + 2588,2756,2923,3090,3255, + 3420,3583,3746,3907,4067, + 4226,4383,4539,4694,4848, + 5000,5150,5299,5446,5591, + 5735,5877,6018,6156,6293, + 6427,6560,6691,6819,6946, + 7071,7193,7313,7431,7547, + 7660,7771,7880,7986,8090, + 8191,8290,8386,8480,8571, + 8660,8746,8829,8910,8987, + 9063,9135,9205,9271,9335, + 9396,9455,9510,9563,9612, + 9659,9702,9743,9781,9816, + 9848,9876,9902,9925,9945, + 9961,9975,9986,9993,9998, + 10000 +}; + +static struct plugin_api* rb; + +static long sin(int val) +{ + /* Speed improvement through sukzessive lookup */ + if (val<181) + { + if (val<91) + { + /* phase 0-90 degree */ + return (long)sin_table[val]; + } + else + { + /* phase 91-180 degree */ + return (long)sin_table[180-val]; + } + } + else + { + if (val<271) + { + /* phase 181-270 degree */ + return (-1L)*(long)sin_table[val-180]; + } + else + { + /* phase 270-359 degree */ + return (-1L)*(long)sin_table[360-val]; + } + } + return 0; +} + +static long cos(int val) +{ + /* Speed improvement through sukzessive lookup */ + if (val<181) + { + if (val<91) + { + /* phase 0-90 degree */ + return (long)sin_table[90-val]; + } + else + { + /* phase 91-180 degree */ + return (-1L)*(long)sin_table[val-90]; + } + } + else + { + if (val<271) + { + /* phase 181-270 degree */ + return (-1L)*(long)sin_table[270-val]; + } + else + { + /* phase 270-359 degree */ + return (long)sin_table[val-270]; + } + } + return 0; +} + + +static void cube_rotate(int xa, int ya, int za) +{ + int i; + + /* Just to prevent unnecessary lookups */ + long sxa,cxa,sya,cya,sza,cza; + sxa=sin(xa); + cxa=cos(xa); + sya=sin(ya); + cya=cos(ya); + sza=sin(za); + cza=cos(za); + + /* calculate overall translation matrix */ + matrice[0][0] = cza*cya/10000L; + matrice[1][0] = sza*cya/10000L; + matrice[2][0] = -sya; + + matrice[0][1] = cza*sya/10000L*sxa/10000L - sza*cxa/10000L; + matrice[1][1] = sza*sya/10000L*sxa/10000L + cxa*cza/10000L; + matrice[2][1] = sxa*cya/10000L; + + matrice[0][2] = cza*sya/10000L*cxa/10000L + sza*sxa/10000L; + matrice[1][2] = sza*sya/10000L*cxa/10000L - cza*sxa/10000L; + matrice[2][2] = cxa*cya/10000L; + + /* apply translation matrix to all points */ + for(i=0;i<nb_points;i++) + { + point3D[i].x = matrice[0][0]*sommet[i].x + matrice[1][0]*sommet[i].y + + matrice[2][0]*sommet[i].z; + + point3D[i].y = matrice[0][1]*sommet[i].x + matrice[1][1]*sommet[i].y + + matrice[2][1]*sommet[i].z; + + point3D[i].z = matrice[0][2]*sommet[i].x + matrice[1][2]*sommet[i].y + + matrice[2][2]*sommet[i].z; + } +} + +static void cube_viewport(void) +{ + int i; + + /* Do viewport transformation for all points */ + for(i=0;i<nb_points;i++) + { + point2D[i].x=(((point3D[i].x)<<8)/10000L)/ + (point3D[i].z/10000L+z_off)+x_off; + point2D[i].y=(((point3D[i].y)<<8)/10000L)/ + (point3D[i].z/10000L+z_off)+y_off; + } +} + +static void cube_init(void) +{ + /* Original 3D-position of cube's corners */ + sommet[0].x = -40; sommet[0].y = -40; sommet[0].z = -40; + sommet[1].x = 40; sommet[1].y = -40; sommet[1].z = -40; + sommet[2].x = 40; sommet[2].y = 40; sommet[2].z = -40; + sommet[3].x = -40; sommet[3].y = 40; sommet[3].z = -40; + sommet[4].x = 40; sommet[4].y = -40; sommet[4].z = 40; + sommet[5].x = -40; sommet[5].y = -40; sommet[5].z = 40; + sommet[6].x = -40; sommet[6].y = 40; sommet[6].z = 40; + sommet[7].x = 40; sommet[7].y = 40; sommet[7].z = 40; +} + +static void line(int a, int b) +{ + rb->lcd_drawline(point2D[a].x, point2D[a].y, point2D[b].x, point2D[b].y); +} + +static void cube_draw(void) +{ + /* Draws front face */ + line(0,1); line(1,2); + line(2,3); line(3,0); + + /* Draws rear face */ + line(4,5); line(5,6); + line(6,7); line(7,4); + + /* Draws the other edges */ + line(0,5); + line(1,4); + line(2,7); + line(3,6); +} + + +enum plugin_status plugin_start(struct plugin_api* api, void* parameter) +{ + int t_disp=0; + char buffer[30]; + + int xa=0; + int ya=0; + int za=0; + int xs=1; + int ys=3; + int zs=1; + bool highspeed=0; + bool exit=0; + + TEST_PLUGIN_API(api); + (void)(parameter); + rb = api; + + rb->lcd_setfont(FONT_SYSFIXED); + + cube_init(); + + while(!exit) + { + if (!highspeed) + rb->sleep(4); + + rb->lcd_clear_display(); + cube_rotate(xa,ya,za); + cube_viewport(); + cube_draw(); + if (t_disp>0) + { + t_disp--; + rb->snprintf(buffer, 30, "x:%d y:%d z:%d h:%d",xs,ys,zs,highspeed); + rb->lcd_putsxy(0, 56, buffer); + } + rb->lcd_update(); + + xa+=xs; + if (xa>359) + xa-=360; + if (xa<0) + xa+=360; + ya+=ys; + if (ya>359) + ya-=360; + if (ya<0) + ya+=360; + za+=zs; + if (za>359) + za-=360; + if (za<0) + za+=360; + + switch(rb->button_get(false)) + { + case BUTTON_RIGHT: + xs+=1; + if (xs>10) + xs=10; + t_disp=DISP_TIME; + break; + case BUTTON_LEFT: + xs-=1; + if (xs<-10) + xs=-10; + t_disp=DISP_TIME; + break; + case BUTTON_UP: + ys+=1; + if (ys>10) + ys=10; + t_disp=DISP_TIME; + break; + case BUTTON_DOWN: + ys-=1; + if (ys<-10) + ys=-10; + t_disp=DISP_TIME; + break; + case BUTTON_F2: + zs+=1; + if (zs>10) + zs=10; + t_disp=DISP_TIME; + break; + case BUTTON_F1: + zs-=1; + if (zs<-10) + zs=-10; + t_disp=DISP_TIME; + break; + case BUTTON_PLAY: + highspeed=!highspeed; + t_disp=DISP_TIME; + break; + case BUTTON_OFF|BUTTON_REL: + exit=1; + break; + + case SYS_USB_CONNECTED: + rb->usb_screen(); + return PLUGIN_USB_CONNECTED; + } + } + + return PLUGIN_OK; +} + +#endif |