diff --git a/a.out b/a.out index 4b2a829..cb14ea3 100755 Binary files a/a.out and b/a.out differ diff --git a/display.cmi b/display.cmi index 2ac8bc4..ac4935e 100644 Binary files a/display.cmi and b/display.cmi differ diff --git a/display.cmo b/display.cmo index d3deac8..69132c2 100644 Binary files a/display.cmo and b/display.cmo differ diff --git a/display.ml b/display.ml index 61a4b72..aba3b5d 100644 --- a/display.ml +++ b/display.ml @@ -124,7 +124,7 @@ type pt_2d = {mutable x : float ; mutable y : float} ;; type coloredCube = {cube : pt_3d array ; red : int ; green : int ; blue : int} ;; let dyn_create i = - {tab = Array.make 10 i ; len = 0 ; memlen = 10} ;; + {tab = Array.make 100 i ; len = 0 ; memlen = 100} ;; let dyn_append arr elt = let fct x = @@ -134,6 +134,8 @@ let dyn_append arr elt = arr.tab.(0) in if arr.len = arr.memlen then begin + Stdlib.print_endline "resized"; + Unix.sleepf 0.5; let newarr = Array.init (2 * arr.memlen) fct in arr.memlen <- 2 * arr.memlen; arr.tab <- newarr @@ -453,7 +455,7 @@ let draw_multiples_cubes_colored_hash (dyna : coloredCube dynamic) screen_wd scr swap dyna.tab i !idmax; done; for i = 0 to n-1 do - (*Printf.printf "(%d, %d, %d)" (dyna.tab.(i).red) (dyna.tab.(i).green) (dyna.tab.(i).blue); + (*Printf.printf "drawing (%f, %f, %f)" (dyna.tab.(i).cube.(0).x) (dyna.tab.(i).cube.(0).y) (dyna.tab.(i).cube.(0).z); Stdlib.print_endline " ";*) draw_cube_p (dyna.tab.(i).cube) screen_wd screen_ht fov (dyna.tab.(i).red) (dyna.tab.(i).green) (dyna.tab.(i).blue) done ;; @@ -543,13 +545,13 @@ done ;; let n_walls = ref (width*height*depth) ;; let ctc_one x = - if x > 0 then + if x >= 0 then x / chunk_size else x / chunk_size -1 ;; let ctcf_one x = - if x > 0. then + if x >= 0. then int_of_float (x /. chunk_size_f) else int_of_float (x /. chunk_size_f) -1 ;; @@ -600,6 +602,25 @@ let is_collision_hash (cam_coords : pt_3d) (cubes : coloredCube dynamic) = done; !res ;; +let is_collision_hash_2 (cam_coords : pt_3d) (rcubes : (coloredCube dynamic) option) = match rcubes with + | None -> false + | Some cubes -> begin + let res = ref false in + let n = cubes.len in + + let distances = Array.make n 0. in + + for i = 0 to n-1 do + distances.(i) <- cube_dist cubes.tab.(i).cube; + done ; + + for i = 0 to n-1 do + if not !res && distances.(i) < 2. then + res := is_collision_cube cam_coords cubes.tab.(i).cube + done; + !res + end ;; + let convert_laby laby = let width = Array.length laby and height = Array.length laby.(0) @@ -626,6 +647,64 @@ let convert_laby laby = done; (cubes, reds, greens, blues) ;; +let chunkify_2 laby sz = + let width = Array.length laby + and height = Array.length laby.(0) + and depth = Array.length laby.(0).(0) in + + let cubes = Hashtbl.create 300 in + + let add_to_table w h d r g b= + (*Printf.printf "(%d, %d, %d) (%d, %d, %d)\n" w h d cw ch cd;*) + let (cw, ch, cd) = coords_to_chunk (w*sz) (h*sz) (d*sz) in + match Hashtbl.find_opt cubes (cw, ch, cd) with + | None -> begin + Printf.printf "created cube (%d, %d, %d) (%d)\n" (w*sz) (h*sz) (d*sz) sz; + Printf.printf "in chunk (%d, %d, %d)\n" cw ch cd; + Stdlib.print_endline " "; + let dyna = dyn_create {cube = create_cube (w*sz) (h*sz) (d*sz) sz; red = r; green = g; blue = b} in + dyn_append dyna {cube = create_cube (w*sz) (h*sz) (d*sz) sz; red = r; green = g; blue = b}; + Hashtbl.add cubes (cw, ch, cd) dyna + end + | Some dyna -> begin + Printf.printf "created cube (%d, %d, %d) (%d)\n" (w*sz) (h*sz) (d*sz) sz; + Printf.printf "in chunk (%d, %d, %d)\n" cw ch cd; + Stdlib.print_endline " "; + Hashtbl.remove cubes (cw, ch, cd); + dyn_append dyna {cube = create_cube (w*sz) (h*sz) (d*sz) sz; red = r; green = g; blue = b}; + Hashtbl.add cubes (cw, ch, cd) dyna + end + in + + for w = 0 to width-1 do + for h = 0 to height-1 do + for d = 0 to depth-1 do + if laby.(w).(h).(d) <> Free then begin + add_to_table w h d 220 220 220 + end + done + done + done; + + (* + let s = ref 0 in + for i = 0 to 2 do + for j = 0 to 2 do + for k = 0 to 2 do + let nc = ((Hashtbl.find cubes (i, j, k)).len) in + Printf.printf "len for (%d, %d, %d) : %d" i j k nc; + s := !s + nc; + Stdlib.print_endline " " + done + done + done; + Printf.printf "s = %d" !s; + Stdlib.print_endline " "; + *) + + (*Unix.sleepf 100.0;*) + cubes ;; + let chunkify laby sz = let width = Array.length laby and height = Array.length laby.(0) @@ -780,13 +859,116 @@ let rec move_cam_hash (cubes : coloredCube dynamic) b c =(* Printf.printf "[%b]" | 'e' -> camera_angle_y := !camera_angle_y - 30 | _ -> () ;; +let rec move_cam_hash_2 hash cx cy cz b c =(* Printf.printf "[%b]" b; Stdlib.print_endline " " ; *)match c with + | 'z' -> + camera_xyz.z <- camera_xyz.z +. Float.cos ((float_of_int !camera_angle_y) *. 3.1415926535 /. 180.); + camera_xyz.x <- camera_xyz.x +. Float.sin ((float_of_int !camera_angle_y) *. 3.1415926535 /. 180.); + if b && ( + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+1,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx-1,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy+1,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy-1,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz+1))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz-1))) + ) then move_cam_hash_2 hash cx cy cz false 's' + | 'q' -> + camera_xyz.z <- camera_xyz.z +. Float.cos (((float_of_int !camera_angle_y) +. 90.) *. 3.1415926535 /. 180.); + camera_xyz.x <- camera_xyz.x +. Float.sin (((float_of_int !camera_angle_y) +. 90.) *. 3.1415926535 /. 180.); + if b && ( + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+1,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx-1,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy+1,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy-1,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz+1))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz-1))) + ) then move_cam_hash_2 hash cx cy cz false 'q' + | 's' -> + camera_xyz.z <- camera_xyz.z -. Float.cos ((float_of_int !camera_angle_y) *. 3.1415926535 /. 180.); + camera_xyz.x <- camera_xyz.x -. Float.sin ((float_of_int !camera_angle_y) *. 3.1415926535 /. 180.); + if b && ( + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+1,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx-1,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy+1,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy-1,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz+1))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz-1))) + ) then move_cam_hash_2 hash cx cy cz false 'z' + | 'd' -> + camera_xyz.z <- camera_xyz.z +. Float.cos (((float_of_int !camera_angle_y) -. 90.) *. 3.1415926535 /. 180.); + camera_xyz.x <- camera_xyz.x +. Float.sin (((float_of_int !camera_angle_y) -. 90.) *. 3.1415926535 /. 180.); + if b && ( + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+1,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx-1,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy+1,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy-1,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz+1))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz-1))) + ) then move_cam_hash_2 hash cx cy cz false 'q' + | 'p' -> + camera_xyz.y <- camera_xyz.y -. 1.; + if b && ( + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+1,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx-1,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy+1,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy-1,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz+1))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz-1))) + ) then move_cam_hash_2 hash cx cy cz false 'm' + | 'm' -> + camera_xyz.y <- camera_xyz.y +. 1.; + if b && ( + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+1,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx-1,cy,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy+1,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy-1,cz))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz+1))) || + (is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz-1))) + ) then move_cam_hash_2 hash cx cy cz false 'p' + | 'a' -> camera_angle_y := !camera_angle_y + 30 + | 'e' -> camera_angle_y := !camera_angle_y - 30 + | _ -> () ;; + +let manage_unexisting_chunk hash ch_x ch_y ch_z screen_wd screen_ht fov = + try + draw_multiples_cubes_colored_hash (Hashtbl.find hash (ch_x, ch_y, ch_z)) screen_wd screen_ht fov + with + | Not_found -> () ;; + +let render_chunks hash camx camy camz ch_distance screen_wd screen_ht fov = + let arr = Array.make ((2*ch_distance + 1)*(2*ch_distance + 1)*(2*ch_distance + 1)) ((0, 0), (0, 99)) in + let id = ref 0 in + for i = -ch_distance to ch_distance do + for j = -ch_distance to ch_distance do + for k = -ch_distance to ch_distance do + arr.(!id) <- ((camx+i, camy+j), (camz+k, (abs i) + (abs j) + (abs k))); + incr id + done + done + done; + let sort_fct elt1 elt2 = + (snd (snd elt2)) - (snd (snd elt1)) + in + + Array.sort sort_fct arr ; + for i = 0 to (Array.length arr -1) do + (*Printf.printf "[%d, %d, %d] (%d)" (fst (fst arr.(i))) (snd (fst arr.(i))) (fst (snd arr.(i))) (snd (snd arr.(i))); + Stdlib.print_endline " ";*) + manage_unexisting_chunk hash (fst (fst arr.(i))) (snd (fst arr.(i))) (fst (snd arr.(i))) screen_wd screen_ht fov ; + done ;; + let play_dos laby = try Stdlib.print_endline "Building terrain..."; cheesify laby; Stdlib.print_endline "Converting terrain..."; - let hash = chunkify laby 2 in + let hash = chunkify_2 laby 2 in camera_xyz.z <- -. (1.5) ; camera_xyz.x <- -. (float_of_int width) /. 2. ; @@ -805,7 +987,8 @@ let play_dos laby = let (ch_x, ch_y, ch_z) = coords_to_chunk_f (-. camera_xyz.x) (-. camera_xyz.y) camera_xyz.z in - draw_multiples_cubes_colored_hash (Hashtbl.find hash (ch_x, ch_y, ch_z)) __width__ __height__ fov ; + (*draw_multiples_cubes_colored_hash (Hashtbl.find hash (ch_x, ch_y, ch_z)) __width__ __height__ fov ;*) + render_chunks hash ch_x ch_y ch_z chunk_dist __width__ __height__ fov ; auto_synchronize true; @@ -814,7 +997,7 @@ let play_dos laby = Stdlib.print_endline " "; let usr_input = get1char () in - move_cam_hash (Hashtbl.find hash (ch_x, ch_y, ch_z)) true usr_input + move_cam_hash_2 hash ch_x ch_y ch_z true usr_input done ; () with