From a92fdaaa2dbf0a3fb36d53f89f5d399f4081d34a Mon Sep 17 00:00:00 2001 From: Alexandre Date: Tue, 2 Jul 2024 18:46:43 +0200 Subject: [PATCH] fixed a major bug when parsing maze would kill any first chunk's cube --- a.out | Bin 284703 -> 292968 bytes display.cmi | Bin 11532 -> 13133 bytes display.cmo | Bin 36173 -> 46370 bytes display.ml | 197 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 190 insertions(+), 7 deletions(-) diff --git a/a.out b/a.out index 4b2a829c8461991d8a5d2711504374a611669ae2..cb14ea3cabaa5cf90b17fad3e22bca0e5c6c2858 100755 GIT binary patch delta 8008 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 Tnezfi8k_}I)n1M^ID`KJ)LK=U delta 2260 zcmZ8id2Ezb5a0LaZRu`zOSgb)S?NNXSV%RsoK>z^8_<$KLZZ|FRyhP>vHU?I38YJ! zCRQ=gw7^7SMB{;i+6#H*uth<@qAf_3qgDzYg|(?k{S zs)B&WOS~jP4B-)i5B)8|hedS|iyvxu*v%!_31bNg3#%btRAW;$WQZEHs=+7rqOS&g z?qRe(j^HG$!FeaZml;d1S%hY)gF~bcIGmf1N*F<4`wGJIggh*-f$8E~Y^ni24r<6r z+Glnd-2@$Kf~dvvT396Zhj(@Wz5C&eI2f+$P^d1QasaxVdg4j=NP3o25*HzdFqQBf z=C{IhtZRY~L>)FYLK+sIf)Y{B_KfnPK^Nwhf(z%LhEj2u34Yyk8eW#}@2RdhitrL) zCoXTMB1-kaW+(*l19!)Z+2`NR!}Fo@RJ%l;J97T#eEe1qEXwhq7Uj5FB$c+k$*|td>?is z{%!PsjQlrb&&8r%n#rPm$VqHBD_4xX8e+`B(E~72c1V0;0G1_on#C?7uNhJYldj9{ zgU}~$NbDbksj^$*WQ*iYi3JuU%UcrPv0$RSE%7kxcO|_7 z+}5Th+Jlt9je&mf#&EBDrJgKQvJictIh6M$u9GTP_Dg+8Dk==kszNDBac8XyS!$PUN*bt|dh*(T>skHKAdlDu%2QAA%lym|=_XaGB zx9XrUES*Ni;hQcsJ#e0uAEY0P(mx|Tk=*zmU^$$?p=tlN;wbKnD7~#e?8|*%AKvRq zvT+O#f#Su70`nr3Wy{3{ZsiNC>Kj_qQqnmF=Z_~u@@E=*B=*=SzZlZlhx;Gl1cO6k zH%IB^K`TC#EaFg%_uMKYGwbe9KYNsZ=FZUdk8x4F^4m+v?8Kd2();*<+m;nal_U@z ztco{&>()^3Vyur>UQc$E`90lEX7Th>H!X_~BvRuT(m8ZQcSh+w-9y7~$Jq(g=S(uQ z8&~s?ap!YwxDoCf-}$^Y$w;12PQexX3@73rnGcS`K0InH`Jci*{O?$QEgaX(+pN$) zN;)oP2xg|Dg0B3@4^P@9BsVf9)yhvN0FRe6qtNgErsZryUEwHM{WnQGHa YeB}*w6riUB$8Vr}Fa0b&yFrcp52_Cv=l}o! diff --git a/display.cmi b/display.cmi index 2ac8bc48e77c40e4c5ab15461bdb62eeabd8aa6f..ac4935ee4cc762ad4283d2718b254ef4f1e5cf01 100644 GIT binary patch literal 13133 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 F{{ySV%ijP1 literal 11532 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 S92P_C7Qd{|r;qp!$NvFJS6UnZ 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