2017-02-24 24 views
14

Szukałem vec4 implementacji kodu źródłowego glm i zastanawiałem się, dlaczego reprezentują one wartości wektorowe w połączeniu, zamiast pierwotnych typów danych, takich jak float lub int?Dlaczego glm :: vec reprezentuje wartości vec jako związki?

Jest to kod znalazłem w vec4 realizacji:

union { T x, r, s; }; 
union { T y, g, t; }; 
union { T z, b, p; }; 
union { T w, a, q; }; 

Jaka jest różnica, jeśli po prostu napisać T x, T y, T z, T w?

+1

Uwaga: powoduje to, że 'v.x == v.r == v.s' – pingul

Odpowiedz

19

Ponieważ vec4 jest powszechnie stosowana do:

  • współrzędnych x, y, z, w
  • elementy Kolor r koordynuje g, b, a
  • Texture s, t, p, q (chociaż są one mniej wystandaryzowane, a ja mam lso seen r i u użyte w różnych kontekstach)

Używanie związków pozwala na dostęp do np. drugi element danych jako .y lub .g, w zależności od preferencji & semantyki.

+1

Czy to jest zachowanie zdefiniowane przez użytkownika? Wiem, że typowanie za pomocą unii nie jest, ale to nie jest typowe uderzenie. – chbaker0

+1

@ chbaker0 Jeśli użyjesz tylko jednego imienia dla danego członka, bez wątpienia. Jeśli używasz wielu ... wciąż tak myślę. Jestem bardziej zaznajomiony z C, który ma język specjalnie dla związków, które go obejmują. C++ nie wydaje się, ale myślę, że niektóre rzeczy w "Object Lifetimes" (N4140 3.8.7) dają efekt legalności, ponieważ różne nazwy to różne "obiekty" o tym samym typie i tej samej lokalizacji przechowywania , a pamięć nie zostaje uwolniona między używaniem jednego a drugim (co powoduje, że czas życia jednego się kończy, a drugi - technicznie). – hobbs

+0

@ chbaker0: Tak, to dobrze zdefiniowane zachowanie, ponieważ wszystkie typy są takie same. Tak, nawet w C++. –

16

GLM został zaprojektowany tak, aby zachowywał się jak GLSL tak bardzo, jak pozwala na to C++. W GLSL operacja swizzle dla wektorów może używać xyzw, rgba lub stpq, z odpowiednimi nazwami elementów odnoszącymi się do tych samych elementów wektora. Dlatego związek jest używany do dopasowania tego zachowania.

+2

Plus jedna z podświetlania kompatybilności z GLSL, nie rozważałem tego. – Angew

+0

To jest prawdziwy powód. GLM nie zachowuje się jak natywnie zaprojektowana klasa C++. –