Hmm using sine curves for the shadow/highlight also improves things, I think:
Code:
// Shadow/midtone/highlight hue/saturation/luminance adjust
//@param 1:fade 'fade' 1
//@param 3:h.shadow 'shadow hue' 0 -360 360 0 1
//@param 4:s.shadow 'shadow saturation' 1 0 8 1 .01
//@param 5:y.shadow 'shadow luminance' 0 -256 256 0 1
//@param 6:h.midtone 'midtone hue' 0 -360 360 0 1
//@param 7:s.midtone 'midtone saturation' 1 0 8 1 .01
//@param 8:y.midtone 'midtone luminance' 0 -256 256 0 1
//@param 9:h.highlight 'highlight hue' 0 -360 360 0 1
//@param 10:s.highlight 'highlight saturation'1 0 8 1 .01
//@param 11:y.highlight 'highlight luminance' 0 -256 256 0 1
//@param 13:showc 'show curves' 0 0 1 0.5 1
//@param 14:shadow_curve 'shadow steepness' 1 .5 8 1 .01
//@param 15:midtone_curve 'midtone steepness' 1 .125 8 1 .01
//@param 16:highlight_curve 'highlight steepness' 1 .5 8 1 .01
function curve(w, i) (
w==2?(cos((256-i)/256*$pi)*.5+.5)^highlight_curve:
w==1?sin(i*$pi/256)^midtone_curve:
w==0?(cos(i/256*$pi)*.5+.5)^shadow_curve;
);
fade > 0 || showc ? (
input_info(0,project_w,project_h);
gfx_blit(0);
fade > 0 ? (
i = v = 0;
colorspace='YV12';
loop(256,
i[0] = fade * (curve(0,v)*y.shadow + curve(1,v)*y.midtone + curve(2,v)*y.highlight);
i[1] = sat = 1 + fade*(
(1 + curve(0,v) * (s.shadow - 1)) *
(1 + curve(1,v) * (s.midtone - 1)) *
(1 + curve(2,v) * (s.highlight - 1)) - 1);
ang = (curve(0,v)*h.shadow + curve(1,v)*h.midtone + curve(2,v)*h.highlight) * $pi/180 * fade;
i[2] = cos(ang)*sat;
i[3] = sin(ang)*sat;
v+=1; i+=4;
);
#code = "";
h.shadow || h.midtone || h.highlight ? (
#code += "
_1=((y1+y2+y3+y4)&-4);
u=min(max((_4=(u-128))*(_2=_1[2])+(v-128)*(_3=_1[3])+128,0),255);
v=min(max((v-128)*_2-_4*_3+128,0),255);
";
) : s.shadow!=1 || s.midtone!=1 || s.highlight!=1 ? (
#code += "
_3=((y1+y2+y3+y4)&-4)[1];
u=min(max((u-128)*_3+128,0),255);
v=min(max((v-128)*_3+128,0),255);
";
);
y.shadow || y.midtone || y.highlight ? #code +=
"y1 = min(max(y1+(y1*4)[],0),255);
y2 = min(max(y2+(y2*4)[],0),255);
y3 = min(max(y3+(y3*4)[],0),255);
y4 = min(max(y4+(y4*4)[],0),255);";
gfx_evalrect(0,0,project_w,project_h,#code);
);
showc ? (
x = 32; y = 32;
ysz = 200;
gfx_set(0,0,0,0.85);
gfx_fillrect(x,y,512,ysz);
p=0;
loop(3,
i=0;
gfx_set(.75);
gfx_a=0.4;
loop(256,
v=curve(p,i)*ysz;
gfx_fillrect(x+i*2,y+ysz-v,2,v);
i+=1;
);
p+=1;
);
);
);
Edit: not really, makes other things less usable. hmmmmm