Non-pipeline component programming

Zoadian github at zoadian.de
Fri Feb 7 01:47:42 PST 2014


On Friday, 7 February 2014 at 08:09:10 UTC, Mike Parker wrote:
> On 2/7/2014 12:14 AM, Paul Freund wrote:
>>
>> You're example almost works. With the EntityComponentManager 
>> API it
>> works like this:
>>
>>         auto shipEntities = ecm.query!SpaceShip();
>>
>>         foreach (i, spaceship; taskPool.parallel(shipEntities))
>>         {
>>             auto shipData = spaceship.getComponent!SpaceShip();
>>             shipData.name = format("Ship %i", i);
>>         }
>>
>> Now that unittests are written, documentation is on its way 
>> and should
>> be ready in a few days.
>
> Ah, so there's no data-orientation here. It's strictly 
> entity-centric. Or do you have a way to iterate components 
> independently of entities?

There will be a way to iterate directly over components.

Component fields will automatically be split into an structure of 
arrays.
So let's assume we have:


   struct Point {int x; int y; int z; }
   @Component struct Translation { int a; Point b; Point c; }


Nitro will store Translation like this, so it is even possible to 
iterate over parts of components:


   Entity[]
   int[] for a
   int[] for b.x
   int[] for b.y
   int[] for b.z
   int[] for c.x
   int[] for c.y
   int[] for c.z



Nitros getComponent functions will return Accessor!Translation, 
so if you do this, only int[] for b.x is accessed.



foreach(e; ecs.query!Translation)
{
     auto trans = e.getComponent!Translation();
     trans.b.x = 0;
}


More information about the Digitalmars-d mailing list