From 6da4f7853a147b63b808205678c84a5ec7c26404 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Tue, 2 Jul 2024 16:24:45 +0200 Subject: [PATCH] added support for custom textures ,but it takes way too long to load :( --- a.out | Bin 281983 -> 284703 bytes display.cmi | Bin 10177 -> 11532 bytes display.cmo | Bin 32491 -> 36173 bytes display.ml | 188 ++++++++++++++++++++++++++++++++++++++--------- image_parsing.py | 26 +++++++ output.txt | 17 +++++ stone.bmp | Bin 0 -> 76938 bytes stoned.bmp | Bin 0 -> 76938 bytes texture404.txt | 3 + 9 files changed, 200 insertions(+), 34 deletions(-) create mode 100644 image_parsing.py create mode 100644 output.txt create mode 100644 stone.bmp create mode 100644 stoned.bmp create mode 100644 texture404.txt diff --git a/a.out b/a.out index 866e6c19577b07a851d7d13bfc19d7dda1e8ae55..4b2a829c8461991d8a5d2711504374a611669ae2 100755 GIT binary patch delta 4850 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 V_bSQekQ$pp{qB%zDd*C<{}&I{ePRFr delta 7717 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 AQ2+n{ diff --git a/display.ml b/display.ml index 853a419..61a4b72 100644 --- a/display.ml +++ b/display.ml @@ -14,6 +14,108 @@ ocamlfind ocamlc -linkpkg -package unix -linkpkg -package graphics -thread -pack (* ------------------------------------------------------------- *) (* ------------------------------------------------------------- *) +type texture = {mutable width : int ; mutable height : int ; mutable arr_red : int array array ; mutable arr_green : int array array ; mutable arr_blue : int array array} ;; + +let parse_texture filename = + let ptr = open_in filename in + let tex = {width = 0 ; height = 0; arr_red = Array.make_matrix 1 1 0; arr_green = Array.make_matrix 1 1 0; arr_blue = Array.make_matrix 1 1 0} in + try + let buffer = ref 0 in + + let side = ref 0 in + + (* read dimensions *) + while !side <> 2 do + let c = input_char ptr in + let code = Char.code c in + if code >= 48 && code <= 57 then begin + buffer := !buffer * 10; + buffer := !buffer + code - 48 + end + else begin + if !side = 0 then + tex.width <- !buffer + else + tex.height <- !buffer; + + incr side; + buffer := 0 + end + done; + + Printf.printf "size is (%d, %d)" tex.width tex.height; + Stdlib.print_endline " "; + + tex.arr_red <- Array.make_matrix (tex.width) (tex.height) 0; + tex.arr_green <- Array.make_matrix (tex.width) (tex.height) 0; + tex.arr_blue <- Array.make_matrix (tex.width) (tex.height) 0; + + (* read data*) + let cred = ref 0 + and cgreen = ref 0 + and cblue = ref 0 in + + let which_color = ref 0 in + + let cur_w = ref 0 + and cur_h = ref 0 in + + while true do + let c = input_char ptr in + let code = Char.code c in + if code >= 48 && code <= 57 then begin (* integer *) + buffer := !buffer * 10; + buffer := !buffer + code - 48 + end + else if c = ',' then begin + if !which_color = 0 then + cred := !buffer + else + cgreen := !buffer; + (* blue is not seen here *) + + incr which_color; + buffer := 0 + end + else if c = ' ' then begin + cblue := !buffer; + + tex.arr_red.(!cur_w).(!cur_h) <- !cred; + tex.arr_green.(!cur_w).(!cur_h) <- !cgreen; + tex.arr_blue.(!cur_w).(!cur_h) <- !cblue; + + incr cur_w; + buffer := 0; + which_color := 0 + end + else if c = '\n' then begin + cblue := !buffer; + + tex.arr_red.(!cur_w).(!cur_h) <- !cred; + tex.arr_green.(!cur_w).(!cur_h) <- !cgreen; + tex.arr_blue.(!cur_w).(!cur_h) <- !cblue; + + incr cur_h; + cur_w := 0; + buffer := 0; + which_color := 0 + end + done; + failwith "Oh so while true can exit on its own..." + with + | End_of_file -> + close_in ptr ; + Printf.printf "Successfully parsed texture "; + Printf.printf "'%s'" filename; + Stdlib.print_endline " "; + tex + | exn -> close_in ptr ; raise exn ;; + +let stone = parse_texture "output.txt" ;; + +(* ------------------------------------------------------------- *) +(* ------------------------------------------------------------- *) + type 'a dynamic = {mutable tab : 'a array ; mutable len : int ; mutable memlen : int} ;; type pt_3d = {mutable x : float ; mutable y : float ; mutable z : float} ;; @@ -42,27 +144,6 @@ let dyn_append arr elt = (* ------------------------------------------------------------- *) (* ------------------------------------------------------------- *) -let matrix_mult m1 m2 = - let n = Array.length m1 - and p = Array.length m1.(0) - and r = Array.length m2 - and s = Array.length m2.(0) in - - let mres = Array.make_matrix n s 0 in - - if p <> r then - failwith "ERROR : matrixes cannot be multipied, maybe try with reversed inputs ?\n" - else begin - for i = 0 to n-1 do - for j = 0 to s-1 do - for k = 0 to p do - mres.(i).(j) <- mres.(i).(j) + m1.(i).(k) + m2.(k).(j) - done - done - done - end; - mres ;; - let abs x = if x >= 0 then x else -x ;; let absf x = if x >= 0. then x else -.(x) ;; @@ -83,7 +164,7 @@ let should_be_drawn (pt : pt_3d) = *) let should_be_drawn_gr (pt : pt_3d) = - pt.z > 0.44 ;; + pt.z > 0.4 ;; let sign x = if x >= 0. then 1. else -. (1.) ;; @@ -95,6 +176,9 @@ let is_cube_behind_camera (cube : pt_3d array) = done; !res ;; +let adapt_to_dims x y = + (max 0 (min __width__ x), max 0 (min __height__ y)) ;; + let debug_1 (smth : pt_3d array) = for i = 0 to Array.length smth -1 do Printf.printf "(%f, %f, %f)" smth.(i).x smth.(i).y smth.(i).z; @@ -109,6 +193,7 @@ let to_graphics (flat : pt_2d array) screen_wd screen_ht = and proj_y = int_of_float ((float_of_int screen_ht) *. (1. +. flat.(k).y) /. 2.) in (*Printf.printf "Converting to (%d %d)" proj_x proj_y; Stdlib.print_endline " ";*) + (*res.(k) <- adapt_to_dims proj_x proj_y;*) res.(k) <- (proj_x, proj_y); done; res ;; @@ -138,8 +223,8 @@ let project (shape : pt_3d array) screen_wd screen_ht fov = res.(k).y <- shape.(k).y /. (shape.(k).z *. Float.tan (((float_of_int fov) *. 3.14159265358 /. 180.) /. 2.)) end else begin - res.(k).x <- (absf shape.(k).x) /. (ar *. (0.44 *. (sign shape.(k).x)) *. Float.tan (((float_of_int fov) *. 3.14159265358 /. 180.) /. 2.)); - res.(k).y <- (absf shape.(k).y) /. ((0.44 *. (sign shape.(k).y)) *. Float.tan (((float_of_int fov) *. 3.14159265358 /. 180.) /. 2.)) + res.(k).x <- (absf shape.(k).x) /. (ar *. (0.4 *. (sign shape.(k).x)) *. Float.tan (((float_of_int fov) *. 3.14159265358 /. 180.) /. 2.)); + res.(k).y <- (absf shape.(k).y) /. ((0.4 *. (sign shape.(k).y)) *. Float.tan (((float_of_int fov) *. 3.14159265358 /. 180.) /. 2.)) end; (*Printf.printf "added (%f %f)" res.(k).x res.(k).y; Stdlib.print_endline " ";*) @@ -185,6 +270,40 @@ let are_faces_behind (cube : pt_3d array) = res.(5) <- (should_be_drawn_gr cube.(3)) || (should_be_drawn_gr cube.(0)) || (should_be_drawn_gr cube.(4)) || (should_be_drawn_gr cube.(7)); (res, res.(0) || res.(1) || res.(2) || res.(3) || res.(4) || res.(5)) ;; +let convex_seg x1 x2 theta maxtheta = + let ratio = (float_of_int theta) /. (float_of_int maxtheta) in + int_of_float ((1. -. ratio) *. (float_of_int x1) +. ratio *. (float_of_int x2)) ;; + +let convex_pt (p1 : int * int) (p2 : int * int) theta maxtheta = + let ratio = (float_of_int theta) /. (float_of_int maxtheta) in + let mid_x = int_of_float ((1. -. ratio) *. (float_of_int (fst p1)) +. ratio *. (float_of_int (fst p2))) + and mid_y = int_of_float ((1. -. ratio) *. (float_of_int (snd p1)) +. ratio *. (float_of_int (snd p2))) in + (mid_x, mid_y) ;; + +let draw_texture (rect : (int * int) array) (text : texture) light = + (*set_color white; + fill_poly rect ;;*) + for i = 0 to text.width -1 do + for j = 0 to text.height -1 do + let face_R = int_of_float ((float_of_int text.arr_red.(i).(j)) *. light) + and face_G = int_of_float ((float_of_int text.arr_green.(i).(j)) *. light) + and face_B = int_of_float ((float_of_int text.arr_blue.(i).(j)) *. light) in + set_color (rgb face_R face_G face_B); + + let pt_a = convex_pt rect.(0) rect.(1) i text.width + and pt_b = convex_pt rect.(0) rect.(1) (i+1) text.width + + and pt_e = convex_pt rect.(3) rect.(2) (i+1) text.width + and pt_f = convex_pt rect.(3) rect.(2) i text.width in + + let bot_left = convex_pt pt_a pt_f j text.height + and bot_right = convex_pt pt_b pt_e j text.height + and top_left = convex_pt pt_a pt_f (j+1) text.height + and top_right = convex_pt pt_b pt_e (j+1) text.height in + fill_poly [|bot_left; bot_right; top_right; top_left|] + done + done ;; + let draw_cube_p (cube : pt_3d array) screen_wd screen_ht fov r g b = let adjusted = adjust_to_camera cube in let (draw_faces, draw_cube) = are_faces_behind adjusted in @@ -204,18 +323,18 @@ let draw_cube_p (cube : pt_3d array) screen_wd screen_ht fov r g b = |] in let order = [| - [|graphed.(0); graphed.(1); graphed.(2); graphed.(3); graphed.(0)|]; - [|graphed.(4); graphed.(5); graphed.(6); graphed.(7); graphed.(4)|]; - [|graphed.(0); graphed.(1); graphed.(5); graphed.(4); graphed.(0)|]; - [|graphed.(1); graphed.(2); graphed.(6); graphed.(5); graphed.(1)|]; - [|graphed.(2); graphed.(3); graphed.(7); graphed.(6); graphed.(2)|]; - [|graphed.(3); graphed.(0); graphed.(4); graphed.(7); graphed.(3)|]; + [|graphed.(0); graphed.(1); graphed.(2); graphed.(3)|]; + [|graphed.(4); graphed.(5); graphed.(6); graphed.(7)|]; + [|graphed.(0); graphed.(1); graphed.(5); graphed.(4)|]; + [|graphed.(1); graphed.(2); graphed.(6); graphed.(5)|]; + [|graphed.(2); graphed.(3); graphed.(7); graphed.(6)|]; + [|graphed.(3); graphed.(0); graphed.(4); graphed.(7)|]; |] in (* Note : edge orders must be as following : 7--------6 /| /| - / | / | + / | / | 4--------5 | | | | | | 3-----|--2 @@ -246,6 +365,7 @@ let draw_cube_p (cube : pt_3d array) screen_wd screen_ht fov r g b = and face_B = int_of_float ((float_of_int b) *. light) in set_color (rgb face_R face_G face_B); fill_poly order.(i); + (*draw_texture order.(i) stone light ;*) set_color black; draw_poly_line order.(i); end @@ -401,7 +521,7 @@ type tile = Free | Wall | Crate | Exit | Craxit | Camera ;; let width = 15 and height = 15 -and depth = 45 ;; +and depth = 15 ;; (* dimensions *) let render_distance = 7 ;; @@ -665,7 +785,7 @@ let play_dos laby = Stdlib.print_endline "Building terrain..."; cheesify laby; - Stdlib.print_endline "Rendering terrain..."; + Stdlib.print_endline "Converting terrain..."; let hash = chunkify laby 2 in camera_xyz.z <- -. (1.5) ; @@ -677,11 +797,11 @@ let play_dos laby = while true do ignore (Sys.command "clear") ; + Stdlib.print_endline "Rendering terrain..."; auto_synchronize false; open_graph " 1500x1000"; set_color black; fill_poly [|(0, 0); (__width__, 0); (__width__, __height__); (0, __height__); (0, 0)|]; - set_color white; let (ch_x, ch_y, ch_z) = coords_to_chunk_f (-. camera_xyz.x) (-. camera_xyz.y) camera_xyz.z in diff --git a/image_parsing.py b/image_parsing.py new file mode 100644 index 0000000..e29b587 --- /dev/null +++ b/image_parsing.py @@ -0,0 +1,26 @@ +import math +import numpy as np +import PIL.Image as Img + +def import_img(filename, show=False): + img = Img.open(filename) + width, height = img.size + + if(show): + Img.show(img) + + ptr = open("output.txt", "w") + ptr.write(str(width) + " " + str(height)) + ptr.write("\n") + for w in range(0,width,10): + for h in range(0,height,10): + (red, green, blue) = img.getpixel((w,h)) + ptr.write(str(red) + "," + str(green) + "," + str(blue)) + if(h != height-1): + ptr.write(" ") + ptr.write("\n") + + print("Successfully parsed image '", filename, "'") + ptr.close() + +import_img("stone.bmp") \ No newline at end of file diff --git a/output.txt b/output.txt new file mode 100644 index 0000000..ad4195a --- /dev/null +++ b/output.txt @@ -0,0 +1,17 @@ +16 16 +143,143,143 130,130,130 127,127,127 127,127,127 116,116,116 124,124,124 116,116,116 116,116,116 143,143,143 130,130,130 106,106,106 127,127,127 127,127,127 140,140,140 129,129,129 127,127,127 +143,143,143 130,130,130 119,119,119 124,124,124 124,124,124 138,138,138 127,127,127 119,119,119 143,143,143 130,130,130 123,123,123 130,130,130 119,119,119 143,143,143 122,122,122 124,124,124 +143,143,143 119,119,119 108,108,108 136,136,136 127,127,127 128,128,128 126,126,126 108,108,108 143,143,143 142,142,142 121,121,121 124,124,124 116,116,116 129,129,129 118,118,118 127,127,127 +143,143,143 123,123,123 106,106,106 144,144,144 119,119,119 124,124,124 135,135,135 107,107,107 131,131,131 131,131,131 124,124,124 126,126,126 116,116,116 118,118,118 123,123,123 126,126,126 +127,127,127 119,119,119 116,116,116 127,127,127 116,116,116 124,124,124 141,141,141 117,117,117 143,143,143 130,130,130 116,116,116 127,127,127 127,127,127 119,119,119 126,126,126 127,127,127 +119,119,119 122,122,122 118,118,118 138,138,138 116,116,116 124,124,124 141,141,141 107,107,107 130,130,130 128,128,128 116,116,116 138,138,138 140,140,140 126,126,126 129,129,129 127,127,127 +116,116,116 124,124,124 116,116,116 133,133,133 124,124,124 127,127,127 120,120,120 109,109,109 127,127,127 139,139,139 104,104,104 141,141,141 128,128,128 127,127,127 127,127,127 123,123,123 +124,124,124 127,127,127 110,110,110 124,124,124 119,119,119 124,124,124 133,133,133 130,130,130 139,139,139 143,143,143 102,102,102 132,132,132 119,119,119 119,119,119 127,127,127 116,116,116 +116,116,116 124,124,124 116,116,116 142,142,142 127,127,127 127,127,127 141,141,141 129,129,129 143,143,143 143,143,143 113,113,113 127,127,127 116,116,116 116,116,116 126,126,126 127,127,127 +107,107,107 128,128,128 116,116,116 142,142,142 140,140,140 120,120,120 117,117,117 121,121,121 143,143,143 134,134,134 127,127,127 127,127,127 124,124,124 117,117,117 126,126,126 136,136,136 +116,116,116 128,128,128 116,116,116 133,133,133 143,143,143 119,119,119 116,116,116 118,118,118 128,128,128 127,127,127 121,121,121 124,124,124 127,127,127 125,125,125 126,126,126 141,141,141 +116,116,116 104,104,104 124,124,124 126,126,126 143,143,143 111,111,111 114,114,114 116,116,116 127,127,127 137,137,137 126,126,126 126,126,126 102,102,102 125,125,125 127,127,127 132,132,132 +127,127,127 105,105,105 124,124,124 127,127,127 143,143,143 119,119,119 126,126,126 116,116,116 127,127,127 140,140,140 129,129,129 141,141,141 104,104,104 114,114,114 147,147,147 129,129,129 +127,127,127 115,115,115 127,127,127 122,122,122 118,118,118 110,110,110 123,123,123 123,123,123 127,127,127 140,140,140 122,122,122 141,141,141 113,113,113 114,114,114 147,147,147 121,121,121 +127,127,127 125,125,125 126,126,126 116,116,116 124,124,124 119,119,119 125,125,125 127,127,127 127,127,127 140,140,140 113,113,113 133,133,133 104,104,104 114,114,114 147,147,147 123,123,123 +127,127,127 122,122,122 127,127,127 116,116,116 127,127,127 142,142,142 130,130,130 127,127,127 119,119,119 130,130,130 116,116,116 134,134,134 112,112,112 137,137,137 143,143,143 129,129,129 diff --git a/stone.bmp b/stone.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a852ac3232a5a27e8ebb7ddd29bc9ff8ff01dd8f GIT binary patch literal 76938 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 E7v`Kd&j0`b literal 0 HcmV?d00001 diff --git a/stoned.bmp b/stoned.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a852ac3232a5a27e8ebb7ddd29bc9ff8ff01dd8f GIT binary patch literal 76938 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 E7v`Kd&j0`b literal 0 HcmV?d00001 diff --git a/texture404.txt b/texture404.txt new file mode 100644 index 0000000..ec9e1df --- /dev/null +++ b/texture404.txt @@ -0,0 +1,3 @@ +2 2 +250,0,250 0,0,0 +0,0,0 250,0,250