ECS WIP: transform tree
This commit is contained in:
parent
ceafd98d63
commit
91322da5b1
|
@ -109,7 +109,6 @@ module Mat2A = struct
|
||||||
dst.a5 <- src.a5;
|
dst.a5 <- src.a5;
|
||||||
end
|
end
|
||||||
|
|
||||||
(*
|
|
||||||
let[@inline] mul (lhs : t) (rhs : t) : unit =
|
let[@inline] mul (lhs : t) (rhs : t) : unit =
|
||||||
let { a0; a1; a2; a3; a4; a5 } = lhs in
|
let { a0; a1; a2; a3; a4; a5 } = lhs in
|
||||||
begin
|
begin
|
||||||
|
@ -121,6 +120,7 @@ module Mat2A = struct
|
||||||
lhs.a5 <- (a3 * rhs.a2) + (a4 * rhs.a5) + a5;
|
lhs.a5 <- (a3 * rhs.a2) + (a4 * rhs.a5) + a5;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
(*
|
||||||
let[@inline] tra (dst : t) ~(tx : float) ~(ty : float) =
|
let[@inline] tra (dst : t) ~(tx : float) ~(ty : float) =
|
||||||
begin
|
begin
|
||||||
dst.a2 <- (dst.a0 * tx) + (dst.a1 * ty) + dst.a2;
|
dst.a2 <- (dst.a0 * tx) + (dst.a1 * ty) + dst.a2;
|
||||||
|
|
50
src/main.ml
50
src/main.ml
|
@ -1,8 +1,24 @@
|
||||||
open S2
|
|
||||||
open Adam
|
open Adam
|
||||||
|
open S2
|
||||||
|
open N2
|
||||||
|
|
||||||
include (val Ohlog.logs "Main")
|
include (val Ohlog.logs "Main")
|
||||||
|
|
||||||
let main () =
|
let main () =
|
||||||
|
let tfs = Transform.make () in
|
||||||
|
|
||||||
|
let a = Transform.add tfs in
|
||||||
|
let b = Transform.add tfs ~parent:a in
|
||||||
|
let c = Transform.add tfs ~parent:a in
|
||||||
|
|
||||||
|
let square = aabb (-50.0) (-50.0) 50.0 50.0 in
|
||||||
|
|
||||||
|
Mat2A.set (Transform.model b)
|
||||||
|
~tx:(-5.0) ~ty:(-5.0) ~sx:1.0 ~sy:1.0;
|
||||||
|
|
||||||
|
Mat2A.set (Transform.model c)
|
||||||
|
~tx:(+5.0) ~ty:(+5.0) ~sx:1.0 ~sy:1.0;
|
||||||
|
|
||||||
debug (fun m -> m "initializing");
|
debug (fun m -> m "initializing");
|
||||||
let window = Window.make ~title:"GEOMETRA" in
|
let window = Window.make ~title:"GEOMETRA" in
|
||||||
info (fun m -> m "window initialized");
|
info (fun m -> m "window initialized");
|
||||||
|
@ -10,14 +26,40 @@ let main () =
|
||||||
info (fun m -> m "renderer initialized");
|
info (fun m -> m "renderer initialized");
|
||||||
let render () =
|
let render () =
|
||||||
begin
|
begin
|
||||||
(* let time = Sdl.get_ticks () |> Int32.to_int in *)
|
(* Update *)
|
||||||
|
|
||||||
|
let time = Sdl.get_ticks () |> Int32.to_int in
|
||||||
|
let tx =
|
||||||
|
Float_infix.(
|
||||||
|
Float.sin (flt time / 1000.0 * 2.0) * 300.0
|
||||||
|
+ 512.0
|
||||||
|
)
|
||||||
|
in
|
||||||
|
let ty = 400.0 in
|
||||||
|
|
||||||
|
Mat2A.set (Transform.model a)
|
||||||
|
~tx ~ty ~sx:1.0 ~sy:1.0;
|
||||||
|
|
||||||
|
Transform.update tfs;
|
||||||
|
|
||||||
|
(* Render *)
|
||||||
|
|
||||||
Renderer.pre_draw ren;
|
Renderer.pre_draw ren;
|
||||||
Renderer.clear ren (rgb24 0x000000);
|
Renderer.clear ren (rgb24 0x000000);
|
||||||
|
|
||||||
Renderer.draw_rect ren
|
Renderer.draw_rect ren
|
||||||
~tf:(mat2a 100.0 50.0 1.0 1.0)
|
~tf:(Transform.world b)
|
||||||
~bb:(aabb (-5.0) (-10.0) 50.0 200.0)
|
~bb:square
|
||||||
~fill:(rgb24 0xff0000);
|
~fill:(rgb24 0xff0000);
|
||||||
|
|
||||||
|
Renderer.draw_rect ren
|
||||||
|
~tf:(Transform.world c)
|
||||||
|
~bb:square
|
||||||
|
~fill:(rgb24 0x0055ff);
|
||||||
|
|
||||||
Renderer.post_draw ren;
|
Renderer.post_draw ren;
|
||||||
|
|
||||||
|
Gc.major ();
|
||||||
end
|
end
|
||||||
in
|
in
|
||||||
Window.event_loop window ~render;
|
Window.event_loop window ~render;
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
(library
|
||||||
|
(name n2)
|
||||||
|
(package geometra)
|
||||||
|
(libraries
|
||||||
|
adam
|
||||||
|
s2
|
||||||
|
ohlog))
|
|
@ -0,0 +1,98 @@
|
||||||
|
open Adam
|
||||||
|
|
||||||
|
include (val Ohlog.logs "N2")
|
||||||
|
|
||||||
|
module Transform = struct
|
||||||
|
type t = {
|
||||||
|
mutable buffer : node array;
|
||||||
|
mutable size : int;
|
||||||
|
}
|
||||||
|
|
||||||
|
and node =
|
||||||
|
| Null
|
||||||
|
| Node of {
|
||||||
|
idx : int;
|
||||||
|
parent : node;
|
||||||
|
model_tf : mat2a;
|
||||||
|
world_tf : mat2a;
|
||||||
|
}
|
||||||
|
|
||||||
|
let make () = {
|
||||||
|
buffer = Array.make 64 Null;
|
||||||
|
size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
let push t n =
|
||||||
|
let buf = t.buffer in
|
||||||
|
let cap = Array.length buf in
|
||||||
|
if t.size >= cap then
|
||||||
|
t.buffer <-
|
||||||
|
Array.init (cap * 2)
|
||||||
|
(fun i -> if i < cap then buf.(i) else Null);
|
||||||
|
t.buffer.(t.size) <- n;
|
||||||
|
t.size <- t.size + 1
|
||||||
|
|
||||||
|
let add ?(parent = Null) t =
|
||||||
|
let model_tf = mat2a 0.0 0.0 1.0 1.0 in
|
||||||
|
let world_tf = mat2a 0.0 0.0 1.0 1.0 in
|
||||||
|
let node =
|
||||||
|
Node {
|
||||||
|
idx = t.size;
|
||||||
|
parent;
|
||||||
|
model_tf;
|
||||||
|
world_tf;
|
||||||
|
}
|
||||||
|
in
|
||||||
|
push t node;
|
||||||
|
node
|
||||||
|
|
||||||
|
let update t =
|
||||||
|
let buf = t.buffer in
|
||||||
|
for i = 0 to t.size - 1 do
|
||||||
|
match buf.(i) with
|
||||||
|
| Null -> ()
|
||||||
|
| Node n ->
|
||||||
|
match n.parent with
|
||||||
|
| Null ->
|
||||||
|
Mat2A.copy n.world_tf ~src:n.model_tf
|
||||||
|
| Node p ->
|
||||||
|
Mat2A.copy n.world_tf ~src:p.world_tf;
|
||||||
|
Mat2A.mul n.world_tf n.model_tf;
|
||||||
|
done
|
||||||
|
|
||||||
|
let world = function
|
||||||
|
| Null -> invalid_arg "null"
|
||||||
|
| Node n -> n.world_tf
|
||||||
|
|
||||||
|
let model = function
|
||||||
|
| Null -> invalid_arg "null"
|
||||||
|
| Node n -> n.model_tf
|
||||||
|
end
|
||||||
|
|
||||||
|
(*
|
||||||
|
module Entity = struct
|
||||||
|
include (val Ohlog.sublogs logger "Entity")
|
||||||
|
|
||||||
|
type t = {
|
||||||
|
name : string option;
|
||||||
|
id : int;
|
||||||
|
}
|
||||||
|
|
||||||
|
let _next_id = ref (-1)
|
||||||
|
|
||||||
|
let make ?name () = {
|
||||||
|
name;
|
||||||
|
id = (incr _next_id; !_next_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
let pp ppf t =
|
||||||
|
Format.fprintf ppf "<%s@%d>"
|
||||||
|
(Option.value t.name ~default:"")
|
||||||
|
t.id
|
||||||
|
|
||||||
|
let make ?name () =
|
||||||
|
let ent = make ?name () in
|
||||||
|
trace (fun m -> m "new entity %a" pp ent);
|
||||||
|
ent
|
||||||
|
end
|
||||||
|
*)
|
Loading…
Reference in New Issue