vec4 RGBtoHSV(in vec4 o) {
	float MAX = max(max(o.r, o.g), o.b);
	float MIN = min(min(o.r, o.g), o.b);
	float h;
	if(MAX==MIN) { h=0.0; }
	else if(o.r>o.g && o.r>o.b) { h=60.0*(o.g-o.b)/(MAX-MIN)+360.0; }
	else if(o.g>o.b) { h=60.0*(o.b-o.r)/(MAX-MIN)+120.0; }
	else { h=60.0*(o.r-o.g)/(MAX-MIN)+240.0; }
	h = mod(h, 360.0);
	float v = MAX, s;
	if(MAX==MIN) { s=0.0; } else { s=(MAX-MIN)/MAX; }
	return vec4(h, s, v, o.a);
}

vec4 HSVtoRGB(in vec4 o) {
	int hi = int(floor(o[0]/60.0));
	float f = (o[0]/60.0)-float(hi), p = o[2]*(1.0-o[1]), q = o[2]*(1.0-f*o[1]), t = o[2]*(1.0-(1.0-f)*o[1]);
	if(hi==0){ return vec4(o[2],t,p,o[3]); }
	else if(hi==1){ return vec4(q,o[2],p,o[3]); }
	else if(hi==2){ return vec4(p,o[2],t,o[3]); }
	else if(hi==3){ return vec4(p,q,o[2],o[3]); }
	else if(hi==4){ return vec4(t,p,o[2],o[3]); }
	else if(hi==5){ return vec4(o[2],p,q,o[3]); }
}

in float dh, ds, dv;
void main(void) {
	vec4 hsv = RGBtoHSV(getPix());
	hsv[0] = mod(hsv[0]+dh/2.0/PI*360.0, 360.0);
	hsv[1] = hsv[1]+ds;
	hsv[2] = hsv[2]+dv;
	pix(HSVtoRGB(hsv));
}
