Index: trunk/VUT/work/TestCullingTerrain/TerrainFrameListener.cpp
===================================================================
--- trunk/VUT/work/TestCullingTerrain/TerrainFrameListener.cpp	(revision 147)
+++ trunk/VUT/work/TestCullingTerrain/TerrainFrameListener.cpp	(revision 151)
@@ -9,5 +9,5 @@
 #include "OgreVisibilityTerrainSceneManager.h"
 #include "VisibilityInfo.h"
-
+#include "OgreItemBufferQueryManager.h";
 // output file for frame info
 const char* frames_out_filename = "frame.out";
@@ -82,5 +82,7 @@
 mSunLight(sunLight),
 mShiftPressed(false),
-mShowQueryStats(false)
+mShowQueryStats(false),
+mQueryManager(NULL),
+mVisibilityManager(NULL)
 {
 	//mInputDevice = PlatformManager::getSingleton().createInputReader();
@@ -164,11 +166,4 @@
 	mSceneMgr->setOption("PrepareVisualization", &mShowVisualization);
 
-	// TODO: change this (does not work with other scene manager plugins)
-	mVisibilityManager = dynamic_cast<VisibilityTerrainSceneManager *>(mSceneMgr)->
-		GetVisibilityManager();
-
-	dynamic_cast<PlatformQueryManager *>(mVisibilityManager->GetQueryManager())->
-		SetViewport(mWindow->getViewport(0));
-
 	// reset statistics
 	resetStats();
@@ -179,4 +174,10 @@
 	delete mRayQueryExecutor;
 	delete mEventProcessor;
+
+	if (mQueryManager)
+	{
+		delete mQueryManager;
+		mQueryManager = NULL;
+	}
 }
 //-----------------------------------------------------------------------
@@ -361,4 +362,12 @@
 void TerrainFrameListener::ApplyVisibilityQuery(bool fromPoint, bool relativeVisibility)
 {
+	// TODO: change this (does not work with other scene manager plugins)
+	VisibilityTerrainSceneManager *sm = dynamic_cast<VisibilityTerrainSceneManager *>(mSceneMgr);
+
+	//mQueryManager = new ItemBufferQueryManager(sm->GetHierarchyInterface(), mWindow->getViewport(0));
+	mQueryManager = new PlatformQueryManager(sm->GetHierarchyInterface(), mWindow->getViewport(0));
+
+	sm->GetVisibilityManager()->SetQueryManager(mQueryManager);
+
 	InfoContainer<GtpVisibility::NodeInfo> visibleNodes;
 	InfoContainer<GtpVisibility::MeshInfo> visibleGeometry;
@@ -366,5 +375,5 @@
 	if (fromPoint)
 	{
-		mVisibilityManager->GetQueryManager()->
+		mQueryManager->
 			ComputeFromPointVisibility(mCamNode->getPosition(), &visibleNodes, 
 									   &visibleGeometry, relativeVisibility);
@@ -372,5 +381,5 @@
 	else
 	{
-		mVisibilityManager->GetQueryManager()->ComputeCameraVisibility(*mCamera,
+		mQueryManager->ComputeCameraVisibility(*mCamera,
 			    &visibleNodes, &visibleGeometry, relativeVisibility);
 	}
@@ -378,4 +387,6 @@
 	float averageNodeVis = 0;
 	float averageGeometryVis = 0;
+	int geomSize = 0;
+	int nodesSize = 0;
 
 	InfoContainer<GtpVisibility::MeshInfo>::iterator geomIt, geomIt_end = visibleGeometry.end();
@@ -383,30 +394,40 @@
 	for (geomIt = visibleGeometry.begin(); geomIt != geomIt_end; ++geomIt)
 	{
-		float vis = relativeVisibility ? 
-			(*geomIt).ComputeRelativeVisibility() : (float)(*geomIt).GetVisiblePixels();
+		// add if not 0
+		if ((*geomIt).GetVisiblePixels())
+		{
+			float vis = relativeVisibility ? 
+				(*geomIt).ComputeRelativeVisibility() : (float)(*geomIt).GetVisiblePixels();
+	
+			averageGeometryVis += vis;
+			++geomSize;
+			
+			std::stringstream d; d << "Geometry visibility: " << vis;
+			LogManager::getSingleton().logMessage(d.str());
+		}
+	}
+
+	InfoContainer<GtpVisibility::NodeInfo>::iterator nodesIt, nodesIt_end = visibleNodes.end();
+
+	for (nodesIt = visibleNodes.begin(); nodesIt != nodesIt_end; ++nodesIt)
+	{
+		// add if not 0
+		if ((*nodesIt).GetVisiblePixels())
+		{
+			float vis = relativeVisibility ? 
+				(*nodesIt).ComputeRelativeVisibility() : (float)(*nodesIt).GetVisiblePixels();
 		
-		averageGeometryVis += vis;
-
-		std::stringstream d; d << "Geometry visibility: " << vis;
-		LogManager::getSingleton().logMessage(d.str());
-	}
-
-	InfoContainer<GtpVisibility::NodeInfo>::iterator nodesIt, nodesIt_end = visibleNodes.end();
-
-	for (nodesIt = visibleNodes.begin(); nodesIt != nodesIt_end; ++nodesIt)
-	{
-		float vis = relativeVisibility ? 
-			(*nodesIt).ComputeRelativeVisibility() : (float)(*nodesIt).GetVisiblePixels();
-		
-		averageNodeVis += vis;
-		
-		std::stringstream d; d << "Node visibility: " << vis;
-		LogManager::getSingleton().logMessage(d.str());
-	}
-
-	if (visibleNodes.size())
-		averageNodeVis /= (float)visibleNodes.size();
-	if (visibleGeometry.size())
-		averageGeometryVis /= (float)visibleGeometry.size();
+			averageNodeVis += vis;
+			++nodesSize;
+
+			std::stringstream d; d << "Node visibility: " << vis;
+			LogManager::getSingleton().logMessage(d.str());
+		}	
+	}
+
+	if (nodesSize)
+		averageNodeVis /= (float)nodesSize;
+	if (geomSize)
+		averageGeometryVis /= (float)geomSize;
 
 	char str[100];
@@ -445,4 +466,6 @@
 		mShowQueryStats = true;
 	}
+
+	delete mQueryManager;
 }
 //-----------------------------------------------------------------------
Index: trunk/VUT/work/TestCullingTerrain/TerrainFrameListener.h
===================================================================
--- trunk/VUT/work/TestCullingTerrain/TerrainFrameListener.h	(revision 147)
+++ trunk/VUT/work/TestCullingTerrain/TerrainFrameListener.h	(revision 151)
@@ -11,4 +11,5 @@
 #include "VisibilityManager.h"
 #include "OgreTerrainContentGenerator.h"
+#include "OgrePlatformQueryManager.h"
 
 using namespace Ogre;
@@ -233,4 +234,5 @@
 	unsigned long mFrameCount;
 	//bool mUseBufferedInputKeys, mUseBufferedInputMouse, mInputTypeSwitchingOn;
+	PlatformQueryManager *mQueryManager;
 };
 
Index: trunk/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctreeNode.h
===================================================================
--- trunk/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctreeNode.h	(revision 151)
+++ trunk/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctreeNode.h	(revision 151)
@@ -0,0 +1,138 @@
+/*
+-----------------------------------------------------------------------------
+This source file is part of OGRE
+(Object-oriented Graphics Rendering Engine)
+For the latest info, see http://www.ogre3d.org/
+
+Copyright (c) 2000-2005 The OGRE Team
+Also see acknowledgements in Readme.html
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by the Free Software
+Foundation; either version 2 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along with
+this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+Place - Suite 330, Boston, MA 02111-1307, USA, or go to
+http://www.gnu.org/copyleft/lesser.txt.
+-----------------------------------------------------------------------------
+*/
+/***************************************************************************
+octreenode.h  -  description
+-------------------
+begin                : Fri Sep 27 2002
+copyright            : (C) 2002 by Jon Anderson
+email                : janders@users.sf.net
+
+Enhancements 2003 - 2004 (C) The OGRE Team
+***************************************************************************/
+
+#ifndef OCTREENODE_H
+#define OCTREENODE_H
+
+#include <OgreSceneNode.h>
+
+#include <OgreOctreeSceneManager.h>
+
+namespace Ogre
+{
+
+/** Specialized SceneNode that is customized for working within an Octree. Each node
+* maintains it's own bounding box, rather than merging it with all the children.
+*
+*/
+
+class _OgreTerrainExport OctreeNode : public SceneNode
+{
+public:
+    /** Standard constructor */
+    OctreeNode( SceneManager* creator );
+    /** Standard constructor */
+    OctreeNode( SceneManager* creator, const String& name );
+    /** Standard destructor */
+    ~OctreeNode();
+
+    /** Overridden from Node to remove any reference to octants */
+    Node * removeChild( unsigned short index );
+    
+    /** Overridden from Node to remove any reference to octants */
+    Node * removeChild( const String & name );
+
+    /** Overridden from Node to remove any reference to octants */
+    Node * removeChild( Node* child);
+
+    /** Returns the Octree in which this OctreeNode resides
+    */
+    Octree * getOctant()
+    {
+        return mOctant;
+    };
+
+    /** Sets the Octree in which this OctreeNode resides
+    */
+    void setOctant( Octree *o )
+    {
+        mOctant = o;
+    };
+
+    /** Determines if the center of this node is within the given box
+    */
+    bool _isIn( AxisAlignedBox &box );
+
+    /** Adds all the attached scenenodes to the render queue
+    */
+    virtual void _addToRenderQueue( Camera* cam, RenderQueue * q, bool onlyShadowCasters );
+
+    /** Sets up the LegacyRenderOperation for rendering this scene node as geometry.
+    @remarks
+    This will render the scenenode as a bounding box.
+    */
+    virtual void getRenderOperation( RenderOperation& op );
+
+    /** Returns the local bounding box of this OctreeNode.
+    @remarks
+    This is used to render the bounding box, rather then the global.
+    */
+    AxisAlignedBox & _getLocalAABB()
+    {
+        return mLocalAABB;
+    };
+
+
+protected:
+
+    /** Internal method for updating the bounds for this OctreeNode.
+    @remarks
+    This method determines the bounds solely from the attached objects, not
+    any children. If the node has changed it's bounds, it is removed from its
+    current octree, and reinserted into the tree.
+    */
+    void _updateBounds( void );
+
+    void _removeNodeAndChildren( );
+
+    ///local bounding box
+    AxisAlignedBox mLocalAABB;
+
+    ///Octree this node is attached to.
+    Octree *mOctant;
+
+    ///preallocated corners for rendering
+    Real mCorners[ 24 ];
+    ///shared colors for rendering
+    static unsigned long mColors[ 8 ];
+    ///shared indexes for rendering
+    static unsigned short mIndexes[ 24 ];
+
+
+};
+
+}
+
+
+#endif
