From a901caab76ef78a3295d1894e38977539c5810cd Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Sat, 14 Sep 2019 07:29:59 -0400
Subject: [PATCH] Finalize more classes and functions for better
 devirtualization

---
 indra/llmath/lloctree.h              |  6 +--
 indra/llmath/llvolume.cpp            |  2 +-
 indra/llmath/llvolume.h              | 10 ++--
 indra/llmath/llvolumemgr.h           | 12 ++---
 indra/llmath/llvolumeoctree.h        |  8 +--
 indra/llprimitive/llmodel.h          |  6 +--
 indra/newview/lldrawable.cpp         |  2 +-
 indra/newview/lldrawable.h           |  6 +--
 indra/newview/lldrawpoolalpha.h      |  2 +-
 indra/newview/lldrawpoolavatar.h     |  2 +-
 indra/newview/lldrawpoolbump.h       |  2 +-
 indra/newview/lldrawpoolground.h     |  2 +-
 indra/newview/lldrawpoolmaterials.h  |  2 +-
 indra/newview/lldrawpoolsimple.h     | 12 ++---
 indra/newview/lldrawpoolsky.h        |  2 +-
 indra/newview/lldrawpoolterrain.h    |  2 +-
 indra/newview/lldrawpooltree.h       |  2 +-
 indra/newview/lldrawpoolwater.h      |  2 +-
 indra/newview/lldrawpoolwlsky.h      |  2 +-
 indra/newview/llflexibleobject.h     |  2 +-
 indra/newview/llspatialpartition.cpp | 36 ++++++-------
 indra/newview/llspatialpartition.h   | 78 ++++++++++++++--------------
 indra/newview/llvieweroctree.cpp     | 12 ++---
 indra/newview/llvieweroctree.h       | 12 ++---
 indra/newview/llvocache.cpp          |  4 +-
 indra/newview/llvocache.h            |  8 +--
 indra/newview/llvovolume.h           |  2 +-
 indra/newview/pipeline.cpp           |  2 +-
 28 files changed, 119 insertions(+), 121 deletions(-)

diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h
index 3426a57068..a02a9225bf 100644
--- a/indra/llmath/lloctree.h
+++ b/indra/llmath/lloctree.h
@@ -77,7 +77,7 @@ template <class T>
 class LLOctreeTravelerDepthFirst : public LLOctreeTraveler<T>
 {
 public:
-	void traverse(const LLOctreeNode<T>* node) override;
+	void traverse(const LLOctreeNode<T>* node) final override;
 	virtual ~LLOctreeTravelerDepthFirst() = default;
 };
 
@@ -477,7 +477,7 @@ public:
 		checkAlive();
 	}
 
-	bool remove(T* data) override
+	bool remove(T* data) final override
 	{
 		S32 i = data->getBinIndex();
 
@@ -706,7 +706,7 @@ protected:
 
 //just like a regular node, except it might expand on insert and compress on balance
 template <class T>
-class LLOctreeRoot : public LLOctreeNode<T>
+class LLOctreeRoot final : public LLOctreeNode<T>
 {
 public:
 	typedef LLOctreeNode<T>	BaseType;
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index b7c23873c5..3e852b9e26 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -370,7 +370,7 @@ BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, cons
 	}
 }
 
-class LLVolumeOctreeRebound : public LLOctreeTravelerDepthFirst<LLVolumeTriangle>
+class LLVolumeOctreeRebound final : public LLOctreeTravelerDepthFirst<LLVolumeTriangle>
 {
 public:
 	const LLVolumeFace* mFace;
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index c9bac6ac8c..82343d21e5 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -814,10 +814,10 @@ protected:
 	F32           mStep;
 };
 
-class LLDynamicPath : public LLPath
+class LLDynamicPath final : public LLPath
 {
 public:
-	LLDynamicPath() : LLPath() { }
+	LLDynamicPath() = default;
 	/*virtual*/ BOOL generate(const LLPathParams& params, F32 detail=1.0f, S32 split = 0,
 							  BOOL is_sculpted = FALSE, S32 sculpt_size = 0) override;
 };
@@ -1084,10 +1084,10 @@ protected:
 	BOOL generate();
 	void createVolumeFaces();
 public:
-	virtual bool unpackVolumeFaces(std::istream& is, S32 size);
+	bool unpackVolumeFaces(std::istream& is, S32 size);
 
-	virtual void setMeshAssetLoaded(BOOL loaded);
-	virtual BOOL isMeshAssetLoaded();
+	void setMeshAssetLoaded(BOOL loaded);
+	BOOL isMeshAssetLoaded();
 
  protected:
 	BOOL mUnique;
diff --git a/indra/llmath/llvolumemgr.h b/indra/llmath/llvolumemgr.h
index 5478322b40..ebb67aaa0e 100644
--- a/indra/llmath/llvolumemgr.h
+++ b/indra/llmath/llvolumemgr.h
@@ -73,20 +73,20 @@ protected:
 	S32		mAccessCount[NUM_LODS];
 };
 
-class LLVolumeMgr
+class LLVolumeMgr final
 {
 public:
 	LLVolumeMgr();
-	virtual ~LLVolumeMgr();
+	~LLVolumeMgr();
 	BOOL cleanup();			// Cleanup all volumes being managed, returns TRUE if no dangling references
 
-	virtual LLVolumeLODGroup* getGroup( const LLVolumeParams& volume_params ) const;
+	LLVolumeLODGroup* getGroup( const LLVolumeParams& volume_params ) const;
 
 	// whatever calls getVolume() never owns the LLVolume* and
 	// cannot keep references for long since it may be deleted
 	// later.  For best results hold it in an LLPointer<LLVolume>.
-	virtual LLVolume *refVolume(const LLVolumeParams &volume_params, const S32 detail);
-	virtual void unrefVolume(LLVolume *volumep);
+	LLVolume *refVolume(const LLVolumeParams &volume_params, const S32 detail);
+	void unrefVolume(LLVolume *volumep);
 
 	void dump();
 
@@ -98,7 +98,7 @@ public:
 protected:
 	void insertGroup(LLVolumeLODGroup* volgroup);
 	// Overridden in llphysics/abstract/utils/llphysicsvolumemanager.h
-	virtual LLVolumeLODGroup* createNewGroup(const LLVolumeParams& volume_params);
+	LLVolumeLODGroup* createNewGroup(const LLVolumeParams& volume_params);
 
 protected:
 	typedef std::map<const LLVolumeParams*, LLVolumeLODGroup*, LLVolumeParams::compare> volume_lod_group_map_t;
diff --git a/indra/llmath/llvolumeoctree.h b/indra/llmath/llvolumeoctree.h
index a9922b5726..46d111812d 100644
--- a/indra/llmath/llvolumeoctree.h
+++ b/indra/llmath/llvolumeoctree.h
@@ -34,7 +34,7 @@
 #include "llvolume.h"
 #include "llvector4a.h"
 
-class LLVolumeTriangle : public LLRefCount
+class LLVolumeTriangle final : public LLRefCount
 {
 public:
 	void* operator new(size_t size)
@@ -74,7 +74,7 @@ public:
 
 };
 
-class LLVolumeOctreeListener : public LLOctreeListener<LLVolumeTriangle>
+class LLVolumeOctreeListener final : public LLOctreeListener<LLVolumeTriangle>
 {
 public:
 	
@@ -130,13 +130,13 @@ public:
 								   const LLVolumeFace* face, F32* closest_t,
 								   LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent);
 
-	void traverse(const LLOctreeNode<LLVolumeTriangle>* node) override;
+	void traverse(const LLOctreeNode<LLVolumeTriangle>* node) final override;
 
 	void visit(const LLOctreeNode<LLVolumeTriangle>* node) override;
 	virtual ~LLOctreeTriangleRayIntersect() = default;
 };
 
-class LLVolumeOctreeValidate : public LLOctreeTraveler<LLVolumeTriangle>
+class LLVolumeOctreeValidate final : public LLOctreeTraveler<LLVolumeTriangle>
 {
 	void visit(const LLOctreeNode<LLVolumeTriangle>* branch) override;
     
diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h
index d8f9fc0a52..787d0a7faf 100644
--- a/indra/llprimitive/llmodel.h
+++ b/indra/llprimitive/llmodel.h
@@ -60,7 +60,7 @@ public:
     bool mJointNumsInitialized;
 };
 
-class LLModel : public LLVolume
+class LLModel final : public LLVolume
 {
 public:
 
@@ -304,7 +304,7 @@ public:
 	}
 };
 
-class LLImportMaterial : public LLModelMaterialBase
+class LLImportMaterial final : public LLModelMaterialBase
 {
 public:
     friend class LLMeshUploadThread;
@@ -359,7 +359,7 @@ public:
 
 typedef std::vector<LLModelInstanceBase> model_instance_list;
 
-class LLModelInstance : public LLModelInstanceBase
+class LLModelInstance final : public LLModelInstanceBase
 {
 public:
 	std::string mLabel;
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index da608901ab..95eb7b39a3 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -1406,7 +1406,7 @@ void LLDrawable::setVisible(LLCamera& camera, std::vector<LLDrawable*>* results,
 #endif
 }
 
-class LLOctreeMarkNotCulled: public OctreeTraveler
+class LLOctreeMarkNotCulled final : public OctreeTraveler
 {
 public:
 	LLCamera* mCamera;
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index 865d12adb2..779ebb4bb8 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -160,12 +160,12 @@ public:
 	BOOL getLit() const							{ return isState(UNLIT) ? FALSE : TRUE; }
 	void setLit(BOOL lit)						{ lit ? clearState(UNLIT) : setState(UNLIT); }
 
-	bool isVisible() const override;
-	bool isRecentlyVisible() const override;
+	bool isVisible() const final override;
+	bool isRecentlyVisible() const final override;
 
 	virtual void cleanupReferences();
 
-	void setGroup(LLViewerOctreeGroup* group) override;
+	void setGroup(LLViewerOctreeGroup* group) final override;
 	void setRadius(const F32 radius);
 	F32 getRadius() const						{ return mRadius; }
 	F32 getVisibilityRadius() const;
diff --git a/indra/newview/lldrawpoolalpha.h b/indra/newview/lldrawpoolalpha.h
index 407d571bf3..f2173125f0 100644
--- a/indra/newview/lldrawpoolalpha.h
+++ b/indra/newview/lldrawpoolalpha.h
@@ -35,7 +35,7 @@ class LLFace;
 class LLColor4;
 class LLGLSLShader;
 
-class LLDrawPoolAlpha : public LLRenderPass
+class LLDrawPoolAlpha final : public LLRenderPass
 {
 public:
 	enum
diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h
index 6e1f22dfe5..415df94538 100644
--- a/indra/newview/lldrawpoolavatar.h
+++ b/indra/newview/lldrawpoolavatar.h
@@ -36,7 +36,7 @@ class LLMeshSkinInfo;
 class LLVolume;
 class LLVolumeFace;
 
-class LLDrawPoolAvatar : public LLFacePool
+class LLDrawPoolAvatar final : public LLFacePool
 {
 public:
 	enum
diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h
index bf313d1482..2fc508cd31 100644
--- a/indra/newview/lldrawpoolbump.h
+++ b/indra/newview/lldrawpoolbump.h
@@ -38,7 +38,7 @@ class LLDrawInfo;
 class LLGLSLShader;
 class LLViewerFetchedTexture;
 
-class LLDrawPoolBump : public LLRenderPass
+class LLDrawPoolBump final : public LLRenderPass
 {
 protected :
 	LLDrawPoolBump(const U32 type):LLRenderPass(type) { mShiny = FALSE; }
diff --git a/indra/newview/lldrawpoolground.h b/indra/newview/lldrawpoolground.h
index 9330cca5d0..dd7396aa0b 100644
--- a/indra/newview/lldrawpoolground.h
+++ b/indra/newview/lldrawpoolground.h
@@ -30,7 +30,7 @@
 #include "lldrawpool.h"
 
 
-class LLDrawPoolGround : public LLFacePool
+class LLDrawPoolGround final : public LLFacePool
 {
 public:
 	enum
diff --git a/indra/newview/lldrawpoolmaterials.h b/indra/newview/lldrawpoolmaterials.h
index 2b46d65ada..70da765452 100644
--- a/indra/newview/lldrawpoolmaterials.h
+++ b/indra/newview/lldrawpoolmaterials.h
@@ -38,7 +38,7 @@ class LLViewerTexture;
 class LLDrawInfo;
 class LLGLSLShader;
 
-class LLDrawPoolMaterials : public LLRenderPass
+class LLDrawPoolMaterials final : public LLRenderPass
 {
 	LLGLSLShader *mShader;
 public:
diff --git a/indra/newview/lldrawpoolsimple.h b/indra/newview/lldrawpoolsimple.h
index 4392954673..d0986b298d 100644
--- a/indra/newview/lldrawpoolsimple.h
+++ b/indra/newview/lldrawpoolsimple.h
@@ -29,7 +29,7 @@
 
 #include "lldrawpool.h"
 
-class LLDrawPoolSimple : public LLRenderPass
+class LLDrawPoolSimple final : public LLRenderPass
 {
 public:
 	enum
@@ -58,7 +58,7 @@ public:
 
 };
 
-class LLDrawPoolGrass : public LLRenderPass
+class LLDrawPoolGrass final : public LLRenderPass
 {
 public:
 	enum
@@ -86,7 +86,7 @@ public:
 	/*virtual*/ void prerender() final override;
 };
 
-class LLDrawPoolAlphaMask : public LLRenderPass
+class LLDrawPoolAlphaMask final : public LLRenderPass
 {
 public:
 	enum
@@ -114,7 +114,7 @@ public:
 
 };
 
-class LLDrawPoolFullbrightAlphaMask : public LLRenderPass
+class LLDrawPoolFullbrightAlphaMask final : public LLRenderPass
 {
 public:
 	enum
@@ -141,7 +141,7 @@ public:
 };
 
 
-class LLDrawPoolFullbright : public LLRenderPass
+class LLDrawPoolFullbright final : public LLRenderPass
 {
 public:
 	enum
@@ -168,7 +168,7 @@ public:
 
 };
 
-class LLDrawPoolGlow : public LLRenderPass
+class LLDrawPoolGlow final : public LLRenderPass
 {
 public:
 	LLDrawPoolGlow(): LLRenderPass(LLDrawPool::POOL_GLOW) { }
diff --git a/indra/newview/lldrawpoolsky.h b/indra/newview/lldrawpoolsky.h
index ed1f7ff87a..6f0eb95d47 100644
--- a/indra/newview/lldrawpoolsky.h
+++ b/indra/newview/lldrawpoolsky.h
@@ -32,7 +32,7 @@
 class LLSkyTex;
 class LLGLSLShader;
 
-class LLDrawPoolSky : public LLFacePool
+class LLDrawPoolSky final : public LLFacePool
 {
 private:
 	LLSkyTex			*mSkyTex;
diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h
index ccd32cd883..c6549bd7ae 100644
--- a/indra/newview/lldrawpoolterrain.h
+++ b/indra/newview/lldrawpoolterrain.h
@@ -29,7 +29,7 @@
 
 #include "lldrawpool.h"
 
-class LLDrawPoolTerrain : public LLFacePool
+class LLDrawPoolTerrain final : public LLFacePool
 {
 	LLPointer<LLViewerTexture> mTexturep;
 public:
diff --git a/indra/newview/lldrawpooltree.h b/indra/newview/lldrawpooltree.h
index 62742a3c57..363435278b 100644
--- a/indra/newview/lldrawpooltree.h
+++ b/indra/newview/lldrawpooltree.h
@@ -29,7 +29,7 @@
 
 #include "lldrawpool.h"
 
-class LLDrawPoolTree : public LLFacePool
+class LLDrawPoolTree final : public LLFacePool
 {
 	LLPointer<LLViewerTexture> mTexturep;
 public:
diff --git a/indra/newview/lldrawpoolwater.h b/indra/newview/lldrawpoolwater.h
index da03c0d960..960183852e 100644
--- a/indra/newview/lldrawpoolwater.h
+++ b/indra/newview/lldrawpoolwater.h
@@ -34,7 +34,7 @@ class LLFace;
 class LLHeavenBody;
 class LLWaterSurface;
 
-class LLDrawPoolWater: public LLFacePool
+class LLDrawPoolWater final : public LLFacePool
 {
 protected:
 	LLPointer<LLViewerTexture> mHBTex[2];
diff --git a/indra/newview/lldrawpoolwlsky.h b/indra/newview/lldrawpoolwlsky.h
index 19d252f5a7..c4eef9cbff 100644
--- a/indra/newview/lldrawpoolwlsky.h
+++ b/indra/newview/lldrawpoolwlsky.h
@@ -31,7 +31,7 @@
 
 class LLGLSLShader;
 
-class LLDrawPoolWLSky : public LLDrawPool {
+class LLDrawPoolWLSky final : public LLDrawPool {
 public:
 
 	static const U32 SKY_VERTEX_DATA_MASK =	LLVertexBuffer::MAP_VERTEX |
diff --git a/indra/newview/llflexibleobject.h b/indra/newview/llflexibleobject.h
index 52f8bea2ad..ea93114fcd 100644
--- a/indra/newview/llflexibleobject.h
+++ b/indra/newview/llflexibleobject.h
@@ -68,7 +68,7 @@ struct LLFlexibleObjectSection
 //---------------------------------------------------------
 // The LLVolumeImplFlexible class 
 //---------------------------------------------------------
-class LLVolumeImplFlexible : public LLVolumeInterface
+class LLVolumeImplFlexible final : public LLVolumeInterface
 {
 private:
 	static std::vector<LLVolumeImplFlexible*> sInstanceList;
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index e576d433ea..51c3ade526 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -447,10 +447,10 @@ class LLSpatialSetState : public OctreeTraveler
 public:
 	U32 mState;
 	LLSpatialSetState(U32 state) : mState(state) { }
-    void visit(const OctreeNode* branch) override { ((LLSpatialGroup*) branch->getListener(0))->setState(mState); }	
+    void visit(const OctreeNode* branch) final override { ((LLSpatialGroup*) branch->getListener(0))->setState(mState); }	
 };
 
-class LLSpatialSetStateDiff : public LLSpatialSetState
+class LLSpatialSetStateDiff final : public LLSpatialSetState
 {
 public:
 	LLSpatialSetStateDiff(U32 state) : LLSpatialSetState(state) { }
@@ -494,10 +494,10 @@ class LLSpatialClearState : public OctreeTraveler
 public:
 	U32 mState;
 	LLSpatialClearState(U32 state) : mState(state) { }
-    void visit(const OctreeNode* branch) override { ((LLSpatialGroup*) branch->getListener(0))->clearState(mState); }
+    void visit(const OctreeNode* branch) final override { ((LLSpatialGroup*) branch->getListener(0))->clearState(mState); }
 };
 
-class LLSpatialClearStateDiff : public LLSpatialClearState
+class LLSpatialClearStateDiff final : public LLSpatialClearState
 {
 public:
 	LLSpatialClearStateDiff(U32 state) : LLSpatialClearState(state) { }
@@ -939,7 +939,7 @@ void LLSpatialPartition::move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL
 	put(drawablep, was_visible);
 }
 
-class LLSpatialShift : public OctreeTraveler
+class LLSpatialShift final : public OctreeTraveler
 {
 public:
 	const LLVector4a& mOffset;
@@ -1011,7 +1011,7 @@ public:
 	}
 };
 
-class LLOctreeCullNoFarClip : public LLOctreeCull
+class LLOctreeCullNoFarClip final : public LLOctreeCull
 {
 public: 
 	LLOctreeCullNoFarClip(LLCamera* camera) 
@@ -1035,18 +1035,18 @@ public:
 	LLOctreeCullShadow(LLCamera* camera)
 		: LLOctreeCull(camera) { }
 
-    S32 frustumCheck(const LLViewerOctreeGroup* group) override
+    S32 frustumCheck(const LLViewerOctreeGroup* group) final override
 	{
 		return AABBInFrustumGroupBounds(group);
 	}
 
-    S32 frustumCheckObjects(const LLViewerOctreeGroup* group) override
+    S32 frustumCheckObjects(const LLViewerOctreeGroup* group) final override
 	{
 		return AABBInFrustumObjectBounds(group);
 	}
 };
 
-class LLOctreeCullVisExtents: public LLOctreeCullShadow
+class LLOctreeCullVisExtents final: public LLOctreeCullShadow
 {
 public:
 	LLOctreeCullVisExtents(LLCamera* camera, LLVector4a& min, LLVector4a& max)
@@ -1123,7 +1123,7 @@ public:
 	LLVector4a& mMax;
 };
 
-class LLOctreeCullDetectVisible: public LLOctreeCullShadow
+class LLOctreeCullDetectVisible final: public LLOctreeCullShadow
 {
 public:
 	LLOctreeCullDetectVisible(LLCamera* camera)
@@ -1155,7 +1155,7 @@ public:
 	BOOL mResult;
 };
 
-class LLOctreeSelect : public LLOctreeCull
+class LLOctreeSelect final : public LLOctreeCull
 {
 public:
 	LLOctreeSelect(LLCamera* camera, std::vector<LLDrawable*>* results)
@@ -1300,7 +1300,7 @@ void drawBoxOutline(const LLVector4a& pos, const LLVector4a& size)
 	drawBoxOutline(reinterpret_cast<const LLVector3&>(pos), reinterpret_cast<const LLVector3&>(size));
 }
 
-class LLOctreeDirty : public OctreeTraveler
+class LLOctreeDirty final : public OctreeTraveler
 {
 public:
 	LLOctreeDirty(bool no_rebuild) : mNoRebuild(no_rebuild){}
@@ -2909,7 +2909,7 @@ void renderLights(LLDrawable* drawablep)
 	}
 }
 
-class LLRenderOctreeRaycast : public LLOctreeTriangleRayIntersect
+class LLRenderOctreeRaycast final : public LLOctreeTriangleRayIntersect
 {
 public:
 	
@@ -3146,7 +3146,7 @@ void renderAgentTarget(LLVOAvatar* avatar)
 	}
 }
 
-class LLOctreeRenderNonOccluded : public OctreeTraveler
+class LLOctreeRenderNonOccluded final : public OctreeTraveler
 {
 public:
 	LLCamera* mCamera;
@@ -3354,7 +3354,7 @@ public:
 	}
 };
 
-class LLOctreeRenderXRay : public OctreeTraveler
+class LLOctreeRenderXRay final : public OctreeTraveler
 {
 public:
 	LLCamera* mCamera;
@@ -3398,7 +3398,7 @@ public:
 
 };
 
-class LLOctreeRenderPhysicsShapes : public OctreeTraveler
+class LLOctreeRenderPhysicsShapes final : public OctreeTraveler
 {
 public:
 	LLCamera* mCamera;
@@ -3433,7 +3433,7 @@ public:
 	}
 };
 
-class LLOctreePushBBoxVerts : public OctreeTraveler
+class LLOctreePushBBoxVerts final : public OctreeTraveler
 {
 public:
 	LLCamera* mCamera;
@@ -3483,7 +3483,7 @@ void LLSpatialPartition::renderIntersectingBBoxes(LLCamera* camera)
 	pusher.traverse(mOctree);
 }
 
-class LLOctreeStateCheck : public OctreeTraveler
+class LLOctreeStateCheck final : public OctreeTraveler
 {
 public:
 	U32 mInheritedMask[LLViewerCamera::NUM_CAMERAS];
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index fe675a64c4..1e52977e26 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -55,7 +55,7 @@ class LLViewerRegion;
 
 void pushVerts(LLFace* face, U32 mask);
 
-class LLDrawInfo : public LLRefCount, public LLTrace::MemTrackableNonVirtual<LLDrawInfo, 16>
+class LLDrawInfo final : public LLRefCount, public LLTrace::MemTrackableNonVirtual<LLDrawInfo, 16>
 {
 protected:
 	~LLDrawInfo();	
@@ -182,7 +182,7 @@ public:
 };
 
 LL_ALIGN_PREFIX(64)
-class LLSpatialGroup : public LLOcclusionCullingGroup
+class LLSpatialGroup final : public LLOcclusionCullingGroup
 {
 	friend class LLSpatialPartition;
 	friend class LLOctreeStateCheck;
@@ -296,10 +296,10 @@ public:
 	LLSpatialPartition* getSpatialPartition() {return (LLSpatialPartition*)mSpatialPartition;}
 
 	 //LISTENER FUNCTIONS
-	void handleInsertion(const TreeNode* node, LLViewerOctreeEntry* face) override;
-	void handleRemoval(const TreeNode* node, LLViewerOctreeEntry* face) override;
-	void handleDestruction(const TreeNode* node) override;
-	void handleChildAddition(const OctreeNode* parent, OctreeNode* child) override;
+	void handleInsertion(const TreeNode* node, LLViewerOctreeEntry* face) final override;
+	void handleRemoval(const TreeNode* node, LLViewerOctreeEntry* face) final override;
+	void handleDestruction(const TreeNode* node) final override;
+	void handleChildAddition(const OctreeNode* parent, OctreeNode* child) final override;
 
 public:
 	LL_ALIGN_16(LLVector4a mViewAngle);
@@ -339,7 +339,7 @@ class LLGeometryManager
 {
 public:
 	std::vector<LLFace*> mFaceList;
-	virtual ~LLGeometryManager() { }
+	virtual ~LLGeometryManager() = default;
 	virtual void rebuildGeom(LLSpatialGroup* group) = 0;
 	virtual void rebuildMesh(LLSpatialGroup* group) = 0;
 	virtual void getGeometry(LLSpatialGroup* group) = 0;
@@ -379,7 +379,7 @@ public:
 	void rebuildMesh(LLSpatialGroup* group) override;
 
 	BOOL visibleObjectsInFrustum(LLCamera& camera);
-	/*virtual*/ S32 cull(LLCamera &camera, bool do_occlusion=false) override; // Cull on arbitrary frustum
+	/*virtual*/ S32 cull(LLCamera &camera, bool do_occlusion=false) final override; // Cull on arbitrary frustum
 	S32 cull(LLCamera &camera, std::vector<LLDrawable *>* results, BOOL for_select); // Cull on arbitrary frustum
 	
 	BOOL isVisible(const LLVector3& v);
@@ -424,17 +424,17 @@ public:
 	
 	void destroyTree();
 
-	BOOL isSpatialBridge() const override { return TRUE; }
-	void updateSpatialExtents() override;
-	void updateBinRadius() override;
-	void setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results = nullptr, BOOL for_select = FALSE) override;
-	void updateDistance(LLCamera& camera_in, bool force_update) override;
-	void makeActive() override;
-	void move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate = FALSE) override;
-	BOOL updateMove() override;
+	BOOL isSpatialBridge() const final override { return TRUE; }
+	void updateSpatialExtents() final override;
+	void updateBinRadius() final override;
+	void setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results = nullptr, BOOL for_select = FALSE) final override;
+	void updateDistance(LLCamera& camera_in, bool force_update) final override;
+	void makeActive() final override;
+	void move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate = FALSE) final override;
+	BOOL updateMove() final override;
 	void shiftPos(const LLVector4a& vec) override;
-	void cleanupReferences() override;
-	LLSpatialPartition* asPartition() override { return this; }
+	void cleanupReferences() final override;
+	LLSpatialPartition* asPartition() final override { return this; }
 		
 	virtual LLCamera transformCamera(LLCamera& camera);
 	
@@ -541,19 +541,19 @@ class LLWaterPartition : public LLSpatialPartition
 {
 public:
 	LLWaterPartition(LLViewerRegion* regionp);
-	void getGeometry(LLSpatialGroup* group) override {  }
-	void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) override { }
+	void getGeometry(LLSpatialGroup* group) final override {  }
+	void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) final override { }
 };
 
 //spatial partition for hole and edge water (implemented in LLVOWater.cpp)
-class LLVoidWaterPartition : public LLWaterPartition
+class LLVoidWaterPartition final : public LLWaterPartition
 {
 public:
 	LLVoidWaterPartition(LLViewerRegion* regionp);
 };
 
 //spatial partition for terrain (impelmented in LLVOSurfacePatch.cpp)
-class LLTerrainPartition : public LLSpatialPartition
+class LLTerrainPartition final : public LLSpatialPartition
 {
 public:
 	LLTerrainPartition(LLViewerRegion* regionp);
@@ -562,7 +562,7 @@ public:
 };
 
 //spatial partition for trees
-class LLTreePartition : public LLSpatialPartition
+class LLTreePartition final : public LLSpatialPartition
 {
 public:
 	LLTreePartition(LLViewerRegion* regionp);
@@ -576,22 +576,22 @@ class LLParticlePartition : public LLSpatialPartition
 {
 public:
 	LLParticlePartition(LLViewerRegion* regionp);
-	void rebuildGeom(LLSpatialGroup* group) override;
-	void getGeometry(LLSpatialGroup* group) override;
-	void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) override;
-	F32 calcPixelArea(LLSpatialGroup* group, LLCamera& camera) override;
+	void rebuildGeom(LLSpatialGroup* group) final override;
+	void getGeometry(LLSpatialGroup* group) final override;
+	void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) final override;
+	F32 calcPixelArea(LLSpatialGroup* group, LLCamera& camera) final override;
 protected:
 	U32 mRenderPass;
 };
 
-class LLHUDParticlePartition : public LLParticlePartition
+class LLHUDParticlePartition final : public LLParticlePartition
 {
 public:
 	LLHUDParticlePartition(LLViewerRegion* regionp);
 };
 
 //spatial partition for grass (implemented in LLVOGrass.cpp)
-class LLGrassPartition : public LLSpatialPartition
+class LLGrassPartition final : public LLSpatialPartition
 {
 public:
 	LLGrassPartition(LLViewerRegion* regionp);
@@ -635,7 +635,7 @@ private:
 };
 
 //spatial partition that uses volume geometry manager (implemented in LLVOVolume.cpp)
-class LLVolumePartition : public LLSpatialPartition, public LLVolumeGeometryManager
+class LLVolumePartition final : public LLSpatialPartition, public LLVolumeGeometryManager
 {
 public:
 	LLVolumePartition(LLViewerRegion* regionp);
@@ -650,18 +650,18 @@ class LLVolumeBridge : public LLSpatialBridge, public LLVolumeGeometryManager
 {
 public:
 	LLVolumeBridge(LLDrawable* drawable, LLViewerRegion* regionp);
-	void rebuildGeom(LLSpatialGroup* group) override { LLVolumeGeometryManager::rebuildGeom(group); }
-	void getGeometry(LLSpatialGroup* group) override { LLVolumeGeometryManager::getGeometry(group); }
-	void rebuildMesh(LLSpatialGroup* group) override { LLVolumeGeometryManager::rebuildMesh(group); }
-	void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) override { LLVolumeGeometryManager::addGeometryCount(group, vertex_count, index_count); }
+	void rebuildGeom(LLSpatialGroup* group) final override { LLVolumeGeometryManager::rebuildGeom(group); }
+	void getGeometry(LLSpatialGroup* group) final override { LLVolumeGeometryManager::getGeometry(group); }
+	void rebuildMesh(LLSpatialGroup* group) final override { LLVolumeGeometryManager::rebuildMesh(group); }
+	void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) final override { LLVolumeGeometryManager::addGeometryCount(group, vertex_count, index_count); }
 };
 
 class LLHUDBridge : public LLVolumeBridge
 {
 public:
 	LLHUDBridge(LLDrawable* drawablep, LLViewerRegion* regionp);
-	void shiftPos(const LLVector4a& vec) override;
-	F32 calcPixelArea(LLSpatialGroup* group, LLCamera& camera) override;
+	void shiftPos(const LLVector4a& vec) final override;
+	F32 calcPixelArea(LLSpatialGroup* group, LLCamera& camera) final override;
 };
 
 //spatial partition that holds nothing but spatial bridges
@@ -669,11 +669,11 @@ class LLBridgePartition : public LLSpatialPartition
 {
 public:
 	LLBridgePartition(LLViewerRegion* regionp);
-	void getGeometry(LLSpatialGroup* group) override { }
-	void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) override {  }
+	void getGeometry(LLSpatialGroup* group) final override { }
+	void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) final override {  }
 };
 
-class LLHUDPartition : public LLBridgePartition
+class LLHUDPartition final : public LLBridgePartition
 {
 public:
 	LLHUDPartition(LLViewerRegion* regionp);
diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp
index 82b2ef44c1..0fa4a197b0 100644
--- a/indra/newview/llvieweroctree.cpp
+++ b/indra/newview/llvieweroctree.cpp
@@ -33,8 +33,6 @@
 #include "llglslshader.h"
 #include "llviewershadermgr.h"
 
-#include <glm/gtc/type_ptr.hpp>
-
 //-----------------------------------------------------------------------------------
 //static variables definitions
 //-----------------------------------------------------------------------------------
@@ -819,7 +817,7 @@ U32 LLOcclusionCullingGroup::getNewOcclusionQueryObjectName()
 	return sQueryPool.genQuery();
 }
 
-void LLOcclusionCullingGroup::releaseOcclusionQueryObjectName(GLuint name)
+void LLOcclusionCullingGroup::releaseOcclusionQueryObjectName(S32 name)
 {
 	sQueryPool.deleteQuery(name);
 }
@@ -833,7 +831,7 @@ public:
 	U32 mState;
 	LLSpatialSetOcclusionState(U32 state) : mState(state) { }
 
-    void visit(const OctreeNode* branch) override
+    void visit(const OctreeNode* branch) final override
 	{ 
 		LLOcclusionCullingGroup* group = (LLOcclusionCullingGroup*)branch->getListener(0);
 		if(group)
@@ -843,7 +841,7 @@ public:
 	}
 };
 
-class LLSpatialSetOcclusionStateDiff : public LLSpatialSetOcclusionState
+class LLSpatialSetOcclusionStateDiff final : public LLSpatialSetOcclusionState
 {
 public:
 	LLSpatialSetOcclusionStateDiff(U32 state) : LLSpatialSetOcclusionState(state) { }
@@ -983,7 +981,7 @@ public:
 	
 	LLSpatialClearOcclusionState(U32 state) : mState(state) { }
 
-    void visit(const OctreeNode* branch) override
+    void visit(const OctreeNode* branch) final override
 	{ 
 		LLOcclusionCullingGroup* group = (LLOcclusionCullingGroup*)branch->getListener(0);
 		if(group)
@@ -993,7 +991,7 @@ public:
 	}
 };
 
-class LLSpatialClearOcclusionStateDiff : public LLSpatialClearOcclusionState
+class LLSpatialClearOcclusionStateDiff final : public LLSpatialClearOcclusionState
 {
 public:
 	LLSpatialClearOcclusionStateDiff(U32 state) : LLSpatialClearOcclusionState(state) { }
diff --git a/indra/newview/llvieweroctree.h b/indra/newview/llvieweroctree.h
index a9cc117458..10855ea20c 100644
--- a/indra/newview/llvieweroctree.h
+++ b/indra/newview/llvieweroctree.h
@@ -228,9 +228,9 @@ public:
 	void handleInsertion(const TreeNode* node, LLViewerOctreeEntry* obj) override;
 	void handleRemoval(const TreeNode* node, LLViewerOctreeEntry* obj) override;
 	void handleDestruction(const TreeNode* node) override;
-	void handleStateChange(const TreeNode* node) override;
+	void handleStateChange(const TreeNode* node) final override;
 	void handleChildAddition(const OctreeNode* parent, OctreeNode* child) override;
-	void handleChildRemoval(const OctreeNode* parent, const OctreeNode* child) override;
+	void handleChildRemoval(const OctreeNode* parent, const OctreeNode* child) final override;
 
 	OctreeNode*          getOctreeNode() {return mOctreeNode;}
 	LLViewerOctreeGroup* getParent();
@@ -312,12 +312,12 @@ public:
 	void handleChildAddition(const OctreeNode* parent, OctreeNode* child) override;
 
 	//virtual
-	BOOL isRecentlyVisible() const override;
+	BOOL isRecentlyVisible() const final override;
 	LLViewerOctreePartition* getSpatialPartition()const {return mSpatialPartition;}
 	BOOL isAnyRecentlyVisible() const;
 
 	static U32 getNewOcclusionQueryObjectName();
-	static void releaseOcclusionQueryObjectName(U32 name);
+	static void releaseOcclusionQueryObjectName(S32 name);
 
 protected:
 	void releaseOcclusionQueryObjectNames();
@@ -396,7 +396,7 @@ protected:
 	virtual bool checkObjects(const OctreeNode* branch, const LLViewerOctreeGroup* group);
 	virtual void preprocess(LLViewerOctreeGroup* group);
 	virtual void processGroup(LLViewerOctreeGroup* group);
-	void visit(const OctreeNode* branch) override;
+	void visit(const OctreeNode* branch) final override;
 	
 protected:
 	LLCamera *mCamera;
@@ -404,7 +404,7 @@ protected:
 };
 
 //scan the octree, output the info of each node for debug use.
-class LLViewerOctreeDebug : public OctreeTraveler
+class LLViewerOctreeDebug final : public OctreeTraveler
 {
 public:
 	virtual void processGroup(LLViewerOctreeGroup* group);
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index 599db41a7a..ae0e9a0eba 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -708,7 +708,7 @@ void LLVOCachePartition::removeEntry(LLViewerOctreeEntry* entry)
 	llassert(!entry->getGroup());
 }
 	
-class LLVOCacheOctreeCull : public LLViewerOctreeCull
+class LLVOCacheOctreeCull final : public LLViewerOctreeCull
 {
 public:
 	LLVOCacheOctreeCull(LLCamera* camera, LLViewerRegion* regionp, 
@@ -829,7 +829,7 @@ private:
 };
 
 //select objects behind camera
-class LLVOCacheOctreeBackCull : public LLViewerOctreeCull
+class LLVOCacheOctreeBackCull final : public LLViewerOctreeCull
 {
 public:
 	LLVOCacheOctreeBackCull(LLCamera* camera, const LLVector3& shift, LLViewerRegion* regionp, F32 pixel_threshold, bool use_occlusion) 
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index feeb563b09..fc92005818 100644
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -37,7 +37,7 @@
 // Cache entries
 class LLCamera;
 
-class LLVOCacheEntry 
+class LLVOCacheEntry final 
 :	public LLViewerOctreeEntryData,
 	public LLTrace::MemTrackable<LLVOCacheEntry, 16>
 {
@@ -173,7 +173,7 @@ public:
 	static F32					sRearPixelThreshold;
 };
 
-class LLVOCacheGroup : public LLOcclusionCullingGroup
+class LLVOCacheGroup final : public LLOcclusionCullingGroup
 {
 public:
 	LLVOCacheGroup(OctreeNode* node, LLViewerOctreePartition* part) : LLOcclusionCullingGroup(node, part){}	
@@ -185,7 +185,7 @@ protected:
 	virtual ~LLVOCacheGroup();
 };
 
-class LLVOCachePartition : public LLViewerOctreePartition, public LLTrace::MemTrackable<LLVOCachePartition>
+class LLVOCachePartition final : public LLViewerOctreePartition, public LLTrace::MemTrackable<LLVOCachePartition>
 {
 public:
 	LLVOCachePartition(LLViewerRegion* regionp);
@@ -221,7 +221,7 @@ private:
 //
 //Note: LLVOCache is not thread-safe
 //
-class LLVOCache : public LLSingleton<LLVOCache>
+class LLVOCache final : public LLSingleton<LLVOCache>
 {
 	LLSINGLETON(LLVOCache);
 	~LLVOCache() ;
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 55ec6f4324..9b40e09bc8 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -74,7 +74,7 @@ public:
 class LLVolumeInterface
 {
 public:
-	virtual ~LLVolumeInterface() { }
+	virtual ~LLVolumeInterface() = default;
 	virtual LLVolumeInterfaceType getInterfaceType() const = 0;
 	virtual void doIdleUpdate() = 0;
 	virtual BOOL doUpdateGeometry(LLDrawable *drawable) = 0;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index bfd17308e7..544f7ad597 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1459,7 +1459,7 @@ S32 LLPipeline::setLightingDetail(S32 level)
 	return mLightingDetail;
 }
 
-class LLOctreeDirtyTexture : public OctreeTraveler
+class LLOctreeDirtyTexture final : public OctreeTraveler
 {
 public:
 	const std::set<LLViewerFetchedTexture*>& mTextures;
-- 
GitLab