Use FPVM in demo firmware (unfinished, broken)
[mw/milkymist.git] / software / demo / eval.h
1 /*
2  * Milkymist VJ SoC (Software)
3  * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, version 3 of the License.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #ifndef __EVAL_H
19 #define __EVAL_H
20
21 #include <hw/tmu.h> /* for tmu_vertex */
22 #include <hw/pfpu.h>
23
24 #include <hal/pfpu.h>
25
26 /****************************************************************/
27 /* GENERAL                                                      */
28 /****************************************************************/
29
30 void eval_init();
31 int eval_schedule();
32
33 /****************************************************************/
34 /* PER-FRAME VARIABLES                                          */
35 /****************************************************************/
36
37 enum {
38         pfv_cx = 0,
39         pfv_cy,
40         pfv_rot,
41         pfv_dx,
42         pfv_dy,
43         pfv_zoom,
44         pfv_decay,
45         pfv_wave_mode,
46         pfv_wave_scale,
47         pfv_wave_additive,
48         pfv_wave_usedots,
49         pfv_wave_maximize_color,
50         pfv_wave_thick,
51         pfv_wave_x,
52         pfv_wave_y,
53         pfv_wave_r,
54         pfv_wave_g,
55         pfv_wave_b,
56         pfv_wave_a,
57
58         pfv_ob_size,
59         pfv_ob_r,
60         pfv_ob_g,
61         pfv_ob_b,
62         pfv_ob_a,
63         pfv_ib_size,
64         pfv_ib_r,
65         pfv_ib_g,
66         pfv_ib_b,
67         pfv_ib_a,
68
69         pfv_mv_x,
70         pfv_mv_y,
71         pfv_mv_dx,
72         pfv_mv_dy,
73         pfv_mv_l,
74         pfv_mv_r,
75         pfv_mv_g,
76         pfv_mv_b,
77         pfv_mv_a,
78
79         pfv_tex_wrap,
80
81         pfv_time,
82         pfv_bass,
83         pfv_mid,
84         pfv_treb,
85         pfv_bass_att,
86         pfv_mid_att,
87         pfv_treb_att,
88         
89         EVAL_PFV_COUNT /* must be last */
90 };
91
92 /* convert a variable name to its pfv_xxx number, -1 in case of failure */
93 int eval_pfv_from_name(const char *name);
94
95 void eval_set_initial(int pfv, float x);
96
97 /* restores preset's initial conditions (and reset user variables) */
98 void eval_reset_pfv();
99
100 /* restore a variable's initial condition */
101 int eval_reinit_pfv(int pfv);
102
103 /* restore all variable's initial conditions (and keep user variables) */
104 void eval_reinit_all_pfv();
105
106 /* reads the value of a per-frame variable
107  * (from perframe_regs_current or initial conditions)
108  * always returns a correct value; if the variable is not
109  * in the preset, a default value is returned.
110  */
111 float eval_read_pfv(int pfv);
112
113 /* writes the value of a per-frame variable (to perframe_regs_current)
114  * does nothing if the variable is not handled by the PFPU.
115  * typically used for preset inputs (treb, bass, etc.)
116  */
117 void eval_write_pfv(int pfv, float x);
118
119 /* add a per frame equation in textual form */
120 int eval_add_per_frame(char *dest, char *val);
121
122 /* fills in a task descriptor to evaluate per-frame equations */
123 void eval_pfv_fill_td(struct pfpu_td *td, pfpu_callback callback, void *user);
124
125
126 /****************************************************************/
127 /* PER-VERTEX VARIABLES                                         */
128 /****************************************************************/
129
130 enum {
131         /* System */
132         pvv_hmeshsize = 0,
133         pvv_vmeshsize,
134         pvv_hres,
135         pvv_vres,
136
137         /* MilkDrop */
138         pvv_cx,
139         pvv_cy,
140         pvv_rot,
141         pvv_dx,
142         pvv_dy,
143         pvv_zoom,
144         
145         EVAL_PVV_COUNT /* must be last */
146 };
147
148 /* transfer relevant per-frame variables to the per-vertex variable pool */
149 void eval_pfv_to_pvv();
150
151 /* add a per vertex equation in textual form */
152 int eval_add_per_vertex(char *dest, char *val);
153
154 /* fills in a task descriptor to evaluate per-vertex equations */
155 void eval_pvv_fill_td(struct pfpu_td *td, struct tmu_vertex *vertices, pfpu_callback callback, void *user);
156
157 #endif /* __EVAL_H */