module Pov = Povray module PovColor = Pov.Color module PovMesh = Pov.Mesh module PovCol = PovColor module PovDesc = Pov.Desc let () = Random.self_init () let get_triangles s s2 = [ ( (-. s, 0.0, s), (0.0, s2, 0.0), ( s, 0.0, s) ); ( ( s, 0.0, s), (0.0, s2, 0.0), ( s, 0.0, -. s) ); ( ( s, 0.0, -. s), (0.0, s2, 0.0), (-. s, 0.0, -. s) ); ( (-. s, 0.0, -. s), (0.0, s2, 0.0), (-. s, 0.0, s) ); ] let m2 = get_triangles 0.2 1.0 let mesh_color2 = PovColor.RGB(0.1, 0.6, 0.1) let bg_color = PovColor.RGB(0.2, 0.1, 0.4) let light_color1 = PovColor.RGB(0.8, 0.8, 0.6) let light_color2 = PovColor.RGB(0.6, 0.6, 0.4) let cam_loc = (1.8, 4.8, 2.4) let look_at = (0.0, 0.6, 0.0) let _scale v = (v, v, v) let rand_num (a, b) = a +. (Random.float (b -. a +. 1.0)) let () = let sc = Pov.new_scene () in let sc = Pov.add_include sc ~inc: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 (* plane *) let texture = let color1 = PovColor.RGB(0.80, 0.30, 0.10) in let color2 = PovColor.RGB(0.86, 0.34, 0.12) in Pov.new_checker ~color1 ~color2 () in let sc = Pov.add_plane sc ~norm:(0, 1, 0) ~dist:(0) ~texture () in let sph_color = PovColor.RGB(0.2, 1.0, 0.2) in let texture = Pov.new_texture ~color:sph_color () in let sc = Pov.add_sphere sc ~center:(0.0, 0.0, 0.0) ~radius:0.6 ~translate:(0.0, 0.0, 0.0) ~scale:(_scale 1.2) ~texture () in (* spheres *) let radius = 0.1 in let center = (0.0, 0.0, 0.0) in let scale = Some (_scale 0.6) in let scale2 = Some (_scale 0.4) in let translate = Some (-0.8, 0.0, -0.4) in let sph_color2 = PovColor.RGB(0.0, 0.1, 1.0) in let sph_color3 = PovColor.RGB(1.0, 0.0, 0.1) in let sph_color4 = PovColor.RGB(1.0, 1.0, 0.0) in let texture = Pov.new_texture ~color:sph_color2 () in (* spheres-a *) let sc = PovDesc.add_descs sc [ Pov.Sphere (radius, center, texture, translate, scale) ] in let sphs = List.init 52 (fun _ -> let x = rand_num (-2.4, -0.8) in let z = rand_num (-1.8, -0.2) in let translate = Some (x, 0.0, z) in Pov.Sphere (radius, center, texture, translate, scale) ) in let sc = PovDesc.add_descs sc sphs in (* spheres-b *) let texture2 = Pov.new_texture ~color:sph_color3 () in let sphs = List.init 36 (fun _ -> let x = rand_num (-2.6, -1.2) in let z = rand_num (-1.6, 0.2) in let translate = Some (x, 0.0, z) in Pov.Sphere (radius, center, texture2, translate, scale) ) in let sc = PovDesc.add_descs sc sphs in (* spheres-c *) let texture3 = Pov.new_texture ~color:sph_color4 () in let sphs = List.init 48 (fun _ -> let x = rand_num (-3.6, -2.4) in let z = rand_num (-0.8, 0.8) in let translate = Some (x, 0.0, z) in Pov.Sphere (radius, center, texture3, translate, scale2) ) in let sc = PovDesc.add_descs sc sphs in (* mesh *) let ms = List.init 76 (fun _ -> let x = rand_num (0.2, 2.2) in let z = rand_num (-1.4, 1.4) in let a = rand_num (0.0, 180.0) in ((x, 0.0, z), (0.0, a, 0.0)) ) in let texture = Pov.new_texture ~color:mesh_color2 () in let sc = List.fold_left (fun sc (translate, rotate) -> PovMesh.add_mesh sc ~triangles:m2 ~texture ~translate ~rotate () ) sc ms in (* [ (2.0, 0.0, 0.0), (0.0, 90.0, 0.0); ] *) Pov.print_scene sc; ;;