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>
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);
}
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