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

Auteur Sujet: LineStrip avec épaisseur...  (Lu 3477 fois)

0 Membres et 1 Invité sur ce sujet

cantor

  • Newbie
  • *
  • Messages: 15
    • Voir le profil
    • E-mail
LineStrip avec épaisseur...
« le: Janvier 12, 2014, 06:43:22 pm »
Bonjour à tous,

Premièrement bravo pour cette superbe librairie!

J'expose mon problème ici, car c'est une fonctionnalité que je ne trouve pas dans l'API (qui existe peut-être, mais où?)

J'utile des tableaux de Vertex pour construire des formes assez compliqués. Ces formes sont stockés dans une classe Transformable et Drawable, ce qui rend ensuite ces formes très pratique à manipuler au niveau du dessus.

En général ces formes sont des LinesStrip, ou plus rarement des Lines. J'utilise ensuite la fonction sf::RenderTarget::draw et tout fonctionne à merveille.

Oui.. sauf que, parfois j'aimerais ré-utiliser ces formes en les dessinant avec une épaisseur de trait. Bas niveau, ça va revenir (j'imagine) à dessiner des TrianglesStrip autour des lignes existantes, sauf que les coordonnées sont incroyablement pénible à calculer....

La plus simple de mes classes ressemble à quelque chose du genre:
class DZ : public Drawable, public Transformable {
public:
        DZ (float W, float H) : rect(Vector2f(W,H)) {
                rect.setOutlineColor(Color::White);
                rect.setFillColor(Color::Black);
                rect.setOutlineThickness (1);
               
                int i=0;
                v[i++].position = Vector2f (50, 25);
                v[i++].position = Vector2f (50, H/2);
                v[i++].position = Vector2f (50-10, H/2-10);
                v[i++].position = Vector2f (50-10, H/2+10);
                v[i++].position = Vector2f (50, H/2);
                v[i++].position = Vector2f (50, H-10);
                v[i++].position = Vector2f (W-50, H-10);
               
                // Ca aussi c'est pénible d'avoir à écrire une boucle quand tout est de la même couleur
                for (i = 0; i < 7; i++) v[i].color=green;
        }
private:
        virtual void draw (RenderTarget &target, RenderStates states) const {
                states.transform *= getTransform();
                target.draw (rect, states);
                target.draw (v, 7, LinesStrip, states);
        }
        RectangleShape rect;
        Vertex v[7];
};
 

Idéalement j'aimerais une fonction RenderTarget::drawLineStrip prennent une épaisseur en argument...


Excellium

  • Jr. Member
  • **
  • Messages: 70
    • Voir le profil
Re : LineStrip avec épaisseur...
« Réponse #1 le: Janvier 12, 2014, 09:32:18 pm »
Salut,
Connaissant la réponse de Laurent (et approuvant pour des raisons évidentes) je ne saurai que te conseiller de t'appuyer sur ce code en provenance du wiki :https://github.com/SFML/SFML/wiki/Source%3A-Drawable-Line-Shape

Cordialement
"Everything should be made as simple as possible, but not simpler."

cantor

  • Newbie
  • *
  • Messages: 15
    • Voir le profil
    • E-mail
LineStrip avec épaisseur...
« Réponse #2 le: Janvier 12, 2014, 10:42:14 pm »
Merci

Ce genre de classe, qui fait des appels OpenGL pour le dessin, a selon moi sa place dans la librairie. Dessiner des formes avec une épaisseur c'est quand même suffisamment bas niveau.

Surtout que d'après ce wiki, il suffit d'appeler
glLineWidth(m_fLineThickness);
au bon endroit...

Sauf que:
Citer

Re: Better Line Thickness and OpenGL
« Reply #1 on: April 28, 2012, 07:34:04 AM »
Hi

Your arguments are valid, but it's not so easy.

glLineWidth is marked as deprecated in OpenGL 3.0, kept in OpenGL 3.1+ but then the standard says that line widths > 1 are supposed to return an error. In the end, it is highly implementation dependant. Even when width > 1 works, there's a limit which can be lower than you would expect.

That's why so many people create lines with quads, rather than lines + glLineWidth.

Donc je retire ce que j'ai dis, faut surtout pas intégrer ça. Mais une méthode qui transforme un tableau de vertex en quads ou en TriangleStrip, par contre, serait sympa. Vu que c'est quelque chose que tout le monde va faire dans son coin, autant que ça soit fait une seule fois, et proprement.
« Modifié: Janvier 12, 2014, 11:25:06 pm par cantor »

 

anything