Apply changes to position, rotation, and scale, and update the instance array
to be used by the shader.
An entity will be processed only if it's marked as dirty by another
system:
game.World.Signature[entity] |= Has.Dirty;
A fast path for entities without the SpatialNode2D component skips the
computation of the World transformation matrix on the CPU. Instead, raw
position, rotation, and scale are stored in the instance array, and the
shader computes the transformation matrix from them. This is very fast and
can be used effectively for particles and background tiles.
Entities with the SpatialNode2D component have their World
transformation matrix computed in the system, i.e. on the CPU. The World
matrices of their parents are taken into account. The data is stored in the
instance array implicitly, taking advantage of the fact that the World
property of the SpatialNode2D component is a view into the instance array
buffer.
sys_transform2d doesn't depend on the order of entities in the world, but
it works best when parents are added before children. This is the default
insertion order of instantiate(), but because entities can be later
recycled, it's not guaranteed.
sys_transform2d also updates the node's Parent field. When reparenting
entities, it's not necessary to assign the new parent manually. OTOH, the
Parent field should only be referenced after sys_transform2d has already
run during the frame.