{"id":362526,"date":"2024-05-21T01:36:56","date_gmt":"2024-05-21T01:36:56","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=362526"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-21T01:36:56","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=362526","title":{"rendered":"<span>\u041c\u0430\u0433\u0438\u044f swizzle \u0438\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u0432 C++<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>vec3 v0 = v1.xxy * 2<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e x, y, z \u0438 w \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0434\u043b\u0438\u043d\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u0430. \u042f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043e 4, \u043a\u0430\u043a \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u0438 \u043c\u0435\u043d\u044c\u0448\u0443\u044e \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0443\u044e, \u043f\u0440\u0438\u0447\u0435\u043c \u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u042d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &#8216;swizzle&#8217;, \u0438 \u043e\u043d\u0430 \u0447\u0435\u0440\u0442\u043e\u0432\u0441\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043c\u0430\u043b\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438\u043b\u0438 \u0446\u0432\u0435\u0442\u043e\u0432. \u0412\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u044e\u0434\u0443 \u0432 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 (\u0434\u0430 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0438\u0433\u0440\u043e\u0432\u044b\u0445), \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445. \u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c &#8216;swizzle&#8217; \u0432 \u043d\u0430\u0448 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0432 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b <code>vec2<\/code>, <code>vec3<\/code> \u0438 <code>vec4<\/code>. \u0412\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b: \u043a\u0430\u043a \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432 C++ \u043a\u043e\u0434\u0435, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044f \u043f\u043e\u0442\u0435\u0440\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7fc\/913\/390\/7fc91339005eb8d41b84a490f0802e1b.png\" width=\"679\" height=\"379\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7fc\/913\/390\/7fc91339005eb8d41b84a490f0802e1b.png\"\/><\/figure>\n<hr\/>\n<h2>\u0427\u0442\u043e \u0432 \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u0435 \u0442\u0435\u0431\u0435 \u043c\u043e\u0435\u043c&#8230;<\/h2>\n<p>\u041b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 swizzle &#8212; \u044d\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445:<\/p>\n<pre><code class=\"cpp\">vec3 vec{1.0, 2.0, 3.0}; vec4 a; vec3 b; vec2 c; float d;  b = vec.xyz;  \/\/ b is now (1.0, 2.0, 3.0) d = vec[2];   \/\/ d is now 3.0 a = vec.xxxx; \/\/ a is now (1.0, 1.0, 1.0, 1.0) c = vec.zx;   \/\/ c is now (3.0, 1.0) b = vec.rgb;  \/\/ b is now (1.0, 2.0, 3.0) a = vec.yy;   \/\/ error; incostistent size<\/code><\/pre>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 glm, \u0421xxSwizzle \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 glm \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0438\u043b\u0438 \u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0438\u0433\u0440\u043e\u0432\u044b\u043c\u0438 \u0434\u0432\u0438\u0436\u043a\u0430\u043c\u0438. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u043e\u0434 \u0432 \u043d\u0435\u0439 \u043e\u0447\u0435\u043d\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439 \u0438 \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u0438\u0435\u043c \u0442\u0440\u0443\u0434\u043d\u044b\u0445 90-\u0445 (\u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u0434 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0432 \u0438\u044e\u043d\u0435 1992 \u0433\u043e\u0434\u0430, \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 31 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434).<\/p>\n<p>\u0415\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <a href=\"https:\/\/github.com\/gwiazdorrr\/CxxSwizzle\" rel=\"noopener noreferrer nofollow\"><u>\u0437\u0434\u0435\u0441\u044c<\/u><\/a>. \u0422\u0430\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043d\u043e \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0438, \u0445\u043e\u0442\u044c \u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u0438\u0434\u0435. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0445\u043e\u0440\u043e\u0448\u0435\u0435, \u043d\u043e, \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u043a\u043e\u0434 \u0442\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u0439. \u041c\u044b \u0436\u0435 \u0445\u043e\u0442\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043f\u044f\u0442\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0430\u0445 \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u0430 \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0445, \u043f\u0440\u0430\u0432\u0434\u0430 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u0438\u0434\u0435. \u041f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043a \u043a\u043e\u0434\u0443 \u0445\u043e\u0447\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0438 \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/p>\n<ol start=\"0\">\n<li>\n<p>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0434\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u0430, \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430\u0445 SSE<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043c\u0435\u0436\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, v0.xxy + v1.xzy. \u042d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: (\u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443, \u0432 99% \u044d\u0442\u0438\u043c \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f) \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>v1.yxwy = v0;<\/code> \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u044b \u044f\u0432\u043d\u043e, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0438 \u043d\u0438 \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438: \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u0445. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e vec3 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u0442\u0440\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0432\u043e\u0435\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 <code>v1.yxwz = v0;<\/code> \u0431\u0435\u0437 \u0441\u043a\u043e\u0431\u043e\u043a: \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 union \u0438 \u043f\u0440\u043e\u043a\u0441\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0440\u044b\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p> <code>#define yxwz _yxwz()<br \/> vec4 vecb = veca.yxwz<\/code><\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043b\u044e\u0431\u044b\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u044e\u0442 \u043e\u0442\u043b\u0430\u0434\u043a\u0443, \u0437\u0430\u0441\u043e\u0440\u044f\u044e\u0442 \u043a\u043e\u0434 \u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432-\u043f\u0440\u043e\u043a\u0441\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u043c. \u041f\u043b\u044e\u0441, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043d\u0438\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0447\u0442\u043e \u0441\u043d\u0438\u0437\u0438\u0442 \u043e\u0431\u0449\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u041d\u0443 \u0438, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043b\u044e\u0431\u043b\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043a\u043e\u0434\u043e\u043c.<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e, \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0432 \u043a\u0443\u0440\u0438\u043b\u043a\u0435, \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 union &#8212; \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0442\u0430\u043a\u043e\u0433\u043e union&#8217;a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">union {     float v[2];     ??? xx;     ??? xy;     ??? yx;     ??? yy;     ... };<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0440\u0442\u043e\u043a \u0438 \u0443\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 union, \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c plain only data, \u0442\u0430\u043a \u043f\u0440\u043e\u0449\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u043a\u0443\u0441 \u0441\u043e \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u043e\u043c. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0440\u0443\u043a\u0430\u043c\u0438 &#8212; \u043f\u0443\u0441\u0442\u044c \u0442\u0440\u0443\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a (\u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434):<\/p>\n<pre><code class=\"cpp\">template&lt;T, X, Y> struct proxy {     template&lt;T, X2, Y2>     proxy operator = (const SwizzleProxy2&lt;T, X2, Y2> &amp;o) {         ((T*)this)[X] = ((T*)&amp;o)[X2];         ((T*)this)[Y] = ((T*)&amp;o)[Y2];         return this;     } }; <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0441\u0441\u044b\u043b\u0430\u0435\u043c\u0441\u044f \u043d\u0430 <code>this<\/code> \u0442.\u0435. \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044f, \u0447\u0442\u043e \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 swizzling \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u043b\u043e\u0431, \u043a\u0430\u043a \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u044b \u0432\u043e\u0440\u043d\u0438\u043d\u0433\u043e\u0432 \u043f\u043e\u0447\u0442\u0438 \u0443 \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0438 false positive \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432. \u041d\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0432\u044b\u0448\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0438\u0434\u0435\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u0432\u0443\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: xx, xy, wx \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 X \u0438 Y \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0442\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0435\u0442, \u0430 \u0442\u0430\u043a\u043e\u0435 \u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0443\u0447\u0443 \u0432\u043e\u0440\u043d\u0438\u043d\u0433\u043e\u0432 \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0435\u0440\u0432\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043f\u043e\u0434 ps5 \u0441lang, \u043d\u043e \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 10%. \u0421 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 5 \u0434\u043e \u0448\u0435\u0441\u0442\u0438 \u043c\u0438\u043d\u0443\u0442. \u041d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0442\u044c, \u0445\u043e\u0442\u044f \u0431\u044b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435, \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u043e\u0441\u044c \u0432 \u043d\u043e\u0440\u043c\u0443.<\/p>\n<pre><code class=\"cpp\">template&lt;T, int X, int Y> struct proxy { byte v;     ... };<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0432 \u043a\u043b\u0430\u0441\u0441 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c. \u0422\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 vec2\/3\/4, \u0442\u043e \u043d\u0430 \u0434\u043e\u043b\u044e swizzle \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u043a \u0432\u0435\u043a\u0442\u043e\u0440\u0443 \u0438 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430. \u0418\u0442\u0430\u043a \u043f\u0435\u0440\u0432\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043a\u0430\u043a \u043e\u043d\u0430 \u0443\u0448\u043b\u0430 \u0432 \u0434\u0432\u0438\u0436\u043e\u043a.<\/p>\n<pre><code class=\"cpp\">template&lt;template&lt;typename> class TT, typename T, size_t X, size_t Y> struct swizzle_vec2{   T v[2]; inline TT&lt;T>&amp; operator=(const TT&lt;T>&amp; rhs) { v[X]= rhs[0]; v[Y]= rhs[1]; return*(TT&lt;T>*)this; } inline auto &amp;operator=(const swizzle_vec2&amp; rhs) { v[X]= rhs.v[X]; v[Y]= rhs.v[Y]; return*this; } inline operator TT&lt;T>() const { return TT&lt;T>{v[X], v[Y]}; } }; <\/code><\/pre>\n<p>\u0418 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 vec3\/vec4. \u0412 \u0434\u0432\u0438\u0436\u043a\u0435 \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 DRY, \u043d\u043e \u0434\u043b\u044f \u043e\u0431\u043a\u0430\u0442\u043a\u0438 \u0444\u0438\u0447\u0438 \u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0440\u0435\u0448\u0438\u043b\u0438 \u0443\u043b\u0443\u0447\u0448\u0430\u0439\u0437\u0438\u043d\u0433 \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u043f\u043e\u043f\u043e\u0437\u0436\u0435, \u0441\u043e\u0431\u0440\u0430\u0432 \u043e\u0442\u0437\u044b\u0432\u044b \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043d\u043e\u0432\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c.<\/p>\n<pre><code class=\"cpp\">template&lt;template&lt;typename> class TT, typename T, size_t X, size_t Y, size_t Z> struct swizzle_vec3{ T v[3]; inline TT&lt;T>&amp; operator=(const TT&lt;T>&amp; rhs) { v[X]= rhs[0]; v[Y]= rhs[1]; v[Z]= rhs[2]; return*(TT&lt;T>*)this; }   ...  inline operator TT&lt;T>() const { return TT&lt;T>{v[X], v[Y], v[Z]}; } \/\/ unpack }; <\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e \u0432 \u043a\u043e\u0434\u0435, \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0435\u0449\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c union-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b \u044d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u043b\u0438:<\/p>\n<pre><code class=\"cpp\">\/\/ v2 swizzles #define swizzle_v2      \\ swizzle_vec2&lt;T, 2, 0, 0> xx; \\ swizzle_vec2&lt;T, 2, 0, 1> xy; \\ swizzle_vec2&lt;T, 2, 1, 0> yx; \\ swizzle_vec2&lt;T, 2, 1, 1> yy; \\ ...  template &lt;class T> struct vec2 { union { struct { Tx, y; }; swizzle_v2 }; };<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">template&lt;template&lt;typename> class TT, typename T, size_t X, size_t Y> struct swizzle_vec2 { T v[2]; inline TT&lt;T>&amp; operator=(const TT&lt;T>&amp; rhs) { v[X]= rhs[0];\/\/ access pack element 0 v[Y]= rhs[1];\/\/ access pack element 1 return*(TT&lt;T>*)this; } inline auto &amp;operator=(const swizzle_vec2&amp; rhs) { v[X]= rhs.v[X]; v[Y]= rhs.v[Y]; return*this; }  inline operator TT&lt;T>() const { return TT&lt;T>{v[X], v[Y]}; } \/\/ unpack };  #define swizzle_v2(TT)      \\ swizzle_vec2&lt;TT, T, 0, 0> xx; \\ swizzle_vec2&lt;TT, T, 0, 1> xy; \\ swizzle_vec2&lt;TT, T, 1, 0> yx; \\ swizzle_vec2&lt;TT, T, 1, 1> yy;  template &lt;class T> struct vec2 { union { struct { Tx, y; };         swizzle_v2(vec2) }; };  int main() {     vec2&lt;float> veca{0, 1};     printf(\"veca{%f, %f}\\n\", veca.x, veca.y);      vec2&lt;float> vecb = veca.yx;     printf(\"vecb{%f, %f}\", vecb.x, vecb.y);     return 0; } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/godbolt.org\/z\/rhcocMods\" rel=\"noopener noreferrer nofollow\"><u>\u0442\u0443\u0442<\/u><\/a>.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f vec3\/vec4 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0438\u0447\u0435\u043c, \u043a\u0440\u043e\u043c\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 swizzle-\u0441\u0442\u0443\u043a\u0442\u0443\u0440, \u043d\u043e \u0442\u0430\u043a\u043e\u0432\u0430 \u0431\u044b\u043b\u0430 \u0446\u0435\u043d\u0430 &#8212; \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u0438 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c, \u0437\u043d\u0430\u0447\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<pre><code class=\"cpp\">#define swizzle_v4      \\ Swizzle_vec2&lt;TT, T, 0, 0> xx; \\ Swizzle_vec2&lt;TT, T, 0, 1> xy; \\ Swizzle_vec2&lt;TT, T, 0, 2> xz; \\ Swizzle_vec2&lt;TT, T, 0, 3> xw; \\ .... Swizzle_vec3&lt;TT, T, 0, 0, 0> xxx; \\ Swizzle_vec3&lt;TT, T, 0, 0, 1> xxy; \\ Swizzle_vec3&lt;TT, T, 0, 0, 2> xxz; \\ Swizzle_vec3&lt;TT, T, 0, 0, 3> xxw; \\ Swizzle_vec3&lt;TT, T, 0, 1, 0> xyx; \\ ..... Swizzle&lt;TT, T, 0, 0, 0, 0> xxxx; \\ Swizzle&lt;TT, T, 0, 0, 0, 1> xxxy; \\ Swizzle&lt;TT, T, 0, 0, 0, 2> xxxz; \\ Swizzle&lt;TT, T, 0, 0, 0, 3> xxxw; \\ Swizzle&lt;TT, T, 0, 0, 1, 0> xxyx; \\ <\/code><\/pre>\n<p>\u041a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0444\u0438\u0434\u0431\u0435\u043a. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043d\u043e \u0437\u043d\u0430\u043d\u0438\u0435 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435 \u0438 \u043c\u0435\u043d\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u0434\u0430, \u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0443 \u043d\u0435 \u0434\u0430\u0432\u0430\u043b\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0441\u043f\u0430\u0442\u044c. \u041f\u043e\u0437\u0436\u0435, \u043d\u0430 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0435 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043e\u0431\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u0443\u0431\u0440\u0430\u043d\u044b \u043f\u0440\u043e\u0441\u0442\u044b\u043d\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ca9\/a78\/e39\/ca9a78e39055654ba45615f3f793d375.png\" alt=\"\u041a\u043e\u0442 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0443 \u043d\u0435 \u043e\u0434\u043e\u0431\u0440\u044f\u0435\u0442!\" title=\"\u041a\u043e\u0442 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0443 \u043d\u0435 \u043e\u0434\u043e\u0431\u0440\u044f\u0435\u0442!\" width=\"500\" height=\"399\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ca9\/a78\/e39\/ca9a78e39055654ba45615f3f793d375.png\"\/><\/p>\n<div><figcaption>\u041a\u043e\u0442 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0443 \u043d\u0435 \u043e\u0434\u043e\u0431\u0440\u044f\u0435\u0442!<\/figcaption><\/div>\n<\/figure>\n<h2>\u0423\u0442\u0440\u043e \u0434\u043e\u0431\u0440\u044b\u043c \u043d\u0435 \u0431\u044b\u0432\u0430\u0435\u0442<\/h2>\n<p>\u041e\u0434\u043d\u0430\u0436\u0434\u044b \u0443\u0442\u0440\u043e\u043c \u0441\u0442\u0430\u043b\u0438 \u043f\u0430\u0434\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b. \u041f\u0430\u0434\u0430\u0442\u044c \u0441\u0442\u0430\u043b\u043e \u0432\u043e\u0442 \u043d\u0430 \u0442\u0430\u043a\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435:<\/p>\n<pre><code class=\"cpp\">    ...     vec3&lt;float> vecc{1, 2, 3};     printf(\"vecc{%f, %f, %f}\\n\", vecc.x, vecc.y, vecc.z);      vec3&lt;float> vecd{0, 0, 0};     vecd.xz = vecc.xz;     printf(\"vecd{%f, %f, %f}\\n\", vecd.x, vecd.y, vecd.z); &lt;&lt;&lt;&lt;&lt;&lt;&lt;     ...  output: vecc{1.000000, 2.000000, 3.000000} vecd{1.000000, 2.000000, 0.000000} -> vecd \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c {1.0, 0.0, 2.0} <\/code><\/pre>\n<p>\u0411\u043b\u0435\u0439\u043c \u043f\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c \u043f\u0440\u0438\u0432\u0435\u043b \u0432\u043e\u0442 \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"cpp\">template&lt;template&lt;typename> class TT, typename T, size_t X, size_t Y> struct swizzle_vec2{ T v[2]; inline TT&lt;T>&amp; operator=(const TT&lt;T>&amp; rhs) { v[X]= rhs[0]; v[Y]= rhs[1]; return*(TT&lt;T>*)this; }    !!!! inline auto &amp;operator=(const swizzle_vec2&amp; rhs) = default; !!!!      inline operator TT&lt;T>() const { return TT&lt;T>{v[X], v[Y]}; }  }; ```<\/code><\/pre>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e &#8212; \u044d\u0442\u043e \u043a\u043e\u0434 \u0432\u0435\u0440\u0435\u043d, \u0435\u0441\u043b\u0438 \u0431\u044b swizzle_vec2 \u0431\u044b\u043b \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0430 \u043d\u0435 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u043e\u043c \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u0447\u0443\u0436\u0438\u0445. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f &#8212; \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u043e \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d &#8212; \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n<pre><code class=\"assembly\">  inline auto &amp;operator=(const swizzle_vec2&amp; rhs) = default;   ->   call    memset@PLTS\/\/ vecd.xz = vecc.xz   mov     rax, qword ptr [rbp - 36]\/\/ vecd.xz = vecc.xz   mov     qword ptr [rbp - 48], rax\/\/ vecd.xz = vecc.xz<\/code><\/pre>\n<p>\u041e\u0448\u0438\u0431\u043a\u0443 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b\u0438, \u0437\u0430\u043e\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0432\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u0432\u0435\u0441\u0442\u0438 \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u043c\u0443:<\/p>\n<pre><code class=\"cpp\">template &lt;typename T, int RSIZE, int... INDEXES> struct swizzle { T v[RSIZE]; static constexpr int indexes[] = {INDEXES...};      template &lt;int... INDEXES2>     inline auto &amp;operator=(const swizzle&lt;T, RSIZE, INDEXES2...> &amp;rhs) { static_assert(sizeof...(INDEXES) == RSIZE, \"error: assigning swizzle of different dimensions\"); constexpr int rindexes[] = {INDEXES2...}; for(int i = 0; i &lt; sizeof...(INDEXES); ++i) { v[indexes + i]] = rhs.v[rindexes[i]]; } return *this; }  inline auto &amp;operator=(const swizzle &amp;rhs) { for(int i = 0; i &lt; sizeof...(INDEXES); ++i) { v[indexes[i]]= rhs.v[indexes[i]]; } return *this; } };<\/code><\/pre>\n<p>\u0410 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443:<\/p>\n<pre><code class=\"cpp\">template&lt;class T> struct vec2; template&lt;class T> struct vec3;  template &lt;typename T, int RSIZE, int... SWIZZLES> struct swizzle2: public swizzle&lt;T, RSIZE, SWIZZLES...> {     inline auto &amp;operator=(const vec2&lt;T>&amp; l) { static_assert(sizeof...(SWIZZLES) == 2, \"error: assigning swizzle2 not from vec2f\"); v[indexes[0]] = l.x; v[indexes[1]] = l.y; return*this; } inline operator vec2&lt;T> () const { static_assert(sizeof...(SWIZZLES) > 1, \"error: no data that convert to vec2\"); return vec2&lt;T>{v[indexes[0]], v[indexes[1]]}; } };  template &lt;typename T, int RSIZE, int... SWIZZLES> struct swizzle3 : public swizzle&lt;T, RSIZE, SWIZZLES...> {     inline auto &amp;operator=(const vec3&lt;T>&amp; l) { static_assert(sizeof...(SWIZZLES) == 3, \"error: assigning swizzle2 not from vec2f\"); v[indexes[0]] = l.x; v[indexes[1]] = l.y;         v[indexes[2]] = l.z; return*this; } inline operator vec3&lt;T> () const { static_assert(sizeof...(SWIZZLES) > 2, \"error: no data that convert to vec3\"); return vec3&lt;T>{v[indexes[0]], v[indexes[1]], v[indexes[2]]}; } };<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0441\u0447\u0430\u0441\u0442\u044c\u044f \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043d\u044e \u043f\u0440\u043e\u043a\u0441\u0438-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 vec2\/3\/4<\/p>\n<pre><code class=\"cpp\">#define swizzle_v2      \\ swizzle2&lt;T, 2, 0, 0> xx; \\ swizzle2&lt;T, 2, 0, 1> xy; \\ swizzle2&lt;T, 2, 1, 0> yx; \\ swizzle2&lt;T, 2, 1, 1> yy; \\ swizzle3&lt;T, 3, 0, 0, 0> xxx; \\ swizzle3&lt;T, 3, 0, 0, 1> xxy; \\ swizzle3&lt;T, 3, 0, 1, 0> xyx; \\ swizzle3&lt;T, 3, 0, 1, 1> xyy; \\ swizzle3&lt;T, 3, 1, 0, 0> yxx; \\ swizzle3&lt;T, 3, 1, 0, 1> yxy; \\ swizzle3&lt;T, 3, 1, 1, 0> yyx; \\ swizzle3&lt;T, 3, 1, 1, 1> yyy; \\ swizzle4&lt;T, 4, 0, 0, 0, 0> xxxx; \\ swizzle4&lt;T, 4, 0, 0, 0, 1> xxxy; \\ swizzle4&lt;T, 4, 0, 0, 1, 0> xxyx; \\ swizzle4&lt;T, 4, 0, 0, 1, 1> xxyy; \\ swizzle4&lt;T, 4, 0, 1, 0, 0> xyxx; \\ swizzle4&lt;T, 4, 0, 1, 0, 1> xyxy; \\ swizzle4&lt;T, 4, 0, 1, 1, 0> xyyx; \\ swizzle4&lt;T, 4, 0, 1, 1, 1> xyyy; \\ swizzle4&lt;T, 4, 1, 0, 0, 0> yxxx; \\ swizzle4&lt;T, 4, 1, 0, 0, 1> yxxy; \\ swizzle4&lt;T, 4, 1, 0, 1, 0> yxyx; \\ swizzle4&lt;T, 4, 1, 0, 1, 1> yxyy; \\ swizzle4&lt;T, 4, 1, 1, 0, 0> yyxx; \\ swizzle4&lt;T, 4, 1, 1, 0, 1> yyxy; \\ swizzle4&lt;T, 4, 1, 1, 1, 0> yyyx; \\ swizzle4&lt;T, 4, 1, 1, 1, 1> yyyy; ...<\/code><\/pre>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0443\u0431\u0440\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0431\u0435\u0437 \u043d\u043e\u0432\u044b\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0435\u043c\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u0438\u043b\u044b. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/0bc\/bf6\/31c\/0bcbf631cb6259a6d4505386d474d4f8.jpg\" alt=\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u041b\u044e\u043a!\" title=\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u041b\u044e\u043a!\" width=\"1024\" height=\"1024\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0bc\/bf6\/31c\/0bcbf631cb6259a6d4505386d474d4f8.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u041b\u044e\u043a!<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u044e\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 x, y, z, w, \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e &#8212; \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u0430<\/p>\n<pre><code class=\"cpp\">xx -> swizzle2&lt;T, 2, 0, 0> -> {0, 0} xy -> swizzle2&lt;T, 2, 0, 1> -> {0, 1} yx -> swizzle2&lt;T, 2, 1, 0> -> {1, 0} ...<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 constexpr \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a<\/p>\n<pre><code class=\"cpp\">constexpr int inline swizzle_idx__(pcstr x, int offset) {    switch(*(x+offset)) { case 'x': return 0; case 'y': return 1;                         case 'z': return 2;  case 'w': return 3; }    return -1;  }  swizzle2&lt;T, 2, 0, 0> xx  -> swizzle2&lt;T, 2, swizzle_idx__(\"xx\", 0), swizzle_idx__(\"xx\", 0)> <\/code><\/pre>\n<p>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043c\u0430\u043a\u0440\u043e\u0441<\/p>\n<pre><code class=\"cpp\">swizzle2&lt;T, 2, 0, 0> xx;  swizzle2&lt;T, 2, 0, 1> xy;  swizzle2&lt;T, 2, 1, 0> yx;  swizzle2&lt;T, 2, 1, 1> yy;   ->    #define $(name) swizzle2&lt;T, 2, swizzle_idx__(#name, 0), swizzle_idx__(#name, 1)> name;  $(xx) $(xy) $(yx) $(yy)<\/code><\/pre>\n<p>\u0421 vec3 \u0438 vec4 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u0445\u043e\u0436\u0438\u0439 &#8212; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441 \u0434\u043b\u044f \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u0430 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">#define $(name) swizzle3&lt;T, 3,                          swizzle_idx__(#name, 0),                         swizzle_idx__(#name, 1),                         swizzle_idx__(#name, 2)> name; <\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0441\u0430\u043c\u0438\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0442\u0443\u0442 \u0431\u0443\u0434\u0435\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u043c \u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0433\u0440\u043e\u043c\u043e\u0436\u0434\u0430\u0442\u044c \u0445\u0435\u0434\u0435\u0440\u044b \u043b\u0438\u0448\u043d\u0438\u043c\u0438 \u0434\u0435\u0444\u0430\u0439\u043d\u0430\u043c\u0438, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d \u043f\u0440\u044f\u043c\u043e \u0432 \u0442\u0435\u043b\u0435 union<\/p>\n<pre><code class=\"cpp\">#define _(x) $(x ## xx) $(x ## xy) $(x ## xz) $(x ## yx) $(x ## yy) $(x ## yz) $(x ## zx) $(x ## zy) $(x ## zz) _(x) _(y) _(z) _(w) <\/code><\/pre>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">template &lt;class T> struct vec2 { union {   struct { T x, y; };   #define $(name) swizzle2&lt;T, 2, swizzle_idx__(#name, 0), swizzle_idx__(#name, 1)> name;       $(xx) $(xy) $(yx) $(yy)           #undef $ }; }; <\/code><\/pre>\n<p>\u041a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u043e\u043b\u043e\u0436\u0443 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440, \u043e\u043d \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d, \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f (<a href=\"https:\/\/godbolt.org\/z\/Pnq9654bW\" rel=\"noopener noreferrer nofollow\">https:\/\/godbolt.org\/z\/Pnq9654bW<\/a>)<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">template &lt;typename T, int SIZE, int... INDEXES> struct swizzle { T v[SIZE]; static constexpr int indexes[] = {INDEXES...};  template &lt;int RSIZE, int... INDEXES2>     inline auto &amp;operator=(const swizzle&lt;T, RSIZE, INDEXES2...>&amp; rhs) { static_assert(SIZE == RSIZE, \"error: assigning swizzle of different dimensions\"); constexpr int rindexes[] = {INDEXES2...};  for(int i = 0; i &lt; SIZE; ++i) { v[indexes[i]]= rhs.v[rindexes[i]]; }  return*this; }  inline auto &amp;operator=(const swizzle&amp; rhs) { for(int i = 0; i &lt; SIZE; ++i) { v[indexes[i]]= rhs.v[indexes[i]]; } return*this; } };  template&lt;class T> struct vec2; template&lt;class T> struct vec3;  template &lt;typename T, int... SWIZZLES> struct swizzle2: public swizzle&lt;T, SWIZZLES...> {     inline swizzle&lt;T, SWIZZLES...> &amp;operator=(const vec2&lt;T>&amp; l) { static_assert(sizeof...(SWIZZLES) > 1, \"error: assigning swizzle2 not from vec2f\"); this->v[this->indexes[0]]= l.x; this->v[this->indexes[1]]= l.y; return*this; }  inline operator vec2&lt;T> () const { static_assert(sizeof...(SWIZZLES) > 1, \"error: no data that convert to vec2\"); return vec2&lt;T>{this->v[this->indexes[0]], this->v[this->indexes[1]]}; } };  template &lt;typename T, int SIZE, int... SWIZZLES> struct swizzle3: public swizzle&lt;T, SIZE, SWIZZLES...> { inline swizzle&lt;T, SIZE, SWIZZLES...> &amp;operator=(const vec3&lt;T>&amp; l) { static_assert(SIZE == 3, \"error: assigning swizzle3 not from vec3f\"); this->v[this->indexes[0]] = l.x; this->v[this->indexes[1]] = l.y; this->v[this->indexes[2]] = l.z; return*this; }  inline operator vec3&lt;T> () const { static_assert(SIZE > 2, \"error: no data that convert to vec3\"); returnvec3&lt;T>{this->v[this->indexes[0]], this->v[this->indexes[1]], this->v[this->indexes[2]]}; } };  constexpr int inline swizzle_idx__(const char *x, int offset) { switch(*(x+offset)) { case 'x': return 0; case 'y': return 1; case 'z': return 2;  case 'w': return 3; } return -1; }  template &lt;class T> struct vec2 { union {   struct { Tx, y; };   #define $(name) swizzle2&lt;T, 2, swizzle_idx__(#name, 0), swizzle_idx__(#name, 1)> name;       $(xx) $(xy) $(yx) $(yy)           #undef $ }; };   template &lt;class T> struct vec3 { union { struct { Tx, y, z; };          #define $(name) swizzle2&lt;T, 2, swizzle_idx__(#name, 0), swizzle_idx__(#name, 1)> name;       $(xx) $(xy) $(xz) $(yx) $(yy) $(yz) $(zx) $(zy) $(zz)           #undef $          #define $(name) swizzle3&lt;T, 3, swizzle_idx__(#name, 0), swizzle_idx__(#name, 1),  swizzle_idx__(#name, 2)> name;         #define _(x) $(x ## xx) $(x ## xy) $(x ## xz) $(x ## yx) $(x ## yy) $(x ## yz) $(x ## zx) $(x ## zy) $(x ## zz)     _(x) _(y) _(z) _(w)         #undef  _         #undef  $ }; };  int main() {     vec2&lt;float> veca{0, 1};     printf(\"veca{%f, %f}\\n\", veca.x, veca.y);      vec2&lt;float> vecb = veca.yx;     printf(\"vecb{%f, %f}\\n\", vecb.x, vecb.y);      vec3&lt;float> vecc{1, 2, 3};     printf(\"vecc{%f, %f, %f}\\n\", vecc.x, vecc.y, vecc.z);      vec3&lt;float> vecd{0, 0, 0};     vecd.xz = vecc.xz;     printf(\"vecd{%f, %f, %f}\\n\", vecd.x, vecd.y, vecd.z);     return 0; }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0430\u0448 \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433 \u0432 \u0430\u0441\u043c\u0435, \u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u043d \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 &#8212; \u043f\u0435\u0440\u0435\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u0431\u0430\u0439\u0442\u044b \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 (<a href=\"https:\/\/godbolt.org\/z\/9EPe3q4EE\" rel=\"noopener noreferrer nofollow\">https:\/\/godbolt.org\/z\/9EPe3q4EE<\/a>)<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a2e\/c42\/f3b\/a2ec42f3bc67c68906dd4259f350b0d2.png\" width=\"1853\" height=\"323\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a2e\/c42\/f3b\/a2ec42f3bc67c68906dd4259f350b0d2.png\"\/><\/figure>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 2\/3 \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u043e\u043c \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0430 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438.<br \/><a href=\"https:\/\/quick-bench.com\/q\/MhxnpfYU9-wTWiXqlTiCONujBJA\" rel=\"noopener noreferrer nofollow\">https:\/\/quick-bench.com\/q\/MhxnpfYU9-wTWiXqlTiCONujBJA<\/a><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/003\/edc\/d23\/003edcd23855e79e7f9e6e05fe9d4eee.png\" width=\"1886\" height=\"592\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/003\/edc\/d23\/003edcd23855e79e7f9e6e05fe9d4eee.png\"\/><\/figure>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u0435\u0431 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0442\u0430\u0449\u0438\u0442\u044c \u043a\u043e\u0434 \u0438\u0437 glm \u0438 cxxswizzle, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. <strong>volatile<\/strong> \u0437\u0434\u0435\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u043d, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0441\u043c\u043e\u0433 \u043d\u0430\u043c\u0443\u0445\u043b\u0435\u0432\u0430\u0442\u044c \u0441 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442.<\/p>\n<pre><code>float volatile xx; float volatile x = xx + 1; float volatile y = xx + 2; float volatile z = xx + 3;  static void Vec3Swizzling(benchmark::State&amp; state) {   for (auto _ : state) {     vec3&lt;float> veca{x, y, z}; vec3&lt;float> vecb{1, 2, 3}; vecb.xz = veca.xz;     benchmark::DoNotOptimize(veca); benchmark::DoNotOptimize(vecb);   } }  BENCHMARK(Vec3Swizzling);  static void Vec3SwizzlingGlm(benchmark::State&amp; state) {   for (auto _ : state) {     glm::vec3&lt;float> vecc{x, y, z}; glm::vec3&lt;float> vecd{0, 0, 0}; vecd.xz = vecc.xz; benchmark::DoNotOptimize(vecc); benchmark::DoNotOptimize(vecd);   } } BENCHMARK(Vec3SwizzlingGlm);  static void Vec3SwizzlingCxxSwizzle(benchmark::State&amp; state) {   for (auto _ : state) {     cxx::vec3&lt;float> vecc{x, y, z}; cxx::vec3&lt;float> vecd{0, 0, 0}; vecd.xz = vecc.xz; benchmark::DoNotOptimize(vecc); benchmark::DoNotOptimize(vecd);   } } BENCHMARK(Vec3SwizzlingCxxSwizzle);<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/918\/187\/716\/9181877167a23c569fc01be51ade5d8d.png\" width=\"933\" height=\"512\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/918\/187\/716\/9181877167a23c569fc01be51ade5d8d.png\"\/><\/figure>\n<p>\u041f\u043e \u0431\u0435\u043d\u0447\u0430\u043c \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 <strong>glm<\/strong> \u0432 1.2 \u0440\u0430\u0437\u0430 \u0438 <strong>CxxSwizzle<\/strong> \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430. \u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0441\u0447\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043b\u0438\u0448\u043d\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c \u0432 \u044d\u0442\u0438\u0445 \u043b\u0438\u0431\u0430\u0445, \u0438 \u043b\u0443\u0447\u0448\u0435\u0439 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438 \u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u0430.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0435\u0449\u0435 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433, \u0435\u0441\u043b\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430\u043c\u0438 SSE \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f, \u0442\u043e\u0433\u0434\u0430 \u0432 \u0430\u0441\u043c\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0434\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f. \u0415\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0435 \u043b\u044f\u0436\u0435\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0435\u043c\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0435\u0444\u0430\u0442\u043e\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/779616\/\"> https:\/\/habr.com\/ru\/articles\/779616\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0448\u0435\u0439\u0434\u0435\u0440\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>vec3 v0 = v1.xxy * 2<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e x, y, z \u0438 w \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0434\u043b\u0438\u043d\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u0430. \u042f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043e 4, \u043a\u0430\u043a \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u0438 \u043c\u0435\u043d\u044c\u0448\u0443\u044e \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0443\u044e, \u043f\u0440\u0438\u0447\u0435\u043c \u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u042d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &#8216;swizzle&#8217;, \u0438 \u043e\u043d\u0430 \u0447\u0435\u0440\u0442\u043e\u0432\u0441\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043c\u0430\u043b\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438\u043b\u0438 \u0446\u0432\u0435\u0442\u043e\u0432. \u0412\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u044e\u0434\u0443 \u0432 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 (\u0434\u0430 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0438\u0433\u0440\u043e\u0432\u044b\u0445), \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445. \u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c &#8216;swizzle&#8217; \u0432 \u043d\u0430\u0448 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0432 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b <code>vec2<\/code>, <code>vec3<\/code> \u0438 <code>vec4<\/code>. \u0412\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b: \u043a\u0430\u043a \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432 C++ \u043a\u043e\u0434\u0435, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044f \u043f\u043e\u0442\u0435\u0440\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.  <\/p>\n<figure class=\"full-width\"><\/figure>\n<hr\/>\n<h2>\u0427\u0442\u043e \u0432 \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u0435 \u0442\u0435\u0431\u0435 \u043c\u043e\u0435\u043c&#8230;<\/h2>\n<p>\u041b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 swizzle &#8212; \u044d\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445:<\/p>\n<pre><code class=\"cpp\">vec3 vec{1.0, 2.0, 3.0}; vec4 a; vec3 b; vec2 c; float d;  b = vec.xyz;  \/\/ b is now (1.0, 2.0, 3.0) d = vec[2];   \/\/ d is now 3.0 a = vec.xxxx; \/\/ a is now (1.0, 1.0, 1.0, 1.0) c = vec.zx;   \/\/ c is now (3.0, 1.0) b = vec.rgb;  \/\/ b is now (1.0, 2.0, 3.0) a = vec.yy;   \/\/ error; incostistent size<\/code><\/pre>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 glm, \u0421xxSwizzle \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 glm \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0438\u043b\u0438 \u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0438\u0433\u0440\u043e\u0432\u044b\u043c\u0438 \u0434\u0432\u0438\u0436\u043a\u0430\u043c\u0438. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u043e\u0434 \u0432 \u043d\u0435\u0439 \u043e\u0447\u0435\u043d\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439 \u0438 \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u0438\u0435\u043c \u0442\u0440\u0443\u0434\u043d\u044b\u0445 90-\u0445 (\u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u0434 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0432 \u0438\u044e\u043d\u0435 1992 \u0433\u043e\u0434\u0430, \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 31 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434).<\/p>\n<p>\u0415\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <a href=\"https:\/\/github.com\/gwiazdorrr\/CxxSwizzle\" rel=\"noopener noreferrer nofollow\"><u>\u0437\u0434\u0435\u0441\u044c<\/u><\/a>. \u0422\u0430\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043d\u043e \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0438, \u0445\u043e\u0442\u044c \u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u0438\u0434\u0435. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0445\u043e\u0440\u043e\u0448\u0435\u0435, \u043d\u043e, \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u043a\u043e\u0434 \u0442\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u0439. \u041c\u044b \u0436\u0435 \u0445\u043e\u0442\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043f\u044f\u0442\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0430\u0445 \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u0430 \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0445, \u043f\u0440\u0430\u0432\u0434\u0430 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u0438\u0434\u0435. \u041f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043a \u043a\u043e\u0434\u0443 \u0445\u043e\u0447\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0438 \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/p>\n<ol start=\"0\">\n<li>\n<p>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0434\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u0430, \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430\u0445 SSE<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043c\u0435\u0436\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, v0.xxy + v1.xzy. \u042d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: (\u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443, \u0432 99% \u044d\u0442\u0438\u043c \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f) \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>v1.yxwy = v0;<\/code> \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u044b \u044f\u0432\u043d\u043e, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0438 \u043d\u0438 \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438: \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u0445. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e vec3 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u0442\u0440\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0432\u043e\u0435\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 <code>v1.yxwz = v0;<\/code> \u0431\u0435\u0437 \u0441\u043a\u043e\u0431\u043e\u043a: \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 union \u0438 \u043f\u0440\u043e\u043a\u0441\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0440\u044b\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p> <code>#define yxwz _yxwz()<br \/> vec4 vecb = veca.yxwz<\/code><\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043b\u044e\u0431\u044b\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u044e\u0442 \u043e\u0442\u043b\u0430\u0434\u043a\u0443, \u0437\u0430\u0441\u043e\u0440\u044f\u044e\u0442 \u043a\u043e\u0434 \u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432-\u043f\u0440\u043e\u043a\u0441\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u043c. \u041f\u043b\u044e\u0441, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043d\u0438\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0447\u0442\u043e \u0441\u043d\u0438\u0437\u0438\u0442 \u043e\u0431\u0449\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u041d\u0443 \u0438, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043b\u044e\u0431\u043b\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043a\u043e\u0434\u043e\u043c.<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e, \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0432 \u043a\u0443\u0440\u0438\u043b\u043a\u0435, \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 union &#8212; \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0442\u0430\u043a\u043e\u0433\u043e union&#8217;a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">union {     float v[2];     ??? xx;     ??? xy;     ??? yx;     ??? yy;     ... };<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0440\u0442\u043e\u043a \u0438 \u0443\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 union, \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c plain only data, \u0442\u0430\u043a \u043f\u0440\u043e\u0449\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u043a\u0443\u0441 \u0441\u043e \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u043e\u043c. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0440\u0443\u043a\u0430\u043c\u0438 &#8212; \u043f\u0443\u0441\u0442\u044c \u0442\u0440\u0443\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a (\u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434):<\/p>\n<pre><code class=\"cpp\">template&lt;T, X, Y> struct proxy {     template&lt;T, X2, Y2>     proxy operator = (const SwizzleProxy2&lt;T, X2, Y2> &amp;o) {         ((T*)this)[X] = ((T*)&amp;o)[X2];         ((T*)this)[Y] = ((T*)&amp;o)[Y2];         return this;     } }; <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0441\u0441\u044b\u043b\u0430\u0435\u043c\u0441\u044f \u043d\u0430 <code>this<\/code> \u0442.\u0435. \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044f, \u0447\u0442\u043e \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 swizzling \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u043b\u043e\u0431, \u043a\u0430\u043a \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u044b \u0432\u043e\u0440\u043d\u0438\u043d\u0433\u043e\u0432 \u043f\u043e\u0447\u0442\u0438 \u0443 \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0438 false positive \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432. \u041d\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0432\u044b\u0448\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0438\u0434\u0435\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u0432\u0443\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: xx, xy, wx \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 X \u0438 Y \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0442\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0435\u0442, \u0430 \u0442\u0430\u043a\u043e\u0435 \u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0443\u0447\u0443 \u0432\u043e\u0440\u043d\u0438\u043d\u0433\u043e\u0432 \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0435\u0440\u0432\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043f\u043e\u0434 ps5 \u0441lang, \u043d\u043e \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 10%. \u0421 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 5 \u0434\u043e \u0448\u0435\u0441\u0442\u0438 \u043c\u0438\u043d\u0443\u0442. \u041d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0442\u044c, \u0445\u043e\u0442\u044f \u0431\u044b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435, \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u043e\u0441\u044c \u0432 \u043d\u043e\u0440\u043c\u0443.<\/p>\n<pre><code class=\"cpp\">template&lt;T, int X, int Y> struct proxy { byte v;     ... };<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0432 \u043a\u043b\u0430\u0441\u0441 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c. \u0422\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 vec2\/3\/4, \u0442\u043e \u043d\u0430 \u0434\u043e\u043b\u044e swizzle \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u043a \u0432\u0435\u043a\u0442\u043e\u0440\u0443 \u0438 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430. \u0418\u0442\u0430\u043a \u043f\u0435\u0440\u0432\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043a\u0430\u043a \u043e\u043d\u0430 \u0443\u0448\u043b\u0430 \u0432 \u0434\u0432\u0438\u0436\u043e\u043a.<\/p>\n<pre><code class=\"cpp\">template&lt;template&lt;typename> class TT, typename T, size_t X, size_t Y> struct swizzle_vec2{   T v[2]; inline TT&lt;T>&amp; operator=(const TT&lt;T>&amp; rhs) { v[X]= rhs[0]; v[Y]= rhs[1]; return*(TT&lt;T>*)this; } inline auto &amp;operator=(const swizzle_vec2&amp; rhs) { v[X]= rhs.v[X]; v[Y]= rhs.v[Y]; return*this; } inline operator TT&lt;T>() const { return TT&lt;T>{v[X], v[Y]}; } }; <\/code><\/pre>\n<p>\u0418 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 vec3\/vec4. \u0412 \u0434\u0432\u0438\u0436\u043a\u0435 \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 DRY, \u043d\u043e \u0434\u043b\u044f \u043e\u0431\u043a\u0430\u0442\u043a\u0438 \u0444\u0438\u0447\u0438 \u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0440\u0435\u0448\u0438\u043b\u0438 \u0443\u043b\u0443\u0447\u0448\u0430\u0439\u0437\u0438\u043d\u0433 \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u043f\u043e\u043f\u043e\u0437\u0436\u0435, \u0441\u043e\u0431\u0440\u0430\u0432 \u043e\u0442\u0437\u044b\u0432\u044b \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043d\u043e\u0432\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c.<\/p>\n<pre><code class=\"cpp\">template&lt;template&lt;typename> class TT, typename T, size_t X, size_t Y, size_t Z> struct swizzle_vec3{ T v[3]; inline TT&lt;T>&amp; operator=(const TT&lt;T>&amp; rhs) { v[X]= rhs[0]; v[Y]= rhs[1]; v[Z]= rhs[2]; return*(TT&lt;T>*)this; }   ...  inline operator TT&lt;T>() const { return TT&lt;T>{v[X], v[Y], v[Z]}; } \/\/ unpack }; <\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0432\u0438\u0437\u043b\u0438\u043d\u0433 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e \u0432 \u043a\u043e\u0434\u0435, \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0435\u0449\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c union-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b \u044d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u043b\u0438:<\/p>\n<pre><code class=\"cpp\">\/\/ v2 swizzles #define swizzle_v2      \\ swizzle_vec2&lt;T, 2, 0, 0> xx; \\ swizzle_vec2&lt;T, 2, 0, 1> xy; \\ swizzle_vec2&lt;T, 2, 1, 0> yx; \\ swizzle_vec2&lt;T, 2, 1, 1> yy; \\ ...  template &lt;class T> struct vec2 { union { struct { Tx, y; }; swizzle_v2 }; };<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">template&lt;template&lt;typename> class TT, typename T, size_t X, size_t Y> struct swizzle_vec2 { T v[2]; inline TT&lt;T>&amp; operator=(const TT&lt;T>&amp; rhs) { v[X]= rhs[0];\/\/ access pack element 0 v[Y]= rhs[1];\/\/ access pack element 1 return*(TT&lt;T>*)this; } inline auto &amp;operator=(const swizzle_vec2&amp; rhs) { v[X]= rhs.v[X]; v[Y]= rhs.v[Y]; return*this; }  inline operator TT&lt;T>() const { return TT&lt;T>{v[X], v[Y]}; } \/\/ unpack };  #define swizzle_v2(TT)      \\ swizzle_vec2&lt;TT, T, 0, 0> xx; \\ swizzle_vec2&lt;TT, T, 0, 1> xy; \\ swizzle_vec2&lt;TT, T, 1, 0> yx; \\ swizzle_vec2&lt;TT, T, 1, 1> yy;  template &lt;class T> struct vec2 { union { struct { Tx, y; };         swizzle_v2(vec2) }; };  int main() {     vec2&lt;float> veca{0, 1};     printf(\"veca{%f, %f}\\n\", veca.x, veca.y);      vec2&lt;float> vecb = veca.yx;     printf(\"vecb{%f, %f}\", vecb.x, vecb.y);     return 0; } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/godbolt.org\/z\/rhcocMods\" rel=\"noopener noreferrer nofollow\"><u>\u0442\u0443\u0442<\/u><\/a>.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f vec3\/vec4 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0438\u0447\u0435\u043c, \u043a\u0440\u043e\u043c\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 swizzle-\u0441\u0442\u0443\u043a\u0442\u0443\u0440, \u043d\u043e \u0442\u0430\u043a\u043e\u0432\u0430 \u0431\u044b\u043b\u0430 \u0446\u0435\u043d\u0430 &#8212; \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u0438 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c, \u0437\u043d\u0430\u0447\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<pre><code class=\"cpp\">#define swizzle_v4      \\ Swizzle_vec2&lt;TT, T, 0, 0> xx; \\ Swizzle_vec2&lt;TT, T, 0, 1> xy; \\ Swizzle_vec2&lt;TT, T, 0, 2> xz; \\ Swizzle_vec2&lt;TT, T, 0, 3> xw; \\ .... Swizzle_vec3&lt;TT, T, 0, 0, 0> xxx; \\ Swizzle_vec3&lt;TT, T, 0, 0, 1> xxy; \\ Swizzle_vec3&lt;TT, T, 0, 0, 2> xxz; \\ Swizzle_vec3&lt;TT, T, 0, 0, 3> xxw; \\ Swizzle_vec3&lt;TT, T, 0, 1, 0> xyx; \\ ..... Swizzle&lt;TT, T, 0, 0, 0, 0> xxxx; \\ Swizzle&lt;TT, T, 0, 0, 0, 1> xxxy; \\ Swizzle&lt;TT, T, 0, 0, 0, 2> xxxz; \\ Swizzle&lt;TT, T, 0, 0, 0, 3> xxxw; \\ Swizzle&lt;TT, T, 0, 0, 1, 0> xxyx; \\ <\/code><\/pre>\n<p>\u041a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0444\u0438\u0434\u0431\u0435\u043a. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043d\u043e \u0437\u043d\u0430\u043d\u0438\u0435 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435 \u0438 \u043c\u0435\u043d\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u0434\u0430, \u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0443 \u043d\u0435 \u0434\u0430\u0432\u0430\u043b\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0441\u043f\u0430\u0442\u044c. \u041f\u043e\u0437\u0436\u0435, \u043d\u0430 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0435 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043e\u0431\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u0443\u0431\u0440\u0430\u043d\u044b \u043f\u0440\u043e\u0441\u0442\u044b\u043d\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.<\/p>\n<figure class=\"\">\n<div><figcaption>\u041a\u043e\u0442 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0443 \u043d\u0435 \u043e\u0434\u043e\u0431\u0440\u044f\u0435\u0442!<\/figcaption><\/div>\n<\/figure>\n<h2>\u0423\u0442\u0440\u043e \u0434\u043e\u0431\u0440\u044b\u043c \u043d\u0435 \u0431\u044b\u0432\u0430\u0435\u0442<\/h2>\n<p>\u041e\u0434\u043d\u0430\u0436\u0434\u044b \u0443\u0442\u0440\u043e\u043c \u0441\u0442\u0430\u043b\u0438 \u043f\u0430\u0434\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b. \u041f\u0430\u0434\u0430\u0442\u044c \u0441\u0442\u0430\u043b\u043e \u0432\u043e\u0442 \u043d\u0430 \u0442\u0430\u043a\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435:<\/p>\n<pre><code class=\"cpp\">    ...     vec3&lt;float> vecc{1, 2, 3};     printf(\"vecc{%f, %f, %f}\\n\", vecc.x, vecc.y, vecc.z);      vec3&lt;float> vecd{0, 0, 0};     vecd.xz = vecc.xz;     printf(\"vecd{%f, %f, %f}\\n\", vecd.x, vecd.y, vecd.z); &lt;&lt;&lt;&lt;&lt;&lt;&lt;     ...  output: vecc{1.000000, 2.000000, 3.000000} vecd{1.000000, 2.000000, 0.000000} -> vecd \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c {1.0, 0.0, 2.0} <\/code><\/pre>\n<p>\u0411\u043b\u0435\u0439\u043c \u043f\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c \u043f\u0440\u0438\u0432\u0435\u043b \u0432\u043e\u0442 \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"cpp\">template&lt;template&lt;typename> class TT, typename T, size_t X, size_t Y> struct swizzle_vec2{ T v[2]; inline TT&lt;T>&amp; operator=(const TT&lt;T>&amp; rhs) { v[X]= rhs[0]; v[Y]= rhs[1]; return*(TT&lt;T>*)this; }    !!!! inline auto &amp;operator=(const swizzle_vec2&amp; rhs) = default; !!!!      inline operator TT&lt;T>() const { return TT&lt;T>{v[X],<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-362526","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/362526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=362526"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/362526\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=362526"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=362526"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=362526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}