]> git.tdb.fi Git - libs/game.git/commitdiff
Skip propagating transforms that were not changed
authorMikko Rasa <tdb@tdb.fi>
Mon, 14 Apr 2025 10:03:48 +0000 (13:03 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 14 Apr 2025 10:17:49 +0000 (13:17 +0300)
It saves some work and is necessary for change tracking in systems to
function.

source/game/component.h
source/game/transformpropagator.cpp
source/game/transformpropagator.h

index 372e8d96e50cac825e853058236a9d86b391113d..6127cd4ce900e5ed023c4ed6e41214d7d9e9c9dd 100644 (file)
@@ -48,6 +48,7 @@ public:
        void commit_tick() { if(written) read_index = write_index; }
        uint8_t get_read_generation() const { return read_index; }
        uint8_t get_write_generation() const { return write_index; }
+       bool was_written() const { return written; }
 };
 
 template<typename T>
index bbad04547f5eb25ac6aaeddbb4f1680e964447c6..bb960f0f737dce6abef4f1a96ff560ed9319f982 100644 (file)
@@ -21,11 +21,22 @@ void TransformPropagator::commit(Mode mode)
        if(mode&WRITE)
        {
                unblock(RDWR);
+               size_t update_children = 0;
                if(transforms_dirty)
+               {
                        rebuild_transform_order();
+                       update_children = transforms.size();
+               }
 
-               for(const ParentedTransform &t: transforms)
-                       t.transform->update_world_transform(t.parent.get());
+               for(ParentedTransform &t: transforms)
+                       if(t.transform->was_written() || update_children>0)
+                       {
+                               t.transform->update_world_transform(t.parent.get());
+                               if(t.child_count>update_children)
+                                       update_children = t.child_count;
+                               else if(update_children>0)
+                                       --update_children;
+                       }
                block(RDWR);
        }
 
@@ -42,14 +53,19 @@ void TransformPropagator::rebuild_transform_order()
 
 void TransformPropagator::rebuild_transform_order(Handle<Entity> entity, Handle<Transform> parent_trans)
 {
+       size_t index = static_cast<size_t>(-1);
        if(Handle<Transform> trans = entity->get_transform())
        {
+               index = transforms.size();
                transforms.emplace_back(trans, parent_trans);
                parent_trans = trans;
        }
 
        for(Handle<Entity> c: entity->get_children())
                rebuild_transform_order(c, parent_trans);
+
+       if(index<transforms.size())
+               transforms[index].child_count = transforms.size()-1-index;
 }
 
 } // namespace Msp::Game
index daa7c2b14e02707d1c472bebd2e5849eab9d0feb..1edb5c42b0b014e28495b79fc858b86c7ea6bdaf 100644 (file)
@@ -18,6 +18,7 @@ private:
        {
                Handle<Transform> transform;
                Handle<Transform> parent;
+               unsigned child_count = 0;
        };
 
        EventObserver observer;