From 1ff99119001153b68460caea182cc92716a65680 Mon Sep 17 00:00:00 2001 From: lekernel Date: Wed, 19 Aug 2009 17:09:33 +0200 Subject: [PATCH] Wave mode 5, untested --- milkymist-core/software/demo/apipe.c | 14 ++- milkymist-core/software/demo/ast.h | 2 +- milkymist-core/software/demo/brd.c | 2 +- milkymist-core/software/demo/brd.h | 2 +- milkymist-core/software/demo/eval.c | 3 + milkymist-core/software/demo/eval.h | 2 + milkymist-core/software/demo/rpipe.c | 169 +++++++++++++++++++++------ milkymist-core/software/demo/rpipe.h | 10 +- milkymist-core/software/demo/shell.c | 30 +---- milkymist-core/software/demo/wave.c | 9 +- milkymist-core/software/demo/wave.h | 11 +- 11 files changed, 176 insertions(+), 78 deletions(-) diff --git a/milkymist-core/software/demo/apipe.c b/milkymist-core/software/demo/apipe.c index 7dbda4c6..182bce6c 100644 --- a/milkymist-core/software/demo/apipe.c +++ b/milkymist-core/software/demo/apipe.c @@ -144,12 +144,19 @@ static void pfv_callback(struct pfpu_td *td) rpipe_frame = (struct rpipe_frame *)td->user; rpipe_frame->brightness = 63.0f*eval_read_pfv(eval, pfv_decay); + + rpipe_frame->wave_mode = eval_read_pfv(eval, pfv_wave_mode); + rpipe_frame->wave_scale = eval_read_pfv(eval, pfv_wave_scale); + rpipe_frame->wave_additive = eval_read_pfv(eval, pfv_wave_additive) != 0.0f; + rpipe_frame->wave_usedots = eval_read_pfv(eval, pfv_wave_usedots) != 0.0f; + rpipe_frame->wave_maximize_color = eval_read_pfv(eval, pfv_wave_maximize_color) != 0.0f; + rpipe_frame->wave_thick = eval_read_pfv(eval, pfv_wave_thick) != 0.0f; + rpipe_frame->wave_x = eval_read_pfv(eval, pfv_wave_x); + rpipe_frame->wave_y = eval_read_pfv(eval, pfv_wave_y); rpipe_frame->wave_r = eval_read_pfv(eval, pfv_wave_r); rpipe_frame->wave_g = eval_read_pfv(eval, pfv_wave_g); rpipe_frame->wave_b = eval_read_pfv(eval, pfv_wave_b); rpipe_frame->wave_a = eval_read_pfv(eval, pfv_wave_a); - rpipe_frame->wave_additive = eval_read_pfv(eval, pfv_wave_additive) != 0.0f; - rpipe_frame->wave_usedots = eval_read_pfv(eval, pfv_wave_usedots) != 0.0f; eval_pfv_to_pvv(eval); eval_pvv_fill_td(eval, &pfpu_td, &rpipe_frame->vertices[0][0], pvv_callback, rpipe_frame); @@ -206,6 +213,9 @@ static void analyzer_bottom_half() eval_write_pfv(eval, pfv_mid_att, mid_att); eval_write_pfv(eval, pfv_treb_att, treb_att); + rpipe_frame->time = time; + rpipe_frame->treb = ftreb; + eval_pfv_fill_td(eval, &pfpu_td, pfv_callback, rpipe_frame); pfpu_submit_task(&pfpu_td); } diff --git a/milkymist-core/software/demo/ast.h b/milkymist-core/software/demo/ast.h index cbb5dc10..76a19e8d 100644 --- a/milkymist-core/software/demo/ast.h +++ b/milkymist-core/software/demo/ast.h @@ -21,7 +21,7 @@ #define NDEBUG -#define IDENTIFIER_SIZE 16 +#define IDENTIFIER_SIZE 24 struct preset_equation; diff --git a/milkymist-core/software/demo/brd.c b/milkymist-core/software/demo/brd.c index 792ccf9f..f51ef652 100644 --- a/milkymist-core/software/demo/brd.c +++ b/milkymist-core/software/demo/brd.c @@ -22,7 +22,7 @@ #include "brd.h" -struct board_desc *brd_desc; +const struct board_desc *brd_desc; void brd_init() { diff --git a/milkymist-core/software/demo/brd.h b/milkymist-core/software/demo/brd.h index f48fb288..00c8e1b9 100644 --- a/milkymist-core/software/demo/brd.h +++ b/milkymist-core/software/demo/brd.h @@ -19,7 +19,7 @@ #ifndef __BRD_H #define __BRD_H -extern struct board_desc *brd_desc; +extern const struct board_desc *brd_desc; void brd_init(); diff --git a/milkymist-core/software/demo/eval.c b/milkymist-core/software/demo/eval.c index 06174f4c..62448106 100644 --- a/milkymist-core/software/demo/eval.c +++ b/milkymist-core/software/demo/eval.c @@ -44,6 +44,8 @@ static const char pfv_names[EVAL_PFV_COUNT][IDENTIFIER_SIZE] = { "wave_scale", "wave_additive", "wave_usedots", + "bMaximizeWaveColor", + "wave_thick", "wave_x", "wave_y", "wave_r", @@ -70,6 +72,7 @@ static int pfv_from_name(const char *name) if(strcmp(name, "fWaveScale") == 0) return pfv_wave_scale; if(strcmp(name, "bAdditiveWaves") == 0) return pfv_wave_additive; if(strcmp(name, "bWaveDots") == 0) return pfv_wave_usedots; + if(strcmp(name, "bWaveThick") == 0) return pfv_wave_thick; if(strcmp(name, "fWaveAlpha") == 0) return pfv_wave_a; return -1; } diff --git a/milkymist-core/software/demo/eval.h b/milkymist-core/software/demo/eval.h index 49d7328e..56483f96 100644 --- a/milkymist-core/software/demo/eval.h +++ b/milkymist-core/software/demo/eval.h @@ -41,6 +41,8 @@ enum { pfv_wave_scale, pfv_wave_additive, pfv_wave_usedots, + pfv_wave_maximize_color, + pfv_wave_thick, pfv_wave_x, pfv_wave_y, pfv_wave_r, diff --git a/milkymist-core/software/demo/rpipe.c b/milkymist-core/software/demo/rpipe.c index b15be659..824fc270 100644 --- a/milkymist-core/software/demo/rpipe.c +++ b/milkymist-core/software/demo/rpipe.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include "renderer.h" @@ -124,12 +125,83 @@ int rpipe_input(struct rpipe_frame *frame) return 1; } -static void rpipe_bottom_half() +/* TODO: implement missing wave modes */ + +static int wave_mode_0(struct wave_vertex *vertices) { - struct wave_vertex vertices[100]; - struct wave_params params; + return 0; +} + +static int wave_mode_1(struct wave_vertex *vertices) +{ + return 0; +} + +static int wave_mode_2(struct wave_vertex *vertices) +{ + return 0; +} + +static int wave_mode_3(struct wave_vertex *vertices) +{ + return 0; +} + +static int wave_mode_4(struct wave_vertex *vertices) +{ + return 0; +} + +static int wave_mode_5(struct wave_vertex *vertices) +{ + int nvertices; int i; - unsigned int oldmask; + float s1, s2; + float x0, y0; + float cos_rot, sin_rot; + int x, y; + + nvertices = 256-64; + + cos_rot = cosf(bh_frame->time*0.3f); + sin_rot = sinf(bh_frame->time*0.3f); + + for(i=0;isamples[4*i ]/32768.0; + s2 = bh_frame->samples[4*i+64+1]/32768.0; + x0 = 2.0*s1*s2; + y0 = s1*s1 - s2*s2; + + x = (float)vga_hres*((x0*cos_rot - y0*sin_rot)*bh_frame->wave_scale*0.5 + bh_frame->wave_x); + y = (float)vga_vres*((x0*sin_rot + y0*cos_rot)*bh_frame->wave_scale*0.5 + bh_frame->wave_y); + + if(x < 0) x = 0; + if(x >= vga_hres) x = vga_hres - 1; + if(y < 0) y = 0; + if(y >= vga_vres) y = vga_vres - 1; + + vertices[i].x = x; + vertices[i].y = y; + } + + return nvertices; +} + +static int wave_mode_6(struct wave_vertex *vertices) +{ + return 0; +} + +static int wave_mode_7(struct wave_vertex *vertices) +{ + return 0; +} + +static void rpipe_draw_waves() +{ + struct wave_params params; + struct wave_vertex vertices[256]; + int nvertices; /* * We assume that the VGA back buffer is not in any cache @@ -137,57 +209,88 @@ static void rpipe_bottom_half() * has just written it, straight to SDRAM). */ - /* Draw waves */ - params.wave_mode = 5; + params.wave_mode = bh_frame->wave_mode; + params.wave_additive = bh_frame->wave_additive; + params.wave_dots = bh_frame->wave_usedots; + params.wave_maximize_color = bh_frame->wave_maximize_color; + params.wave_thick = bh_frame->wave_thick; + params.wave_r = bh_frame->wave_r; params.wave_g = bh_frame->wave_g; params.wave_b = bh_frame->wave_b; - params.wave_alpha = bh_frame->wave_a; - params.maximize_wave_color = 1; - params.wave_dots = bh_frame->wave_usedots; - params.wave_thick = 1; - params.additive_waves = bh_frame->wave_additive; - params.wave_loop = 0; - params.treb = 0.2; - - for(i=0;i<40;i++) { - int a; - vertices[i].x = 639*i/39; - a = 240 + 200*(int)bh_frame->samples[16*i]/32768; - if(a < 0) a = 0; - if(a > 479) a = 479; - vertices[i].y = a; + params.wave_a = bh_frame->wave_a; + + params.treb = bh_frame->treb; + + switch(bh_frame->wave_mode) { + case 0: + nvertices = wave_mode_0(vertices); + break; + case 1: + nvertices = wave_mode_1(vertices); + break; + case 2: + nvertices = wave_mode_2(vertices); + break; + case 3: + nvertices = wave_mode_3(vertices); + break; + case 4: + nvertices = wave_mode_4(vertices); + break; + case 5: + nvertices = wave_mode_5(vertices); + break; + case 6: + nvertices = wave_mode_6(vertices); + break; + case 7: + nvertices = wave_mode_7(vertices); + break; + default: + nvertices = 0; + break; } - wave_draw(vga_backbuffer, vga_hres, vga_vres, ¶ms, vertices, 40); - - /* Draw spam */ + wave_draw(vga_backbuffer, vga_hres, vga_vres, ¶ms, vertices, nvertices); +} + +static void rpipe_draw_spam() +{ + int dx, dy; + int x, y; + spam_counter++; if(spam_counter > SPAM_PERIOD) { - int dx, dy; - int x, y; - dx = (vga_hres-SPAM_W)/2; dy = vga_vres/2-SPAM_H; - + for(y=0;ywave_alpha; + wave_o = params->wave_a; // Original code: maximize_colors wave_r = params->wave_r; wave_g = params->wave_g; @@ -63,7 +63,7 @@ void wave_draw(unsigned short *framebuffer, unsigned int hres, unsigned int vres wave_o *= params->treb*params->treb; } - if(params->maximize_wave_color) { + if(params->wave_maximize_color) { // WARNING: softfloat ">=" operator is broken (says 0.5 >= 0.8) // ">" works fine if((wave_r > wave_g) && (wave_r > wave_b)) { @@ -112,7 +112,7 @@ void wave_draw(unsigned short *framebuffer, unsigned int hres, unsigned int vres // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // else // glBlendFunc(GL_SRC_ALPHA, GL_ONE); - if(params->additive_waves) + if(params->wave_additive) ctx.additive = 1; // Original code: @@ -125,7 +125,8 @@ void wave_draw(unsigned short *framebuffer, unsigned int hres, unsigned int vres for(i=0;i<(nvertices-1);i++) line(&ctx, vertices[i].x, vertices[i].y, vertices[i+1].x, vertices[i+1].y); - if(params->wave_loop) + // draw_wave_as_loop + if(params->wave_mode == 0) line(&ctx, vertices[0].x, vertices[0].y, vertices[nvertices-1].x, vertices[nvertices-1].y); // TODO: implement two_waves diff --git a/milkymist-core/software/demo/wave.h b/milkymist-core/software/demo/wave.h index dab3adea..51ed47b9 100644 --- a/milkymist-core/software/demo/wave.h +++ b/milkymist-core/software/demo/wave.h @@ -26,15 +26,14 @@ struct wave_vertex { struct wave_params { unsigned int wave_mode; + int wave_additive; + int wave_dots; + int wave_maximize_color; + int wave_thick; float wave_r; float wave_g; float wave_b; - float wave_alpha; - int maximize_wave_color; - int wave_dots; - int wave_thick; - int additive_waves; - int wave_loop; + float wave_a; float treb; };