From ec81b76f3e265dff4b17ffd1a3b3936885dbce2a Mon Sep 17 00:00:00 2001 From: malc Date: Thu, 12 Nov 2009 03:13:30 +0300 Subject: [PATCH] Add simple NTO viewer --- build.ml | 8 +++-- do.sh | 4 +++ imgv.ml | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tbs | 18 ++++++---- 4 files changed, 144 insertions(+), 9 deletions(-) create mode 100644 imgv.ml diff --git a/build.ml b/build.ml index 57ac26b..0295fb6 100644 --- a/build.ml +++ b/build.ml @@ -40,7 +40,7 @@ let boc flags src = let bso name objs = let so = name ^ ".so" in - let so = Filename.concat (Sys.getcwd ()) so in + (* let so = Filename.concat (Sys.getcwd ()) so in *) let o = List.map (fun s -> s ^ ".o") objs in ocaml cc @@ -56,7 +56,8 @@ let bso name objs = let _ = List.iter (fun src -> cmopp ~flags:"-g -I +lablGL -thread" ~dirname:srcdir src) - ["xff"; "nto"; "nmo"; "slice"; "rend"; "vec"; "skb"; "qtr"; "anb"; "skin"] + ["xff"; "nto"; "nmo"; "slice"; "rend"; "vec"; "skb"; "qtr"; "anb" + ;"skin"; "imgv"] ; boc "-g" "swizzle"; boc "-g" "skin"; @@ -66,7 +67,7 @@ let _ = let prog name cmos = ocaml "ocamlc.opt" - ("-g -I +lablGL lablgl.cma lablglut.cma unix.cma") + ("-g -I +lablGL lablgl.cma lablglut.cma unix.cma -dllpath " ^ Sys.getcwd ()) name (StrSet.singleton name) (State.dep_sort cmos) @@ -75,6 +76,7 @@ let _ = prog "dormin" ["slice.cmo"; "xff.cmo"; "nto.cmo"; "skin.cmo"; "rend.cmo"; "vec.cmo"; "anb.cmo"; "skb.cmo"; "nmo.cmo"; "qtr.cmo"; so; so1]; + prog "imgv" ["slice.cmo"; "xff.cmo"; "nto.cmo"; "imgv.cmo"; so; so1]; () ;; diff --git a/do.sh b/do.sh index 39615a3..27e61e0 100644 --- a/do.sh +++ b/do.sh @@ -2,6 +2,10 @@ ocamlc -ccopt -O -o dormin -custom -I +lablGL unix.cma lablgl.cma lablglut.cma \ skin.c skinvp.c swizzle.c \ slice.ml vec.ml qtr.ml xff.ml skin.ml rend.ml anb.ml skb.ml nto.ml nmo.ml +ocamlc -g -ccopt -g -o imgv -custom -I +lablGL unix.cma lablgl.cma lablglut.cma \ + swizzle.c \ + slice.ml xff.ml nto.ml imgv.ml + #mv skin.o skin1.o #mv swizzle.o swizzle1.o #ocamlopt.opt -o dormin.opt -I +lablGL unix.cmxa lablgl.cmxa lablglut.cmxa \ diff --git a/imgv.ml b/imgv.ml new file mode 100644 index 0000000..6162794 --- /dev/null +++ b/imgv.ml @@ -0,0 +1,123 @@ +type view = + { mutable w : int + ; mutable h : int + ; mutable tw : float + ; mutable th : float + } +;; + +let view = { w = -1; h = -1; tw = 0.0; th = 0.0; };; + +let setup () = + GlDraw.viewport 0 0 view.w view.h; + GlMat.mode `projection; + GlMat.load_identity (); + GlMat.mode `modelview; + GlMat.load_identity (); + GluMat.ortho2d ~x:(0.0, view.tw) ~y:(0.0, view.th); +;; + +let reshape ~w ~h = + view.w <- w; + view.h <- h; + setup (); +;; + +let keyboard ~key ~x ~y = + begin match Char.chr key with + | '\027' | 'q' -> exit 0 + | _ -> () + end; + setup (); + Glut.postRedisplay (); +;; + +let draw what func = + GlDraw.begins what; + func (); + GlDraw.ends (); +;; + +let display () = + GlClear.clear [`color]; + + draw `quads (fun () -> + GlTex.coord2 (0.0, 0.0); + GlDraw.vertex2 (0.0, view.th); + + GlTex.coord2 (1.0, 0.0); + GlDraw.vertex2 (view.tw, view.th); + + GlTex.coord2 (1.0, 1.0); + GlDraw.vertex2 (view.tw, 0.0); + + GlTex.coord2 (0.0, 1.0); + GlDraw.vertex2 (0.0, 0.0); + ); + Glut.swapBuffers (); +;; + +let main = + let level = ref 0 in + let nto_name = ref None in + let swap = ref false in + let setsome r s = r := Some s in + let spec = + ["-index", Arg.Set_string Xff.index_path, " to index" + ;"-base", Arg.String (setsome Xff.base_path), " base" + ;"-level", Arg.Set_int level, " mipmap level" + ;"-swap", Arg.Set swap, " swap width and height" + ] + in + Arg.parse (Arg.align spec) (setsome nto_name) "Usage: imgv image.nto"; + let nto_name = + match !nto_name with + | None -> failwith "NTO name not specified" + | Some s -> Filename.basename s + in + let xff, sbuf = Xff.test2 nto_name in + let nto = Nto.r xff sbuf () in + let image2d level (w, h, data) = + let w, h = if !swap then (h, w) else (w, h) in + let id = GlTex.gen_texture () in + Gl.enable `texture_2d; + GlTex.bind_texture `texture_2d id; + GlTex.env (`mode `replace); + GlTex.parameter `texture_2d (`mag_filter `linear); + GlTex.parameter `texture_2d (`min_filter `linear); + GlTex.parameter `texture_2d (`wrap_s `repeat); + GlTex.parameter `texture_2d (`wrap_t `repeat); + let raw = Raw.of_string data `ubyte in + let pix = GlPix.of_raw raw `rgba w h in + GlTex.image2d ~level pix + in + let level = + if !level < 0 || !level >= Array.length nto + then ( + failwith ( + Printf.sprintf "invalid mipmap level %d, must be in [0..%d]" + !level + (pred (Array.length nto)) + ); + ) + else + !level + in + let (w, h, img) as nto = nto.(level) in + let w, h = if !swap then (h, w) else (w, h) in + view.w <- w; + view.h <- h; + view.tw <- float w; + view.th <- float h; + let _ = Glut.init Sys.argv in + let () = Glut.initDisplayMode ~depth:true ~double_buffer:true () in + let () = Glut.initWindowSize w h in + let title = Printf.sprintf "%s (%dx%d)" nto_name w h in + let _ = Glut.createWindow title in + let () = Glut.displayFunc display in + let () = Glut.reshapeFunc reshape in + let () = Glut.keyboardFunc keyboard in + image2d 0 nto; + let () = Glut.mainLoop () in + () +;; diff --git a/tbs b/tbs index 528becb..465b767 100644 --- a/tbs +++ b/tbs @@ -22,27 +22,33 @@ if ! md5sum --status -c $d; then mv $d.tmp $d fi -altivec=true +#altivec=false case $(hostname) in laptop) cc="gcc-4.3.0" ccopt="-Wall -Werror -Wextra -Wno-unused-function" ccopt="$ccopt -O3 -march=athlon64 -mtune=athlon64 -fprefetch-loop-arrays" +# ccopt="$ccopt -mfpmath=sse" ccopt="$ccopt -DTIMING" ;; linmac) cc="$HOME/x/dev/gcc-4.3.0/bin/gcc"; - ccopt="-Wall -Werror -Wextra -O3 -Wno-unused-function"; + #cc=gcc-4.4.1 + ccopt="-Wall -Werror -Wextra -O3 -Wno-unused-function" ccopt="$ccopt -DTIMING" if $altivec; then - ccopt="$ccopt -fprefetch-loop-arrays -mtune=power6 -mcpu=G4" + ccopt="$ccopt -mcpu=G4 -fno-unit-at-a-time -mtune=power6" + ccopt="$ccopt -fprefetch-loop-arrays" ccopt="$ccopt -DG4 -DUSE_ALTIVEC" - ccopt="$ccopt --param l1-cache-line-size=32" + #ccopt="$ccopt -fprofile-generate" + #ccopt="$ccopt -fprofile-use" + # ccopt="$ccopt -O0 -g -Wno-unused" else - ccopt="$ccopt -fprefetch-loop-arrays -mtune=power6 -mcpu=G4 -funroll-all-loops" + ccopt="$ccopt -fprefetch-loop-arrays -mtune=power6 -mcpu=G4" ccopt="$ccopt -ftree-loop-linear -ftree-vectorize" + ccopt="$ccopt --param l1-cache-line-size=32" fi ;; @@ -65,5 +71,5 @@ case $(hostname) in ;; esac -targets="dormin" +targets="dormin imgv" ./b -O src:$h -r -O ccopt:"$ccopt" -O cc:"$cc" $* $targets -- 2.11.4.GIT