9 #include "goom_tools.h"
10 #include "drawmethods.h"
11 #include "goom_plugin_info.h"
13 static inline unsigned char
14 lighten (unsigned char value, float power)
17 float t = (float) val * log10 (power) / 2.0;
20 val = (int) t; /* (32.0f * log (t)); */
32 lightencolor (guint32 * col, float power)
36 color = (unsigned char *) col;
37 *color = lighten (*color, power);
39 *color = lighten (*color, power);
41 *color = lighten (*color, power);
43 *color = lighten (*color, power);
49 genline (int id, float param, GMUnitPointer * l, int rx, int ry)
55 for (i = 0; i < 512; i++) {
56 l[i].x = ((float) i * rx) / 512.0f;
58 l[i].angle = M_PI / 2.0f;
62 for (i = 0; i < 512; i++) {
63 l[i].y = ((float) i * ry) / 512.0f;
69 for (i = 0; i < 512; i++) {
72 l[i].angle = 2.0f * M_PI * (float) i / 512.0f;
73 cosa = param * cos (l[i].angle);
74 sina = param * sin (l[i].angle);
75 l[i].x = ((float) rx / 2.0f) + cosa;
76 l[i].y = (float) ry / 2.0f + sina;
87 return (230 << (ROUGE * 8)) | (120 << (VERT * 8)) | (18 << (BLEU * 8));
89 return (120 << (VERT * 8)) | (252 << (ROUGE * 8)) | (18 << (BLEU * 8));
91 return (160 << (VERT * 8)) | (236 << (ROUGE * 8)) | (40 << (BLEU * 8));
93 return (40 << (BLEU * 8)) | (220 << (ROUGE * 8)) | (140 << (VERT * 8));
95 return (200 << (VERT * 8)) | (80 << (ROUGE * 8)) | (18 << (BLEU * 8));
97 return (250 << (BLEU * 8)) | (30 << (VERT * 8)) | (80 << (ROUGE * 8));
99 return (16 << (BLEU * 8)) | (16 << (VERT * 8)) | (16 << (ROUGE * 8));
105 goom_lines_set_res (GMLine * gml, int rx, int ry)
111 genline (gml->IDdest, gml->param, gml->points2, rx, ry);
117 goom_lines_move (GMLine * l)
120 unsigned char *c1, *c2;
122 for (i = 0; i < 512; i++) {
123 l->points[i].x = (l->points2[i].x + 39.0f * l->points[i].x) / 40.0f;
124 l->points[i].y = (l->points2[i].y + 39.0f * l->points[i].y) / 40.0f;
126 (l->points2[i].angle + 39.0f * l->points[i].angle) / 40.0f;
129 c1 = (unsigned char *) &l->color;
130 c2 = (unsigned char *) &l->color2;
131 for (i = 0; i < 4; i++) {
136 *c1 = (unsigned char) ((cc1 * 63 + cc2) >> 6);
141 l->power += l->powinc;
142 if (l->power < 1.1f) {
144 l->powinc = (float) (goom_irand (l->goomInfo->gRandom, 20) + 10) / 300.0f;
146 if (l->power > 17.5f) {
148 l->powinc = -(float) (goom_irand (l->goomInfo->gRandom, 20) + 10) / 300.0f;
151 l->amplitude = (99.0f * l->amplitude + l->amplitudeF) / 100.0f;
155 goom_lines_switch_to (GMLine * gml, int IDdest,
156 float param, float amplitude, int col)
158 genline (IDdest, param, gml->points2, gml->screenX, gml->screenY);
159 gml->IDdest = IDdest;
161 gml->amplitudeF = amplitude;
162 gml->color2 = getcouleur (col);
166 goom_lines_init (PluginInfo * goomInfo, int rx, int ry,
167 int IDsrc, float paramS, int coulS, int IDdest, float paramD, int coulD)
169 GMLine *l = (GMLine *) malloc (sizeof (GMLine));
171 l->goomInfo = goomInfo;
173 l->points = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer));
174 l->points2 = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer));
180 l->amplitude = l->amplitudeF = 1.0f;
182 genline (IDsrc, paramS, l->points, rx, ry);
183 genline (IDdest, paramD, l->points2, rx, ry);
185 l->color = getcouleur (coulS);
186 l->color2 = getcouleur (coulD);
194 goom_lines_switch_to (l, IDdest, paramD, 1.0f, coulD);
200 goom_lines_free (GMLine ** l)
208 goom_lines_draw (PluginInfo * plug, GMLine * line, gint16 data[512], Pixel * p)
212 guint32 color = line->color;
213 GMUnitPointer *pt = &(line->points[0]);
215 float cosa = cos (pt->angle) / 1000.0f;
216 float sina = sin (pt->angle) / 1000.0f;
218 lightencolor (&color, line->power);
220 x1 = (int) (pt->x + cosa * line->amplitude * data[0]);
221 y1 = (int) (pt->y + sina * line->amplitude * data[0]);
223 for (i = 1; i < 512; i++) {
225 GMUnitPointer *pt = &(line->points[i]);
227 float cosa = cos (pt->angle) / 1000.0f;
228 float sina = sin (pt->angle) / 1000.0f;
230 x2 = (int) (pt->x + cosa * line->amplitude * data[i]);
231 y2 = (int) (pt->y + sina * line->amplitude * data[i]);
233 plug->methods.draw_line (p, x1, y1, x2, y2, color, line->screenX,
239 goom_lines_move (line);