include <constants/all.scad> use <layout/layout.scad> use <soften/hole.scad> use <soften/cylinder.scad>

function fillet_fn(fn, r) = ceil(min(max(fn, 12), r*6) / 4) * 8;

module fillet(length, r, axis=x_axis) {

$fn = fillet_fn($fn, r);
rotates = [[0,90,0],[90,0,0],[0,0,0]];
mirrors = [[0,0,1],[0,1,0],[0,0,0]];
mirror(mirrors[axis])
  rotate(rotates[axis])
    linear_extrude(length)
      fillet_profile(r, 90);

}

module circular_fillet(d,r=5, angle=360,fillet_angle=90) {

rotate_extrude(angle=angle)
  translate([d/2,0])
    fillet_profile(r,fillet_angle, $fn = fillet_fn($fn, r));

}

module fillet_corner(r=0) {

render() intersection() {
    fillet(r+epsilon, r, x_axis);
    fillet(r+epsilon,r,y_axis);
}

}

module fillet_profile(r, angle) {

$fn = fillet_fn($fn, r);
chord = r * sin(angle/2);
leg = tan(90-angle/2)*r;
rotate(-angle/2)
  difference() {
    rotate(angle/2)
      polygon([
        [-epsilon, -epsilon],
        [-epsilon, leg], [0,leg],
        [sin(angle)*leg, cos(angle)*leg],
        [sin(angle)*leg, cos(angle)*leg-epsilon]
      ]);
    translate([0,r/cos(90-angle/2)])
      circle(r=r);
  }

}

module filleted_cube(size, fillet_r=0) {

translate([0,0,-epsilon/2])
  cube(size+[0,0,epsilon], center=true);
mirror_y() {
  translate([-size[0]/2,size[1]/2,-size[2]/2]) fillet(size[0],fillet_r,x_axis);
}
mirror_x() {
    translate([size[0]/2,-size[1]/2,-size[2]/2]) fillet(size[1],fillet_r,y_axis);
}

mirror_xy() {
    translate([size[0]/2, size[1]/2, -size[2]/2]) fillet_corner(fillet_r);
}

}

module inside_fillets(size, fillet_r=0) {

$fn = fillet_fn($fn, fillet_r);
mirror_y() {
  translate([-size[0]/2,-size[1]/2,0]) fillet(size[0],fillet_r,x_axis);
}
mirror_x() {
    translate([-size[0]/2,-size[1]/2,0]) fillet(size[1],fillet_r,y_axis);
}

// vericals only if h>0?
mirror_xy() {
  translate([-size[0]/2,-size[1]/2,0]) fillet(size[2],fillet_r,z_axis);
}

// FIXME: extract this into some sort of inside_fillet()-type module
mirror_xy() {
   difference() {
      translate([-size[0]/2,-size[1]/2,0]) cube([fillet_r,fillet_r,fillet_r]);
      translate([-size[0]/2+fillet_r,-size[1]/2+fillet_r,fillet_r]) sphere(r=fillet_r);
   }
}

}