Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Blenderiste09 le Septembre 15, 2017, 05:15:37 pm

Titre: afficher std::vector<sf::RectangleShape>
Posté par: Blenderiste09 le Septembre 15, 2017, 05:15:37 pm
Bonjour,
Je suis en train d'essayer de réaliser un tout simple Conway's game of life.
J'aimerais créer des cellules composées dans un premier temps de sf::RectangleShape le tout contenu dans std::vector.

Problème, lors de l'appel de la fonction window.draw(), rien ne s'affiche.
Voici la partie qui cause problème:

#include <SFML/Graphics.hpp>
#include <iostream>

using namespace std;

int main()
{
    int windowX = 800, windowY = 600, gridSize = 10;
    sf::RenderWindow window(sf::VideoMode(windowX, windowY), "Game of Life");

    //Rectangle qui sera inséré dans le vector
    sf::RectangleShape rect;
    rect.setFillColor(sf::Color(250, 0, 0));
    rect.setScale(gridSize, gridSize);

    vector<sf::RectangleShape> rectArray;

    for(int y(0); y < windowY; y += gridSize)
    {
        for(int x(0); x < windowX; x += gridSize)
        {
            rect.setPosition(x, y); //Position de chaque cellules de la grille
            rectArray.push_back(rect);
        }
    }


        window.clear();

        for(vector<sf::RectangleShape>::iterator it = rectArray.begin(); it != rectArray.end(); it++)
            window.draw(*it);

        window.display();

        while (window.isOpen())
        {
                sf::Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                window.close();
                }

        }

        return 0;
}
 

Cette manière de faire est provisoire car je pense que je passerai par un sf::VertexArray au final, mais je voudrais quand même comprendre.

Pourriez-vous m'aider ?

Merci d'avance
Titre: Re: afficher std::vector<sf::RectangleShape>
Posté par: Laurent le Septembre 15, 2017, 05:40:00 pm
Ne confond pas la taille (setSize) et le facteur d'étirement (setScale) ;)
Titre: Re: afficher std::vector<sf::RectangleShape>
Posté par: Blenderiste09 le Septembre 15, 2017, 07:52:28 pm
Effectivement, bête erreur d'inattention ! :P Merci beaucoup.
Du coup le code fonctionne, et j'ai voulu l'intégrer dans la fonction draw d'une classe Grid que j'ai créé:
void Grid::draw(sf::RenderTarget & target, sf::RenderStates states) const
{
        states.transform *= getTransform();

        target.draw(m_vertices, states); //D'autres formes dessinée avant les rectangles

        /*for(int i(0); i < m_rectArray.size(); i++)
        target.draw(m_rectArray[i]);*/
//Cette boucle fonctionne

        for(vector<sf::RectangleShape>::iterator it = m_rectArray.begin(); it != m_rectArray.end(); it++)
            target.draw(*it);
}
 

Cependant il me sort une autre erreur.
(click to show/hide)
Et j'avoue que j'ai du mal à la comprendre.


Ensuite, j'ai une deuxième question qui est en rapport avec le sujet.
Pour réduire le nombre de draw calls, je pense créer moi-même mes Rectangles en utilisant des VertexArray pour ne faire qu'un seul draw call.
Cependant je me demandait, est-ce qu'il n'y aurait pas un moyen de faire un seul draw call avec une sorte de VertexArray pour Rectangle ou autres formes plus complexes (autre que de faire un getPoint() et l'insérer dans un VertexArray) ?

Merci encore
Titre: Re: afficher std::vector<sf::RectangleShape>
Posté par: Laurent le Septembre 15, 2017, 09:24:57 pm
m_rectArray est const dans cette fonction, puisque c'est un membre de la classe et que la fonction est const elle-même. Il te faut donc un const_iterator.

Ou alors...

for (const auto& rect : m_rectArray)
{
    ...
}

Citer
Cependant je me demandait, est-ce qu'il n'y aurait pas un moyen de faire un seul draw call avec une sorte de VertexArray pour Rectangle ou autres formes plus complexes
Je ne comprends pas très bien ta question. Un vertex array contient des points qui forment des primitives, il n'y a pas de notion de forme complexe, là on est un cran plus bas niveau, c'est à toi de définir tes formes à partir des primitives de base disponibles (des triangles, ou si tu te fiches de la compatibilité, des quads).
Titre: Re: afficher std::vector<sf::RectangleShape>
Posté par: Blenderiste09 le Septembre 18, 2017, 09:52:01 pm
Salut !
Merci beaucoup pour ta réponse, c'était tout bête.
Citer
Cependant je me demandait, est-ce qu'il n'y aurait pas un moyen de faire un seul draw call avec une sorte de VertexArray pour Rectangle ou autres formes plus complexes
Je ne comprends pas très bien ta question. Un vertex array contient des points qui forment des primitives, il n'y a pas de notion de forme complexe, là on est un cran plus bas niveau, c'est à toi de définir tes formes à partir des primitives de base disponibles (des triangles, ou si tu te fiches de la compatibilité, des quads).

La question pourrait-être tournée comme ça : Est-ce que l'on peut faire un seul appel à draw() pour dessiner plusieurs cercles par exemple ?
Titre: Re: afficher std::vector<sf::RectangleShape>
Posté par: Laurent le Septembre 18, 2017, 10:40:03 pm
Bien sûr. La forme la plus flexible de primitive est sf::Triangles, qui est une simple liste de triangles n'ayant rien en commun. Partant de là, tu peux mettre tout ce que tu veux dans un unique vertex array.