module Pov = Povray module PovInc = Pov.Inc_file module PovColor = Pov.Color module PovMesh = Pov.Mesh module PovCol = PovColor module PovDesc = Pov.Desc let () = Random.self_init () let _scale v = (v, v, v) let rand_num a b = a +. (Random.float (b -. a)) let bg_color = PovColor.RGB(0.1, 0.1, 0.3) let light_color1 = PovColor.RGB(0.8, 0.8, 0.8) let light_color2 = PovColor.RGB(0.6, 0.6, 0.6) let cam_loc = (6.2, 4.8, 8.6) let look_at = (0.0, 0.0, 0.0) let box_color = PovColor.RGB(0.8, 0.8, 0.76) let () = let sc = Pov.new_scene () in let sc = Pov.add_include sc ~inc:PovInc.Colors in let sc = Pov.add_background sc ~color:bg_color in let sc = Pov.add_camera sc ~location:cam_loc ~look_at in let sc = Pov.add_light_source sc ~location:(3.0, 5.0, 4.0) ~color:light_color1 in let sc = Pov.add_light_source sc ~location:(3.0, 5.0, -4.0) ~color:light_color2 in let sc = Pov.add_ambient_light sc ~color:(0.2, 0.1, 0.3) in let sc = Pov.add_ambient_light sc ~color:(0.4, 0.2, 0.6) in let sc = Pov.add_ambient_light sc ~color:(0.6, 0.4, 0.8) in let color1 = PovColor.RGB(0.1, 0.6, 0.2) in let color2 = PovColor.RGB(0.2, 0.6, 0.1) in let texture = Pov.new_checker ~color1 ~color2 () in let sc = Pov.add_plane sc ~norm:(0, 1, 0) ~dist:(0) ~texture () in let color = PovColor.RGB(0.8, 0.8, 0.76) in let texture = Pov.new_texture ~color () in let rotation = None in let scale = None in (* Boxes *) let mk_box ~cn ~h ~tr:translation () = let corner1 = (-.cn, 0.0, -.cn) in let corner2 = ( cn, h, cn) in Pov.Box (corner1, corner2, texture, translation, rotation, scale) in let rec aux acc n = if n < 0 then acc else let x = (float (Random.int 40)) /. 10.0 in let z = (float (Random.int 20)) /. 10.0 in let h = (float (Random.int 6)) /. 10.0 in let desc = mk_box ~cn:0.1 ~h:(h) ~tr:(Some(x, 0.0, z)) () in aux (desc :: acc) (pred n) in let descs = aux [] 36 in let sc = PovDesc.add_descs sc ( [ mk_box ~cn:0.4 ~h:0.9 ~tr:(Some(0.0, 0.0, 0.0)) (); mk_box ~cn:0.3 ~h:0.8 ~tr:(Some(2.2, 0.0, -0.8)) (); mk_box ~cn:0.2 ~h:0.4 ~tr:(Some(1.7, 0.0, 1.2)) (); mk_box ~cn:0.2 ~h:0.5 ~tr:(Some(2.0, 0.0, 0.8)) (); ] @ descs ) in (* Spheres *) let texture = Pov.new_texture ~color:(PovCol.RGB(0.2, 0.7, 0.2)) () in let mk_sphere ~cn ~h ~tr:translation () = let radius = 0.08 in let center = (0.0, 0.04, 0.0) in Pov.Sphere (radius, center, texture, translation, scale) in let rec aux acc n = if n < 0 then acc else let x = (float (Random.int 60)) /. 10.0 in let z = (float (Random.int 40)) /. 10.0 in let h = (float (Random.int 2)) /. 10.0 in let desc = mk_sphere ~cn:0.1 ~h:(h) ~tr:(Some(x, 0.0, z)) () in aux (desc :: acc) (pred n) in let descs = aux [] 54 in let sc = PovDesc.add_descs sc ( descs ) in Pov.print_scene sc; ;;