IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Faire un mesh sans connaitre a l'avance le format des vertex


Sujet :

DirectX

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut Faire un mesh sans connaitre a l'avance le format des vertex
    Bonjour à tous,

    Je suis en train de lire un fichier xml (collada) et je ne sais pas à l'avance les infos que je vais avoir. Des fois j'aurai les normales des vertex, des fois je les aurais pas, des fois le vertex aura une couleur, des fois ça sera des coordonnées de textures...

    Alors faut-il que je prévois une structure et un FVF par type de vertex que je peux trouver, et ensuite, je regarde quel type on a dans le schéma xml, j'instancie celui qu'il faut, et j'applique les flags FVF prédéfinis qui correspondent?
    Car il peut y en avoir plein c'est pour ça, si on fait les combinaisons de ce qu'on peut trouver (simple, avec normales, simple avec couleur, simple avec coords de textures, avec normals et couleur, avec normales et coords de textures, etc....)

    C'est possible mais bon, c'est pas joli et pour entretenir ça...

    Que feriez-vous à ma place?

    Je vous remercie.

    A bientôt

    Aurélien

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Alors, j'ai pensé à un truc:

    déjà je peux mettre les flags juste à "D3DFVF_XYZ".

    ensuite j'aurai des structures pour chaque types de donnée que je peux trouver:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct VERTEX_POSITION
    {
        float x, y, z;
    }
     
    struct VERTEX_NORMAL
    {
        float nx, ny, nz;
    }
    Ensuite lorsque je parcours mes sources de collada je test ce que c'est, et j'incrémente à chaque fois la taille du vertex au final, et j'ajoute le nouveau vector à une liste de vector, et j'ajoute le flag correspondant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    int vertexSize = 0;
    vector listeDeVector; // Je sais pas encore comment le typer celui là
    for(int i = 0; i < sources->getCount(); i++)
    {
        const char* semantic = sources[i]->getSemantic();
        if(strcmp(semantic, "POSITION") == 0)
        {
            // On cré un vector<VERTEX_POSITION> et on le rempli
            vertexSize += sizeof(VERTEX_POSITION);
            listeDeVector.push_back(monNouveauVector);
        }
        elseif(strcmp(semantic, "NORMAL") == 0)
        {
            flags = flags | D3DFVF_NORMAL;
            vertexSize += sizeof(VERTEX_NORMAL);
            // On crée un vector de VERTEX_NORMAL, et on le remplit
            listeDeVector.push_back(monNouveauVector);
        }
    }
    // Ici, on a chaque type d'information dans un vector. Chaque vector dans un vector conteneur, la taille finale d'un vertex, et les flags FVF qui sont ok
    // Déclaration d'un vector dont les éléments on une taille de <vertexSize>
    vector<je sais pas quoi mettre> vertexVector;
    for(int i = 0; i < nbVertex; i++)
    {
            // variable qui a une taille de <vertexSize>
            // int position = 0;
            for(int j = 0; j < listeDeVector.size(); j++)
            {
                // copy dans vertexVector[i], à partir de la position <position>, de la taille de sizeof(élément de listeDeVector[j]);
                position += sizeof(element de listeDeVector[j]);
            }
    }
     
    // Et ici on a un vector de vertex, avec chaque vertex ayant toutes ses infos, les flags FVF qui sont ok, reste plus qu'à copier tout ça dans un vertexBuffer
    Est-ce que jusque là c'est... programmement correct? ça me semble carrément bidouille mais j'vois pas d'autres soluction...
    Comment fait-on pour déclarer un vector sans type, mais avec une taille définit pour chaque élément?
    Est-ce que les informations dans un vertex doivent être bien positionné (pour notre exemple: position puis normales) ou est-ce que faut juste suivre l'ordre des flags FVF?

    Je veux dire si j'ai une structure de vertex comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct VERTEX
    {
        float x, y, z;
        float nx, ny, nz;
    }
    Est-ce que entre les FVF "D3DFVF_XYZ|D3DFVF_NORMAL" et "D3DFVF_NORMAL|D3DFVF_XYZ" il y aura une différence dans l'ordre des informations?

    Je vous remercie

    A bientôt

    Aurélien

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Comment fait-on pour déclarer un vector sans type, mais avec une taille définit pour chaque élément?
    Impossible. Tu peux t'en tirer avec de la bidouille, mais je ne te le conseille pas.

    Est-ce que les informations dans un vertex doivent être bien positionné (pour notre exemple: position puis normales) ou est-ce que faut juste suivre l'ordre des flags FVF?
    Il y a un ordre bien précis à respecter, qui doit être indiqué dans la doc. Quant à l'ordre des flags dans le FVF, ça ne change rien : le flag final (qui n'est qu'un nombre entier) sera toujours le même.

    A mon avis il faut retourner le problème : il ne faut pas adapter ton programme à ce que contiendra ton fichier collada, mais l'inverse. Selon ce que tu fais tu auras besoin de composantes bien spécifiques, par exemple la position + la normale + les coordonnées de texture, et bien fais en sorte que ton fichier contienne ceci. Si tu ne veux pas modifier les fichiers des modèles, tu peux aussi le faire lorsque tu les charges, en remplissant les trous (pour les composantes manquantes) et en virant les composantes inutiles.

    Remarque : les FVF sont a priori obsolètes, tu peux utiliser à la place les déclarations de vertex.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci beaucoup Loulou,

    En fait, je voudrais donner à l'utilisateur la possibilité de faire ses propres cartes. Et donc parfois, vais peut-être pour les normales c'est gérables, mais pour les infos de couleurs ou textures des vertex, là je peux pas trop imposer...

    Commant ça "les FVF sont a priori obsolètes, tu peux utiliser à la place les déclarations de vertex", j'ai pas compris ça Loulou :'(

    Merci beaucoup

    A bientôt

    Aurélien

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ha j'ai une autre question...

    Dans mon schéma collada, en fait j'ai une scène.
    Cette scène contient plusieurs géométries (entre autres) avec leur matrice.

    Chaque géométrie possède un material (que ça soit juste une couleur ou texturé), et plusieurs géométries peuvent avoir un material commun.

    A partir de là, que dois-je faire?

    Je pense à faire comme lorsque l'on charge un .X, avec des subset, mais c'est quoi un subset? comment on les crée?

    Merci beaucoup,

    A bientôt

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Commant ça "les FVF sont a priori obsolètes, tu peux utiliser à la place les déclarations de vertex", j'ai pas compris ça Loulou :'(
    Fais une petite recherche dans la doc

    Chaque géométrie possède un material (que ça soit juste une couleur ou texturé), et plusieurs géométries peuvent avoir un material commun.

    A partir de là, que dois-je faire?

    Je pense à faire comme lorsque l'on charge un .X, avec des subset, mais c'est quoi un subset? comment on les crée?
    Je pense que tu dois avoir 3 choses :
    - Un vertex buffer et un index buffer, pour contenir ta géometrie
    - Un tableau de material
    - Un tableau de subsets, qui associe des tranches d'indices (donc des sous-parties de la mesh) à des materials

    Après pour le rendu y a qu'à parcourir le tableau de subsets, et rendre la partie du modèle avec le material associé. Tu peux même trier ton tableau de material pour optimiser les changements de material.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Hoplaa, merci Loulou,

    Je laisse le topic ouvert en attendant que je finisse cette partie

    Merci

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Voilà, j'ai un peu avancé...

    Alors je voulais faire un p'tit cube pour commencer, le xml se trouve là:
    http://kinju.free.fr/cube.xml.

    J'ai donc fait une structure de vertex toute bete (un vector position), j'ai également rempli un D3DMATERIAL9 et rempli en fonction des données du xml.

    Donc les 8 vertex du cube c'est fait, le material avec la couleur diffuse et ambient c'est fait, reste plus que les indices, mais dans le schéma, j'ai pas trouvé des infos là dessus... :s

    Quelqu'un peut jeter un coup d'oeil s'il vous plaît?

    Merci

    A bientôt

    Aurélien

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/03/2014, 10h03
  2. Réponses: 5
    Dernier message: 05/01/2012, 11h59
  3. [Eigen] création d'une matrice sans connaitre à l'avance la taille
    Par bioinfornatics dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 16/02/2010, 21h13
  4. Réponses: 2
    Dernier message: 30/09/2008, 14h18
  5. Réponses: 4
    Dernier message: 26/05/2006, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo