diff options
Diffstat (limited to 'src/render/Qt3DSRenderBaseTypes.h')
-rw-r--r-- | src/render/Qt3DSRenderBaseTypes.h | 179 |
1 files changed, 5 insertions, 174 deletions
diff --git a/src/render/Qt3DSRenderBaseTypes.h b/src/render/Qt3DSRenderBaseTypes.h index 909077d..bfe034b 100644 --- a/src/render/Qt3DSRenderBaseTypes.h +++ b/src/render/Qt3DSRenderBaseTypes.h @@ -351,6 +351,7 @@ struct NVRenderRenderBufferFormats QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RGBA32F) \ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(R11G11B10) \ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RGB9E5) \ + QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RGBE8) \ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_DXT1) \ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGB_DXT1) \ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_DXT3) \ @@ -511,6 +512,7 @@ struct NVRenderTextureFormats return 4; case R32F: return 4; + case RGBE8: case RGBA8: return 4; case RGB8: @@ -571,6 +573,7 @@ struct NVRenderTextureFormats return 1; case R32F: return 1; + case RGBE8: case RGBA8: return 4; case RGB8: @@ -619,181 +622,9 @@ struct NVRenderTextureFormats } static void decodeToFloat(void *inPtr, QT3DSU32 byteOfs, float *outPtr, - NVRenderTextureFormats::Enum inFmt) - { - outPtr[0] = 0.0f; - outPtr[1] = 0.0f; - outPtr[2] = 0.0f; - outPtr[3] = 0.0f; - QT3DSU8 *src = reinterpret_cast<QT3DSU8 *>(inPtr); - // float divisor; // If we want to support RGBD? - switch (inFmt) { - case Alpha8: - outPtr[0] = ((float)src[byteOfs]) / 255.0f; - break; - - case Luminance8: - case LuminanceAlpha8: - case R8: - case RG8: - case RGB8: - case RGBA8: - case SRGB8: - case SRGB8A8: - // NOTE : RGBD Hack here for reference. Not meant for installation. - // divisor = (NVRenderTextureFormats::getSizeofFormat(inFmt) == 4) ? - // ((float)src[byteOfs+3]) / 255.0f : 1.0f; - for (QT3DSU32 i = 0; i < NVRenderTextureFormats::getSizeofFormat(inFmt); ++i) { - float val = ((float)src[byteOfs + i]) / 255.0f; - outPtr[i] = (i < 3) ? powf(val, 0.4545454545f) : val; - // Assuming RGBA8 actually means RGBD (which is stupid, I know) - // if ( NVRenderTextureFormats::getSizeofFormat(inFmt) == 4 ) { outPtr[i] /= - // divisor; } - } - // outPtr[3] = divisor; - break; - - case R32F: - outPtr[0] = reinterpret_cast<float *>(src + byteOfs)[0]; - break; - case RG32F: - outPtr[0] = reinterpret_cast<float *>(src + byteOfs)[0]; - outPtr[1] = reinterpret_cast<float *>(src + byteOfs)[1]; - break; - case RGBA32F: - outPtr[0] = reinterpret_cast<float *>(src + byteOfs)[0]; - outPtr[1] = reinterpret_cast<float *>(src + byteOfs)[1]; - outPtr[2] = reinterpret_cast<float *>(src + byteOfs)[2]; - outPtr[3] = reinterpret_cast<float *>(src + byteOfs)[3]; - break; - case RGB32F: - outPtr[0] = reinterpret_cast<float *>(src + byteOfs)[0]; - outPtr[1] = reinterpret_cast<float *>(src + byteOfs)[1]; - outPtr[2] = reinterpret_cast<float *>(src + byteOfs)[2]; - break; - - case R16F: - case RG16F: - case RGBA16F: - for (QT3DSU32 i = 0; i < (NVRenderTextureFormats::getSizeofFormat(inFmt) >> 1); ++i) { - // NOTE : This only works on the assumption that we don't have any denormals, - // Infs or NaNs. - // Every pixel in our source image should be "regular" - QT3DSU16 h = reinterpret_cast<QT3DSU16 *>(src + byteOfs)[i]; - QT3DSU32 sign = (h & 0x8000) << 16; - QT3DSU32 exponent = (((((h & 0x7c00) >> 10) - 15) + 127) << 23); - QT3DSU32 mantissa = ((h & 0x3ff) << 13); - QT3DSU32 result = sign | exponent | mantissa; - - if (h == 0 || h == 0x8000) { - result = 0; - } // Special case for zero and negative zero - qt3ds::intrinsics::memCopy(reinterpret_cast<QT3DSU32 *>(outPtr) + i, &result, 4); - } - break; - - case R11G11B10: - // place holder - QT3DS_ASSERT(false); - break; - - default: - outPtr[0] = 0.0f; - outPtr[1] = 0.0f; - outPtr[2] = 0.0f; - outPtr[3] = 0.0f; - break; - } - } - + NVRenderTextureFormats::Enum inFmt); static void encodeToPixel(float *inPtr, void *outPtr, QT3DSU32 byteOfs, - NVRenderTextureFormats::Enum inFmt) - { - QT3DSU8 *dest = reinterpret_cast<QT3DSU8 *>(outPtr); - switch (inFmt) { - case NVRenderTextureFormats::Alpha8: - dest[byteOfs] = QT3DSU8(inPtr[0] * 255.0f); - break; - - case Luminance8: - case LuminanceAlpha8: - case R8: - case RG8: - case RGB8: - case RGBA8: - case SRGB8: - case SRGB8A8: - for (QT3DSU32 i = 0; i < NVRenderTextureFormats::getSizeofFormat(inFmt); ++i) { - inPtr[i] = (inPtr[i] > 1.0f) ? 1.0f : inPtr[i]; - if (i < 3) - dest[byteOfs + i] = QT3DSU8(powf(inPtr[i], 2.2f) * 255.0f); - else - dest[byteOfs + i] = QT3DSU8(inPtr[i] * 255.0f); - } - break; - - case R32F: - reinterpret_cast<float *>(dest + byteOfs)[0] = inPtr[0]; - break; - case RG32F: - reinterpret_cast<float *>(dest + byteOfs)[0] = inPtr[0]; - reinterpret_cast<float *>(dest + byteOfs)[1] = inPtr[1]; - break; - case RGBA32F: - reinterpret_cast<float *>(dest + byteOfs)[0] = inPtr[0]; - reinterpret_cast<float *>(dest + byteOfs)[1] = inPtr[1]; - reinterpret_cast<float *>(dest + byteOfs)[2] = inPtr[2]; - reinterpret_cast<float *>(dest + byteOfs)[3] = inPtr[3]; - break; - case RGB32F: - reinterpret_cast<float *>(dest + byteOfs)[0] = inPtr[0]; - reinterpret_cast<float *>(dest + byteOfs)[1] = inPtr[1]; - reinterpret_cast<float *>(dest + byteOfs)[2] = inPtr[2]; - break; - - case R16F: - case RG16F: - case RGBA16F: - for (QT3DSU32 i = 0; i < (NVRenderTextureFormats::getSizeofFormat(inFmt) >> 1); ++i) { - // NOTE : This also has the limitation of not handling infs, NaNs and - // denormals, but it should be - // sufficient for our purposes. - if (inPtr[i] > 65519.0f) { - inPtr[i] = 65519.0f; - } - if (fabs(inPtr[i]) < 6.10352E-5f) { - inPtr[i] = 0.0f; - } - QT3DSU32 f = reinterpret_cast<QT3DSU32 *>(inPtr)[i]; - QT3DSU32 sign = (f & 0x80000000) >> 16; - QT3DSI32 exponent = (f & 0x7f800000) >> 23; - QT3DSU32 mantissa = (f >> 13) & 0x3ff; - exponent = exponent - 112; - if (exponent > 31) { - exponent = 31; - } - if (exponent < 0) { - exponent = 0; - } - exponent = exponent << 10; - reinterpret_cast<QT3DSU16 *>(dest + byteOfs)[i] = - QT3DSU16(sign | exponent | mantissa); - } - break; - - case R11G11B10: - // place holder - QT3DS_ASSERT(false); - break; - - default: - dest[byteOfs] = 0; - dest[byteOfs + 1] = 0; - dest[byteOfs + 2] = 0; - dest[byteOfs + 3] = 0; - break; - } - } + NVRenderTextureFormats::Enum inFmt); }; struct NVRenderTextureTargetType |