ECS Library
ECS Library
WIP Personal Work Library C++
Decidí hacer una librería de ECS (Entity Component System) para asi poder añadirlo a cualquier proyecto y que funcione sin problemas. Para ello he ido mejorando la librería conforme he ido trabajando en los diferentes proyectos que incluyen ECS.

Con esta libreria la intención es dar al usuario toda la facilidad para que utilice la arquitectura ECS sin que se tenga que preocupar por el funcionamiento.

Para que el ECS funcione se necesitan Entidades que almacena una máscara de bits con los bits de los componentes activos, y su posición en el Arquetipo; los Componentes que son objetos donde se almacena la información, estos componentes están almacenados dentro de los Arquetipo; los Arquetipo son estructuras que almacenan los componentes seguidos en memoria, se crean un Arquetipo por cada combinación de componentes que exista, asi se pueden leer todos a la vez; y por último los Sistemas que estos buscan los Arquetipo con la combinación de componentes que necesitan y trabajan con ellos de manera continua en memoria porque están agrupados en el Arquetipo
Explicación
Para la implementación del ECS se encesitan 3 objetos, las Entidades, los Componentes y los Arquetipos.

Los componentes son objetos que solo almacenan información local, por ejemplo un componente de la transformación local almacena la posición , rotación y escalado. Estos componentes tienen asignado un bit de la entidad para saber si esa entidad contiene o no el componente, por ejemplo un componente de la transformación local tiene asignado el segundo bit para saber si está añadido a la entidad.

Las Entidades son un objeto que almacena una máscara de bits con los bits de los componentes activos, por ejemplo si se quiere añadir a la entidad el componente de la transformación local se pondría a 1 el segundo bit. Con esto se puede saber con una comprobación si esa entidad tiene un componente en concreto. La Entidades también tienen un id para saber dentro del arquetipo donde esta.

El Arquetipo es una combinación de componentes, cada vez que se añade un componente a una entidad se añade el componente a un arquetipo y a la entidad se le dice el id que tiene en ese arquetipo, también tiene una máscara de componentes para saber que componentes tiene el arquetipo. Hay un arquetipo por cada combinación de componentes, así que todas las entidades que tengan los mismos componentes están en el mismo arquetipo. Por ejemplo tienes 3 entidades la primera entidad contiene 2 componentes, el componente de transformación local, y el componente de Render, la segunda entidad tiene solo el componente de transformación local, y la tercera entidad tiene los mismos componentes que la primera entidad. Con esto se habrían creado 2 arquetipos 1 con el componente de transformación local, que aquí estaría el componente de la segunda entidad. También se habría creado otro arquetipo con 2 componentes, uno de transformación local y otro de render, en este arquetipo estarían los componentes de la primera y tercera entidad.

Por último para tener la implementación del ECS correcta faltarían los system. Los system son funciones que recorren los arquetipos en busca de la configuración que le de el usuario. Por ejemplo si quieres pintar los objetos en pantalla hay que hacer un system que recorra todos los arquetipos hasta que encuentre un arquetipo que contenga los componentes de Render,Material y Transformación Local. Una vez el system ha encontrado el arquetipo solo lo tiene que recorrer y no hace falta que pegue saltos en la memoria ya que ese arquetipo tiene todos los componentes juntos. También se le puede indicar si se quiere no acceder a una entidad que tenga un componente en concreto. Para saber si un arquetipo tiene un componente se comprueba la máscara del arquetipo para así de una forma rápida encontrar los arquetipos que cumplen la condición.

na primera pasada de pintado donde a partir de un RenderTexture se obtienen 3 texturas, una de posciones, otra de normales y otra de color. Como los valores que se guardan son de 3 floats, se puede utilizar el alpha de la textura para almacenar otros valores que ocupen un float, por ejemplo el specular.