2017-02-24 31 views
14

我正在尋找glm的源代碼實現,我想知道他們爲什麼用聯合代表矢量值,而不是像floatint這樣的基本數據類型?爲什麼glm :: vec將vec值表示爲工會?

這是我在vec4實施來找到代碼:

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

的區別是什麼,如果我們只是寫T xT yT zT w

+1

只是說明:這使得'v.x == v.r == v.s' – pingul

回答

19

因爲vec4常用於:

  • 空間座標xyzw
  • 顏色成分rgba
  • 紋理座標stpq(雖然這些都不太標準化,我有一個LSO看出r和在不同的上下文中使用u

使用工會允許使用以訪問例如第二個數據成員爲.y.g,具體取決於您的偏好&語義。

+1

這是用法定義的行爲嗎?我知道與工會打字不是,但這不是真的打字。 – chbaker0

+1

@ chbaker0如果你只爲給定的成員使用一個名字,毫無疑問。如果你使用多個...我仍然這麼認爲。我更熟悉C語言,C語言專門針對工會。 C++似乎沒有,但我認爲「對象生命週期」(N4140 3.8.7)下的某些內容具有使其合法的效果,因爲不同的名稱是具有相同類型和相同存儲位置的不同「對象」 ,並且在使用一個和使用另一個(在一個技術上導致一個結束而另一個開始)的存儲器之間沒有釋放存儲器。 – hobbs

+0

@ chbaker0:是的,這是明確定義的行爲,因爲所有類型都是相同的。是的,即使在C++中也是如此。 –

16

GLM的設計行爲就像GLSL一樣,C++允許。在GLSL中,矢量的調劑操作可以使用xyzw,rgbastpq,其中相應的元素名稱引用矢量的相同元素。因此,聯合會用於匹配此行爲。

+2

加號之一用於突出顯示兼容性對於GLSL,我沒有考慮過這一點。 – Angew

+0

這是真正的原因。 GLM的行爲不像本機設計的C++類。 –