From c95c736b1ffe480b7a76a431e8f2c6528c71c7e0 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 1 Oct 2018 22:50:29 -0700 Subject: [PATCH] FOUnd a working path for gl41 --- libraries/render-utils/src/Blendshape.slh | 11 +++-------- libraries/render-utils/src/Model.cpp | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/libraries/render-utils/src/Blendshape.slh b/libraries/render-utils/src/Blendshape.slh index c6ba6f8fd3..34bd43cabb 100644 --- a/libraries/render-utils/src/Blendshape.slh +++ b/libraries/render-utils/src/Blendshape.slh @@ -37,16 +37,11 @@ vec3 unpackSnorm3x10_1x2(int packedValue) { #if defined(GPU_GL410) layout(binding=0) uniform samplerBuffer blendshapeOffsetsBuffer; -vec2 gpu_unpackHalf2x16(uint packedValue) { - return unpackHalf2x16(packedValue); -} - BlendshapeOffset getBlendshapeOffset(int i) { - vec4 fetched = texelFetch(blendshapeOffsetsBuffer, i); - uvec4 elem_packed = uvec4(floatBitsToUint(fetched.x), floatBitsToUint(fetched.y), floatBitsToUint(fetched.z), floatBitsToUint(fetched.w)); - + uvec4 elem_packed = floatBitsToUint(texelFetch(blendshapeOffsetsBuffer, i)); + BlendshapeOffset unpacked; - unpacked.position = vec3(gpu_unpackHalf2x16((elem_packed.x)), gpu_unpackHalf2x16(uint(elem_packed.y)).x); + unpacked.position = unpackSnorm3x10_1x2(int(elem_packed.y)).xyz * uintBitsToFloat(elem_packed.x); <@if USE_NORMAL@> unpacked.normal = unpackSnorm3x10_1x2(int(elem_packed.z)).xyz; <@endif@> diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 50abaef01f..6ee39ca3aa 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1687,13 +1687,29 @@ void Blender::run() { auto unpacked = unpackedBlendshapeOffsets.data() + range.begin(); auto packed = meshBlendshapeOffsets + range.begin(); for (auto j = range.begin(); j < range.end(); j++) { + +#ifdef Q_OS_MAC + float len = glm::compMax(glm::abs(unpacked->positionOffsetAndSpare)); + if (len > 1.0f) { + unpacked->positionOffsetAndSpare /= len; + } else { + len = 1.0f; + } + + (*packed).packedPosNorTan = glm::uvec4( + glm::floatBitsToUint(len), + glm::packSnorm3x10_1x2(glm::vec4(unpacked->positionOffsetAndSpare, 0.0f)), + glm::packSnorm3x10_1x2(glm::vec4(unpacked->normalOffsetAndSpare, 0.0f)), + glm::packSnorm3x10_1x2(glm::vec4(unpacked->tangentOffsetAndSpare, 0.0f)) + ); +#else (*packed).packedPosNorTan = glm::uvec4( glm::packHalf2x16(glm::vec2(unpacked->positionOffsetAndSpare)), glm::packHalf2x16(glm::vec2(unpacked->positionOffsetAndSpare.z, 0.0f)), glm::packSnorm3x10_1x2(glm::vec4(unpacked->normalOffsetAndSpare, 0.0f)), glm::packSnorm3x10_1x2(glm::vec4(unpacked->tangentOffsetAndSpare, 0.0f)) ); - +#endif unpacked++; packed++; }