Comment stocker mes sommets pour utiliser les VertexArrays

Comment stocker mes sommets pour utiliser les VertexArrays - C++ - Programmation

Marsh Posté le 11-12-2002 à 14:49:53    

J'ai commencé à programmer un moteur 3D et là j'en suis à l'affichage d'un mesh.
 
Mon mesh est défini comme ça:

Code :
  1. class CVector
  2. {
  3.    float m_Vector[3];
  4. public:
  5.    //Plein de méthodes
  6. };
  7. class CMesh
  8. {
  9.    CVector *m_Vertices;        //Tableau de sommets
  10.    unsigned int *m_VerticeID;  //Liste des triangles
  11. public:
  12.    Draw();
  13. };


 
Maintenant, dans ma méthode Draw(), j'aimerai utilisé les VertexArray d'OpenGL donc il me faut un tableau continu dans la mémoire de floats représentant les coordonnées des sommets. Or, je stocke mes sommets comme des objets CVector et non comme des tableaux de floats...
Sachant que je veux garder, dans la classe CMesh, les sommets comme des objets CVector (pour pouvoir utiliser toutes les méthodes de CVector dessus), comment je peux faire pour obtenir ce tableau continu de float à partir de mon tableau de CVector??
 
J'ai pensé faire un cast bourrin vu que le seul attribut de CVector c'est le vecteur stocké dans un tableau de float, mais je sais même pas si ça marche et puis c'est quand même un peu crade :lol:
Ou alors, j'ai pensé, à chaque frame, allouer un tableau de floats et recopier les valeurs de chaque sommets dedans mais niveau performance, ca doit pas être ça...


Message édité par _momone_ le 11-12-2002 à 17:40:36
Reply

Marsh Posté le 11-12-2002 à 14:49:53   

Reply

Marsh Posté le 11-12-2002 à 15:03:16    

_Momone_ a écrit :

J'ai pensé faire un cast bourrin vu que le seul attribut de CVector c'est le vecteur stocké dans un tableau de float

bien pensé, c'est la bonne solution. une classe qui ne possède pas de méthodes virtuelles a généralement la même taille que les données qu'elle contient (ça dépend du compilo, par ex une structure d'un byte peut prendre 4 octets si alignement sur dword).
 
pour le design futur de ton moteur, je te conseille d'abstraire ta classe CVector / m_Vertices dans une classe à part. ça te permettra de traiter les instances / abstraire une géométrie dynamique comme MAX.

Reply

Marsh Posté le 11-12-2002 à 16:38:48    

Citation :

une classe qui ne possède pas de méthodes virtuelles a généralement la même taille que les données qu'elle contient (ça dépend du compilo, par ex une structure d'un byte peut prendre 4 octets si alignement sur dword).


Si ca dépend du compilo, c'est pas top non plus... J'aimerais faire un truc portable qui compile partout. Là je compile avec GCC sous Linux, mais j'aimerais bien que mon programme reste compilable sous Windows.
Sinon, ya pas de méthodes plus élégantes qu'un cast?? Par exemple, si je modifie la classe CVertex (en ajoutant un attribut) ça va plus marcher.
 

Citation :

pour le design futur de ton moteur, je te conseille d'abstraire ta classe CVector / m_Vertices dans une classe à part. ça te permettra de traiter les instances / abstraire une géométrie dynamique comme MAX.


Je suis pas sûr d'avoir compris ce que tu as dis là.
Ce que je fais en fait, j'ai une class CSubSet qui décrit le maillage associé à une texture unique. J'ai également une classe CObject qui possède une liste dynamique de CSubSet et qui dessine tous les subsets de la liste. CMesh dérive de CObject et lui rajoutte quelques méthodes comme une méthode de lecture de fichier et une méthode qui gère l'animation. Si je veux ajoutter un maillage à mon objet, j'ai juste à rajoutter un subset à ma liste.

Reply

Marsh Posté le 11-12-2002 à 18:43:35    

_Momone_ a écrit :

Si ca dépend du compilo, c'est pas top non plus... J'aimerais faire un truc portable qui compile partout. Là je compile avec GCC sous Linux, mais j'aimerais bien que mon programme reste compilable sous Windows.

je détaillais pour l'alignement sur dword, le plus courant. tant que ta structure est un multiple de 4, pas de problèmes.  
 

_Momone_ a écrit :

Sinon, ya pas de méthodes plus élégantes qu'un cast?? Par exemple, si je modifie la classe CVertex (en ajoutant un attribut) ça va plus marcher.

recopie des vertices avec une boucle, mais bof ... et oui si tu rajoutes un attribut, boum.
 
 

_Momone_ a écrit :

Je suis pas sûr d'avoir compris ce que tu as dis là.
Ce que je fais en fait, j'ai une class CSubSet qui décrit le maillage associé à une texture unique. J'ai également une classe CObject qui possède une liste dynamique de CSubSet et qui dessine tous les subsets de la liste. CMesh dérive de CObject et lui rajoutte quelques méthodes comme une méthode de lecture de fichier et une méthode qui gère l'animation. Si je veux ajoutter un maillage à mon objet, j'ai juste à rajoutter un subset à ma liste.

ok, rien à redire vu que ce n'est pas le code de ton exemple :D


Message édité par youdontcare le 11-12-2002 à 18:44:05
Reply

Marsh Posté le 11-12-2002 à 19:31:34    

Ok, merci pour tes réponses youdontcare :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed