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

Auteur Sujet: Meilleur moyen pour appliquer une transformation par vertex.  (Lu 4710 fois)

0 Membres et 1 Invité sur ce sujet

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Meilleur moyen pour appliquer une transformation par vertex.
« le: Septembre 22, 2013, 09:58:35 am »
Salut,
je m'explique, j'ai une tile que je voudrais positionné par rapport à son coin supérieur gauche puis la redimentionner par rapport à son centre.

J'ai essayer de faire cela en positionnant un sprite avec l'origine a 0, 0 puis de combiner la transormation avec une autre qui fait un redimentionnement autour du centre de la tile mais ça ne marche pas pour la simple et bonne raison que, la position de la tile est toujours à l'origine de la transformation du coup même si je ne fait aucune translation lors de la seconde transformation, ma tile bouge quand même et donc n'est pas à la bonne place.

Après des jours de réflexion je n'ai trouvé qu'une seule solution, faire une translation de tout les vertex de la tile puis ensuite, redimentionner tout les vertex de la tile autour du vertex au centre de la tile. (l'origine est donc donné en coordonnée globale et non plus en coordonnée locales.)

Voici ce que ça donne avec un code source, en prenant juste le vertex haut gauche de la tile : (Ma tile fait 100 de largeur et 50 de hauteur.)

TransformMatrix tm;
tm.setTranslation(-50, 0);
Vec2f point(0, 0);
Vec2f result = tm.transform(point);
tm.setScale(2, 2);
tm.setOrigin(Vec2f(0, 25));
result = tm.transform(result);
cout<<result<<endl;
 

Vec2f TransformMatrix::transform (const Vec2f vec2) {
    Vec2f d (vec2.x - o2d.x, vec2.y - o2d.y);

    if (needToUpdate2D) {
        float angle = Math::toRadians(r2d);
        float ssx, scx, ssy, scy, tx, ty;
        ssx = Math::sinus(angle) * s2d.x;
        scx = Math::cosinus(angle) * s2d.x;
        ssy = Math::sinus(angle) * s2d.y;
        scy = Math::cosinus(angle) * s2d.y;
        tx = t2d.x;
        ty = t2d.y;
        matrix3f.m11 = scx;
        matrix3f.m12 = -ssy;
        matrix3f.m13 = tx;
        matrix3f.m21 = ssx;
        matrix3f.m22 = scy;
        matrix3f.m23 = ty;
        matrix3f.m31 = 0;
        matrix3f.m32 = 0;
        matrix3f.m33 = 1;
        needToUpdate2D = false;
    }
    return matrix3f * d + o2d;
}
 

Donc en gros il n'y a pas moyen de faire ce que je veux faire en utilisant une seule matrice de transformation pour tous les vertex de la tile, je ne peux pas non plus faire une matrice de transformation et l'envoyer à opengl car je fait une opération - et + sur la position de mes vertex avant et après la transformation. (Aïe!)

Faire ma propre classe Tile et effecuer une transformation de chaque vertex de la tile au niveau du CPU serait trop coûteux alors j'aimerais savoir quelle serait la meilleur solution pour faire ça.

« Modifié: Septembre 22, 2013, 10:01:19 am par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #1 le: Septembre 22, 2013, 10:59:03 am »
Bon bah je pense que je vais utiliser un vertex shader et lui passer l'origine de l'entité en paramètre ou bien essayer de calculer le décalage que j'ai en de trop pour la deuxième transformation et le rajouter à la dernière colonne de la matrice mais si je n'y arrive pas j'utiliserai un shader.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #2 le: Septembre 22, 2013, 12:11:20 pm »
Bon finalement je vais faire comme le fait opengl4, c'est à dire, passer mon sf::transform mais avec en plus l'origine de transformation du vertex à un VertexShader, je pense que c'est la meilleur manaière de faire.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #3 le: Septembre 22, 2013, 02:13:39 pm »
Haaaa ça ye est ça fonctionne enfin!!!

Les shaders, c'est tout simplement magiiik!  :D

uniform vec4 origin;
uniform mat4 modelViewMatrix;
void main () {

    // transforme la position du vertex
    gl_Position = gl_ProjectionMatrix * (modelViewMatrix * (gl_Vertex - origin) + origin);

    // transforme les coordonnées de texture
    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;

    // transmet la couleur
    gl_FrontColor = gl_Color;
       
}
 
#include "tGround.h"
#include "ihm.h"
TileGround::TileGround (Tile *tile) : TexturedDynamicDrawableEntity (tile->getPosition(), tile->getSize(),tile->getSize() * 0.5f, Entity::E_GROUND) {
    this->tile = tile;
}
const sf::Texture& TileGround::getTexture () {
    return tile->getTexture();
}
IntRect TileGround::getTextRect() {
    return tile->getTextRect();
}
void TileGround::setSelected(bool b) {
    tile->setSelected(b);
}
bool TileGround::isSelected () {
    return tile->isSelected();
}
void TileGround::setZOrder (int zOrder) {
    tile->setZOrder(zOrder);
}
int TileGround::getZOrder () {
    return tile->getZOrder();
}
void TileGround::draw (RenderTarget &target, RenderStates states) const {
    states.transform = states.transform * getTransform();
    Shader &shader = IHM::getShader();
    shader.setParameter("modelViewMatrix", states.transform);
    Vec2f center = const_cast<TileGround*> (this)->getCenter();
    shader.setParameter("origin", center.x, center.y, 0, 0);
    target.draw(*tile, &shader);
}
Tile* TileGround::getTile () {
    return tile;
}
 
#include "tile.h"

#include "../world/gridMap.h"
#include "../Lighting/shadow.h"
#include "../Lighting/wall.h"
#include "ihm.h"
using namespace sf;
using namespace std;

/*Gère les différents tiles, cette classe hérite de Sprite.
*/

//Crée un tile, avec une image passée en paramètre.
Tile::Tile (sf::Texture &image, Vec2f position, Vec2f size, IntRect subRect, bool bToAnim) : TexturedDynamicDrawableEntity (position, Vec2f (subRect.width, subRect.height), size * 0.5f, E_TILE) {
    sprite.setTexture(image);
    sprite.setTextureRect(subRect);
    sprite.setPosition(position.x, position.y);
    float factorX = size.x / (float) subRect.width;
    float factorY = size.y / (float) subRect.height;
    setScale(Vec2f(factorX, factorY));
    this->bToAnim = bToAnim;
    selected = false;
    zOrder = 0;

}
void Tile::setZOrder(int zOrder) {
    this->zOrder = zOrder;
}
int Tile::getZOrder() {
    return zOrder;
}
void Tile::setSelected (bool b) {
    cout<<"Selected : "<<b<<endl;
    if (b) {

        int x = getPosition().x;
        int y = getPosition().y;
        int w = getSize().x;
        int h = getSize().y;
        border = RectangleShape (Vector2f(w, h));
        border.setPosition(Vector2f(x, y));
        border.setOutlineColor(Color(255, 0, 0));
        border.setFillColor(Color(0, 0, 0, 0));
        border.setOutlineThickness(1.f);
        border.setZOrder(NB_LAYERS - 1);
    } else {
        border.setOutlineThickness(0.f);
    }
    selected = b;
}
bool Tile::isSelected () {
    return selected;
}
const Texture& Tile::getTexture () {
    return *sprite.getTexture();
}
sf::IntRect Tile::getTextRect() {
    return sprite.getTextureRect();
}
bool Tile::belongToAnim () {
    return bToAnim;
}

bool Tile::operator== (Tile &tile) {

    return sprite.getTexture() == tile.sprite.getTexture() &&
           getPosition().x == tile.getPosition().x &&
           getPosition().y == tile.getPosition().y &&
           getSize().x == tile.getSize().x &&
           getSize().y == tile.getSize().y &&
           getZOrder() == tile.getZOrder() &&
           getType() == tile.getType () &&
           sprite.getTextureRect().left == tile.sprite.getTextureRect().left &&
           sprite.getTextureRect().top == tile.sprite.getTextureRect().top &&
           sprite.getTextureRect().height == tile.sprite.getTextureRect().height &&
           sprite.getTextureRect().width == tile.sprite.getTextureRect().width;

}
bool Tile::operator!= (Tile &tile) {
    return !(*this == tile);
}
void Tile::draw(RenderTarget &target, RenderStates states) const {
    states.transform = states.transform * getTransform();
    Shader &shader = IHM::getShader();
    shader.setParameter("modelViewMatrix", states.transform);
    Vec2f center = const_cast<Tile*> (this)->getCenter();
    shader.setParameter("origin", center.x, center.y, 0, 0);
    target.draw(sprite, &shader);
    target.draw (border);
}
//Getter.
Sprite& Tile::getSprite () {
    return sprite;
}

Tile::~Tile () {

}
 
#ifndef DYNAMIC_DRAWABLE_ENTITY
#define DYNAMIC_DRAWABLE_ENTITY
#include "drawableEntity.h"
#include "../Math/transformMatrix.h"
class DynamicDrawableEntity : public DrawableEntity {
public :

    BoundingRectangle getLocalBounds() {
        return localBounds;
    }
    void setCenter(Vec2f center) {
        Vec2f t = center - m_center ;
        move(t);
    }
    Vec2f getCenter() {
        return m_center;
    }
    void setPosition(Vec2f position) {
        Vec2f t = position - m_position;
        move(t);
    }
    Vec2f getSize() {
        return m_size;
    }
    Vec2f getPosition() {
        return m_position;
    }
    void setRotation (float angle) {
        m_rotation = angle;
        tm.setRotation(angle);
        BoundingRectangle bounds = getGlobalBounds();
        m_size.x = bounds.getWidth();
        m_size.y = bounds.getHeight();
        Vec2f delta (m_size.x / localBounds.getWidth() * m_origin.x, m_size.y / localBounds.getHeight() * m_origin.y);
        m_position = m_center - delta;
        onRotate(angle);
    }
    void setScale(Vec2f scale) {
        m_scale = scale;
        tm.setScale(scale.x, scale.y);
        BoundingRectangle bounds = getGlobalBounds();
        m_size.x = bounds.getWidth();
        m_size.y = bounds.getHeight();
        Vec2f delta (m_size.x / localBounds.getWidth() * m_origin.x, m_size.y / localBounds.getHeight() * m_origin.y);
        m_position = m_center - delta;
        onScale(scale);
    }
    void scale(Vec2f s) {
        scale(m_scale * s);
    }
    void rotate (float angle) {
        setRotation(m_rotation + angle);
    }
    void move (Vec2f t) {
        m_position += t;
        m_center += t;
        onMove(t);
    }
    void setOrigin(Vec2f origin) {
       tm.setOrigin(origin);
    }

    Vec2f getScale() {
        return m_scale;
    }
    float getRotation() {
        return m_rotation;
    }
    Vec2f getOrigin() {
        return m_origin;
    }
    void setSize (Vec2f size) {
        setScale(size / m_size);
    }

    BoundingRectangle getGlobalBounds() {
        BoundingRectangle globalBounds = tm.transformRect(localBounds);
        return globalBounds;
    }
    const sf::Transform getTransform() const {
        return const_cast<DynamicDrawableEntity*> (this)->tm.convertToSFMLTransformMatrix();
    }
    const sf::Transform getInverseTransform()
    {
        return tm.convertToSFMLTransformMatrix().getInverse();
    }
protected :
    DynamicDrawableEntity(Vec2f position, Vec2f size, Vec2f origin, TYPE type) : DrawableEntity(type) {
        localBounds = BoundingRectangle(position.x, position.y, size.x, size.y);
        m_position = position;
        m_size = size;
        m_center = Vec2f (m_position.x + origin.x, m_position.y + origin.y);
        m_origin = origin;
        m_scale = Vec2f (1.f, 1.f);
        m_rotation = 0;
    }
    virtual void onRotate(float angle) {}
    virtual void onScale(Vec2f s) {}
    virtual void onMove(Vec2f t) {}
private :
    Vec2f m_position, m_center, m_size, m_origin, m_scale;
    float m_rotation;
    BoundingRectangle localBounds;
    TransformMatrix tm;
};
#endif // TRANSF_ENTITY

 

Maintenant j'ai une position, un centre, une origine et je peux faire des transformation autour de plusieurs origines. :)

Faire ça sans shader ça aurait été, chaud.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #4 le: Septembre 22, 2013, 07:12:17 pm »
C'est con, vu qu'une translation est représentable sous forme de matrice, l'opération que tu fais dans ton shader peut forcément être combinée sous la forme d'une seule matrice.

translation(-origin) * la_transformation * translation(origin)

C'est juste pour donner l'idée, c'est pas forcément correct.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #5 le: Septembre 23, 2013, 10:01:00 am »
Citer
C'est con, vu qu'une translation est représentable sous forme de matrice, l'opération que tu fais dans ton shader peut forcément être combinée sous la forme d'une seule matrice.

Ouais ça aurait pu marcher aussi, enfin bref..., maintenant que ça marche enfin je pense que je vais laisser comme ça, je n'avais pas envie de me casser la tête à chercher comment faire ça avec une seule matrice. (même si je pense honêtement que j'aurai pu éviter le shader.)

Par contre mon shader ne fonctionne pas lorsque je dessine sur une render texture : j'ai essayer de faire pareil avec les ombres et de les dessiner sur une render texture mais ça ne fonctionne pas, rien ne se dessine.

#include "shadowWall.h"
#include "wall.h"
ShadowWall::ShadowWall (const Light &light, Wall *wall) : Shadow (light, wall) {
    shadow = NULL;
    createShadow (light, wall);
}
void ShadowWall::createShadow (const Light &light, Wall *wall) {
    if (shadow != NULL)
        delete shadow;
    Vec2f lightPos (const_cast<Light&> (light).getCenter().x, const_cast<Light&> (light).getCenter().y);

    Vec2f v = lightPos.normalize() * WALL_HEIGHT;


    int lightHeight = const_cast<Light&> (light).getHauteur();
    float scale;
    if (lightHeight == 0)
        scale = 1.f;
    else if (lightHeight >= 200)
        scale = 0.f;
    else
        scale = 1.f /  (100.f / (float) const_cast<Light&> (light).getHauteur());
    shadow = new ConvexShape (wall->getBottomPoints().size() * 2);
    vector<Vec2f*> points;

    Vec2f positionShadow (wall->getBottomPoints()[0]->x, wall->getBottomPoints()[0]->y);

    for (int i = 0; i < wall->getBottomPoints().size(); i++) {
        Vec2f *point = new Vec2f(*wall->getBottomPoints()[i] - positionShadow);
        shadow->setPoint(i, Vector2f((int) point->x, (int) point->y));
        points.push_back(point);
    }
    for (int j = wall->getBottomPoints().size(), i = wall->getBottomPoints().size() - 1; i >=0 ; j++, i--) {
        Vec2f *projPoint = new Vec2f((*wall->getBottomPoints()[i] + -v * scale) - positionShadow);
        shadow->setPoint(j, Vector2f ((int) projPoint->x , (int) projPoint->y));
        points.push_back(projPoint);
    }
    Vec2f shadowOrigin = Computer::getMoy(points);
    shadow->setScale(Vec2f(1.f, scale));
    shadow->setFillColor(Color::Black);
    shadow->setPosition(positionShadow.x, positionShadow.y - shadowOrigin.y);
    for (unsigned int i = 0; i < points.size(); i++) {
        delete points[i];
    }
    points.clear();
    setZOrder(DEFAULT_SHADOW_Z_ORDER);
}

void ShadowWall::draw(RenderTarget &target, RenderStates states) const {
    states.transform = states.transform * getTransform();
    Shader &shader = IHM::getShader();
    shader.setParameter("modelViewMatrix", states.transform);
    Vec2f center = const_cast<Decor*> (this)->getCenter();
    shader.setParameter("origin", center.x, center.y, 0, 0);
    target.draw(*shadow, &shader);
}
Drawable* ShadowWall::getShadow () {
    return shadow;
}
int ShadowWall::getType() {
    return SHADOWWALL;
}
ShadowWall::~ShadowWall () {
    delete shadow;
}
 
RectangleShape rect;
        rect.setPosition(Vector2f(v2.x, v2.y));
        rect.setFillColor((Color(100, 100, 100, 128)));
        rect.setSize(Vector2f (view.getSize().x, view.getSize().y));

        vector<Shadow*> visibleShadows = World::getVisibleShadows();

        for (unsigned int i = 0; i < visibleShadows.size(); i++) {
                renderTextShadows.draw(*visibleShadows[i]);
                //draw(*visibleShadows[i]->getShadow());
        }

        renderTextShadows.draw(rect, RenderStates(BlendAdd));
        //draw(rect, RenderStates(BlendAdd));
    }

    renderTextShadows.display();

    //Rendu des lumières.
    renderTextLights.clear(ambientColor);
    if (!day) {

        vector<Light*> visibleLights = World::getVisibleLights();

        for (unsigned int i = 0; i < visibleLights.size(); i++) {
            renderTextLights.draw(*visibleLights[i], RenderStates(BlendAdd));
        }

    }

    //Rendu de la map. (partie visible à l'écran.)
    clear();
    setView(view);
    vector<DrawableEntity*> visibleTiles = World::getVisibleEntities();
    bool shadowRendered = false;


    for (unsigned int i = 0; i < visibleTiles.size(); i++) {
         if (day && !shadowRendered && visibleTiles[i]->getZOrder() >= DEFAULT_SHADOW_Z_ORDER) {
             Sprite shadows (renderTextShadows.getTexture());
             shadows.setPosition(v2.x, v2.y);
             draw (shadows, RenderStates(BlendMultiply));
             shadowRendered = true;
         }
         draw(*visibleTiles[i]);
    }
    if (!day) {
        Sprite lights (renderTextLights.getTexture());
        lights.setPosition(v2.x, v2.y);
        draw (lights, RenderStates(BlendMultiply));
    }
 




« Modifié: Septembre 23, 2013, 10:06:18 am par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #6 le: Septembre 23, 2013, 12:00:44 pm »
Ha voilà j'ai réussi à faire ça sans shader, en fait c'était tout con comme tu dis, merci.  :D

Vec2f TransformMatrix::transform (const Vec2f vec2) {
    if (needToUpdate2D) {
        float angle = Math::toRadians(r2d);
        float ssx, scx, ssy, scy, tx, ty;
        ssx = Math::sinus(angle) * s2d.x;
        scx = Math::cosinus(angle) * s2d.x;
        ssy = Math::sinus(angle) * s2d.y;
        scy = Math::cosinus(angle) * s2d.y;
        tx = -o2d.x * scx - o2d.y * ssy + t2d.x + o2d.x;
        ty = o2d.y * ssy - o2d.y * scy + t2d.y + o2d.y;
        matrix3f.m11 = scx;
        matrix3f.m12 = -ssy;
        matrix3f.m13 = tx;
        matrix3f.m21 = ssx;
        matrix3f.m22 = scy;
        matrix3f.m23 = ty;
        matrix3f.m31 = 0;
        matrix3f.m32 = 0;
        matrix3f.m33 = 1;
        needToUpdate2D = false;
    }
    return matrix3f * vec2;
}
 

Voilà maintenant je peux faire des transformations en utilisant plusieurs origine.  :D

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #7 le: Septembre 23, 2013, 01:16:36 pm »
Par contre j'ai une question : si je ne veut pas combiner les transformations, par exemple, je veux faire une translation d'un point autour d'une origine et ensuite un redimentionnement autour d'une autre origine y'a moyen de faire en sorte que les matrices de transformations ne se combine pas avec SFML ?

Ou bien faire une genre de pile de matrice pour faire un truc genre à ceci :

Vec2f point(0, 0);
    TransformMatrix tm;
    tm.setTranslation (50, 0);
    Vec2f result = tm.transform(point);
    cout<<result<<endl;
    tm.setOrigin(Vec2f(0, 25));
    tm.setScale(2, 2);
    result = tm.transform(result);
    cout<<result<<endl;
 

???

Plutôt que de toujours devoir faire une seule matrice.
« Modifié: Septembre 23, 2013, 01:19:01 pm par Lolilolight »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #8 le: Septembre 23, 2013, 01:42:53 pm »
Ça change quoi par rapport à sf::Transform ? On peut déjà y faire des rotations et scales par rapport à un centre choisi.

Genre
sf::Vector2f point(0, 0);
sf::Transform transf;
point = transf.translate(50, 0).scale(2, 2, 0, 25).transformPoint(point);
« Modifié: Septembre 23, 2013, 01:49:09 pm par G. »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #9 le: Septembre 23, 2013, 01:44:26 pm »
Je ne comprends pas trop ce que tu veux. Si tu ne veux pas combiner les matrices et bien tu ne les combines pas. Quel est le souci ?
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #10 le: Septembre 23, 2013, 02:13:10 pm »
Le soucis c'est que il me combine les transformations dans la fonction draw vu que le sprite hérite de transformable.


void Tile::draw(RenderTarget &target, RenderStates states) const {
    states.transform =  getTransform();
    target.draw(sprite, states);
    target.draw (border);
}
 

Je pense que je vais devoir utiliser un tableau de vertex et définir la position des vertex dans ma propre classe tile plutôt que de faire une translation du sprite, et ensuite faire un redimentionnement avec ma propre classe "transformable.".

J'ai voulu utiliser un sprite que je positionne et ensuite que je redimentionne autour du centre avec la classe tile qui est le noeud pour aller plus vite mais comme les matrices de transformation se combinent la tile n'est pas centrée. --'

Ou alors je modifie SFML...

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #11 le: Septembre 23, 2013, 02:32:51 pm »
Sinon à part ça juste une question on peut redéfinir la méthode draw (RenderTarget &target, sf::Transform transform) ?
Je voudrais avoir 2 méthodes, une qui combine les transformations et une autre qui ne les combine pas car dans certains cas je dois les combiner, dans d'autres cas non.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #12 le: Septembre 23, 2013, 02:59:46 pm »
Si tu veux deux fonctions draw avec des paramètres différents alors il faut se passer de sf::Drawable, faire tes propres fonctions et les appeler directement.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #13 le: Septembre 23, 2013, 04:58:40 pm »
Ok, merci pour l'info, sinon, j'ai essayer de faire ma propre classe pour afficher un sprite, malheureusement rien ne se dessine, ai je loupé quelque chose dans le tutoriel ?

#include "tile.h"

#include "../world/gridMap.h"
#include "../Lighting/shadow.h"
#include "../Lighting/wall.h"
#include "ihm.h"
using namespace sf;
using namespace std;

/*Gère les différents tiles, cette classe hérite de Sprite.
*/

//Crée un tile, avec une image passée en paramètre.
Tile::Tile (const sf::Texture &image, Vec2f position, Vec2f size, IntRect subRect, bool bToAnim) : TexturedDynamicDrawableEntity (position, Vec2f (subRect.width, subRect.height), Vec2f (subRect.width * 0.5f, subRect.height * 0.5f), E_TILE), m_texture(image) {
    m_vertices.setPrimitiveType(Quads);
    m_vertices.resize(4);
    textRect = subRect;
    Vertex *quad = &m_vertices[0];
    quad[0].position = Vector3f(position.x, position.y, -1);
    quad[1].position = Vector3f(position.x + size.x, position.y, -1);
    quad[2].position = Vector3f(position.x + size.x, position.y + size.y, -1);
    quad[3].position = Vector3f(position.x + size.x, position.y, -1);
    quad[0].texCoords = Vector2f(subRect.left, subRect.top);
    quad[1].texCoords = Vector2f(subRect.left, subRect.top + subRect.height);
    quad[2].texCoords = Vector2f(subRect.left + subRect.width, subRect.top + subRect.height);
    quad[3].texCoords = Vector2f(subRect.left + subRect.width, subRect.top);

    this->bToAnim = bToAnim;
    selected = false;
    zOrder = 0;

}
void Tile::setZOrder(int zOrder) {
    this->zOrder = zOrder;
}
int Tile::getZOrder() {
    return zOrder;
}
void Tile::setSelected (bool b) {

    if (b) {

        int x = getPosition().x;
        int y = getPosition().y;
        int w = getSize().x;
        int h = getSize().y;
        border = RectangleShape (Vector2f(w, h));
        border.setPosition(Vector2f(x, y));
        border.setOutlineColor(Color(255, 0, 0));
        border.setFillColor(Color(0, 0, 0, 0));
        border.setOutlineThickness(1.f);
        border.setZOrder(NB_LAYERS - 1);
    } else {
        border.setOutlineThickness(0.f);
    }
    selected = b;
}
bool Tile::isSelected () {
    return selected;
}
const Texture& Tile::getTexture () {
    return m_texture;
}
sf::IntRect Tile::getTextRect() {
    return textRect;
}
bool Tile::belongToAnim () {
    return bToAnim;
}

bool Tile::operator== (Tile &tile) {

    return &m_texture == &tile.getTexture() &&
           getPosition().x == tile.getPosition().x &&
           getPosition().y == tile.getPosition().y &&
           getSize().x == tile.getSize().x &&
           getSize().y == tile.getSize().y &&
           getZOrder() == tile.getZOrder() &&
           getType() == tile.getType () &&
           getTextRect().left == tile.getTextRect().left &&
           getTextRect().top == tile.getTextRect().top &&
           getTextRect().height == tile.getTextRect().height &&
           getTextRect().width == tile.getTextRect().width;
}
bool Tile::operator!= (Tile &tile) {
    return !(*this == tile);
}
void Tile::draw(RenderTarget &target, RenderStates states) const {
    states.transform *=  getTransform();
    states.texture = &m_texture;
    target.draw(m_vertices, states);
    target.draw (border);
}
void Tile::setColor (sf::Color color) {
    m_vertices[0].color = color;
    m_vertices[1].color = color;
    m_vertices[2].color = color;
    m_vertices[3].color = color;
}

Tile::~Tile () {

}
 

Mon sprite ne veut pas s'afficher. :/

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Meilleur moyen pour appliquer une transformation par vertex.
« Réponse #14 le: Septembre 23, 2013, 05:11:07 pm »
Ha nan c'est bon je m'étais trompé dans l'ordre des sommets et des coordonnées de textures.

 

anything