SFML community forums

Help => Graphics => Topic started by: cooldog99 on February 15, 2012, 05:22:51 pm

Title: Help with vertex arrays!
Post by: cooldog99 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? :(
Title: Help with vertex arrays!
Post by: texus on February 15, 2012, 05:30:29 pm
Shapes still exist. For convex polygons you should take a look here (http://www.sfml-dev.org/documentation/2.0/classsf_1_1ConvexShape.php).

I can't help you with your problem though, because I never used the vertex array.
Title: Help with vertex arrays!
Post by: cooldog99 on February 15, 2012, 08:16:44 pm
Quote from: "texus"
Shapes still exist. For convex polygons you should take a look here (http://www.sfml-dev.org/documentation/2.0/classsf_1_1ConvexShape.php).

I can't help you with your problem though, because I never used the vertex array.


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?
Title: Help with vertex arrays!
Post by: Laurent 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.
Title: Help with vertex arrays!
Post by: cooldog99 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.

is there a detailed shader documentation anywhere? for the newest builds?
Title: Help with vertex arrays!
Post by: Laurent on February 15, 2012, 10:22:43 pm
Quote
is there a detailed shader documentation anywhere? for the newest builds?

Not yet. But the old tutorial + the 2.0 doc + a GLSL reference should be enough.