Clean up the Swizzle Operators section

This commit is contained in:
Jesse Talavera-Greenberg 2015-11-27 17:31:52 -05:00
parent a6eda35cc6
commit e789f620dc

View File

@ -212,11 +212,11 @@ vec3 D = B.rsz; // Invalid, won't compile
GLM optionally supports some of this functionality, through the methods described in the following sections. Swizzle operators can be enabled by defining \verb|GLM_SWIZZLE| before including any GLM header files, or as part of your project's build process. GLM optionally supports some of this functionality, through the methods described in the following sections. Swizzle operators can be enabled by defining \verb|GLM_SWIZZLE| before including any GLM header files, or as part of your project's build process.
\emph{Note that swizzle operators will massively increase the size of your binaries and the time it takes to compile them!} \emph{Note that enabling swizzle operators will massively increase the size of your binaries and the time it takes to compile them!}
\subsection{Default C++98 Implementation} \subsection{Default C++98 Implementation}
When compiling as C++98, R-value swizzle operators are simulated through member functions of each vector type. When compiling GLM as C++98, R-value swizzle operators are simulated through member functions of each vector type.
\begin{cppcode} \begin{cppcode}
#define GLM_SWIZZLE // Or define when building (e.g. -DGLM_SWIZZLE) #define GLM_SWIZZLE // Or define when building (e.g. -DGLM_SWIZZLE)
@ -245,8 +245,8 @@ void foo()
{ {
glm::vec3 A(1.0f, 0.5f, 0.0f); glm::vec3 A(1.0f, 0.5f, 0.0f);
// No compiler error but A is not affected // No compiler error, but A is not modified.
// This code is modifying the components of an anonymous copy. // An anonymous copy is being modified (and then discarded).
A.bgr() = glm::vec3(2.0f, 1.5f, 1.0f); // A is not modified! A.bgr() = glm::vec3(2.0f, 1.5f, 1.0f); // A is not modified!
} }
\end{cppcode} \end{cppcode}
@ -254,14 +254,13 @@ void foo()
\subsection{Anonymous Union Member Implementation} \subsection{Anonymous Union Member Implementation}
Visual C++ supports, as a \emph{non-standard language extension}, anonymous \verb|struct|s in \verb|union|s. This enables a very powerful implementation of swizzle operators on Windows, which both allows L-value swizzle operators and reduces the need for parentheses. This implementation of the swizzle operators is only enabled when the language extension is enabled and \verb|GLM_SWIZZLE| is defined. Visual C++ supports, as a \emph{non-standard language extension}, anonymous \verb|struct|s in \verb|union|s. This enables a very powerful implementation of swizzle operators on Windows, which both allows L-value swizzle operators and makes the syntax for it closer to GLSL's. This implementation of the swizzle operators is only enabled when the language extension is enabled and \verb|GLM_SWIZZLE| is defined.
\begin{cppcode} \begin{cppcode}
#define GLM_SWIZZLE #define GLM_SWIZZLE
#include <glm/glm.hpp> #include <glm/glm.hpp>
// Only guaranteed to work with Visual C++! // Only guaranteed to work with Visual C++!
//
// Some compilers that support Microsoft extensions may compile this. // Some compilers that support Microsoft extensions may compile this.
void foo() void foo()
{ {
@ -278,7 +277,7 @@ void foo()
} }
\end{cppcode} \end{cppcode}
This implementation returns implementation-specific objects that \emph{implicitly convert} to their respective vector types. Unfortunately, these extra types can't be interpreted by GLM functions, which means the programmer must convert a swizzle-made \say{vector} to a conventional vector type or call a swizzle object's \verb|operator()| to pass it to another C++ function. This versions returns implementation-specific objects that \emph{implicitly convert} to their respective vector types. Unfortunately, these extra types can't be directly used by GLM functions; the programmer must instead convert a swizzle-made \say{vector} to a conventional vector type or call the swizzle object's \verb|operator()|.
\begin{cppcode} \begin{cppcode}
#define GLM_SWIZZLE #define GLM_SWIZZLE
@ -293,12 +292,10 @@ void foo()
// Generates compiler errors. Color.rgba is not a vector type. // Generates compiler errors. Color.rgba is not a vector type.
vec4 ClampedA = glm::clamp(Color.rgba, 0.f, 1.f); // ERROR vec4 ClampedA = glm::clamp(Color.rgba, 0.f, 1.f); // ERROR
// We need to cast the swizzled vector into glm::vec4 // Explicit conversion through a constructor
// Either use a constructor...
vec4 ClampedB = glm::clamp(vec4(Color.rgba), 0.f, 1.f); // OK vec4 ClampedB = glm::clamp(vec4(Color.rgba), 0.f, 1.f); // OK
// ...or operator() // Explicit conversion through operator()
vec4 ClampedC = glm::clamp(Color.rgba(), 0.f, 1.f); // OK vec4 ClampedC = glm::clamp(Color.rgba(), 0.f, 1.f); // OK
} }
\end{cppcode} \end{cppcode}