1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

GL: fix and clean up some code

This commit is contained in:
sfan5 2024-11-28 10:39:07 +01:00
parent 36edc3f161
commit 1fb7202028
17 changed files with 54 additions and 177 deletions

View file

@ -743,19 +743,6 @@ SFrameStats CNullDriver::getFrameStats() const
return FrameStats;
}
//! Sets the dynamic ambient light color. The default color is
//! (0,0,0,0) which means it is dark.
//! \param color: New color of the ambient light.
void CNullDriver::setAmbientLight(const SColorf &color)
{
AmbientLight = color;
}
const SColorf &CNullDriver::getAmbientLight() const
{
return AmbientLight;
}
//! \return Returns the name of the video driver. Example: In case of the DIRECT3D8
//! driver, it would return "Direct3D8".
@ -1774,21 +1761,5 @@ bool CNullDriver::needsTransparentRenderPass(const irr::video::SMaterial &materi
return false;
}
//! Color conversion convenience function
/** Convert an image (as array of pixels) from source to destination
array, thereby converting the color format. The pixel size is
determined by the color formats.
\param sP Pointer to source
\param sF Color format of source
\param sN Number of pixels to convert, both array must be large enough
\param dP Pointer to destination
\param dF Color format of destination
*/
void CNullDriver::convertColor(const void *sP, ECOLOR_FORMAT sF, s32 sN,
void *dP, ECOLOR_FORMAT dF) const
{
video::CColorConverter::convert_viaFormat(sP, sF, sN, dP, dF);
}
} // end namespace
} // end namespace

View file

@ -201,14 +201,6 @@ public:
//! driver, it would return "Direct3D8.1".
const char *getName() const override;
//! Sets the dynamic ambient light color. The default color is
//! (0,0,0,0) which means it is dark.
//! \param color: New color of the ambient light.
void setAmbientLight(const SColorf &color) override;
//! Get the global ambient light currently used by the driver
const SColorf &getAmbientLight() const override;
//! Adds an external image loader to the engine.
void addExternalImageLoader(IImageLoader *loader) override;
@ -559,19 +551,6 @@ public:
//! Used by some SceneNodes to check if a material should be rendered in the transparent render pass
bool needsTransparentRenderPass(const irr::video::SMaterial &material) const override;
//! Color conversion convenience function
/** Convert an image (as array of pixels) from source to destination
array, thereby converting the color format. The pixel size is
determined by the color formats.
\param sP Pointer to source
\param sF Color format of source
\param sN Number of pixels to convert, both array must be large enough
\param dP Pointer to destination
\param dF Color format of destination
*/
virtual void convertColor(const void *sP, ECOLOR_FORMAT sF, s32 sN,
void *dP, ECOLOR_FORMAT dF) const override;
protected:
//! deletes all textures
void deleteAllTextures();
@ -759,8 +738,6 @@ protected:
bool AllowZWriteOnTransparent;
bool FeatureEnabled[video::EVDF_COUNT];
SColorf AmbientLight;
};
} // end namespace video

View file

@ -170,6 +170,17 @@ public:
return;
}
#ifndef IRR_COMPILE_GL_COMMON
// On GLES 3.0 we must use sized internal formats for textures in certain
// cases (e.g. with ETT_2D_MS). However ECF_A8R8G8B8 is mapped to GL_BGRA
// (an unsized format).
// Since we don't upload to RTT we can safely pick a different combo that works.
if (InternalFormat == GL_BGRA && Driver->Version.Major >= 3) {
InternalFormat = GL_RGBA8;
PixelFormat = GL_RGBA;
}
#endif
#ifdef _DEBUG
char lbuf[100];
snprintf_irr(lbuf, sizeof(lbuf),

View file

@ -122,7 +122,6 @@ bool COpenGLDriver::genericDriverInit()
os::Printer::log("GLSL not available.", ELL_INFORMATION);
DriverAttributes->setAttribute("MaxTextures", (s32)Feature.MaxTextureUnits);
DriverAttributes->setAttribute("MaxSupportedTextures", (s32)Feature.MaxTextureUnits);
DriverAttributes->setAttribute("MaxLights", MaxLights);
DriverAttributes->setAttribute("MaxAnisotropy", MaxAnisotropy);
DriverAttributes->setAttribute("MaxAuxBuffers", MaxAuxBuffers);
DriverAttributes->setAttribute("MaxMultipleRenderTargets", (s32)Feature.MultipleRenderTarget);
@ -139,13 +138,6 @@ bool COpenGLDriver::genericDriverInit()
for (i = 0; i < ETS_COUNT; ++i)
setTransform(static_cast<E_TRANSFORMATION_STATE>(i), core::IdentityMatrix);
setAmbientLight(SColorf(0.0f, 0.0f, 0.0f, 0.0f));
#ifdef GL_EXT_separate_specular_color
if (FeatureAvailable[IRR_EXT_separate_specular_color])
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
#endif
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
// This is a fast replacement for NORMALIZE_NORMALS
// if ((Version>101) || FeatureAvailable[IRR_EXT_rescale_normal])
// glEnable(GL_RESCALE_NORMAL_EXT);
@ -2420,16 +2412,6 @@ const char *COpenGLDriver::getName() const
return Name.c_str();
}
//! Sets the dynamic ambient light color. The default color is
//! (0,0,0,0) which means it is dark.
//! \param color: New color of the ambient light.
void COpenGLDriver::setAmbientLight(const SColorf &color)
{
CNullDriver::setAmbientLight(color);
GLfloat data[4] = {color.r, color.g, color.b, color.a};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, data);
}
// this code was sent in by Oliver Klems, thank you! (I modified the glViewport
// method just a bit.
void COpenGLDriver::setViewPort(const core::rect<s32> &area)

View file

@ -182,11 +182,6 @@ public:
//! driver, it would return "Direct3D8.1".
const char *getName() const override;
//! Sets the dynamic ambient light color. The default color is
//! (0,0,0,0) which means it is dark.
//! \param color: New color of the ambient light.
void setAmbientLight(const SColorf &color) override;
//! sets a viewport
void setViewPort(const core::rect<s32> &area) override;

View file

@ -19,7 +19,7 @@ namespace video
bool COpenGLExtensionHandler::needsDSAFramebufferHack = true;
COpenGLExtensionHandler::COpenGLExtensionHandler() :
StencilBuffer(false), TextureCompressionExtension(false), MaxLights(1),
StencilBuffer(false), TextureCompressionExtension(false),
MaxAnisotropy(1), MaxAuxBuffers(0), MaxIndices(65535),
MaxTextureSize(1), MaxGeometryVerticesOut(0),
MaxTextureLODBias(0.f), Version(0), ShaderLanguageVersion(0),
@ -399,8 +399,6 @@ void COpenGLExtensionHandler::initExtensions(video::IContextManager *cmgr, bool
Feature.MaxTextureUnits = core::max_(Feature.MaxTextureUnits, static_cast<u8>(num));
}
#endif
glGetIntegerv(GL_MAX_LIGHTS, &num);
MaxLights = static_cast<u8>(num);
#ifdef GL_EXT_texture_filter_anisotropic
if (FeatureAvailable[IRR_EXT_texture_filter_anisotropic]) {
glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &num);

View file

@ -1015,8 +1015,6 @@ public:
bool TextureCompressionExtension;
// Some non-boolean properties
//! Maximum hardware lights supported
u8 MaxLights;
//! Maximal Anisotropy
u8 MaxAnisotropy;
//! Number of auxiliary buffers

View file

@ -41,7 +41,7 @@ CSceneManager::CSceneManager(video::IVideoDriver *driver,
ISceneNode(0, 0),
Driver(driver),
CursorControl(cursorControl),
ActiveCamera(0), ShadowColor(150, 0, 0, 0), AmbientLight(0, 0, 0, 0), Parameters(0),
ActiveCamera(0), Parameters(0),
MeshCache(cache), CurrentRenderPass(ESNRP_NONE)
{
#ifdef _DEBUG
@ -445,9 +445,6 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode *node, E_SCENE_NODE_RENDE
taken = 1;
}
// as of yet unused
case ESNRP_LIGHT:
case ESNRP_SHADOW:
case ESNRP_NONE: // ignore this one
break;
}
@ -775,18 +772,6 @@ ISceneManager *CSceneManager::createNewSceneManager(bool cloneContent)
return manager;
}
//! Sets ambient color of the scene
void CSceneManager::setAmbientLight(const video::SColorf &ambientColor)
{
AmbientLight = ambientColor;
}
//! Returns ambient color of the scene
const video::SColorf &CSceneManager::getAmbientLight() const
{
return AmbientLight;
}
//! Get a skinned mesh, which is not available as header-only code
ISkinnedMesh *CSceneManager::createSkinnedMesh()
{

View file

@ -170,12 +170,6 @@ public:
//! Get a skinned mesh, which is not available as header-only code
ISkinnedMesh *createSkinnedMesh() override;
//! Sets ambient color of the scene
void setAmbientLight(const video::SColorf &ambientColor) override;
//! Returns ambient color of the scene
const video::SColorf &getAmbientLight() const override;
//! Get current render time.
E_SCENE_NODE_RENDER_PASS getCurrentRenderPass() const override { return CurrentRenderPass; }
@ -291,9 +285,6 @@ private:
ICameraSceneNode *ActiveCamera;
core::vector3df camWorldPos; // Position of camera for transparent nodes.
video::SColor ShadowColor;
video::SColorf AmbientLight;
//! String parameters
// NOTE: Attributes are slow and should only be used for debug-info and not in release
io::CAttributes *Parameters;

View file

@ -40,7 +40,7 @@ typedef COpenGLCoreTexture<COpenGL3DriverBase> COpenGL3Texture;
typedef COpenGLCoreRenderTarget<COpenGL3DriverBase, COpenGL3Texture> COpenGL3RenderTarget;
typedef COpenGLCoreCacheHandler<COpenGL3DriverBase, COpenGL3Texture> COpenGL3CacheHandler;
enum class OpenGLSpec : u8
enum OpenGLSpec : u8
{
Core,
Compat,

View file

@ -27,37 +27,32 @@ namespace irr
{
namespace video
{
struct VertexAttribute
{
enum class Mode
enum Mode : u8
{
Regular,
Normalized,
Integral,
Integer,
};
int Index;
int ComponentCount;
u8 Index;
u8 ComponentCount;
GLenum ComponentType;
Mode mode;
int Offset;
u32 Offset;
};
struct VertexType
{
int VertexSize;
u32 VertexSize;
std::vector<VertexAttribute> Attributes;
// allow ranged for loops
inline auto begin() const { return Attributes.begin(); }
inline auto end() const { return Attributes.end(); }
};
static const VertexAttribute *begin(const VertexType &type)
{
return type.Attributes.data();
}
static const VertexAttribute *end(const VertexType &type)
{
return type.Attributes.data() + type.Attributes.size();
}
static const VertexType vtStandard = {
sizeof(S3DVertex),
{
@ -68,6 +63,9 @@ static const VertexType vtStandard = {
},
};
// FIXME: this is actually UB because these vertex classes are not "standard-layout"
// they violate the following requirement:
// - only one class in the hierarchy has non-static data members
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Winvalid-offsetof"
@ -170,11 +168,15 @@ COpenGL3DriverBase::COpenGL3DriverBase(const SIrrlichtCreationParameters &params
ExposedData = ContextManager->getContext();
ContextManager->activateContext(ExposedData, false);
GL.LoadAllProcedures(ContextManager);
if (EnableErrorTest) {
if (EnableErrorTest && GL.IsExtensionPresent("GL_KHR_debug")) {
GL.Enable(GL_DEBUG_OUTPUT);
GL.DebugMessageCallback(debugCb, this);
} else if (EnableErrorTest) {
os::Printer::log("GL debug extension not available");
}
initQuadsIndices();
TEST_GL_ERROR(this);
}
COpenGL3DriverBase::~COpenGL3DriverBase()
@ -267,7 +269,6 @@ bool COpenGL3DriverBase::genericDriverInit(const core::dimension2d<u32> &screenS
for (s32 i = 0; i < ETS_COUNT; ++i)
setTransform(static_cast<E_TRANSFORMATION_STATE>(i), core::IdentityMatrix);
setAmbientLight(SColorf(0.0f, 0.0f, 0.0f, 0.0f));
GL.ClearDepthf(1.0f);
GL.Hint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
@ -760,6 +761,13 @@ void COpenGL3DriverBase::drawVertexPrimitiveList(const void *vertices, u32 verte
endDraw(vTypeDesc);
}
void COpenGL3DriverBase::draw2DVertexPrimitiveList(const void *vertices, u32 vertexCount,
const void *indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
{
os::Printer::log("draw2DVertexPrimitiveList unimplemented", ELL_ERROR);
}
void COpenGL3DriverBase::draw2DImage(const video::ITexture *texture, const core::position2d<s32> &destPos,
const core::rect<s32> &sourceRect, const core::rect<s32> *clipRect, SColor color,
bool useAlphaChannelOfTexture)
@ -1066,7 +1074,7 @@ void COpenGL3DriverBase::drawElements(GLenum primitiveType, const VertexType &ve
void COpenGL3DriverBase::beginDraw(const VertexType &vertexType, uintptr_t verticesBase)
{
for (auto attr : vertexType) {
for (auto &attr : vertexType) {
GL.EnableVertexAttribArray(attr.Index);
switch (attr.mode) {
case VertexAttribute::Mode::Regular:
@ -1075,7 +1083,7 @@ void COpenGL3DriverBase::beginDraw(const VertexType &vertexType, uintptr_t verti
case VertexAttribute::Mode::Normalized:
GL.VertexAttribPointer(attr.Index, attr.ComponentCount, attr.ComponentType, GL_TRUE, vertexType.VertexSize, reinterpret_cast<void *>(verticesBase + attr.Offset));
break;
case VertexAttribute::Mode::Integral:
case VertexAttribute::Mode::Integer:
GL.VertexAttribIPointer(attr.Index, attr.ComponentCount, attr.ComponentType, vertexType.VertexSize, reinterpret_cast<void *>(verticesBase + attr.Offset));
break;
}
@ -1084,7 +1092,7 @@ void COpenGL3DriverBase::beginDraw(const VertexType &vertexType, uintptr_t verti
void COpenGL3DriverBase::endDraw(const VertexType &vertexType)
{
for (auto attr : vertexType)
for (auto &attr : vertexType)
GL.DisableVertexAttribArray(attr.Index);
}

View file

@ -81,6 +81,11 @@ public:
const void *indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) override;
//! draws a vertex primitive list in 2d
virtual void draw2DVertexPrimitiveList(const void *vertices, u32 vertexCount,
const void *indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) override;
//! queries the features of the driver, returns true if feature is available
bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const override
{

View file

@ -43,8 +43,6 @@ void COpenGLES2Driver::initFeatures()
}
initExtensions();
static const GLenum BGRA8_EXT = 0x93A1;
if (Version.Major >= 3) {
// NOTE floating-point formats may not be suitable for render targets.
TextureFormats[ECF_A1R5G5B5] = {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, CColorConverter::convert_A1R5G5B5toR5G5B5A1};
@ -64,10 +62,11 @@ void COpenGLES2Driver::initFeatures()
TextureFormats[ECF_D24] = {GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT};
TextureFormats[ECF_D24S8] = {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8};
if (FeatureAvailable[IRR_GL_EXT_texture_format_BGRA8888])
// NOTE a recent (2024) revision of EXT_texture_format_BGRA8888 also
// adds a sized format GL_BGRA8_EXT. We have a workaround in place to
// fix up the InternalFormat in case of render targets.
if (FeatureAvailable[IRR_GL_EXT_texture_format_BGRA8888] || FeatureAvailable[IRR_GL_APPLE_texture_format_BGRA8888])
TextureFormats[ECF_A8R8G8B8] = {GL_BGRA, GL_BGRA, GL_UNSIGNED_BYTE};
else if (FeatureAvailable[IRR_GL_APPLE_texture_format_BGRA8888])
TextureFormats[ECF_A8R8G8B8] = {BGRA8_EXT, GL_BGRA, GL_UNSIGNED_BYTE};
// OpenGL ES 3 doesn't include a GL_DEPTH_COMPONENT32, so still use
// OES_depth_texture for 32-bit depth texture support.
@ -87,10 +86,8 @@ void COpenGLES2Driver::initFeatures()
TextureFormats[ECF_R8G8B8] = {GL_RGB, GL_RGB, GL_UNSIGNED_BYTE};
TextureFormats[ECF_A8R8G8B8] = {GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, CColorConverter::convert_A8R8G8B8toA8B8G8R8};
if (FeatureAvailable[IRR_GL_EXT_texture_format_BGRA8888])
if (FeatureAvailable[IRR_GL_EXT_texture_format_BGRA8888] || FeatureAvailable[IRR_GL_APPLE_texture_format_BGRA8888])
TextureFormats[ECF_A8R8G8B8] = {GL_BGRA, GL_BGRA, GL_UNSIGNED_BYTE};
else if (FeatureAvailable[IRR_GL_APPLE_texture_format_BGRA8888])
TextureFormats[ECF_A8R8G8B8] = {BGRA8_EXT, GL_BGRA, GL_UNSIGNED_BYTE};
if (FeatureAvailable[IRR_GL_OES_texture_half_float]) {
TextureFormats[ECF_A16B16G16R16F] = {GL_RGBA, GL_RGBA, HALF_FLOAT_OES};