Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Vue par defaut décalée de 1 pixel en x vers la droite ?  (Lu 2473 fois)

0 Membres et 1 Invité sur ce sujet

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Vue par defaut décalée de 1 pixel en x vers la droite ?
« le: Décembre 04, 2013, 12:23:19 pm »
Bonjour, alors c'est vraiment un detail, mais j'ai l'impression que la vue de base liée à la RenderWindow est décalée de 1 pixel vers la droite.

Je m'explique, jai créé une grille dynamique avec 2 tableaux dynamiques de Vertex Arrays que j'affiche en mode LineStrip, par soin j'ai bien affiché les positions de chaque points de tous les Vertex Arrays, les poins de la premiere collone sont bien tous a 0 en x, et la ligne n'est pas affichée, par contre, les points de la premiere ligne qui sont eux aussi a 0 en y sont bien affichés. Au debut j'ai cru que j'avais fait une erreur d'affichage, mais quand je décale la vue de 1 pixel vers la gauche, la fameuse premiere colonne apparaît !

Meme comportement peu importe la resolution (aparament) et wide&fullscreen.

Il est (toujours) possible que j'ai fait une erreur stupide de programmation, je vais donc poster certaines parties de mon code :

Voici la partie ou je crée la fenetre, ma console de debug m'affiche bien 400 et 300 comme centre de vue pour la vue par defaut :

#ifdef _DEBUG
        sf::RenderWindow rWindow(sf::VideoMode(800, 600), "Pathfinding with SFML", sf::Style::Close | sf::Style::Titlebar);
#else
        sf::RenderWindow rWindow(sf::VideoMode(800, 600), "Pathfinding with SFML", sf::Style::Fullscreen);
#endif
        rWindow.setVerticalSyncEnabled(false);
        rWindow.setKeyRepeatEnabled(false);

        sf::View VueDeBase(rWindow.getView());

#ifdef _DEBUG
        std::cout << "Coordonnees centre vue par defaut X : " << VueDeBase.getCenter().x << ", y : " << VueDeBase.getCenter().y << std::endl;
#endif
 

Voici la partie ou je crée ma grille (courage !)
void Grille::ActualiserGrille()
{
        VertexBufferHorizontal.resize(0);
        VertexBufferVertical.resize(0);

        //////// Renseigne les deux vertex buffers en fonction des points
        VertexBufferHorizontal.reserve(NbrCasesY + 1);

        for (int y = 0; y <= NbrCasesY; ++y)
        {
                VertexBufferHorizontal.push_back(sf::VertexArray(sf::PrimitiveType::LinesStrip, NbrCasesX + 1));

                for (int x = 0; x <= NbrCasesX; ++x)
                {
                        VertexBufferHorizontal[y][x].position = TousLesPoints[y][x];
                        VertexBufferHorizontal[y][x].color = sf::Color::Cyan;
                }
        }

        VertexBufferVertical.reserve(NbrCasesX + 1);

        for (int y = 0; y <= NbrCasesX; ++y)
        {
                VertexBufferVertical.push_back(sf::VertexArray(sf::PrimitiveType::LinesStrip, NbrCasesY + 1));

                for (int x = 0; x <= NbrCasesY; ++x)
                {
                        VertexBufferVertical[y][x].position = TousLesPoints[x][y];
                        VertexBufferVertical[y][x].color = sf::Color::Cyan;
                }
        }
        ////////////////
}
 

j'ai enleve les std::cout pour afficher les points juste apres la creation, mais je peux t'assurer qu'ils valent bien 0 en x sur la premiere colonne.

Et voici la partie ou j'affiche ma grille

void Grille::AfficherGrille(sf::RenderWindow& rWindow)
{
        for (int y = 0; y <= NbrCasesY; ++y)
        {
                rWindow.draw(VertexBufferHorizontal[y]);
        }

        for (int y = 0; y <= NbrCasesX; ++y)
        {
                rWindow.draw(VertexBufferVertical[y]);
        }
}
 

Quand je fais ceci, la premiere colonne de ma grille ne s'affiche pas (voir piece jointe "grille_decalee.png")
mais si je remplace ma fonction d'affichage par ceci :

void Grille::AfficherGrille(sf::RenderWindow& rWindow)
{
        // 399 au lieu de 400 pour realiser le decalage de la vue

        sf::View dView(sf::Vector2f(399, 300), sf::Vector2f(800, 600));
        rWindow.setView(dView);

        for (int y = 0; y <= NbrCasesY; ++y)
        {
                rWindow.draw(VertexBufferHorizontal[y]);
        }

        for (int y = 0; y <= NbrCasesX; ++y)
        {
                rWindow.draw(VertexBufferVertical[y]);
        }
}
 

la grille s'affiche correctement ! (desole pour le dView pas passe par reference ^^ c'est juste pour tester ^^)
(voir piece jointe "grille_recalee.png")

Autre chose aussi, dans ma grille, le pixel tout en bas a gauche de la grille ne s'affiche pas, j'ai l'impression que c'est du au fait que en LineStrip, le premier (ou le dernier je ne sais pas) vertex d'un VertexArray n'est pas affiché.

Je précise que je compile sous Visual Studio 2013 avec SFML 2.1 et ses libs 2012.

Ps: désole j'ai beaucoup modifié le post car il y manquait des informations.
« Modifié: Décembre 04, 2013, 12:35:40 pm par Deu sex »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Vue par defaut décalée de 1 pixel en x vers la droite ?
« Réponse #1 le: Décembre 04, 2013, 02:20:39 pm »
La coordonnée que tu donnes pour la ligne est la médiane de celle-ci, c'est-à-dire que la ligne s'étend de 0.5 pixels de part et d'autre. Donc pour être sûr d'être calé sur les pixels de la fenêtre il faut donner des demi-coordonnées (en .5) et non des coordonnées entières.
Laurent Gomila - SFML developer

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Vue par defaut décalée de 1 pixel en x vers la droite ?
« Réponse #2 le: Décembre 04, 2013, 03:58:17 pm »
waw, tricky ! Je ne pensais pas du tout que ca fonctionnait comme cela !

voici ducoup ma nouvelle methode :

void Grille::ActualiserGrille()
{
        VertexBufferHorizontal.resize(0);
        VertexBufferVertical.resize(0);

        //////// Renseigne les deux vertex buffers en fonction des points
        VertexBufferHorizontal.reserve(NbrCasesY + 1);

        for (int y = 0; y <= NbrCasesY; ++y)
        {
                VertexBufferHorizontal.push_back(sf::VertexArray(sf::PrimitiveType::LinesStrip, NbrCasesX + 1));

                for (int x = 0; x <= NbrCasesX; ++x)
                {
                        VertexBufferHorizontal[y][x].position.x = TousLesPoints[y][x].x + 0.5f;
                        VertexBufferHorizontal[y][x].position.y = TousLesPoints[y][x].y + 0.5f;
                        VertexBufferHorizontal[y][x].color = sf::Color::Cyan;
                }
        }

        VertexBufferVertical.reserve(NbrCasesX + 1);

        for (int y = 0; y <= NbrCasesX; ++y)
        {
                VertexBufferVertical.push_back(sf::VertexArray(sf::PrimitiveType::LinesStrip, NbrCasesY + 1));

                for (int x = 0; x <= NbrCasesY; ++x)
                {
                        VertexBufferVertical[y][x].position.x = TousLesPoints[x][y].x + 0.5f;
                        VertexBufferVertical[y][x].position.y = TousLesPoints[x][y].y + 0.5f;
                        VertexBufferVertical[y][x].color = sf::Color::Cyan;
                }
        }
        ////////////////
}
 

Et ca marche !
Merci beaucoup :)

et en plus je viens de remarquer que le fameux pixel en bas a gauche s'affiche desormais :)

En fait la fenetre va positionner les vertex entre chaque ligne de pixels affichables c'est ca ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Vue par defaut décalée de 1 pixel en x vers la droite ?
« Réponse #3 le: Décembre 04, 2013, 04:19:31 pm »
Ca dépend des primitives que tu traces. Pour les lignes c'est comme ça, pour le reste c'est différent.
Laurent Gomila - SFML developer