From 3495537bf971ba5830809b4a3c881ff0eb06c014 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 2 Sep 2018 10:58:02 +0200 Subject: [PATCH] gobj: support clearing half-float textures Fixes #374 --- panda/src/gobj/texture.cxx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/panda/src/gobj/texture.cxx b/panda/src/gobj/texture.cxx index ed983527f8..c0cd14db0a 100644 --- a/panda/src/gobj/texture.cxx +++ b/panda/src/gobj/texture.cxx @@ -5678,6 +5678,21 @@ do_get_clear_data(const CData *cdata, unsigned char *into) const { break; } + case T_half_float: + for (int i = 0; i < num_components; ++i) { + union { + uint32_t ui; + float uf; + } v; + v.uf = clear_value[i]; + uint16_t sign = ((v.ui & 0x80000000u) >> 16u); + uint32_t mantissa = (v.ui & 0x007fffffu); + uint16_t exponent = (uint16_t)std::min(std::max((int)((v.ui & 0x7f800000u) >> 23u) - 112, 0), 31); + mantissa += (mantissa & 0x00001000u) << 1u; + ((uint16_t *)into)[i] = (uint16_t)(sign | ((exponent << 10u) | (mantissa >> 13u))); + } + break; + case T_unsigned_int: // Note: there are no 32-bit UNORM textures. Therefore, we don't do any // normalization here, either.