fixed a major bug when parsing maze would kill any first chunk's cube
This commit is contained in:
parent
6da4f7853a
commit
a92fdaaa2d
BIN
display.cmi
BIN
display.cmi
Binary file not shown.
BIN
display.cmo
BIN
display.cmo
Binary file not shown.
197
display.ml
197
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
|
||||
|
|
Loading…
Reference in New Issue