View Single Post
Old 12-04-2018, 09:21 AM   #14
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 15,721
Default

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

Last edited by Justin; 12-04-2018 at 10:14 AM.
Justin is offline   Reply With Quote