The new GLM syntax
The new version of openFrameworks replaces the internal math library with GLM. GLM is a solid C++ library used for all the math operations needed when doing vectors and matrices operations. The use of this library implies some change in the syntax used to declare vectors and to execute vector's operation. The legacy mode is still supported, but the new mode, enabled by default, uses the new glm syntax.
If you are not interested using this library and you want to continue using the syntax you were used to, or if you want to run an old project using the last openFrameworks master branch, you can define the OF_USE_LEGACY_MESH constant in ofConstants.h. Doing this, glm will be disabled for ofPolyline and ofMesh.
Instead, if you want to use GLM and prepare yourself for what will be the future syntax adopted by openFrameworks, these are the things that are changed:
Declaring the vectors
When declaring vectors in the header file, you have to change
ofVec3f myVector; ofVec2f my2dVector;
glm::vec3 myVector glm::vec2 my2dVector;
When the vectors come, for example, from a mesh, you don't have to worry about the type declaration, since c++ 11 you have the wonderful
auto keywords, that tells to the compiler to figure out the type for you. For example, if you have code like:
vector<ofVec3f> normals = mesh.getNormals();
And you want to migrate it to the new mode, just use auto
auto normals = mesh.getNormals();
Methods are now plain
c functions. Most methods have the exact same name but without camel case and others are slightly different:
glm::mix(a, b, 0.5);
glm::mix(v, v1, 0.5)
When using the pure glm mode (enabled by default right now) you'll usually need to change any container of ofVec to a container of glm::vec.
As said before, if it's in a function using
auto is the best solution since the compiler can automatically detect the type, and it will work for both modes, the glm one and the legacy one.
There's also some typedefs that can be used to make containers compatible with both the legacy and glm mode:
std::vector<ofVec3f> in legacy mode or
std::vector<glm::vec3> in glm mode
Caveats when using ofVec
All the old ofVec (and matrices) classes autoconvert and can be created from glm so although everything in the core now returns or accepts as parameters glm you can still use ofVec even in pure glm mode:
ofVec3f pos = camera.getGlobalPosition();
will still work, although getGlobalPosition is now returning
won't work anymore you have to change it to:
ofVec3f cameraPos = camera.getGlobalPosition(); cameraPos.distance(node.getGlobalPosition());