mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-26 08:56:37 +00:00 
			
		
		
		
	Multiview shaders. Refactor Frustum management Rewrite shared shadow map cull mask should respect stereo Stereo savegame screencap LocalMap refactoring use the vertex buffer hint instead of the display list patch to enable/disable display lists Character preview fixes
		
			
				
	
	
		
			157 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "color.hpp"
 | |
| 
 | |
| #include <algorithm>
 | |
| #include <array>
 | |
| 
 | |
| #include <SDL_opengl_glext.h>
 | |
| 
 | |
| #include <components/debug/debuglog.hpp>
 | |
| #include <components/settings/settings.hpp>
 | |
| 
 | |
| 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);
 | |
|         }
 | |
|     }
 | |
| }
 |