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

Langage C++ Discussion :

Copie d'une face dans un std::vector les sommets sont mal copiés.


Sujet :

Langage C++

  1. #1
    Membre actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2023
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Novembre 2023
    Messages : 99
    Par défaut Copie d'une face dans un std::vector les sommets sont mal copiés.
    Salut, je veux créer un cube comme ceci (une skybox) :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    //Droite.
                    VertexArray va1(sf::Quads, 4, this);
                    Vertex v1(Vector3f(1, -1, -1));
                    Vertex v2(Vector3f(1, 1, -1));
                    Vertex v3(Vector3f(1, 1, 1));
                    Vertex v4(Vector3f(1, -1, 1));
                    va1[0] = v1;
                    va1[1] = v2;
                    va1[2] = v3;
                    va1[3] = v4;
                    Material material1;
                    material1.addTexture(nullptr, sf::IntRect(0, 0, 0, 0));
                    Face face1 (va1, material1, getTransform());
                    //Gauche.
                    VertexArray va2(sf::Quads, 4, this);
                    Vertex v5(Vector3f(-1, -1, -1));
                    Vertex v6(Vector3f(-1, 1, -1));
                    Vertex v7(Vector3f(-1, 1, 1));
                    Vertex v8(Vector3f(-1, -1, 1));
                    va2[0] = v5;
                    va2[1] = v6;
                    va2[2] = v7;
                    va2[3] = v8;
                    Material material2;
                    material2.addTexture(nullptr, sf::IntRect(0, 0, 0, 0));
                    Face face2 (va2, material2, getTransform());
                    //Dessus
                    VertexArray va3(sf::Quads, 4, this);
                    Vertex v9(Vector3f(-1, 1, -1));
                    Vertex v10(Vector3f(1, 1, -1));
                    Vertex v11(Vector3f(1, 1, 1));
                    Vertex v12(Vector3f(-1, 1, 1));
                    va3[0] = v9;
                    va3[1] = v10;
                    va3[2] = v11;
                    va3[3] = v12;
                    Material material3;
                    material3.addTexture(nullptr, sf::IntRect(0, 0, 0, 0));
                    Face face3 (va3, material3, getTransform());
                    //Dessous.
                    VertexArray va4(sf::Quads, 4, this);
                    Vertex v13(Vector3f(-1, -1, -1));
                    Vertex v14(Vector3f(1, -1, -1));
                    Vertex v15(Vector3f(1, -1, 1));
                    Vertex v16(Vector3f(-1, -1, 1));
                    va3[0] = v13;
                    va3[1] = v14;
                    va3[2] = v15;
                    va3[3] = v16;
                    Material material4;
                    material4.addTexture(nullptr, sf::IntRect(0, 0, 0, 0));
                    Face face4 (va4, material4, getTransform());
                    //Devant
                    VertexArray va5(sf::Quads, 4, this);
                    Vertex v17(Vector3f(-1, -1, 1));
                    Vertex v18(Vector3f(1, -1, 1));
                    Vertex v19(Vector3f(1, 1, 1));
                    Vertex v20(Vector3f(-1, 1, 1));
                    va5[0] = v17;
                    va5[1] = v18;
                    va5[2] = v19;
                    va5[3] = v20;
                    Material material5;
                    material5.addTexture(nullptr, sf::IntRect(0, 0, 0, 0));
                    Face face5 (va5, material5, getTransform());
     
                    //Derrière.
                    VertexArray va6(sf::Quads, 4, this);
                    Vertex v21(Vector3f(-1, -1, -1));
                    Vertex v22(Vector3f(1, -1, -1));
                    Vertex v23(Vector3f(1, 1, -1));
                    Vertex v24(Vector3f(-1, 1, -1));
                    va6[0] = v21;
                    va6[1] = v22;
                    va6[2] = v23;
                    va6[3] = v24;
                    Material material6;
                    material6.addTexture(nullptr, sf::IntRect(0, 0, 0, 0));
                    Face face6 (va6, material6, getTransform());
                    setName("SKYBOX");
    Donc je crée 6 faces qui ont chacune 4 sommets. Mais je me retrouve avec un problème inquiétant. En effet, lors de l'ajout d'une de mes faces dans mon std::vector, lors de la récupération de la face après l'ajout de la face dans mon std::vector, la position de mes 4 sommets est de 0 hors que ce n'était pas le cas avant d'ajouter la face dans mon std::vector, le plus bizarre c'est que le bug ne se fait que avec la face n°3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void GameObject::addFace (Face face) {
                faces.push_back(face);
                Face f = faces.back();
                if (name == "SKYBOX") {
                    for (unsigned int i = 0; i < f.getVertexArray().getVertexCount(); i++) {
                        std::cout<<f.getVertexArray()[i].position.x<<std::endl;
                    }
                }
            }
    Pour la face 3 seulement (celle du dessous), la position de mes sommets est de 0 après l'ajout de la face dans le std::vector, hors qu'elle devrait être de -1 et de 1. Pour les autres faces la position est bonne.

    Bug de std::vector ?

    Merci.

    PS : j'utilise mingw-w64 version 12.
    PS2 : A cause de ça j'ai une face de ma cubemap qui ne s'affiche pas.

    EDIT : apparemment c'est avant le problème c'est lorsque je passe la face en argument de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void GameObject::addFace (Face face) {
                if (name == "SKYBOX") {
                    for (unsigned int i = 0; i < face.getVertexArray().getVertexCount(); i++) {
                        std::cout<<face.getVertexArray()[i].position.x<<std::endl;
                    }
                }
    Déjà là la position de mes sommets n'est plus bonne pour la face3.

    EDIT 2 : ah bah j'ai trouvé j'avais oublié de changer v3 par v4 ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Dessous.
                    VertexArray va4(sf::Quads, 4, this);
                    Vertex v13(Vector3f(-1, -1, -1));
                    Vertex v14(Vector3f(1, -1, -1));
                    Vertex v15(Vector3f(1, -1, 1));
                    Vertex v16(Vector3f(-1, -1, 1));
                    va4[0] = v13;
                    va4[1] = v14;
                    va4[2] = v15;
                    va4[3] = v16;
                    Material material4;
                    material4.addTexture(nullptr, sf::IntRect(0, 0, 0, 0));
                    Face face4 (va4, material4, getTransform());

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Bug de std::vector ?
    Cela ne sera jamais le cas.

    Votre code vous fera faire des problèmes, comme celui que vous venez de rencontrer, car il y a trop de répétition/copier coller.
    Pour chaque face, vous faites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    VertexArray va1(sf::Quads, 4, this);
    Vertex v1(Vector3f(1, -1, -1));
    Vertex v2(Vector3f(1, 1, -1));
    Vertex v3(Vector3f(1, 1, 1));
    Vertex v4(Vector3f(1, -1, 1));
    va1[0] = v1;
    va1[1] = v2;
    va1[2] = v3;
    va1[3] = v4;
    Material material1;
    material1.addTexture(nullptr, sf::IntRect(0, 0, 0, 0));
    Face face1 (va1, material1, getTransform());
    Première chose simple à faire, placer ce code dans un bloc :
    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
     
    Face face1;
    {
    	VertexArray va1(sf::Quads, 4, this);
    	Vertex v1(Vector3f(1, -1, -1));
    	Vertex v2(Vector3f(1, 1, -1));
    	Vertex v3(Vector3f(1, 1, 1));
    	Vertex v4(Vector3f(1, -1, 1));
    	va1[0] = v1;
    	va1[1] = v2;
    	va1[2] = v3;
    	va1[3] = v4;
    	Material material1;
    	material1.addTexture(nullptr, sf::IntRect(0, 0, 0, 0));
    	face1 = Face(va1, material1, getTransform());
    }
    Ça permet d'éviter l'utilisation de variable d'une face, dans une autre face.

    Ensuite, le plus évidant sera certainement de placer cela dans une fonction et de n'appeler plus que la fonction. Ça pourrai ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Face face1 = buildFace(Vector3f(1, -1, -1), Vector3f(1, 1, -1), Vector3f(1, 1, 1), Vector3f(1, -1, 1));
    Cela n'est qu'un exemple et cela dépendra de vos besoins.

    Finalement, êtes vous sûr que vous voulez faire tout ça en C++ ? Je veux dire par là, peut être devriez prendre un langage plus "simple" ? Je pense à Python, mais j'ose croire que ce n'est pas le meilleur pour votre cas et qu'il peut y avoir encore plus simple.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2023
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Novembre 2023
    Messages : 99
    Par défaut
    Bonjour, le c++ n'est pas si compliqué pour moi, la complexité c'est le rendu, la physique, etc... et faire tout ça de manière optimisée. Et ça, ça reste la même chose peut importe le langage utilisé.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 502
    Par défaut
    optimisée
    Votre code avec plein de lignes inutiles et des variables à gogo ???
    J'espère que vous faite confiance au "vrai" optimiseur de votre chaine de compilation.

    Faites un code maintenable et arrêtez de faire de l'"optimisation anticipée", MERCI.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/12/2023, 15h54
  2. Réponses: 24
    Dernier message: 23/12/2011, 16h20
  3. Retourner une référence sur un std::vector
    Par Rodrigue dans le forum C++
    Réponses: 12
    Dernier message: 13/10/2007, 16h30
  4. Libération de pointeurs dans un std::vector
    Par G dans le forum SL & STL
    Réponses: 17
    Dernier message: 06/04/2005, 22h37
  5. Réponses: 8
    Dernier message: 26/08/2004, 18h59

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