aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rwxr-xr-xsrc/color-utils.c91
-rwxr-xr-xsrc/objects.c40
3 files changed, 128 insertions, 5 deletions
diff --git a/README.md b/README.md
index c54ca3b..5f7e640 100644
--- a/README.md
+++ b/README.md
@@ -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;