diff options
| -rw-r--r-- | README.md | 2 | ||||
| -rwxr-xr-x | src/color-utils.c | 91 | ||||
| -rwxr-xr-x | src/objects.c | 40 |
3 files changed, 128 insertions, 5 deletions
@@ -37,7 +37,7 @@ Then use something like qpwgraph to to force change the input of ``audio_reactiv - [ ] arguments - [ ] settable average peak - [ ] settable RGB -- [ ] RGB-cycle +- [x] RGB-cycle - [ ] move settable vars to stuff - [ ] ability to set input device with args - [ ] volume of frequency instead of overall diff --git a/src/color-utils.c b/src/color-utils.c new file mode 100755 index 0000000..d01da3a --- /dev/null +++ b/src/color-utils.c @@ -0,0 +1,91 @@ +#ifndef color_utils_c +#define color_utils_c +#include <math.h> + +struct RGB +{ + unsigned char R; + unsigned char G; + unsigned char B; +}; +struct HSV +{ + double H; + double S; + double V; +}; +struct RGB HSVToRGB(struct HSV hsv) { + double r = 0, g = 0, b = 0; + + if (hsv.S == 0) + { + r = hsv.V; + g = hsv.V; + b = hsv.V; + } + else + { + int i; + double f, p, q, t; + + if (hsv.H == 360) + hsv.H = 0; + else + hsv.H = hsv.H / 60; + + i = (int)trunc(hsv.H); + f = hsv.H - i; + + p = hsv.V * (1.0 - hsv.S); + q = hsv.V * (1.0 - (hsv.S * f)); + t = hsv.V * (1.0 - (hsv.S * (1.0 - f))); + + switch (i) + { + case 0: + r = hsv.V; + g = t; + b = p; + break; + + case 1: + r = q; + g = hsv.V; + b = p; + break; + + case 2: + r = p; + g = hsv.V; + b = t; + break; + + case 3: + r = p; + g = q; + b = hsv.V; + break; + + case 4: + r = t; + g = p; + b = hsv.V; + break; + + default: + r = hsv.V; + g = p; + b = q; + break; + } + + } + + struct RGB rgb; + rgb.R = r * 255; + rgb.G = g * 255; + rgb.B = b * 255; + + return rgb; +} +#endif diff --git a/src/objects.c b/src/objects.c index ccc9e25..7cdfb4c 100755 --- a/src/objects.c +++ b/src/objects.c @@ -5,6 +5,7 @@ #include "global_objects.c" #include "objects.h" +#include "color-utils.c" void constructor(int w, int h, OBJECT_INER *obj, float x, float y, float mass){ obj->pos.x = x; @@ -52,8 +53,8 @@ void show(STUFFS *stuff,OBJECT_INER *obj){ Sint16 x = (Sint16)obj->pos.x; Sint16 y = (Sint16)obj->pos.y; - circleRGBA(stuff->renderer, x, y, obj->r, 190, 90, 255, 255); - filledCircleRGBA(stuff->renderer, x, y, obj->r, 150, 50, 255, 80); + circleRGBA(stuff->renderer, x, y, obj->r, 190, 90, 255, (stuff->volume+0.2)*255); + filledCircleRGBA(stuff->renderer, x, y, obj->r, 150, 50, 255, (stuff->volume+0.2)*90); } float calcG(ATTRACTOR *attractor, OBJECT_INER *obj,STUFFS *stuff){ @@ -96,13 +97,45 @@ void attract(ATTRACTOR *attractor, OBJECT_INER *obj,STUFFS *stuff){ applyForce(stuff,obj,force); } +void cycle_hue(STUFFS* stuff, struct RGB* rgb, struct RGB* rgb2){ + static double target_hue=0; + static double hue=0; + static double value=0; + + if(stuff->volume>0.8)target_hue=RandomFloat(0, 360); + hue=hue+(target_hue-hue)/10; + + if(value>1) value=1; + if(value<0) value=0; + if(value<stuff->volume+0.2) value=value+0.1; + if(value>stuff->volume) value=value-0.1; + + struct HSV hsv = {hue, 0.9, value}; + *rgb = HSVToRGB(hsv); + struct HSV hsv2 = {hue, 0.9, 1}; + *rgb2 = HSVToRGB(hsv2); +} + void atr_show(STUFFS *stuff,ATTRACTOR *attr){ + struct RGB main_rgb; + struct RGB border_rgb; + static float dr=0; + cycle_hue(stuff,&main_rgb,&border_rgb); + SDL_SetRenderDrawColor(stuff->renderer, 0,0,0,255); + SDL_RenderFillRect(stuff->renderer, &(SDL_Rect){attr->pos.x - attr->r, attr->pos.y - attr->r, attr->r*2, attr->r*2}); + if(dr<stuff->volume+0.2) dr=dr+0.1; + if(dr>stuff->volume) dr=dr-0.1; + stuff->obj.attractor.r=(dr)*50; + + SDL_SetRenderDrawColor(stuff->renderer, main_rgb.R,main_rgb.G,main_rgb.B,150); SDL_RenderFillRect(stuff->renderer, &(SDL_Rect){attr->pos.x - attr->r, attr->pos.y - attr->r, attr->r*2, attr->r*2}); + + SDL_SetRenderDrawColor(stuff->renderer, border_rgb.R,border_rgb.G,border_rgb.B,255); + SDL_RenderDrawRect(stuff->renderer, &(SDL_Rect){attr->pos.x - attr->r, attr->pos.y - attr->r, attr->r*2, attr->r*2}); } void draw(STUFFS *stuff){ SDL_SetRenderDrawColor(stuff->renderer,0,0,0,50); - //SDL_RenderClear(stuff->renderer); SDL_RenderFillRect(stuff->renderer, &(SDL_Rect){0,0,stuff->width,stuff->height}); static int frame_i1=0; @@ -119,7 +152,6 @@ void draw(STUFFS *stuff){ point_add(&stuff->obj.objs[i]->vel,&rand_p); } } - SDL_SetRenderDrawColor(stuff->renderer, 100,20,20,180); atr_show(stuff,&stuff->obj.attractor); if(frame_i1>100) frame_i1=0; |
