forked from len0rd/rockbox
Cube.rock extension and rework: (1) Solid 4-greylevel mode on iriver H1xx. (2) Restructured internal handling of corners and edges. Added handling of faces for (1). (3) Small button handling changes for better response.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7129 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
937725f674
commit
6a8cf45052
1 changed files with 141 additions and 53 deletions
|
@ -9,7 +9,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002 Damien Teney
|
* Copyright (C) 2002 Damien Teney
|
||||||
* modified to use int instead of float math by Andreas Zwirtes
|
* modified to use int instead of float math by Andreas Zwirtes
|
||||||
* binary fixed point format and LCD aspect handling by Jens Arnold
|
* binary fixed point format, LCD aspect handling and solid mode by Jens Arnold
|
||||||
*
|
*
|
||||||
* All files in this archive are subject to the GNU General Public License.
|
* 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.
|
* See the file COPYING in the source tree root for full license agreement.
|
||||||
|
@ -20,13 +20,14 @@
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#include "plugin.h"
|
#include "plugin.h"
|
||||||
#include "playergfx.h"
|
#include "playergfx.h"
|
||||||
|
#include "xlcd.h"
|
||||||
|
|
||||||
/* Loops that the values are displayed */
|
/* Loops that the values are displayed */
|
||||||
#define DISP_TIME 30
|
#define DISP_TIME 30
|
||||||
|
|
||||||
/* variable button definitions */
|
/* variable button definitions */
|
||||||
#if CONFIG_KEYPAD == RECORDER_PAD
|
#if CONFIG_KEYPAD == RECORDER_PAD
|
||||||
#define CUBE_QUIT (BUTTON_OFF | BUTTON_REL)
|
#define CUBE_QUIT BUTTON_OFF
|
||||||
#define CUBE_X_INC BUTTON_RIGHT
|
#define CUBE_X_INC BUTTON_RIGHT
|
||||||
#define CUBE_X_DEC BUTTON_LEFT
|
#define CUBE_X_DEC BUTTON_LEFT
|
||||||
#define CUBE_Y_INC BUTTON_UP
|
#define CUBE_Y_INC BUTTON_UP
|
||||||
|
@ -36,7 +37,7 @@
|
||||||
#define CUBE_HIGHSPEED BUTTON_PLAY
|
#define CUBE_HIGHSPEED BUTTON_PLAY
|
||||||
|
|
||||||
#elif CONFIG_KEYPAD == PLAYER_PAD
|
#elif CONFIG_KEYPAD == PLAYER_PAD
|
||||||
#define CUBE_QUIT (BUTTON_STOP | BUTTON_REL)
|
#define CUBE_QUIT BUTTON_STOP
|
||||||
#define CUBE_X_INC BUTTON_RIGHT
|
#define CUBE_X_INC BUTTON_RIGHT
|
||||||
#define CUBE_X_DEC BUTTON_LEFT
|
#define CUBE_X_DEC BUTTON_LEFT
|
||||||
#define CUBE_Y_INC (BUTTON_ON | BUTTON_RIGHT)
|
#define CUBE_Y_INC (BUTTON_ON | BUTTON_RIGHT)
|
||||||
|
@ -46,7 +47,7 @@
|
||||||
#define CUBE_HIGHSPEED BUTTON_PLAY
|
#define CUBE_HIGHSPEED BUTTON_PLAY
|
||||||
|
|
||||||
#elif CONFIG_KEYPAD == ONDIO_PAD
|
#elif CONFIG_KEYPAD == ONDIO_PAD
|
||||||
#define CUBE_QUIT (BUTTON_OFF | BUTTON_REL)
|
#define CUBE_QUIT BUTTON_OFF
|
||||||
#define CUBE_X_INC BUTTON_RIGHT
|
#define CUBE_X_INC BUTTON_RIGHT
|
||||||
#define CUBE_X_DEC BUTTON_LEFT
|
#define CUBE_X_DEC BUTTON_LEFT
|
||||||
#define CUBE_Y_INC BUTTON_UP
|
#define CUBE_Y_INC BUTTON_UP
|
||||||
|
@ -58,34 +59,18 @@
|
||||||
|
|
||||||
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
|
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
|
||||||
(CONFIG_KEYPAD == IRIVER_H300_PAD)
|
(CONFIG_KEYPAD == IRIVER_H300_PAD)
|
||||||
#define CUBE_QUIT (BUTTON_OFF | BUTTON_REL)
|
#define CUBE_QUIT BUTTON_OFF
|
||||||
#define CUBE_X_INC BUTTON_RIGHT
|
#define CUBE_X_INC BUTTON_RIGHT
|
||||||
#define CUBE_X_DEC BUTTON_LEFT
|
#define CUBE_X_DEC BUTTON_LEFT
|
||||||
#define CUBE_Y_INC BUTTON_UP
|
#define CUBE_Y_INC BUTTON_UP
|
||||||
#define CUBE_Y_DEC BUTTON_DOWN
|
#define CUBE_Y_DEC BUTTON_DOWN
|
||||||
#define CUBE_Z_INC (BUTTON_ON | BUTTON_UP)
|
#define CUBE_Z_INC (BUTTON_ON | BUTTON_UP)
|
||||||
#define CUBE_Z_DEC (BUTTON_ON | BUTTON_DOWN)
|
#define CUBE_Z_DEC (BUTTON_ON | BUTTON_DOWN)
|
||||||
#define CUBE_HIGHSPEED_PRE BUTTON_SELECT
|
#define CUBE_MODE BUTTON_MODE
|
||||||
#define CUBE_HIGHSPEED (BUTTON_SELECT | BUTTON_REL)
|
#define CUBE_HIGHSPEED BUTTON_SELECT
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
#define MYLCD(fn) rb->lcd_ ## fn
|
#define MYLCD(fn) rb->lcd_ ## fn
|
||||||
#define DIST (10*LCD_HEIGHT/16)
|
#define DIST (10*LCD_HEIGHT/16)
|
||||||
|
@ -104,11 +89,72 @@ static int y_off = 7;
|
||||||
#define ASPECT 300 /* = 1.175 */
|
#define ASPECT 300 /* = 1.175 */
|
||||||
#endif /* !LCD_BITMAP */
|
#endif /* !LCD_BITMAP */
|
||||||
|
|
||||||
|
struct point_3D {
|
||||||
|
long x, y, z;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct point_2D {
|
||||||
|
long x, y;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct line {
|
||||||
|
int start, end;
|
||||||
|
};
|
||||||
|
|
||||||
|
#if LCD_DEPTH > 1
|
||||||
|
struct face {
|
||||||
|
int corner1, corner2, corner3, corner4;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct zsort {
|
||||||
|
int place;
|
||||||
|
long sum;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* initial, unrotated cube corners */
|
||||||
|
static const struct point_3D sommet[8] =
|
||||||
|
{
|
||||||
|
{-DIST, -DIST, -DIST},
|
||||||
|
{ DIST, -DIST, -DIST},
|
||||||
|
{ DIST, DIST, -DIST},
|
||||||
|
{-DIST, DIST, -DIST},
|
||||||
|
{-DIST, -DIST, DIST},
|
||||||
|
{ DIST, -DIST, DIST},
|
||||||
|
{ DIST, DIST, DIST},
|
||||||
|
{-DIST, DIST, DIST}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The 12 lines forming the edges */
|
||||||
|
static const struct line lines[12] =
|
||||||
|
{
|
||||||
|
{0, 1}, {1, 2}, {2, 3}, {3, 0},
|
||||||
|
{4, 5}, {5, 6}, {6, 7}, {7, 4},
|
||||||
|
{0, 4}, {1, 5}, {2, 6}, {3, 7}
|
||||||
|
};
|
||||||
|
|
||||||
|
#if LCD_DEPTH > 1
|
||||||
|
/* The 6 faces of the cube */
|
||||||
|
static const struct face faces[6] =
|
||||||
|
{
|
||||||
|
{0, 1, 2, 3}, {4, 5, 6, 7},
|
||||||
|
{0, 1, 5, 4}, {3, 2, 6, 7},
|
||||||
|
{0, 3, 7, 4}, {1, 2, 6, 5}
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool solid = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static struct point_3D point3D[8];
|
||||||
|
static struct point_2D point2D[8];
|
||||||
|
|
||||||
|
static long matrice[3][3];
|
||||||
|
|
||||||
|
static int nb_points = 8;
|
||||||
static long z_off = 600;
|
static long z_off = 600;
|
||||||
|
|
||||||
/* Precalculated sine and cosine * 16384 (fixed point 18.14) */
|
/* Precalculated sine and cosine * 16384 (fixed point 18.14) */
|
||||||
static short sin_table[91] =
|
static const short sin_table[91] =
|
||||||
{
|
{
|
||||||
0, 285, 571, 857, 1142, 1427, 1712, 1996, 2280, 2563,
|
0, 285, 571, 857, 1142, 1427, 1712, 1996, 2280, 2563,
|
||||||
2845, 3126, 3406, 3685, 3963, 4240, 4516, 4790, 5062, 5334,
|
2845, 3126, 3406, 3685, 3963, 4240, 4516, 4790, 5062, 5334,
|
||||||
|
@ -248,39 +294,75 @@ static void cube_viewport(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cube_init(void)
|
#if LCD_DEPTH > 1
|
||||||
|
static int compfunc(const void * a, const void * b)
|
||||||
{
|
{
|
||||||
/* Original 3D-position of cube's corners */
|
return ((struct zsort *)b)->sum - ((struct zsort *)a)->sum;
|
||||||
sommet[0].x = -DIST; sommet[0].y = -DIST; sommet[0].z = -DIST;
|
|
||||||
sommet[1].x = DIST; sommet[1].y = -DIST; sommet[1].z = -DIST;
|
|
||||||
sommet[2].x = DIST; sommet[2].y = DIST; sommet[2].z = -DIST;
|
|
||||||
sommet[3].x = -DIST; sommet[3].y = DIST; sommet[3].z = -DIST;
|
|
||||||
sommet[4].x = DIST; sommet[4].y = -DIST; sommet[4].z = DIST;
|
|
||||||
sommet[5].x = -DIST; sommet[5].y = -DIST; sommet[5].z = DIST;
|
|
||||||
sommet[6].x = -DIST; sommet[6].y = DIST; sommet[6].z = DIST;
|
|
||||||
sommet[7].x = DIST; sommet[7].y = DIST; sommet[7].z = DIST;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void line(int a, int b)
|
|
||||||
{
|
|
||||||
MYLCD(drawline)(point2D[a].x, point2D[a].y, point2D[b].x, point2D[b].y);
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void cube_draw(void)
|
static void cube_draw(void)
|
||||||
{
|
{
|
||||||
/* Draws front face */
|
int i;
|
||||||
line(0,1); line(1,2);
|
#if LCD_DEPTH > 1
|
||||||
line(2,3); line(3,0);
|
int place;
|
||||||
|
struct zsort z_avgs_f[6];
|
||||||
|
|
||||||
/* Draws rear face */
|
if (solid)
|
||||||
line(4,5); line(5,6);
|
{
|
||||||
line(6,7); line(7,4);
|
for (i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
z_avgs_f[i].place = i;
|
||||||
|
z_avgs_f[i].sum = point3D[faces[i].corner1].z
|
||||||
|
+ point3D[faces[i].corner2].z
|
||||||
|
+ point3D[faces[i].corner3].z
|
||||||
|
+ point3D[faces[i].corner4].z;
|
||||||
|
}
|
||||||
|
|
||||||
/* Draws the other edges */
|
rb->qsort(z_avgs_f, 6, sizeof(struct zsort), compfunc);
|
||||||
line(0,5);
|
|
||||||
line(1,4);
|
for (i = 3; i < 6; i++)
|
||||||
line(2,7);
|
{ /* we can only see the front 3 faces at best */
|
||||||
line(3,6);
|
switch(z_avgs_f[i].place)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
rb->lcd_set_foreground(2*MAX_LEVEL/3);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
rb->lcd_set_foreground(MAX_LEVEL/3);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
case 5:
|
||||||
|
rb->lcd_set_foreground(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
place = z_avgs_f[i].place;
|
||||||
|
xlcd_filltriangle(point2D[faces[place].corner1].x,
|
||||||
|
point2D[faces[place].corner1].y,
|
||||||
|
point2D[faces[place].corner2].x,
|
||||||
|
point2D[faces[place].corner2].y,
|
||||||
|
point2D[faces[place].corner3].x,
|
||||||
|
point2D[faces[place].corner3].y);
|
||||||
|
xlcd_filltriangle(point2D[faces[place].corner1].x,
|
||||||
|
point2D[faces[place].corner1].y,
|
||||||
|
point2D[faces[place].corner3].x,
|
||||||
|
point2D[faces[place].corner3].y,
|
||||||
|
point2D[faces[place].corner4].x,
|
||||||
|
point2D[faces[place].corner4].y);
|
||||||
|
}
|
||||||
|
rb->lcd_set_foreground(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* LCD_DEPTH > 1 */
|
||||||
|
{
|
||||||
|
for (i = 0; i < 12; i++)
|
||||||
|
MYLCD(drawline)(point2D[lines[i].start].x,
|
||||||
|
point2D[lines[i].start].y,
|
||||||
|
point2D[lines[i].end].x,
|
||||||
|
point2D[lines[i].end].y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -305,6 +387,9 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
|
||||||
rb = api;
|
rb = api;
|
||||||
|
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
#if LCD_DEPTH > 1
|
||||||
|
xlcd_init(rb);
|
||||||
|
#endif
|
||||||
rb->lcd_setfont(FONT_SYSFIXED);
|
rb->lcd_setfont(FONT_SYSFIXED);
|
||||||
#else
|
#else
|
||||||
if (!pgfx_init(rb, 4, 2))
|
if (!pgfx_init(rb, 4, 2))
|
||||||
|
@ -315,11 +400,9 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
|
||||||
pgfx_display(3, 0);
|
pgfx_display(3, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
cube_init();
|
|
||||||
|
|
||||||
while(!exit)
|
while(!exit)
|
||||||
{
|
{
|
||||||
if (highspeed)
|
if (highspeed)
|
||||||
rb->yield();
|
rb->yield();
|
||||||
else
|
else
|
||||||
rb->sleep(4);
|
rb->sleep(4);
|
||||||
|
@ -416,6 +499,11 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
|
||||||
zs=-10;
|
zs=-10;
|
||||||
t_disp=DISP_TIME;
|
t_disp=DISP_TIME;
|
||||||
break;
|
break;
|
||||||
|
#ifdef CUBE_MODE
|
||||||
|
case CUBE_MODE:
|
||||||
|
solid = !solid;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case CUBE_HIGHSPEED:
|
case CUBE_HIGHSPEED:
|
||||||
#ifdef CUBE_HIGHSPEED_PRE
|
#ifdef CUBE_HIGHSPEED_PRE
|
||||||
if (lastbutton!=CUBE_HIGHSPEED_PRE)
|
if (lastbutton!=CUBE_HIGHSPEED_PRE)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue