mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-01 03:21:41 +00:00
77de37b1ed
As well as fixing the MacOS build, it meddled with a bunch of files that already did the right thing. This reverts commit8162541a14
, reversing changes made toe16c451d08
.
153 lines
3.7 KiB
C++
153 lines
3.7 KiB
C++
#include "color.hpp"
|
|
|
|
#include <algorithm>
|
|
#include <array>
|
|
|
|
namespace SceneUtil
|
|
{
|
|
|
|
bool isColorFormat(GLenum format)
|
|
{
|
|
static constexpr std::array<GLenum, 42> formats = {
|
|
GL_RGB,
|
|
GL_RGB4,
|
|
GL_RGB5,
|
|
GL_RGB8,
|
|
GL_RGB8_SNORM,
|
|
GL_RGB10,
|
|
GL_RGB12,
|
|
GL_RGB16,
|
|
GL_RGB16_SNORM,
|
|
GL_SRGB,
|
|
GL_SRGB8,
|
|
GL_RGB16F,
|
|
GL_RGB32F,
|
|
GL_R11F_G11F_B10F,
|
|
GL_RGB9_E5,
|
|
GL_RGB8I,
|
|
GL_RGB8UI,
|
|
GL_RGB16I,
|
|
GL_RGB16UI,
|
|
GL_RGB32I,
|
|
GL_RGB32UI,
|
|
GL_RGBA,
|
|
GL_RGBA2,
|
|
GL_RGBA4,
|
|
GL_RGB5_A1,
|
|
GL_RGBA8,
|
|
GL_RGBA8_SNORM,
|
|
GL_RGB10_A2,
|
|
GL_RGB10_A2UI,
|
|
GL_RGBA12,
|
|
GL_RGBA16,
|
|
GL_RGBA16_SNORM,
|
|
GL_SRGB_ALPHA8,
|
|
GL_SRGB8_ALPHA8,
|
|
GL_RGBA16F,
|
|
GL_RGBA32F,
|
|
GL_RGBA8I,
|
|
GL_RGBA8UI,
|
|
GL_RGBA16I,
|
|
GL_RGBA16UI,
|
|
GL_RGBA32I,
|
|
GL_RGBA32UI,
|
|
};
|
|
|
|
return std::find(formats.cbegin(), formats.cend(), format) != formats.cend();
|
|
}
|
|
|
|
bool isFloatingPointColorFormat(GLenum format)
|
|
{
|
|
static constexpr std::array<GLenum, 5> formats = {
|
|
GL_RGB16F,
|
|
GL_RGB32F,
|
|
GL_R11F_G11F_B10F,
|
|
GL_RGBA16F,
|
|
GL_RGBA32F,
|
|
};
|
|
|
|
return std::find(formats.cbegin(), formats.cend(), format) != formats.cend();
|
|
}
|
|
|
|
int getColorFormatChannelCount(GLenum format)
|
|
{
|
|
static constexpr std::array<GLenum, 21> formats = {
|
|
GL_RGBA,
|
|
GL_RGBA2,
|
|
GL_RGBA4,
|
|
GL_RGB5_A1,
|
|
GL_RGBA8,
|
|
GL_RGBA8_SNORM,
|
|
GL_RGB10_A2,
|
|
GL_RGB10_A2UI,
|
|
GL_RGBA12,
|
|
GL_RGBA16,
|
|
GL_RGBA16_SNORM,
|
|
GL_SRGB_ALPHA8,
|
|
GL_SRGB8_ALPHA8,
|
|
GL_RGBA16F,
|
|
GL_RGBA32F,
|
|
GL_RGBA8I,
|
|
GL_RGBA8UI,
|
|
GL_RGBA16I,
|
|
GL_RGBA16UI,
|
|
GL_RGBA32I,
|
|
GL_RGBA32UI,
|
|
};
|
|
if (std::find(formats.cbegin(), formats.cend(), format) != formats.cend())
|
|
return 4;
|
|
return 3;
|
|
}
|
|
|
|
void getColorFormatSourceFormatAndType(GLenum internalFormat, GLenum& sourceFormat, GLenum& sourceType)
|
|
{
|
|
if (getColorFormatChannelCount(internalFormat == 4))
|
|
sourceFormat = GL_RGBA;
|
|
else
|
|
sourceFormat = GL_RGB;
|
|
|
|
if (isFloatingPointColorFormat(internalFormat))
|
|
sourceType = GL_FLOAT;
|
|
else
|
|
sourceType = GL_UNSIGNED_BYTE;
|
|
}
|
|
|
|
namespace Color
|
|
{
|
|
GLenum sColorInternalFormat;
|
|
GLenum sColorSourceFormat;
|
|
GLenum sColorSourceType;
|
|
|
|
GLenum colorInternalFormat()
|
|
{
|
|
return sColorInternalFormat;
|
|
}
|
|
|
|
GLenum colorSourceFormat()
|
|
{
|
|
return sColorSourceFormat;
|
|
}
|
|
|
|
GLenum colorSourceType()
|
|
{
|
|
return sColorSourceType;
|
|
}
|
|
|
|
void SelectColorFormatOperation::operator()([[maybe_unused]] osg::GraphicsContext* graphicsContext)
|
|
{
|
|
sColorInternalFormat = GL_RGB;
|
|
|
|
for (auto supportedFormat : mSupportedFormats)
|
|
{
|
|
if (isColorFormat(supportedFormat))
|
|
{
|
|
sColorInternalFormat = supportedFormat;
|
|
break;
|
|
}
|
|
}
|
|
|
|
getColorFormatSourceFormatAndType(sColorInternalFormat, sColorSourceFormat, sColorSourceType);
|
|
}
|
|
}
|
|
}
|