2017-10-08 3 views
1

J'essaie de créer un ensemble de vecteurs GLM std :: (spécifiquement pour glm :: vec3). Puisque C++ ne sait pas comment effectuer l'opération < sur les vecteurs, je dois passer une fonction de comparaison.Comment utiliser les fonctions relationnelles vectorielles de GLM?

Je peux écrire mon propre en créant une structure comme ceci:

struct compareVec 
{ 
    bool operator() (const glm::vec3& lhs, const glm::vec3& rhs) const 
    { 
     return lhs.x < rhs.x && lhs.y < rhs.y && lhs.z < rhs.z; 
    } 
}; 
std::set< glm::vec3, compareVec > myset; 

Cependant, je suis sûr que GLM inclut leurs propres fonctions de comparaison de vecteur.

Je trouve la ressource suivante, mais je ne suis pas sûr de savoir comment l'utiliser: https://glm.g-truc.net/0.9.4/api/a00137.html

Comment passer une de ces fonctions de comparaison à mon jeu?

+0

Un exemple fantastique de pourquoi je devrais utiliser les fonctions de comparaison de GLM! – StickyBits

+0

Peu de sujet: Vous ne devriez pas implémenter

+0

Pouvez-vous essayer 'set myset (& compareVec); ' –

Répondre

0

Ok, presque là! Le glm :: lessThan renvoie un type de vecteur, pas un booléen. C'est pourquoi votre comparateur ne fonctionne pas. Vous pouvez utiliser glm::all pour obtenir un bool. De la documentation de glm::all

bool GLM :: tous (vecType < bool> const & v)

Renvoie true si toutes les composantes de x sont vraies. Paramètres du modèle vecType Types de vecteur booléen.

Si cela a un sens pour vous, vous devez décider par vous-même, même si je recommande contre celle-ci, pour autant que je comprends, conduira à la question suivante:

Consider: 
lhs = (1,2,3) 
rhs = (0,1,4) 

Than: 

lhs < rhs ==> false, since lhs.x and lhs.y are larger than the corresponding components of rhs 
rhs < lhs ==> false, since rhs.z component is larger than lhs.z 

Depuis aucun vecteur ne peut être ordonné être inférieur, ceci implique qu'ils sont égaux. Je doute que ce soit le comportement que vous avez en tête (je vous avertissais déjà à ce sujet).

Si vous décidez encore l'utiliser, voici un exemple de travail minimal testé sur MSVC2010:

#include <set> 
#include <glm/vec3.hpp> 
#include <glm/detail/func_vector_relational.hpp> 

struct compareVec 
{ 
    bool operator() (const glm::vec3& lhs, const glm::vec3& rhs) const 
    { 
     return glm::all(glm::lessThan(lhs, rhs)); 
    } 
}; 

int main() 
{ 

    std::set<glm::vec3, compareVec> myset; 

    return 0; 
} 

Peut-être que cela aide.