From 97d708c04eb36e14597b2485251a32e3ce3cca63 Mon Sep 17 00:00:00 2001 From: milo Date: Mon, 5 Feb 2024 16:44:36 -0500 Subject: [PATCH] N2.Trans storage optimization --- src/n2/render.ml | 6 ++---- src/n2/trans.ml | 37 +++++++++++++------------------------ src/n2/types.ml | 4 ++++ 3 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/n2/render.ml b/src/n2/render.ml index bde9dcf..b68486b 100644 --- a/src/n2/render.ml +++ b/src/n2/render.ml @@ -26,8 +26,7 @@ module Sprite = struct Entity.Map.set map en cv; Stack.push ord (fun ren -> - let tf = Trans.world en in - Renderer.draw_sprites ren ~tf ~tint:cv.tint + Renderer.draw_sprites ren ~tf:en.tf ~tint:cv.tint cv.sprite_map cv.sprites) let clear en = @@ -57,8 +56,7 @@ module Label = struct Entity.Map.set map en cv; Stack.push ord (fun ren -> - let tf = Trans.world en in - Renderer.draw_text ren ~tf ~fg:cv.fg + Renderer.draw_text ren ~tf:en.tf ~fg:cv.fg cv.font cv.glyphs) let set_text en text = diff --git a/src/n2/trans.ml b/src/n2/trans.ml index 3acbf54..4606e04 100644 --- a/src/n2/trans.ml +++ b/src/n2/trans.ml @@ -3,40 +3,29 @@ open Types (* include (val Ohlog.sublogs Import.logger "Trans") *) -type cv = { +type rel = { model : mat2a; world : mat2a; - parent : mat2a option; + parent : mat2a; } let map = Entity.Map.make () let ord = Stack.make () -let model en = (Entity.Map.get map en).model -let world en = (Entity.Map.get map en).world +let model en = Entity.Map.get map en +let[@inline] world en = en.tf let init ?parent child = - let model = Mat2A.make () in - let cv = match parent with - | Some parent -> { - model; - world = Mat2A.make (); - parent = Some (world parent); - } - | None -> { - model; - world = model; - parent = None; - } - in - Entity.Map.set map child cv; - Stack.push ord child + match parent with + | Some parent -> + let rel = { model = mat2a (); world = child.tf; parent = parent.tf } in + Stack.push ord rel; + Entity.Map.set map child rel.model + | None -> + Entity.Map.set map child child.tf -let update en = - let cv = Entity.Map.get map en in - match cv.parent with - | None -> ((* world == parent *)) - | Some parent -> Mat2A.multiply cv.world parent cv.model +let update rel = + Mat2A.multiply rel.world rel.parent rel.model let update_transforms () = Stack.iter update ord diff --git a/src/n2/types.ml b/src/n2/types.ml index 51b7aa8..cce7a7e 100644 --- a/src/n2/types.ml +++ b/src/n2/types.ml @@ -5,6 +5,8 @@ open! Import type en = { name : string option; id : int; + (* OPTIMIZATION: since all entities have a transform, store it directly *) + tf : mat2a; } module Entity = struct @@ -13,9 +15,11 @@ module Entity = struct let make ?name () = let id = !_next_id in + let tf = mat2a () in incr _next_id; { name; id; + tf; } let pp ppf en =