
Envoyé par
coda_blank
qu'entends tu par "type primitif" ? attribut de vertex (position, ...) ou type de donnée (float,...)
Par type primitif, j'entends les types qui représentent exclusivement des valeurs numérique (int, float et autre double)
Axis et Color ne seraient donc que des redéfinitions de float et autres ? effectivement ça devient plus lisible
Exactement...
Lorsque tu veux, par exemple, déclarer une variable de type vertex dont les coordonées x, y et z sont des doublet et dont la couleur est un entier non signé, tu travaille sous la forme de
vertex<double, unsigned int> var;
Comme les positions utilisent (sans doute) un type identique pour représenter leurs coordonnées que les vertex, la classe policy nous donne l'occasion de définir, grâce aux différents typedef, les spécialisation pour l'ensemble des types qui t'intéressent.
Tu pourrais, par exemple, créer ton propre typedef de cette policy sous une forme proche de et utiliser les alias de type qu'elle contient pour... représenter les type de tes différentes variables:
1 2 3 4 5 6
| /* un alias de type pour la facilité d'écriture */
typedef policy<float, unsigned int, /* ...*/> policyAxisFloatColorInt;
policyAxisFloatColorInt::vertex_type monVertex;
policyAxisFloatColorInt::position_type maPosition;
/*...*/ |
par contre si j'ai 15 attribut dans un format,
template <typename Axis, typename Color /*, autre types nécessaires>
va être un peu long, non ?
On semble ne pas forcément parler le même langage : pour moi, un attribut est la valeur "color" ou la valeur de la coordonée x (ou y ou z) dans la structure vertex.
Si tu as une structure qui utilise cinq attributs différents, mais que tous ces attributs doivent être d'un type identique, tu ne dois, bien évidemment, fournir qu'une fois le type que tu veux utiliser pour représenter cet attribut.
Tu peux donc avoir vingt structures différentes, étant donné que les types permettant de représenter les différents attributs de ces classes sont fortement liés d'une classe à l'autre, tu peux te dire que dans ll'ensemble, tu ne va pas utiliser plus de trois ou quatre types primitifs différents pour représenter l'ensemble des attributs de ces différentes structures 
Par contre, il est vrai que, si tu as vingt structures différentes, tu aura vingt typedef dans ta structure "policy", qui sera une classe template nécessitant de préciser... trois ou quatre types différents maximum 
[/QUOTE]maintenant qu'est-ce que ça peut donner avec mes vertexbuffers ?
[/QUOTE]Les vertexbuffer ne sont, pour faire simple, que des tableaux de vertices. Tu peux donc tout aussi bien décider, une fois que tu a l'alias de type pour policy qui te convient, d'écrire, tout simplement un code proche de
1 2 3 4
| /* un buffer de trois vertices tels que définis avec le typedef
*policyAxisFloatColorInt
*/
policyAxisFloatColorInt::vertex_type buffer[3]; |
ou, si tu veux obtenir un buffer plus grand (et de taille pourquoi pas dynamique) sous une forme plus "C++iste" proche de
std::vector<policyAxisFloatColorInt::vertex_type> buffer;
Enfin, si tu veux pouvoir avoir un buffer de taille fixe mais définie en fonction des besoins, tu peux parfaitement envisager une structure proche de
template <typename Axis, typename Color, size_t s>
vertexbuffer
{
enum{size = s}; // pour pouvoir disposer de sa taille
vertex<Axis,Color> vertices[s];
};
et, pour la facilité, modifier la classe policy sous une forme proche de
1 2 3 4 5 6 7 8 9
| template <typename Axis, typename Color, size_t s>
class Policy
{
public:
typedef typename vertex<Axis, Color> vertex_type;
typedef typename position<Axis,> position_type;
typedef typename vertexbuffer<vertex_type> vertexbuffer_type[s];
/* autres type utilisés */
}; |
Ce ne sont là que quelques exemples de manière de faire, il y en a surement d'autres 
[EDIT] je me rend compte que j'oublie systématiquement ici de fournir des typedef adéquats dans toutes les structures afin de permettre à l'utilisateur de donner un type pour les différents attributs de celles-ci...
La structure vertex serait donc plutôt proche de
1 2 3 4 5 6 7 8 9 10
| template <typename Axis, typename Color>
struct vertex
{
// l'alias de type pour les coordonnees
typedef axis axis_type;
// et celui pour la couleur
typedef Color color_type;
axis_type x, y, z;
color_type color;
}; |
et les autres structures à l'avenant
Partager