mirror of https://github.com/OpenMW/openmw.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
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);
|
|
}
|
|
}
|
|
}
|