view
 eye      -50    0   100
 target     0    0    0
 screen   199   23.5  0

light
 amb    0.4    1.0 0.9 0.8
 para   0.9    1.0 0.95 0.75      1 1 1
 back   0.5    0.6 0.7

attribute
 aka      kd 1 0 0   ks 1 1 1   ct 0 0 0   hl 12   cn 1
 ao       kd 0 0 1   ks 1 1 1   ct 0 0 0   hl 12   cn 1
 ki       kd 1 1 0   ks 1 1 1   ct 0 0 0   hl 12   cn 1
 midori   kd 0 1 0   ks 1 1 1   ct 0 0 0   hl 12   cn 1
 white    kd 1 1 1   ks 1 1 1   ct 0 0 0   hl 12   cn 1
 sora     kd 0.2 0.2 0.6   ct 1 1 1
 paper    kd 1 0.95 0.85   ks 0.0 0.0 0.0   ct 0 0 0   hl 1   cn 1
 uspaper  kd 0.6 0.6 0.6   ks 0.0 0.0 0.0   ct 0.4 0.4 0.4   hl 1   cn 1.0  trace
 plastic  kd 1 0.95 0.85   ks 0.2 0.2 0.2   ct 0 0 0   hl 30  cn 1 trace
 tile_blue    kd 0.2 0.4 0.8   ks 0.6 0.6 0.6   ct 0 0 0   hl 40   cn 1
 grout_white  kd 0.9 0.9 0.9   ks 0.0 0.0 0.0   ct 0 0 0   hl 1    cn 1

structure
 side_x_plus  = plane 1 0 0 mx 1
 side_y_plus  = plane 0 1 0 my 1
 side_z_plus  = plane 0 0 1 mz 1
 side_x_minus = plane 1 0 0 sx -1 mx -1
 side_y_minus = plane 0 1 0 sy -1 my -1
 side_z_minus = plane 0 0 1 sz -1 mz -1
 mycube = side_x_plus & side_y_plus & side_z_plus & side_x_minus & side_y_minus & side_z_minus

 inf_cylinder = ellip 1 0 1
 disk_top     = plane 0 1 0 my 12.5
 disk_bottom  = plane 0 1 0 sy -1 my -12.5
 my_disk      = inf_cylinder & disk_top & disk_bottom
 CD = ((my_disk scale 10 1 10) - (my_disk scale 3 3 3)) rz 90 att paper

 cutter_unit = mycube scale 1.5 1.5 1 rz 45
 c1 = cutter_unit scale 2 6 1 move -12 -10 0
 c2 = cutter_unit scale 3 4 1 move  -8 -10 0
 c3 = cutter_unit scale 4 3 1 move  -4 -10 0
 c4 = cutter_unit scale 2 1 1 move   0 -10 0
 c5 = cutter_unit scale 5 2 1 move   4 -10 0
 c6 = cutter_unit scale 2 4 1 move   8 -10 0
 c7 = cutter_unit scale 1 2 1 move  12 -10 0
 serrated_blade = c1 | c2 | c3 | c4 | c5 | c6 | c7
 dpaper = (mycube scale 12.5 10 0.02) - serrated_blade
 toilet_paper = (CD + ((dpaper) move 0 -10 10 att uspaper))

 cov_out   = ellip 0 12 12
 cov_in    = ellip 0 10.5 10.5
 cov_shell = cov_out - cov_in
 cov_front_half = cov_shell & (plane 0 0 -1)
 flat_board     = mycube scale 13 0.75 10 move 0 11.25 -10
 holder_cover_shape = cov_front_half | flat_board

 cov_cut_btm = plane 0 -1 0
 cov_side_R  = plane  1 0 0 mx  13
 cov_side_L  = plane -1 0 0 mx -13
 final_cover = (holder_cover_shape & cov_cut_btm & cov_side_R & cov_side_L)

 cover_outer = ellip 0 12 12
 cover_straight_part = mycube scale 2 12 10 move 0 0 -10
 cover_curved_part   = cover_outer & (plane 0 0 -1)
 cover_base_shape    = cover_curved_part | cover_straight_part

 cut_bottom = plane 0 -1 0
 cut_right  = plane  1 0 0 mx  1
 cut_left   = plane -1 0 0 mx -1
 side_cover = (cover_base_shape & cut_right & cut_left)
 cover = (final_cover + (side_cover mx 14.5) + (side_cover mx -14.5)) att plastic

 unit_tile  = mycube scale 4.75 4.75 0.1
 back_grout = (mycube scale 25 25 0.5 move 0 0 -0.5) att grout_white

 t1 = unit_tile move -20 0 0
 t2 = unit_tile move -10 0 0
 t3 = unit_tile move   0 0 0
 t4 = unit_tile move  10 0 0
 t5 = unit_tile move  20 0 0
 tile_row = t1 | t2 | t3 | t4 | t5

 r1 = tile_row move 0 -20 0
 r2 = tile_row move 0 -10 0
 r3 = tile_row move 0   0 0
 r4 = tile_row move 0  10 0
 r5 = tile_row move 0  20 0
 tiles_all = (r1 | r2 | r3 | r4 | r5) att tile_blue

 tiled_wall_base = tiles_all + back_grout
 tiled_wall_h     = tiled_wall_base | (tiled_wall_base my 50) | (tiled_wall_base my -50)
 tiled_wall_final = tiled_wall_h    | (tiled_wall_h mx 50)    | (tiled_wall_h mx -50)

 wall_back = tiled_wall_final move 0 0 -75
 wall_right = tiled_wall_final ry -90 move 75 0 0
 wall = (wall_back | wall_right) move 0 0 20

member
 cover toilet_paper wall.