### Author Topic: Help with vertex arrays!  (Read 4767 times)

0 Members and 1 Guest are viewing this topic.

#### cooldog99

• Jr. Member
• Posts: 95
##### Help with vertex arrays!
« on: February 15, 2012, 05:22:51 pm »
Since laurent got rid of the old shape styles and added vertex arrays (not saying this is bad, but it did help)

I've had an issue with trying to make shapes that aren't quads.

basically if I try to do anything above 3(tri), or 4(quad) vertices it gets screwy.

I have a "DrawHexagon" function that draws 6 vertices successfully, as a triangle fan, however the first vertice of this is always 0,0 with a white color.
all others are fine.
here is code

Code: [Select]
`void DrawHexagon(float X, float Y, float W, float H, sf::Color Col){ sf::VertexArray Hex(sf::TrianglesFan, 6); float HalfWidth = W / 2; float HalfHeight = H / 2; Hex.Append(sf::Vertex(sf::Vector2f(X, Y + HalfHeight), Col)); Hex.Append(sf::Vertex(sf::Vector2f(X + (HalfWidth / 2), Y), Col)); Hex.Append(sf::Vertex(sf::Vector2f(X + HalfWidth + (HalfWidth / 2), Y), Col)); Hex.Append(sf::Vertex(sf::Vector2f(X + W, Y + HalfHeight), Col)); Hex.Append(sf::Vertex(sf::Vector2f(X + HalfWidth + (HalfWidth / 2), Y + H), Col)); Hex.Append(sf::Vertex(sf::Vector2f(X + (HalfWidth / 2), Y + H), Col)); App.Draw(Hex);}`

Is there something wrong? O_o
Am I using wrong primitive type? :?
Why is there no Polygon primitive type, like openGL?
I'm a noob to vertex's :/

I'm trying to make a bunch of custom shape functions for a new game we're developing  :wink:

So much new stuff lately in sfml2, i'm trying to keep up!
I feel dumb, can anyone help?

#### texus

• Hero Member
• Posts: 503
##### Help with vertex arrays!
« Reply #1 on: February 15, 2012, 05:30:29 pm »
Shapes still exist. For convex polygons you should take a look here.

TGUI: C++ SFML GUI

#### cooldog99

• Jr. Member
• Posts: 95
##### Help with vertex arrays!
« Reply #2 on: February 15, 2012, 08:16:44 pm »
Quote from: "texus"
Shapes still exist. For convex polygons you should take a look here.

That does help for what I need, thanks.

But i'd still like some info on vertex arrays

also, is there a crash course on using shaders in sfml I can find?
not just implementing, but writing the actual shader too?

#### Laurent

• Hero Member
• Posts: 32504
##### Help with vertex arrays!
« Reply #3 on: February 15, 2012, 08:42:24 pm »
You create your vertex array with an initial number of 6 points, but with Append you add other points instead of filling the 6 initial points. So you end up with 12 points: 6 empty + 6 of your hexagon.

So either you set an initial number of points and use operator[] to access them, or you only use Append.

By the way, your function would be much more efficient (no dynamic allocation/deallocation) with a fixed-size array of vertices allocated on the stack:
Code: [Select]
`void DrawHexagon(float X, float Y, float W, float H, sf::Color Col){    float HalfWidth = W / 2;    float HalfHeight = H / 2;    sf::Vertex Hex[6] =   {      sf::Vertex(sf::Vector2f(X, Y + HalfHeight), Col),      sf::Vertex(sf::Vector2f(X + (HalfWidth / 2), Y), Col),      sf::Vertex(sf::Vector2f(X + HalfWidth + (HalfWidth / 2), Y), Col),      sf::Vertex(sf::Vector2f(X + W, Y + HalfHeight), Col),      sf::Vertex(sf::Vector2f(X + HalfWidth + (HalfWidth / 2), Y + H), Col),      sf::Vertex(sf::Vector2f(X + (HalfWidth / 2), Y + H), Col)   }   App.Draw(Hex, 6, sf::TrianglesFan); }`

sf::VertexArray is really just a std::vector<sf::Vertex>. Don't overuse it.
Laurent Gomila - SFML developer

#### cooldog99

• Jr. Member
• Posts: 95
##### Help with vertex arrays!
« Reply #4 on: February 15, 2012, 09:08:00 pm »
Quote from: "Laurent"
You create your vertex array with an initial number of 6 points, but with Append you add other points instead of filling the 6 initial points. So you end up with 12 points: 6 empty + 6 of your hexagon.

So either you set an initial number of points and use operator[] to access them, or you only use Append.

By the way, your function would be much more efficient (no dynamic allocation/deallocation) with a fixed-size array of vertices allocated on the stack:
Code: [Select]
`void DrawHexagon(float X, float Y, float W, float H, sf::Color Col){    float HalfWidth = W / 2;    float HalfHeight = H / 2;    sf::Vertex Hex[6] =   {      sf::Vertex(sf::Vector2f(X, Y + HalfHeight), Col),      sf::Vertex(sf::Vector2f(X + (HalfWidth / 2), Y), Col),      sf::Vertex(sf::Vector2f(X + HalfWidth + (HalfWidth / 2), Y), Col),      sf::Vertex(sf::Vector2f(X + W, Y + HalfHeight), Col),      sf::Vertex(sf::Vector2f(X + HalfWidth + (HalfWidth / 2), Y + H), Col),      sf::Vertex(sf::Vector2f(X + (HalfWidth / 2), Y + H), Col)   }   App.Draw(Hex, 6, sf::TrianglesFan); }`

sf::VertexArray is really just a std::vector<sf::Vertex>. Don't overuse it.

Ah, that makes sense  :wink:

thanks.