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:
parent
36edc3f161
commit
1fb7202028
17 changed files with 54 additions and 177 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 ¶ms
|
|||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue