|
@@ -248,6 +248,18 @@ namespace detail
|
|
|
uint32 pack;
|
|
uint32 pack;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+ union u9u9u9e5
|
|
|
|
|
+ {
|
|
|
|
|
+ struct
|
|
|
|
|
+ {
|
|
|
|
|
+ uint x : 9;
|
|
|
|
|
+ uint y : 9;
|
|
|
|
|
+ uint z : 9;
|
|
|
|
|
+ uint w : 5;
|
|
|
|
|
+ } data;
|
|
|
|
|
+ uint32 pack;
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
}//namespace detail
|
|
}//namespace detail
|
|
|
|
|
|
|
|
GLM_FUNC_QUALIFIER uint8 packUnorm1x8(float v)
|
|
GLM_FUNC_QUALIFIER uint8 packUnorm1x8(float v)
|
|
@@ -486,4 +498,31 @@ namespace detail
|
|
|
detail::packed10bitToFloat(v >> 22));
|
|
detail::packed10bitToFloat(v >> 22));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ GLM_FUNC_QUALIFIER uint32 packF3x9_E1x5(vec3 const & v)
|
|
|
|
|
+ {
|
|
|
|
|
+ float const SharedExpMax = (pow(2.0f, 9.0f - 1.0f) / pow(2.0f, 9.0f)) * pow(2.0f, 31.f - 15.f);
|
|
|
|
|
+ vec3 const Color = clamp(v, 0.0f, SharedExpMax);
|
|
|
|
|
+ float const MaxColor = max(Color.x, max(Color.y, Color.z));
|
|
|
|
|
+
|
|
|
|
|
+ float const ExpSharedP = max(-15.f - 1.f, floor(log2(MaxColor))) + 1.0f + 15.f;
|
|
|
|
|
+ float const MaxShared = floor(MaxColor / pow(2.0f, (ExpSharedP - 16.f - 9.f)) + 0.5f);
|
|
|
|
|
+ float const ExpShared = MaxShared == pow(2.0f, 9.0f) ? ExpSharedP + 1.0f : ExpSharedP;
|
|
|
|
|
+
|
|
|
|
|
+ uvec3 const ColorComp(floor(Color / pow(2.f, (ExpShared - 15.f - 9.f)) + 0.5f));
|
|
|
|
|
+
|
|
|
|
|
+ detail::u9u9u9e5 Unpack;
|
|
|
|
|
+ Unpack.data.x = ColorComp.x;
|
|
|
|
|
+ Unpack.data.y = ColorComp.y;
|
|
|
|
|
+ Unpack.data.z = ColorComp.z;
|
|
|
|
|
+ Unpack.data.w = uint(ExpShared);
|
|
|
|
|
+ return Unpack.pack;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ GLM_FUNC_QUALIFIER vec3 unpackF3x9_E1x5(uint32 v)
|
|
|
|
|
+ {
|
|
|
|
|
+ detail::u9u9u9e5 Unpack;
|
|
|
|
|
+ Unpack.pack = v;
|
|
|
|
|
+
|
|
|
|
|
+ return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * pow(2.0f, Unpack.data.w - 15.f - 9.f);
|
|
|
|
|
+ }
|
|
|
}//namespace glm
|
|
}//namespace glm
|