1/////////////////////////////////////////////////////////////////////////////////////////////////// 2// OpenGL Mathematics Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) 3/////////////////////////////////////////////////////////////////////////////////////////////////// 4// Created : 2007-06-21 5// Updated : 2007-08-03 6// Licence : This source is under MIT License 7// File : glm/gtx/color_cast.inl 8/////////////////////////////////////////////////////////////////////////////////////////////////// 9 10namespace glm 11{ 12 template <typename T> 13 GLM_FUNC_QUALIFIER uint8 u8channel_cast(T a) 14 { 15 return static_cast<uint8>(a * T(255)); 16 } 17 18 template <typename T> 19 GLM_FUNC_QUALIFIER uint16 u16channel_cast(T a) 20 { 21 return static_cast<uint16>(a * T(65535)); 22 } 23 24 template <typename T> 25 GLM_FUNC_QUALIFIER uint32 u32_rgbx_cast(const detail::tvec3<T>& c) 26 { 27 uint32 result = 0; 28 result += static_cast<uint32>(c.x * detail::tvec3<T>::value_type(255)) << 0; 29 result += static_cast<uint32>(c.y * detail::tvec3<T>::value_type(255)) << 8; 30 result += static_cast<uint32>(c.z * detail::tvec3<T>::value_type(255)) << 16; 31 return result; 32 } 33 34 template <typename T> 35 GLM_FUNC_QUALIFIER uint32 u32_xrgb_cast(const detail::tvec3<T>& c) 36 { 37 uint32 result = 0; 38 result += static_cast<uint32>(c.x * detail::tvec3<T>::value_type(255)) << 8; 39 result += static_cast<uint32>(c.y * detail::tvec3<T>::value_type(255)) << 16; 40 result += static_cast<uint32>(c.z * detail::tvec3<T>::value_type(255)) << 24; 41 return result; 42 } 43 44 template <typename T> 45 GLM_FUNC_QUALIFIER uint32 u32_bgrx_cast(const detail::tvec3<T>& c) 46 { 47 uint32 result = 0; 48 result += static_cast<uint32>(c.x * detail::tvec3<T>::value_type(255)) << 16; 49 result += static_cast<uint32>(c.y * detail::tvec3<T>::value_type(255)) << 8; 50 result += static_cast<uint32>(c.z * detail::tvec3<T>::value_type(255)) << 0; 51 return result; 52 } 53 54 template <typename T> 55 GLM_FUNC_QUALIFIER uint32 u32_xbgr_cast(const detail::tvec3<T>& c) 56 { 57 uint32 result = 0; 58 result += static_cast<uint32>(c.x * detail::tvec3<T>::value_type(255)) << 24; 59 result += static_cast<uint32>(c.y * detail::tvec3<T>::value_type(255)) << 16; 60 result += static_cast<uint32>(c.z * detail::tvec3<T>::value_type(255)) << 8; 61 result += static_cast<uint32>(c.w * detail::tvec3<T>::value_type(255)) << 0; 62 return result; 63 } 64 65 template <typename T> 66 GLM_FUNC_QUALIFIER uint32 u32_rgba_cast(const detail::tvec4<T>& c) 67 { 68 uint32 result = 0; 69 result += static_cast<uint32>(c.x * detail::tvec4<T>::value_type(255)) << 0; 70 result += static_cast<uint32>(c.y * detail::tvec4<T>::value_type(255)) << 8; 71 result += static_cast<uint32>(c.z * detail::tvec4<T>::value_type(255)) << 16; 72 result += static_cast<uint32>(c.w * detail::tvec4<T>::value_type(255)) << 24; 73 return result; 74 } 75 76 template <typename T> 77 GLM_FUNC_QUALIFIER uint32 u32_argb_cast(const detail::tvec4<T>& c) 78 { 79 uint32 result = 0; 80 result += static_cast<uint32>(c.x * detail::tvec4<T>::value_type(255)) << 8; 81 result += static_cast<uint32>(c.y * detail::tvec4<T>::value_type(255)) << 16; 82 result += static_cast<uint32>(c.z * detail::tvec4<T>::value_type(255)) << 24; 83 result += static_cast<uint32>(c.w * detail::tvec4<T>::value_type(255)) << 0; 84 return result; 85 } 86 87 template <typename T> 88 GLM_FUNC_QUALIFIER uint32 u32_bgra_cast(const detail::tvec4<T>& c) 89 { 90 uint32 result = 0; 91 result += static_cast<uint32>(c.x * detail::tvec4<T>::value_type(255)) << 16; 92 result += static_cast<uint32>(c.y * detail::tvec4<T>::value_type(255)) << 8; 93 result += static_cast<uint32>(c.z * detail::tvec4<T>::value_type(255)) << 0; 94 result += static_cast<uint32>(c.w * detail::tvec4<T>::value_type(255)) << 24; 95 return result; 96 } 97 98 template <typename T> 99 GLM_FUNC_QUALIFIER uint32 u32_abgr_cast(const detail::tvec4<T>& c) 100 { 101 uint32 result = 0; 102 result += static_cast<uint32>(c.x * detail::tvec4<T>::value_type(255)) << 24; 103 result += static_cast<uint32>(c.y * detail::tvec4<T>::value_type(255)) << 16; 104 result += static_cast<uint32>(c.z * detail::tvec4<T>::value_type(255)) << 8; 105 result += static_cast<uint32>(c.w * detail::tvec4<T>::value_type(255)) << 0; 106 return result; 107 } 108 109 template <typename T> 110 GLM_FUNC_QUALIFIER uint64 u64_rgbx_cast(const detail::tvec3<T>& c) 111 { 112 uint64 result = 0; 113 result += static_cast<uint64>(c.x * detail::tvec3<T>::value_type(65535)) << 0; 114 result += static_cast<uint64>(c.y * detail::tvec3<T>::value_type(65535)) << 16; 115 result += static_cast<uint64>(c.z * detail::tvec3<T>::value_type(65535)) << 32; 116 return result; 117 } 118 119 template <typename T> 120 GLM_FUNC_QUALIFIER uint64 u32_xrgb_cast(const detail::tvec3<T>& c) 121 { 122 uint64 result = 0; 123 result += static_cast<uint64>(c.x * detail::tvec3<T>::value_type(65535)) << 16; 124 result += static_cast<uint64>(c.y * detail::tvec3<T>::value_type(65535)) << 32; 125 result += static_cast<uint64>(c.z * detail::tvec3<T>::value_type(65535)) << 48; 126 return result; 127 } 128 129 template <typename T> 130 GLM_FUNC_QUALIFIER uint64 u32_bgrx_cast(const detail::tvec3<T>& c) 131 { 132 uint64 result = 0; 133 result += static_cast<uint64>(c.x * detail::tvec3<T>::value_type(65535)) << 32; 134 result += static_cast<uint64>(c.y * detail::tvec3<T>::value_type(65535)) << 16; 135 result += static_cast<uint64>(c.z * detail::tvec3<T>::value_type(65535)) << 0; 136 return result; 137 } 138 139 template <typename T> 140 GLM_FUNC_QUALIFIER uint64 u32_xbgr_cast(const detail::tvec3<T>& c) 141 { 142 uint64 result = 0; 143 result += static_cast<uint64>(c.x * detail::tvec3<T>::value_type(65535)) << 48; 144 result += static_cast<uint64>(c.y * detail::tvec3<T>::value_type(65535)) << 32; 145 result += static_cast<uint64>(c.z * detail::tvec3<T>::value_type(65535)) << 16; 146 result += static_cast<uint64>(c.w * detail::tvec3<T>::value_type(65535)) << 0; 147 return result; 148 } 149 150 template <typename T> 151 GLM_FUNC_QUALIFIER uint64 u64_rgba_cast(const detail::tvec4<T>& c) 152 { 153 uint64 result = 0; 154 result += static_cast<uint64>(c.x * detail::tvec4<T>::value_type(65535)) << 0; 155 result += static_cast<uint64>(c.y * detail::tvec4<T>::value_type(65535)) << 16; 156 result += static_cast<uint64>(c.z * detail::tvec4<T>::value_type(65535)) << 32; 157 result += static_cast<uint64>(c.w * detail::tvec4<T>::value_type(65535)) << 48; 158 return result; 159 } 160 161 template <typename T> 162 GLM_FUNC_QUALIFIER uint64 u64_argb_cast(const detail::tvec4<T>& c) 163 { 164 uint64 result = 0; 165 result += static_cast<uint64>(c.x * detail::tvec4<T>::value_type(65535)) << 16; 166 result += static_cast<uint64>(c.y * detail::tvec4<T>::value_type(65535)) << 32; 167 result += static_cast<uint64>(c.z * detail::tvec4<T>::value_type(65535)) << 48; 168 result += static_cast<uint64>(c.w * detail::tvec4<T>::value_type(65535)) << 0; 169 return result; 170 } 171 172 template <typename T> 173 GLM_FUNC_QUALIFIER uint64 u64_bgra_cast(const detail::tvec4<T>& c) 174 { 175 uint64 result = 0; 176 result += static_cast<uint64>(c.x * detail::tvec4<T>::value_type(65535)) << 32; 177 result += static_cast<uint64>(c.y * detail::tvec4<T>::value_type(65535)) << 16; 178 result += static_cast<uint64>(c.z * detail::tvec4<T>::value_type(65535)) << 0; 179 result += static_cast<uint64>(c.w * detail::tvec4<T>::value_type(65535)) << 48; 180 return result; 181 } 182 183 template <typename T> 184 GLM_FUNC_QUALIFIER uint64 u64_abgr_cast(const detail::tvec4<T>& c) 185 { 186 uint64 result = 0; 187 result += static_cast<uint64>(c.x * detail::tvec4<T>::value_type(65535)) << 48; 188 result += static_cast<uint64>(c.y * detail::tvec4<T>::value_type(65535)) << 32; 189 result += static_cast<uint64>(c.z * detail::tvec4<T>::value_type(65535)) << 16; 190 result += static_cast<uint64>(c.w * detail::tvec4<T>::value_type(65535)) << 0; 191 return result; 192 } 193 194 template <> 195 GLM_FUNC_QUALIFIER f16 f16_channel_cast<uint32>(uint32 color) 196 { 197 return f16(static_cast<float>(color >> 0) / static_cast<float>(255)); 198 } 199 200 template <> 201 GLM_FUNC_QUALIFIER f16vec3 f16_rgbx_cast<uint32>(uint32 color) 202 { 203 f16vec3 result; 204 result.x = f16(static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255)); 205 result.y = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); 206 result.z = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); 207 return result; 208 } 209 210 template <> 211 GLM_FUNC_QUALIFIER f16vec3 f16_xrgb_cast<uint32>(uint32 color) 212 { 213 f16vec3 result; 214 result.x = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); 215 result.y = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); 216 result.z = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255)); 217 return result; 218 } 219 220 template <> 221 GLM_FUNC_QUALIFIER f16vec3 f16_bgrx_cast<uint32>(uint32 color) 222 { 223 f16vec3 result; 224 result.x = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); 225 result.y = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); 226 result.z = f16(static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255)); 227 return result; 228 } 229 230 template <> 231 GLM_FUNC_QUALIFIER f16vec3 f16_xbgr_cast<uint32>(uint32 color) 232 { 233 f16vec3 result; 234 result.x = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255)); 235 result.y = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); 236 result.z = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); 237 return result; 238 } 239 240 template <> 241 GLM_FUNC_QUALIFIER f16vec4 f16_rgba_cast<uint32>(uint32 color) 242 { 243 f16vec4 result; 244 result.x = f16(static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255)); 245 result.y = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); 246 result.z = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); 247 result.w = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255)); 248 return result; 249 } 250 251 template <> 252 GLM_FUNC_QUALIFIER f16vec4 f16_argb_cast<uint32>(uint32 color) 253 { 254 f16vec4 result; 255 result.x = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); 256 result.y = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); 257 result.z = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255)); 258 result.w = f16(static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255)); 259 return result; 260 } 261 262 template <> 263 GLM_FUNC_QUALIFIER f16vec4 f16_bgra_cast<uint32>(uint32 color) 264 { 265 f16vec4 result; 266 result.x = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); 267 result.y = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); 268 result.z = f16(static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255)); 269 result.w = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255)); 270 return result; 271 } 272 273 template <> 274 GLM_FUNC_QUALIFIER f16vec4 f16_abgr_cast<uint32>(uint32 color) 275 { 276 f16vec4 result; 277 result.x = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255)); 278 result.y = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); 279 result.z = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); 280 result.w = f16(static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255)); 281 return result; 282 } 283 284 template <> 285 GLM_FUNC_QUALIFIER float f32_channel_cast<uint8>(uint8 color) 286 { 287 return static_cast<float>(color >> 0) / static_cast<float>(255); 288 } 289 290 template <> 291 GLM_FUNC_QUALIFIER detail::tvec3<float> f32_rgbx_cast<uint32>(uint32 color) 292 { 293 detail::tvec3<float> result; 294 result.x = static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255); 295 result.y = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); 296 result.z = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); 297 return result; 298 } 299 300 template <> 301 GLM_FUNC_QUALIFIER detail::tvec3<float> f32_xrgb_cast<uint32>(uint32 color) 302 { 303 detail::tvec3<float> result; 304 result.x = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); 305 result.y = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); 306 result.z = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255); 307 return result; 308 } 309 310 template <> 311 GLM_FUNC_QUALIFIER detail::tvec3<float> f32_bgrx_cast<uint32>(uint32 color) 312 { 313 detail::tvec3<float> result; 314 result.x = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); 315 result.y = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); 316 result.z = static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255); 317 return result; 318 } 319 320 template <> 321 GLM_FUNC_QUALIFIER detail::tvec3<float> f32_xbgr_cast<uint32>(uint32 color) 322 { 323 detail::tvec3<float> result; 324 result.x = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255); 325 result.y = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); 326 result.z = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); 327 return result; 328 } 329 330 template <> 331 GLM_FUNC_QUALIFIER detail::tvec4<float> f32_rgba_cast<uint32>(uint32 color) 332 { 333 detail::tvec4<float> result; 334 result.x = static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255); 335 result.y = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); 336 result.z = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); 337 result.w = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255); 338 return result; 339 } 340 341 template <> 342 GLM_FUNC_QUALIFIER detail::tvec4<float> f32_argb_cast<uint32>(uint32 color) 343 { 344 detail::tvec4<float> result; 345 result.x = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); 346 result.y = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); 347 result.z = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255); 348 result.w = static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255); 349 return result; 350 } 351 352 template <> 353 GLM_FUNC_QUALIFIER detail::tvec4<float> f32_bgra_cast<uint32>(uint32 color) 354 { 355 detail::tvec4<float> result; 356 result.x = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); 357 result.y = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); 358 result.z = static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255); 359 result.w = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255); 360 return result; 361 } 362 363 template <> 364 GLM_FUNC_QUALIFIER detail::tvec4<float> f32_abgr_cast<uint32>(uint32 color) 365 { 366 detail::tvec4<float> result; 367 result.x = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255); 368 result.y = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); 369 result.z = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); 370 result.w = static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255); 371 return result; 372 } 373 374 template <> 375 GLM_FUNC_QUALIFIER double f64_channel_cast<uint8>(uint8 color) 376 { 377 return static_cast<double>(color >> 0) / static_cast<double>(255); 378 } 379 380 template <> 381 GLM_FUNC_QUALIFIER detail::tvec3<double> f64_rgbx_cast<uint32>(uint32 color) 382 { 383 detail::tvec3<double> result; 384 result.x = static_cast<double>((color >> 0) & 0xFF) / static_cast<double>(255); 385 result.y = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); 386 result.z = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); 387 return result; 388 } 389 390 template <> 391 GLM_FUNC_QUALIFIER detail::tvec3<double> f64_xrgb_cast<uint32>(uint32 color) 392 { 393 detail::tvec3<double> result; 394 result.x = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); 395 result.y = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); 396 result.z = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255); 397 return result; 398 } 399 400 template <> 401 GLM_FUNC_QUALIFIER detail::tvec3<double> f64_bgrx_cast<uint32>(uint32 color) 402 { 403 detail::tvec3<double> result; 404 result.x = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); 405 result.y = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); 406 result.z = static_cast<double>((color >> 0) & 0xFF) / static_cast<double>(255); 407 return result; 408 } 409 410 template <> 411 GLM_FUNC_QUALIFIER detail::tvec3<double> f64_xbgr_cast<uint32>(uint32 color) 412 { 413 detail::tvec3<double> result; 414 result.x = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255); 415 result.y = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); 416 result.z = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); 417 return result; 418 } 419 420 template <> 421 GLM_FUNC_QUALIFIER detail::tvec4<double> f64_rgba_cast<uint32>(uint32 color) 422 { 423 detail::tvec4<double> result; 424 result.x = static_cast<double>((color >> 0) & 0xFF) / static_cast<double>(255); 425 result.y = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); 426 result.z = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); 427 result.w = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255); 428 return result; 429 } 430 431 template <> 432 GLM_FUNC_QUALIFIER detail::tvec4<double> f64_argb_cast<uint32>(uint32 color) 433 { 434 detail::tvec4<double> result; 435 result.x = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); 436 result.y = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); 437 result.z = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255); 438 result.w = static_cast<double>((color >> 0) & 0xFF) / static_cast<double>(255); 439 return result; 440 } 441 442 template <> 443 GLM_FUNC_QUALIFIER detail::tvec4<double> f64_bgra_cast<uint32>(uint32 color) 444 { 445 detail::tvec4<double> result; 446 result.x = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); 447 result.y = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); 448 result.z = static_cast<double>((color >> 0) & 0xFF) / static_cast<double>(255); 449 result.w = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255); 450 return result; 451 } 452 453 template <> 454 GLM_FUNC_QUALIFIER detail::tvec4<double> f64_abgr_cast<uint32>(uint32 color) 455 { 456 detail::tvec4<double> result; 457 result.x = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255); 458 result.y = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); 459 result.z = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); 460 result.w = static_cast<double>((color >> 0) & 0xFF) / static_cast<double>(255); 461 return result; 462 } 463 464 template <> 465 GLM_FUNC_QUALIFIER detail::half f16_channel_cast<uint16>(uint16 color) 466 { 467 return detail::half(static_cast<float>(color >> 0) / static_cast<float>(65535)); 468 } 469 470 template <> 471 GLM_FUNC_QUALIFIER detail::tvec3<detail::half> f16_rgbx_cast<uint64>(uint64 color) 472 { 473 detail::tvec3<detail::half> result; 474 result.x = detail::half(static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535)); 475 result.y = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); 476 result.z = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); 477 return result; 478 } 479 480 template <> 481 GLM_FUNC_QUALIFIER detail::tvec3<detail::half> f16_xrgb_cast<uint64>(uint64 color) 482 { 483 detail::tvec3<detail::half> result; 484 result.x = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); 485 result.y = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); 486 result.z = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535)); 487 return result; 488 } 489 490 template <> 491 GLM_FUNC_QUALIFIER detail::tvec3<detail::half> f16_bgrx_cast<uint64>(uint64 color) 492 { 493 detail::tvec3<detail::half> result; 494 result.x = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); 495 result.y = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); 496 result.z = detail::half(static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535)); 497 return result; 498 } 499 500 template <> 501 GLM_FUNC_QUALIFIER detail::tvec3<detail::half> f16_xbgr_cast<uint64>(uint64 color) 502 { 503 detail::tvec3<detail::half> result; 504 result.x = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535)); 505 result.y = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); 506 result.z = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); 507 return result; 508 } 509 510 template <> 511 GLM_FUNC_QUALIFIER detail::tvec4<detail::half> f16_rgba_cast<uint64>(uint64 color) 512 { 513 detail::tvec4<detail::half> result; 514 result.x = detail::half(static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535)); 515 result.y = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); 516 result.z = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); 517 result.w = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535)); 518 return result; 519 } 520 521 template <> 522 GLM_FUNC_QUALIFIER detail::tvec4<detail::half> f16_argb_cast<uint64>(uint64 color) 523 { 524 detail::tvec4<detail::half> result; 525 result.x = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); 526 result.y = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); 527 result.z = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535)); 528 result.w = detail::half(static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535)); 529 return result; 530 } 531 532 template <> 533 GLM_FUNC_QUALIFIER detail::tvec4<detail::half> f16_bgra_cast<uint64>(uint64 color) 534 { 535 detail::tvec4<detail::half> result; 536 result.x = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); 537 result.y = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); 538 result.z = detail::half(static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535)); 539 result.w = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535)); 540 return result; 541 } 542 543 template <> 544 GLM_FUNC_QUALIFIER detail::tvec4<detail::half> f16_abgr_cast<uint64>(uint64 color) 545 { 546 detail::tvec4<detail::half> result; 547 result.x = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535)); 548 result.y = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); 549 result.z = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); 550 result.w = detail::half(static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535)); 551 return result; 552 } 553 554 template <> 555 GLM_FUNC_QUALIFIER float f32_channel_cast<uint16>(uint16 color) 556 { 557 return static_cast<float>(color >> 0) / static_cast<float>(65535); 558 } 559 560 template <> 561 GLM_FUNC_QUALIFIER detail::tvec3<float> f32_rgbx_cast<uint64>(uint64 color) 562 { 563 detail::tvec3<float> result; 564 result.x = static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535); 565 result.y = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); 566 result.z = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); 567 return result; 568 } 569 570 template <> 571 GLM_FUNC_QUALIFIER detail::tvec3<float> f32_xrgb_cast<uint64>(uint64 color) 572 { 573 detail::tvec3<float> result; 574 result.x = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); 575 result.y = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); 576 result.z = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535); 577 return result; 578 } 579 580 template <> 581 GLM_FUNC_QUALIFIER detail::tvec3<float> f32_bgrx_cast<uint64>(uint64 color) 582 { 583 detail::tvec3<float> result; 584 result.x = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); 585 result.y = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); 586 result.z = static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535); 587 return result; 588 } 589 590 template <> 591 GLM_FUNC_QUALIFIER detail::tvec3<float> f32_xbgr_cast<uint64>(uint64 color) 592 { 593 detail::tvec3<float> result; 594 result.x = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535); 595 result.y = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); 596 result.z = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); 597 return result; 598 } 599 600 template <> 601 GLM_FUNC_QUALIFIER detail::tvec4<float> f32_rgba_cast<uint64>(uint64 color) 602 { 603 detail::tvec4<float> result; 604 result.x = static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535); 605 result.y = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); 606 result.z = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); 607 result.w = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535); 608 return result; 609 } 610 611 template <> 612 GLM_FUNC_QUALIFIER detail::tvec4<float> f32_argb_cast<uint64>(uint64 color) 613 { 614 detail::tvec4<float> result; 615 result.x = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); 616 result.y = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); 617 result.z = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535); 618 result.w = static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535); 619 return result; 620 } 621 622 template <> 623 GLM_FUNC_QUALIFIER detail::tvec4<float> f32_bgra_cast<uint64>(uint64 color) 624 { 625 detail::tvec4<float> result; 626 result.x = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); 627 result.y = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); 628 result.z = static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535); 629 result.w = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535); 630 return result; 631 } 632 633 template <> 634 GLM_FUNC_QUALIFIER detail::tvec4<float> f32_abgr_cast<uint64>(uint64 color) 635 { 636 detail::tvec4<float> result; 637 result.x = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535); 638 result.y = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); 639 result.z = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); 640 result.w = static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535); 641 return result; 642 } 643 644 template <> 645 GLM_FUNC_QUALIFIER double f64_channel_cast<uint16>(uint16 color) 646 { 647 return static_cast<double>(color >> 0) / static_cast<double>(65535); 648 } 649 650 template <> 651 GLM_FUNC_QUALIFIER detail::tvec3<double> f64_rgbx_cast<uint64>(uint64 color) 652 { 653 detail::tvec3<double> result; 654 result.x = static_cast<double>((color >> 0) & 0xFFFF) / static_cast<double>(65535); 655 result.y = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); 656 result.z = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); 657 return result; 658 } 659 660 template <> 661 GLM_FUNC_QUALIFIER detail::tvec3<double> f64_xrgb_cast<uint64>(uint64 color) 662 { 663 detail::tvec3<double> result; 664 result.x = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); 665 result.y = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); 666 result.z = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535); 667 return result; 668 } 669 670 template <> 671 GLM_FUNC_QUALIFIER detail::tvec3<double> f64_bgrx_cast<uint64>(uint64 color) 672 { 673 detail::tvec3<double> result; 674 result.x = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); 675 result.y = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); 676 result.z = static_cast<double>((color >> 0) & 0xFFFF) / static_cast<double>(65535); 677 return result; 678 } 679 680 template <> 681 GLM_FUNC_QUALIFIER detail::tvec3<double> f64_xbgr_cast<uint64>(uint64 color) 682 { 683 detail::tvec3<double> result; 684 result.x = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535); 685 result.y = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); 686 result.z = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); 687 return result; 688 } 689 690 template <> 691 GLM_FUNC_QUALIFIER detail::tvec4<double> f64_rgba_cast<uint64>(uint64 color) 692 { 693 detail::tvec4<double> result; 694 result.x = static_cast<double>((color >> 0) & 0xFFFF) / static_cast<double>(65535); 695 result.y = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); 696 result.z = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); 697 result.w = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535); 698 return result; 699 } 700 701 template <> 702 GLM_FUNC_QUALIFIER detail::tvec4<double> f64_argb_cast<uint64>(uint64 color) 703 { 704 detail::tvec4<double> result; 705 result.x = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); 706 result.y = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); 707 result.z = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535); 708 result.w = static_cast<double>((color >> 0) & 0xFFFF) / static_cast<double>(65535); 709 return result; 710 } 711 712 template <> 713 GLM_FUNC_QUALIFIER detail::tvec4<double> f64_bgra_cast<uint64>(uint64 color) 714 { 715 detail::tvec4<double> result; 716 result.x = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); 717 result.y = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); 718 result.z = static_cast<double>((color >> 0) & 0xFFFF) / static_cast<double>(65535); 719 result.w = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535); 720 return result; 721 } 722 723 template <> 724 GLM_FUNC_QUALIFIER detail::tvec4<double> f64_abgr_cast<uint64>(uint64 color) 725 { 726 detail::tvec4<double> result; 727 result.x = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535); 728 result.y = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); 729 result.z = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); 730 result.w = static_cast<double>((color >> 0) & 0xFFFF) / static_cast<double>(65535); 731 return result; 732 } 733}//namespace glm 734