Index: ps/trunk/source/graphics/LOSTexture.h =================================================================== --- ps/trunk/source/graphics/LOSTexture.h +++ ps/trunk/source/graphics/LOSTexture.h @@ -51,10 +51,10 @@ * Also potentially switches the current active texture unit, and enables texturing on it. * The texture is in 8-bit ALPHA format. */ - GLuint GetTexture(); + Renderer::Backend::GL::CTexture* GetTexture(); void InterpolateLOS(); - GLuint GetTextureSmooth(); + Renderer::Backend::GL::CTexture* GetTextureSmooth(); /** * Returns a matrix to map (x,y,z) world coordinates onto (u,v) LOS texture Index: ps/trunk/source/graphics/LOSTexture.cpp =================================================================== --- ps/trunk/source/graphics/LOSTexture.cpp +++ ps/trunk/source/graphics/LOSTexture.cpp @@ -107,12 +107,12 @@ m_Dirty = true; } -GLuint CLOSTexture::GetTextureSmooth() +Renderer::Backend::GL::CTexture* CLOSTexture::GetTextureSmooth() { if (CRenderer::IsInitialised() && !g_RenderingOptions.GetSmoothLOS()) return GetTexture(); else - return (whichTex ? m_TextureSmooth1 : m_TextureSmooth2)->GetHandle(); + return (whichTex ? m_TextureSmooth1 : m_TextureSmooth2).get(); } void CLOSTexture::InterpolateLOS() @@ -155,8 +155,8 @@ shader->Bind(); - shader->BindTexture(str_losTex1, m_Texture->GetHandle()); - shader->BindTexture(str_losTex2, (whichTex ? m_TextureSmooth1 : m_TextureSmooth2)->GetHandle()); + shader->BindTexture(str_losTex1, m_Texture.get()); + shader->BindTexture(str_losTex2, (whichTex ? m_TextureSmooth1 : m_TextureSmooth2).get()); shader->Uniform(str_delta, (float)g_Renderer.GetTimeManager().GetFrameDelta() * 4.0f, 0.0f, 0.0f, 0.0f); @@ -200,7 +200,7 @@ } -GLuint CLOSTexture::GetTexture() +Renderer::Backend::GL::CTexture* CLOSTexture::GetTexture() { if (m_Dirty) { @@ -208,7 +208,7 @@ m_Dirty = false; } - return m_Texture->GetHandle(); + return m_Texture.get(); } const CMatrix3D& CLOSTexture::GetTextureMatrix() Index: ps/trunk/source/graphics/MiniMapTexture.h =================================================================== --- ps/trunk/source/graphics/MiniMapTexture.h +++ ps/trunk/source/graphics/MiniMapTexture.h @@ -42,7 +42,7 @@ */ void Render(); - GLuint GetTexture() const { return m_FinalTexture->GetHandle(); } + Renderer::Backend::GL::CTexture* GetTexture() const { return m_FinalTexture.get(); } /** * @return The maximum height for unit passage in water. Index: ps/trunk/source/graphics/MiniMapTexture.cpp =================================================================== --- ps/trunk/source/graphics/MiniMapTexture.cpp +++ ps/trunk/source/graphics/MiniMapTexture.cpp @@ -359,7 +359,7 @@ shader = tech->GetShader(); if (m_TerrainTexture) - shader->BindTexture(str_baseTex, m_TerrainTexture->GetHandle()); + shader->BindTexture(str_baseTex, m_TerrainTexture.get()); CMatrix3D baseTransform; baseTransform.SetIdentity(); Index: ps/trunk/source/graphics/ShaderProgram.h =================================================================== --- ps/trunk/source/graphics/ShaderProgram.h +++ ps/trunk/source/graphics/ShaderProgram.h @@ -22,6 +22,7 @@ #include "graphics/Texture.h" #include "lib/ogl.h" #include "lib/file/vfs/vfs_path.h" +#include "renderer/backend/gl/Texture.h" #include #include @@ -144,9 +145,8 @@ // Variants of texture binding: void BindTexture(texture_id_t id, const CTexturePtr& tex); void BindTexture(Binding id, const CTexturePtr& tex); - virtual void BindTexture(texture_id_t id, GLuint tex) = 0; - virtual void BindTexture(Binding id, GLuint tex) = 0; - + void BindTexture(texture_id_t id, const Renderer::Backend::GL::CTexture* tex); + void BindTexture(Binding id, const Renderer::Backend::GL::CTexture* tex); virtual Binding GetUniformBinding(uniform_id_t id) = 0; @@ -194,6 +194,9 @@ protected: CShaderProgram(int streamflags); + virtual void BindTexture(texture_id_t id, GLuint tex) = 0; + virtual void BindTexture(Binding id, GLuint tex) = 0; + bool m_IsValid; int m_StreamFlags; Index: ps/trunk/source/graphics/ShaderProgram.cpp =================================================================== --- ps/trunk/source/graphics/ShaderProgram.cpp +++ ps/trunk/source/graphics/ShaderProgram.cpp @@ -733,6 +733,16 @@ BindTexture(id, h); } +void CShaderProgram::BindTexture(texture_id_t id, const Renderer::Backend::GL::CTexture* tex) +{ + BindTexture(id, tex->GetHandle()); +} + +void CShaderProgram::BindTexture(Binding id, const Renderer::Backend::GL::CTexture* tex) +{ + BindTexture(id, tex->GetHandle()); +} + void CShaderProgram::Uniform(Binding id, int v) { Uniform(id, (float)v, (float)v, (float)v, (float)v); Index: ps/trunk/source/graphics/TerritoryTexture.h =================================================================== --- ps/trunk/source/graphics/TerritoryTexture.h +++ ps/trunk/source/graphics/TerritoryTexture.h @@ -15,7 +15,6 @@ * along with 0 A.D. If not, see . */ -#include "lib/ogl.h" #include "maths/Matrix3D.h" #include "renderer/backend/gl/Texture.h" @@ -40,7 +39,7 @@ * Also potentially switches the current active texture unit, and enables texturing on it. * The texture is in 32-bit BGRA format. */ - GLuint GetTexture(); + Renderer::Backend::GL::CTexture* GetTexture(); /** * Returns a matrix to map (x,y,z) world coordinates onto (u,v) texture @@ -75,7 +74,6 @@ std::unique_ptr m_Texture; ssize_t m_MapSize; // tiles per side - GLsizei m_TextureSize; // texels per side CMatrix3D m_TextureMatrix; CMatrix3D m_MinimapTextureMatrix; Index: ps/trunk/source/graphics/TerritoryTexture.cpp =================================================================== --- ps/trunk/source/graphics/TerritoryTexture.cpp +++ ps/trunk/source/graphics/TerritoryTexture.cpp @@ -35,7 +35,7 @@ // TODO: There's a lot of duplication with CLOSTexture - might be nice to refactor a bit CTerritoryTexture::CTerritoryTexture(CSimulation2& simulation) : - m_Simulation(simulation), m_DirtyID(0), m_MapSize(0), m_TextureSize(0) + m_Simulation(simulation), m_DirtyID(0), m_MapSize(0) { } @@ -55,12 +55,12 @@ return cmpTerritoryManager && cmpTerritoryManager->NeedUpdateTexture(&m_DirtyID); } -GLuint CTerritoryTexture::GetTexture() +Renderer::Backend::GL::CTexture* CTerritoryTexture::GetTexture() { if (UpdateDirty()) RecomputeTexture(); - return m_Texture->GetHandle(); + return m_Texture.get(); } const float* CTerritoryTexture::GetTextureMatrix() @@ -84,20 +84,20 @@ // Convert size from terrain tiles to territory tiles m_MapSize = cmpTerrain->GetMapSize() * Pathfinding::NAVCELL_SIZE_INT / ICmpTerritoryManager::NAVCELLS_PER_TERRITORY_TILE; - m_TextureSize = (GLsizei)round_up_to_pow2((size_t)m_MapSize); + const uint32_t textureSize = round_up_to_pow2(static_cast(m_MapSize)); m_Texture = Renderer::Backend::GL::CTexture::Create2D( - Renderer::Backend::Format::R8G8B8A8, m_TextureSize, m_TextureSize, + Renderer::Backend::Format::R8G8B8A8, textureSize, textureSize, Renderer::Backend::Sampler::MakeDefaultSampler( Renderer::Backend::Sampler::Filter::LINEAR, Renderer::Backend::Sampler::AddressMode::CLAMP_TO_EDGE)); // Initialise texture with transparency, for the areas we don't // overwrite with glTexSubImage2D later - u8* texData = new u8[m_TextureSize * m_TextureSize * 4]; - memset(texData, 0x00, m_TextureSize * m_TextureSize * 4); + u8* texData = new u8[textureSize * textureSize * 4]; + memset(texData, 0x00, textureSize * textureSize * 4); g_Renderer.BindTexture(0, m_Texture->GetHandle()); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_TextureSize, m_TextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, textureSize, textureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData); delete[] texData; { @@ -107,7 +107,7 @@ // world pos (mapsize*cellsize, y, mapsize*cellsize) (i.e. top-right of last tile) // onto texcoord (mapsize / texsize, mapsize / texsize) (i.e. top-right of last texel) - float s = 1.f / (float)(m_TextureSize * TERRAIN_TILE_SIZE); + float s = 1.f / static_cast(textureSize * TERRAIN_TILE_SIZE); float t = 0.f; m_TextureMatrix.SetZero(); m_TextureMatrix._11 = s; @@ -120,7 +120,7 @@ { // Minimap matrix: We want to map UV (0,0)-(1,1) onto (0,0)-(mapsize/texsize, mapsize/texsize) - float s = m_MapSize / (float)m_TextureSize; + float s = m_MapSize / static_cast(textureSize); m_MinimapTextureMatrix.SetZero(); m_MinimapTextureMatrix._11 = s; m_MinimapTextureMatrix._22 = s; Index: ps/trunk/source/renderer/PatchRData.cpp =================================================================== --- ps/trunk/source/renderer/PatchRData.cpp +++ ps/trunk/source/renderer/PatchRData.cpp @@ -973,7 +973,7 @@ Renderer::Backend::GL::CTexture* currentBlendTex = itt->m_Texture->m_TerrainAlpha->second.m_CompositeAlphaMap.get(); if (currentBlendTex != lastBlendTex) { - shader->BindTexture(str_blendTex, currentBlendTex->GetHandle()); + shader->BindTexture(str_blendTex, currentBlendTex); lastBlendTex = currentBlendTex; } Index: ps/trunk/source/renderer/PostprocManager.h =================================================================== --- ps/trunk/source/renderer/PostprocManager.h +++ ps/trunk/source/renderer/PostprocManager.h @@ -129,12 +129,12 @@ // High quality GPU image scaling to half size. outTex must have exactly half the size // of inTex. inWidth and inHeight are the dimensions of inTex in texels. - void ApplyBlurDownscale2x(GLuint inTex, GLuint outTex, int inWidth, int inHeight); + void ApplyBlurDownscale2x(Renderer::Backend::GL::CTexture* inTex, Renderer::Backend::GL::CTexture* outTex, int inWidth, int inHeight); // GPU-based Gaussian blur in two passes. inOutTex contains the input image and will be filled // with the blurred image. tempTex must have the same size as inOutTex. // inWidth and inHeight are the dimensions of the images in texels. - void ApplyBlurGauss(GLuint inOutTex, GLuint tempTex, int inWidth, int inHeight); + void ApplyBlurGauss(Renderer::Backend::GL::CTexture* inOutTex, Renderer::Backend::GL::CTexture* tempTex, int inWidth, int inHeight); // Applies a pass of a given effect to the entire current framebuffer. The shader is // provided with a number of general-purpose variables, including the rendered screen so far, Index: ps/trunk/source/renderer/PostprocManager.cpp =================================================================== --- ps/trunk/source/renderer/PostprocManager.cpp +++ ps/trunk/source/renderer/PostprocManager.cpp @@ -213,11 +213,12 @@ } -void CPostprocManager::ApplyBlurDownscale2x(GLuint inTex, GLuint outTex, int inWidth, int inHeight) +void CPostprocManager::ApplyBlurDownscale2x( + Renderer::Backend::GL::CTexture* inTex, Renderer::Backend::GL::CTexture* outTex, int inWidth, int inHeight) { // Bind inTex to framebuffer for rendering. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_BloomFbo); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, outTex, 0); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, outTex->GetHandle(), 0); // Get bloom shader with instructions to simply copy texels. CShaderDefines defines; @@ -227,23 +228,22 @@ tech->BeginPass(); CShaderProgramPtr shader = tech->GetShader(); - GLuint renderedTex = inTex; - // Cheat by creating high quality mipmaps for inTex, so the copying operation actually // produces good scaling due to hardware filtering. - glBindTexture(GL_TEXTURE_2D, renderedTex); + glBindTexture(GL_TEXTURE_2D, inTex->GetHandle()); glGenerateMipmapEXT(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); - shader->BindTexture(str_renderedTex, renderedTex); + shader->BindTexture(str_renderedTex, inTex); const SViewPort oldVp = g_Renderer.GetViewport(); const SViewPort vp = { 0, 0, inWidth / 2, inHeight / 2 }; g_Renderer.SetViewport(vp); - float quadVerts[] = { + float quadVerts[] = + { 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, @@ -252,7 +252,8 @@ 1.0f, -1.0f, 1.0f, 1.0f }; - float quadTex[] = { + float quadTex[] = + { 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, @@ -271,11 +272,12 @@ tech->EndPass(); } -void CPostprocManager::ApplyBlurGauss(GLuint inOutTex, GLuint tempTex, int inWidth, int inHeight) +void CPostprocManager::ApplyBlurGauss( + Renderer::Backend::GL::CTexture* inOutTex, Renderer::Backend::GL::CTexture* tempTex, int inWidth, int inHeight) { // Set tempTex as our rendering target. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_BloomFbo); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tempTex, 0); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tempTex->GetHandle(), 0); // Get bloom shader, for a horizontal Gaussian blur pass. CShaderDefines defines2; @@ -291,7 +293,8 @@ const SViewPort vp = { 0, 0, inWidth, inHeight }; g_Renderer.SetViewport(vp); - float quadVerts[] = { + float quadVerts[] = + { 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, @@ -300,7 +303,8 @@ 1.0f, -1.0f, 1.0f, 1.0f }; - float quadTex[] = { + float quadTex[] = + { 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, @@ -320,7 +324,7 @@ // Set result texture as our render target. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_BloomFbo); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, inOutTex, 0); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, inOutTex->GetHandle(), 0); // Get bloom shader, for a vertical Gaussian blur pass. CShaderDefines defines3; @@ -353,10 +357,10 @@ int width = m_Width, height = m_Height; #define SCALE_AND_BLUR(tex1, tex2, temptex) \ - ApplyBlurDownscale2x((tex1)->GetHandle(), (tex2)->GetHandle(), width, height); \ + ApplyBlurDownscale2x((tex1).get(), (tex2).get(), width, height); \ width /= 2; \ height /= 2; \ - ApplyBlurGauss((tex2)->GetHandle(), (temptex)->GetHandle(), width, height); + ApplyBlurGauss((tex2).get(), (temptex).get(), width, height); // We do the same thing for each scale, incrementally adding more and more blur. SCALE_AND_BLUR(m_WhichBuffer ? m_ColorTex1 : m_ColorTex2, m_BlurTex2a, m_BlurTex2b); @@ -431,15 +435,15 @@ // We also bind a bunch of other textures and parameters, but since // this only happens once per frame the overhead is negligible. if (m_WhichBuffer) - shader->BindTexture(str_renderedTex, m_ColorTex1->GetHandle()); + shader->BindTexture(str_renderedTex, m_ColorTex1.get()); else - shader->BindTexture(str_renderedTex, m_ColorTex2->GetHandle()); + shader->BindTexture(str_renderedTex, m_ColorTex2.get()); - shader->BindTexture(str_depthTex, m_DepthTex->GetHandle()); + shader->BindTexture(str_depthTex, m_DepthTex.get()); - shader->BindTexture(str_blurTex2, m_BlurTex2a->GetHandle()); - shader->BindTexture(str_blurTex4, m_BlurTex4a->GetHandle()); - shader->BindTexture(str_blurTex8, m_BlurTex8a->GetHandle()); + shader->BindTexture(str_blurTex2, m_BlurTex2a.get()); + shader->BindTexture(str_blurTex4, m_BlurTex4a.get()); + shader->BindTexture(str_blurTex8, m_BlurTex8a.get()); shader->Uniform(str_width, m_Width); shader->Uniform(str_height, m_Height); Index: ps/trunk/source/renderer/ShadowMap.cpp =================================================================== --- ps/trunk/source/renderer/ShadowMap.cpp +++ ps/trunk/source/renderer/ShadowMap.cpp @@ -693,7 +693,7 @@ if (!shader->GetTextureBinding(str_shadowTex).Active() || !m->Texture) return; - shader->BindTexture(str_shadowTex, m->Texture->GetHandle()); + shader->BindTexture(str_shadowTex, m->Texture.get()); shader->Uniform(str_shadowScale, m->Width, m->Height, 1.0f / m->Width, 1.0f / m->Height); const CVector3D cameraForward = g_Renderer.GetCullCamera().GetOrientation().GetIn(); shader->Uniform(str_cameraForward, cameraForward.X, cameraForward.Y, cameraForward.Z, @@ -795,7 +795,7 @@ CShaderProgramPtr texShader = texTech->GetShader(); texShader->Uniform(str_transform, GetDefaultGuiMatrix()); - texShader->BindTexture(str_tex, m->Texture->GetHandle()); + texShader->BindTexture(str_tex, m->Texture.get()); texShader->Uniform(str_colorAdd, CColor(0.0f, 0.0f, 0.0f, 1.0f)); texShader->Uniform(str_colorMul, CColor(1.0f, 1.0f, 1.0f, 0.0f)); texShader->Uniform(str_grayscaleFactor, 0.0f); Index: ps/trunk/source/renderer/SkyManager.h =================================================================== --- ps/trunk/source/renderer/SkyManager.h +++ ps/trunk/source/renderer/SkyManager.h @@ -48,9 +48,9 @@ return m_SkySet; } - GLuint GetSkyCube() + Renderer::Backend::GL::CTexture* GetSkyCube() { - return m_SkyCubeMap->GetHandle(); + return m_SkyCubeMap.get(); } /** Index: ps/trunk/source/renderer/SkyManager.cpp =================================================================== --- ps/trunk/source/renderer/SkyManager.cpp +++ ps/trunk/source/renderer/SkyManager.cpp @@ -232,7 +232,7 @@ g_Renderer.GetShaderManager().LoadEffect(str_sky_simple); skytech->BeginPass(); CShaderProgramPtr shader = skytech->GetShader(); - shader->BindTexture(str_baseTex, m_SkyCubeMap->GetHandle()); + shader->BindTexture(str_baseTex, m_SkyCubeMap.get()); // Translate so the sky center is at the camera space origin. CMatrix3D translate; Index: ps/trunk/source/renderer/TerrainOverlay.cpp =================================================================== --- ps/trunk/source/renderer/TerrainOverlay.cpp +++ ps/trunk/source/renderer/TerrainOverlay.cpp @@ -348,12 +348,13 @@ matrix._23 = m_TexelsPerTile / (m_Texture->GetHeight() * TERRAIN_TILE_SIZE); matrix._44 = 1; - g_Renderer.GetTerrainRenderer().RenderTerrainOverlayTexture(cullGroup, matrix, m_Texture->GetHandle()); + g_Renderer.GetTerrainRenderer().RenderTerrainOverlayTexture(cullGroup, matrix, m_Texture.get()); } SColor4ub TerrainTextureOverlay::GetColor(size_t idx, u8 alpha) const { - static u8 colors[][3] = { + static u8 colors[][3] = + { { 255, 0, 0 }, { 0, 255, 0 }, { 0, 0, 255 }, Index: ps/trunk/source/renderer/TerrainRenderer.h =================================================================== --- ps/trunk/source/renderer/TerrainRenderer.h +++ ps/trunk/source/renderer/TerrainRenderer.h @@ -25,6 +25,7 @@ #include "graphics/Color.h" #include "maths/BoundingBoxAligned.h" +#include "renderer/backend/gl/Texture.h" class CCamera; class CMatrix3D; @@ -144,7 +145,7 @@ * by the given texture matrix. * Intended for use by TerrainTextureOverlay. */ - void RenderTerrainOverlayTexture(int cullGroup, CMatrix3D& textureMatrix, GLuint texture); + void RenderTerrainOverlayTexture(int cullGroup, CMatrix3D& textureMatrix, Renderer::Backend::GL::CTexture* texture); private: TerrainRendererInternals* m; Index: ps/trunk/source/renderer/TerrainRenderer.cpp =================================================================== --- ps/trunk/source/renderer/TerrainRenderer.cpp +++ ps/trunk/source/renderer/TerrainRenderer.cpp @@ -156,7 +156,8 @@ m->phase = Phase_Submit; } -void TerrainRenderer::RenderTerrainOverlayTexture(int cullGroup, CMatrix3D& textureMatrix, GLuint texture) +void TerrainRenderer::RenderTerrainOverlayTexture(int cullGroup, CMatrix3D& textureMatrix, + Renderer::Backend::GL::CTexture* texture) { #if CONFIG2_GLES #warning TODO: implement TerrainRenderer::RenderTerrainOverlayTexture for GLES @@ -441,20 +442,20 @@ if (waterManager->m_WaterFancyEffects) { - fancyWaterShader->BindTexture(str_waterEffectsTex, waterManager->m_FancyTexture->GetHandle()); + fancyWaterShader->BindTexture(str_waterEffectsTex, waterManager->m_FancyTexture.get()); } if (waterManager->m_WaterRefraction && waterManager->m_WaterRealDepth) { - fancyWaterShader->BindTexture(str_depthTex, waterManager->m_RefrFboDepthTexture->GetHandle()); + fancyWaterShader->BindTexture(str_depthTex, waterManager->m_RefrFboDepthTexture.get()); fancyWaterShader->Uniform(str_projInvTransform, waterManager->m_RefractionProjInvMatrix); fancyWaterShader->Uniform(str_viewInvTransform, waterManager->m_RefractionViewInvMatrix); } if (waterManager->m_WaterRefraction) - fancyWaterShader->BindTexture(str_refractionMap, waterManager->m_RefractionTexture->GetHandle()); + fancyWaterShader->BindTexture(str_refractionMap, waterManager->m_RefractionTexture.get()); if (waterManager->m_WaterReflection) - fancyWaterShader->BindTexture(str_reflectionMap, waterManager->m_ReflectionTexture->GetHandle()); + fancyWaterShader->BindTexture(str_reflectionMap, waterManager->m_ReflectionTexture.get()); fancyWaterShader->BindTexture(str_losTex, losTexture.GetTextureSmooth()); const CLightEnv& lightEnv = g_Renderer.GetLightEnv();