Désolé de re-upper le sujet, j'avais laissé tomber pour un moment le sujet étant hors de ma portée, mais je me suis récement remis à cette idée. je me permets donc de répondre à ta question, du moins comment je l'ai traitée.
Pour rappeler, Sylvain Lefebvre utilise (via la bibliothèque loki) un typelist représentatif du format de vertex, du style :
typedef TYPELIST_2(Renderer::vertex3f, Renderer::normal3f) Pos3fNorm3f;
.
Ce format de vertex est utilisé par le vertex buffer dans les fonctions glVertexPointer, glNormalPointer ... pour retrouver rapidement et proprement le nombre de coordonnées, le type de donnée et l'emplacement dans le buffer du premier élément du tableau de données.
Effectivement, cette solution n'est pas vraiment générique dans le sens ou il faut un type de format de vertex par modèle. Au début ça peut sembler "bourrin" mais dans mon cas je n'ai pas tant que ça de modèles, tout au plus dix (je doute d'ailleurs qu'il y en beaucoup dans un moteur pro) .
Afin de réduire considérablement le nombre de possibilité, j'ai émis la condition que les buffers de données étaient toujours ordonnés dans le même sens: position, normal, couleur 0 et 1, texture 0 à 7 et attributs de 0 à 7. J'ai par ailleurs associé au modele chargé un identifaint unique représentant le format de vertex (ca peut être un enum), j'utilise pour ma part un string qui est construit lors de la création du buffer.
J'ai une classe BaseRenderer<VertexFormat> contenant le vertex buffer, l'index buffer et les fondtions de rendu, release ... , template du format de vertex et qui dérive d'une classe IBaseRenderer. Ainsi qu'une classe Renderer qui "manage" les renderers de base (elle possède les méthodes Render, Release et AddOject) via une map associant les précédents string de format de vertex aux IBaseRenderer.
Au final, à la création, je créé un objet BaseRenderer<VertexFormat> (que j'ajoute à la map) si l'objet n'existe pas et je lui ajoute le modèle, sinon j'ajoute directement le modèle.
Pour le rendu, je rend tous les BaseRenderer de ma map. Pareil pour le release.
Partager