Index: /tags/DummyModules/VUT/GtpVisibility/include/DummyPreprocessingManager.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/DummyPreprocessingManager.h	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibility/include/DummyPreprocessingManager.h	(revision 65)
@@ -0,0 +1,61 @@
+#ifndef _VisibilityDummyPreprocessingManager_H__
+#define _VisibilityDummyPreprocessingManager_H__
+
+#include "PreprocessingManager.h"
+
+
+namespace GtpVisibility {
+  
+  /**
+     Implements a dummy interface to the external visibility preprocessing.
+  */
+class DummyPreprocessingManager : public PreprocessingManager
+{
+public:
+
+
+  /** Constructor taking a scene traverser for a specific type of
+      hierarchyInterface as argument. 
+  */
+  DummyPreprocessingManager( HierarchyInterface *hierarchyInterface );
+  
+  
+  /** 
+      Export the scene for visibility preprocessing. Exports the hierarchyInterface including
+      its bounding boxes + mesh data for occluders. The viewcell data will either be
+      supplied directly to the visibility preprocessing standalone module
+  */
+  virtual bool ExportScene(const string filename);
+  
+  
+  /** 
+      Load preprocessed visibility information
+  */
+  virtual bool LoadPreprocessedData(const string filename);
+  
+  
+protected:
+
+  /** 
+      Find viewcells intersecting a spherical neighborhood of a point.
+      Returns false if no viewcell was found.
+    */
+  virtual bool LocateViewCellIds(const Vector3 &center,
+				 const float radius,
+				 vector<int> *viewCellIds
+				 );
+
+
+  /**
+     Add a PVS of the given viewcell to the already evaluated PVS by computing
+     a union with visibleNodes and visibleMeshes. Returns the number of added entries.
+  */
+  virtual int AddViewCellPVS(const int cellID,
+			     InfoContainer<NodeInfo> *visibleNodes,
+			     InfoContainer<MeshInfo> *visibleMeshes );
+
+};
+
+};
+
+#endif // VisibilityPreprocessingManager
Index: /tags/DummyModules/VUT/GtpVisibility/include/VisibilityVector3.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/VisibilityVector3.h	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibility/include/VisibilityVector3.h	(revision 65)
@@ -0,0 +1,13 @@
+#ifndef _VisibilityVector3_H__
+#define _VisibilityVector3_H__
+
+#include "OgreVector3.h"
+
+namespace GtpVisibility {
+  /** Vector3 class currently uses the native Ogre vector when compiled with the Ogre platform */
+  typedef Ogre::Vector3 Vector3;
+}
+
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibility/include/DistanceQueue.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/DistanceQueue.h	(revision 59)
+++ /tags/DummyModules/VUT/GtpVisibility/include/DistanceQueue.h	(revision 59)
@@ -0,0 +1,40 @@
+#ifndef _DistanceQueue_H__
+#define _DistanceQueue_H__
+
+#include "OcclusionQuery.h"
+
+#include <queue>
+
+namespace GtpVisibility {
+
+/*  We define HierarchyNode as void * because
+	there is no common ancestor for hierarchy nodes in Ogre
+*/
+typedef void HierarchyNode;
+
+class HierarchyInterface;
+/** This class implements the less operator for the priority queue, i.e.,
+	a greater distance has a lower priority in the queue.
+*/
+template <typename T> class GreaterDistance
+{
+public:
+	GreaterDistance(HierarchyInterface *hierarchyInterface): mHierarchyInterface(hierarchyInterface)
+	{}
+	
+	bool operator() (T v1, T v2) const
+	{
+		return mHierarchyInterface->HasGreaterDistance(v1, v2);
+	}
+		
+private:
+	HierarchyInterface *mHierarchyInterface;
+};
+
+/** A priority queue where closer hierarchy nodes are given a higher priority.
+*/
+typedef std::priority_queue<HierarchyNode *, std::vector<HierarchyNode *>, GreaterDistance<std::vector<HierarchyNode *>::value_type> > DistanceQueue;
+
+} // namespace GtpVisibility
+
+#endif // DistanceQueue_H
Index: /tags/DummyModules/VUT/GtpVisibility/include/HierarchyInterface.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/HierarchyInterface.h	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibility/include/HierarchyInterface.h	(revision 65)
@@ -0,0 +1,117 @@
+#ifndef _GtpVisibilityHierarchyInterface_H__
+#define _GtpVisibilityHierarchyInterface_H__
+
+#include "DistanceQueue.h"
+
+namespace GtpVisibility {
+
+/**	Class which implements a hierarchy interface for a scene hierarchy.
+*/
+class HierarchyInterface
+{
+public:
+	/** Default constructor.
+	*/
+	HierarchyInterface();
+	virtual ~HierarchyInterface();
+	/** Returns true if current node is leaf of the hierarchy. 
+		@param node hierarchy node
+		@returns true if node is leaf
+	*/
+    virtual bool IsLeaf(HierarchyNode *node) = 0;
+	/** Traverses the given node. 
+		@param node the hierarchy node
+	*/
+	virtual void TraverseNode(HierarchyNode *node) = 0;
+	/** Renders current scene node .
+		@param node current scene node to be rendered
+	*/
+	virtual void RenderNode(HierarchyNode *node) = 0;
+	/** Pulls up the visibility from the current node recursively to the parent nodes. 
+		@param node the current node 
+	*/
+	virtual void PullUpVisibility(HierarchyNode *node) = 0;
+	/** Issue a occlusion query for this node. 
+		@param node the current hierarchy node
+		@returns occlusion query for this node
+	*/
+	virtual OcclusionQuery *IssueOcclusionQuery(HierarchyNode *node) = 0;
+	/** Sets the root of the scene hierarchy.
+		@param root the hierarchy root
+	*/
+	void SetSceneRoot(HierarchyNode *root);
+  /** Get the root of the scene hierarchy.
+      @return the hierarchy root
+  */
+  HierarchyNode *GetSceneRoot() const {
+    return mSceneRoot;
+  }
+	/** Sets the scene root and initialises this scene traverser for a traversal.
+		@param root current scene root
+		@remark initialises some parameters, and also the statistics.
+	*/
+	void InitFrame(HierarchyNode *root);
+	
+	/** Returns current frame id.
+		@returns frame id
+	*/
+	int GetFrameId();
+	/** Returns the current distance queue.
+		@returns current distance queue
+	*/
+	DistanceQueue *GetQueue();
+	/** Returns true if node 1 has greater distance to the view
+		plane than node 2.
+		@param node1 the first node to be compared
+		@param node2 the second node to be compared
+	*/			
+	virtual bool HasGreaterDistance(HierarchyNode *node1, HierarchyNode *node2) = 0;
+	/** Checks if the node is visible from the current view frustum.
+		@param node the current node
+		@param intersects returns true if the current node intersects the near plane
+	*/
+	virtual bool CheckFrustumVisible(HierarchyNode *node, bool &intersects) = 0;
+	/** Returns next available occlusion query or creates new one.
+		@return the next occlusion query
+	*/
+	virtual OcclusionQuery *GetNextOcclusionQuery() = 0;
+	/** Returns true if there is renderable geometry attached to this node
+		@param node the current node
+		@returns if the node has renderable geometry
+	*/
+    virtual bool HasGeometry(HierarchyNode *node) = 0;
+	/** Sets the visible flag for this node.
+		@param node the current node
+		@param visible the visible flag
+	*/
+	virtual void SetNodeVisible(HierarchyNode *node, const bool visible) = 0;
+	/** Returns true if node has the visible flag set. See set
+	*/
+	virtual bool IsNodeVisible(HierarchyNode *node) = 0;
+	/** Sets the last visited frame id for this node.
+		@param node the current node
+		@param frameId the current frame id
+	*/
+	virtual void SetLastVisited(HierarchyNode *node, const int frameId) = 0;
+	/** Returns frame id when this node was last visited by the traverser. See set
+	*/
+	virtual int LastVisited(HierarchyNode *node) = 0;
+
+protected:
+	
+	unsigned int mFrameId;
+
+	int mCurrentTestIdx;
+	
+	//--- statistics
+	unsigned int mNumSceneNodes;
+	unsigned int mNumTraversedNodes;
+	unsigned int mNumRenderedGeometry;
+	unsigned int mNumRenderedNodes;
+
+	DistanceQueue *mDistanceQueue;
+	HierarchyNode *mSceneRoot;
+	//HierarchyNode *mCurrentNode;
+};
+} // namespace GtpVisibility
+#endif // GtpVisisibilityHierarchyInterface_H
Index: /tags/DummyModules/VUT/GtpVisibility/include/QueryManager.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/QueryManager.h	(revision 71)
+++ /tags/DummyModules/VUT/GtpVisibility/include/QueryManager.h	(revision 71)
@@ -0,0 +1,95 @@
+#ifndef _VisibilityQueryManager_H__
+#define _VisibilityQueryManager_H__
+
+#include <vector>
+
+#include "VisibilityInfo.h"
+#include "VisibilityVector3.h"
+#include "VisibilityCamera.h"
+#include "VisibilityRay.h"
+
+namespace GtpVisibility {
+  
+/** This abstract class defines interface for a specific visibility query
+    algorithm. The interface supports two from point visibility queries and
+    the ray shooting query. The output of the queries consists of list of
+    visible meshes and hierarchy nodes. The from point queries will be implemented
+    either with item bufferring or based purelly on occlusion queries. Note that
+    the actuall implementation can also exploit the
+    output of the visibility preprocessor.
+*/
+class QueryManager
+{
+public:
+    /** Constructor taking a hierarchy interface as an argument. This allows to operate
+	onm different hierarchy types, while reusing the implementation of the query methods.
+     */
+    QueryManager( HierarchyInterface *hierarchyInterface );
+    
+    /** 
+	Computes restricted visibility from point by using an explicit camera to execute
+	the visibility query.
+	@param camera The camera to be used
+
+	@param visibleNodes Pointer to the container where visible nodes should be added.
+	This set is formed of visible leafs or fully visible interior nodes.
+	If NULL no visible nodes are not evaluated.
+
+	@param visibleGeometry Pointer to the container where visible meshes should be added.
+	If NULL no visible meshes are not evaluated.
+
+	@param relativeVisibility If true the visibility member for
+	NodeInfo and MeshInfo represent relative visibility; i.e. the number of visible
+	pixels divided by the the number of projected pixels.
+
+	@return true if the corresponding PVS exists.
+    */
+    virtual void
+    ComputeCameraVisibility(const Camera &camera,
+			    InfoContainer<NodeInfo> *visibleNodes,
+			    InfoContainer<MeshInfo> *visibleGeometry,
+			    bool relativeVisibility = false
+			    ) = 0;
+    
+    /** 
+	Uses the specified point to execute the visibility query in all directions. 
+	@sa ComputeCameraVisibility()
+    */
+    virtual void
+    ComputeFromPointVisibility(const Vector3 &point,
+			       InfoContainer<NodeInfo> *visibleNodes,
+			       InfoContainer<MeshInfo> *visibleGeometry,
+			       bool relativeVisibility = false
+			       ) = 0;
+    
+  /** 
+      Ray shooting intreface: finds an intersection with objects in the scene.
+
+      @param ray The given input ray (assuming the ray direction is normalized)
+
+      @param visibleMeshes List of meshes intersecting the ray
+
+      @param isGlobalLine If false only first intersection with opaque object is returned.
+      Otherwise all intersections of the ray with the scene are found.
+
+      @return true if there is any intersection. 
+	*/
+    virtual bool
+    ShootRay(const Ray &ray,
+	     std::vector<Mesh *> *visibleMeshes,
+	     bool isGlobalLine = false
+	     );
+  
+	/** Sets the scene traverser.
+      @remark the scene traverser depends on the type of hierarchyInterface the scene consists of.
+	*/
+	void SetSceneTraverser(HierarchyInterface *hierarchyInterface );
+
+protected:
+    HierarchyInterface *mHierarchyInterface;
+  
+};
+
+};
+
+#endif // VisibilityQueryManager
Index: /tags/DummyModules/VUT/GtpVisibility/include/VisibilityCamera.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/VisibilityCamera.h	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibility/include/VisibilityCamera.h	(revision 65)
@@ -0,0 +1,13 @@
+#ifndef _VisibilityCamera_H__
+#define _VisibilityCamera_H__
+
+#include "OgreCamera.h"
+
+namespace GtpVisibility {
+  /** Camera class currently uses the native Ogre camera when compiled with the Ogre platform */
+  typedef Ogre::Camera Camera;
+}
+
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibility/include/VisibilityRay.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/VisibilityRay.h	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibility/include/VisibilityRay.h	(revision 65)
@@ -0,0 +1,13 @@
+#ifndef _VisibilityRay_H__
+#define _VisibilityRay_H__
+
+#include "OgreRay.h"
+
+namespace GtpVisibility {
+  /** Ray class currently uses native Ogre ray when compiled with the Ogre platform */
+  typedef Ogre::Ray Ray;
+}
+
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibility/include/VisibilityInfo.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/VisibilityInfo.h	(revision 71)
+++ /tags/DummyModules/VUT/GtpVisibility/include/VisibilityInfo.h	(revision 71)
@@ -0,0 +1,50 @@
+#ifndef _VisibilityInfo_H__
+#define _VisibilityInfo_H__
+
+#include <vector>
+
+#include "VisibilityMesh.h"
+#include "HierarchyInterface.h"
+
+namespace GtpVisibility {
+  
+/** Class storing the visibility information of a scene node. 
+*/
+class NodeInfo 
+{
+public:
+    NodeInfo(HierarchyNode *node,const float v): mNode(node), mVisibility(v) {}
+
+protected:
+    /** pointer to the scene node */
+    HierarchyNode *mNode;
+    /** node visibility can either be a number of visible pixels or relative
+	number of visible pixels (if the hardware queries will provide the
+	total number of ratsterized pixels */
+    float mVisibility;
+};
+  
+/** Class storing the visibility information of a mesh.
+*/
+class MeshInfo 
+{
+public:
+	MeshInfo(Mesh *mesh, const float v): mMesh(mesh), mVisibility(v) {}
+
+protected:
+    /** Pointer to the mesh.
+	*/
+    Mesh *mMesh;
+    /** Node visibility can either be a number of visible pixels or relative
+	number of visible pixels (if the hardware queries will provide the
+	total number of ratsterized pixels.
+	*/
+    float mVisibility;
+};
+  
+//TODO: this define shall be replaced by template typedef
+#define InfoContainer std::vector
+};
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibility/include/VisibilityMesh.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/VisibilityMesh.h	(revision 71)
+++ /tags/DummyModules/VUT/GtpVisibility/include/VisibilityMesh.h	(revision 71)
@@ -0,0 +1,11 @@
+#ifndef _VisibilityMesh_H__
+#define _VisibilityMesh_H__
+
+#include "OgreMesh.h"
+
+namespace GtpVisibility {
+  typedef Ogre::Mesh Mesh;
+}
+
+
+#endif // VisibilityMesh.h
Index: /tags/DummyModules/VUT/GtpVisibility/include/StopAndWaitCullingManager.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/StopAndWaitCullingManager.h	(revision 59)
+++ /tags/DummyModules/VUT/GtpVisibility/include/StopAndWaitCullingManager.h	(revision 59)
@@ -0,0 +1,18 @@
+#ifndef _StopAndWaitCullingManager_H__
+#define _StopAndWaitCullingManager_H__
+
+#include "CullingManager.h"
+
+namespace GtpVisibility {
+
+/** Renders the scene with the hierarchical stop and wait algorithm. 
+*/
+class StopAndWaitCullingManager : public CullingManager
+{
+public:
+	StopAndWaitCullingManager(HierarchyInterface *hierarchyInterface);
+	void RenderScene();
+};
+
+} // namespace GtpVisibility
+#endif // StopAndWaitCullingManager
Index: /tags/DummyModules/VUT/GtpVisibility/include/VisibilityAxisAlignedBox.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/VisibilityAxisAlignedBox.h	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibility/include/VisibilityAxisAlignedBox.h	(revision 65)
@@ -0,0 +1,14 @@
+#ifndef _VisibilityAxisAlignedBox_H__
+#define _VisibilityAxisAlignedBox_H__
+
+#include "OgreAxisAlignedBox.h"
+
+namespace GtpVisibility {
+  /** This class currently uses the native Ogre AxisAlignedBox when
+      compiled with the Ogre platform */
+  typedef Ogre::AxisAlignedBox AxisAlignedBox;
+}
+
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibility/include/DummyQueryManager.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/DummyQueryManager.h	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibility/include/DummyQueryManager.h	(revision 65)
@@ -0,0 +1,43 @@
+#ifndef _VisibilityDummyQueryManager_H__
+#define _VisibilityDummyQueryManager_H__
+
+#include "VisibilityInfo.h"
+#include "QueryManager.h"
+
+namespace GtpVisibility {
+/** This implements dummy visibility queries. The queries return only the root of the
+    hierarchy as visible node.
+*/
+  class DummyQueryManager : public QueryManager
+  {
+  public:
+    /** Constructor taking a scene traverser for a specific type of hierarchyInterface
+	as argument. 
+    */
+    DummyQueryManager( HierarchyInterface *hierarchyInterface ):
+      QueryManager(hierarchyInterface) {}
+    
+    /**
+       @sa QueryManager::ComputeCameraVisibility()
+     */
+    virtual void
+    ComputeCameraVisibility(const Camera &camera,
+			    InfoContainer<NodeInfo> *visibleNodes,
+			    InfoContainer<MeshInfo> *visibleGeometry,
+			    bool relativeVisibility = false
+			    );
+    
+    /**
+       @sa QueryManager::ComputeFromPointVisibility()
+     */
+    virtual void
+    ComputeFromPointVisibility(const Vector3 &point,
+			       InfoContainer<NodeInfo> *visibleNodes,
+			       InfoContainer<MeshInfo> *visibleGeometry,
+			       bool relativeVisibility = false
+			       );
+    
+  };
+  
+};
+#endif // VisibilitySummyQueryManager
Index: /tags/DummyModules/VUT/GtpVisibility/include/VisibilityEnvironment.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/VisibilityEnvironment.h	(revision 71)
+++ /tags/DummyModules/VUT/GtpVisibility/include/VisibilityEnvironment.h	(revision 71)
@@ -0,0 +1,25 @@
+#ifndef _VisibilityEnvironment_H__
+#define _VisibilityEnvironment_H__
+
+namespace GtpVisibility {
+
+/** This class provides different parameters for the visibility manager.
+*/
+class VisibilityEnvironment
+{
+public:
+    VisibilityEnvironment();
+	
+	/** Different types of occlusion culling algorithms 
+	*/
+	enum CullingManagerType {FRUSTUM_CULLING, STOP_AND_WAIT, COHERENT_HIERARCHICAL_CULLING};
+
+	/** Loads an environment from disk.
+	*/
+	void LoadEnvironment();
+};
+} // namespace GtpVisibility
+
+/** @}*/ // end of group Visibility
+
+#endif // VisibilityEnvironment_H
Index: /tags/DummyModules/VUT/GtpVisibility/include/FrustumCullingManager.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/FrustumCullingManager.h	(revision 59)
+++ /tags/DummyModules/VUT/GtpVisibility/include/FrustumCullingManager.h	(revision 59)
@@ -0,0 +1,18 @@
+#ifndef _FrustumCullingManager_H__
+#define _FrustumCullingManager_H__
+
+#include "CullingManager.h"
+
+namespace GtpVisibility {
+
+/** Renders the scene, applies only view frustum culling. 
+*/
+
+class FrustumCullingManager : public CullingManager
+{
+public:
+	FrustumCullingManager(HierarchyInterface *hierarchyInterface);
+	void RenderScene();
+};
+} // namespace GtpVisibility
+#endif // FrustumCullingManager_H
Index: /tags/DummyModules/VUT/GtpVisibility/include/PreprocessingManager.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/PreprocessingManager.h	(revision 71)
+++ /tags/DummyModules/VUT/GtpVisibility/include/PreprocessingManager.h	(revision 71)
@@ -0,0 +1,135 @@
+#ifndef _VisibilityPreprocessingManager_H__
+#define _VisibilityPreprocessingManager_H__
+
+#include <string>
+using namespace std;
+
+#include "HierarchyInterface.h"
+#include "VisibilityInfo.h"
+#include "VisibilityVector3.h"
+
+namespace GtpVisibility {
+  
+/**
+	This class defines an interface to the external visibility preprocessor.
+    It allows to export the static part of the scene to a file in the XML format
+    understood by the preprocessor. By default all the exported meshes are considered
+    as scene occluders, whereas occludees are formed by their bounding boxes,
+    and bounding boxes of the scene hierarchy.
+
+    This class also allows to import the preprocessed data with PVS
+    information for the viewcells (note that the viewcells are either generated
+    automatically by the preprocessor or loaded from a polyhedral definition stored
+    in a file (see documentation for the Preprocessor class).
+*/
+  
+class PreprocessingManager
+{
+public:
+    
+	/** Constructor taking a HierarchyInterface as argument.
+        The HierarchyInterface makes the PreprocessingManager independent from the actual
+        scene representation as long as it supports a required set of methods.
+    */
+    PreprocessingManager(HierarchyInterface *hierarchyInterface);
+    
+
+    /**
+        Destructor which deletes all data describing static scene visibility.
+    */
+    virtual ~PreprocessingManager();
+
+    /** Export the scene for visibility preprocessing. Exports the hierarchyInterface including
+        its bounding boxes + mesh data. Note that the bounding boxes can be used as occludees
+        by the extrenal preprocessor. The viewcell data will either be supplied directly to the
+        visibility preprocessing standalone module.
+
+        @param filename name of the file to export.
+        @return true if the export was succesful.
+    */
+    virtual bool ExportScene(const string filename) = 0;
+    
+	/** Load preprocessed visibility information. The loaded data is matched with the current
+        scene graph. The topology of the current scene graph has to match with the loaded data.
+        There is also geometrical check of the bounding boxes. Once loading is succesful the
+        PreprocessingManager establishes links from its internal visibility representation
+        to the scene graph: no change of this part of the scene graph is allowed; this would
+        violate the static scene assumption!
+
+        @param filename name of the file to load.
+        @return true if the loading was succesful.
+    */
+    virtual bool LoadPreprocessedData(const string filename) = 0;
+    
+    /** 
+	Retrieve a PVS corresponding to the given spherical neighborhood of the point.
+	Typically the implementation of this method will firs locate all viewcells
+	intersecting the sphere using efficient logarithmic search enhanced with caching
+	the last query. Then it computes a union of the PVS for the found viewcells.
+
+	@param point the center point of the spherical neighborhood
+
+	@param radius the radius of the spherical neighborhood. Note that if radius==0 a
+	more efficient implementation of the method for this special case can be used.
+
+	@param visibleNodes of not NULL
+	a set of visible hierarchy nodes is added to the visibleNodes container.
+	This set is formed of visible leafs or fully visible interior nodes.
+
+	@param visibleMeshes if not NULL the set of visible meshes is
+	added to the container. Returns true if the corresponding PVS exists.
+    */
+    virtual bool GetPVS(const Vector3 &point,
+			const float radius,
+			InfoContainer<NodeInfo> *visibleNodes,
+			InfoContainer<MeshInfo> *visibleMeshes );
+    
+    
+  
+    /** Sets the scene traverser.
+	@remark the scene traverser is dependent on the type of hierarchyInterface the scene consists of.
+    */
+    virtual void SetSceneTraverser( HierarchyInterface *hierarchyInterface ) {
+      mSceneTraverser = hierarchyInterface;
+    }
+    
+  protected:
+    /** Get checksum of the current occluder set in the scene graph. This method is used to check
+	if the preprocessed data matches the current scene graph
+	-> $$ could be moved to VisibilitySceneTraverser */
+    long GetOccluderChecksum() const {
+      return 0;
+    }
+      
+    
+    /** Get checksum of the current occludee set in the scene graph. This method is used to check
+	if the preprocessed data matches the current scene graph
+	-> $$ could be moved to VisibilitySceneTraverser */
+    long GetOccludeeChecksum() const {
+      return 0;
+    }
+    
+    
+    /** 
+	Find viewcells intersecting a spherical neighborhood of a point.
+	Returns false if no viewcell was found.
+    */
+    virtual bool LocateViewCellIds(const Vector3 &center,
+				   const float radius,
+				   vector<int> *viewCellIds
+				   ) = 0;
+    
+    /**
+       Add a PVS of the given viewcell to the already evaluated PVS by computing
+       a union with visibleNodes and visibleMeshes. Returns the number of added entries.
+    */
+    virtual int AddViewCellPVS(const int cellID,
+			       InfoContainer<NodeInfo> *visibleNodes,
+			       InfoContainer<MeshInfo> *visibleMeshes ) = 0;
+    
+    HierarchyInterface *mSceneTraverser;
+  };
+  
+};
+
+#endif // VisibilityPreprocessingInterafce
Index: /tags/DummyModules/VUT/GtpVisibility/include/CoherentHierarchicalCullingManager.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/CoherentHierarchicalCullingManager.h	(revision 59)
+++ /tags/DummyModules/VUT/GtpVisibility/include/CoherentHierarchicalCullingManager.h	(revision 59)
@@ -0,0 +1,25 @@
+#ifndef _CoherentHierarchicalCullingManager_H__
+#define _CoherentHierarchicalCullingManager_H__
+
+#include "CullingManager.h"
+#include "HierarchyInterface.h"
+
+
+namespace GtpVisibility
+{
+
+typedef std::pair<HierarchyNode *, OcclusionQuery *> QueryPair;
+typedef std::queue<QueryPair> QueryQueue;
+
+/** Renders the scene with the coherent hierarchical culling algorithm. 
+*/
+class CoherentHierarchicalCullingManager : public CullingManager
+{
+public:
+	CoherentHierarchicalCullingManager(HierarchyInterface *hierarchyInterface);
+	void RenderScene();
+};
+
+} // namespace GtpVisibility
+
+#endif // CoherentHierarchicalCullingManager_H
Index: /tags/DummyModules/VUT/GtpVisibility/include/VisibilityManager.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/VisibilityManager.h	(revision 71)
+++ /tags/DummyModules/VUT/GtpVisibility/include/VisibilityManager.h	(revision 71)
@@ -0,0 +1,53 @@
+#ifndef _VisibilityManager_H__
+#define _VisibilityManager_H__
+
+#include "CullingManager.h"
+#include "VisibilityEnvironment.h"
+
+/** This namespace includes all classes which are created by the VUT (Vienna University
+	of Technology for the Visibility module of the GTP (GameTools Project) (www.gametools.org),
+	and are not directly derived from an Ogre class.
+*/
+namespace GtpVisibility {
+
+  class QueryManager;
+  class PreprocessingManager;
+  
+/** This class manages all forms of visibility. It is the main
+	class of our visibility module and manages online occlusion culling,
+	offline culling, and visibility queries.
+*/
+class VisibilityManager
+{
+public:
+	/** Constructor taking the visibility environment object as parameter
+		@param visEnvironment the visibility environment
+	*/
+	VisibilityManager(VisibilityEnvironment *visEnvironment);
+	
+	~VisibilityManager();
+	/** Sets the current online occlusion culling manager, e.g.,
+		the stop and wait algorithm or coherent hierarchical culling.
+		@param ocmType the online occlusion culling manager type
+	*/
+	void SetCullingManager(VisibilityEnvironment::CullingManagerType ocmType);
+	/** Returns the current online occlusion culling manager. See set
+	*/
+	CullingManager *GetCullingManager();
+
+	/** Applies the online visibility culling algorithm on a scene.
+		@remark the algorithm depends on the current culling manager.
+	*/
+	void ApplyVisibilityCulling();
+
+protected:
+	
+  CullingManager *mCullingManager;
+  QueryManager *mQueryManager;
+  PreprocessingManager *mPreprocessingManager;
+  VisibilityEnvironment *mVisibilityEnvironment;
+  VisibilityEnvironment::CullingManagerType mCullingManagerType;
+};
+} // namespace GtpVisibility
+
+#endif // VisibilityManager
Index: /tags/DummyModules/VUT/GtpVisibility/include/OcclusionQuery.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/OcclusionQuery.h	(revision 59)
+++ /tags/DummyModules/VUT/GtpVisibility/include/OcclusionQuery.h	(revision 59)
@@ -0,0 +1,31 @@
+#ifndef _OcclusionQuery_H__
+#define _OcclusionQuery_H__
+
+namespace GtpVisibility {
+
+/** This class is an abstract interface for occlusion queries.
+*/
+class OcclusionQuery
+{
+public:
+//	OcclusionQuery();
+	virtual ~OcclusionQuery() {};
+	/** Returns the result of an occlusion query in terms of visible pixels.
+		@returns number of visible pixels
+	*/
+	virtual unsigned int GetQueryResult() const = 0;
+	/** Returns true if the result of the query is available, false otherwise.
+		@returns if result is available
+	*/
+	virtual bool ResultAvailable() const = 0;
+	/** Begins occlusion query.
+		@remark the query counts the number of visible pixels between it's begin and end
+	*/
+	virtual void BeginQuery() const = 0;
+	/** Ends occlusion query.
+	*/
+	virtual void EndQuery() const = 0;
+};
+
+} // namespace GtpVisibility
+#endif // OcclusionQuery_H
Index: /tags/DummyModules/VUT/GtpVisibility/include/CullingManager.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/include/CullingManager.h	(revision 59)
+++ /tags/DummyModules/VUT/GtpVisibility/include/CullingManager.h	(revision 59)
@@ -0,0 +1,36 @@
+#ifndef _CullingManager_H__
+#define _CullingManager_H__
+
+#include "HierarchyInterface.h"
+
+namespace GtpVisibility {
+
+/** This abstract class implements an interface for a specific culling 
+	algorithm. The algorithm is either used to render a scene or to make a visibility query.
+*/
+class CullingManager
+{
+public:
+	/** Constructor taking a scene traverser for a specific type of hierarchy as argument. 
+	*/
+	CullingManager(HierarchyInterface *hierarchyInterface);
+	/** Renders the scene using a specific occlusion culling algorithm, e.g., coherent
+		hierarchical culling or stop and wait.
+	*/
+	virtual void RenderScene() = 0;
+	/** Sets the hierarchy interface.
+		@param hierarchyInterface
+		@remark the hierarchy interface encapsulates the hierarchy we are working on
+	*/
+	void SetHierarchyInterface(HierarchyInterface *hierarchyInterface);
+
+protected:
+
+	unsigned int mNumQueryCulledNodes;
+	unsigned int mNumFrustumCulledNodes;
+
+	unsigned int mVisibilityThreshold;
+	HierarchyInterface *mHierarchyInterface;
+};
+} // namespace GtpVisibility
+#endif // CullingManager
Index: /tags/DummyModules/VUT/GtpVisibility/scripts/GtpVisibility.pro
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/scripts/GtpVisibility.pro	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibility/scripts/GtpVisibility.pro	(revision 65)
@@ -0,0 +1,31 @@
+
+TEMPLATE = app
+
+TARGET = visibility
+
+INCLUDEPATH += ../include \
+c:/stlport-4.6.2/stlport \
+D:\gametools\ogrenew\PlugIns\OctreeSceneManager\include \
+d:/gametools/ogrenew/OgreMain/include
+
+# debuc config
+CONFIG		+= console warn_on debug thread
+
+#DEFINES 	+=EXT_HASH
+# RELEASE CONFIG
+#CONFIG		+= windows warn_on thread
+
+# DEPENDPATH	= ../../include
+
+# Input
+HEADERS += 
+
+	
+SOURCES += \
+CoherentHierarchicalCullingManager.cpp  PreprocessingManager.cpp \
+CullingManager.cpp                      QueryManager.cpp \
+DummyPreprocessingManager.cpp           StopAndWaitCullingManager.cpp \
+DummyQueryManager.cpp                   VisibilityEnvironment.cpp \
+FrustumCullingManager.cpp               VisibilityManager.cpp \
+HierarchyInterface.cpp
+
Index: /tags/DummyModules/VUT/GtpVisibility/scripts/GtpVisibility.vcproj
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/scripts/GtpVisibility.vcproj	(revision 71)
+++ /tags/DummyModules/VUT/GtpVisibility/scripts/GtpVisibility.vcproj	(revision 71)
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="GtpVisibility"
+	ProjectGUID="{101A7691-74F3-48B4-96A3-CF35578F5900}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\lib\$(ConfigurationName)"
+			IntermediateDirectory="..\obj\$(ConfigurationName)"
+			ConfigurationType="4"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(OGRE_PATH)/OgreMain/include&quot;;..\include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/GtpVisibility.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="..\bin\$(ConfigurationName)"
+			IntermediateDirectory="..\obj\$(ConfigurationName)"
+			ConfigurationType="4"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/GtpVisibility.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\CoherentHierarchicalCullingManager.cpp">
+			</File>
+			<File
+				RelativePath="..\src\CullingManager.cpp">
+			</File>
+			<File
+				RelativePath="..\src\DummyPreprocessingManager.cpp">
+			</File>
+			<File
+				RelativePath="..\src\DummyQueryManager.cpp">
+			</File>
+			<File
+				RelativePath="..\src\FrustumCullingManager.cpp">
+			</File>
+			<File
+				RelativePath="..\src\HierarchyInterface.cpp">
+			</File>
+			<File
+				RelativePath="..\src\PreprocessingManager.cpp">
+			</File>
+			<File
+				RelativePath="..\src\QueryManager.cpp">
+			</File>
+			<File
+				RelativePath="..\src\StopAndWaitCullingManager.cpp">
+			</File>
+			<File
+				RelativePath="..\src\VisibilityEnvironment.cpp">
+			</File>
+			<File
+				RelativePath="..\src\VisibilityManager.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath="..\include\CoherentHierarchicalCullingManager.h">
+			</File>
+			<File
+				RelativePath="..\include\CullingManager.h">
+			</File>
+			<File
+				RelativePath="..\include\DistanceQueue.h">
+			</File>
+			<File
+				RelativePath="..\include\FrustumCullingManager.h">
+			</File>
+			<File
+				RelativePath="..\include\HierarchyInterface.h">
+			</File>
+			<File
+				RelativePath="..\include\OcclusionQuery.h">
+			</File>
+			<File
+				RelativePath="..\include\PreprocessingManager.h">
+			</File>
+			<File
+				RelativePath="..\include\QueryManager.h">
+			</File>
+			<File
+				RelativePath="..\include\StopAndWaitCullingManager.h">
+			</File>
+			<File
+				RelativePath="..\include\VisibilityEnvironment.h">
+			</File>
+			<File
+				RelativePath="..\include\VisibilityInfo.h">
+			</File>
+			<File
+				RelativePath="..\include\VisibilityManager.h">
+			</File>
+			<File
+				RelativePath="..\include\VisibilityMesh.h">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: /tags/DummyModules/VUT/GtpVisibility/src/FrustumCullingManager.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/src/FrustumCullingManager.cpp	(revision 59)
+++ /tags/DummyModules/VUT/GtpVisibility/src/FrustumCullingManager.cpp	(revision 59)
@@ -0,0 +1,44 @@
+#include "FrustumCullingManager.h"
+
+namespace GtpVisibility {
+
+//-----------------------------------------------------------------------
+FrustumCullingManager::FrustumCullingManager(HierarchyInterface *hierarchyInterface):
+CullingManager(hierarchyInterface)
+{
+}
+//-----------------------------------------------------------------------
+void FrustumCullingManager::RenderScene()
+{
+	mNumFrustumCulledNodes = mNumQueryCulledNodes = 0;
+
+	while(!mHierarchyInterface->GetQueue()->empty())
+	{
+		HierarchyNode *node = mHierarchyInterface->GetQueue()->top();
+		mHierarchyInterface->GetQueue()->pop();
+		
+		// interesting for visualization purpose
+		mHierarchyInterface->SetNodeVisible(node, false);
+		mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
+
+		bool intersects = false;
+
+		if(mHierarchyInterface->CheckFrustumVisible(node, intersects))
+		{
+			mNumFrustumCulledNodes ++;
+			continue;
+		}
+		
+		//if intersects near plane => skip occlusion query because wrong results possible
+		if(intersects)
+		{
+            mHierarchyInterface->SetNodeVisible(node, true);
+			mHierarchyInterface->TraverseNode(node);
+			continue;
+		}
+
+		mHierarchyInterface->TraverseNode(node);
+	}
+}
+
+} // namespace GtpVisibility
Index: /tags/DummyModules/VUT/GtpVisibility/src/PreprocessingManager.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/src/PreprocessingManager.cpp	(revision 71)
+++ /tags/DummyModules/VUT/GtpVisibility/src/PreprocessingManager.cpp	(revision 71)
@@ -0,0 +1,31 @@
+#include "PreprocessingManager.h"
+
+namespace GtpVisibility {
+  
+PreprocessingManager::PreprocessingManager(HierarchyInterface *hierarchyInterface)
+{
+}
+
+PreprocessingManager::~PreprocessingManager()
+{
+}
+
+bool PreprocessingManager::GetPVS(const Vector3 &center,
+								  const float radius,
+								  InfoContainer<NodeInfo> *visibleNodes,
+								  InfoContainer<MeshInfo> *visibleMeshes)
+{
+    vector<int> viewCellIds;
+    if (LocateViewCellIds(center, radius, &viewCellIds)) 
+	{
+		for (vector<int>::iterator ci = viewCellIds.begin(); ci != viewCellIds.end(); ci++) 
+		{
+			AddViewCellPVS(*ci, visibleNodes, visibleMeshes );
+			// remove duplicates of the PVS entries if any?
+		}
+		return true;
+    }
+    return false;
+  }
+  
+};
Index: /tags/DummyModules/VUT/GtpVisibility/src/CoherentHierarchicalCullingManager.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/src/CoherentHierarchicalCullingManager.cpp	(revision 59)
+++ /tags/DummyModules/VUT/GtpVisibility/src/CoherentHierarchicalCullingManager.cpp	(revision 59)
@@ -0,0 +1,94 @@
+#include "CoherentHierarchicalCullingManager.h"
+
+namespace GtpVisibility {
+
+//-----------------------------------------------------------------------
+CoherentHierarchicalCullingManager::CoherentHierarchicalCullingManager(HierarchyInterface *hierarchyInterface):
+CullingManager(hierarchyInterface)
+{
+}
+//-----------------------------------------------------------------------
+void CoherentHierarchicalCullingManager::RenderScene()
+{
+	QueryQueue queryQueue;
+	mNumFrustumCulledNodes = mNumQueryCulledNodes = 0;
+
+	//-- PART 1: process finished occlusion queries
+	while (!mHierarchyInterface->GetQueue()->empty() || !queryQueue.empty())
+	{
+		while (!queryQueue.empty() && 
+			   (queryQueue.front().second->ResultAvailable() || mHierarchyInterface->GetQueue()->empty()))
+		{
+			HierarchyNode *node = queryQueue.front().first;
+					
+			// wait until result available
+			unsigned int visiblePixels = queryQueue.front().second->GetQueryResult();
+			
+			queryQueue.pop();
+
+			if (visiblePixels > mVisibilityThreshold)
+			{
+				mHierarchyInterface->PullUpVisibility(node);
+				mHierarchyInterface->TraverseNode(node);
+			}
+			else
+			{
+				mNumQueryCulledNodes ++;
+			}
+		}	
+
+		//-- PART 2: hierarchical traversal
+		if (!mHierarchyInterface->GetQueue()->empty())
+		{
+			HierarchyNode *node = mHierarchyInterface->GetQueue()->top();
+			mHierarchyInterface->GetQueue()->pop();
+				
+			bool intersects = false;
+
+			if(!mHierarchyInterface->CheckFrustumVisible(node, intersects))
+			{
+				mNumFrustumCulledNodes ++;
+				continue;
+			}
+
+			// if intersects near plane => skip occlusion query because wrong results possible
+			if (intersects)
+			{
+				// update octant's visited flag
+				mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
+
+				mHierarchyInterface->PullUpVisibility(node);			
+				mHierarchyInterface->TraverseNode(node);
+
+				continue;
+			}
+
+			// identify previously visible nodes
+			bool wasVisible = mHierarchyInterface->IsNodeVisible(node) && 
+				(mHierarchyInterface->LastVisited(node) == mHierarchyInterface->GetFrameId() - 1);
+				
+			// identify nodes that we cannot skip queries for
+			bool mustQuery = !wasVisible || mHierarchyInterface->HasGeometry(node) || mHierarchyInterface->IsLeaf(node);
+
+			// reset node's visibility classification 
+			mHierarchyInterface->SetNodeVisible(node, false);
+
+			// update node's visited flag
+			mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
+			
+			// skip testing previously visible interior nodes
+			if (mustQuery)
+			{
+				queryQueue.push(QueryPair(node, mHierarchyInterface->IssueOcclusionQuery(node)));
+			}
+					
+			// always traverse a node if it was visible
+			if (wasVisible)
+			{
+				mHierarchyInterface->TraverseNode(node);
+			}
+		}
+	}
+}
+
+} // namespace GtpVisibility
Index: /tags/DummyModules/VUT/GtpVisibility/src/HierarchyInterface.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/src/HierarchyInterface.cpp	(revision 59)
+++ /tags/DummyModules/VUT/GtpVisibility/src/HierarchyInterface.cpp	(revision 59)
@@ -0,0 +1,44 @@
+#include "HierarchyInterface.h"
+
+//#include <windows.h>
+
+namespace GtpVisibility {
+
+//-----------------------------------------------------------------------
+HierarchyInterface::HierarchyInterface(): 
+mFrameId(1), mNumSceneNodes(0), mNumTraversedNodes(0), 
+mNumRenderedNodes(0), mSceneRoot(0), mCurrentTestIdx(0)
+{	
+	mDistanceQueue = new DistanceQueue(GreaterDistance<HierarchyNode *>(this));
+}
+//-----------------------------------------------------------------------
+HierarchyInterface::~HierarchyInterface()
+{		
+	delete mDistanceQueue;
+}
+//-----------------------------------------------------------------------
+void HierarchyInterface::SetSceneRoot(HierarchyNode *root)
+{
+	mSceneRoot = root;
+}
+//-----------------------------------------------------------------------
+void HierarchyInterface::InitFrame(HierarchyNode *root)
+{
+	mFrameId = 0;
+	mNumTraversedNodes = 0;
+	mNumRenderedNodes = 0;
+
+	SetSceneRoot(root);
+	mDistanceQueue->push(mSceneRoot);
+}
+//-----------------------------------------------------------------------
+int HierarchyInterface::GetFrameId()
+{
+	return mFrameId;
+}
+//-----------------------------------------------------------------------
+DistanceQueue *HierarchyInterface::GetQueue()
+{
+	return mDistanceQueue;
+}
+} // namespace GtpVisibility
Index: /tags/DummyModules/VUT/GtpVisibility/src/QueryManager.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/src/QueryManager.cpp	(revision 71)
+++ /tags/DummyModules/VUT/GtpVisibility/src/QueryManager.cpp	(revision 71)
@@ -0,0 +1,16 @@
+#include "QueryManager.h"
+
+
+namespace GtpVisibility {
+ 
+QueryManager::QueryManager(HierarchyInterface *hierarchyInterface)
+{
+}
+ 
+bool QueryManager::ShootRay(const Ray &ray, std::vector<Mesh *> *visibleMeshes, bool isGlobalLine)
+{
+    // run OGRE ray shooting query
+    return false;
+}
+  
+} // namespace GtpVisibility
Index: /tags/DummyModules/VUT/GtpVisibility/src/VisibilityManager.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/src/VisibilityManager.cpp	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibility/src/VisibilityManager.cpp	(revision 65)
@@ -0,0 +1,65 @@
+#include "VisibilityManager.h"
+#include "StopAndWaitCullingManager.h"
+#include "CoherentHierarchicalCullingManager.h"
+#include "FrustumCullingManager.h"
+#include "DummyPreprocessingManager.h"
+#include "DummyQueryManager.h"
+
+namespace GtpVisibility {
+
+VisibilityManager::VisibilityManager(VisibilityEnvironment *visEnvironment)
+{
+	mVisibilityEnvironment = visEnvironment;
+	//mVisibilityManagerType = VisibilityEnvironment::STOP_AND_WAIT;
+	//mVisibilityManager = new StopAndWaitCullingManager(NULL);
+	mCullingManagerType = VisibilityEnvironment::FRUSTUM_CULLING;
+	mCullingManager = new FrustumCullingManager(0);
+
+	mQueryManager = new DummyQueryManager(0);
+	mPreprocessingManager = new DummyPreprocessingManager(0);
+
+}
+
+VisibilityManager::~VisibilityManager()
+{
+	delete mCullingManager;
+}
+
+void VisibilityManager::SetCullingManager(VisibilityEnvironment::CullingManagerType ocmType)
+{
+	if (mCullingManagerType != ocmType)
+	{
+		mCullingManagerType = ocmType;
+		delete mCullingManager;
+
+		switch (ocmType)
+		{
+		case VisibilityEnvironment::STOP_AND_WAIT:
+			mCullingManager = new StopAndWaitCullingManager(NULL);
+			break;
+
+		case VisibilityEnvironment::COHERENT_HIERARCHICAL_CULLING:
+			mCullingManager = new CoherentHierarchicalCullingManager(NULL);
+			break;
+
+		case VisibilityEnvironment::FRUSTUM_CULLING:
+			mCullingManager = new FrustumCullingManager(NULL);
+			break;
+		default:
+			mCullingManager = new StopAndWaitCullingManager(NULL);
+			break;
+		}
+	}
+}
+
+CullingManager *VisibilityManager::GetCullingManager()
+{
+	return mCullingManager;
+}
+
+void VisibilityManager::ApplyVisibilityCulling()
+{
+	mCullingManager->RenderScene();
+}
+
+} // namespace GtpVisibility
Index: /tags/DummyModules/VUT/GtpVisibility/src/StopAndWaitCullingManager.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/src/StopAndWaitCullingManager.cpp	(revision 59)
+++ /tags/DummyModules/VUT/GtpVisibility/src/StopAndWaitCullingManager.cpp	(revision 59)
@@ -0,0 +1,52 @@
+#include "StopAndWaitCullingManager.h"
+
+namespace GtpVisibility {
+
+//-----------------------------------------------------------------------
+StopAndWaitCullingManager::StopAndWaitCullingManager(HierarchyInterface *HierarchyInterface):
+CullingManager(HierarchyInterface)
+{
+}
+//-----------------------------------------------------------------------
+void StopAndWaitCullingManager::RenderScene()
+{
+	mNumFrustumCulledNodes = mNumQueryCulledNodes = 0;
+
+	while (!mHierarchyInterface->GetQueue()->empty())
+	{
+		HierarchyNode *node = mHierarchyInterface->GetQueue()->top();
+		mHierarchyInterface->GetQueue()->pop();
+		
+		// interesting for visualization purpose
+		mHierarchyInterface->SetNodeVisible(node, false);
+		mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
+
+		bool intersects = false;
+
+		if (mHierarchyInterface->CheckFrustumVisible(node, intersects))
+		{
+			mNumFrustumCulledNodes ++;
+			continue;
+		}
+		
+		//if intersects near plane => skip occlusion query because wrong results possible
+		if (intersects)
+		{
+            mHierarchyInterface->SetNodeVisible(node, true);
+			mHierarchyInterface->TraverseNode(node);
+			continue;
+		}
+
+		// node visible
+		if (mHierarchyInterface->IssueOcclusionQuery(node)->GetQueryResult() > 
+			mVisibilityThreshold)
+		{
+			mHierarchyInterface->TraverseNode(node);
+		}
+		else
+		{
+			mNumQueryCulledNodes ++;
+		}
+	}
+}
+} // namespace GtpVisibility
Index: /tags/DummyModules/VUT/GtpVisibility/src/CullingManager.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/src/CullingManager.cpp	(revision 59)
+++ /tags/DummyModules/VUT/GtpVisibility/src/CullingManager.cpp	(revision 59)
@@ -0,0 +1,16 @@
+#include "CullingManager.h"
+
+namespace GtpVisibility {
+
+//-----------------------------------------------------------------------
+CullingManager::CullingManager(HierarchyInterface *hierarchyInterface):
+mHierarchyInterface(hierarchyInterface), mVisibilityThreshold(0), mNumQueryCulledNodes(0), 
+mNumFrustumCulledNodes(0)
+{
+}
+//-----------------------------------------------------------------------
+void CullingManager::SetHierarchyInterface(HierarchyInterface *hierarchyInterface)
+{
+	mHierarchyInterface = hierarchyInterface;
+}
+} // namespace GtpVisibility
Index: /tags/DummyModules/VUT/GtpVisibility/src/DummyPreprocessingManager.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/src/DummyPreprocessingManager.cpp	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibility/src/DummyPreprocessingManager.cpp	(revision 65)
@@ -0,0 +1,55 @@
+#include "DummyPreprocessingManager.h"
+
+namespace GtpVisibility {
+
+DummyPreprocessingManager::DummyPreprocessingManager( HierarchyInterface *hierarchyInterface )
+  :PreprocessingManager(hierarchyInterface)
+{
+}
+  
+
+bool
+DummyPreprocessingManager::ExportScene(const string filename)
+{
+  ofstream s(filename.c_str());
+  s<<"#VRML 2.0 utf8"<<endl;
+  s<<"#Dummy module output"<<endl;
+  return true;
+}
+  
+
+bool
+DummyPreprocessingManager::LoadPreprocessedData(const string filename)
+{
+  // do nothing
+  return false;
+}
+
+  
+  /** 
+      Find viewcells intersecting a spherical neighborhood of a point.
+      Returns false if no viewcell was found.
+    */
+bool
+DummyPreprocessingManager::LocateViewCellIds(const Vector3 &center,
+					     const float radius,
+					     vector<int> *viewCellIds
+					     )
+{
+  return false;
+}
+  
+/** 
+    Uses the specified viewcell to find its PVS
+*/
+int
+DummyPreprocessingManager::AddViewCellPVS(const int cellID,
+					  InfoContainer<NodeInfo> *visibleNodes,
+					  InfoContainer<MeshInfo> *visibleMeshes )
+{
+  // return the root of the hierarchyInterface regardless of the cellId
+  //  visibleNodes->push_back(traverser->GetRoot());
+  return false;
+}
+
+}
Index: /tags/DummyModules/VUT/GtpVisibility/src/DummyQueryManager.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/src/DummyQueryManager.cpp	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibility/src/DummyQueryManager.cpp	(revision 65)
@@ -0,0 +1,44 @@
+#include "DummyQueryManager.h"
+
+
+namespace GtpVisibility {
+
+  /** 
+	Uses explicit camera to execute the visibility query
+  */
+  void
+  DummyQueryManager::ComputeCameraVisibility(const Camera &camera,
+					     InfoContainer<NodeInfo> *visibleNodes,
+					     InfoContainer<MeshInfo> *visibleGeometry,
+					     bool relativeVisibility
+					     )
+  {
+    visibleNodes->push_back(NodeInfo(mHierarchyInterface->GetSceneRoot(), 1.0f));
+    
+//      HierarchyInterface::MeshIterator *mi =
+//        hierarchyInterface->GetMeshIterator(hierarchyInterface->GetRoot());
+    
+//      for (; mi(); mi++)
+//        visibleGeometry.push_back(MeshInfo(*mi, 1.0f));
+  }
+  
+  /** 
+      Uses the specified point to execute the visibility query in all directions
+  */
+  void
+  DummyQueryManager::ComputeFromPointVisibility(const Vector3 &point,
+						InfoContainer<NodeInfo> *visibleNodes,
+						InfoContainer<MeshInfo> *visibleGeometry,
+						bool relativeVisibility
+						)
+  {
+    visibleNodes->push_back(NodeInfo(mHierarchyInterface->GetSceneRoot(), 1.0f));
+    
+//      HierarchyInterface::MeshIterator *mi =
+//        hierarchyInterface->GetMeshIterator(hierarchyInterface->GetRoot());
+    
+//      for (; mi(); mi++)
+//        visibleGeometry.push_back(MeshInfo(*mi, 1.0f));
+  }
+  
+};
Index: /tags/DummyModules/VUT/GtpVisibility/src/VisibilityEnvironment.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibility/src/VisibilityEnvironment.cpp	(revision 59)
+++ /tags/DummyModules/VUT/GtpVisibility/src/VisibilityEnvironment.cpp	(revision 59)
@@ -0,0 +1,13 @@
+#include "VisibilityEnvironment.h"
+
+namespace GtpVisibility {
+
+VisibilityEnvironment::VisibilityEnvironment()
+{
+}
+	
+void VisibilityEnvironment::LoadEnvironment()
+{
+}
+
+} // namespace GtpVisibility
Index: /tags/DummyModules/VUT/chcdemo/stdafx.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/stdafx.h	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/stdafx.h	(revision 10)
@@ -0,0 +1,12 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+
+#include <iostream>
+#include <tchar.h>
+
+// TODO: reference additional headers your program requires here
Index: /tags/DummyModules/VUT/chcdemo/DataTypes.c
===================================================================
--- /tags/DummyModules/VUT/chcdemo/DataTypes.c	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/DataTypes.c	(revision 10)
@@ -0,0 +1,225 @@
+//Copyright and Disclaimer:
+//This code is copyright Vienna University of Technology, 2004.
+
+#include <memory.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include "DataTypes.h"
+#include "MathStuff.h"
+
+const struct Object OBJECT_NULL = { 0, 0 };
+const struct VecPoint VECPOINT_NULL = { 0, 0 };
+const struct VecPlane VECPLANE_NULL = { 0, 0 };
+
+void copyVector3(Vector3 result, const Vector3 input) {
+	result[0] = input[0]; 
+	result[1] = input[1];
+	result[2] = input[2];
+}
+
+void addVector3(Vector3 result, const Vector3 a, const Vector3 b) {
+	int i;
+	for(i = 0; i < 3; i++) {
+		result[i] = a[i]+b[i];
+	}
+}
+
+void diffVector3(Vector3 result, const Vector3 a, const Vector3 b) {
+	int i;
+	for(i = 0; i < 3; i++) {
+		result[i] = a[i]-b[i];
+	}
+}
+
+void copyVector3Values(Vector3 result, const double x, const double y, const double z) {
+	result[0] = x; 
+	result[1] = y;
+	result[2] = z;
+}
+
+void copyMatrix(Matrix4x4 result, const Matrix4x4 input) {
+	if(input != result) {
+		memcpy(result,input,4*4*sizeof(double));
+	}
+}
+
+void planesSetSize(struct VecPlane* p, const int size) {
+	if(0 != p) {
+		if(size == p->size) {
+			return;
+		}
+		p->plane = (struct Plane*)realloc(p->plane,size*sizeof(struct Plane));
+		p->size = size;
+	}
+}
+
+void emptyVecPlane(struct VecPlane* p) {
+	planesSetSize(p,0);
+}
+
+void vecPointSetSize(struct VecPoint* poly, const int size) {
+	if(0 != poly) {
+		if(size == poly->size) {
+			return;
+		}
+		poly->points = (Vector3*)realloc(poly->points,size*sizeof(Vector3));
+		poly->size = size;
+	}
+}
+
+void emptyVecPoint(struct VecPoint* poly) {
+	vecPointSetSize(poly,0);
+}
+
+void append2VecPoint(struct VecPoint* poly, const Vector3 p) {
+	if(0 != poly) {
+		int size = poly->size;
+		vecPointSetSize(poly,size+1);
+		copyVector3(poly->points[size],p);
+	}
+}
+
+void copyVecPoint(struct VecPoint* poly, const struct VecPoint poly2) {
+	if(0 != poly) {
+		int i;
+		vecPointSetSize(poly,poly2.size);
+		for(i= 0; i < poly2.size; i++) {
+			copyVector3(poly->points[i],poly2.points[i]);
+		}
+	}
+}
+
+void swapVecPoint(struct VecPoint* poly1, struct VecPoint* poly2) {
+	if(0 != poly1 && 0 != poly2 && poly1 != poly2) {
+		{
+			Vector3* points = poly1->points;
+			poly1->points = poly2->points;
+			poly2->points = points;
+		}
+		{
+			int size = poly1->size;
+			poly1->size = poly2->size;
+			poly2->size = size;
+		}
+	}
+}
+
+void objectSetSize(struct Object* obj, const int size) {
+	if(0 != obj) {
+		int i;
+		if(size == obj->size) {
+			return;
+		}
+		//dispose if shrinking
+		for(i = size; i < obj->size; i++) {
+			emptyVecPoint( &(obj->poly[i]) ); 
+		}
+		//allocate new place
+		obj->poly = (struct VecPoint*)realloc(obj->poly,size*sizeof(struct VecPoint));
+		//initialize new place
+		for(i = obj->size; i < size; i++) {
+			obj->poly[i] = VECPOINT_NULL;
+		}
+		obj->size = size;
+	}
+}
+
+void emptyObject(struct Object* obj) {
+	objectSetSize(obj,0);
+}
+
+void copyObject(struct Object* obj, const struct Object objIn) {
+	if(0 != obj) {
+		int i;
+		objectSetSize(obj,objIn.size);
+		for(i = 0; i < objIn.size; i++) {
+			copyVecPoint( &(obj->poly[i]), objIn.poly[i]);
+		}
+	}
+}
+
+void append2Object(struct Object* obj, const struct VecPoint poly) {
+	if(0 != obj) {
+		int size = obj->size;
+		objectSetSize(obj,size+1);
+		copyVecPoint( &(obj->poly[size]) ,poly);
+	}
+}
+
+
+void convObject2VecPoint(struct VecPoint* points,const struct Object obj) {
+	if(0 != points) {
+		int i, j;
+		emptyVecPoint(points);
+		for(i = 0; i < obj.size; i++) {
+			struct VecPoint* p = &(obj.poly[i]);
+			for(j = 0; j < p->size; j++) {
+				append2VecPoint(points,p->points[j]);
+			}
+		}
+	}
+}
+
+void calcAABoxPoints(Vector3x8 points, const struct AABox b) {
+    //generate 8 corners of the box
+	copyVector3Values(points[0],b.min[0],b.min[1],b.min[2]);//     7+------+6
+	copyVector3Values(points[1],b.max[0],b.min[1],b.min[2]);//     /|     /|
+	copyVector3Values(points[2],b.max[0],b.max[1],b.min[2]);//    / |    / |
+	copyVector3Values(points[3],b.min[0],b.max[1],b.min[2]);//   / 4+---/--+5
+	copyVector3Values(points[4],b.min[0],b.min[1],b.max[2]);// 3+------+2 /    y   z
+	copyVector3Values(points[5],b.max[0],b.min[1],b.max[2]);//  | /    | /     |  /
+	copyVector3Values(points[6],b.max[0],b.max[1],b.max[2]);//  |/     |/      |/
+	copyVector3Values(points[7],b.min[0],b.max[1],b.max[2]);// 0+------+1      *---x
+}
+
+void calcAABoxPlanes(struct VecPlane* planes, const struct AABox b) {
+	if(0 != planes) {
+		struct Plane *p;
+		planesSetSize(planes,6);
+		
+		//bottom plane
+		p = &(planes->plane[0]);
+		copyVector3Values(p->n,0,-1,0);
+		p->d = absDouble(b.min[1]);
+
+		//top plane
+		p = &(planes->plane[1]);
+		copyVector3Values(p->n,0,1,0);
+		p->d = absDouble(b.max[1]);
+
+		//left plane
+		p = &(planes->plane[2]);
+		copyVector3Values(p->n,-1,0,0);
+		p->d = absDouble(b.min[0]);
+
+		//right plane
+		p = &(planes->plane[3]);
+		copyVector3Values(p->n,1,0,0);
+		p->d = absDouble(b.max[0]);
+
+		//back plane
+		p = &(planes->plane[4]);
+		copyVector3Values(p->n,0,0,-1);
+		p->d = absDouble(b.min[2]);
+
+		//front plane
+		p = &(planes->plane[5]);
+		copyVector3Values(p->n,0,0,1);
+		p->d = absDouble(b.max[2]);
+
+	}
+}
+
+double getPlaneCoeff(struct Plane* plane, int i)
+{
+	if(i < 3) return plane->n[i];
+	return plane->d;
+}
+
+void setPlaneCoeff(double coeff, struct Plane* plane, int i)
+{
+	if(i < 3) 
+		plane->n[i] = coeff;
+	else 
+		plane->d = coeff;
+}
Index: /tags/DummyModules/VUT/chcdemo/Geometry.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/Geometry.h	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/Geometry.h	(revision 10)
@@ -0,0 +1,141 @@
+#ifndef NO_PRAGMA_ONCE
+#pragma once
+#endif
+
+#ifndef GEOMETRY_H
+#define GEOMETRY_H
+
+extern "C"
+{
+	#include "MathStuff.h"
+}
+
+/** Represents a drawable geometry. It can draw simple objects (teapot,
+	torus, shere. It also contains the object transformation and 
+	the material .An AAB is used as bouning volume.
+*/
+class Geometry
+{
+public:
+	Geometry();
+	Geometry(Vector3 translation, float xRot, float yRot, float zRot, float scale, int objectType);
+	//! renders this geometry
+	void Render();
+	
+	//! sets rotations in degree : executed in the order x, y, and z rotation
+	void SetRotations(float xRot, float yRot, float zRot);
+	//! sets the rotation matrix
+	void SetTranslation(Vector3 translation);
+	//! a uniform scale
+	void SetScale(float scale);
+	//! returns current scale
+	float GetScale();
+
+	//! returns translation
+	void GetTranslation(Vector3 translation);
+	//! returns rotation
+	void GetRotations(float &xRot, float &yRot, float &zRot);
+
+	// --- material settings
+	void SetAmbientColor(float ambientR,   float ambientG,  float ambientB);
+	void SetDiffuseColor(float diffuseR,   float diffuseG,  float diffuseB);
+	void SetSpecularColor(float specularR, float specularG, float specularB);
+
+	const AABox& GetBoundingVolume();
+		
+	//! last visited flag, important for rendering each geometry only once
+	void SetLastVisited(int lastVisited);
+	//! returns lastvisited flag
+	int GetLastVisited();
+
+	// --- sets the object type to one of teapot, torus, sphere
+	void SetObjectType(int type);
+
+	enum{TEAPOT, TORUS, SPHERE, NUM_OBJECTS};
+	
+	static int sDisplayList[NUM_OBJECTS];
+	
+	//! cleans static members
+	static void CleanUp();
+	//! returns the triangle count of the specified object type
+	static int CountTriangles(int objectType);
+	//! initialises display lists
+	static void ResetLists(); 
+
+protected:
+	//! generates the display list this a object
+	void GenerateList();
+
+	//! calculates accumulated transformation matrix
+	void CalcTransform();
+	//! applies tranformations
+	void Transform();
+
+	// --- statistics
+	static int CountTorusTriangles();
+	static int CountSphereTriangles();
+	static int CountTeapotTriangles();
+
+	//!
+	static void CreateTorus(float innerRadius, float outerRadius, int precision);
+
+	//! calculates the bounding volume of this geometry
+	void CalcBoundingVolume();
+	// the size of the bounging box is calculated using the radius of the sphere
+	void CalcSphereBoundingVolume();
+	// the standard bounding volume calculation having an array of vertices
+	void CalcBoundingVolume(float *vertices, const int num_vertices);
+
+	// initialises static members
+	static bool Init();
+
+	// --- drawing routines
+	static void RenderTeapot();
+	static void RenderSphere();
+	static void RenderTorus();
+
+	// --- transformations
+	float mXRotation;
+	float mYRotation;
+	float mZRotation;
+	
+	float mScale;
+
+	Vector3 mTranslation;
+	
+	//! accumulated transform matrix 
+	Matrix4x4 mTransform;
+
+	// --- material
+	float mAmbientColor[3];
+	float mDiffuseColor[3];
+	float mSpecularColor[3];
+
+	AABox mBoundingBox;
+	//! type of the rendered object (teapot, sphere ...)
+	int mObjectType;
+	
+	int mLastVisited;
+
+	// --- static members
+
+	static bool sIsInitialised;
+
+	static float const sphere_radius;
+	
+	static int num_torus_indices;
+	static int num_torus_vertices;
+	static int num_torus_normals;
+
+	static float *torus_vertices;
+	static float *torus_normals;
+	static int *torus_indices;
+
+	static const int torus_precision;
+	static const int sphere_precision;
+	static const float torus_inner_radius;
+	static const float torus_outer_radius;
+};
+
+
+#endif // GEOMETRY_H
Index: /tags/DummyModules/VUT/chcdemo/teapot.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/teapot.h	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/teapot.h	(revision 10)
@@ -0,0 +1,3071 @@
+#ifndef TEAPOT_H
+#define TEAPOT_H
+
+const int num_teapot_indices = 2781;
+const int num_teapot_vertices = 1364;
+const int num_teapot_normals = 1364;
+
+float teapot_vertices [] = {
+							0.0663056, 0.117825, 2.10688e-008,
+							0.0672, 0.1152, 2.05994e-008,
+							0.0639726, 0.117825, 0.0178043,
+							0.0648356, 0.1152, 0.0180445,
+							0.0573666, 0.117825, 0.0336931,
+							0.0581404, 0.1152, 0.0341476,
+							0.0470769, 0.117825, 0.0470769,
+							0.047712, 0.1152, 0.047712,
+							0.033693, 0.117825, 0.0573666,
+							0.0341476, 0.1152, 0.0581404,
+							0.0178043, 0.117825, 0.0639726,
+							0.0180444, 0.1152, 0.0648356,
+							0, 0.117825, 0.0663056,
+							0, 0.1152, 0.0672,
+							0.0664444, 0.1194, 2.13504e-008,
+							0.0641066, 0.1194, 0.0178416,
+							0.0574868, 0.1194, 0.0337636,
+							0.0471755, 0.1194, 0.0471756,
+							0.0337636, 0.1194, 0.0574868,
+							0.0178416, 0.1194, 0.0641066,
+							0, 0.1194, 0.0664444,
+							0.06735, 0.119925, 2.14443e-008,
+							0.0649803, 0.119925, 0.0180847,
+							0.0582702, 0.119925, 0.0342238,
+							0.0478185, 0.119925, 0.0478185,
+							0.0342238, 0.119925, 0.0582702,
+							0.0180847, 0.119925, 0.0649803,
+							0, 0.119925, 0.06735,
+							0.0687556, 0.1194, 2.13504e-008,
+							0.0663364, 0.1194, 0.0184622,
+							0.0594863, 0.1194, 0.034938,
+							0.0488164, 0.1194, 0.0488164,
+							0.034938, 0.1194, 0.0594863,
+							0.0184621, 0.1194, 0.0663364,
+							0, 0.1194, 0.0687556,
+							0.0703944, 0.117825, 2.10688e-008,
+							0.0679176, 0.117825, 0.0189022,
+							0.0609042, 0.117825, 0.0357708,
+							0.0499801, 0.117825, 0.0499801,
+							0.0357708, 0.117825, 0.0609042,
+							0.0189022, 0.117825, 0.0679176,
+							0, 0.117825, 0.0703944,
+							0.072, 0.1152, 2.05994e-008,
+							0.0694667, 0.1152, 0.0193333,
+							0.0622933, 0.1152, 0.0365867,
+							0.05112, 0.1152, 0.05112,
+							0.0365867, 0.1152, 0.0622933,
+							0.0193333, 0.1152, 0.0694667,
+							0, 0.1152, 0.072,
+							-0.0178043, 0.117825, 0.0639726,
+							-0.0180444, 0.1152, 0.0648356,
+							-0.033693, 0.117825, 0.0573666,
+							-0.0341476, 0.1152, 0.0581404,
+							-0.0470769, 0.117825, 0.0470769,
+							-0.047712, 0.1152, 0.047712,
+							-0.0573666, 0.117825, 0.033693,
+							-0.0581404, 0.1152, 0.0341476,
+							-0.0639726, 0.117825, 0.0178043,
+							-0.0648356, 0.1152, 0.0180445,
+							-0.0663056, 0.117825, 2.10688e-008,
+							-0.0672, 0.1152, 2.05994e-008,
+							-0.0178416, 0.1194, 0.0641066,
+							-0.0337636, 0.1194, 0.0574867,
+							-0.0471756, 0.1194, 0.0471756,
+							-0.0574867, 0.1194, 0.0337636,
+							-0.0641066, 0.1194, 0.0178416,
+							-0.0664444, 0.1194, 2.13504e-008,
+							-0.0180847, 0.119925, 0.0649803,
+							-0.0342238, 0.119925, 0.0582702,
+							-0.0478185, 0.119925, 0.0478185,
+							-0.0582702, 0.119925, 0.0342238,
+							-0.0649803, 0.119925, 0.0180847,
+							-0.06735, 0.119925, 2.14443e-008,
+							0, 0.1194, 0.0687556,
+							-0.0184621, 0.1194, 0.0663364,
+							-0.034938, 0.1194, 0.0594863,
+							-0.0488164, 0.1194, 0.0488164,
+							-0.0594863, 0.1194, 0.034938,
+							-0.0663364, 0.1194, 0.0184621,
+							-0.0687556, 0.1194, 2.13504e-008,
+							0, 0.117825, 0.0703944,
+							-0.0189022, 0.117825, 0.0679176,
+							-0.0357708, 0.117825, 0.0609042,
+							-0.0499801, 0.117825, 0.0499801,
+							-0.0609042, 0.117825, 0.0357708,
+							-0.0679176, 0.117825, 0.0189022,
+							-0.0703944, 0.117825, 2.10688e-008,
+							-0.0193333, 0.1152, 0.0694667,
+							-0.0365867, 0.1152, 0.0622933,
+							-0.05112, 0.1152, 0.05112,
+							-0.0622933, 0.1152, 0.0365867,
+							-0.0694667, 0.1152, 0.0193333,
+							-0.072, 0.1152, 2.05994e-008,
+							-0.0663055, 0.117825, 2.10688e-008,
+							-0.0639726, 0.117825, -0.0178043,
+							-0.0648356, 0.1152, -0.0180444,
+							-0.0573666, 0.117825, -0.033693,
+							-0.0581404, 0.1152, -0.0341475,
+							-0.0470769, 0.117825, -0.0470769,
+							-0.047712, 0.1152, -0.047712,
+							-0.033693, 0.117825, -0.0573666,
+							-0.0341476, 0.1152, -0.0581404,
+							-0.0178043, 0.117825, -0.0639726,
+							-0.0180444, 0.1152, -0.0648356,
+							0, 0.117825, -0.0663055,
+							0, 0.1152, -0.0672,
+							-0.0664444, 0.1194, 2.13504e-008,
+							-0.0641066, 0.1194, -0.0178416,
+							-0.0574867, 0.1194, -0.0337636,
+							-0.0471756, 0.1194, -0.0471756,
+							-0.0337636, 0.1194, -0.0574868,
+							-0.0178416, 0.1194, -0.0641066,
+							0, 0.1194, -0.0664444,
+							-0.0649803, 0.119925, -0.0180847,
+							-0.0582702, 0.119925, -0.0342238,
+							-0.0478185, 0.119925, -0.0478185,
+							-0.0342238, 0.119925, -0.0582702,
+							-0.0180847, 0.119925, -0.0649803,
+							0, 0.119925, -0.06735,
+							-0.0663364, 0.1194, -0.0184621,
+							-0.0594863, 0.1194, -0.034938,
+							-0.0488164, 0.1194, -0.0488164,
+							-0.034938, 0.1194, -0.0594863,
+							-0.0184621, 0.1194, -0.0663364,
+							0, 0.1194, -0.0687556,
+							-0.0703944, 0.117825, 2.10688e-008,
+							-0.0679176, 0.117825, -0.0189022,
+							-0.0609042, 0.117825, -0.0357708,
+							-0.0499801, 0.117825, -0.0499801,
+							-0.0357708, 0.117825, -0.0609042,
+							-0.0189022, 0.117825, -0.0679176,
+							0, 0.117825, -0.0703944,
+							-0.0694667, 0.1152, -0.0193333,
+							-0.0622933, 0.1152, -0.0365867,
+							-0.05112, 0.1152, -0.05112,
+							-0.0365867, 0.1152, -0.0622933,
+							-0.0193333, 0.1152, -0.0694667,
+							0, 0.1152, -0.072,
+							0.0178043, 0.117825, -0.0639726,
+							0.0180444, 0.1152, -0.0648356,
+							0.033693, 0.117825, -0.0573666,
+							0.0341476, 0.1152, -0.0581404,
+							0.0470769, 0.117825, -0.0470769,
+							0.047712, 0.1152, -0.047712,
+							0.0573666, 0.117825, -0.033693,
+							0.0581404, 0.1152, -0.0341475,
+							0.0639726, 0.117825, -0.0178043,
+							0.0648356, 0.1152, -0.0180444,
+							0.0663055, 0.117825, 2.10688e-008,
+							0.0178416, 0.1194, -0.0641066,
+							0.0337636, 0.1194, -0.0574867,
+							0.0471756, 0.1194, -0.0471756,
+							0.0574868, 0.1194, -0.0337636,
+							0.0641066, 0.1194, -0.0178415,
+							0.0664444, 0.1194, 2.13504e-008,
+							0.0180847, 0.119925, -0.0649803,
+							0.0342238, 0.119925, -0.0582702,
+							0.0478185, 0.119925, -0.0478185,
+							0.0582702, 0.119925, -0.0342238,
+							0.0649803, 0.119925, -0.0180847,
+							0.0184621, 0.1194, -0.0663364,
+							0.034938, 0.1194, -0.0594863,
+							0.0488164, 0.1194, -0.0488164,
+							0.0594863, 0.1194, -0.034938,
+							0.0663364, 0.1194, -0.0184621,
+							0.0687556, 0.1194, 2.13504e-008,
+							0.0189022, 0.117825, -0.0679176,
+							0.0357708, 0.117825, -0.0609042,
+							0.0499801, 0.117825, -0.0499801,
+							0.0609042, 0.117825, -0.0357708,
+							0.0679176, 0.117825, -0.0189022,
+							0.0703944, 0.117825, 2.10688e-008,
+							0.0193333, 0.1152, -0.0694667,
+							0.0365867, 0.1152, -0.0622933,
+							0.05112, 0.1152, -0.05112,
+							0.0622933, 0.1152, -0.0365867,
+							0.0694667, 0.1152, -0.0193333,
+							0.0779444, 0.102617, 1.83493e-008,
+							0.075202, 0.102617, 0.0209295,
+							0.0694667, 0.1152, 0.0193333,
+							0.0674364, 0.102617, 0.0396073,
+							0.0622933, 0.1152, 0.0365867,
+							0.0553406, 0.102617, 0.0553406,
+							0.0396073, 0.102617, 0.0674364,
+							0.0365867, 0.1152, 0.0622933,
+							0.0209296, 0.102617, 0.0752019,
+							0.0193334, 0.1152, 0.0694667,
+							0, 0.102617, 0.0779444,
+							0.0835556, 0.0901333, 1.61171e-008,
+							0.0806156, 0.0901333, 0.0224362,
+							0.072291, 0.0901333, 0.0424586,
+							0.0593244, 0.0901334, 0.0593245,
+							0.0424586, 0.0901333, 0.072291,
+							0.0224362, 0.0901333, 0.0806156,
+							0, 0.0901333, 0.0835556,
+							0.0885, 0.07785, 1.39207e-008,
+							0.0853861, 0.07785, 0.0237639,
+							0.0765689, 0.07785, 0.0449711,
+							0.062835, 0.07785, 0.062835,
+							0.0449711, 0.07785, 0.0765689,
+							0.0237639, 0.07785, 0.0853861,
+							0, 0.07785, 0.0885,
+							0.0924444, 0.0658667, 1.17779e-008,
+							0.0891918, 0.0658667, 0.024823,
+							0.0799816, 0.0658667, 0.0469755,
+							0.0656356, 0.0658667, 0.0656356,
+							0.0469755, 0.0658667, 0.0799816,
+							0.0248231, 0.0658667, 0.0891918,
+							0, 0.0658667, 0.0924444,
+							0.0950556, 0.0542833, 9.7066e-009,
+							0.091711, 0.0542833, 0.0255242,
+							0.0822407, 0.0542833, 0.0483023,
+							0.0674895, 0.0542833, 0.0674895,
+							0.0483023, 0.0542833, 0.0822406,
+							0.0255242, 0.0542833, 0.091711,
+							0, 0.0542833, 0.0950556,
+							0.096, 0.0432, 7.72476e-009,
+							0.0926222, 0.0432, 0.0257778,
+							0.0830578, 0.0432, 0.0487822,
+							0.06816, 0.0432, 0.06816,
+							0.0487822, 0.0432, 0.0830578,
+							0.0257778, 0.0432, 0.0926222,
+							0, 0.0432, 0.096,
+							0, 0.102617, 0.0779444,
+							-0.0209295, 0.102617, 0.075202,
+							-0.0193333, 0.1152, 0.0694667,
+							-0.0396073, 0.102617, 0.0674364,
+							-0.0365867, 0.1152, 0.0622933,
+							-0.0553405, 0.102617, 0.0553405,
+							-0.0674364, 0.102617, 0.0396073,
+							-0.0622933, 0.1152, 0.0365867,
+							-0.075202, 0.102617, 0.0209296,
+							-0.0694667, 0.1152, 0.0193334,
+							-0.0779444, 0.102617, 1.83493e-008,
+							0, 0.0901333, 0.0835555,
+							-0.0224362, 0.0901333, 0.0806156,
+							-0.0424586, 0.0901333, 0.072291,
+							-0.0593244, 0.0901334, 0.0593244,
+							-0.072291, 0.0901334, 0.0424586,
+							-0.0806156, 0.0901333, 0.0224362,
+							-0.0835555, 0.0901333, 1.61171e-008,
+							-0.0237639, 0.07785, 0.0853861,
+							-0.0449711, 0.07785, 0.0765689,
+							-0.062835, 0.07785, 0.062835,
+							-0.0765689, 0.07785, 0.0449711,
+							-0.0853861, 0.07785, 0.0237639,
+							-0.0885, 0.07785, 1.39207e-008,
+							0, 0.0658667, 0.0924444,
+							-0.024823, 0.0658667, 0.0891918,
+							-0.0469755, 0.0658667, 0.0799816,
+							-0.0656356, 0.0658667, 0.0656356,
+							-0.0799816, 0.0658667, 0.0469755,
+							-0.0891918, 0.0658667, 0.0248231,
+							-0.0924444, 0.0658667, 1.17779e-008,
+							0, 0.0542833, 0.0950556,
+							-0.0255242, 0.0542833, 0.091711,
+							-0.0483023, 0.0542833, 0.0822407,
+							-0.0674894, 0.0542834, 0.0674894,
+							-0.0822406, 0.0542834, 0.0483023,
+							-0.091711, 0.0542833, 0.0255242,
+							-0.0950556, 0.0542833, 9.70661e-009,
+							-0.0257778, 0.0432, 0.0926222,
+							-0.0487822, 0.0432, 0.0830578,
+							-0.06816, 0.0432, 0.06816,
+							-0.0830578, 0.0432, 0.0487822,
+							-0.0926222, 0.0432, 0.0257778,
+							-0.096, 0.0432, 7.72476e-009,
+							-0.0779444, 0.102617, 1.83493e-008,
+							-0.075202, 0.102617, -0.0209295,
+							-0.0694667, 0.1152, -0.0193333,
+							-0.0674364, 0.102617, -0.0396073,
+							-0.0622933, 0.1152, -0.0365866,
+							-0.0553406, 0.102617, -0.0553406,
+							-0.0396073, 0.102617, -0.0674364,
+							-0.0365867, 0.1152, -0.0622933,
+							-0.0209296, 0.102617, -0.0752019,
+							-0.0193334, 0.1152, -0.0694667,
+							0, 0.102617, -0.0779444,
+							-0.0835556, 0.0901333, 1.61171e-008,
+							-0.0806156, 0.0901333, -0.0224362,
+							-0.072291, 0.0901333, -0.0424586,
+							-0.0593244, 0.0901333, -0.0593244,
+							-0.0424586, 0.0901333, -0.072291,
+							-0.0224362, 0.0901333, -0.0806156,
+							0, 0.0901333, -0.0835556,
+							-0.0853861, 0.07785, -0.0237639,
+							-0.0765689, 0.07785, -0.0449711,
+							-0.062835, 0.07785, -0.062835,
+							-0.0449711, 0.07785, -0.0765689,
+							-0.0237639, 0.07785, -0.0853861,
+							0, 0.07785, -0.0885,
+							-0.0924444, 0.0658666, 1.17779e-008,
+							-0.0891918, 0.0658666, -0.024823,
+							-0.0799816, 0.0658666, -0.0469755,
+							-0.0656356, 0.0658666, -0.0656356,
+							-0.0469755, 0.0658666, -0.0799816,
+							-0.0248231, 0.0658666, -0.0891918,
+							0, 0.0658666, -0.0924444,
+							-0.0950556, 0.0542833, 9.7066e-009,
+							-0.091711, 0.0542833, -0.0255242,
+							-0.0822407, 0.0542833, -0.0483023,
+							-0.0674894, 0.0542833, -0.0674894,
+							-0.0483023, 0.0542833, -0.0822407,
+							-0.0255242, 0.0542833, -0.091711,
+							0, 0.0542833, -0.0950556,
+							-0.0926222, 0.0432, -0.0257778,
+							-0.0830578, 0.0432, -0.0487822,
+							-0.06816, 0.0432, -0.06816,
+							-0.0487822, 0.0432, -0.0830578,
+							-0.0257778, 0.0432, -0.0926222,
+							0, 0.0432, -0.096,
+							0.0209295, 0.102617, -0.075202,
+							0.0193333, 0.1152, -0.0694667,
+							0.0396073, 0.102617, -0.0674364,
+							0.0365867, 0.1152, -0.0622933,
+							0.0553406, 0.102617, -0.0553406,
+							0.0674364, 0.102617, -0.0396073,
+							0.0622933, 0.1152, -0.0365867,
+							0.0752019, 0.102617, -0.0209295,
+							0.0694667, 0.1152, -0.0193333,
+							0.0779444, 0.102617, 1.83493e-008,
+							0.0224362, 0.0901333, -0.0806156,
+							0.0424586, 0.0901333, -0.072291,
+							0.0593244, 0.0901333, -0.0593244,
+							0.072291, 0.0901333, -0.0424586,
+							0.0806156, 0.0901333, -0.0224362,
+							0.0835556, 0.0901333, 1.61171e-008,
+							0.0237639, 0.07785, -0.0853861,
+							0.0449711, 0.07785, -0.0765689,
+							0.062835, 0.07785, -0.062835,
+							0.0765689, 0.07785, -0.0449711,
+							0.0853861, 0.07785, -0.0237639,
+							0.024823, 0.0658666, -0.0891918,
+							0.0469755, 0.0658666, -0.0799816,
+							0.0656356, 0.0658666, -0.0656356,
+							0.0799816, 0.0658666, -0.0469755,
+							0.0891918, 0.0658666, -0.0248231,
+							0.0924444, 0.0658666, 1.17779e-008,
+							0.0255242, 0.0542833, -0.091711,
+							0.0483023, 0.0542833, -0.0822407,
+							0.0674894, 0.0542833, -0.0674894,
+							0.0822407, 0.0542833, -0.0483023,
+							0.091711, 0.0542833, -0.0255242,
+							0.0950556, 0.0542833, 9.7066e-009,
+							0.0257778, 0.0432, -0.0926222,
+							0.0487822, 0.0432, -0.0830578,
+							0.06816, 0.0432, -0.06816,
+							0.0830578, 0.0432, -0.0487822,
+							0.0926222, 0.0432, -0.0257778,
+							0.0942222, 0.0332833, 5.95152e-009,
+							0.090907, 0.0332833, 0.0253004,
+							0.0815197, 0.0332833, 0.0478788,
+							0.0668978, 0.0332833, 0.0668978,
+							0.0478789, 0.0332833, 0.0815197,
+							0.0253004, 0.0332833, 0.090907,
+							0, 0.0332833, 0.0942222,
+							0.0897778, 0.0250667, 4.48227e-009,
+							0.0866189, 0.0250667, 0.024107,
+							0.0776744, 0.0250667, 0.0456204,
+							0.0637422, 0.0250667, 0.0637422,
+							0.0456204, 0.0250667, 0.0776744,
+							0.024107, 0.0250667, 0.0866189,
+							0, 0.0250667, 0.0897778,
+							0.084, 0.01845, 3.29912e-009,
+							0.0810445, 0.01845, 0.0225556,
+							0.0726756, 0.01845, 0.0426844,
+							0.05964, 0.01845, 0.05964,
+							0.0426845, 0.01845, 0.0726755,
+							0.0225556, 0.01845, 0.0810444,
+							0, 0.01845, 0.084,
+							0.0782222, 0.0133334, 2.38419e-009,
+							0.07547, 0.0133333, 0.0210041,
+							0.0676767, 0.0133333, 0.0397485,
+							0.0555378, 0.0133333, 0.0555378,
+							0.0397485, 0.0133333, 0.0676767,
+							0.0210041, 0.0133333, 0.07547,
+							0, 0.0133333, 0.0782222,
+							0.0737778, 0.00961668, 1.7196e-009,
+							0.0711819, 0.00961668, 0.0198107,
+							0.0638315, 0.00961668, 0.03749,
+							0.0523822, 0.00961668, 0.0523822,
+							0.0374901, 0.00961668, 0.0638314,
+							0.0198107, 0.00961668, 0.0711819,
+							0, 0.00961668, 0.0737778,
+							0.072, 0.0072, 1.28746e-009,
+							0.0694667, 0.0072, 0.0193333,
+							0.0622933, 0.00719999, 0.0365867,
+							0.05112, 0.00719999, 0.05112,
+							0.0365867, 0.00719999, 0.0622933,
+							0.0193334, 0.00719999, 0.0694667,
+							0, 0.00719999, 0.072,
+							-0.0253004, 0.0332833, 0.090907,
+							-0.0478788, 0.0332833, 0.0815197,
+							-0.0668978, 0.0332833, 0.0668978,
+							-0.0815197, 0.0332833, 0.0478789,
+							-0.090907, 0.0332833, 0.0253004,
+							-0.0942222, 0.0332833, 5.95152e-009,
+							-0.024107, 0.0250667, 0.0866189,
+							-0.0456204, 0.0250667, 0.0776744,
+							-0.0637422, 0.0250667, 0.0637422,
+							-0.0776744, 0.0250667, 0.0456204,
+							-0.0866189, 0.0250667, 0.024107,
+							-0.0897778, 0.0250667, 4.48227e-009,
+							-0.0225556, 0.01845, 0.0810445,
+							-0.0426844, 0.01845, 0.0726756,
+							-0.05964, 0.01845, 0.05964,
+							-0.0726755, 0.01845, 0.0426845,
+							-0.0810444, 0.01845, 0.0225556,
+							-0.084, 0.01845, 3.29912e-009,
+							-0.0210041, 0.0133333, 0.07547,
+							-0.0397485, 0.0133333, 0.0676767,
+							-0.0555378, 0.0133333, 0.0555378,
+							-0.0676767, 0.0133333, 0.0397485,
+							-0.07547, 0.0133333, 0.0210041,
+							-0.0782222, 0.0133334, 2.38419e-009,
+							-0.0198107, 0.00961668, 0.0711819,
+							-0.03749, 0.00961667, 0.0638315,
+							-0.0523822, 0.00961668, 0.0523822,
+							-0.0638314, 0.00961668, 0.0374901,
+							-0.0711819, 0.00961668, 0.0198107,
+							-0.0737778, 0.00961668, 1.7196e-009,
+							-0.0193333, 0.00719999, 0.0694667,
+							-0.0365867, 0.00719999, 0.0622933,
+							-0.05112, 0.00719999, 0.05112,
+							-0.0622933, 0.00719999, 0.0365867,
+							-0.0694667, 0.0072, 0.0193334,
+							-0.072, 0.0072, 1.28746e-009,
+							-0.090907, 0.0332833, -0.0253004,
+							-0.0815197, 0.0332833, -0.0478788,
+							-0.0668978, 0.0332833, -0.0668978,
+							-0.0478789, 0.0332833, -0.0815197,
+							-0.0253004, 0.0332833, -0.090907,
+							0, 0.0332833, -0.0942222,
+							-0.0866189, 0.0250667, -0.024107,
+							-0.0776744, 0.0250667, -0.0456204,
+							-0.0637422, 0.0250667, -0.0637422,
+							-0.0456204, 0.0250667, -0.0776744,
+							-0.024107, 0.0250667, -0.0866189,
+							0, 0.0250667, -0.0897778,
+							-0.0810445, 0.01845, -0.0225556,
+							-0.0726756, 0.01845, -0.0426844,
+							-0.05964, 0.01845, -0.05964,
+							-0.0426845, 0.01845, -0.0726755,
+							-0.0225556, 0.01845, -0.0810444,
+							0, 0.01845, -0.084,
+							-0.07547, 0.0133334, -0.0210041,
+							-0.0676767, 0.0133334, -0.0397485,
+							-0.0555378, 0.0133334, -0.0555378,
+							-0.0397485, 0.0133334, -0.0676767,
+							-0.0210041, 0.0133334, -0.07547,
+							0, 0.0133334, -0.0782222,
+							-0.0711819, 0.00961669, -0.0198107,
+							-0.0638315, 0.00961669, -0.03749,
+							-0.0523822, 0.00961669, -0.0523822,
+							-0.0374901, 0.00961669, -0.0638314,
+							-0.0198107, 0.00961669, -0.0711819,
+							0, 0.00961669, -0.0737778,
+							-0.0694667, 0.0072, -0.0193333,
+							-0.0622933, 0.00720001, -0.0365867,
+							-0.05112, 0.00720001, -0.05112,
+							-0.0365867, 0.00720001, -0.0622933,
+							-0.0193334, 0.00720001, -0.0694667,
+							0, 0.00720001, -0.072,
+							0.0253004, 0.0332833, -0.090907,
+							0.0478788, 0.0332833, -0.0815197,
+							0.0668978, 0.0332833, -0.0668978,
+							0.0815197, 0.0332833, -0.0478789,
+							0.090907, 0.0332833, -0.0253004,
+							0.024107, 0.0250667, -0.0866189,
+							0.0456204, 0.0250667, -0.0776744,
+							0.0637422, 0.0250667, -0.0637422,
+							0.0776744, 0.0250667, -0.0456204,
+							0.0866189, 0.0250667, -0.024107,
+							0.0225556, 0.01845, -0.0810445,
+							0.0426844, 0.01845, -0.0726756,
+							0.05964, 0.01845, -0.05964,
+							0.0726755, 0.01845, -0.0426845,
+							0.0810444, 0.01845, -0.0225556,
+							0.0210041, 0.0133334, -0.07547,
+							0.0397485, 0.0133334, -0.0676767,
+							0.0555378, 0.0133334, -0.0555378,
+							0.0676767, 0.0133334, -0.0397485,
+							0.07547, 0.0133334, -0.0210041,
+							0.0198107, 0.00961669, -0.0711819,
+							0.03749, 0.00961669, -0.0638315,
+							0.0523822, 0.00961669, -0.0523822,
+							0.0638314, 0.00961669, -0.0374901,
+							0.0711819, 0.00961668, -0.0198107,
+							0.0193333, 0.00720001, -0.0694667,
+							0.0365867, 0.00720001, -0.0622933,
+							0.05112, 0.00720001, -0.05112,
+							0.0622933, 0.00720001, -0.0365867,
+							0.0694667, 0.0072, -0.0193334,
+							-0.0923778, 0.09715, 1.73718e-008,
+							-0.0768, 0.0972, 1.73807e-008,
+							-0.0924979, 0.0979463, 0.00600001,
+							-0.0764444, 0.098, 0.00600001,
+							-0.0927984, 0.099937, 0.00960001,
+							-0.0755556, 0.1, 0.00960001,
+							-0.0931889, 0.102525, 0.0108,
+							-0.0744, 0.1026, 0.0108,
+							-0.0935794, 0.105113, 0.0096,
+							-0.0732444, 0.1052, 0.0096,
+							-0.0938798, 0.107104, 0.006,
+							-0.0723556, 0.1072, 0.006,
+							-0.094, 0.1079, 1.9294e-008,
+							-0.072, 0.108, 1.93119e-008,
+							-0.105422, 0.0968, 1.73092e-008,
+							-0.105909, 0.0975704, 0.00600001,
+							-0.107128, 0.0994963, 0.00960001,
+							-0.108711, 0.102, 0.0108,
+							-0.110295, 0.104504, 0.0096,
+							-0.111513, 0.10643, 0.006,
+							-0.112, 0.1072, 1.91688e-008,
+							-0.1158, 0.09585, 1.71393e-008,
+							-0.116556, 0.09655, 0.00600001,
+							-0.118444, 0.0983, 0.00960001,
+							-0.1209, 0.100575, 0.0108,
+							-0.123356, 0.10285, 0.0096,
+							-0.125244, 0.1046, 0.006,
+							-0.126, 0.1053, 1.88291e-008,
+							-0.123378, 0.094, 1.68085e-008,
+							-0.124313, 0.094563, 0.00600001,
+							-0.12665, 0.0959704, 0.00960001,
+							-0.129689, 0.0978, 0.0108,
+							-0.132728, 0.0996296, 0.0096,
+							-0.135065, 0.101037, 0.006,
+							-0.136, 0.1016, 1.81675e-008,
+							-0.128022, 0.09095, 1.62631e-008,
+							-0.129058, 0.091287, 0.00600001,
+							-0.131646, 0.0921296, 0.00960001,
+							-0.135011, 0.093225, 0.0108,
+							-0.138376, 0.0943204, 0.0096,
+							-0.140965, 0.095163, 0.006,
+							-0.142, 0.0955, 1.70767e-008,
+							-0.1296, 0.0864, 1.54495e-008,
+							-0.130667, 0.0864, 0.00600001,
+							-0.133333, 0.0864, 0.00960001,
+							-0.1368, 0.0864, 0.0108,
+							-0.140267, 0.0864, 0.0096,
+							-0.142933, 0.0864, 0.006,
+							-0.144, 0.0864, 1.54495e-008,
+							-0.0938798, 0.107104, -0.00599999,
+							-0.0723556, 0.1072, -0.00599999,
+							-0.0935794, 0.105113, -0.0096,
+							-0.0732444, 0.1052, -0.0096,
+							-0.0931889, 0.102525, -0.0108,
+							-0.0744, 0.1026, -0.0108,
+							-0.0927983, 0.099937, -0.00959999,
+							-0.0755556, 0.1, -0.00959999,
+							-0.0924979, 0.0979463, -0.00599998,
+							-0.0764444, 0.098, -0.00599998,
+							-0.0923778, 0.09715, 1.73718e-008,
+							-0.112, 0.1072, 1.91688e-008,
+							-0.111513, 0.10643, -0.00599999,
+							-0.110295, 0.104504, -0.00959999,
+							-0.108711, 0.102, -0.0108,
+							-0.107128, 0.0994963, -0.00959999,
+							-0.105909, 0.0975704, -0.00599998,
+							-0.105422, 0.0968, 1.73092e-008,
+							-0.125244, 0.1046, -0.00599999,
+							-0.123356, 0.10285, -0.0096,
+							-0.1209, 0.100575, -0.0108,
+							-0.118444, 0.0983, -0.00959999,
+							-0.116556, 0.09655, -0.00599998,
+							-0.136, 0.1016, 1.81675e-008,
+							-0.135065, 0.101037, -0.00599999,
+							-0.132728, 0.0996296, -0.0096,
+							-0.129689, 0.0978, -0.0108,
+							-0.12665, 0.0959704, -0.00959999,
+							-0.124313, 0.094563, -0.00599998,
+							-0.123378, 0.094, 1.68085e-008,
+							-0.142, 0.0955, 1.70767e-008,
+							-0.140965, 0.095163, -0.00599999,
+							-0.138376, 0.0943204, -0.0096,
+							-0.135011, 0.093225, -0.0108,
+							-0.131646, 0.0921296, -0.00959999,
+							-0.129058, 0.091287, -0.00599998,
+							-0.128022, 0.09095, 1.62631e-008,
+							-0.142933, 0.0864, -0.00599999,
+							-0.140267, 0.0864, -0.0096,
+							-0.1368, 0.0864, -0.0108,
+							-0.133333, 0.0864, -0.00959999,
+							-0.130667, 0.0864, -0.00599998,
+							-0.128778, 0.0802, 1.43409e-008,
+							-0.129801, 0.079871, 0.00600001,
+							-0.132358, 0.0790484, 0.00960001,
+							-0.135683, 0.0779792, 0.0108,
+							-0.139008, 0.0769099, 0.0096,
+							-0.141566, 0.0760873, 0.006,
+							-0.142589, 0.0757583, 1.35466e-008,
+							-0.126222, 0.0728, 1.30176e-008,
+							-0.127118, 0.0722568, 0.00600001,
+							-0.129356, 0.0708988, 0.00960001,
+							-0.132267, 0.0691333, 0.0108,
+							-0.135177, 0.0673679, 0.0096,
+							-0.137416, 0.0660099, 0.00599999,
+							-0.138311, 0.0654667, 1.17063e-008,
+							-0.1218, 0.0648, 1.15871e-008,
+							-0.122489, 0.0641167, 0.00600001,
+							-0.124211, 0.0624083, 0.00960001,
+							-0.12645, 0.0601875, 0.0108,
+							-0.128689, 0.0579667, 0.0096,
+							-0.130411, 0.0562583, 0.00599999,
+							-0.1311, 0.055575, 9.93757e-009,
+							-0.115378, 0.0568, 1.01566e-008,
+							-0.115786, 0.0560099, 0.00600001,
+							-0.116807, 0.0540345, 0.0096,
+							-0.118133, 0.0514667, 0.0108,
+							-0.11946, 0.0488987, 0.0096,
+							-0.120481, 0.0469234, 0.00599999,
+							-0.120889, 0.0461333, 8.24927e-009,
+							-0.106822, 0.0494, 8.8334e-009,
+							-0.106881, 0.0484957, 0.00600001,
+							-0.107027, 0.0462349, 0.00960001,
+							-0.107217, 0.0432958, 0.0108,
+							-0.107407, 0.0403568, 0.0096,
+							-0.107553, 0.038096, 0.00599999,
+							-0.107611, 0.0371916, 6.65038e-009,
+							-0.0956444, 0.0421333, 0.00600001,
+							-0.0947556, 0.0394667, 0.0096,
+							-0.0936, 0.036, 0.0108,
+							-0.0924444, 0.0325333, 0.0096,
+							-0.0915556, 0.0298667, 0.00599999,
+							-0.0912, 0.0288, 5.14984e-009,
+							-0.141566, 0.0760873, -0.00599999,
+							-0.139008, 0.0769099, -0.0096,
+							-0.135683, 0.0779792, -0.0108,
+							-0.132358, 0.0790484, -0.00959999,
+							-0.129801, 0.079871, -0.00599998,
+							-0.137416, 0.0660099, -0.006,
+							-0.135177, 0.0673679, -0.0096,
+							-0.132267, 0.0691333, -0.0108,
+							-0.129356, 0.0708988, -0.00959999,
+							-0.127118, 0.0722568, -0.00599998,
+							-0.130411, 0.0562583, -0.006,
+							-0.128689, 0.0579667, -0.0096,
+							-0.12645, 0.0601875, -0.0108,
+							-0.124211, 0.0624083, -0.00959999,
+							-0.122489, 0.0641167, -0.00599998,
+							-0.120481, 0.0469234, -0.006,
+							-0.11946, 0.0488988, -0.0096,
+							-0.118133, 0.0514667, -0.0108,
+							-0.116807, 0.0540346, -0.00959999,
+							-0.115786, 0.0560099, -0.00599998,
+							-0.107553, 0.038096, -0.006,
+							-0.107407, 0.0403568, -0.0096,
+							-0.107217, 0.0432958, -0.0108,
+							-0.107027, 0.0462349, -0.00959999,
+							-0.106881, 0.0484957, -0.00599998,
+							-0.0915556, 0.0298667, -0.006,
+							-0.0924444, 0.0325333, -0.0096,
+							-0.0936, 0.036, -0.0108,
+							-0.0947556, 0.0394667, -0.00959999,
+							-0.0956445, 0.0421333, -0.00599998,
+							0.0988222, 0.0708667, 1.2672e-008,
+							0.0816, 0.0684, 1.22309e-008,
+							0.0994741, 0.0684099, 0.0125926,
+							0.0816, 0.0654667, 0.0132,
+							0.101104, 0.0622679, 0.0201482,
+							0.0816, 0.0581333, 0.02112,
+							0.103222, 0.0542833, 0.0226667,
+							0.0816, 0.0486, 0.02376,
+							0.105341, 0.0462987, 0.0201481,
+							0.0816, 0.0390666, 0.02112,
+							0.10697, 0.0401568, 0.0125926,
+							0.0816, 0.0317333, 0.0132,
+							0.107622, 0.0377, 6.74128e-009,
+							0.0816, 0.0288, 5.14984e-009,
+							0.108978, 0.0773333, 1.38283e-008,
+							0.109926, 0.0754568, 0.0110741,
+							0.112296, 0.0707654, 0.0177185,
+							0.115378, 0.0646667, 0.0199333,
+							0.118459, 0.0585679, 0.0177185,
+							0.12083, 0.0538765, 0.0110741,
+							0.121778, 0.052, 9.29832e-009,
+							0.1146, 0.0864, 1.54495e-008,
+							0.115667, 0.0851333, 0.00910001,
+							0.118333, 0.0819667, 0.01456,
+							0.1218, 0.07785, 0.01638,
+							0.125267, 0.0737333, 0.01456,
+							0.127933, 0.0705667, 0.00909999,
+							0.129, 0.0693, 1.23918e-008,
+							0.118222, 0.0966667, 1.72853e-008,
+							0.119407, 0.0959654, 0.00712594,
+							0.12237, 0.0942123, 0.0114015,
+							0.126222, 0.0919333, 0.0128267,
+							0.130074, 0.0896543, 0.0114015,
+							0.133037, 0.0879012, 0.00712592,
+							0.134222, 0.0872, 1.55926e-008,
+							0.122378, 0.106733, 1.90854e-008,
+							0.123859, 0.106479, 0.00560742,
+							0.127563, 0.105843, 0.00897186,
+							0.132378, 0.105017, 0.0100933,
+							0.137193, 0.10419, 0.00897185,
+							0.140896, 0.103554, 0.00560741,
+							0.142378, 0.1033, 1.84715e-008,
+							0.1296, 0.1152, 2.05994e-008,
+							0.131733, 0.1152, 0.00500001,
+							0.137067, 0.1152, 0.00800001,
+							0.144, 0.1152, 0.00900001,
+							0.150933, 0.1152, 0.008,
+							0.156267, 0.1152, 0.005,
+							0.1584, 0.1152, 2.05994e-008,
+							0.107622, 0.0377, 6.74128e-009,
+							0.10697, 0.0401568, -0.0125926,
+							0.0816, 0.0317333, -0.0132,
+							0.105341, 0.0462988, -0.0201482,
+							0.0816, 0.0390667, -0.02112,
+							0.103222, 0.0542833, -0.0226667,
+							0.0816, 0.0486, -0.02376,
+							0.101104, 0.0622679, -0.0201481,
+							0.0816, 0.0581334, -0.02112,
+							0.0994741, 0.0684099, -0.0125926,
+							0.0816, 0.0654667, -0.0132,
+							0.0988222, 0.0708667, 1.2672e-008,
+							0.121778, 0.052, 9.29832e-009,
+							0.12083, 0.0538765, -0.0110741,
+							0.118459, 0.0585679, -0.0177185,
+							0.115378, 0.0646667, -0.0199333,
+							0.112296, 0.0707654, -0.0177185,
+							0.109926, 0.0754568, -0.011074,
+							0.127933, 0.0705667, -0.0091,
+							0.125267, 0.0737333, -0.01456,
+							0.1218, 0.07785, -0.01638,
+							0.118333, 0.0819667, -0.01456,
+							0.115667, 0.0851333, -0.00909997,
+							0.134222, 0.0872, 1.55926e-008,
+							0.133037, 0.0879012, -0.00712592,
+							0.130074, 0.0896543, -0.0114015,
+							0.126222, 0.0919333, -0.0128267,
+							0.12237, 0.0942123, -0.0114015,
+							0.119407, 0.0959654, -0.0071259,
+							0.118222, 0.0966667, 1.72853e-008,
+							0.142378, 0.1033, 1.84715e-008,
+							0.140896, 0.103554, -0.0056074,
+							0.137193, 0.10419, -0.00897185,
+							0.132378, 0.105017, -0.0100933,
+							0.127563, 0.105843, -0.00897184,
+							0.123859, 0.106479, -0.00560739,
+							0.122378, 0.106733, 1.90854e-008,
+							0.156267, 0.1152, -0.00499999,
+							0.150933, 0.1152, -0.00799999,
+							0.144, 0.1152, -0.00899999,
+							0.137067, 0.1152, -0.00799999,
+							0.131733, 0.1152, -0.00499998,
+							0.131956, 0.1167, 2.08676e-008,
+							0.134228, 0.116732, 0.00485187,
+							0.139908, 0.116813, 0.00776297,
+							0.147292, 0.116919, 0.00873334,
+							0.154676, 0.117024, 0.00776297,
+							0.160356, 0.117105, 0.00485185,
+							0.162628, 0.117137, 2.09458e-008,
+							0.134044, 0.1176, 2.10285e-008,
+							0.136309, 0.117659, 0.0044815,
+							0.141972, 0.117807, 0.00717038,
+							0.149333, 0.118, 0.00806668,
+							0.156695, 0.118193, 0.00717038,
+							0.162357, 0.118341, 0.00448149,
+							0.164622, 0.1184, 2.11716e-008,
+							0.1356, 0.1179, 2.10822e-008,
+							0.137744, 0.117975, 0.00400002,
+							0.143106, 0.118162, 0.00640002,
+							0.150075, 0.118406, 0.00720001,
+							0.157044, 0.11865, 0.00640001,
+							0.162406, 0.118838, 0.00400001,
+							0.16455, 0.118912, 2.12632e-008,
+							0.136356, 0.1176, 2.10285e-008,
+							0.138298, 0.117674, 0.00351854,
+							0.143154, 0.117859, 0.00562965,
+							0.149467, 0.1181, 0.00633335,
+							0.155779, 0.118341, 0.00562964,
+							0.160635, 0.118526, 0.00351853,
+							0.162578, 0.1186, 2.12074e-008,
+							0.136044, 0.1167, 2.08676e-008,
+							0.137735, 0.116751, 0.00314817,
+							0.141963, 0.116878, 0.00503706,
+							0.147458, 0.117044, 0.00566668,
+							0.152954, 0.117209, 0.00503705,
+							0.157181, 0.117337, 0.00314816,
+							0.158872, 0.117387, 2.09906e-008,
+							0.1344, 0.1152, 2.05994e-008,
+							0.135822, 0.1152, 0.00300002,
+							0.139378, 0.1152, 0.00480002,
+							0.144, 0.1152, 0.00540002,
+							0.148622, 0.1152, 0.00480002,
+							0.152178, 0.1152, 0.00300001,
+							0.1536, 0.1152, 2.05994e-008,
+							0.160356, 0.117105, -0.00485184,
+							0.154676, 0.117024, -0.00776296,
+							0.147292, 0.116919, -0.00873333,
+							0.139908, 0.116813, -0.00776295,
+							0.134228, 0.116732, -0.00485183,
+							0.162357, 0.118341, -0.00448147,
+							0.156695, 0.118193, -0.00717036,
+							0.149333, 0.118, -0.00806666,
+							0.141972, 0.117807, -0.00717036,
+							0.136309, 0.117659, -0.00448146,
+							0.162406, 0.118837, -0.00399998,
+							0.157044, 0.11865, -0.00639999,
+							0.150075, 0.118406, -0.00719999,
+							0.143106, 0.118162, -0.00639998,
+							0.137744, 0.117975, -0.00399998,
+							0.160635, 0.118526, -0.0035185,
+							0.155779, 0.118341, -0.00562961,
+							0.149467, 0.1181, -0.00633332,
+							0.143154, 0.117859, -0.00562961,
+							0.138298, 0.117674, -0.00351849,
+							0.157181, 0.117337, -0.00314813,
+							0.152954, 0.117209, -0.00503702,
+							0.147458, 0.117044, -0.00566665,
+							0.141963, 0.116878, -0.00503701,
+							0.137735, 0.116751, -0.00314812,
+							0.152178, 0.1152, -0.00299998,
+							0.148622, 0.1152, -0.00479998,
+							0.144, 0.1152, -0.00539998,
+							0.139378, 0.1152, -0.00479998,
+							0.135822, 0.1152, -0.00299997,
+							0.0133778, 0.1501, 2.684e-008,
+							0, 0.1512, 2.70367e-008,
+							0.0129094, 0.1501, 0.00360378,
+							0, 0.1512, 2.70367e-008,
+							0.0115817, 0.1501, 0.00681272,
+							0, 0.1512, 2.70367e-008,
+							0.00951072, 0.1501, 0.00951074,
+							0.00681272, 0.1501, 0.0115817,
+							0.00360377, 0.1501, 0.0129094,
+							0, 0.1501, 0.0133778,
+							0.0174222, 0.1472, 2.63214e-008,
+							0.0168122, 0.1472, 0.00469302,
+							0.0150829, 0.1472, 0.00887204,
+							0.0123858, 0.1472, 0.0123858,
+							0.00887205, 0.1472, 0.0150829,
+							0.00469303, 0.1472, 0.0168122,
+							0, 0.1472, 0.0174222,
+							0.0156, 0.1431, 2.55883e-008,
+							0.0150536, 0.1431, 0.00420141,
+							0.0135049, 0.1431, 0.00794312,
+							0.0110895, 0.1431, 0.0110895,
+							0.00794312, 0.1431, 0.0135049,
+							0.00420141, 0.1431, 0.0150536,
+							0, 0.1431, 0.0156,
+							0.0113778, 0.1384, 2.47478e-008,
+							0.0109789, 0.1384, 0.00306257,
+							0.00984863, 0.1384, 0.00579109,
+							0.00808622, 0.1384, 0.00808624,
+							0.00579109, 0.1384, 0.00984864,
+							0.00306257, 0.1384, 0.0109789,
+							0, 0.1384, 0.0113778,
+							0.00822222, 0.1337, 2.39074e-008,
+							0.00793338, 0.1337, 0.00221015,
+							0.00711523, 0.1337, 0.00418109,
+							0.00584028, 0.1337, 0.0058403,
+							0.00418108, 0.1337, 0.00711524,
+							0.00221014, 0.1337, 0.0079334,
+							0, 0.1337, 0.00822224,
+							0.0096, 0.1296, 2.31743e-008,
+							0.00926222, 0.1296, 0.0025778,
+							0.00830578, 0.1296, 0.00487824,
+							0.006816, 0.1296, 0.00681602,
+							0.00487823, 0.1296, 0.00830579,
+							0.00257779, 0.1296, 0.00926224,
+							0, 0.1296, 0.00960002,
+							0, 0.1501, 0.0133778,
+							-0.00360375, 0.1501, 0.0129094,
+							-0.0068127, 0.1501, 0.0115817,
+							-0.00951072, 0.1501, 0.00951074,
+							-0.0115817, 0.1501, 0.00681274,
+							-0.0129094, 0.1501, 0.00360379,
+							-0.0133778, 0.1501, 2.684e-008,
+							0, 0.1472, 0.0174222,
+							-0.004693, 0.1472, 0.0168122,
+							-0.00887203, 0.1472, 0.0150829,
+							-0.0123858, 0.1472, 0.0123858,
+							-0.0150829, 0.1472, 0.00887207,
+							-0.0168122, 0.1472, 0.00469305,
+							-0.0174222, 0.1472, 2.63214e-008,
+							-0.00420139, 0.1431, 0.0150536,
+							-0.0079431, 0.1431, 0.0135049,
+							-0.0110895, 0.1431, 0.0110895,
+							-0.0135049, 0.1431, 0.00794314,
+							-0.0150536, 0.1431, 0.00420143,
+							-0.0156, 0.1431, 2.55883e-008,
+							0, 0.1384, 0.0113778,
+							-0.00306255, 0.1384, 0.010979,
+							-0.00579108, 0.1384, 0.00984865,
+							-0.00808623, 0.1384, 0.00808624,
+							-0.00984862, 0.1384, 0.00579111,
+							-0.0109789, 0.1384, 0.00306259,
+							-0.0113778, 0.1384, 2.47478e-008,
+							0, 0.1337, 0.00822224,
+							-0.00221013, 0.1337, 0.00793341,
+							-0.00418107, 0.1337, 0.00711525,
+							-0.00584028, 0.1337, 0.0058403,
+							-0.00711522, 0.1337, 0.0041811,
+							-0.00793338, 0.1337, 0.00221017,
+							-0.00822222, 0.1337, 2.39074e-008,
+							-0.00257778, 0.1296, 0.00926224,
+							-0.00487822, 0.1296, 0.0083058,
+							-0.006816, 0.1296, 0.00681602,
+							-0.00830577, 0.1296, 0.00487825,
+							-0.00926222, 0.1296, 0.00257781,
+							-0.0096, 0.1296, 2.31743e-008,
+							-0.0133778, 0.1501, 2.684e-008,
+							-0.0129094, 0.1501, -0.00360373,
+							-0.0115817, 0.1501, -0.00681268,
+							-0.00951073, 0.1501, -0.00951071,
+							-0.00681272, 0.1501, -0.0115816,
+							-0.00360377, 0.1501, -0.0129094,
+							0, 0.1501, -0.0133778,
+							-0.0174222, 0.1472, 2.63214e-008,
+							-0.0168122, 0.1472, -0.00469298,
+							-0.0150829, 0.1472, -0.00887201,
+							-0.0123858, 0.1472, -0.0123858,
+							-0.00887205, 0.1472, -0.0150829,
+							-0.00469303, 0.1472, -0.0168122,
+							0, 0.1472, -0.0174222,
+							-0.0150536, 0.1431, -0.00420136,
+							-0.0135049, 0.1431, -0.00794309,
+							-0.0110895, 0.1431, -0.0110895,
+							-0.00794312, 0.1431, -0.0135049,
+							-0.00420141, 0.1431, -0.0150536,
+							0, 0.1431, -0.0156,
+							-0.0113778, 0.1384, 2.47478e-008,
+							-0.0109789, 0.1384, -0.00306252,
+							-0.00984862, 0.1384, -0.00579105,
+							-0.00808622, 0.1384, -0.0080862,
+							-0.00579108, 0.1384, -0.0098486,
+							-0.00306256, 0.1384, -0.0109789,
+							0, 0.1384, -0.0113778,
+							-0.00822222, 0.1337, 2.39074e-008,
+							-0.00793338, 0.1337, -0.00221011,
+							-0.00711523, 0.1337, -0.00418104,
+							-0.00584028, 0.1337, -0.00584025,
+							-0.00418108, 0.1337, -0.0071152,
+							-0.00221014, 0.1337, -0.00793336,
+							0, 0.1337, -0.0082222,
+							-0.00926222, 0.1296, -0.00257775,
+							-0.00830578, 0.1296, -0.0048782,
+							-0.006816, 0.1296, -0.00681598,
+							-0.00487823, 0.1296, -0.00830575,
+							-0.00257779, 0.1296, -0.0092622,
+							0, 0.1296, -0.00959998,
+							0.00360375, 0.1501, -0.0129094,
+							0.0068127, 0.1501, -0.0115817,
+							0.00951073, 0.1501, -0.00951071,
+							0.0115817, 0.1501, -0.0068127,
+							0.0129094, 0.1501, -0.00360375,
+							0.0133778, 0.1501, 2.684e-008,
+							0.004693, 0.1472, -0.0168122,
+							0.00887203, 0.1472, -0.0150829,
+							0.0123858, 0.1472, -0.0123858,
+							0.0150829, 0.1472, -0.00887203,
+							0.0168122, 0.1472, -0.004693,
+							0.0174222, 0.1472, 2.63214e-008,
+							0.00420139, 0.1431, -0.0150536,
+							0.0079431, 0.1431, -0.0135049,
+							0.0110895, 0.1431, -0.0110895,
+							0.0135049, 0.1431, -0.00794311,
+							0.0150536, 0.1431, -0.00420139,
+							0.00306255, 0.1384, -0.0109789,
+							0.00579107, 0.1384, -0.0098486,
+							0.00808622, 0.1384, -0.0080862,
+							0.00984861, 0.1384, -0.00579106,
+							0.0109789, 0.1384, -0.00306254,
+							0.0113778, 0.1384, 2.47478e-008,
+							0.00221013, 0.1337, -0.00793336,
+							0.00418106, 0.1337, -0.00711521,
+							0.00584028, 0.1337, -0.00584025,
+							0.00711522, 0.1337, -0.00418105,
+							0.00793338, 0.1337, -0.00221012,
+							0.00822222, 0.1337, 2.39074e-008,
+							0.00257778, 0.1296, -0.0092622,
+							0.00487822, 0.1296, -0.00830576,
+							0.006816, 0.1296, -0.00681598,
+							0.00830577, 0.1296, -0.00487821,
+							0.00926222, 0.1296, -0.00257777,
+							0.0168444, 0.126533, 2.26259e-008,
+							0.0162518, 0.126533, 0.00452306,
+							0.0145736, 0.126533, 0.00855948,
+							0.0119595, 0.126533, 0.0119596,
+							0.00855948, 0.126533, 0.0145736,
+							0.00452306, 0.126533, 0.0162518,
+							0, 0.126533, 0.0168444,
+							0.0275555, 0.124267, 2.22206e-008,
+							0.026586, 0.124267, 0.00739918,
+							0.0238406, 0.124267, 0.0140023,
+							0.0195644, 0.124267, 0.0195644,
+							0.0140023, 0.124267, 0.0238406,
+							0.0073992, 0.124267, 0.026586,
+							0, 0.124267, 0.0275555,
+							0.0396, 0.1224, 2.18868e-008,
+							0.0382067, 0.1224, 0.0106333,
+							0.0342613, 0.1224, 0.0201227,
+							0.028116, 0.1224, 0.028116,
+							0.0201227, 0.1224, 0.0342613,
+							0.0106334, 0.1224, 0.0382067,
+							0, 0.1224, 0.0396,
+							0.0508444, 0.120533, 2.1553e-008,
+							0.0490554, 0.120533, 0.0136527,
+							0.0439898, 0.120533, 0.0258365,
+							0.0360995, 0.120533, 0.0360995,
+							0.0258365, 0.120533, 0.0439898,
+							0.0136527, 0.120533, 0.0490554,
+							0, 0.120533, 0.0508444,
+							0.0591555, 0.118267, 2.11477e-008,
+							0.0570741, 0.118267, 0.0158844,
+							0.0511805, 0.118267, 0.0300598,
+							0.0420004, 0.118267, 0.0420004,
+							0.0300598, 0.118267, 0.0511805,
+							0.0158844, 0.118267, 0.0570741,
+							0, 0.118267, 0.0591555,
+							0.0624, 0.1152, 2.05994e-008,
+							0.0602044, 0.1152, 0.0167556,
+							0.0539876, 0.1152, 0.0317084,
+							0.044304, 0.1152, 0.044304,
+							0.0317085, 0.1152, 0.0539875,
+							0.0167556, 0.1152, 0.0602044,
+							0, 0.1152, 0.0624,
+							-0.00452304, 0.126533, 0.0162518,
+							-0.00855946, 0.126533, 0.0145736,
+							-0.0119595, 0.126533, 0.0119596,
+							-0.0145735, 0.126533, 0.0085595,
+							-0.0162518, 0.126533, 0.00452308,
+							-0.0168444, 0.126533, 2.26259e-008,
+							-0.00739916, 0.124267, 0.026586,
+							-0.0140023, 0.124267, 0.0238407,
+							-0.0195644, 0.124267, 0.0195644,
+							-0.0238406, 0.124267, 0.0140023,
+							-0.026586, 0.124267, 0.00739922,
+							-0.0275555, 0.124267, 2.22206e-008,
+							-0.0106333, 0.1224, 0.0382067,
+							-0.0201227, 0.1224, 0.0342613,
+							-0.028116, 0.1224, 0.028116,
+							-0.0342613, 0.1224, 0.0201227,
+							-0.0382067, 0.1224, 0.0106334,
+							-0.0396, 0.1224, 2.18868e-008,
+							-0.0136527, 0.120533, 0.0490554,
+							-0.0258365, 0.120533, 0.0439898,
+							-0.0360995, 0.120533, 0.0360995,
+							-0.0439898, 0.120533, 0.0258365,
+							-0.0490554, 0.120533, 0.0136527,
+							-0.0508444, 0.120533, 2.1553e-008,
+							-0.0158843, 0.118267, 0.0570741,
+							-0.0300597, 0.118267, 0.0511805,
+							-0.0420004, 0.118267, 0.0420004,
+							-0.0511805, 0.118267, 0.0300598,
+							-0.0570741, 0.118267, 0.0158844,
+							-0.0591555, 0.118267, 2.11477e-008,
+							-0.0167555, 0.1152, 0.0602044,
+							-0.0317084, 0.1152, 0.0539876,
+							-0.044304, 0.1152, 0.044304,
+							-0.0539875, 0.1152, 0.0317085,
+							-0.0602044, 0.1152, 0.0167556,
+							-0.0624, 0.1152, 2.05994e-008,
+							-0.0162518, 0.126533, -0.00452302,
+							-0.0145736, 0.126533, -0.00855945,
+							-0.0119595, 0.126533, -0.0119595,
+							-0.00855948, 0.126533, -0.0145735,
+							-0.00452306, 0.126533, -0.0162517,
+							0, 0.126533, -0.0168444,
+							-0.026586, 0.124267, -0.00739915,
+							-0.0238406, 0.124267, -0.0140023,
+							-0.0195644, 0.124267, -0.0195644,
+							-0.0140023, 0.124267, -0.0238406,
+							-0.0073992, 0.124267, -0.026586,
+							0, 0.124267, -0.0275555,
+							-0.0382067, 0.1224, -0.0106333,
+							-0.0342613, 0.1224, -0.0201226,
+							-0.028116, 0.1224, -0.028116,
+							-0.0201227, 0.1224, -0.0342613,
+							-0.0106334, 0.1224, -0.0382066,
+							0, 0.1224, -0.0396,
+							-0.0490554, 0.120533, -0.0136526,
+							-0.0439898, 0.120533, -0.0258365,
+							-0.0360995, 0.120533, -0.0360995,
+							-0.0258365, 0.120533, -0.0439898,
+							-0.0136527, 0.120533, -0.0490554,
+							0, 0.120533, -0.0508444,
+							-0.0570741, 0.118267, -0.0158843,
+							-0.0511805, 0.118267, -0.0300597,
+							-0.0420004, 0.118267, -0.0420004,
+							-0.0300598, 0.118267, -0.0511805,
+							-0.0158844, 0.118267, -0.0570741,
+							0, 0.118267, -0.0591555,
+							-0.0602044, 0.1152, -0.0167555,
+							-0.0539876, 0.1152, -0.0317084,
+							-0.044304, 0.1152, -0.044304,
+							-0.0317085, 0.1152, -0.0539875,
+							-0.0167556, 0.1152, -0.0602044,
+							0, 0.1152, -0.0624,
+							0.00452304, 0.126533, -0.0162517,
+							0.00855946, 0.126533, -0.0145735,
+							0.0119595, 0.126533, -0.0119595,
+							0.0145735, 0.126533, -0.00855947,
+							0.0162518, 0.126533, -0.00452304,
+							0.00739916, 0.124267, -0.026586,
+							0.0140023, 0.124267, -0.0238406,
+							0.0195644, 0.124267, -0.0195644,
+							0.0238406, 0.124267, -0.0140023,
+							0.026586, 0.124267, -0.00739919,
+							0.0106333, 0.1224, -0.0382067,
+							0.0201227, 0.1224, -0.0342613,
+							0.028116, 0.1224, -0.028116,
+							0.0342613, 0.1224, -0.0201227,
+							0.0382067, 0.1224, -0.0106334,
+							0.0136527, 0.120533, -0.0490554,
+							0.0258365, 0.120533, -0.0439898,
+							0.0360995, 0.120533, -0.0360995,
+							0.0439898, 0.120533, -0.0258365,
+							0.0490554, 0.120533, -0.0136527,
+							0.0158843, 0.118267, -0.0570741,
+							0.0300597, 0.118267, -0.0511805,
+							0.0420004, 0.118267, -0.0420004,
+							0.0511805, 0.118267, -0.0300598,
+							0.0570741, 0.118267, -0.0158844,
+							0.0167555, 0.1152, -0.0602044,
+							0.0317084, 0.1152, -0.0539876,
+							0.044304, 0.1152, -0.044304,
+							0.0539875, 0.1152, -0.0317085,
+							0.0602044, 0.1152, -0.0167556,
+							0.0290833, 0.000283333, 5.06639e-011,
+							0, 0, 0,
+							0.02806, 0.000283335, -0.00780941,
+							0.0251625, 0.000283336, -0.0147786,
+							0.0206492, 0.000283337, -0.0206492,
+							0.0147787, 0.000283338, -0.0251625,
+							0.00780945, 0.000283338, -0.02806,
+							0, 0.000283338, -0.0290833,
+							0.0490667, 0.00106667, 1.90735e-010,
+							0.0473403, 0.00106667, -0.0131753,
+							0.0424518, 0.00106667, -0.0249331,
+							0.0348373, 0.00106667, -0.0348373,
+							0.0249332, 0.00106667, -0.0424517,
+							0.0131754, 0.00106667, -0.0473402,
+							0, 0.00106667, -0.0490667,
+							0.06165, 0.00225, 4.02331e-010,
+							0.0594808, 0.00225, -0.0165542,
+							0.0533387, 0.00225001, -0.0313273,
+							0.0437715, 0.00225001, -0.0437715,
+							0.0313274, 0.00225001, -0.0533386,
+							0.0165542, 0.00225001, -0.0594808,
+							0, 0.00225001, -0.06165,
+							0.0685333, 0.00373333, 6.67572e-010,
+							0.066122, 0.00373334, -0.0184025,
+							0.059294, 0.00373334, -0.0348251,
+							0.0486587, 0.00373334, -0.0486587,
+							0.0348251, 0.00373334, -0.059294,
+							0.0184026, 0.00373334, -0.066122,
+							0, 0.00373334, -0.0685333,
+							0.0714167, 0.00541667, 9.68575e-010,
+							0.0689039, 0.00541667, -0.0191767,
+							0.0617887, 0.00541667, -0.0362902,
+							0.0507058, 0.00541668, -0.0507058,
+							0.0362903, 0.00541668, -0.0617886,
+							0.0191768, 0.00541668, -0.0689038,
+							0, 0.00541668, -0.0714167,
+							0.0694667, 0.0072, -0.0193333,
+							0.0622933, 0.00720001, -0.0365866,
+							0.0365867, 0.00720001, -0.0622933,
+							0.0193334, 0.00720001, -0.0694666,
+							0, 0.000283338, -0.0290833,
+							-0.0078094, 0.000283338, -0.02806,
+							-0.0147786, 0.000283338, -0.0251625,
+							-0.0206492, 0.000283337, -0.0206492,
+							-0.0251624, 0.000283336, -0.0147787,
+							-0.02806, 0.000283335, -0.00780945,
+							-0.0290833, 0.000283333, 5.06639e-011,
+							0, 0.00106667, -0.0490667,
+							-0.0131753, 0.00106667, -0.0473402,
+							-0.0249331, 0.00106667, -0.0424518,
+							-0.0348373, 0.00106667, -0.0348373,
+							-0.0424517, 0.00106667, -0.0249332,
+							-0.0473402, 0.00106667, -0.0131754,
+							-0.0490667, 0.00106667, 1.90735e-010,
+							-0.0165542, 0.00225001, -0.0594808,
+							-0.0313273, 0.00225001, -0.0533387,
+							-0.0437715, 0.00225001, -0.0437715,
+							-0.0533386, 0.00225001, -0.0313274,
+							-0.0594808, 0.00225, -0.0165542,
+							-0.06165, 0.00225, 4.02331e-010,
+							0, 0.00373334, -0.0685333,
+							-0.0184024, 0.00373334, -0.066122,
+							-0.0348251, 0.00373334, -0.059294,
+							-0.0486587, 0.00373334, -0.0486587,
+							-0.059294, 0.00373334, -0.0348251,
+							-0.0661219, 0.00373334, -0.0184026,
+							-0.0685333, 0.00373333, 6.67572e-010,
+							0, 0.00541667, -0.0714167,
+							-0.0191767, 0.00541668, -0.0689039,
+							-0.0362902, 0.00541667, -0.0617887,
+							-0.0507058, 0.00541667, -0.0507058,
+							-0.0617886, 0.00541667, -0.0362903,
+							-0.0689038, 0.00541667, -0.0191768,
+							-0.0714167, 0.00541666, 9.68575e-010,
+							-0.0193333, 0.00720001, -0.0694667,
+							-0.0365866, 0.00720001, -0.0622933,
+							-0.0622933, 0.00720001, -0.0365867,
+							-0.0694666, 0.0072, -0.0193334,
+							-0.0290833, 0.000283334, 5.0664e-011,
+							-0.02806, 0.000283332, 0.00780941,
+							-0.0251625, 0.000283331, 0.0147786,
+							-0.0206492, 0.00028333, 0.0206492,
+							-0.0147787, 0.000283329, 0.0251625,
+							-0.00780945, 0.000283329, 0.02806,
+							0, 0.000283329, 0.0290833,
+							-0.0490667, 0.00106667, 1.90735e-010,
+							-0.0473403, 0.00106667, 0.0131753,
+							-0.0424518, 0.00106666, 0.0249331,
+							-0.0348374, 0.00106666, 0.0348374,
+							-0.0249332, 0.00106666, 0.0424517,
+							-0.0131754, 0.00106666, 0.0473402,
+							0, 0.00106666, 0.0490667,
+							-0.0594808, 0.00225, 0.0165542,
+							-0.0533387, 0.00224999, 0.0313273,
+							-0.0437715, 0.00224999, 0.0437715,
+							-0.0313274, 0.00224999, 0.0533386,
+							-0.0165542, 0.00224999, 0.0594808,
+							0, 0.00224999, 0.06165,
+							-0.0685333, 0.00373334, 6.67572e-010,
+							-0.066122, 0.00373333, 0.0184025,
+							-0.059294, 0.00373333, 0.0348251,
+							-0.0486587, 0.00373333, 0.0486587,
+							-0.0348251, 0.00373333, 0.059294,
+							-0.0184026, 0.00373333, 0.066122,
+							0, 0.00373333, 0.0685333,
+							-0.0714167, 0.00541667, 9.68576e-010,
+							-0.0689039, 0.00541667, 0.0191767,
+							-0.0617887, 0.00541666, 0.0362902,
+							-0.0507058, 0.00541666, 0.0507058,
+							-0.0362903, 0.00541666, 0.0617886,
+							-0.0191768, 0.00541666, 0.0689038,
+							0, 0.00541666, 0.0714167,
+							-0.0694667, 0.0072, 0.0193333,
+							-0.0622933, 0.00719999, 0.0365866,
+							-0.05112, 0.00719999, 0.05112,
+							-0.0365867, 0.00719999, 0.0622933,
+							-0.0193334, 0.00719999, 0.0694666,
+							0.00780941, 0.000283329, 0.02806,
+							0.0147786, 0.000283329, 0.0251625,
+							0.0206492, 0.00028333, 0.0206492,
+							0.0251625, 0.000283331, 0.0147787,
+							0.02806, 0.000283332, 0.00780945,
+							0.0290833, 0.000283334, 5.0664e-011,
+							0.0131753, 0.00106666, 0.0473403,
+							0.0249331, 0.00106666, 0.0424518,
+							0.0348374, 0.00106666, 0.0348374,
+							0.0424517, 0.00106666, 0.0249332,
+							0.0473402, 0.00106666, 0.0131754,
+							0.0490667, 0.00106667, 1.90735e-010,
+							0.0165542, 0.00224999, 0.0594808,
+							0.0313273, 0.00224999, 0.0533387,
+							0.0437715, 0.00224999, 0.0437715,
+							0.0533386, 0.00224999, 0.0313274,
+							0.0594808, 0.00225, 0.0165542,
+							0.0184025, 0.00373333, 0.066122,
+							0.0348251, 0.00373333, 0.059294,
+							0.0486587, 0.00373333, 0.0486587,
+							0.059294, 0.00373333, 0.0348251,
+							0.066122, 0.00373333, 0.0184026,
+							0.0685333, 0.00373334, 6.67572e-010,
+							0.0191767, 0.00541666, 0.0689039,
+							0.0362902, 0.00541666, 0.0617887,
+							0.0507058, 0.00541666, 0.0507058,
+							0.0617886, 0.00541666, 0.0362903,
+							0.0689038, 0.00541667, 0.0191768,
+							0.0714167, 0.00541667, 9.68576e-010,
+							0.0193333, 0.00719999, 0.0694667,
+							0.0365866, 0.00719999, 0.0622933,
+							0.05112, 0.00719999, 0.05112,
+							0.0622933, 0.00719999, 0.0365867,
+							0.0694666, 0.0072, 0.0193334,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							-0.06165, 0.00225, 4.02331e-010,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0.06165, 0.00225, 4.02331e-010,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0, 0, 0,
+							0.006816, 0.1296, 0.00681602,
+							0.00487823, 0.1296, 0.00830579,
+							0.00257779, 0.1296, 0.00926224,
+							0, 0.1296, 0.00960002,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0.00830577, 0.1296, -0.00487821,
+							0.00487822, 0.1296, -0.00830576,
+							0.00257778, 0.1296, -0.0092622,
+							0, 0.1296, -0.00959998,
+							-0.00257779, 0.1296, -0.0092622,
+							-0.00487823, 0.1296, -0.00830575,
+							-0.00830578, 0.1296, -0.0048782,
+							-0.00257778, 0.1296, 0.00926224,
+							-0.00487822, 0.1296, 0.0083058,
+							-0.006816, 0.1296, 0.00681602,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0, 0.1512, 2.70367e-008,
+							0.156267, 0.1152, -0.00499999,
+							0.131733, 0.1152, -0.00499998,
+							0.1296, 0.1152, 2.05994e-008,
+							0.137067, 0.1152, 0.00800001,
+							-0.094, 0.1079, 1.9294e-008,
+							-0.096, 0.0432, 7.72476e-009,
+							-0.0897778, 0.0250667, 4.48227e-009,
+							0.0897778, 0.0250667, 4.48227e-009,
+							-0.084, 0.01845, 3.29912e-009,
+							0.084, 0.01845, 3.29912e-009,
+							-0.0782222, 0.0133334, 2.38419e-009,
+							0.0782222, 0.0133334, 2.38419e-009,
+							-0.0737778, 0.00961668, 1.7196e-009,
+							0.0737778, 0.00961668, 1.7196e-009,
+							0.0926222, 0.0432, 0.0257778,
+							0.072, 0.1152, 2.05994e-008,
+							0.05112, 0.1152, -0.05112,
+							0, 0.1152, -0.072,
+							-0.05112, 0.1152, -0.05112,
+							-0.072, 0.1152, 2.05994e-008,
+							0, 0.1152, 0.072,
+							-0.05112, 0.1152, 0.05112,
+							-0.0687556, 0.1194, 2.13504e-008,
+							0.05112, 0.1152, 0.05112,
+							0, 0.117825, 0.0663056,
+							-0.0396, 0.1224, 2.18868e-008,
+							0.0396, 0.1224, 2.18868e-008};
+
+float teapot_normals[] = {
+							-0.987635, -0.156768, 0,
+							-0.902861, -0.429933, 0,
+							-0.953562, -0.156989, -0.257047,
+							-0.871509, -0.430441, -0.234929,
+							-0.854265, -0.157281, -0.495474,
+							-0.780517, -0.431109, -0.4527,
+							-0.698293, -0.157393, -0.698294,
+							-0.637936, -0.431366, -0.637936,
+							-0.495474, -0.157281, -0.854265,
+							-0.4527, -0.431109, -0.780517,
+							-0.257047, -0.156989, -0.953562,
+							-0.234929, -0.430441, -0.871509,
+							0, -0.156767, -0.987636,
+							0, -0.429933, -0.902861,
+							-0.880022, 0.474932, 0,
+							-0.849414, 0.475466, -0.228973,
+							-0.76067, 0.476166, -0.441189,
+							-0.621695, 0.476435, -0.621695,
+							-0.441189, 0.476166, -0.76067,
+							-0.228972, 0.475466, -0.849414,
+							0, 0.474932, -0.880022,
+							0, 1, 0,
+							-3.12489e-007, 1, -4.53013e-008,
+							-4.74898e-007, 1, -2.15741e-007,
+							0, 1, 0,
+							-1.19502e-007, 1, -2.57504e-007,
+							-5.01339e-008, 1, -1.37835e-007,
+							0, 1, 0,
+							0.556738, 0.830688, 0,
+							0.537013, 0.831061, 0.14476,
+							0.480481, 0.83155, 0.278679,
+							0.392564, 0.831738, 0.392564,
+							0.278679, 0.83155, 0.480481,
+							0.14476, 0.831061, 0.537012,
+							0, 0.830688, 0.556738,
+							0.783289, 0.621658, 0,
+							0.755869, 0.622211, 0.203756,
+							0.67669, 0.622937, 0.39248,
+							0.552994, 0.623214, 0.552994,
+							0.39248, 0.622936, 0.676691,
+							0.203756, 0.62221, 0.755869,
+							0, 0.621658, 0.783289,
+							0.90286, 0.429934, 0,
+							0.871509, 0.430442, 0.234929,
+							0.780517, 0.431109, 0.4527,
+							0.637935, 0.431366, 0.637936,
+							0.4527, 0.431109, 0.780517,
+							0.234929, 0.430441, 0.87151,
+							0, 0.429934, 0.90286,
+							0.257047, -0.156989, -0.953562,
+							0.234929, -0.430441, -0.871509,
+							0.495474, -0.157281, -0.854265,
+							0.4527, -0.431109, -0.780517,
+							0.698293, -0.157393, -0.698294,
+							0.637936, -0.431366, -0.637936,
+							0.854265, -0.157281, -0.495474,
+							0.780517, -0.431109, -0.4527,
+							0.953562, -0.156989, -0.257047,
+							0.871509, -0.430441, -0.234929,
+							0.987636, -0.156767, 0,
+							0.902861, -0.429933, 0,
+							0.228973, 0.475465, -0.849414,
+							0.441188, 0.476167, -0.760669,
+							0.621695, 0.476434, -0.621696,
+							0.76067, 0.476167, -0.441188,
+							0.849414, 0.475466, -0.228972,
+							0.880022, 0.474932, 0,
+							4.53013e-008, 1, -3.12489e-007,
+							2.15741e-007, 1, -4.74898e-007,
+							0, 1, 0,
+							2.57504e-007, 1, -1.19502e-007,
+							1.37835e-007, 1, -5.01339e-008,
+							0, 1, 0,
+							0, 0.830689, 0.556737,
+							-0.14476, 0.831061, 0.537012,
+							-0.278679, 0.83155, 0.480481,
+							-0.392563, 0.831738, 0.392563,
+							-0.480482, 0.83155, 0.27868,
+							-0.537012, 0.831061, 0.14476,
+							-0.556738, 0.830688, 0,
+							0, 0.621658, 0.783289,
+							-0.203756, 0.62221, 0.755869,
+							-0.39248, 0.622937, 0.67669,
+							-0.552993, 0.623215, 0.552993,
+							-0.67669, 0.622937, 0.39248,
+							-0.755869, 0.62221, 0.203756,
+							-0.783289, 0.621658, 0,
+							-0.234929, 0.430442, 0.871509,
+							-0.4527, 0.431109, 0.780517,
+							-0.637935, 0.431366, 0.637936,
+							-0.780517, 0.431109, 0.4527,
+							-0.87151, 0.430441, 0.234929,
+							-0.90286, 0.429934, 0,
+							0.987636, -0.156767, 0,
+							0.953562, -0.156989, 0.257047,
+							0.871509, -0.430441, 0.234929,
+							0.854265, -0.15728, 0.495474,
+							0.780517, -0.431109, 0.4527,
+							0.698294, -0.157393, 0.698293,
+							0.637936, -0.431366, 0.637936,
+							0.495474, -0.157281, 0.854265,
+							0.4527, -0.431109, 0.780517,
+							0.257047, -0.156989, 0.953562,
+							0.234929, -0.430441, 0.871509,
+							0, -0.156767, 0.987636,
+							0, -0.429933, 0.902861,
+							0.880022, 0.474934, 0,
+							0.849413, 0.475467, 0.228972,
+							0.760669, 0.476167, 0.441188,
+							0.621695, 0.476436, 0.621695,
+							0.441188, 0.476167, 0.760669,
+							0.228972, 0.475466, 0.849414,
+							0, 0.474934, 0.880022,
+							3.12489e-007, 1, 4.53013e-008,
+							4.74898e-007, 1, 2.15741e-007,
+							0, 1, 0,
+							1.19502e-007, 1, 2.57504e-007,
+							5.01339e-008, 1, 1.37835e-007,
+							0, 1, 0,
+							-0.537013, 0.831061, -0.14476,
+							-0.480482, 0.83155, -0.27868,
+							-0.392566, 0.831735, -0.392566,
+							-0.27868, 0.83155, -0.480482,
+							-0.14476, 0.831061, -0.537012,
+							0, 0.830688, -0.556738,
+							-0.783289, 0.621657, 0,
+							-0.755869, 0.62221, -0.203756,
+							-0.676691, 0.622936, -0.39248,
+							-0.552994, 0.623215, -0.552993,
+							-0.392481, 0.622936, -0.676691,
+							-0.203756, 0.622209, -0.75587,
+							0, 0.621657, -0.783289,
+							-0.871509, 0.430442, -0.234929,
+							-0.780517, 0.431109, -0.4527,
+							-0.637936, 0.431366, -0.637935,
+							-0.4527, 0.431109, -0.780517,
+							-0.234929, 0.430441, -0.87151,
+							0, 0.429934, -0.90286,
+							-0.257047, -0.156989, 0.953562,
+							-0.234929, -0.430441, 0.871509,
+							-0.495474, -0.15728, 0.854265,
+							-0.4527, -0.431109, 0.780517,
+							-0.698294, -0.157393, 0.698293,
+							-0.637936, -0.431366, 0.637936,
+							-0.854265, -0.157281, 0.495474,
+							-0.780517, -0.431109, 0.4527,
+							-0.953562, -0.156989, 0.257047,
+							-0.871509, -0.430442, 0.234928,
+							-0.987636, -0.156767, 0,
+							-0.228972, 0.475467, 0.849413,
+							-0.441188, 0.476167, 0.760669,
+							-0.621695, 0.476436, 0.621695,
+							-0.76067, 0.476167, 0.441188,
+							-0.849414, 0.475466, 0.228972,
+							-0.880022, 0.474934, 0,
+							-4.53013e-008, 1, 3.12489e-007,
+							-2.15741e-007, 1, 4.74898e-007,
+							0, 1, 0,
+							-2.57504e-007, 1, 1.19502e-007,
+							-1.37835e-007, 1, 5.01339e-008,
+							0.14476, 0.831061, -0.537013,
+							0.27868, 0.83155, -0.480482,
+							0.392566, 0.831735, -0.392566,
+							0.480482, 0.83155, -0.27868,
+							0.537012, 0.831061, -0.14476,
+							0.556738, 0.830688, 0,
+							0.203756, 0.62221, -0.755869,
+							0.392481, 0.622936, -0.67669,
+							0.552994, 0.623215, -0.552993,
+							0.676691, 0.622936, -0.39248,
+							0.75587, 0.622209, -0.203756,
+							0.783289, 0.621657, 0,
+							0.234929, 0.430442, -0.871509,
+							0.4527, 0.431109, -0.780517,
+							0.637936, 0.431366, -0.637935,
+							0.780517, 0.431109, -0.4527,
+							0.87151, 0.430441, -0.234928,
+							0.906828, 0.421501, 0,
+							0.875348, 0.422003, 0.235963,
+							0.871509, 0.430442, 0.234929,
+							0.783966, 0.422664, 0.4547,
+							0.780517, 0.43111, 0.4527,
+							0.640758, 0.422917, 0.640758,
+							0.4547, 0.422664, 0.783966,
+							0.4527, 0.43111, 0.780517,
+							0.235964, 0.422003, 0.875348,
+							0.234929, 0.430442, 0.871509,
+							0, 0.421501, 0.906828,
+							0.918633, 0.395111, 0,
+							0.886771, 0.395595, 0.239043,
+							0.794229, 0.39623, 0.460653,
+							0.649156, 0.396474, 0.649157,
+							0.460653, 0.39623, 0.794229,
+							0.239043, 0.395595, 0.886771,
+							0, 0.395111, 0.918633,
+							0.937749, 0.347314, 0,
+							0.905271, 0.347757, 0.244029,
+							0.810853, 0.34834, 0.470295,
+							0.662761, 0.348563, 0.662761,
+							0.470295, 0.34834, 0.810853,
+							0.24403, 0.347757, 0.90527,
+							0, 0.347314, 0.937749,
+							0.96234, 0.271848, 0,
+							0.929073, 0.272213, 0.250446,
+							0.832247, 0.272693, 0.482704,
+							0.680271, 0.272877, 0.680271,
+							0.482704, 0.272693, 0.832247,
+							0.250446, 0.272213, 0.929073,
+							0, 0.271848, 0.96234,
+							0.987204, 0.15946, 0,
+							0.953145, 0.159686, 0.256935,
+							0.85389, 0.159982, 0.495256,
+							0.697986, 0.160096, 0.697986,
+							0.495256, 0.159982, 0.853889,
+							0.256935, 0.159686, 0.953145,
+							0, 0.15946, 0.987204,
+							1, 0, 0,
+							0.965535, -2.69333e-008, 0.260275,
+							0.865031, -2.6582e-008, 0.501718,
+							0.707107, -1.58051e-008, 0.707107,
+							0.501718, -5.72888e-009, 0.865031,
+							0.260275, -7.99313e-010, 0.965535,
+							0, 0, 1,
+							0, 0.421501, 0.906828,
+							-0.235963, 0.422003, 0.875348,
+							-0.234928, 0.430442, 0.871509,
+							-0.4547, 0.422664, 0.783966,
+							-0.4527, 0.43111, 0.780517,
+							-0.640758, 0.422917, 0.640758,
+							-0.783966, 0.422664, 0.454701,
+							-0.780517, 0.43111, 0.4527,
+							-0.875348, 0.422003, 0.235964,
+							-0.871509, 0.430442, 0.234929,
+							-0.906828, 0.421501, 0,
+							0, 0.395111, 0.918633,
+							-0.239043, 0.395595, 0.886771,
+							-0.460653, 0.39623, 0.794229,
+							-0.649157, 0.396474, 0.649157,
+							-0.794229, 0.39623, 0.460653,
+							-0.886771, 0.395595, 0.239043,
+							-0.918633, 0.395111, 0,
+							-0.244029, 0.347757, 0.905271,
+							-0.470295, 0.34834, 0.810853,
+							-0.662761, 0.348563, 0.662761,
+							-0.810853, 0.34834, 0.470295,
+							-0.90527, 0.347757, 0.24403,
+							-0.937749, 0.347314, 0,
+							0, 0.271848, 0.96234,
+							-0.250446, 0.272213, 0.929073,
+							-0.482703, 0.272693, 0.832248,
+							-0.680271, 0.272877, 0.680271,
+							-0.832247, 0.272693, 0.482704,
+							-0.929073, 0.272213, 0.250446,
+							-0.96234, 0.271848, 0,
+							0, 0.159461, 0.987204,
+							-0.256935, 0.159686, 0.953145,
+							-0.495256, 0.159983, 0.853889,
+							-0.697986, 0.160096, 0.697986,
+							-0.853889, 0.159982, 0.495256,
+							-0.953145, 0.159686, 0.256935,
+							-0.987204, 0.159461, 0,
+							-0.260274, -7.9931e-010, 0.965535,
+							-0.501718, -5.72887e-009, 0.865031,
+							-0.707107, -1.58051e-008, 0.707107,
+							-0.865031, -2.6582e-008, 0.501718,
+							-0.965535, -2.69333e-008, 0.260275,
+							0.410365, 0.911921, 0,
+							-0.906828, 0.421501, 0,
+							-0.875348, 0.422003, -0.235963,
+							-0.871509, 0.430442, -0.234928,
+							-0.783966, 0.422664, -0.4547,
+							-0.780517, 0.43111, -0.4527,
+							-0.640758, 0.422917, -0.640758,
+							-0.454701, 0.422664, -0.783966,
+							-0.4527, 0.43111, -0.780517,
+							-0.235964, 0.422003, -0.875348,
+							-0.234929, 0.430442, -0.871509,
+							0, 0.421501, -0.906828,
+							-0.918633, 0.395111, 0,
+							-0.886771, 0.395595, -0.239043,
+							-0.794229, 0.39623, -0.460653,
+							-0.649157, 0.396474, -0.649156,
+							-0.460653, 0.39623, -0.794229,
+							-0.239043, 0.395595, -0.886771,
+							0, 0.395111, -0.918633,
+							-0.905271, 0.347757, -0.244029,
+							-0.810853, 0.34834, -0.470295,
+							-0.662761, 0.348563, -0.662761,
+							-0.470295, 0.34834, -0.810853,
+							-0.24403, 0.347757, -0.90527,
+							0, 0.347314, -0.937749,
+							-0.96234, 0.271847, 0,
+							-0.929073, 0.272213, -0.250446,
+							-0.832248, 0.272693, -0.482703,
+							-0.680271, 0.272877, -0.680271,
+							-0.482704, 0.272693, -0.832247,
+							-0.250446, 0.272213, -0.929073,
+							0, 0.271847, -0.96234,
+							-0.987204, 0.15946, 0,
+							-0.953145, 0.159685, -0.256935,
+							-0.85389, 0.159982, -0.495256,
+							-0.697986, 0.160096, -0.697986,
+							-0.495256, 0.159982, -0.853889,
+							-0.256935, 0.159685, -0.953145,
+							0, 0.15946, -0.987204,
+							-0.965535, 2.69333e-008, -0.260274,
+							-0.865031, 2.6582e-008, -0.501718,
+							-0.707107, 1.58051e-008, -0.707107,
+							-0.501718, 5.72888e-009, -0.865031,
+							-0.260275, 7.99313e-010, -0.965535,
+							0, 0 , -1,
+							0.235963, 0.422003, -0.875348,
+							0.234928, 0.430442, -0.871509,
+							0.4547, 0.422664, -0.783966,
+							0.4527, 0.43111, -0.780517,
+							0.640758, 0.422917, -0.640758,
+							0.783966, 0.422664, -0.4547,
+							0.780517, 0.43111, -0.4527,
+							0.875348, 0.422003, -0.235964,
+							0.871509, 0.430442, -0.234929,
+							0.906828, 0.421501, 0,
+							0.239043, 0.395595, -0.886771,
+							0.460653, 0.39623, -0.794229,
+							0.649157, 0.396474, -0.649156,
+							0.794229, 0.39623, -0.460653,
+							0.886771, 0.395595, -0.239043,
+							0.918633, 0.395111, 0,
+							0.244029, 0.347757, -0.905271,
+							0.470295, 0.34834, -0.810853,
+							0.662761, 0.348563, -0.662761,
+							0.810853, 0.34834, -0.470295,
+							0.90527, 0.347757, -0.24403,
+							0.250446, 0.272213, -0.929073,
+							0.482704, 0.272693, -0.832247,
+							0.680271, 0.272877, -0.680271,
+							0.832247, 0.272693, -0.482704,
+							0.929073, 0.272213, -0.250446,
+							0.96234, 0.271847, 0,
+							0.256935, 0.159685, -0.953145,
+							0.495256, 0.159982, -0.85389,
+							0.697986, 0.160096, -0.697986,
+							0.853889, 0.159982, -0.495256,
+							0.953145, 0.159685, -0.256935,
+							0.987204, 0.15946, 0,
+							0.260274, 7.9931e-010, -0.965535,
+							0.501718, 5.72887e-009, -0.865031,
+							0.707107, 1.58051e-008, -0.707107,
+							0.865031, 2.6582e-008, -0.501718,
+							0.965535, 2.69333e-008, -0.260275,
+							0.938373, -0.345625, -3.10672e-010,
+							0.905874, -0.346066, 0.244192,
+							0.811396, -0.346647, 0.470609,
+							0.663205, -0.346869, 0.663205,
+							0.47061, -0.346647, 0.811395,
+							0.244192, -0.346066, 0.905874,
+							0, -0.345625, 0.938373,
+							0.811257, -0.584689, -4.41262e-009,
+							0.782908, -0.585247, 0.211045,
+							0.700957, -0.58598, 0.406555,
+							0.572843, -0.586261, 0.572843,
+							0.406555, -0.58598, 0.700957,
+							0.211045, -0.585247, 0.782908,
+							0, -0.584689, 0.811257,
+							0.6981, -0.716, -1.94916e-008,
+							0.673539, -0.716506, 0.181563,
+							0.602839, -0.717169, 0.349647,
+							0.492597, -0.717423, 0.492597,
+							0.349647, -0.717169, 0.602839,
+							0.181563, -0.716506, 0.673539,
+							0, -0.716, 0.6981,
+							0.636383, -0.771373, -5.3452e-008,
+							0.61392, -0.771826, 0.165491,
+							0.549392, -0.772419, 0.318648,
+							0.448897, -0.772647, 0.448897,
+							0.318648, -0.772419, 0.549392,
+							0.165492, -0.771826, 0.61392,
+							0, -0.771373, 0.636383,
+							0.675056, -0.737767, -1.05865e-007,
+							0.651275, -0.738254, 0.175561,
+							0.582878, -0.738893, 0.338069,
+							0.476275, -0.739138, 0.476275,
+							0.338069, -0.738893, 0.582878,
+							0.175561, -0.738254, 0.651275,
+							0, -0.737767, 0.675056,
+							1, 0, 0,
+							0.965535, -2.69332e-008, 0.260274,
+							0.865031, -2.65819e-008, 0.501718,
+							0.707107, -1.5805e-008, 0.707107,
+							0.501718, -5.72887e-009, 0.865031,
+							0.260275, -7.99311e-010, 0.965535,
+							0, 0, 1,
+							-0.244192, -0.346066, 0.905874,
+							-0.470609, -0.346647, 0.811396,
+							-0.663205, -0.346869, 0.663205,
+							-0.811395, -0.346647, 0.47061,
+							-0.905874, -0.346066, 0.244193,
+							-0.938373, -0.345625, -3.10672e-010,
+							-0.211045, -0.585247, 0.782908,
+							-0.406555, -0.58598, 0.700957,
+							-0.572843, -0.586261, 0.572843,
+							-0.700957, -0.58598, 0.406555,
+							-0.782908, -0.585247, 0.211045,
+							-0.811257, -0.584689, -4.41262e-009,
+							-0.181563, -0.716506, 0.673539,
+							-0.349647, -0.717169, 0.602839,
+							-0.492597, -0.717423, 0.492597,
+							-0.602839, -0.717169, 0.349647,
+							-0.673539, -0.716506, 0.181563,
+							-0.6981, -0.716, -1.94916e-008,
+							-0.165491, -0.771826, 0.61392,
+							-0.318648, -0.772419, 0.549393,
+							-0.448897, -0.772647, 0.448897,
+							-0.549392, -0.772419, 0.318648,
+							-0.61392, -0.771826, 0.165492,
+							-0.636383, -0.771373, -5.3452e-008,
+							-0.175561, -0.738254, 0.651275,
+							-0.338069, -0.738893, 0.582878,
+							-0.476275, -0.739138, 0.476275,
+							-0.582878, -0.738893, 0.338069,
+							-0.651275, -0.738254, 0.175561,
+							-0.675056, -0.737767, -1.05865e-007,
+							-0.260274, -7.99309e-010, 0.965535,
+							-0.501718, -5.72886e-009, 0.865031,
+							-0.707107, -1.5805e-008, 0.707107,
+							-0.865031, -2.65819e-008, 0.501718,
+							-0.965535, -2.69333e-008, 0.260275,
+							-1, 0, 0,
+							-0.905874, -0.346066, -0.244192,
+							-0.811396, -0.346647, -0.470609,
+							-0.663205, -0.346869, -0.663205,
+							-0.47061, -0.346647, -0.811395,
+							-0.244192, -0.346066, -0.905874,
+							0, -0.345625, -0.938373,
+							-0.782908, -0.585247, -0.211045,
+							-0.700957, -0.58598, -0.406555,
+							-0.572843, -0.586261, -0.572843,
+							-0.406555, -0.58598, -0.700957,
+							-0.211045, -0.585247, -0.782908,
+							0, -0.584689, -0.811257,
+							-0.673539, -0.716506, -0.181563,
+							-0.602839, -0.717169, -0.349647,
+							-0.492597, -0.717423, -0.492597,
+							-0.349647, -0.717169, -0.602839,
+							-0.181563, -0.716506, -0.673539,
+							0, -0.716, -0.6981,
+							-0.61392, -0.771826, -0.165491,
+							-0.549392, -0.77242, -0.318647,
+							-0.448897, -0.772647, -0.448897,
+							-0.318648, -0.77242, -0.549392,
+							-0.165492, -0.771826, -0.61392,
+							0, -0.771373, -0.636383,
+							-0.651275, -0.738254, -0.175561,
+							-0.582877, -0.738894, -0.338069,
+							-0.476274, -0.739138, -0.476274,
+							-0.338069, -0.738894, -0.582877,
+							-0.175561, -0.738255, -0.651275,
+							0, -0.737767, -0.675055,
+							-0.965535, 2.69333e-008, -0.260274,
+							-0.865031, 2.6582e-008, -0.501718,
+							-0.707107, 1.58051e-008, -0.707107,
+							-0.501718, 5.7289e-009, -0.865031,
+							-0.260275, 7.99315e-010, -0.965535,
+							0, 0 , -1,
+							0.244192, -0.346066, -0.905874,
+							0.470609, -0.346647, -0.811396,
+							0.663205, -0.346869, -0.663205,
+							0.811395, -0.346647, -0.47061,
+							0.905874, -0.346066, -0.244192,
+							0.211045, -0.585247, -0.782908,
+							0.406555, -0.58598, -0.700957,
+							0.572843, -0.586261, -0.572843,
+							0.700957, -0.58598, -0.406555,
+							0.782908, -0.585247, -0.211045,
+							0.181563, -0.716506, -0.673539,
+							0.349647, -0.717169, -0.602839,
+							0.492597, -0.717423, -0.492597,
+							0.602839, -0.717169, -0.349647,
+							0.673539, -0.716506, -0.181563,
+							0.165491, -0.771826, -0.61392,
+							0.318647, -0.77242, -0.549392,
+							0.448897, -0.772647, -0.448897,
+							0.549392, -0.77242, -0.318648,
+							0.61392, -0.771826, -0.165492,
+							0.175561, -0.738255, -0.651275,
+							0.338069, -0.738894, -0.582877,
+							0.476274, -0.739138, -0.476274,
+							0.582877, -0.738894, -0.338069,
+							0.651275, -0.738254, -0.175561,
+							0.260274, 7.99314e-010, -0.965535,
+							0.501718, 5.72889e-009, -0.865031,
+							0.707107, 1.58051e-008, -0.707107,
+							0.865031, 2.6582e-008, -0.501718,
+							0.965535, 2.69333e-008, -0.260275,
+							0.0104645, -0.999945, 0,
+							0 , -1, 0,
+							0.0104255, -0.954681, 0.297447,
+							2.56825e-008, -0.95448, 0.298276,
+							0.00846391, -0.708083, 0.706078,
+							1.14879e-007, -0.707106, 0.707108,
+							-2.9238e-009, -8.98486e-008, 1,
+							8.16344e-015, -8.94074e-008, 1,
+							-0.00997561, 0.707961, 0.706181,
+							5.80084e-008, 0.707107, 0.707107,
+							-0.0140841, 0.95459, 0.297589,
+							1.94189e-007, 0.95448, 0.298275,
+							-0.0149982, 0.999888, 0,
+							0, 1, 0,
+							0.0510697, -0.998695, 0,
+							0.0510028, -0.953615, 0.296676,
+							0.0415993, -0.706917, 0.706072,
+							-2.78701e-009, -9.11701e-008, 1,
+							-0.0493858, 0.704244, 0.708239,
+							-0.0701018, 0.951466, 0.299663,
+							-0.07479, 0.997199, 0,
+							0.14834, -0.988936, 0,
+							0.148104, -0.941964, 0.30128,
+							0.119688, -0.688399, 0.715389,
+							7.13598e-009, -8.17051e-008, 1,
+							-0.141352, 0.675015, 0.724137,
+							-0.204668, 0.927128, 0.313917,
+							-0.219512, 0.97561, 0,
+							0.364399, -0.931243, 0,
+							0.359682, -0.875088, 0.323804,
+							0.275915, -0.604128, 0.747597,
+							1.54202e-008, -6.37972e-008, 1,
+							-0.313659, 0.564289, 0.763672,
+							-0.474611, 0.807244, 0.350859,
+							-0.514496, 0.857493, 0,
+							0.767382, -0.64119, 0,
+							0.727532, -0.577566, 0.37029,
+							0.497151, -0.35353, 0.792374,
+							1.10972e-008, -5.53164e-008, 1,
+							-0.519904, 0.300684, 0.799556,
+							-0.810111, 0.441475, 0.385771,
+							-0.882353, 0.470588, 0,
+							1, 0, 0,
+							0.923077, -3.76483e-008, 0.384616,
+							0.599999, -4.20741e-008, 0.8,
+							0, -4.47037e-008, 1,
+							-0.600001, -5.17421e-008, 0.799999,
+							-0.923077, -4.14964e-008, 0.384614,
+							-1, 0, 0,
+							-0.014084, 0.95459, -0.297589,
+							5.67983e-008, 0.95448, -0.298275,
+							-0.00997558, 0.707961, -0.706182,
+							-4.84905e-008, 0.707107, -0.707107,
+							5.84773e-010, 8.94956e-008 , -1,
+							-8.16344e-015, 8.94074e-008 , -1,
+							0.0084637, -0.708085, -0.706076,
+							3.66172e-008, -0.707108, -0.707106,
+							0.0104256, -0.954682, -0.297445,
+							7.36826e-009, -0.95448, -0.298274,
+							0.0104646, -0.999945, 0,
+							-0.07479, 0.997199, 0,
+							-0.0701018, 0.951466, -0.299663,
+							-0.0493858, 0.704243, -0.708239,
+							-8.36107e-009, 8.41192e-008 , -1,
+							0.0415994, -0.706919, -0.70607,
+							0.0510028, -0.953616, -0.296674,
+							0.0510696, -0.998695, 0,
+							-0.204668, 0.927128, -0.313917,
+							-0.141352, 0.675015, -0.724137,
+							-7.13598e-009, 8.17051e-008 , -1,
+							0.119688, -0.688401, -0.715387,
+							0.148104, -0.941964, -0.301278,
+							-0.514495, 0.857493, 0,
+							-0.47461, 0.807244, -0.350859,
+							-0.313658, 0.564289, -0.763673,
+							-9.25216e-009, 7.40412e-008 , -1,
+							0.275916, -0.60413, -0.747595,
+							0.359681, -0.875089, -0.323802,
+							0.364399, -0.931243, 0,
+							-0.882353, 0.470589, 0,
+							-0.810111, 0.441477, -0.385771,
+							-0.519903, 0.300684, -0.799556,
+							-1.01322e-008, 5.82809e-008 , -1,
+							0.497153, -0.353532, -0.792373,
+							0.727532, -0.577567, -0.370288,
+							0.767381, -0.641191, 0,
+							-0.923077, 4.14963e-008, -0.384615,
+							-0.6, 5.17421e-008, -0.8,
+							0, 4.47037e-008 , -1,
+							0.600002, 4.2074e-008, -0.799999,
+							0.923078, 3.76482e-008, -0.384614,
+							0.972045, 0.234794, 0,
+							0.895972, 0.219226, 0.38623,
+							0.57987, 0.145888, 0.801541,
+							-1.56774e-008, -4.06593e-008, 1,
+							-0.577708, -0.153129, 0.801751,
+							-0.890548, -0.23959, 0.386678,
+							-0.965311, -0.261102, 0,
+							0.913811, 0.406139, 0,
+							0.842942, 0.38439, 0.376421,
+							0.548194, 0.264706, 0.793356,
+							-1.8594e-008, -5.87553e-008, 1,
+							-0.534196, -0.289235, 0.794341,
+							-0.807437, -0.452559, 0.378465,
+							-0.869653, -0.493664, 0,
+							0.83205, 0.5547, 0,
+							0.772293, 0.530527, 0.349435,
+							0.515845, 0.379263, 0.768156,
+							-2.48164e-008, -6.43889e-008, 1,
+							-0.486434, -0.411777, 0.770598,
+							-0.700515, -0.619694, 0.353919,
+							-0.743581, -0.668646, 0,
+							0.722373, 0.691503, 0,
+							0.676612, 0.666255, 0.31353,
+							0.471519, 0.495195, 0.729693,
+							-2.71577e-008, -7.53755e-008, 1,
+							-0.433172, -0.52092, 0.73553,
+							-0.589822, -0.740319, 0.322549,
+							-0.617031, -0.786939, 0,
+							0.580972, 0.813923, 0,
+							0.548733, 0.784249, 0.289562,
+							0.396971, 0.593617, 0.700024,
+							-2.572e-008, -8.77449e-008, 1,
+							-0.367048, -0.602921, 0.708352,
+							-0.485318, -0.820874, 0.301051,
+							-0.504835, -0.863216, 0,
+							0.390503, 0.867784, 0.307341,
+							0.285351, 0.634113, 0.718663,
+							-2.36665e-008, -9.72958e-008, 1,
+							-0.285351, -0.634114, 0.718661,
+							-0.390503, -0.867784, 0.30734,
+							-0.410365, -0.911921, 0,
+							-0.890548, -0.23959, -0.386679,
+							-0.577707, -0.153129, -0.801752,
+							1.08654e-008, 5.5622e-008 , -1,
+							0.579872, 0.145888, -0.801539,
+							0.895973, 0.219227, -0.386228,
+							-0.807437, -0.452558, -0.378466,
+							-0.534196, -0.289235, -0.794341,
+							2.27516e-008, 5.19016e-008 , -1,
+							0.548196, 0.264707, -0.793355,
+							0.842943, 0.384391, -0.376419,
+							-0.700515, -0.619694, -0.353919,
+							-0.486433, -0.411777, -0.770599,
+							2.48164e-008, 6.43889e-008 , -1,
+							0.515847, 0.379264, -0.768154,
+							0.772293, 0.530528, -0.349433,
+							-0.589822, -0.740319, -0.322549,
+							-0.433171, -0.520919, -0.735531,
+							2.71577e-008, 7.53755e-008 , -1,
+							0.47152, 0.495196, -0.729691,
+							0.676612, 0.666255, -0.313529,
+							-0.485318, -0.820874, -0.301052,
+							-0.367047, -0.60292, -0.708353,
+							2.88747e-008, 8.75411e-008 , -1,
+							0.396972, 0.593619, -0.700022,
+							0.548733, 0.784249, -0.289561,
+							-0.390503, -0.867784, -0.30734,
+							-0.285351, -0.634113, -0.718662,
+							2.36665e-008, 9.72958e-008 , -1,
+							0.285351, 0.634114, -0.718661,
+							0.390503, 0.867785, -0.307339,
+							-0.333935, 0.942596, 0,
+							0, 1, 0,
+							-0.291732, 0.855995, 0.426808,
+							-0.0157731, 0.886804, 0.461877,
+							-0.135103, 0.53438, 0.834377,
+							-0.0291362, 0.514277, 0.857129,
+							0.110195, 0.0292375, 0.99348,
+							4.3732e-009, -8.94073e-008, 1,
+							0.348602, -0.464039, 0.814337,
+							0.0673463, -0.513328, 0.855546,
+							0.492146, -0.767551, 0.410679,
+							0.134339, -0.878875, 0.457746,
+							0.528678, -0.848822, 0,
+							0.158678, -0.98733, 0,
+							-0.731055, 0.682318, 0,
+							-0.64585, 0.656206, 0.390219,
+							-0.31251, 0.484842, 0.816864,
+							0.215359, 0.108813, 0.970454,
+							0.627608, -0.260237, 0.733747,
+							0.813963, -0.465103, 0.348055,
+							0.854063, -0.52017, 0,
+							-0.920582, 0.39055, 0,
+							-0.835236, 0.412221, 0.363943,
+							-0.451322, 0.38916, 0.803034,
+							0.214084, 0.180281, 0.960035,
+							0.705425, -0.0805069, 0.704198,
+							0.913262, -0.239978, 0.329185,
+							0.957826, -0.287348, 0,
+							-0.948683, 0.316228, 0,
+							-0.842821, 0.34961, 0.409177,
+							-0.452672, 0.347535, 0.821162,
+							0.113546, 0.191909, 0.974822,
+							0.60461, -0.0547987, 0.794634,
+							0.880145, -0.253261, 0.401503,
+							0.947589, -0.319493, 0,
+							-0.874591, 0.484861, 0,
+							-0.723794, 0.476715, 0.498864,
+							-0.365377, 0.375544, 0.851743,
+							0.0260102, 0.151516, 0.988113,
+							0.417243, -0.185123, 0.88974,
+							0.70819, -0.506054, 0.492318,
+							0.787582, -0.61621, 0,
+							-0.600001, 0.799999, 0,
+							-0.497164, 0.711095, 0.497165,
+							-0.267367, 0.443286, 0.855577,
+							0, -4.47006e-008, 1,
+							0.250514, -0.54278, 0.801644,
+							0.366221, -0.855433, 0.36622,
+							0.384615, -0.923077, 0,
+							0.528678, -0.848822, 0,
+							0.492146, -0.767551, -0.41068,
+							0.134339, -0.878875, -0.457747,
+							0.348602, -0.464038, -0.814337,
+							0.0673462, -0.513327, -0.855546,
+							0.110195, 0.0292377, -0.99348,
+							-4.3732e-009, 8.94073e-008 , -1,
+							-0.135104, 0.534382, -0.834376,
+							-0.0291362, 0.514278, -0.857128,
+							-0.291732, 0.855996, -0.426806,
+							-0.0157731, 0.886804, -0.461876,
+							-0.333935, 0.942596, 0,
+							0.854063, -0.52017, 0,
+							0.813963, -0.465103, -0.348056,
+							0.627607, -0.260237, -0.733748,
+							0.215359, 0.108813, -0.970454,
+							-0.312512, 0.484843, -0.816862,
+							-0.645851, 0.656206, -0.390218,
+							0.913262, -0.239977, -0.329185,
+							0.705424, -0.0805064, -0.704199,
+							0.214084, 0.180281, -0.960035,
+							-0.451324, 0.38916, -0.803032,
+							-0.835237, 0.412221, -0.363941,
+							0.947589, -0.319493, 0,
+							0.880144, -0.253261, -0.401503,
+							0.60461, -0.0547981, -0.794635,
+							0.113546, 0.191909, -0.974822,
+							-0.452675, 0.347535, -0.821161,
+							-0.842822, 0.34961, -0.409175,
+							-0.948683, 0.316228, 0,
+							0.787582, -0.61621, 0,
+							0.70819, -0.506053, -0.492318,
+							0.417243, -0.185122, -0.88974,
+							0.0260103, 0.151516, -0.988113,
+							-0.365379, 0.375545, -0.851742,
+							-0.723796, 0.476715, -0.498861,
+							-0.874591, 0.484861, 0,
+							0.36622, -0.855433, -0.36622,
+							0.250514, -0.54278, -0.801644,
+							0, 4.47006e-008 , -1,
+							-0.267368, 0.443289, -0.855575,
+							-0.497165, 0.711096, -0.497162,
+							-0.467888, 0.883788, 0,
+							-0.387053, 0.824948, 0.411887,
+							-0.215548, 0.655025, 0.72421,
+							-0.00489616, 0.343259, 0.939228,
+							0.269127, -0.23781, 0.933283,
+							0.442187, -0.761825, 0.473385,
+							0.463425, -0.886136, 0,
+							-0.306008, 0.952029, 0,
+							-0.253998, 0.928137, 0.272115,
+							-0.14959, 0.863647, 0.481391,
+							-0.0195232, 0.746219, 0.665414,
+							0.218115, 0.441118, 0.870541,
+							0.612385, -0.337374, 0.714957,
+							0.694135, -0.719844, 0,
+							0, 1, 0,
+							-0.0182315, 0.999613, -0.0210205,
+							-0.0369304, 0.999286, 0.00796664,
+							-0.0348909, 0.997622, 0.059444,
+							-0.00787177, 0.994104, 0.108145,
+							0.0539575, 0.992309, 0.111405,
+							0.106533, 0.994309, 0,
+							0.913813, 0.406135, 0,
+							0.507716, 0.52532, -0.682835,
+							0.148478, 0.676273, -0.721533,
+							-0.0300304, 0.787464, -0.615629,
+							-0.144372, 0.876436, -0.459366,
+							-0.223743, 0.943891, -0.242919,
+							-0.253109, 0.967438, 0,
+							0.789351, -0.613942, 0,
+							0.577415, -0.400033, -0.711734,
+							0.241288, -0.0136421, -0.970358,
+							-0.0103803, 0.344669, -0.938667,
+							-0.199105, 0.663018, -0.72164,
+							-0.316295, 0.875642, -0.364979,
+							-0.349987, 0.936755, 0,
+							0.6, -0.8, 0,
+							0.483629, -0.690899, -0.537366,
+							0.247465, -0.40568, -0.879878,
+							0, 4.47028e-008 , -1,
+							-0.236617, 0.486025, -0.841304,
+							-0.378646, 0.824393, -0.420717,
+							-0.410365, 0.911921, 0,
+							0.442188, -0.761824, -0.473386,
+							0.269127, -0.237807, -0.933284,
+							-0.0048962, 0.343262, -0.939227,
+							-0.215548, 0.655028, -0.724208,
+							-0.387053, 0.82495, -0.411884,
+							0.612385, -0.337369, -0.714959,
+							0.218114, 0.441124, -0.870538,
+							-0.0195232, 0.746221, -0.665412,
+							-0.14959, 0.863648, -0.481389,
+							-0.253997, 0.928138, -0.272112,
+							0.0539562, 0.992309, -0.111404,
+							-0.00787199, 0.994104, -0.108144,
+							-0.0348909, 0.997622, -0.0594425,
+							-0.0369306, 0.999286, -0.00796709,
+							-0.0182318, 0.999613, 0.0210199,
+							-0.223743, 0.943891, 0.242919,
+							-0.144372, 0.876437, 0.459364,
+							-0.0300305, 0.787466, 0.615626,
+							0.148478, 0.676276, 0.721529,
+							0.507717, 0.525323, 0.682832,
+							-0.316294, 0.875642, 0.364979,
+							-0.199104, 0.663019, 0.72164,
+							-0.0103804, 0.344672, 0.938666,
+							0.241289, -0.0136406, 0.970357,
+							0.577417, -0.400034, 0.711732,
+							-0.378646, 0.824393, 0.420718,
+							-0.236617, 0.486023, 0.841305,
+							0, -4.47028e-008, 1,
+							0.247466, -0.405682, 0.879877,
+							0.48363, -0.690899, 0.537365,
+							0.249998, 0.968246, 0,
+							0.001257, 0.999999, 0,
+							0.241077, 0.968356, 0.0645611,
+							0.00120899, 0.999999, 0.000335259,
+							0.215548, 0.968509, 0.124615,
+							0.00108352, 0.999999, 0.000626407,
+							0.175886, 0.96857, 0.175886,
+							0.124616, 0.968509, 0.215548,
+							0.0645611, 0.968356, 0.241077,
+							0, 0.968246, 0.249998,
+							0.989204, 0.146548, 0,
+							0.955495, 0.146755, 0.255913,
+							0.856312, 0.147029, 0.495088,
+							0.699411, 0.147135, 0.699411,
+							0.495089, 0.147029, 0.856312,
+							0.255914, 0.146754, 0.955495,
+							0, 0.146548, 0.989204,
+							0.780869, -0.624695, 0,
+							0.753687, -0.625441, 0.201937,
+							0.674735, -0.626493, 0.390178,
+							0.550895, -0.62692, 0.550896,
+							0.390179, -0.626493, 0.674734,
+							0.201938, -0.625441, 0.753688,
+							0, -0.624695, 0.780869,
+							0.747409, -0.664364, 0,
+							0.721243, -0.665116, 0.193465,
+							0.645526, -0.66618, 0.373497,
+							0.527081, -0.666611, 0.527081,
+							0.373498, -0.66618, 0.645526,
+							0.193466, -0.665116, 0.721243,
+							0, -0.664364, 0.747409,
+							0.950775, -0.309882, 0,
+							0.917897, -0.310647, 0.246906,
+							0.822132, -0.311772, 0.476337,
+							0.671753, -0.312241, 0.671754,
+							0.476338, -0.311771, 0.822132,
+							0.246907, -0.310647, 0.917897,
+							0, -0.309882, 0.950775,
+							0.6, 0.8, 0,
+							0.578783, 0.800417, 0.15602,
+							0.517905, 0.800964, 0.300385,
+							0.423156, 0.801173, 0.423156,
+							0.300386, 0.800964, 0.517904,
+							0.156021, 0.800416, 0.578784,
+							0, 0.799999, 0.600001,
+							0, 0.968246, 0.249998,
+							-0.064561, 0.968356, 0.241077,
+							-0.124615, 0.968509, 0.215548,
+							-0.175885, 0.968571, 0.175885,
+							-0.215548, 0.968509, 0.124616,
+							-0.241076, 0.968356, 0.064561,
+							-0.249998, 0.968246, 0,
+							0, 0.146549, 0.989203,
+							-0.255913, 0.146755, 0.955495,
+							-0.495088, 0.14703, 0.856312,
+							-0.699411, 0.147136, 0.699411,
+							-0.856311, 0.14703, 0.495089,
+							-0.955495, 0.146755, 0.255914,
+							-0.989203, 0.146549, 0,
+							-0.201937, -0.625441, 0.753688,
+							-0.390178, -0.626493, 0.674735,
+							-0.550895, -0.62692, 0.550896,
+							-0.674734, -0.626493, 0.390179,
+							-0.753687, -0.625441, 0.201939,
+							-0.780869, -0.624695, 0,
+							0, -0.664364, 0.747409,
+							-0.193465, -0.665116, 0.721244,
+							-0.373497, -0.66618, 0.645527,
+							-0.527081, -0.666611, 0.527081,
+							-0.645526, -0.66618, 0.373498,
+							-0.721243, -0.665116, 0.193466,
+							-0.747409, -0.664364, 0,
+							0, -0.309883, 0.950775,
+							-0.246906, -0.310648, 0.917897,
+							-0.476336, -0.311773, 0.822132,
+							-0.671753, -0.312242, 0.671753,
+							-0.822131, -0.311773, 0.476338,
+							-0.917897, -0.310648, 0.246907,
+							-0.950775, -0.309883, 0,
+							-0.15602, 0.800417, 0.578784,
+							-0.300385, 0.800964, 0.517905,
+							-0.423156, 0.801173, 0.423156,
+							-0.517904, 0.800964, 0.300386,
+							-0.578783, 0.800417, 0.15602,
+							-0.6, 0.8, 0,
+							-0.249998, 0.968246, 0,
+							-0.241077, 0.968356, -0.064561,
+							-0.215548, 0.968509, -0.124615,
+							-0.175885, 0.968571, -0.175885,
+							-0.124616, 0.968509, -0.215548,
+							-0.064561, 0.968356, -0.241077,
+							0, 0.968246, -0.249998,
+							-0.989204, 0.146547, 0,
+							-0.955496, 0.146753, -0.255912,
+							-0.856312, 0.147028, -0.495088,
+							-0.699411, 0.147134, -0.699411,
+							-0.495089, 0.147028, -0.856312,
+							-0.255914, 0.146753, -0.955495,
+							0, 0.146547, -0.989204,
+							-0.753688, -0.625441, -0.201937,
+							-0.674735, -0.626494, -0.390178,
+							-0.550896, -0.62692, -0.550895,
+							-0.390179, -0.626494, -0.674734,
+							-0.201938, -0.625441, -0.753687,
+							0, -0.624695, -0.780869,
+							-0.747409, -0.664364, 0,
+							-0.721244, -0.665116, -0.193465,
+							-0.645526, -0.66618, -0.373497,
+							-0.527081, -0.666612, -0.527081,
+							-0.373498, -0.66618, -0.645526,
+							-0.193466, -0.665116, -0.721243,
+							0, -0.664364, -0.747409,
+							-0.950776, -0.30988, 0,
+							-0.917898, -0.310645, -0.246906,
+							-0.822133, -0.31177, -0.476337,
+							-0.671754, -0.312239, -0.671754,
+							-0.476338, -0.31177, -0.822132,
+							-0.246907, -0.310646, -0.917898,
+							0, -0.309881, -0.950775,
+							-0.578783, 0.800417, -0.15602,
+							-0.517905, 0.800964, -0.300384,
+							-0.423155, 0.801174, -0.423155,
+							-0.300386, 0.800964, -0.517904,
+							-0.15602, 0.800417, -0.578783,
+							0, 0.8, -0.6,
+							0.064561, 0.968356, -0.241077,
+							0.124615, 0.968509, -0.215548,
+							0.175885, 0.968571, -0.175885,
+							0.215549, 0.968509, -0.124616,
+							0.241077, 0.968356, -0.064561,
+							0.249998, 0.968246, 0,
+							0.255913, 0.146754, -0.955496,
+							0.495088, 0.147028, -0.856312,
+							0.699411, 0.147134, -0.699411,
+							0.856312, 0.147028, -0.495089,
+							0.955495, 0.146753, -0.255914,
+							0.989204, 0.146547, 0,
+							0.201937, -0.625441, -0.753687,
+							0.390178, -0.626494, -0.674735,
+							0.550896, -0.62692, -0.550895,
+							0.674734, -0.626494, -0.390179,
+							0.753687, -0.625441, -0.201938,
+							0.193465, -0.665116, -0.721243,
+							0.373497, -0.66618, -0.645526,
+							0.527081, -0.666612, -0.527081,
+							0.645526, -0.66618, -0.373498,
+							0.721244, -0.665116, -0.193466,
+							0.747409, -0.664364, 0,
+							0.246906, -0.310646, -0.917898,
+							0.476337, -0.31177, -0.822133,
+							0.671754, -0.312239, -0.671754,
+							0.822133, -0.31177, -0.476338,
+							0.917898, -0.310646, -0.246907,
+							0.950776, -0.30988, 0,
+							0.15602, 0.800417, -0.578783,
+							0.300384, 0.800964, -0.517905,
+							0.423155, 0.801174, -0.423155,
+							0.517904, 0.800964, -0.300386,
+							0.578783, 0.800417, -0.15602,
+							0.268354, 0.96332, 0,
+							0.258757, 0.963421, 0.0697519,
+							0.231413, 0.963552, 0.134219,
+							0.189037, 0.963603, 0.189037,
+							0.13422, 0.963552, 0.231413,
+							0.0697519, 0.963421, 0.258756,
+							0, 0.96332, 0.268354,
+							0.168031, 0.985782, 0,
+							0.162012, 0.985822, 0.0436728,
+							0.144879, 0.985875, 0.0840299,
+							0.118345, 0.985895, 0.118345,
+							0.0840302, 0.985875, 0.144879,
+							0.0436728, 0.985822, 0.162011,
+							0, 0.985782, 0.168031,
+							0.14834, 0.988936, 0,
+							0.143025, 0.988968, 0.0385546,
+							0.127899, 0.989009, 0.0741814,
+							0.104474, 0.989025, 0.104474,
+							0.0741816, 0.989009, 0.127899,
+							0.0385547, 0.988968, 0.143025,
+							0, 0.988936, 0.148341,
+							0.193633, 0.981074, 0,
+							0.186698, 0.981127, 0.0503274,
+							0.166959, 0.981197, 0.0968359,
+							0.136382, 0.981224, 0.136382,
+							0.0968361, 0.981197, 0.166958,
+							0.0503276, 0.981127, 0.186699,
+							0, 0.981074, 0.193633,
+							0.390291, 0.920691, 0,
+							0.376377, 0.920895, 0.101458,
+							0.336655, 0.921161, 0.19526,
+							0.275023, 0.921262, 0.275023,
+							0.19526, 0.921161, 0.336655,
+							0.101459, 0.920894, 0.376377,
+							0, 0.920691, 0.390291,
+							1, 0, 0,
+							0.965535, -2.6932e-008, 0.260274,
+							0.865031, -2.65808e-008, 0.501718,
+							0.707107, -1.58043e-008, 0.707107,
+							0.501719, -5.72865e-009, 0.865031,
+							0.260276, -7.99283e-010, 0.965534,
+							0, 0, 1,
+							-0.0697519, 0.963421, 0.258757,
+							-0.134219, 0.963552, 0.231413,
+							-0.189037, 0.963603, 0.189037,
+							-0.231413, 0.963552, 0.13422,
+							-0.258756, 0.963421, 0.0697519,
+							-0.268354, 0.96332, 0,
+							-0.0436727, 0.985822, 0.162012,
+							-0.0840298, 0.985875, 0.144879,
+							-0.118345, 0.985895, 0.118345,
+							-0.144879, 0.985875, 0.0840302,
+							-0.162011, 0.985822, 0.0436728,
+							-0.168031, 0.985782, 0,
+							-0.0385546, 0.988968, 0.143025,
+							-0.0741813, 0.989009, 0.127899,
+							-0.104474, 0.989025, 0.104474,
+							-0.127899, 0.989009, 0.0741816,
+							-0.143025, 0.988968, 0.0385547,
+							-0.14834, 0.988936, 0,
+							-0.0503274, 0.981127, 0.186698,
+							-0.0968359, 0.981197, 0.166959,
+							-0.136382, 0.981224, 0.136382,
+							-0.166958, 0.981197, 0.0968361,
+							-0.186699, 0.981127, 0.0503276,
+							-0.193633, 0.981074, 0,
+							-0.101458, 0.920895, 0.376377,
+							-0.19526, 0.921161, 0.336655,
+							-0.275023, 0.921262, 0.275023,
+							-0.336655, 0.921161, 0.19526,
+							-0.376377, 0.920894, 0.101459,
+							-0.390291, 0.920691, 0,
+							-0.260274, -7.99271e-010, 0.965535,
+							-0.501718, -5.72859e-009, 0.865031,
+							-0.707107, -1.58043e-008, 0.707107,
+							-0.865031, -2.65808e-008, 0.501719,
+							-0.965534, -2.69321e-008, 0.260276,
+							-1, 0, 0,
+							-0.258757, 0.963421, -0.0697518,
+							-0.231413, 0.963552, -0.134219,
+							-0.189037, 0.963603, -0.189037,
+							-0.13422, 0.963552, -0.231413,
+							-0.0697518, 0.963421, -0.258756,
+							0, 0.96332, -0.268354,
+							-0.162012, 0.985822, -0.0436727,
+							-0.144879, 0.985875, -0.0840298,
+							-0.118345, 0.985895, -0.118345,
+							-0.0840302, 0.985875, -0.144879,
+							-0.0436727, 0.985822, -0.162011,
+							0, 0.985782, -0.168031,
+							-0.143025, 0.988968, -0.0385546,
+							-0.127899, 0.989009, -0.0741813,
+							-0.104474, 0.989025, -0.104474,
+							-0.0741816, 0.989009, -0.127899,
+							-0.0385547, 0.988968, -0.143025,
+							0, 0.988936, -0.14834,
+							-0.186698, 0.981127, -0.0503273,
+							-0.166959, 0.981197, -0.0968358,
+							-0.136382, 0.981224, -0.136382,
+							-0.0968361, 0.981197, -0.166958,
+							-0.0503276, 0.981127, -0.186699,
+							0, 0.981074, -0.193633,
+							-0.376377, 0.920895, -0.101458,
+							-0.336655, 0.921161, -0.19526,
+							-0.275023, 0.921262, -0.275023,
+							-0.19526, 0.921161, -0.336655,
+							-0.101459, 0.920894, -0.376377,
+							0, 0.920691, -0.390291,
+							-0.965535, 2.6932e-008, -0.260274,
+							-0.865031, 2.65807e-008, -0.501718,
+							-0.707107, 1.58043e-008, -0.707107,
+							-0.501719, 5.72864e-009, -0.865031,
+							-0.260276, 7.99283e-010, -0.965534,
+							0, 0 , -1,
+							0.0697518, 0.963421, -0.258757,
+							0.134219, 0.963552, -0.231413,
+							0.189037, 0.963603, -0.189037,
+							0.231413, 0.963552, -0.13422,
+							0.258756, 0.963421, -0.0697518,
+							0.0436727, 0.985822, -0.162012,
+							0.0840298, 0.985875, -0.144879,
+							0.118345, 0.985895, -0.118345,
+							0.144879, 0.985875, -0.0840302,
+							0.162011, 0.985822, -0.0436727,
+							0.0385546, 0.988968, -0.143025,
+							0.0741813, 0.989009, -0.127899,
+							0.104474, 0.989025, -0.104474,
+							0.127899, 0.989009, -0.0741816,
+							0.143025, 0.988968, -0.0385547,
+							0.0503274, 0.981127, -0.186698,
+							0.0968359, 0.981197, -0.166959,
+							0.136382, 0.981224, -0.136382,
+							0.166958, 0.981197, -0.0968361,
+							0.186699, 0.981127, -0.0503276,
+							0.101458, 0.920895, -0.376377,
+							0.19526, 0.921161, -0.336655,
+							0.275023, 0.921262, -0.275023,
+							0.336655, 0.921161, -0.19526,
+							0.376377, 0.920894, -0.101459,
+							0.260274, 7.99271e-010, -0.965535,
+							0.501718, 5.72859e-009, -0.865031,
+							0.707107, 1.58043e-008, -0.707107,
+							0.865031, 2.65807e-008, -0.501719,
+							0.965534, 2.6932e-008, -0.260276,
+							0.0226746, -0.999743, -1.91575e-007,
+							0.00017586 , -1, -1.78936e-007,
+							0.0218614, -0.999744, -0.00589325,
+							0.0195486, -0.999745, -0.0113383,
+							0.0159681, -0.999745, -0.0159682,
+							0.0113382, -0.999745, -0.0195487,
+							0.0058931, -0.999744, -0.0218616,
+							0, -0.999743, -0.0226747,
+							0.0623783, -0.998053, -2.05165e-007,
+							0.0601415, -0.998058, -0.0162122,
+							0.0537792, -0.998066, -0.0311921,
+							0.0439291, -0.998068, -0.0439292,
+							0.031192, -0.998066, -0.0537793,
+							0.0162121, -0.998058, -0.0601416,
+							0, -0.998053, -0.0623784,
+							0.141421, -0.98995, -2.16354e-007,
+							0.136353, -0.989978, -0.0367563,
+							0.121933, -0.990016, -0.0707209,
+							0.0996006, -0.99003, -0.0996008,
+							0.070721, -0.990016, -0.121933,
+							0.0367563, -0.989978, -0.136353,
+							0, -0.98995, -0.141421,
+							0.328521, -0.944497, -2.21665e-007,
+							0.316788, -0.944644, -0.0853952,
+							0.283332, -0.944838, -0.164332,
+							0.231454, -0.944912, -0.231454,
+							0.164333, -0.944838, -0.283331,
+							0.0853954, -0.944644, -0.316788,
+							0, -0.944497, -0.328521,
+							0.770022, -0.638017, -1.57624e-007,
+							0.743044, -0.638566, -0.200299,
+							0.665183, -0.639286, -0.385806,
+							0.543581, -0.639561, -0.543581,
+							0.385806, -0.639286, -0.665182,
+							0.2003, -0.638566, -0.743044,
+							0, -0.638017, -0.770022,
+							0.965535, 2.69333e-008, -0.260274,
+							0.865031, 2.6582e-008, -0.501718,
+							0.501719, 5.7289e-009, -0.865031,
+							0.260276, 7.9932e-010, -0.965534,
+							0, -0.999743, -0.0226747,
+							-0.00589307, -0.999744, -0.0218616,
+							-0.0113382, -0.999745, -0.0195487,
+							-0.015968, -0.999745, -0.0159682,
+							-0.0195486, -0.999745, -0.0113384,
+							-0.0218614, -0.999744, -0.00589328,
+							-0.0226746, -0.999743, -1.91575e-007,
+							0, -0.998053, -0.0623784,
+							-0.016212, -0.998058, -0.0601416,
+							-0.0311919, -0.998066, -0.0537794,
+							-0.0439291, -0.998068, -0.0439292,
+							-0.0537792, -0.998066, -0.0311922,
+							-0.0601415, -0.998058, -0.0162123,
+							-0.0623783, -0.998053, -2.05165e-007,
+							-0.0367561, -0.989978, -0.136353,
+							-0.0707208, -0.990016, -0.121933,
+							-0.0996006, -0.99003, -0.0996008,
+							-0.121932, -0.990016, -0.0707211,
+							-0.136353, -0.989978, -0.0367565,
+							-0.141421, -0.98995, -2.16354e-007,
+							0, -0.944497, -0.32852,
+							-0.0853949, -0.944644, -0.316788,
+							-0.164332, -0.944838, -0.283331,
+							-0.231454, -0.944912, -0.231454,
+							-0.283331, -0.944838, -0.164333,
+							-0.316788, -0.944644, -0.0853956,
+							-0.32852, -0.944497, -2.21665e-007,
+							0, -0.638018, -0.770021,
+							-0.200298, -0.638567, -0.743043,
+							-0.385805, -0.639287, -0.665182,
+							-0.543581, -0.639562, -0.543581,
+							-0.665181, -0.639287, -0.385806,
+							-0.743043, -0.638567, -0.2003,
+							-0.770021, -0.638018, -1.57625e-007,
+							-0.260274, 7.99307e-010, -0.965535,
+							-0.501718, 5.72886e-009, -0.865031,
+							-0.865031, 2.65819e-008, -0.501719,
+							-0.965534, 2.69333e-008, -0.260276,
+							-0.0226746, -0.999743, -1.91442e-007,
+							-0.0218614, -0.999744, 0.00589289,
+							-0.0195486, -0.999745, 0.011338,
+							-0.0159681, -0.999745, 0.0159679,
+							-0.0113382, -0.999745, 0.0195484,
+							-0.0058931, -0.999744, 0.0218612,
+							0, -0.999743, 0.0226744,
+							-0.0623783, -0.998053, -2.04538e-007,
+							-0.0601415, -0.998058, 0.0162119,
+							-0.0537793, -0.998066, 0.0311918,
+							-0.0439291, -0.998068, 0.0439289,
+							-0.031192, -0.998066, 0.0537791,
+							-0.0162121, -0.998058, 0.0601414,
+							0, -0.998053, 0.0623782,
+							-0.136353, -0.989978, 0.0367559,
+							-0.121932, -0.990016, 0.0707206,
+							-0.0996006, -0.99003, 0.0996005,
+							-0.0707209, -0.990016, 0.121932,
+							-0.0367563, -0.989978, 0.136353,
+							0, -0.98995, 0.141421,
+							-0.328521, -0.944497, -2.1827e-007,
+							-0.316789, -0.944644, 0.0853949,
+							-0.283332, -0.944838, 0.164332,
+							-0.231455, -0.944911, 0.231454,
+							-0.164333, -0.944837, 0.283332,
+							-0.0853956, -0.944644, 0.316789,
+							0, -0.944497, 0.328521,
+							-0.770023, -0.638016, -1.53325e-007,
+							-0.743045, -0.638564, 0.200299,
+							-0.665184, -0.639284, 0.385806,
+							-0.543582, -0.63956, 0.543582,
+							-0.385807, -0.639284, 0.665183,
+							-0.2003, -0.638564, 0.743045,
+							0, -0.638016, 0.770023,
+							-0.965535, -2.69333e-008, 0.260274,
+							-0.865031, -2.6582e-008, 0.501718,
+							-0.707107, -1.58051e-008, 0.707107,
+							-0.501719, -5.7289e-009, 0.865031,
+							-0.260276, -7.9932e-010, 0.965534,
+							0.00589307, -0.999744, 0.0218612,
+							0.0113382, -0.999745, 0.0195484,
+							0.0159681, -0.999745, 0.0159679,
+							0.0195486, -0.999745, 0.011338,
+							0.0218614, -0.999744, 0.00589292,
+							0.0226746, -0.999743, -1.91442e-007,
+							0.016212, -0.998058, 0.0601414,
+							0.0311919, -0.998066, 0.0537791,
+							0.0439291, -0.998068, 0.0439289,
+							0.0537792, -0.998066, 0.0311918,
+							0.0601415, -0.998058, 0.016212,
+							0.0623783, -0.998053, -2.04538e-007,
+							0.0367561, -0.989978, 0.136353,
+							0.0707208, -0.990016, 0.121932,
+							0.0996006, -0.99003, 0.0996005,
+							0.121932, -0.990016, 0.0707208,
+							0.136353, -0.989978, 0.0367561,
+							0.0853951, -0.944644, 0.316789,
+							0.164332, -0.944838, 0.283332,
+							0.231455, -0.944911, 0.231454,
+							0.283332, -0.944837, 0.164333,
+							0.316789, -0.944644, 0.0853954,
+							0.328521, -0.944497, -2.1827e-007,
+							0.200299, -0.638564, 0.743045,
+							0.385806, -0.639284, 0.665184,
+							0.543582, -0.63956, 0.543582,
+							0.665183, -0.639284, 0.385807,
+							0.743045, -0.638565, 0.2003,
+							0.770023, -0.638016, -1.53325e-007,
+							0.260274, -7.99307e-010, 0.965535,
+							0.501718, -5.72886e-009, 0.865031,
+							0.707107, -1.58051e-008, 0.707107,
+							0.865031, -2.65819e-008, 0.501719,
+							0.965534, -2.69333e-008, 0.260276,
+							0.000169553 , -1, 4.55269e-005,
+							0.000151615 , -1, 8.7758e-005,
+							0.000123845 , -1, 0.000123666,
+							8.79365e-005 , -1, 0.000151436,
+							4.57054e-005 , -1, 0.000169374,
+							0 , -1, 0.000175681,
+							-4.57057e-005 , -1, 0.000169374,
+							-8.79367e-005 , -1, 0.000151436,
+							-0.000123845 , -1, 0.000123666,
+							-0.000151615 , -1, 8.77577e-005,
+							-0.000169553 , -1, 4.55266e-005,
+							-0.00017586 , -1, -1.78936e-007,
+							-0.141421, -0.98995, -2.18023e-007,
+							0 , -1, -0.000176026,
+							-4.57022e-005 , -1, -0.000169719,
+							-8.79303e-005 , -1, -0.000151783,
+							-0.000123836 , -1, -0.000124015,
+							-0.000151604 , -1, -8.81092e-005,
+							-0.00016954 , -1, -4.58813e-005,
+							-0.000175847 , -1, -1.78936e-007,
+							0.141421, -0.98995, -2.18023e-007,
+							0.000175847 , -1, -1.78936e-007,
+							0.000169541 , -1, -4.58811e-005,
+							0.000151604 , -1, -8.81091e-005,
+							0.000123836 , -1, -0.000124015,
+							8.79306e-005 , -1, -0.000151783,
+							4.57025e-005 , -1, -0.000169719,
+							0.423155, 0.801174, 0.423155,
+							0.300386, 0.800964, 0.517905,
+							0.15602, 0.800417, 0.578784,
+							0, 0.8, 0.6,
+							0.000884181, 0.999999, 0.000884182,
+							0.0006461, 0.999999, 0.00107175,
+							0.000305924, 0.999999, 0.00121748,
+							0, 0.999999, 0.001257,
+							0.00125688, 0.999999, 0,
+							0.00121716, 0.999999, -0.000305839,
+							0.00107193, 0.999999, -0.000646202,
+							0.00088386, 0.999999, -0.00088386,
+							0.000626479, 0.999999, -0.00108364,
+							0.000335298, 0.999999, -0.00120914,
+							0, 0.999999, -0.00125688,
+							-0.000305839, 0.999999, -0.00121716,
+							-0.000646202, 0.999999, -0.00107193,
+							-0.00088386, 0.999999, -0.00088386,
+							-0.00108364, 0.999999, -0.000626479,
+							-0.00120914, 0.999999, -0.000335298,
+							-0.00125688, 0.999999, 0,
+							0.517904, 0.800965, -0.300385,
+							0.300384, 0.800965, -0.517904,
+							0.15602, 0.800418, -0.578782,
+							0, 0.800001, -0.599999,
+							-0.15602, 0.800418, -0.578783,
+							-0.300385, 0.800965, -0.517903,
+							-0.517904, 0.800965, -0.300384,
+							-0.15602, 0.800417, 0.578783,
+							-0.300384, 0.800964, 0.517905,
+							-0.423155, 0.801174, 0.423155,
+							0, 0.999999, 0.00125701,
+							-0.000335262, 0.999999, 0.00120901,
+							-0.000626413, 0.999999, 0.00108353,
+							-0.00088419, 0.999999, 0.00088419,
+							-0.00107176, 0.999999, 0.000646106,
+							-0.00121749, 0.999999, 0.000305927,
+							-0.00125701, 0.999999, 0,
+							0.366221, -0.855433, -0.36622,
+							-0.497164, 0.711096, -0.497162,
+							-0.6, 0.8, 0,
+							-0.267367, 0.443287, 0.855577,
+							-0.0149983, 0.999888, 0,
+							-1, 0, 0,
+							-0.811257, -0.584689, -4.21204e-009,
+							0.811257, -0.584689, -4.21204e-009,
+							-0.6981, -0.716, -1.86057e-008,
+							0.6981, -0.716, -1.86057e-008,
+							-0.636383, -0.771373, -5.10224e-008,
+							0.636383, -0.771373, -5.10224e-008,
+							-0.675056, -0.737767, -1.01053e-007,
+							0.675056, -0.737767, -1.01053e-007,
+							0.965535, -2.6933e-008, 0.260274,
+							0.902861, 0.429933, 0,
+							0.637936, 0.431366, -0.637936,
+							0, 0.429933, -0.902861,
+							-0.637936, 0.431366, -0.637936,
+							-0.902861, 0.429933, 0,
+							0, 0.429933, 0.902861,
+							-0.637936, 0.431366, 0.637936,
+							-0.556737, 0.830689, 0,
+							0.637936, 0.431366, 0.637936,
+							0, -0.156768, -0.987635,
+							-0.148341, 0.988936, 0,
+							0.148341, 0.988936, 0};
+
+int  teapot_indices[] = {	
+							1122, 1243, 1272, 1242, 1273, 1241, 1274, 1240, 
+						1275, 1239, 1276, 1238, 1277, 1205, 1278, 1204, 
+						1279, 1203, 1280, 1202, 1281, 1201, 1282, 1200, 
+						1283, 1199, -1, 1243, 1249, 1242, 1248, 1241, 1247, 
+						1240, 1246, 1239, 1245, 1238, 1244, 1205, 1212, 
+						1204, 1211, 1203, 1210, 1202, 1209, 1201, 1208, 
+						1200, 1207, 1199, 1206, -1, 1249, 1136, 1248, 1254, 
+						1247, 1253, 1246, 1252, 1245, 1251, 1244, 1250, 
+						1212, 1218, 1211, 1217, 1210, 1216, 1209, 1215, 
+						1208, 1214, 1207, 1213, 1206, 1180, -1, 1136, 1260, 
+						1254, 1259, 1253, 1258, 1252, 1257, 1251, 1256, 
+						1250, 1255, 1218, 1225, 1217, 1224, 1216, 1223, 
+						1215, 1222, 1214, 1221, 1213, 1220, 1180, 1219, 
+						-1, 1260, 1266, 1259, 1265, 1258, 1264, 1257, 1263, 
+						1256, 1262, 1255, 1261, 1225, 1232, 1224, 1231, 
+						1223, 1230, 1222, 1229, 1221, 1228, 1220, 1227, 
+						1219, 1226, -1, 1266, 384, 1265, 1271, 1264, 1270, 
+						1263, 1269, 1262, 1268, 1261, 1267, 1232, 390, 
+						1231, 1237, 1230, 1236, 1229, 1235, 1228, 1234, 
+						1227, 1233, 1226, 426, -1, 462, 1188, 1195, 1189, 
+						1196, 1190, 459, 1191, 1197, 1192, 1198, 1193, 
+						426, 1194, -1, 1188, 1181, 1189, 1182, 1190, 1183, 
+						1191, 1184, 1192, 1185, 1193, 1186, 1194, 1187, 
+						-1, 1181, 1142, 1182, 1175, 1183, 1176, 1184, 1177, 
+						1185, 1178, 1186, 1179, 1187, 1284, -1, 1142, 1168, 
+						1175, 1169, 1176, 1170, 1177, 1171, 1178, 1172, 
+						1179, 1173, 1284, 1174, -1, 1168, 1161, 1169, 1162, 
+						1170, 1163, 1171, 1164, 1172, 1165, 1173, 1166, 
+						1174, 1167, -1, 1161, 1285, 1162, 1286, 1163, 1287, 
+						1164, 1288, 1165, 1289, 1166, 1290, 1167, 1291, 
+						-1, 384, 1150, 1157, 1151, 1158, 1152, 490, 1153, 
+						1159, 1154, 1160, 1155, 462, 1156, -1, 1150, 1143, 
+						1151, 1144, 1152, 1145, 1153, 1146, 1154, 1147, 
+						1155, 1148, 1156, 1149, -1, 1143, 1292, 1144, 1137, 
+						1145, 1138, 1146, 1139, 1147, 1140, 1148, 1141, 
+						1149, 1142, -1, 1292, 1129, 1137, 1130, 1138, 1131, 
+						1139, 1132, 1140, 1133, 1141, 1134, 1142, 1135, 
+						-1, 1129, 1121, 1130, 1123, 1131, 1124, 1132, 1125, 
+						1133, 1126, 1134, 1127, 1135, 1128, -1, 1121, 1293, 
+						1123, 1294, 1124, 1295, 1125, 1296, 1126, 1297, 
+						1127, 1298, 1128, 1285, -1, 902, 1024, 901, 1023, 
+						900, 1022, 899, 1021, 898, 1020, 897, 1019, 
+						862, 983, 861, 982, 860, 981, 859, 980, 
+						858, 979, 857, 978, 856, 977, -1, 856, 849, 
+						857, 850, 858, 851, 1299, 852, 1300, 853, 
+						1301, 854, 1302, 855, -1, 849, 842, 850, 843, 
+						851, 844, 852, 845, 853, 846, 854, 847, 
+						855, 848, -1, 842, 835, 843, 836, 844, 837, 
+						845, 838, 846, 839, 847, 840, 848, 841, 
+						-1, 835, 828, 836, 829, 837, 830, 838, 831, 
+						839, 832, 840, 833, 841, 834, -1, 828, 818, 
+						829, 820, 830, 822, 831, 824, 832, 825, 
+						833, 826, 834, 827, -1, 818, 819, 820, 821, 
+						822, 823, 824, 1303, 825, 1304, 826, 1305, 
+						827, 1306, -1, 1307, 948, 1308, 947, 1309, 946, 
+						1310, 945, 1311, 944, 1312, 943, 1313, 909, 
+						1314, 908, 1315, 907, 1316, 906, 1317, 905, 
+						1318, 904, 1319, 903, -1, 948, 954, 947, 953, 
+						946, 952, 945, 951, 944, 950, 943, 949, 
+						909, 916, 908, 915, 907, 914, 906, 913, 
+						905, 912, 904, 911, 903, 910, -1, 954, 835, 
+						953, 959, 952, 958, 951, 957, 950, 956, 
+						949, 955, 916, 922, 915, 921, 914, 920, 
+						913, 919, 912, 918, 911, 917, 910, 882, 
+						-1, 835, 965, 959, 964, 958, 963, 957, 962, 
+						956, 961, 955, 960, 922, 929, 921, 928, 
+						920, 927, 919, 926, 918, 925, 917, 924, 
+						882, 923, -1, 965, 971, 964, 970, 963, 969, 
+						962, 968, 961, 967, 960, 966, 929, 936, 
+						928, 935, 927, 934, 926, 933, 925, 932, 
+						924, 931, 923, 930, -1, 971, 856, 970, 976, 
+						969, 975, 968, 974, 967, 973, 966, 972, 
+						936, 942, 935, 941, 934, 940, 933, 939, 
+						932, 938, 931, 937, 930, 902, -1, 856, 977, 
+						976, 1095, 1320, 1094, 974, 1093, 1321, 1092, 
+						1322, 1091, 1323, 1060, 1324, 1059, 1325, 1058, 
+						939, 1057, 1326, 1056, 937, 1055, 902, 1024, 
+						-1, 1302, 890, 1327, 891, 1328, 892, 1329, 893, 
+						900, 894, 901, 895, 902, 896, -1, 890, 883, 
+						891, 884, 892, 885, 893, 886, 894, 887, 
+						895, 888, 896, 889, -1, 883, 841, 884, 877, 
+						885, 878, 886, 879, 887, 880, 888, 881, 
+						889, 882, -1, 841, 870, 877, 871, 878, 872, 
+						879, 873, 880, 874, 881, 875, 882, 876, 
+						-1, 870, 863, 871, 864, 872, 865, 873, 866, 
+						874, 867, 875, 868, 876, 869, -1, 863, 1330, 
+						864, 1331, 865, 1332, 866, 1333, 867, 1334, 
+						868, 1335, 869, 1336, -1, 787, 780, 813, 808, 
+						814, 809, 815, 810, 816, 811, 817, 812, 
+						781, 774, 782, 775, 783, 776, 784, 777, 
+						785, 778, 786, 779, 787, 780, -1, 774, 767, 
+						775, 768, 776, 769, 777, 770, 778, 771, 
+						779, 772, 780, 773, -1, 767, 760, 768, 761, 
+						769, 762, 770, 763, 771, 764, 772, 765, 
+						773, 766, 803, 798, 804, 799, 805, 800, 
+						806, 801, 807, 802, 767, 760, -1, 767, 774, 
+						807, 812, 806, 811, 805, 810, 804, 809, 
+						803, 808, 773, 780, -1, 760, 753, 761, 754, 
+						762, 755, 763, 756, 764, 757, 765, 758, 
+						766, 759, 798, 793, 799, 794, 800, 795, 
+						801, 796, 802, 797, 760, 753, -1, 759, 752, 
+						793, 788, 794, 789, 795, 790, 796, 791, 
+						797, 792, 753, 746, -1, 752, 703, 788, 741, 
+						789, 742, 790, 743, 791, 744, 792, 745, 
+						746, 697, 747, 698, 748, 699, 749, 700, 
+						750, 701, 751, 702, 752, 703, -1, 752, 759, 
+						751, 758, 750, 757, 749, 756, 748, 755, 
+						747, 754, 746, 753, -1, 703, 734, 1337, 735, 
+						742, 736, 743, 737, 744, 738, 1338, 739, 
+						1339, 740, -1, 734, 727, 735, 728, 736, 729, 
+						737, 730, 738, 731, 739, 732, 740, 733, 
+						-1, 727, 682, 728, 722, 729, 723, 730, 724, 
+						731, 725, 732, 726, 733, 676, -1, 682, 716, 
+						722, 717, 723, 718, 724, 719, 725, 720, 
+						726, 721, 676, 669, -1, 716, 704, 717, 705, 
+						718, 707, 719, 709, 720, 711, 721, 713, 
+						669, 715, -1, 704, 668, 705, 706, 707, 708, 
+						709, 710, 711, 712, 713, 714, 715, 656, 
+						-1, 1339, 690, 698, 691, 1340, 692, 700, 693, 
+						701, 694, 702, 695, 703, 696, -1, 690, 683, 
+						691, 684, 692, 685, 693, 686, 694, 687, 
+						695, 688, 696, 689, -1, 683, 676, 684, 677, 
+						685, 678, 686, 679, 687, 680, 688, 681, 
+						689, 682, -1, 676, 669, 677, 670, 678, 671, 
+						679, 672, 680, 673, 681, 674, 682, 675, 
+						-1, 669, 655, 670, 657, 671, 659, 672, 661, 
+						673, 663, 674, 665, 675, 667, -1, 655, 656, 
+						657, 658, 659, 660, 661, 662, 663, 664, 
+						665, 666, 667, 668, -1, 624, 618, 650, 645, 
+						651, 646, 652, 647, 653, 648, 654, 649, 
+						266, 612, -1, 266, 612, 619, 613, 620, 614, 
+						621, 615, 622, 616, 623, 617, 624, 618, 
+						-1, 612, 605, 613, 606, 614, 607, 615, 608, 
+						616, 609, 617, 610, 618, 611, 645, 640, 
+						646, 641, 647, 642, 648, 643, 649, 644, 
+						612, 605, -1, 605, 598, 606, 599, 607, 600, 
+						608, 601, 609, 602, 610, 603, 611, 604, 
+						640, 635, 641, 636, 642, 637, 643, 638, 
+						644, 639, 605, 598, -1, 604, 597, 635, 630, 
+						636, 631, 637, 632, 638, 633, 639, 634, 
+						598, 591, -1, 597, 590, 630, 625, 631, 626, 
+						632, 627, 633, 628, 634, 629, 591, 584, 
+						-1, 590, 541, 625, 579, 626, 580, 627, 581, 
+						628, 582, 629, 583, 584, 535, 585, 536, 
+						586, 537, 587, 538, 588, 539, 589, 540, 
+						590, 541, -1, 590, 597, 589, 596, 588, 595, 
+						587, 594, 586, 593, 585, 592, 584, 591, 
+						-1, 597, 604, 596, 603, 595, 602, 594, 601, 
+						593, 600, 592, 599, 591, 598, -1, 541, 572, 
+						579, 573, 580, 574, 581, 575, 582, 576, 
+						583, 577, 535, 578, -1, 572, 565, 573, 566, 
+						574, 567, 575, 568, 576, 569, 577, 570, 
+						578, 571, -1, 565, 520, 566, 560, 567, 561, 
+						568, 562, 569, 563, 570, 564, 571, 514, 
+						-1, 520, 553, 560, 554, 561, 555, 562, 556, 
+						563, 557, 564, 558, 514, 559, -1, 553, 505, 
+						554, 542, 555, 544, 556, 546, 557, 548, 
+						558, 550, 559, 552, -1, 505, 506, 542, 543, 
+						544, 545, 546, 547, 548, 549, 550, 551, 
+						552, 494, -1, 535, 528, 536, 529, 537, 530, 
+						538, 531, 539, 532, 540, 533, 541, 534, 
+						-1, 528, 521, 529, 522, 530, 523, 531, 524, 
+						532, 525, 533, 526, 534, 527, -1, 521, 514, 
+						522, 515, 523, 516, 524, 517, 525, 518, 
+						526, 519, 527, 520, -1, 514, 507, 515, 508, 
+						516, 509, 517, 510, 518, 511, 519, 512, 
+						520, 513, -1, 507, 493, 508, 495, 509, 497, 
+						510, 499, 511, 501, 512, 503, 513, 1341, 
+						-1, 493, 494, 495, 496, 497, 498, 499, 500, 
+						501, 502, 503, 504, 1341, 506, -1, 216, 349, 
+						348, 467, 347, 466, 346, 465, 345, 464, 
+						344, 463, 310, 432, 309, 431, 308, 430, 
+						307, 429, 306, 428, 305, 427, 1342, 396, 
+						-1, 349, 356, 467, 472, 466, 471, 465, 470, 
+						464, 469, 463, 468, 432, 438, 431, 437, 
+						430, 436, 429, 435, 428, 434, 427, 433, 
+						396, 402, -1, 356, 363, 472, 477, 471, 476, 
+						470, 475, 469, 474, 468, 473, 438, 444, 
+						437, 443, 436, 442, 435, 441, 434, 440, 
+						433, 439, 402, 408, -1, 363, 370, 477, 482, 
+						476, 481, 475, 480, 474, 479, 473, 478, 
+						444, 450, 443, 449, 442, 448, 441, 447, 
+						440, 446, 439, 445, 408, 414, -1, 370, 377, 
+						482, 487, 481, 486, 480, 485, 479, 484, 
+						478, 483, 450, 456, 449, 455, 448, 454, 
+						447, 453, 446, 452, 445, 451, 414, 420, 
+						-1, 377, 384, 487, 492, 486, 491, 485, 490, 
+						484, 489, 483, 488, 456, 462, 455, 461, 
+						454, 460, 453, 459, 452, 458, 451, 457, 
+						420, 426, -1, 1342, 396, 265, 395, 264, 394, 
+						263, 393, 262, 392, 261, 391, 222, 355, 
+						221, 354, 220, 353, 219, 352, 218, 351, 
+						217, 350, 216, 349, -1, 396, 1343, 395, 401, 
+						394, 400, 393, 399, 392, 398, 391, 397, 
+						355, 362, 354, 361, 353, 360, 352, 359, 
+						351, 358, 350, 357, 349, 1344, -1, 1343, 1345, 
+						401, 407, 400, 406, 399, 405, 398, 404, 
+						397, 403, 362, 369, 361, 368, 360, 367, 
+						359, 366, 358, 365, 357, 364, 1344, 1346, 
+						-1, 1345, 1347, 407, 413, 406, 412, 405, 411, 
+						404, 410, 403, 409, 369, 376, 368, 375, 
+						367, 374, 366, 373, 365, 372, 364, 371, 
+						1346, 1348, -1, 1347, 1349, 413, 419, 412, 418, 
+						411, 417, 410, 416, 409, 415, 376, 383, 
+						375, 382, 374, 381, 373, 380, 372, 379, 
+						371, 378, 1348, 1350, -1, 1349, 426, 419, 425, 
+						418, 424, 417, 423, 416, 422, 415, 421, 
+						383, 390, 382, 389, 381, 388, 380, 387, 
+						379, 386, 378, 385, 1350, 384, -1, 42, 320, 
+						319, 318, 317, 316, 174, 315, 314, 313, 
+						312, 311, 137, 277, 276, 275, 274, 273, 
+						134, 272, 271, 270, 269, 268, 92, 267, 
+						-1, 320, 326, 318, 325, 316, 324, 315, 323, 
+						313, 322, 311, 321, 277, 284, 275, 283, 
+						273, 282, 272, 281, 270, 280, 268, 279, 
+						267, 278, -1, 326, 195, 325, 331, 324, 330, 
+						323, 329, 322, 328, 321, 327, 284, 290, 
+						283, 289, 282, 288, 281, 287, 280, 286, 
+						279, 285, 278, 246, -1, 195, 337, 331, 336, 
+						330, 335, 329, 334, 328, 333, 327, 332, 
+						290, 297, 289, 296, 288, 295, 287, 294, 
+						286, 293, 285, 292, 246, 291, -1, 337, 343, 
+						336, 342, 335, 341, 334, 340, 333, 339, 
+						332, 338, 297, 304, 296, 303, 295, 302, 
+						294, 301, 293, 300, 292, 299, 291, 298, 
+						-1, 343, 216, 342, 348, 341, 347, 340, 346, 
+						339, 345, 338, 344, 304, 310, 303, 309, 
+						302, 308, 301, 307, 300, 306, 299, 305, 
+						298, 1342, -1, 222, 254, 261, 255, 262, 256, 
+						263, 257, 264, 258, 265, 259, 1342, 260, 
+						-1, 254, 247, 255, 248, 256, 249, 257, 250, 
+						258, 251, 259, 252, 260, 253, -1, 247, 201, 
+						248, 241, 249, 242, 250, 243, 251, 244, 
+						252, 245, 253, 246, -1, 201, 234, 241, 235, 
+						242, 236, 243, 237, 244, 238, 245, 239, 
+						246, 240, -1, 234, 223, 235, 224, 236, 226, 
+						237, 228, 238, 229, 239, 231, 240, 233, 
+						-1, 223, 48, 224, 225, 226, 227, 228, 89, 
+						229, 230, 231, 232, 233, 92, -1, 216, 209, 
+						1351, 210, 218, 211, 219, 212, 220, 213, 
+						221, 214, 222, 215, -1, 209, 202, 210, 203, 
+						211, 204, 212, 205, 213, 206, 214, 207, 
+						215, 208, -1, 202, 195, 203, 196, 204, 197, 
+						205, 198, 206, 199, 207, 200, 208, 201, 
+						-1, 195, 188, 196, 189, 197, 190, 198, 191, 
+						199, 192, 200, 193, 201, 194, -1, 188, 177, 
+						189, 178, 190, 180, 191, 182, 192, 183, 
+						193, 185, 194, 187, -1, 177, 42, 178, 179, 
+						180, 181, 182, 45, 183, 184, 185, 186, 
+						187, 48, -1, 1, 148, 147, 146, 145, 144, 
+						143, 142, 141, 140, 139, 138, 105, 104, 
+						103, 102, 101, 100, 99, 98, 97, 96, 
+						95, 94, 60, 93, -1, 148, 154, 146, 153, 
+						144, 152, 142, 151, 140, 150, 138, 149, 
+						104, 112, 102, 111, 100, 110, 98, 109, 
+						96, 108, 94, 107, 93, 106, -1, 154, 21, 
+						153, 159, 152, 158, 151, 157, 150, 156, 
+						149, 155, 112, 118, 111, 117, 110, 116, 
+						109, 115, 108, 114, 107, 113, 106, 72, 
+						-1, 21, 165, 159, 164, 158, 163, 157, 162, 
+						156, 161, 155, 160, 118, 124, 117, 123, 
+						116, 122, 115, 121, 114, 120, 113, 119, 
+						72, 79, -1, 165, 171, 164, 170, 163, 169, 
+						162, 168, 161, 167, 160, 166, 124, 131, 
+						123, 130, 122, 129, 121, 128, 120, 127, 
+						119, 126, 79, 125, -1, 171, 1352, 170, 176, 
+						169, 175, 168, 1353, 167, 173, 166, 172, 
+						131, 1354, 130, 136, 129, 135, 128, 1355, 
+						127, 133, 126, 132, 125, 1356, -1, 1357, 80, 
+						87, 81, 88, 82, 1358, 83, 90, 84, 
+						91, 85, 1356, 86, -1, 80, 73, 81, 74, 
+						82, 75, 83, 76, 84, 77, 85, 78, 
+						86, 1359, -1, 73, 27, 74, 67, 75, 68, 
+						76, 69, 77, 70, 78, 71, 1359, 72, 
+						-1, 27, 20, 67, 61, 68, 62, 69, 63, 
+						70, 64, 71, 65, 72, 66, -1, 20, 12, 
+						61, 49, 62, 51, 63, 53, 64, 55, 
+						65, 57, 66, 59, -1, 12, 13, 49, 50, 
+						51, 52, 53, 54, 55, 56, 57, 58, 
+						59, 60, -1, 1352, 35, 43, 36, 44, 37, 
+						1360, 38, 46, 39, 47, 40, 1357, 41, 
+						-1, 35, 28, 36, 29, 37, 30, 38, 31, 
+						39, 32, 40, 33, 41, 34, -1, 28, 21, 
+						29, 22, 30, 23, 31, 24, 32, 25, 
+						33, 26, 34, 27, -1, 21, 14, 22, 15, 
+						23, 16, 24, 17, 25, 18, 26, 19, 
+						27, 20, -1, 14, 0, 15, 2, 16, 4, 
+						17, 6, 18, 8, 19, 10, 20, 1361, 
+						-1, 0, 1, 2, 3, 4, 5, 6, 7, 
+						8, 9, 10, 11, 1361, 13, -1, 1024, 1055, 
+						1061, 1062, 1068, 1069, 1075, 1076, 1082, 1083, 
+						1089, 1090, -1, 1089, 1088, 1082, 1081, 1075, 1074, 
+						1068, 1067, 1061, 1030, 1024, 1023, -1, 1030, 1067, 
+						1036, 1073, 1042, 1079, 1048, 1085, 1054, -1, 1085, 
+						1079, 1086, 1080, 1087, 1081, 1088, -1, 1081, 1080, 
+						1074, 1073, 1067, -1, 1080, 1079, 1073, -1, 1055, 1056, 
+						1062, 1063, 1069, 1070, 1076, 1077, 1083, 1084, 
+						1090, 1116, -1, 1056, 1057, 1063, 1064, 1070, 1071, 
+						1077, 1078, 1084, 1111, 1116, 1117, -1, 1057, 1058, 
+						1064, 1065, 1071, 1072, 1078, 1106, 1111, 1112, 
+						1117, 1118, -1, 1058, 1059, 1065, 1066, 1072, 1101, 
+						1106, 1107, 1112, 1113, 1118, 1119, -1, 1059, 1060, 
+						1066, 1096, 1101, 1102, 1107, 1108, 1113, 1114, 
+						1119, 1120, -1, 1060, 1091, 1096, 1097, 1102, 1103, 
+						1108, 1109, 1114, 1115, 1120, 1012, -1, 1091, 1092, 
+						1097, 1098, 1103, 1104, 1109, 1110, 1115, 1005, 
+						1012, 1013, -1, 1092, 1093, 1098, 1099, 1104, 1105, 
+						1110, 998, 1005, 1006, 1013, 1014, -1, 998, 1105, 
+						991, 1100, 984, 1095, 977, -1, 1095, 1100, 1094, 
+						1099, 1093, -1, 1100, 1105, 1099, -1, 984, 977, 985, 
+						978, 986, 979, 987, 980, 988, 981, 989, 
+						982, 990, 983, 1025, 1019, 1026, 1020, 1027, 
+						1021, 1028, 1022, 1029, 1023, 1030, -1, 1030, 1362, 
+						1029, 1035, 1028, 1034, 1027, 1033, 1026, 1032, 
+						1025, 1031, 990, 997, 989, 996, 988, 995, 
+						987, 994, 986, 993, 985, 992, 984, 1363, 
+						-1, 1362, 1042, 1035, 1041, 1034, 1040, 1033, 1039, 
+						1032, 1038, 1031, 1037, 997, 1004, 996, 1003, 
+						995, 1002, 994, 1001, 993, 1000, 992, 999, 
+						1363, 998, -1, 998, 999, 1006, 1007, 1014, 1015, 
+						-1, 999, 1000, 1007, 1008, 1015, 1016, -1, 1000, 1001, 
+						1008, 1009, 1016, 1017, -1, 1001, 1002, 1009, 1010, 
+						1017, 1018, -1, 1002, 1003, 1010, 1011, 1018, 1049, 
+						-1, 1003, 1004, 1011, 1043, 1049, 1050, -1, 1004, 1037, 
+						1043, 1044, 1050, 1051, -1, 1037, 1038, 1044, 1045, 
+						1051, 1052, -1, 1038, 1039, 1045, 1046, 1052, 1053, 
+						-1, 1039, 1040, 1046, 1047, 1053, 1054, -1, 1054, 1047, 
+						1048, 1041, 1042, -1, 1041, 1047, 1040, -1, 			
+	};
+
+#endif // TEAPOT_H
Index: /tags/DummyModules/VUT/chcdemo/MathStuff.c
===================================================================
--- /tags/DummyModules/VUT/chcdemo/MathStuff.c	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/MathStuff.c	(revision 10)
@@ -0,0 +1,1041 @@
+//Copyright and Disclaimer:
+//This code is copyright Vienna University of Technology, 2004.
+
+#include <memory.h>
+#include <math.h>
+#include <float.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <stdio.h>
+#include "MathStuff.h"
+
+#ifndef M_PI
+#define M_PI (double)3.14159265358979323846
+#endif
+
+const double DOUBLE_MAX = DBL_MAX;
+const double PI = M_PI;
+const double PI_2 = M_PI/2;
+const double PI_180 = M_PI/180;
+const Vector3 ZERO = {0.0, 0.0, 0.0};
+const Vector3 UNIT_X = {1.0, 0.0, 0.0};
+const Vector3 UNIT_Y = {0.0, 1.0, 0.0};
+const Vector3 UNIT_Z = {0.0, 0.0, 1.0};
+
+const Matrix4x4 IDENTITY = {1.0, 0.0, 0.0, 0.0, 
+							0.0, 1.0, 0.0, 0.0,
+							0.0, 0.0, 1.0, 0.0,
+							0.0, 0.0, 0.0, 1.0};
+
+double maximum(const double a, const double b) {
+	return ( (a > b)? (a):(b) );
+
+}
+
+void clamp(double* value, const double min, const double max) {
+	if( (*value) > max) {
+		(*value) = max;
+	}
+	else {
+		if( (*value) < min) {
+			(*value) = min;
+		}
+	}
+}
+
+double absDouble(const double a) {
+	return ( (a < 0.0)? (-a):(a) );
+}
+
+double signDouble(const double a) {
+	return ( (a < 0.0)? (-1.0f): ( (a == 0.0)? (0.0f):(1.0f) ) );
+}
+
+double coTan(const double vIn) {
+	return (double)-tan(vIn+PI_2);
+}
+
+double relativeEpsilon(const double a, const double epsilon) {
+	double relEpsilon = maximum(absDouble(a*epsilon),epsilon);
+	return relEpsilon;
+}
+
+int alike(const double a, const double b, const double epsilon) {
+	if(a == b) {
+		return 1;
+	}
+	{
+		double relEps = relativeEpsilon(a,epsilon);
+		return (a-relEps <= b) && (b <= a+relEps);
+	}
+}
+
+
+
+int alikeVector3(const Vector3 a, const Vector3 b, const double epsilon) {
+	return 
+		alike(a[0],b[0],epsilon) &&
+		alike(a[1],b[1],epsilon) &&
+		alike(a[2],b[2],epsilon);
+}
+
+void linCombVector3(Vector3 result, const Vector3 pos, const Vector3 dir, const double t) {
+	int i;
+	for(i = 0; i < 3; i++) {
+		result[i] = pos[i]+t*dir[i];
+	}
+}
+
+double squaredLength(const Vector3 vec) {
+	int i;
+	double tmp = 0.0;
+	for(i = 0; i < 3; i++) {
+		tmp += vec[i]*vec[i];
+	}
+	return tmp;
+}
+
+void normalize(Vector3 vec) {
+	int i;
+	const double len = (double)(1.0/sqrt(squaredLength(vec)));
+	for(i = 0; i < 3; i++) {
+		vec[i] *= len;
+	}
+}
+
+void copyNormalize(Vector3 vec, const Vector3 input) {
+	copyVector3(vec,input),
+	normalize(vec);
+}
+
+/*	| a1 a2 |
+	| b1 b2 | calculate the determinent of a 2x2 matrix*/
+double det2x2(const double a1, const double a2,
+			const double b1, const double b2) {
+	return a1*b2 - b1*a2;
+}
+
+/*	| a1 a2 a3 |
+	| b1 b2 b3 |
+	| c1 c2 c3 | calculate the determinent of a 3x3 matrix*/
+double det3x3(const double a1, const double a2, const double a3,
+			  const double b1, const double b2, const double b3,
+			  const double c1, const double c2, const double c3) {
+	return a1*det2x2(b2,b3,c2,c3) - b1*det2x2(a2,a3,c2,c3) +
+			c1*det2x2(a2,a3,b2,b3);
+}
+void cross(Vector3 result, const Vector3 a, const Vector3 b) {
+	result[0] =  det2x2(a[1],b[1],a[2],b[2]);
+	result[1] = -det2x2(a[0],b[0],a[2],b[2]);
+	result[2] =  det2x2(a[0],b[0],a[1],b[1]);
+}
+
+double dot(const Vector3 a, const Vector3 b) {
+	return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];
+}
+
+void look(Matrix4x4 output, const Vector3 pos, const Vector3 dir, const Vector3 up) {
+	Vector3 dirN;
+	Vector3 upN;
+	Vector3 lftN;
+
+	cross(lftN,dir,up);
+	normalize(lftN);
+
+	cross(upN,lftN,dir);
+	normalize(upN);
+	copyNormalize(dirN,dir);
+
+	output[ 0] = lftN[0];
+	output[ 1] = upN[0];
+	output[ 2] = -dirN[0];
+	output[ 3] = 0.0;
+
+	output[ 4] = lftN[1];
+	output[ 5] = upN[1];
+	output[ 6] = -dirN[1];
+	output[ 7] = 0.0;
+
+	output[ 8] = lftN[2];
+	output[ 9] = upN[2];
+	output[10] = -dirN[2];
+	output[11] = 0.0;
+
+	output[12] = -dot(lftN,pos);
+	output[13] = -dot(upN,pos);
+	output[14] = dot(dirN,pos);
+	output[15] = 1.0;
+}
+
+void makeScaleMtx(Matrix4x4 output, const double x, const double y, const double z) {
+	output[ 0] = x;
+	output[ 1] = 0.0;
+	output[ 2] = 0.0;
+	output[ 3] = 0.0;
+
+	output[ 4] = 0.0;
+	output[ 5] = y;
+	output[ 6] = 0.0;
+	output[ 7] = 0.0;
+
+	output[ 8] = 0.0;
+	output[ 9] = 0.0;
+	output[10] = z;
+	output[11] = 0.0;
+
+	output[12] = 0.0;
+	output[13] = 0.0;
+	output[14] = 0.0;
+	output[15] = 1.0;
+}
+
+void makeTranslationMtx(Matrix4x4 output, Vector3 translation) {
+	output[ 0] = 1.0;
+	output[ 1] = 0.0;
+	output[ 2] = 0.0;
+	output[ 3] = 0;//translation[0];
+
+	output[ 4] = 0.0;
+	output[ 5] = 1.0;
+	output[ 6] = 0.0;
+	output[ 7] = 0;//translation[1];
+
+	output[ 8] = 0.0;
+	output[ 9] = 0.0;
+	output[10] = 1.0;
+	output[11] = 0;//translation[2];
+
+	output[12] = translation[0];//0.0;
+	output[13] = translation[1];//0.0;
+	output[14] = translation[2];//0.0;
+	output[15] = 1.0;
+}
+
+void makeRotationZMtx(Matrix4x4 output, const double rad)
+{
+	output[ 0] = cos(rad);
+	output[ 1] = sin(rad);
+	output[ 2] = 0.0;
+	output[ 3] = 0.0;
+
+	output[ 4] = -sin(rad);
+	output[ 5] = cos(rad);
+	output[ 6] = 0.0;
+	output[ 7] = 0.0;
+
+	output[ 8] = 0.0;
+	output[ 9] = 0.0;
+	output[10] = 1.0;
+	output[11] = 0.0;
+
+	output[12] = 0.0;
+	output[13] = 0.0;
+	output[14] = 0.0;
+	output[15] = 1.0;
+}
+
+void makeRotationXMtx(Matrix4x4 output, const double rad)
+{
+	output[ 0] = 1.0;
+	output[ 1] = 0.0;
+	output[ 2] = 0.0;
+	output[ 3] = 0.0;
+
+	output[ 4] = 0.0;
+	output[ 5] = cos(rad);
+	output[ 6] = sin(rad);
+	output[ 7] = 0.0;
+
+	output[ 8] = 0.0;
+	output[ 9] = -sin(rad);
+	output[10] = cos(rad);
+	output[11] = 0.0;
+
+	output[12] = 0.0;
+	output[13] = 0.0;
+	output[14] = 0.0;
+	output[15] = 1.0;
+}
+
+void makeRotationYMtx(Matrix4x4 output, const double rad)
+{
+	output[ 0] = cos(rad);
+	output[ 1] = 0.0;
+	output[ 2] = -sin(rad);
+	output[ 3] = 0.0;
+
+	output[ 4] = 0.0;
+	output[ 5] = 1.0;
+	output[ 6] = 0.0;
+	output[ 7] = 0.0;
+
+	output[ 8] = sin(rad);
+	output[ 9] = 0.0;
+	output[10] = cos(rad);
+	output[11] = 0.0;
+
+	output[12] = 0.0;
+	output[13] = 0.0;
+	output[14] = 0.0;
+	output[15] = 1.0;
+}
+
+void scaleTranslateToFit(Matrix4x4 output, const Vector3 vMin, const Vector3 vMax) {
+	output[ 0] = 2/(vMax[0]-vMin[0]);
+	output[ 4] = 0;
+	output[ 8] = 0;
+	output[12] = -(vMax[0]+vMin[0])/(vMax[0]-vMin[0]);
+
+	output[ 1] = 0;
+	output[ 5] = 2/(vMax[1]-vMin[1]);
+	output[ 9] = 0;
+	output[13] = -(vMax[1]+vMin[1])/(vMax[1]-vMin[1]);
+
+	output[ 2] = 0;
+	output[ 6] = 0;
+	output[10] = 2/(vMax[2]-vMin[2]);
+	output[14] = -(vMax[2]+vMin[2])/(vMax[2]-vMin[2]);
+
+	output[ 3] = 0;
+	output[ 7] = 0;
+	output[11] = 0;
+	output[15] = 1;
+}
+
+void perspectiveRad(Matrix4x4 output, const double vFovy, const double vAspect,
+						  const double vNearDis, const double vFarDis) {
+	const double f = coTan(vFovy/2);
+	const double dif = 1/(vNearDis-vFarDis);
+
+	output[ 0] = f/vAspect;
+	output[ 4] = 0;
+	output[ 8] = 0;
+	output[12] = 0;
+
+	output[ 1] = 0;
+	output[ 5] = f;
+	output[ 9] = 0;
+	output[13] = 0;
+
+	output[ 2] = 0;
+	output[ 6] = 0;
+	output[10] = (vFarDis+vNearDis)*dif;
+	output[14] = 2*vFarDis*vNearDis*dif;
+
+	output[ 3] = 0;
+	output[ 7] = 0;
+	output[11] = -1;
+	output[15] = 0;
+}
+
+void perspectiveDeg(Matrix4x4 output, const double vFovy, const double vAspect,
+					const double vNearDis, const double vFarDis) {
+	perspectiveRad(output,vFovy*PI_180,vAspect,vNearDis,vFarDis);
+}
+
+void invert(Matrix4x4 output, const Matrix4x4 i) {
+	double a11 =  det3x3(i[5],i[6],i[7],i[9],i[10],i[11],i[13],i[14],i[15]);
+	double a21 = -det3x3(i[1],i[2],i[3],i[9],i[10],i[11],i[13],i[14],i[15]);
+	double a31 =  det3x3(i[1],i[2],i[3],i[5],i[6],i[7],i[13],i[14],i[15]);
+	double a41 = -det3x3(i[1],i[2],i[3],i[5],i[6],i[7],i[9],i[10],i[11]);
+
+	double a12 = -det3x3(i[4],i[6],i[7],i[8],i[10],i[11],i[12],i[14],i[15]);
+	double a22 =  det3x3(i[0],i[2],i[3],i[8],i[10],i[11],i[12],i[14],i[15]);
+	double a32 = -det3x3(i[0],i[2],i[3],i[4],i[6],i[7],i[12],i[14],i[15]);
+	double a42 =  det3x3(i[0],i[2],i[3],i[4],i[6],i[7],i[8],i[10],i[11]);
+
+	double a13 =  det3x3(i[4],i[5],i[7],i[8],i[9],i[11],i[12],i[13],i[15]);
+	double a23 = -det3x3(i[0],i[1],i[3],i[8],i[9],i[11],i[12],i[13],i[15]);
+	double a33 =  det3x3(i[0],i[1],i[3],i[4],i[5],i[7],i[12],i[13],i[15]);
+	double a43 = -det3x3(i[0],i[1],i[3],i[4],i[5],i[7],i[8],i[9],i[11]);
+
+	double a14 = -det3x3(i[4],i[5],i[6],i[8],i[9],i[10],i[12],i[13],i[14]);
+	double a24 =  det3x3(i[0],i[1],i[2],i[8],i[9],i[10],i[12],i[13],i[14]);
+	double a34 = -det3x3(i[0],i[1],i[2],i[4],i[5],i[6],i[12],i[13],i[14]);
+	double a44 =  det3x3(i[0],i[1],i[2],i[4],i[5],i[6],i[8],i[9],i[10]);
+
+	double det = (i[0]*a11) + (i[4]*a21) + (i[8]*a31) + (i[12]*a41);
+	double oodet = 1/det;
+
+	output[ 0] = a11*oodet;
+	output[ 1] = a21*oodet;
+	output[ 2] = a31*oodet;
+	output[ 3] = a41*oodet;
+
+	output[ 4] = a12*oodet;
+	output[ 5] = a22*oodet;
+	output[ 6] = a32*oodet;
+	output[ 7] = a42*oodet;
+
+	output[ 8] = a13*oodet;
+	output[ 9] = a23*oodet;
+	output[10] = a33*oodet;
+	output[11] = a43*oodet;
+
+	output[12] = a14*oodet;
+	output[13] = a24*oodet;
+	output[14] = a34*oodet;
+	output[15] = a44*oodet;
+}
+
+void multUnSave(Matrix4x4 output, const Matrix4x4 a, const Matrix4x4 b) {
+	const int SIZE = 4;
+	int iCol;
+	for(iCol = 0; iCol < SIZE; iCol++) {
+		const int cID = iCol*SIZE;
+		int iRow;
+		for(iRow = 0; iRow < SIZE; iRow++) {
+			const int id = iRow+cID;
+			int k;
+			output[id] = a[iRow]*b[cID];
+			for(k = 1; k < SIZE; k++) {
+				output[id] += a[iRow+k*SIZE]*b[k+cID];
+			}
+		}
+	}
+}
+
+void mult(Matrix4x4 output, const Matrix4x4 a, const Matrix4x4 b) {
+	if(a == output) {
+		Matrix4x4 tmpA;
+		copyMatrix(tmpA,a);
+		if(b == output) {
+			multUnSave(output,tmpA,tmpA);
+		}
+		else {
+			multUnSave(output,tmpA,b);
+		}
+	}
+	else {
+		if(b == output) {
+			Matrix4x4 tmpB;
+			copyMatrix(tmpB,b);
+			multUnSave(output,a,tmpB);
+		}
+		else {
+			multUnSave(output,a,b);
+		}
+	}
+}
+
+void mulHomogenPoint(Vector3 output, const Matrix4x4 m, const Vector3 v) {
+	//if v == output -> overwriting problems -> so store in temp
+	double x = m[0]*v[0] + m[4]*v[1] + m[ 8]*v[2] + m[12];
+	double y = m[1]*v[0] + m[5]*v[1] + m[ 9]*v[2] + m[13];
+	double z = m[2]*v[0] + m[6]*v[1] + m[10]*v[2] + m[14];
+	double w = m[3]*v[0] + m[7]*v[1] + m[11]*v[2] + m[15];
+
+	output[0] = x/w;
+	output[1] = y/w;
+	output[2] = z/w;
+}
+
+void appendToCubicHull(Vector3 min, Vector3 max, const Vector3 v) {
+	int j;
+	for(j = 0; j < 3; j++) {
+		if(v[j] < min[j]) {
+			min[j] = v[j];
+		}
+		else if(v[j] > max[j]) {
+			max[j] = v[j];
+		}
+	}
+}
+
+void calcCubicHull(Vector3 min, Vector3 max, const Vector3* ps, const int size) {
+	if(size > 0) {
+		int i;
+		copyVector3(min,ps[0]);
+		copyVector3(max,ps[0]);
+		for(i = 1; i < size; i++) {
+			appendToCubicHull(min,max,ps[i]);
+		}
+	}
+}
+
+void calcViewFrustumWorldCoord(Vector3x8 points, const Matrix4x4 invEyeProjView) {
+	const struct AABox box = {
+		{-1, -1, -1},
+		{1, 1, 1}
+	};
+	int i;
+	calcAABoxPoints(points,box); //calc unit cube corner points
+	for(i = 0; i < 8; i++) {
+		mulHomogenPoint(points[i],invEyeProjView,points[i]); //camera to world frame
+	}
+	//viewFrustumWorldCoord[0] == near-bottom-left
+	//viewFrustumWorldCoord[1] == near-bottom-right
+	//viewFrustumWorldCoord[2] == near-top-right
+	//viewFrustumWorldCoord[3] == near-top-left
+	//viewFrustumWorldCoord[4] == far-bottom-left
+	//viewFrustumWorldCoord[5] == far-bottom-right
+	//viewFrustumWorldCoord[6] == far-top-right
+	//viewFrustumWorldCoord[7] == far-top-left
+}
+
+void calcViewFrustObject(struct Object* obj, const Vector3x8 p) {
+	int i;
+	Vector3* ps;
+	objectSetSize(obj,6);
+	for(i = 0; i < 6; i++) {
+		vecPointSetSize(&obj->poly[i],4);
+	}
+	//near poly ccw
+	ps = obj->poly[0].points;
+	for(i = 0; i < 4; i++) {
+		copyVector3(ps[i],p[i]);
+	}
+	//far poly ccw
+	ps = obj->poly[1].points;
+	for(i = 4; i < 8; i++) {
+		copyVector3(ps[i-4],p[11-i]);
+	}
+	//left poly ccw
+	ps = obj->poly[2].points;
+	copyVector3(ps[0],p[0]);
+	copyVector3(ps[1],p[3]);
+	copyVector3(ps[2],p[7]);
+	copyVector3(ps[3],p[4]);
+	//right poly ccw
+	ps = obj->poly[3].points;
+	copyVector3(ps[0],p[1]);
+	copyVector3(ps[1],p[5]);
+	copyVector3(ps[2],p[6]);
+	copyVector3(ps[3],p[2]);
+	//bottom poly ccw
+	ps = obj->poly[4].points;
+	copyVector3(ps[0],p[4]);
+	copyVector3(ps[1],p[5]);
+	copyVector3(ps[2],p[1]);
+	copyVector3(ps[3],p[0]);
+	//top poly ccw
+	ps = obj->poly[5].points;
+	copyVector3(ps[0],p[6]);
+	copyVector3(ps[1],p[7]);
+	copyVector3(ps[2],p[3]);
+	copyVector3(ps[3],p[2]);
+}
+
+void transformVecPoint(struct VecPoint* poly, const Matrix4x4 xForm) {
+	if(0 != poly) {
+		int i;
+		for(i = 0; i < poly->size; i++) {
+			mulHomogenPoint(poly->points[i],xForm,poly->points[i]);
+		}
+	}
+}
+
+void transformObject(struct Object* obj, const Matrix4x4 xForm) {
+	if(0 != obj) {
+		int i;
+		for(i = 0; i < obj->size; i++) {
+			transformVecPoint( &(obj->poly[i]) ,xForm);
+		}
+	}
+}
+
+void calcObjectCubicHull(Vector3 min, Vector3 max, const struct Object obj) {
+	if(0 < obj.size) {
+		int i;
+		calcCubicHull(min,max,obj.poly[0].points,obj.poly[0].size);
+		for(i = 1; i < obj.size; i++) {
+			struct VecPoint* p = &(obj.poly[i]);
+			int j;
+			for(j = 0; j < p->size; j++) {
+				appendToCubicHull(min,max,p->points[j]);
+			}
+		}
+	}
+}
+
+int findSamePointInVecPoint(const struct VecPoint poly, const Vector3 p) {
+	int i;
+	for(i = 0; i < poly.size; i++) {
+		if(alikeVector3(poly.points[i],p,(double)0.001)) {
+			return i;
+		}
+	}
+	return -1;
+}
+
+int findSamePointInObjectAndSwapWithLast(struct Object *inter, const Vector3 p) {
+	int i;
+	if(0 == inter) {
+		return -1;
+	}
+	if(1 > inter->size) {
+		return -1;
+	}
+	for(i = inter->size; i > 0; i--) {
+		struct VecPoint* poly = &(inter->poly[i-1]);
+		if(2 == poly->size) {
+			const int nr = findSamePointInVecPoint(*poly,p);
+			if(0 <= nr) {
+				//swap with last
+				swapVecPoint(poly, &(inter->poly[inter->size-1]) );
+				return nr;
+			}
+		}
+	}
+	return -1;
+}
+
+void appendIntersectionVecPoint(struct Object* obj, struct Object* inter) {
+	struct VecPoint *polyOut;
+	struct VecPoint *polyIn;
+	int size = obj->size;
+	int i;
+	//you need at least 3 sides for a polygon
+	if(3 > inter->size) {
+		return;
+	}
+	//compact inter: remove poly.size != 2 from end on forward
+	for(i = inter->size; 0 < i; i--) {
+		if(2 == inter->poly[i-1].size) {
+			break;
+		}
+	}
+	objectSetSize(inter,i);
+	//you need at least 3 sides for a polygon
+	if(3 > inter->size) {
+		return;
+	}
+	//make place for one additional polygon in obj
+	objectSetSize(obj,size+1);
+	polyOut = &(obj->poly[size]);
+	//we have line segments in each poly of inter 
+	//take last linesegment as first and second point
+	polyIn = &(inter->poly[inter->size-1]);
+	append2VecPoint(polyOut,polyIn->points[0]);
+	append2VecPoint(polyOut,polyIn->points[1]);
+	//remove last poly from inter, because it is already saved
+	objectSetSize(inter,inter->size-1);
+
+	//iterate over inter until their is no line segment left
+	while(0 < inter->size) {
+		//pointer on last point to compare
+		Vector3 *lastPt = &(polyOut->points[polyOut->size-1]);
+		//find same point in inter to continue polygon
+		const int nr = findSamePointInObjectAndSwapWithLast(inter,*lastPt);
+		if(0 <= nr) {
+			//last line segment
+			polyIn = &(inter->poly[inter->size-1]);
+			//get the other point in this polygon and save into polyOut
+			append2VecPoint(polyOut,polyIn->points[(nr+1)%2]);
+		}
+		//remove last poly from inter, because it is already saved or degenerated
+		objectSetSize(inter,inter->size-1);
+	}
+	//last point can be deleted, because he is the same as the first (closes polygon)
+	vecPointSetSize(polyOut,polyOut->size-1);
+}
+
+double pointPlaneDistance(const struct Plane A, const Vector3 p) {
+	return dot(A.n,p)+(A.d);
+}
+
+int pointBeforePlane(const struct Plane A, const Vector3 p) {
+	return pointPlaneDistance(A,p) > 0.0;
+}
+
+int intersectPlaneEdge(Vector3 output, const struct Plane A, const Vector3 a, const Vector3 b) {
+	Vector3 diff;
+	double t;
+	diffVector3(diff,b,a);
+	t = dot(A.n,diff);
+	if(0.0 == t)
+		return 0;
+	t = (A.d-dot(A.n,a))/t;
+	if(t < 0.0 || 1.0 < t)
+		return 0;
+	linCombVector3(output,a,diff,t);
+	return 1;
+}
+
+void clipVecPointByPlane(const struct VecPoint poly, const struct Plane A, struct VecPoint* polyOut, struct VecPoint* interPts) {
+	int i;
+	int *outside = 0;
+	if(poly.size < 3 || 0 == polyOut) {
+		return;
+	}
+	outside = (int*)realloc(outside,sizeof(int)*poly.size);
+	//for each point
+	for(i = 0; i < poly.size; i++) {
+		outside[i] = pointBeforePlane(A,poly.points[i]);
+	}
+	for(i = 0; i < poly.size; i++) {
+		int idNext = (i+1) % poly.size;
+		//both outside -> save none
+		if(outside[i] && outside[idNext]) {
+			continue;
+		}
+		//outside to inside -> calc intersection save intersection and save i+1
+		if(outside[i]) {
+			Vector3 inter;
+			if(intersectPlaneEdge(inter,A,poly.points[i],poly.points[idNext])) {
+				append2VecPoint(polyOut,inter);
+				if(0 != interPts) {
+					append2VecPoint(interPts,inter);
+				}
+			}
+			append2VecPoint(polyOut,poly.points[idNext]);
+			continue;
+		}
+		//inside to outside -> calc intersection save intersection
+		if(outside[idNext]) {
+			Vector3 inter;
+			if(intersectPlaneEdge(inter,A,poly.points[i],poly.points[idNext])) {
+				append2VecPoint(polyOut,inter);
+				if(0 != interPts) {
+					append2VecPoint(interPts,inter);
+				}
+			}
+			continue;
+		}
+		//both inside -> save point i+1
+		append2VecPoint(polyOut,poly.points[idNext]);
+	}
+	outside = (int*)realloc(outside,0);
+}
+
+void clipObjectByPlane(const struct Object obj, const struct Plane A, struct Object* objOut) {
+	int i;
+	struct Object inter = OBJECT_NULL;
+	struct Object objIn = OBJECT_NULL;
+	if(0 == obj.size || 0 == objOut)
+		return;
+	if(obj.poly == objOut->poly) {
+		//need to copy object if input and output are the same
+		copyObject(&objIn,obj);
+	}
+	else {
+		objIn = obj;
+	}
+	emptyObject(objOut);
+
+	for(i = 0; i < objIn.size; i++)
+	{
+		int size = objOut->size;
+		objectSetSize(objOut,size+1);
+		objectSetSize(&inter,size+1);
+		clipVecPointByPlane(objIn.poly[i],A, &(objOut->poly[size]) , &(inter.poly[size]));
+		//if whole poly was clipped away -> delete empty poly
+		if(0 == objOut->poly[size].size) {
+			objectSetSize(objOut,size);
+			objectSetSize(&inter,size);
+		}
+	}
+	//add a polygon of all intersection points with plane to close the object
+	appendIntersectionVecPoint(objOut,&inter);
+	emptyObject(&inter);
+	emptyObject(&objIn);
+}
+
+
+void clipObjectByAABox(struct Object* obj, const struct AABox box) {
+	struct VecPlane planes = VECPLANE_NULL;
+	int i;
+	if(0 == obj) {
+		return;
+	}
+	
+	calcAABoxPlanes(&planes,box);
+	for(i = 0; i < planes.size; i++) {
+		clipObjectByPlane(*obj,planes.plane[i],obj);
+	}
+
+	emptyVecPlane(&planes);
+}
+
+int clipTest(const double p, const double q, double* u1, double* u2) {
+	// Return value is 'true' if line segment intersects the current test
+	// plane.  Otherwise 'false' is returned in which case the line segment
+	// is entirely clipped.
+	if(0 == u1 || 0 == u2) {
+		return 0;
+	}
+	if(p < 0.0) {
+		double r = q/p;
+		if(r > (*u2)) {
+			return 0;
+		}
+		else {
+			if(r > (*u1)) {
+				(*u1) = r;
+			}
+			return 1;
+		}
+	}
+	else {
+		if(p > 0.0)	{
+			double r = q/p;
+			if(r < (*u1)) {
+				return 0;
+			}
+			else {
+				if(r < (*u2)) {
+					(*u2) = r;
+				}
+				return 1;
+			}
+		}
+		else {
+			return q >= 0.0;
+		}
+	}
+}
+
+int intersectionLineAABox(Vector3 v, const Vector3 p, const Vector3 dir, const struct AABox b) {
+	double t1 = 0.0;
+	double t2 = DOUBLE_MAX;
+	int intersect =
+		clipTest(-dir[2],p[2]-b.min[2],&t1,&t2) && clipTest(dir[2],b.max[2]-p[2],&t1,&t2) &&
+		clipTest(-dir[1],p[1]-b.min[1],&t1,&t2) && clipTest(dir[1],b.max[1]-p[1],&t1,&t2) &&
+		clipTest(-dir[0],p[0]-b.min[0],&t1,&t2) && clipTest(dir[0],b.max[0]-p[0],&t1,&t2);
+	if(!intersect) {
+		return 0;
+	}
+	intersect = 0;
+	if(0 <= t1) {
+		linCombVector3(v,p,dir,t1);
+		intersect = 1;
+	}
+	if(0 <= t2) {
+		linCombVector3(v,p,dir,t2);
+		intersect = 1;
+	}
+	return intersect;
+}
+
+
+void includeObjectLightVolume(struct VecPoint* points, const struct Object obj,
+							  const Vector3 lightDir, const struct AABox sceneAABox) {
+	if(0 != points) {
+		int i, size;
+		Vector3 ld;
+		copyVector3Values(ld,-lightDir[0],-lightDir[1],-lightDir[2]);
+		convObject2VecPoint(points,obj);
+		size = points->size;
+		//for each point add the point on the ray in -lightDir
+		//intersected with the sceneAABox
+		for(i = 0; i < size; i++) {
+			Vector3 pt;
+			if(intersectionLineAABox(pt,points->points[i],ld,sceneAABox) ) {
+				append2VecPoint(points,pt);
+			}
+		}
+	}
+}
+
+void calcFocusedLightVolumePoints(struct VecPoint* points, const Matrix4x4 invEyeProjView,
+								  const Vector3 lightDir,const struct AABox sceneAABox) {
+	Vector3x8 pts;
+	struct Object obj = OBJECT_NULL;
+
+	calcViewFrustumWorldCoord(pts,invEyeProjView);
+	calcViewFrustObject(&obj, pts);
+	clipObjectByAABox(&obj,sceneAABox);
+	includeObjectLightVolume(points,obj,lightDir,sceneAABox);
+	emptyObject(&obj);
+}
+
+void calcViewFrustumPlanes(struct VecPlane* planes, const Matrix4x4 eyeProjView) {
+	if(0 != planes) {
+		int i;
+		
+		planesSetSize(planes, 6);
+	
+		//---- extract the plane equations
+		for (i = 0; i < 4; i++)	{
+			setPlaneCoeff(eyeProjView[i * 4 + 3] - eyeProjView[i * 4 + 0], planes->plane + 0, i);   // right plane
+			setPlaneCoeff(eyeProjView[i * 4 + 3] + eyeProjView[i * 4 + 0], planes->plane + 1, i);	// left plane
+			setPlaneCoeff(eyeProjView[i * 4 + 3] + eyeProjView[i * 4 + 1], planes->plane + 2, i);	// bottom plane
+			setPlaneCoeff(eyeProjView[i * 4 + 3] - eyeProjView[i * 4 + 1], planes->plane + 3, i);	// top plane
+			setPlaneCoeff(eyeProjView[i * 4 + 3] - eyeProjView[i * 4 + 2], planes->plane + 4, i);	// far plane
+			setPlaneCoeff(eyeProjView[i * 4 + 3] + eyeProjView[i * 4 + 2], planes->plane + 5, i);	// near plane
+		}
+
+		//---- normalize the coefficients
+		for (i = 0; i < 6; i++)	{
+			float invLength = 1;
+			float length = (float)sqrt(squaredLength(planes->plane[i].n));
+
+			if(length) invLength	= 1.0f / length;
+
+			planes->plane[i].n[0] *= invLength;
+			planes->plane[i].n[1] *= invLength;
+			planes->plane[i].n[2] *= invLength;
+			
+			planes->plane[i].d *= invLength;
+		}
+	}
+}
+
+int calcAABNearestVertexIdx(Vector3 clipPlaneNormal) {
+	int	index;
+
+	//     7+------+6
+	//     /|     /|
+	//    / |    / |
+	//   / 4+---/--+5
+	// 3+------+2 /    y   z
+	//  | /    | /     |  /
+	//  |/     |/      |/
+	// 0+------+1      *---x
+	if (clipPlaneNormal[0] <= 0.0f) {
+		index	= (clipPlaneNormal[1] <= 0.0f) ? 0 : 3;
+	}
+	else {
+		index	= (clipPlaneNormal[1] <= 0.0f) ? 1 : 2;
+	}
+
+	return (clipPlaneNormal[2] <= 0.0f) ? index : 4 + index;
+}
+
+int calcAABFarthestVertexIdx(Vector3 clipPlaneNormal) {
+	int index;
+
+	if (clipPlaneNormal[0] > 0.0f) {
+		index	= (clipPlaneNormal[1] > 0.0f) ? 0 : 3;
+	}
+	else {
+		index	= (clipPlaneNormal[1] > 0.0f) ? 1 : 2;
+	}
+
+	return (clipPlaneNormal[2] > 0.0f) ? index : 4 + index;
+}
+
+void calcAABNPVertexIndices(int *vertexIndices, const struct VecPlane planes) {
+	int i;
+	for (i = 0; i < 6; i++)	
+	{
+		vertexIndices[i * 2 + 0] = calcAABNearestVertexIdx(planes.plane[i].n);	// n-vertex
+		vertexIndices[i * 2 + 1] = calcAABFarthestVertexIdx(planes.plane[i].n); // p-vertex
+	}
+}
+
+void combineAABoxes(struct AABox *a, const struct AABox b) {
+	appendToCubicHull(a->min, a->max, b.min);
+	appendToCubicHull(a->min, a->max, b.max);
+}
+
+double calcAABoxVolume(const struct AABox aab)
+{
+	return (aab.max[0] - aab.min[0]) * 
+		   (aab.max[1] - aab.min[1]) * 
+		   (aab.max[2] - aab.min[2]);
+}
+
+
+void calcAABoxCenter(Vector3 vec, const struct AABox aab)
+{
+	diffVector3(vec, aab.max, aab.min);
+	vec[0] *= 0.5f; vec[1] *= 0.5f; vec[2] *= 0.5f;
+	
+	addVector3(vec, aab.min, vec);
+}
+
+
+double calcAABoxSurface(const struct AABox aab)
+{
+	return 2 * (aab.max[0] - aab.min[0]) * (aab.max[1] - aab.min[1]) +
+		   2 * (aab.max[0] - aab.min[0]) * (aab.max[2] - aab.min[2]) +
+		   2 * (aab.max[1] - aab.min[1]) * (aab.max[2] - aab.min[2]);
+}
+
+void clipAABoxByAABox(struct AABox *aab, const struct AABox enclosed)
+{
+	int i;
+	for(i=0; i < 3; i++)
+	{
+		if(aab->min[i] < enclosed.min[i])
+			aab->min[i] = enclosed.min[i];
+		if(aab->max[i] > enclosed.max[i])
+			aab->max[i] = enclosed.max[i];
+	}
+}
+
+
+void rotateVectorZ(Vector3 v, double rad)
+{
+	Vector3 temp;
+
+	temp[0] = v[0]*cos(rad) - v[1]*sin(rad);
+	temp[1] = v[0]*sin(rad) + v[1]*cos(rad);
+	temp[2] = v[2];
+
+	copyVector3(v, temp);
+}
+
+
+void rotateVectorX(Vector3 v, double rad)
+{
+	Vector3 temp;
+	
+	temp[0] = v[0];
+	temp[1] = v[1]*cos(rad) - v[2]*sin(rad);
+	temp[2] = v[1]*sin(rad) + v[2]*cos(rad);
+	
+	copyVector3(v, temp);
+}
+
+
+void rotateVectorY(Vector3 v, double rad)
+{
+	Vector3 temp;
+
+	temp[0] = v[2]*sin(rad) + v[0]*cos(rad);
+	temp[1] = v[1]; 
+	temp[2] = v[2]*cos(rad) - v[0]*sin(rad);
+
+	copyVector3(v, temp);
+}
+
+
+
+void rotateVector(Vector3 result, const Vector3 input, const float rad, const Vector3 axis)
+{
+	// using quaternions (vector and scalar part)
+	float s = (float)cos(rad * 0.5);
+	float h = (float)sin(rad * 0.5);
+	float p_v_dot;
+
+	Vector3 hvec = {axis[0] * h, axis[1]* h, axis[2] * h};
+	Vector3 hvec2;
+	Vector3 hvec3;
+
+	cross(hvec2, hvec, input);
+	cross(hvec3, hvec, hvec2);
+
+	p_v_dot = (float)dot(input, hvec);
+
+	result[0] = s * s * input[0] + hvec[0] * p_v_dot + 
+					 2.0f * s * hvec2[0] + hvec3[0];
+
+	result[1] = s * s * input[1] + hvec[1] * p_v_dot + 
+					 2.0f * s *hvec2[1] + hvec3[1];
+
+	result[2] = s * s * input[2] + hvec[2] * p_v_dot + 
+					 2.0f * s *hvec2[2] + hvec3[2];
+
+}
+
+
+void vectorNormal(Vector3 result, const Vector3 vec)
+{
+	result[0] = 0.0f;
+	result[1] = 0.0f;
+	result[2] = 0.0f;
+
+	// to avoid 0-vector: look if at least one component is not 0)
+	if((vec[0] != 0.0f) || (vec[1] != 0.0f))
+	{
+		result[0] = -vec[1];
+		result[1] = vec[0];
+	}	
+	else
+	{
+		result[0] = -vec[2];
+		result[1] = vec[0];
+	}
+}
Index: /tags/DummyModules/VUT/chcdemo/DataTypes.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/DataTypes.h	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/DataTypes.h	(revision 10)
@@ -0,0 +1,86 @@
+//Copyright and Disclaimer:
+//This code is copyright Vienna University of Technology, 2004.
+
+#ifndef DATATYPES_H
+#define DATATYPES_H
+
+typedef double Vector3[3];
+
+typedef Vector3 Vector3x8[8];
+
+//Plane defined through normal vector n and distance to origin d
+struct Plane {
+	Vector3 n;
+	double d;
+};
+
+//a dynamic array of planes
+struct VecPlane {
+	struct Plane* plane;
+	int size;
+};
+
+//a dynamic array 3d points
+struct VecPoint {
+	Vector3* points;
+	int size;
+};
+
+//a dynamic array of point list each point list is a polygon
+struct Object {
+	struct VecPoint* poly;
+	int size;
+};
+
+//Axis-Aligned Bounding Box defined through the two extreme points
+struct AABox {
+	Vector3 min;
+	Vector3 max;
+};
+
+//4x4 matrix
+typedef double Matrix4x4[16];
+
+//initialisation objects (because we have no constructors)
+extern const struct Object OBJECT_NULL;
+extern const struct VecPoint VECPOINT_NULL;
+extern const struct VecPlane VECPLANE_NULL;
+
+//copy the 3 values of the input vector into the output vector
+extern void copyVector3(Vector3, const Vector3);
+//copy the 3 values of the input vector into the output vector
+extern void copyVector3Values(Vector3, const double, const double, const double);
+//copy the 3 values of the substraction of the two input vectors into the output vector
+extern void diffVector3(Vector3, const Vector3, const Vector3);
+//copy the 3 values of the addition of the two input vectors into the output vector
+extern void addVector3(Vector3 result, const Vector3, const Vector3);
+
+//copy the 16 values of the input matrix into the output matrix
+extern void copyMatrix(Matrix4x4, const Matrix4x4);
+
+extern void vecPointSetSize(struct VecPoint*, const int);
+extern void emptyVecPoint(struct VecPoint*);
+extern void swapVecPoint(struct VecPoint*, struct VecPoint*);
+extern void copyVecPoint(struct VecPoint*, const struct VecPoint);
+extern void append2VecPoint(struct VecPoint*, const Vector3);
+
+extern void emptyVecPlane(struct VecPlane*);
+
+extern void objectSetSize(struct Object*, const int);
+extern void emptyObject(struct Object*);
+extern void copyObject(struct Object*, const struct Object);
+//makes 1 VecPoint out of all the VecPoints of an object
+extern void convObject2VecPoint(struct VecPoint* points, const struct Object);
+
+//calculates the 8 corner points of the given AABox
+extern void calcAABoxPoints(Vector3x8 points, const struct AABox b);
+//calculates the 6 planes of the given AABox
+extern void calcAABoxPlanes(struct VecPlane*, const struct AABox);
+// allocates size planes and sets size variable
+extern void planesSetSize(struct VecPlane* p, const int size);
+// access plane per index
+extern double getPlaneCoeff(struct Plane* plane, int i);
+// set plane coefficienr per index
+extern void setPlaneCoeff(double coeff, struct Plane* plane, int i);
+
+#endif // DATATYPES
Index: /tags/DummyModules/VUT/chcdemo/Timers.cpp
===================================================================
--- /tags/DummyModules/VUT/chcdemo/Timers.cpp	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/Timers.cpp	(revision 10)
@@ -0,0 +1,141 @@
+#include <time.h>
+
+
+#ifdef HRTIME
+#include <hrtime.h>
+#endif
+
+#ifdef _WIN32
+
+#include <windows.h>
+#include <sys/types.h>
+#include <sys/timeb.h>
+#include <time.h>
+#include <resource.h>
+
+#else
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/times.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#endif
+
+
+#include "Timers.h"
+
+/*real time or user time*/
+
+#define REAL_TIME 
+
+
+// global file streams
+/*ofstream debugs("debug.log");*/
+
+static int hasHRTimer = 0;
+
+#ifdef  _MSC_VER
+static LARGE_INTEGER hrFreq;
+#endif
+
+
+#ifdef HRTIME
+struct hrtime_struct *hrTimer = NULL;
+#endif
+
+void initTiming()
+{
+#ifdef  _MSC_VER
+     hasHRTimer = QueryPerformanceFrequency(&hrFreq);
+#else
+#ifdef HRTIME
+     if (hrtime_is_present()) 
+     {
+	  hrtime_init();
+	  hasHRTimer = (0 == get_hrtime_struct(0, &hrTimer));
+	  debugs<<"Using UNIX hires timer"<<endl;
+     } else 
+     {
+	  debugs<<"No UNIX hires timer"<<endl;
+     }
+#endif
+#endif
+}
+
+void finishTiming()
+{
+#ifdef HRTIME
+     if (hasHRTimer == 1)
+	  free_hrtime_struct(hrTimer);
+#endif
+  
+}
+
+
+long
+getTime()
+{
+#ifndef  _MSC_VER
+
+#ifdef REAL_TIME
+
+  static struct timeval _tstart;
+  static struct timezone tz;
+
+  gettimeofday(&_tstart,&tz);
+  return (long)(1000000*_tstart.tv_sec + _tstart.tv_usec);
+
+#else
+  
+  if (hasHRTimer == 0) {
+
+    static struct rusage r;
+    getrusage(RUSAGE_SELF,&r);
+    return r.ru_utime.tv_usec+1000000*r.ru_utime.tv_sec;
+  } else {
+#ifdef HRTIME
+    hrtime_t dest;
+    get_hrutime(hrTimer, &dest);
+    return (long) (dest/500.0);
+#else
+    return 0;
+#endif
+  }
+#endif
+  
+#else
+  
+  if (hasHRTimer == 1) {
+    LARGE_INTEGER counter;
+    QueryPerformanceCounter(&counter);
+    // return in usec
+    return (long) (1000000*counter.QuadPart/(hrFreq.QuadPart));
+  } else {
+    static struct _timeb mtime;
+    _ftime(&mtime);
+    
+    return 1000*(1000*mtime.time + mtime.millitm);
+  }
+#endif
+}
+
+
+// return time diff. in ms
+double
+timeDiff(long time1,long time2) // in ms
+{
+  const double clk=1.0E-3; // ticks per second
+  long t=time2-time1;
+  
+  return ((t<0)?-t:t)*clk;
+}
+
+char
+*timeString()
+{
+  time_t t;
+  time(&t);
+  return ctime(&t);
+}
Index: /tags/DummyModules/VUT/chcdemo/MathStuff.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/MathStuff.h	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/MathStuff.h	(revision 10)
@@ -0,0 +1,134 @@
+//Copyright and Disclaimer:
+//This code is copyright Vienna University of Technology, 2004.
+
+/*
+a few simple mathematical routines; not the most efficient ones, but easy to understand.
+*/
+
+#ifndef MathStuffH
+#define MathStuffH
+
+#include "DataTypes.h"
+
+//PI
+extern const double PI;
+//PI/2
+extern const double PI_2;
+//PI/180
+extern const double PI_180;
+
+//vector = (0,0,0)
+extern const Vector3 ZERO;
+//vector = (1,0,0)
+extern const Vector3 UNIT_X;
+//vector = (0,1,0)
+extern const Vector3 UNIT_Y;
+//vector = (0,0,1)
+extern const Vector3 UNIT_Z;
+
+//[1,0,0,0]
+//[0,1,0,0]
+//[0,0,1,0]
+//[0,0,0,1]
+extern const Matrix4x4 IDENTITY;
+
+//absolut value of double
+extern double absDouble(const double);
+//signum of double
+extern double signDouble(const double);
+//clamp value in between min and max borders
+extern void clamp(double* value, const double min, const double max);
+//result = pos+t*dir
+extern void linCombVector3(Vector3 result, const Vector3 pos, const Vector3 dir, const double t);
+extern double dot(const Vector3, const Vector3);
+extern void cross(Vector3, const Vector3, const Vector3);
+extern void normalize(Vector3);
+extern double squaredLength(const Vector3);
+
+//[x,0,0,0]
+//[0,y,0,0]
+//[0,0,z,0]
+//[0,0,0,1]
+extern void makeScaleMtx(Matrix4x4 output, const double x, const double y, const double z);
+//rotation around x axis
+extern void makeRotationXMtx(Matrix4x4 output, const double rad);
+//rotation around y axis
+extern void makeRotationYMtx(Matrix4x4 output, const double rad);
+//rotation around z axis
+extern void makeRotationZMtx(Matrix4x4 output, const double rad);
+//translation
+extern void makeTranslationMtx(Matrix4x4 output, Vector3 translation);
+
+//output = a*b (matrix product)
+extern void mult(Matrix4x4 output, const Matrix4x4 a, const Matrix4x4 b);
+//output = i^(-1)
+extern void invert(Matrix4x4 output, const Matrix4x4 i);
+//output = look from position:pos into direction:dir with up-vector:up
+extern void look(Matrix4x4 output, const Vector3 pos, const Vector3 dir, const Vector3 up);
+//make a scaleTranslate matrix that includes the two values vMin and vMax
+extern void scaleTranslateToFit(Matrix4x4 output, const Vector3 vMin, const Vector3 vMax);
+//output is initialized with the same result as glPerspective vFovy in degrees
+extern void perspectiveDeg(Matrix4x4 output, const double vFovy, const double vAspect,
+	const double vNearDis, const double vFarDis);
+
+//calc matrix-vector product; input has assumed homogenous component w = 1
+//before the output is  written homogen division is performed (w = 1)
+extern void mulHomogenPoint(Vector3 output, const Matrix4x4 m, const Vector3 v);
+//min and max are the two extreme points of an AABB containing all the points
+extern void calcCubicHull(Vector3 min, Vector3 max, const Vector3* ps, const int size);
+//calculates the world coordinates of the view frustum corner points
+//input matrix is the (eyeProj*eyeView)^(-1) matrix
+extern void calcViewFrustumWorldCoord(Vector3x8, const Matrix4x4);
+// mulHomogenPoint each point of VecPoint
+extern void transformVecPoint(struct VecPoint* , const Matrix4x4);
+// transformVecPoint each VecPoint of Object
+extern void transformObject(struct Object*, const Matrix4x4);
+//min and max are the two extreme points of an AABB containing all the points of the object
+extern void calcObjectCubicHull(Vector3 min, Vector3 max, const struct Object);
+
+//calculates the six polygons defining an view frustum
+extern void calcViewFrustObject(struct Object*, const Vector3x8);
+//the given object is clipped by the given AABox; the object is assumed closed
+//and is closed after the clipping
+extern void clipObjectByAABox(struct Object*, const struct AABox);
+//extrudes the object into -lightDir and clippes by the AABox the defining points are returned
+extern void includeObjectLightVolume(struct VecPoint* points, const struct Object,
+	const Vector3 lightDir, const struct AABox sceneAABox);
+//calculates the ViewFrustum Object	clippes this Object By the sceneAABox and
+//extrudes the object into -lightDir and clippes by the AABox the defining points are returned
+extern void calcFocusedLightVolumePoints(struct VecPoint* points,const Matrix4x4 invEyeProjView,
+	const Vector3 lightDir,const struct AABox sceneAABox);
+// calculates the index of the nearest vertex in the AAB vertex set
+// obtainened by calcAABoxPoints according to the normal vector of a clip plane
+extern int calcAABNearestVertexIdx(Vector3 clipPlaneNormal);
+// calculates the index of the farthest vertex in the AAB vertex set
+// obtainened by calcAABoxPoints according to the normal vector of a clip plane
+extern int calcAABFarthestVertexIdx(Vector3 clipPlaneNormal);
+
+extern double pointPlaneDistance(const struct Plane A, const Vector3 p);
+
+extern int pointBeforePlane(const struct Plane A, const Vector3 p);
+// calculates the view frustum planes of the frustum defined by the eyeProjView matrix
+extern void calcViewFrustumPlanes(struct VecPlane* planes, const Matrix4x4 eyeProjView);
+// calculates the np-indices of an aab for a set of 6 clipping planes
+// the indices are stored in the form (n0, p0, n1, p1, ..., n11, p11) in the array vertexIdx 
+extern void calcAABNPVertexIndices(int *vertexIndices, const struct VecPlane planes);
+// combines two AABs, stores result in a
+extern void combineAABoxes(struct AABox *a, const struct AABox b);
+// calculates volume of this aab
+extern double calcAABoxVolume(const struct AABox aab);
+// calculates surface of this aab
+double calcAABoxSurface(const struct AABox aab);
+// clips box aab by box enclosed
+extern void clipAABoxByAABox(struct AABox *aab, const struct AABox enclosed);
+// computes world position center of an aab
+extern void calcAABoxCenter(Vector3 vec, const struct AABox aab);
+
+extern void rotateVectorX(Vector3 v, double rad);
+extern void rotateVectorY(Vector3 v, double rad);
+extern void rotateVectorZ(Vector3 v, double rad);
+// rotates vector around axis(must be unit vector)
+extern void rotateVector(Vector3 result, const Vector3 input, const float rad, const Vector3 axis);
+// generates normal vector of a vector
+extern void vectorNormal(Vector3 result, const Vector3 vec);
+#endif
Index: /tags/DummyModules/VUT/chcdemo/Timers.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/Timers.h	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/Timers.h	(revision 10)
@@ -0,0 +1,54 @@
+// ================================================================
+// $Id: Timers.h,v, 1.1.1.1 2004/10/12 12:49:13 matt Exp $
+// ****************************************************************
+// 
+/** \file time.h
+
+Various time measuring routines
+
+@author Jiri Bittner
+*/
+
+#ifndef __TIMERS_H
+#define __TIMERS_H
+
+void initTiming();
+
+void finishTiming();
+
+long getTime();
+
+double timeDiff(long t1,long t2);
+
+char * timeString();
+
+
+/** Example of usage:
+see timers.h for diffirent possibilities of what is really measured..
+
+
+InitTiming();
+
+long t1, t2, t3;
+
+t1 = GetTime();
+
+Algortihm1();
+
+t2 = GetTime();
+
+Algorithm2();
+
+t3 = GetTime();
+
+
+cout<<"Algorithm 1"<<TimeDiff(t1, t2)<<"[ms]"<<endl;
+cout<<"Algorithm 2"<<TimeDiff(t2, t3)<<"[ms]"<<endl;
+
+
+FinishTiming();
+
+*/
+
+
+#endif
Index: /tags/DummyModules/VUT/chcdemo/RenderTraverser.cpp
===================================================================
--- /tags/DummyModules/VUT/chcdemo/RenderTraverser.cpp	(revision 43)
+++ /tags/DummyModules/VUT/chcdemo/RenderTraverser.cpp	(revision 43)
@@ -0,0 +1,473 @@
+#include "RenderTraverser.h"
+#include "glInterface.h"
+#include "Timers.h"
+
+extern "C"
+{
+	#include "MathStuff.h"
+}
+
+
+RenderTraverser::RenderTraverser(): mFrameID(1), mVisibilityThreshold(0),
+mHierarchyRoot(NULL), mOcclusionQueries(NULL), mCurrentTestIdx(0), mIsQueryMode(false),
+mNumTraversedNodes(0), mNumQueryCulledNodes(0), mNumFrustumCulledNodes(0),
+mRenderTime(0), mNumRenderedGeometry(0), mUseOptimization(true)
+{
+}
+
+RenderTraverser::~RenderTraverser()
+{
+	if(mOcclusionQueries) 
+		delete [] mOcclusionQueries;
+}
+
+void RenderTraverser::Render(int mode)
+{
+	mDistanceQueue.push(mHierarchyRoot);
+
+	long startTime = getTime();
+
+	Preprocess();
+
+	switch(mode)
+	{
+		case RENDER_CULL_FRUSTUM:
+			RenderCullFrustum();
+            break;
+		case RENDER_STOP_AND_WAIT:
+			RenderStopAndWait();
+			break;
+		case RENDER_COHERENT:
+			RenderCoherentWithQueue();
+			break;
+		default:
+			RenderCullFrustum();
+			break;
+	}
+
+	mFrameID ++;
+	ResetQueries();
+
+	long endTime = getTime();
+	mRenderTime = endTime - startTime;
+
+	finishTiming();
+}
+
+/**
+This is the standard render traversal algorithm doing only frustum culling
+*/
+void RenderTraverser::RenderCullFrustum()
+{
+	while(!mDistanceQueue.empty())
+	{
+		HierarchyNode *node = mDistanceQueue.top();
+		mDistanceQueue.pop();
+	
+		// interesting for the visualization, so rest and set
+		node->SetVisible(false);
+		mNumTraversedNodes ++;
+
+		bool intersects;
+	
+		if(InsideViewFrustum(node, intersects))
+		{
+			// update node's visited flag => needed for rendering
+			// so set it also here
+			node->SetLastVisited(mFrameID);
+			node->SetVisible(true);
+			TraverseNode(node);
+		}
+		else
+		{
+			mNumFrustumCulledNodes ++;
+		}
+	}
+}
+
+void RenderTraverser::RenderStopAndWait()
+{
+	while(! mDistanceQueue.empty())
+	{
+		HierarchyNode *node = mDistanceQueue.top();
+		mDistanceQueue.pop();
+		mNumTraversedNodes ++;
+		// interesting for the visualization, so rest and set
+		node->SetVisible(false);
+
+		bool intersects;
+		
+		if(InsideViewFrustum(node, intersects))
+		{
+			// update node's visited flag
+			node->SetLastVisited(mFrameID);
+
+			// for near plane intersecting abbs possible 
+			// wrong results => skip occlusion query
+			if(intersects)
+			{
+				node->SetVisible(true);
+				TraverseNode(node);
+			}
+			else
+			{
+				IssueOcclusionQuery(node, false);
+				
+				// wait if result not available
+				int visiblePixels = GetOcclusionQueryResult(node);
+				
+				// node visible
+				if(visiblePixels > mVisibilityThreshold)
+				{
+					node->SetVisible(true);
+					TraverseNode(node);
+				}
+				else
+				{
+					mNumQueryCulledNodes ++;
+				}
+			}					
+		}
+		else
+		{
+			mNumFrustumCulledNodes ++;
+		}
+	}
+}
+
+void RenderTraverser::RenderCoherentWithQueue()
+{
+	QueryQueue queryQueue;
+
+	//-- PART 1: process finished occlusion queries
+	while(!mDistanceQueue.empty() || !queryQueue.empty())
+	{
+		while(!queryQueue.empty() && 
+			  (ResultAvailable(queryQueue.front()) || 	mDistanceQueue.empty()))
+		{
+			HierarchyNode *node = queryQueue.front();
+			queryQueue.pop();
+			
+			// wait until result available
+			int visiblePixels = GetOcclusionQueryResult(node);
+
+			if(visiblePixels > mVisibilityThreshold)
+			{
+				PullUpVisibility(node);
+				TraverseNode(node);
+			}
+			else
+			{
+				mNumQueryCulledNodes ++;
+			}
+		}	
+
+		//-- PART 2: hierarchical traversal
+		if(! mDistanceQueue.empty())
+		{
+			HierarchyNode *node = mDistanceQueue.top();
+
+			mDistanceQueue.pop();
+	
+			mNumTraversedNodes ++;
+
+			bool intersects;
+			
+			if(InsideViewFrustum(node, intersects))
+			{
+				// for near plane intersecting bounding box possible 
+				// wrong results => skip occlusion query
+				if(intersects)
+				{
+					// update node's visited flag
+					node->SetLastVisited(mFrameID);
+
+					PullUpVisibility(node);
+					TraverseNode(node);
+				}
+				else
+				{		
+					// identify previously visible nodes
+					bool wasVisible = node->Visible() && (node->LastVisited() == mFrameID - 1);
+					
+					// identify nodes that we cannot skip queries for
+					bool leafOrWasInvisible = !wasVisible || node->IsLeaf();
+
+					// reset node's visibility classification 
+					node->SetVisible(false);
+
+					// update node's visited flag
+					node->SetLastVisited(mFrameID);
+				
+					// skip testing previously visible interior nodes
+					if(leafOrWasInvisible)
+					{
+						IssueOcclusionQuery(node, wasVisible);
+						queryQueue.push(node);
+					}
+					
+					// always traverse a node if it was visible
+					if(wasVisible)
+						TraverseNode(node);
+				}
+			}
+			else
+			{
+				// for stats
+				mNumFrustumCulledNodes ++;
+			}
+		}
+	}
+}
+	
+void RenderTraverser::TraverseNode(HierarchyNode *node)
+{
+	if(node->IsLeaf())
+		mNumRenderedGeometry += node->Render();
+	else 
+	{
+		// for non leafs this renders only the bounding volume (if the flag is set)
+		//node->Render();
+		mDistanceQueue.push(node->GetLeftChild());
+		mDistanceQueue.push(node->GetRightChild());
+	}
+}
+
+void RenderTraverser::RenderVisualization()
+{
+	mDistanceQueue.push(mHierarchyRoot);
+
+	while(!	mDistanceQueue.empty())
+	{
+		HierarchyNode *node = mDistanceQueue.top();
+		mDistanceQueue.pop();
+
+		// identify previously visible nodes
+		bool wasVisible = node->Visible() && (node->LastVisited() == mFrameID - 1);
+
+		if(wasVisible)
+			TraverseNode(node);
+		else
+		{
+			// also render culled nodes
+			glColor3f(1.0,0.0,0.0);
+			node->RenderBoundingVolumeForVisualization();		
+		}
+	}
+}
+
+
+void RenderTraverser::PullUpVisibility(HierarchyNode *node)
+{
+	while(node && !node->Visible())
+	{
+		node->SetVisible(true);
+		node = node->GetParent();
+	}
+}
+
+bool RenderTraverser::ResultAvailable(HierarchyNode *node)
+{
+	int result;
+
+	glGetQueryivARB(node->GetOcclusionQuery(),
+					GL_QUERY_RESULT_AVAILABLE_ARB, &result);
+
+	return (result == GL_TRUE);
+}
+
+void RenderTraverser::SetHierarchy(HierarchyNode *sceneRoot)
+{
+	mHierarchyRoot = sceneRoot;
+
+	// not valid anymore for new hierarchy => delete
+	delete [] mOcclusionQueries;
+	mOcclusionQueries = NULL;
+}
+
+HierarchyNode *RenderTraverser::GetHierarchy()
+{
+	return mHierarchyRoot;
+}
+
+int RenderTraverser::GetOcclusionQueryResult(HierarchyNode *node)
+{
+	unsigned int result;
+	
+	glGetQueryObjectuivARB(node->GetOcclusionQuery(), GL_QUERY_RESULT_ARB, &result);
+
+	return (int)result;
+}
+
+
+void RenderTraverser::Switch2GLQueryState()
+{	
+	// boolean used to avoid unnecessary state changes
+	if(!mIsQueryMode)
+	{
+		glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+		glDepthMask(GL_FALSE);
+		glDisable(GL_LIGHTING);
+		mIsQueryMode = true;
+	}
+}
+
+
+void RenderTraverser::Switch2GLRenderState()
+{
+	// boolean used to avoid unnecessary state changes
+	if(mIsQueryMode)
+	{
+		// switch back to rendermode		
+		glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+		glDepthMask(GL_TRUE);
+		glEnable(GL_LIGHTING);
+		mIsQueryMode = false;
+	}
+}
+
+void RenderTraverser::IssueOcclusionQuery(HierarchyNode *node, bool wasVisible)
+{
+	// get next available test id
+	unsigned int occlusionQuery = mOcclusionQueries[mCurrentTestIdx++];
+	
+	node->SetOcclusionQuery(occlusionQuery);
+	// do the actual occlusion query for this node
+	glBeginQueryARB(GL_SAMPLES_PASSED_ARB, occlusionQuery);
+	
+	// if leaf and was visible => will be rendered anyway, thus we
+	// can also test with the real geometry 
+	if(node->IsLeaf() && wasVisible && mUseOptimization)
+	{
+		mNumRenderedGeometry += node->Render();
+	}
+	else
+	{
+		// change state so the bounding box gets not actually rendered on the screen
+		Switch2GLQueryState();
+		node->RenderBoundingVolume();
+		Switch2GLRenderState();
+	}
+
+	glEndQueryARB(GL_SAMPLES_PASSED_ARB);
+}
+
+void RenderTraverser::Preprocess()
+{
+	if(!mOcclusionQueries)
+	{
+		mOcclusionQueries = new unsigned int[mHierarchyRoot->GetNumHierarchyNodes()];
+	}
+
+	// view frustum planes for view frustum culling
+	calcViewFrustumPlanes(&mClipPlanes, mProjViewMatrix);
+	calcAABNPVertexIndices(mNPVertexIndices, mClipPlanes);
+	// generate ids for occlusion test
+	glGenQueriesARB(mHierarchyRoot->GetNumHierarchyNodes(), mOcclusionQueries);
+	mCurrentTestIdx = 0;
+
+	// reset statistics
+	mNumTraversedNodes = 0;
+	mNumQueryCulledNodes = 0;
+	mNumFrustumCulledNodes = 0;
+	mNumRenderedGeometry = 0;
+}
+
+
+void RenderTraverser::ResetQueries()
+{
+	// tell the driver that the occlusion queries won't be needed any more
+	glDeleteQueriesARB(mHierarchyRoot->GetNumHierarchyNodes(), mOcclusionQueries);
+}
+
+
+void RenderTraverser::SetViewpoint(Vector3 const &viewpoint)
+{
+	copyVector3(mViewpoint, viewpoint);
+}
+	
+
+void RenderTraverser::SetProjViewMatrix(Matrix4x4 const &projViewMatrix)
+{
+	copyMatrix(mProjViewMatrix, projViewMatrix);
+}
+
+
+bool RenderTraverser::InsideViewFrustum(HierarchyNode *node, bool &intersects)
+{
+	Vector3x8 vertices;
+	
+	bool intersect = false;
+
+	calcAABoxPoints(vertices, node->GetBoundingVolume());
+
+	// simply test all 6 vertices
+	for (int i = 0; i < 6; i++)
+	{		
+		// test the n-vertex
+		// note: the calcAABNearestVertexId should be preprocessed
+		if(!pointBeforePlane(mClipPlanes.plane[i], vertices[mNPVertexIndices[i * 2]]))
+		{
+			// outside
+			return false;
+		}
+	}
+
+	// test if bounding box is intersected by nearplane (using the p-vertex)
+	intersects = (!pointBeforePlane(mClipPlanes.plane[5], vertices[mNPVertexIndices[11]]));
+
+	// -- get vector from viewpoint to center of bounding volume
+	Vector3 vec;
+	calcAABoxCenter(vec, node->GetBoundingVolume());
+	diffVector3(vec, vec, mViewpoint);
+
+	// compute distance from nearest point to viewpoint
+	diffVector3(vec, vertices[calcAABNearestVertexIdx(vec)], mViewpoint);
+	node->SetDistance(squaredLength(vec));
+	
+	return true;
+}
+
+
+void RenderTraverser::SetVisibilityThreshold(int threshold)
+{
+	mVisibilityThreshold = threshold;
+}
+
+long RenderTraverser::GetRenderTime()
+{
+	return mRenderTime;
+}
+
+int RenderTraverser::GetNumTraversedNodes()
+{
+	return mNumTraversedNodes;
+}
+
+int RenderTraverser::GetNumQueryCulledNodes()
+{
+	return mNumQueryCulledNodes;
+}
+
+int RenderTraverser::GetNumFrustumCulledNodes()
+{
+	return mNumFrustumCulledNodes;
+}
+
+
+int RenderTraverser::GetNumRenderedGeometry()
+{
+	return mNumRenderedGeometry;
+}
+
+
+int RenderTraverser::GetVisibilityThreshold()
+{
+	return mVisibilityThreshold;
+}
+
+void RenderTraverser::SetUseOptimization(bool useOptimization)
+{
+	mUseOptimization = useOptimization;
+	printf("using opt %d\n", mUseOptimization);
+}
Index: /tags/DummyModules/VUT/chcdemo/GL/glut.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/GL/glut.h	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/GL/glut.h	(revision 10)
@@ -0,0 +1,743 @@
+#ifndef __glut_h__
+#define __glut_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998, 2000. */
+
+/* This program is freely distributable without licensing fees  and is
+   provided without guarantee or warrantee expressed or  implied. This
+   program is -not- in the public domain. */
+
+#ifdef _WIN32
+
+/* GLUT 3.7 now tries to avoid including <windows.h>
+   to avoid name space pollution, but Win32's <GL/gl.h> 
+   needs APIENTRY and WINGDIAPI defined properly. */
+# if 0
+   /* This would put tons of macros and crap in our clean name space. */
+#  define  WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+# else
+   /* XXX This is from Win32's <windef.h> */
+#  ifndef APIENTRY
+#   define GLUT_APIENTRY_DEFINED
+    /* Cygwin and MingW32 are two free GNU-based Open Source compilation
+       environments for Win32.  Note that __CYGWIN32__ is deprecated
+       in favor of simply __CYGWIN__. */
+#   if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__)
+#    ifdef i386
+#     define APIENTRY __attribute__ ((stdcall)) 
+#    else
+#     define APIENTRY
+#    endif
+#   else
+#    if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
+#     define APIENTRY    __stdcall
+#    else
+#     define APIENTRY
+#    endif
+#   endif
+#  endif
+   /* XXX This is from Win32's <winnt.h> */
+#  ifndef CALLBACK
+#   if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__)
+#    define CALLBACK __attribute__ ((stdcall)) 
+#   else
+#    if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
+#     define CALLBACK __stdcall
+#    else
+#     define CALLBACK
+#    endif
+#   endif
+#  endif
+   /* XXX This is from Win32's <wingdi.h> and <winnt.h> */
+#  ifndef WINGDIAPI
+#   define GLUT_WINGDIAPI_DEFINED
+#   if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__)
+#    define WINGDIAPI
+#   else
+#    define WINGDIAPI __declspec(dllimport)
+#   endif
+#  endif
+#  if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__)
+    /* Rely on Cygwin32/MingW32 <stddef.h> to set wchar_t. */
+    /* XXX Warning.  The Cygwin32/MingW32 definition for wchar_t
+       is an "int" instead of the "short" used by Windows. */
+#   include <stddef.h>
+#  else
+    /* XXX This is from Win32's <ctype.h> */
+#   ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#    define _WCHAR_T_DEFINED
+#   endif
+#  endif
+# endif
+
+/* To disable automatic library usage for GLUT, define GLUT_NO_LIB_PRAGMA
+   in your compile preprocessor options. */
+# if !defined(GLUT_BUILDING_LIB) && !defined(GLUT_NO_LIB_PRAGMA)
+#  pragma comment (lib, "winmm.lib")      /* link with Windows MultiMedia lib */
+/* To enable automatic SGI OpenGL for Windows library usage for GLUT,
+   define GLUT_USE_SGI_OPENGL in your compile preprocessor options.  */
+#  ifdef GLUT_USE_SGI_OPENGL
+#   pragma comment (lib, "opengl.lib") /* link with SGI OpenGL for Windows lib */
+#   pragma comment (lib, "glu.lib")    /* link with SGI OpenGL Utility lib */
+#   pragma comment (lib, "glut.lib")   /* link with Win32 GLUT for SGI OpenGL lib */
+#  else
+#   pragma comment (lib, "opengl32.lib") /* link with Microsoft OpenGL lib */
+#   pragma comment (lib, "glu32.lib")    /* link with Microsoft OpenGL Utility lib */
+#   pragma comment (lib, "glut32.lib")   /* link with Win32 GLUT lib */
+#  endif
+# endif
+
+/* To disable supression of annoying warnings about floats being promoted
+   to doubles, define GLUT_NO_WARNING_DISABLE in your compile preprocessor
+   options. */
+# if defined(_MSC_VER) && !defined(GLUT_NO_WARNING_DISABLE)
+#  pragma warning (disable:4244)  /* Disable bogus VC++ 4.2 conversion warnings. */
+#  pragma warning (disable:4305)  /* VC++ 5.0 version of above warning. */
+# endif
+
+/* Win32 has an annoying issue where there are multiple C run-time
+   libraries (CRTs).  If the executable is linked with a different CRT
+   from the GLUT DLL, the GLUT DLL will not share the same CRT static
+   data seen by the executable.  In particular, atexit callbacks registered
+   in the executable will not be called if GLUT calls its (different)
+   exit routine).  GLUT is typically built with the
+   "/MD" option (the CRT with multithreading DLL support), but the Visual
+   C++ linker default is "/ML" (the single threaded CRT).
+
+   One workaround to this issue is requiring users to always link with
+   the same CRT as GLUT is compiled with.  That requires users supply a
+   non-standard option.  GLUT 3.7 has its own built-in workaround where
+   the executable's "exit" function pointer is covertly passed to GLUT.
+   GLUT then calls the executable's exit function pointer to ensure that
+   any "atexit" calls registered by the application are called if GLUT
+   needs to exit.
+
+   Note that the __glut*WithExit routines should NEVER be called directly.
+   To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */
+
+/* XXX This is from Win32's <process.h> */
+# if !defined(_MSC_VER) && !defined(__cdecl)
+   /* Define __cdecl for non-Microsoft compilers. */
+#  define __cdecl
+#  define GLUT_DEFINED___CDECL
+# endif
+# ifndef _CRTIMP
+#  ifdef _NTSDK
+    /* Definition compatible with NT SDK */
+#   define _CRTIMP
+#  else
+    /* Current definition */
+#   ifdef _DLL
+#    define _CRTIMP __declspec(dllimport)
+#   else
+#    define _CRTIMP
+#   endif
+#  endif
+#  define GLUT_DEFINED__CRTIMP
+# endif
+
+/* GLUT API entry point declarations for Win32. */
+# ifdef GLUT_BUILDING_LIB
+#  define GLUTAPI __declspec(dllexport)
+# else
+#  ifdef _DLL
+#   define GLUTAPI __declspec(dllimport)
+#  else
+#   define GLUTAPI extern
+#  endif
+# endif
+
+/* GLUT callback calling convention for Win32. */
+# define GLUTCALLBACK __cdecl
+
+#endif  /* _WIN32 */
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _WIN32
+# ifndef GLUT_BUILDING_LIB
+#if     _MSC_VER >= 1200
+extern _CRTIMP __declspec(noreturn) void   __cdecl exit(int);
+#else
+extern _CRTIMP void   __cdecl exit(int);
+#endif
+//extern _CRTIMP void __cdecl exit(int);
+# endif
+#else
+/* non-Win32 case. */
+/* Define APIENTRY and CALLBACK to nothing if we aren't on Win32. */
+# define APIENTRY
+# define GLUT_APIENTRY_DEFINED
+# define CALLBACK
+/* Define GLUTAPI and GLUTCALLBACK as below if we aren't on Win32. */
+# define GLUTAPI extern
+# define GLUTCALLBACK
+/* Prototype exit for the non-Win32 case (see above). */
+extern void exit(int);
+#endif
+
+/**
+ GLUT API revision history:
+ 
+ GLUT_API_VERSION is updated to reflect incompatible GLUT
+ API changes (interface changes, semantic changes, deletions,
+ or additions).
+ 
+ GLUT_API_VERSION=1  First public release of GLUT.  11/29/94
+
+ GLUT_API_VERSION=2  Added support for OpenGL/GLX multisampling,
+ extension.  Supports new input devices like tablet, dial and button
+ box, and Spaceball.  Easy to query OpenGL extensions.
+
+ GLUT_API_VERSION=3  glutMenuStatus added.
+
+ GLUT_API_VERSION=4  glutInitDisplayString, glutWarpPointer,
+ glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic
+ video resize subAPI, glutPostWindowRedisplay, glutKeyboardUpFunc,
+ glutSpecialUpFunc, glutIgnoreKeyRepeat, glutSetKeyRepeat,
+ glutJoystickFunc, glutForceJoystickFunc (NOT FINALIZED!).
+**/
+#ifndef GLUT_API_VERSION  /* allow this to be overriden */
+#define GLUT_API_VERSION		3
+#endif
+
+/**
+ GLUT implementation revision history:
+ 
+ GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT
+ API revisions and implementation revisions (ie, bug fixes).
+
+ GLUT_XLIB_IMPLEMENTATION=1  mjk's first public release of
+ GLUT Xlib-based implementation.  11/29/94
+
+ GLUT_XLIB_IMPLEMENTATION=2  mjk's second public release of
+ GLUT Xlib-based implementation providing GLUT version 2 
+ interfaces.
+
+ GLUT_XLIB_IMPLEMENTATION=3  mjk's GLUT 2.2 images. 4/17/95
+
+ GLUT_XLIB_IMPLEMENTATION=4  mjk's GLUT 2.3 images. 6/?/95
+
+ GLUT_XLIB_IMPLEMENTATION=5  mjk's GLUT 3.0 images. 10/?/95
+
+ GLUT_XLIB_IMPLEMENTATION=7  mjk's GLUT 3.1+ with glutWarpPoitner.  7/24/96
+
+ GLUT_XLIB_IMPLEMENTATION=8  mjk's GLUT 3.1+ with glutWarpPoitner
+ and video resize.  1/3/97
+
+ GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines.
+
+ GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release.
+
+ GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling.
+
+ GLUT_XLIB_IMPLEMENTATION=13 mjk's GLUT 3.7 beta with GameGLUT support.
+
+ GLUT_XLIB_IMPLEMENTATION=14 mjk's GLUT 3.7 beta with f90gl friend interface.
+
+ GLUT_XLIB_IMPLEMENTATION=15 mjk's GLUT 3.7 beta sync'ed with Mesa <GL/glut.h>
+
+ GLUT_XLIB_IMPLEMENTATION=16 mjk's GLUT 3.8 
+**/
+#ifndef GLUT_XLIB_IMPLEMENTATION  /* Allow this to be overriden. */
+#define GLUT_XLIB_IMPLEMENTATION	16
+#endif
+
+/* Display mode bit masks. */
+#define GLUT_RGB			0
+#define GLUT_RGBA			GLUT_RGB
+#define GLUT_INDEX			1
+#define GLUT_SINGLE			0
+#define GLUT_DOUBLE			2
+#define GLUT_ACCUM			4
+#define GLUT_ALPHA			8
+#define GLUT_DEPTH			16
+#define GLUT_STENCIL			32
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_MULTISAMPLE		128
+#define GLUT_STEREO			256
+#endif
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_LUMINANCE			512
+#endif
+
+/* Mouse buttons. */
+#define GLUT_LEFT_BUTTON		0
+#define GLUT_MIDDLE_BUTTON		1
+#define GLUT_RIGHT_BUTTON		2
+
+/* Mouse button  state. */
+#define GLUT_DOWN			0
+#define GLUT_UP				1
+
+#if (GLUT_API_VERSION >= 2)
+/* function keys */
+#define GLUT_KEY_F1			1
+#define GLUT_KEY_F2			2
+#define GLUT_KEY_F3			3
+#define GLUT_KEY_F4			4
+#define GLUT_KEY_F5			5
+#define GLUT_KEY_F6			6
+#define GLUT_KEY_F7			7
+#define GLUT_KEY_F8			8
+#define GLUT_KEY_F9			9
+#define GLUT_KEY_F10			10
+#define GLUT_KEY_F11			11
+#define GLUT_KEY_F12			12
+/* directional keys */
+#define GLUT_KEY_LEFT			100
+#define GLUT_KEY_UP			101
+#define GLUT_KEY_RIGHT			102
+#define GLUT_KEY_DOWN			103
+#define GLUT_KEY_PAGE_UP		104
+#define GLUT_KEY_PAGE_DOWN		105
+#define GLUT_KEY_HOME			106
+#define GLUT_KEY_END			107
+#define GLUT_KEY_INSERT			108
+#endif
+
+/* Entry/exit  state. */
+#define GLUT_LEFT			0
+#define GLUT_ENTERED			1
+
+/* Menu usage  state. */
+#define GLUT_MENU_NOT_IN_USE		0
+#define GLUT_MENU_IN_USE		1
+
+/* Visibility  state. */
+#define GLUT_NOT_VISIBLE		0
+#define GLUT_VISIBLE			1
+
+/* Window status  state. */
+#define GLUT_HIDDEN			0
+#define GLUT_FULLY_RETAINED		1
+#define GLUT_PARTIALLY_RETAINED		2
+#define GLUT_FULLY_COVERED		3
+
+/* Color index component selection values. */
+#define GLUT_RED			0
+#define GLUT_GREEN			1
+#define GLUT_BLUE			2
+
+#ifdef _WIN32
+/* Stroke font constants (use these in GLUT program). */
+#define GLUT_STROKE_ROMAN		((void*)0)
+#define GLUT_STROKE_MONO_ROMAN		((void*)1)
+
+/* Bitmap font constants (use these in GLUT program). */
+#define GLUT_BITMAP_9_BY_15		((void*)2)
+#define GLUT_BITMAP_8_BY_13		((void*)3)
+#define GLUT_BITMAP_TIMES_ROMAN_10	((void*)4)
+#define GLUT_BITMAP_TIMES_ROMAN_24	((void*)5)
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_BITMAP_HELVETICA_10	((void*)6)
+#define GLUT_BITMAP_HELVETICA_12	((void*)7)
+#define GLUT_BITMAP_HELVETICA_18	((void*)8)
+#endif
+#else
+/* Stroke font opaque addresses (use constants instead in source code). */
+GLUTAPI void *glutStrokeRoman;
+GLUTAPI void *glutStrokeMonoRoman;
+
+/* Stroke font constants (use these in GLUT program). */
+#define GLUT_STROKE_ROMAN		(&glutStrokeRoman)
+#define GLUT_STROKE_MONO_ROMAN		(&glutStrokeMonoRoman)
+
+/* Bitmap font opaque addresses (use constants instead in source code). */
+GLUTAPI void *glutBitmap9By15;
+GLUTAPI void *glutBitmap8By13;
+GLUTAPI void *glutBitmapTimesRoman10;
+GLUTAPI void *glutBitmapTimesRoman24;
+GLUTAPI void *glutBitmapHelvetica10;
+GLUTAPI void *glutBitmapHelvetica12;
+GLUTAPI void *glutBitmapHelvetica18;
+
+/* Bitmap font constants (use these in GLUT program). */
+#define GLUT_BITMAP_9_BY_15		(&glutBitmap9By15)
+#define GLUT_BITMAP_8_BY_13		(&glutBitmap8By13)
+#define GLUT_BITMAP_TIMES_ROMAN_10	(&glutBitmapTimesRoman10)
+#define GLUT_BITMAP_TIMES_ROMAN_24	(&glutBitmapTimesRoman24)
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_BITMAP_HELVETICA_10	(&glutBitmapHelvetica10)
+#define GLUT_BITMAP_HELVETICA_12	(&glutBitmapHelvetica12)
+#define GLUT_BITMAP_HELVETICA_18	(&glutBitmapHelvetica18)
+#endif
+#endif
+
+/* glutGet parameters. */
+#define GLUT_WINDOW_X			((GLenum) 100)
+#define GLUT_WINDOW_Y			((GLenum) 101)
+#define GLUT_WINDOW_WIDTH		((GLenum) 102)
+#define GLUT_WINDOW_HEIGHT		((GLenum) 103)
+#define GLUT_WINDOW_BUFFER_SIZE		((GLenum) 104)
+#define GLUT_WINDOW_STENCIL_SIZE	((GLenum) 105)
+#define GLUT_WINDOW_DEPTH_SIZE		((GLenum) 106)
+#define GLUT_WINDOW_RED_SIZE		((GLenum) 107)
+#define GLUT_WINDOW_GREEN_SIZE		((GLenum) 108)
+#define GLUT_WINDOW_BLUE_SIZE		((GLenum) 109)
+#define GLUT_WINDOW_ALPHA_SIZE		((GLenum) 110)
+#define GLUT_WINDOW_ACCUM_RED_SIZE	((GLenum) 111)
+#define GLUT_WINDOW_ACCUM_GREEN_SIZE	((GLenum) 112)
+#define GLUT_WINDOW_ACCUM_BLUE_SIZE	((GLenum) 113)
+#define GLUT_WINDOW_ACCUM_ALPHA_SIZE	((GLenum) 114)
+#define GLUT_WINDOW_DOUBLEBUFFER	((GLenum) 115)
+#define GLUT_WINDOW_RGBA		((GLenum) 116)
+#define GLUT_WINDOW_PARENT		((GLenum) 117)
+#define GLUT_WINDOW_NUM_CHILDREN	((GLenum) 118)
+#define GLUT_WINDOW_COLORMAP_SIZE	((GLenum) 119)
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_WINDOW_NUM_SAMPLES		((GLenum) 120)
+#define GLUT_WINDOW_STEREO		((GLenum) 121)
+#endif
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_WINDOW_CURSOR		((GLenum) 122)
+#endif
+#define GLUT_SCREEN_WIDTH		((GLenum) 200)
+#define GLUT_SCREEN_HEIGHT		((GLenum) 201)
+#define GLUT_SCREEN_WIDTH_MM		((GLenum) 202)
+#define GLUT_SCREEN_HEIGHT_MM		((GLenum) 203)
+#define GLUT_MENU_NUM_ITEMS		((GLenum) 300)
+#define GLUT_DISPLAY_MODE_POSSIBLE	((GLenum) 400)
+#define GLUT_INIT_WINDOW_X		((GLenum) 500)
+#define GLUT_INIT_WINDOW_Y		((GLenum) 501)
+#define GLUT_INIT_WINDOW_WIDTH		((GLenum) 502)
+#define GLUT_INIT_WINDOW_HEIGHT		((GLenum) 503)
+#define GLUT_INIT_DISPLAY_MODE		((GLenum) 504)
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_ELAPSED_TIME		((GLenum) 700)
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+#define GLUT_WINDOW_FORMAT_ID		((GLenum) 123)
+#endif
+
+#if (GLUT_API_VERSION >= 2)
+/* glutDeviceGet parameters. */
+#define GLUT_HAS_KEYBOARD		((GLenum) 600)
+#define GLUT_HAS_MOUSE			((GLenum) 601)
+#define GLUT_HAS_SPACEBALL		((GLenum) 602)
+#define GLUT_HAS_DIAL_AND_BUTTON_BOX	((GLenum) 603)
+#define GLUT_HAS_TABLET			((GLenum) 604)
+#define GLUT_NUM_MOUSE_BUTTONS		((GLenum) 605)
+#define GLUT_NUM_SPACEBALL_BUTTONS	((GLenum) 606)
+#define GLUT_NUM_BUTTON_BOX_BUTTONS	((GLenum) 607)
+#define GLUT_NUM_DIALS			((GLenum) 608)
+#define GLUT_NUM_TABLET_BUTTONS		((GLenum) 609)
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+#define GLUT_DEVICE_IGNORE_KEY_REPEAT   ((GLenum) 610)
+#define GLUT_DEVICE_KEY_REPEAT          ((GLenum) 611)
+#define GLUT_HAS_JOYSTICK		((GLenum) 612)
+#define GLUT_OWNS_JOYSTICK		((GLenum) 613)
+#define GLUT_JOYSTICK_BUTTONS		((GLenum) 614)
+#define GLUT_JOYSTICK_AXES		((GLenum) 615)
+#define GLUT_JOYSTICK_POLL_RATE		((GLenum) 616)
+#endif
+
+#if (GLUT_API_VERSION >= 3)
+/* glutLayerGet parameters. */
+#define GLUT_OVERLAY_POSSIBLE           ((GLenum) 800)
+#define GLUT_LAYER_IN_USE		((GLenum) 801)
+#define GLUT_HAS_OVERLAY		((GLenum) 802)
+#define GLUT_TRANSPARENT_INDEX		((GLenum) 803)
+#define GLUT_NORMAL_DAMAGED		((GLenum) 804)
+#define GLUT_OVERLAY_DAMAGED		((GLenum) 805)
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+/* glutVideoResizeGet parameters. */
+#define GLUT_VIDEO_RESIZE_POSSIBLE	((GLenum) 900)
+#define GLUT_VIDEO_RESIZE_IN_USE	((GLenum) 901)
+#define GLUT_VIDEO_RESIZE_X_DELTA	((GLenum) 902)
+#define GLUT_VIDEO_RESIZE_Y_DELTA	((GLenum) 903)
+#define GLUT_VIDEO_RESIZE_WIDTH_DELTA	((GLenum) 904)
+#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA	((GLenum) 905)
+#define GLUT_VIDEO_RESIZE_X		((GLenum) 906)
+#define GLUT_VIDEO_RESIZE_Y		((GLenum) 907)
+#define GLUT_VIDEO_RESIZE_WIDTH		((GLenum) 908)
+#define GLUT_VIDEO_RESIZE_HEIGHT	((GLenum) 909)
+#endif
+
+/* glutUseLayer parameters. */
+#define GLUT_NORMAL			((GLenum) 0)
+#define GLUT_OVERLAY			((GLenum) 1)
+
+/* glutGetModifiers return mask. */
+#define GLUT_ACTIVE_SHIFT               1
+#define GLUT_ACTIVE_CTRL                2
+#define GLUT_ACTIVE_ALT                 4
+
+/* glutSetCursor parameters. */
+/* Basic arrows. */
+#define GLUT_CURSOR_RIGHT_ARROW		0
+#define GLUT_CURSOR_LEFT_ARROW		1
+/* Symbolic cursor shapes. */
+#define GLUT_CURSOR_INFO		2
+#define GLUT_CURSOR_DESTROY		3
+#define GLUT_CURSOR_HELP		4
+#define GLUT_CURSOR_CYCLE		5
+#define GLUT_CURSOR_SPRAY		6
+#define GLUT_CURSOR_WAIT		7
+#define GLUT_CURSOR_TEXT		8
+#define GLUT_CURSOR_CROSSHAIR		9
+/* Directional cursors. */
+#define GLUT_CURSOR_UP_DOWN		10
+#define GLUT_CURSOR_LEFT_RIGHT		11
+/* Sizing cursors. */
+#define GLUT_CURSOR_TOP_SIDE		12
+#define GLUT_CURSOR_BOTTOM_SIDE		13
+#define GLUT_CURSOR_LEFT_SIDE		14
+#define GLUT_CURSOR_RIGHT_SIDE		15
+#define GLUT_CURSOR_TOP_LEFT_CORNER	16
+#define GLUT_CURSOR_TOP_RIGHT_CORNER	17
+#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER	18
+#define GLUT_CURSOR_BOTTOM_LEFT_CORNER	19
+/* Inherit from parent window. */
+#define GLUT_CURSOR_INHERIT		100
+/* Blank cursor. */
+#define GLUT_CURSOR_NONE		101
+/* Fullscreen crosshair (if available). */
+#define GLUT_CURSOR_FULL_CROSSHAIR	102
+#endif
+
+/* GLUT initialization sub-API. */
+GLUTAPI void APIENTRY glutInit(int *argcp, char **argv);
+#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
+GLUTAPI void APIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int));
+#ifndef GLUT_BUILDING_LIB
+static void APIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }
+#define glutInit glutInit_ATEXIT_HACK
+#endif
+#endif
+GLUTAPI void APIENTRY glutInitDisplayMode(unsigned int mode);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+GLUTAPI void APIENTRY glutInitDisplayString(const char *string);
+#endif
+GLUTAPI void APIENTRY glutInitWindowPosition(int x, int y);
+GLUTAPI void APIENTRY glutInitWindowSize(int width, int height);
+GLUTAPI void APIENTRY glutMainLoop(void);
+
+/* GLUT window sub-API. */
+GLUTAPI int APIENTRY glutCreateWindow(const char *title);
+#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
+GLUTAPI int APIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int));
+#ifndef GLUT_BUILDING_LIB
+static int APIENTRY glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); }
+#define glutCreateWindow glutCreateWindow_ATEXIT_HACK
+#endif
+#endif
+GLUTAPI int APIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height);
+GLUTAPI void APIENTRY glutDestroyWindow(int win);
+GLUTAPI void APIENTRY glutPostRedisplay(void);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
+GLUTAPI void APIENTRY glutPostWindowRedisplay(int win);
+#endif
+GLUTAPI void APIENTRY glutSwapBuffers(void);
+GLUTAPI int APIENTRY glutGetWindow(void);
+GLUTAPI void APIENTRY glutSetWindow(int win);
+GLUTAPI void APIENTRY glutSetWindowTitle(const char *title);
+GLUTAPI void APIENTRY glutSetIconTitle(const char *title);
+GLUTAPI void APIENTRY glutPositionWindow(int x, int y);
+GLUTAPI void APIENTRY glutReshapeWindow(int width, int height);
+GLUTAPI void APIENTRY glutPopWindow(void);
+GLUTAPI void APIENTRY glutPushWindow(void);
+GLUTAPI void APIENTRY glutIconifyWindow(void);
+GLUTAPI void APIENTRY glutShowWindow(void);
+GLUTAPI void APIENTRY glutHideWindow(void);
+#if (GLUT_API_VERSION >= 3)
+GLUTAPI void APIENTRY glutFullScreen(void);
+GLUTAPI void APIENTRY glutSetCursor(int cursor);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+GLUTAPI void APIENTRY glutWarpPointer(int x, int y);
+#endif
+
+/* GLUT overlay sub-API. */
+GLUTAPI void APIENTRY glutEstablishOverlay(void);
+GLUTAPI void APIENTRY glutRemoveOverlay(void);
+GLUTAPI void APIENTRY glutUseLayer(GLenum layer);
+GLUTAPI void APIENTRY glutPostOverlayRedisplay(void);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
+GLUTAPI void APIENTRY glutPostWindowOverlayRedisplay(int win);
+#endif
+GLUTAPI void APIENTRY glutShowOverlay(void);
+GLUTAPI void APIENTRY glutHideOverlay(void);
+#endif
+
+/* GLUT menu sub-API. */
+GLUTAPI int APIENTRY glutCreateMenu(void (GLUTCALLBACK *func)(int));
+#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
+GLUTAPI int APIENTRY __glutCreateMenuWithExit(void (GLUTCALLBACK *func)(int), void (__cdecl *exitfunc)(int));
+#ifndef GLUT_BUILDING_LIB
+static int APIENTRY glutCreateMenu_ATEXIT_HACK(void (GLUTCALLBACK *func)(int)) { return __glutCreateMenuWithExit(func, exit); }
+#define glutCreateMenu glutCreateMenu_ATEXIT_HACK
+#endif
+#endif
+GLUTAPI void APIENTRY glutDestroyMenu(int menu);
+GLUTAPI int APIENTRY glutGetMenu(void);
+GLUTAPI void APIENTRY glutSetMenu(int menu);
+GLUTAPI void APIENTRY glutAddMenuEntry(const char *label, int value);
+GLUTAPI void APIENTRY glutAddSubMenu(const char *label, int submenu);
+GLUTAPI void APIENTRY glutChangeToMenuEntry(int item, const char *label, int value);
+GLUTAPI void APIENTRY glutChangeToSubMenu(int item, const char *label, int submenu);
+GLUTAPI void APIENTRY glutRemoveMenuItem(int item);
+GLUTAPI void APIENTRY glutAttachMenu(int button);
+GLUTAPI void APIENTRY glutDetachMenu(int button);
+
+/* GLUT window callback sub-API. */
+GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void));
+GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK *func)(int width, int height));
+GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
+GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
+GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
+GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
+GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK *func)(int state));
+GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK *func)(int state));
+GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK *func)(void));
+GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK *func)(int value), int value);
+GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK *func)(int state));
+#if (GLUT_API_VERSION >= 2)
+GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
+GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
+GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
+GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK *func)(int button, int state));
+GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK *func)(int button, int state));
+GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK *func)(int dial, int value));
+GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
+GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
+#if (GLUT_API_VERSION >= 3)
+GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK *func)(int status, int x, int y));
+GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK *func)(void));
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK *func)(int state));
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
+GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
+GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK *func)(unsigned int buttonMask, int x, int y, int z), int pollInterval);
+#endif
+#endif
+#endif
+
+/* GLUT color index sub-API. */
+GLUTAPI void APIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue);
+GLUTAPI GLfloat APIENTRY glutGetColor(int ndx, int component);
+GLUTAPI void APIENTRY glutCopyColormap(int win);
+
+/* GLUT state retrieval sub-API. */
+GLUTAPI int APIENTRY glutGet(GLenum type);
+GLUTAPI int APIENTRY glutDeviceGet(GLenum type);
+#if (GLUT_API_VERSION >= 2)
+/* GLUT extension support sub-API */
+GLUTAPI int APIENTRY glutExtensionSupported(const char *name);
+#endif
+#if (GLUT_API_VERSION >= 3)
+GLUTAPI int APIENTRY glutGetModifiers(void);
+GLUTAPI int APIENTRY glutLayerGet(GLenum type);
+#endif
+
+/* GLUT font sub-API */
+GLUTAPI void APIENTRY glutBitmapCharacter(void *font, int character);
+GLUTAPI int APIENTRY glutBitmapWidth(void *font, int character);
+GLUTAPI void APIENTRY glutStrokeCharacter(void *font, int character);
+GLUTAPI int APIENTRY glutStrokeWidth(void *font, int character);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+GLUTAPI int APIENTRY glutBitmapLength(void *font, const unsigned char *string);
+GLUTAPI int APIENTRY glutStrokeLength(void *font, const unsigned char *string);
+#endif
+
+/* GLUT pre-built models sub-API */
+GLUTAPI void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
+GLUTAPI void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
+GLUTAPI void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
+GLUTAPI void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
+GLUTAPI void APIENTRY glutWireCube(GLdouble size);
+GLUTAPI void APIENTRY glutSolidCube(GLdouble size);
+GLUTAPI void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
+GLUTAPI void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
+GLUTAPI void APIENTRY glutWireDodecahedron(void);
+GLUTAPI void APIENTRY glutSolidDodecahedron(void);
+GLUTAPI void APIENTRY glutWireTeapot(GLdouble size);
+GLUTAPI void APIENTRY glutSolidTeapot(GLdouble size);
+GLUTAPI void APIENTRY glutWireOctahedron(void);
+GLUTAPI void APIENTRY glutSolidOctahedron(void);
+GLUTAPI void APIENTRY glutWireTetrahedron(void);
+GLUTAPI void APIENTRY glutSolidTetrahedron(void);
+GLUTAPI void APIENTRY glutWireIcosahedron(void);
+GLUTAPI void APIENTRY glutSolidIcosahedron(void);
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+/* GLUT video resize sub-API. */
+GLUTAPI int APIENTRY glutVideoResizeGet(GLenum param);
+GLUTAPI void APIENTRY glutSetupVideoResizing(void);
+GLUTAPI void APIENTRY glutStopVideoResizing(void);
+GLUTAPI void APIENTRY glutVideoResize(int x, int y, int width, int height);
+GLUTAPI void APIENTRY glutVideoPan(int x, int y, int width, int height);
+
+/* GLUT debugging sub-API. */
+GLUTAPI void APIENTRY glutReportErrors(void);
+#endif
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+/* GLUT device control sub-API. */
+/* glutSetKeyRepeat modes. */
+#define GLUT_KEY_REPEAT_OFF		0
+#define GLUT_KEY_REPEAT_ON		1
+#define GLUT_KEY_REPEAT_DEFAULT		2
+
+/* Joystick button masks. */
+#define GLUT_JOYSTICK_BUTTON_A		1
+#define GLUT_JOYSTICK_BUTTON_B		2
+#define GLUT_JOYSTICK_BUTTON_C		4
+#define GLUT_JOYSTICK_BUTTON_D		8
+
+GLUTAPI void APIENTRY glutIgnoreKeyRepeat(int ignore);
+GLUTAPI void APIENTRY glutSetKeyRepeat(int repeatMode);
+GLUTAPI void APIENTRY glutForceJoystickFunc(void);
+
+/* GLUT game mode sub-API. */
+/* glutGameModeGet. */
+#define GLUT_GAME_MODE_ACTIVE           ((GLenum) 0)
+#define GLUT_GAME_MODE_POSSIBLE         ((GLenum) 1)
+#define GLUT_GAME_MODE_WIDTH            ((GLenum) 2)
+#define GLUT_GAME_MODE_HEIGHT           ((GLenum) 3)
+#define GLUT_GAME_MODE_PIXEL_DEPTH      ((GLenum) 4)
+#define GLUT_GAME_MODE_REFRESH_RATE     ((GLenum) 5)
+#define GLUT_GAME_MODE_DISPLAY_CHANGED  ((GLenum) 6)
+
+GLUTAPI void APIENTRY glutGameModeString(const char *string);
+GLUTAPI int APIENTRY glutEnterGameMode(void);
+GLUTAPI void APIENTRY glutLeaveGameMode(void);
+GLUTAPI int APIENTRY glutGameModeGet(GLenum mode);
+#endif
+
+#ifdef __cplusplus
+}
+
+#endif
+
+#ifdef GLUT_APIENTRY_DEFINED
+# undef GLUT_APIENTRY_DEFINED
+# undef APIENTRY
+#endif
+
+#ifdef GLUT_WINGDIAPI_DEFINED
+# undef GLUT_WINGDIAPI_DEFINED
+# undef WINGDIAPI
+#endif
+
+#ifdef GLUT_DEFINED___CDECL
+# undef GLUT_DEFINED___CDECL
+# undef __cdecl
+#endif
+
+#ifdef GLUT_DEFINED__CRTIMP
+# undef GLUT_DEFINED__CRTIMP
+# undef _CRTIMP
+#endif
+
+#endif                  /* __glut_h__ */
Index: /tags/DummyModules/VUT/chcdemo/GL/glew.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/GL/glew.h	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/GL/glew.h	(revision 10)
@@ -0,0 +1,9113 @@
+/*
+** The OpenGL Extension Wrangler Library
+** Copyright (C) 2004, 2003, 2002, Milan Ikits <milan ikits[at]ieee org>
+** Copyright (C) 2004, 2003, 2002, Marcelo E. Magallon <mmagallo[at]debian org>
+** Copyright (C) 2002, Lev Povalahev
+** All rights reserved.
+** 
+** Redistribution and use in source and binary forms, with or without 
+** modification, are permitted provided that the following conditions are met:
+** 
+** * Redistributions of source code must retain the above copyright notice, 
+**   this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright notice, 
+**   this list of conditions and the following disclaimer in the documentation 
+**   and/or other materials provided with the distribution.
+** * The name of the author may be used to endorse or promote products 
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+** THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+** License Applicability. Except to the extent portions of this file are
+** made subject to an alternative license as permitted in the SGI Free
+** Software License B, Version 1.1 (the "License"), the contents of this
+** file are subject only to the provisions of the License. You may not use
+** this file except in compliance with the License. You may obtain a copy
+** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
+** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
+** 
+** http://oss.sgi.com/projects/FreeB
+** 
+** Note that, as provided in the License, the Software is distributed on an
+** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
+** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
+** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
+** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
+** 
+** Original Code. The Original Code is: OpenGL Sample Implementation,
+** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
+** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
+** Copyright in any portions created by third parties is as indicated
+** elsewhere herein. All Rights Reserved.
+** 
+** Additional Notice Provisions: This software was created using the
+** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has
+** not been independently verified as being compliant with the OpenGL(R)
+** version 1.2.1 Specification.
+*/
+
+#ifndef __glew_h__
+#define __glew_h__
+#define __GLEW_H__
+
+#if defined(__gl_h_) || defined(__GL_H__)
+#error gl.h included before glew.h
+#endif
+#if defined(__glext_h_) || defined(__GLEXT_H_)
+#error glext.h included before glew.h
+#endif
+#if defined(__gl_ATI_h_)
+#error glATI.h included before glew.h
+#endif
+
+#define __gl_h_
+#define __GL_H__
+#define __glext_h_
+#define __GLEXT_H_
+#define __gl_ATI_h_
+#define __GLX_glx_h__
+
+#if defined(_WIN32)
+
+/*
+ * GLEW does not include <windows.h> to avoid name space pollution.
+ * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t
+ * defined properly.
+ */
+/* <windef.h> */
+#ifndef APIENTRY
+#define GLEW_APIENTRY_DEFINED
+#  if defined(__CYGWIN__) || defined(__MINGW32__)
+#    define APIENTRY __stdcall
+#  elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
+#    define APIENTRY __stdcall
+#  else
+#    define APIENTRY
+#  endif
+#endif
+#ifndef GLAPI
+#  if defined(__CYGWIN__) || defined(__MINGW32__)
+#    define GLAPI extern
+#  endif
+#endif
+/* <winnt.h> */
+#ifndef CALLBACK
+#define GLEW_CALLBACK_DEFINED
+#  if defined(__CYGWIN__) || defined(__MINGW32__)
+#    define CALLBACK __attribute__ ((__stdcall__))
+#  elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
+#    define CALLBACK __stdcall
+#  else
+#    define CALLBACK
+#  endif
+#endif
+/* <wingdi.h> and <winnt.h> */
+#ifndef WINGDIAPI
+#define GLEW_WINGDIAPI_DEFINED
+#define WINGDIAPI __declspec(dllimport)
+#endif
+/* <ctype.h> */
+#if defined(_MSC_VER) && !defined(_WCHAR_T_DEFINED)
+typedef unsigned short wchar_t;
+#  define _WCHAR_T_DEFINED
+#endif
+/* <stddef.h> */
+#if !defined(_W64)
+#  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
+#    define _W64 __w64
+#  else
+#    define _W64
+#  endif
+#endif
+#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_)
+#  ifdef _WIN64
+typedef __int64 ptrdiff_t;
+#  else
+typedef _W64 int ptrdiff_t;
+#  endif
+#  define _PTRDIFF_T_DEFINED
+#  define _PTRDIFF_T_
+#endif
+
+#ifndef GLAPI
+#  if defined(__CYGWIN__) || defined(__MINGW32__)
+#    define GLAPI extern
+#  else
+#    define GLAPI WINGDIAPI
+#  endif
+#endif
+
+#ifndef GLAPIENTRY
+#define GLAPIENTRY APIENTRY
+#endif
+
+/*
+ * GLEW_STATIC needs to be set when using the static version.
+ * GLEW_BUILD is set when building the DLL version.
+ */
+#ifdef GLEW_STATIC
+#  define GLEWAPI extern
+#else
+#  ifdef GLEW_BUILD
+#    define GLEWAPI extern __declspec(dllexport)
+#  else
+#    define GLEWAPI extern __declspec(dllimport)
+#  endif
+#endif
+
+#else /* _UNIX */
+
+/*
+ * Needed for ptrdiff_t in turn needed by VBO.  This is defined by ISO
+ * C.  On my system, this amounts to _3 lines_ of included code, all of
+ * them pretty much harmless.  If you know of a way of detecting 32 vs
+ * 64 _targets_ at compile time you are free to replace this with
+ * something that's portable.  For now, _this_ is the portable solution.
+ * (mem, 2004-01-04)
+ */
+
+#include <stddef.h>
+
+#define GLEW_APIENTRY_DEFINED
+#define APIENTRY
+#define GLEWAPI extern
+
+/* <glu.h> */
+#ifndef GLAPI
+#define GLAPI extern
+#endif
+#ifndef GLAPIENTRY
+#define GLAPIENTRY
+#endif
+
+#endif /* _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ----------------------------- GL_VERSION_1_1 ---------------------------- */
+
+#ifndef GL_VERSION_1_1
+#define GL_VERSION_1_1 1
+
+typedef unsigned int GLenum;
+typedef unsigned char GLboolean;
+typedef unsigned int GLbitfield;
+typedef signed char GLbyte;
+typedef short GLshort;
+typedef int GLint;
+typedef int GLsizei;
+typedef unsigned char GLubyte;
+typedef unsigned short GLushort;
+typedef unsigned int GLuint;
+typedef float GLfloat;
+typedef float GLclampf;
+typedef double GLdouble;
+typedef double GLclampd;
+typedef void GLvoid;
+
+#define GL_ACCUM 0x0100
+#define GL_LOAD 0x0101
+#define GL_RETURN 0x0102
+#define GL_MULT 0x0103
+#define GL_ADD 0x0104
+#define GL_NEVER 0x0200
+#define GL_LESS 0x0201
+#define GL_EQUAL 0x0202
+#define GL_LEQUAL 0x0203
+#define GL_GREATER 0x0204
+#define GL_NOTEQUAL 0x0205
+#define GL_GEQUAL 0x0206
+#define GL_ALWAYS 0x0207
+#define GL_CURRENT_BIT 0x00000001
+#define GL_POINT_BIT 0x00000002
+#define GL_LINE_BIT 0x00000004
+#define GL_POLYGON_BIT 0x00000008
+#define GL_POLYGON_STIPPLE_BIT 0x00000010
+#define GL_PIXEL_MODE_BIT 0x00000020
+#define GL_LIGHTING_BIT 0x00000040
+#define GL_FOG_BIT 0x00000080
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_ACCUM_BUFFER_BIT 0x00000200
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_VIEWPORT_BIT 0x00000800
+#define GL_TRANSFORM_BIT 0x00001000
+#define GL_ENABLE_BIT 0x00002000
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_HINT_BIT 0x00008000
+#define GL_EVAL_BIT 0x00010000
+#define GL_LIST_BIT 0x00020000
+#define GL_TEXTURE_BIT 0x00040000
+#define GL_SCISSOR_BIT 0x00080000
+#define GL_ALL_ATTRIB_BITS 0x000fffff
+#define GL_POINTS 0x0000
+#define GL_LINES 0x0001
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_STRIP 0x0003
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_QUADS 0x0007
+#define GL_QUAD_STRIP 0x0008
+#define GL_POLYGON 0x0009
+#define GL_ZERO 0
+#define GL_ONE 1
+#define GL_SRC_COLOR 0x0300
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_SRC_ALPHA 0x0302
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_DST_ALPHA 0x0304
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+#define GL_DST_COLOR 0x0306
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_SRC_ALPHA_SATURATE 0x0308
+#define GL_TRUE 1
+#define GL_FALSE 0
+#define GL_CLIP_PLANE0 0x3000
+#define GL_CLIP_PLANE1 0x3001
+#define GL_CLIP_PLANE2 0x3002
+#define GL_CLIP_PLANE3 0x3003
+#define GL_CLIP_PLANE4 0x3004
+#define GL_CLIP_PLANE5 0x3005
+#define GL_BYTE 0x1400
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_SHORT 0x1402
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_INT 0x1404
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_2_BYTES 0x1407
+#define GL_3_BYTES 0x1408
+#define GL_4_BYTES 0x1409
+#define GL_DOUBLE 0x140A
+#define GL_NONE 0
+#define GL_FRONT_LEFT 0x0400
+#define GL_FRONT_RIGHT 0x0401
+#define GL_BACK_LEFT 0x0402
+#define GL_BACK_RIGHT 0x0403
+#define GL_FRONT 0x0404
+#define GL_BACK 0x0405
+#define GL_LEFT 0x0406
+#define GL_RIGHT 0x0407
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_AUX0 0x0409
+#define GL_AUX1 0x040A
+#define GL_AUX2 0x040B
+#define GL_AUX3 0x040C
+#define GL_NO_ERROR 0
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVALID_OPERATION 0x0502
+#define GL_STACK_OVERFLOW 0x0503
+#define GL_STACK_UNDERFLOW 0x0504
+#define GL_OUT_OF_MEMORY 0x0505
+#define GL_2D 0x0600
+#define GL_3D 0x0601
+#define GL_3D_COLOR 0x0602
+#define GL_3D_COLOR_TEXTURE 0x0603
+#define GL_4D_COLOR_TEXTURE 0x0604
+#define GL_PASS_THROUGH_TOKEN 0x0700
+#define GL_POINT_TOKEN 0x0701
+#define GL_LINE_TOKEN 0x0702
+#define GL_POLYGON_TOKEN 0x0703
+#define GL_BITMAP_TOKEN 0x0704
+#define GL_DRAW_PIXEL_TOKEN 0x0705
+#define GL_COPY_PIXEL_TOKEN 0x0706
+#define GL_LINE_RESET_TOKEN 0x0707
+#define GL_EXP 0x0800
+#define GL_EXP2 0x0801
+#define GL_CW 0x0900
+#define GL_CCW 0x0901
+#define GL_COEFF 0x0A00
+#define GL_ORDER 0x0A01
+#define GL_DOMAIN 0x0A02
+#define GL_CURRENT_COLOR 0x0B00
+#define GL_CURRENT_INDEX 0x0B01
+#define GL_CURRENT_NORMAL 0x0B02
+#define GL_CURRENT_TEXTURE_COORDS 0x0B03
+#define GL_CURRENT_RASTER_COLOR 0x0B04
+#define GL_CURRENT_RASTER_INDEX 0x0B05
+#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06
+#define GL_CURRENT_RASTER_POSITION 0x0B07
+#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08
+#define GL_CURRENT_RASTER_DISTANCE 0x0B09
+#define GL_POINT_SMOOTH 0x0B10
+#define GL_POINT_SIZE 0x0B11
+#define GL_POINT_SIZE_RANGE 0x0B12
+#define GL_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_LINE_SMOOTH 0x0B20
+#define GL_LINE_WIDTH 0x0B21
+#define GL_LINE_WIDTH_RANGE 0x0B22
+#define GL_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_LINE_STIPPLE 0x0B24
+#define GL_LINE_STIPPLE_PATTERN 0x0B25
+#define GL_LINE_STIPPLE_REPEAT 0x0B26
+#define GL_LIST_MODE 0x0B30
+#define GL_MAX_LIST_NESTING 0x0B31
+#define GL_LIST_BASE 0x0B32
+#define GL_LIST_INDEX 0x0B33
+#define GL_POLYGON_MODE 0x0B40
+#define GL_POLYGON_SMOOTH 0x0B41
+#define GL_POLYGON_STIPPLE 0x0B42
+#define GL_EDGE_FLAG 0x0B43
+#define GL_CULL_FACE 0x0B44
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_FRONT_FACE 0x0B46
+#define GL_LIGHTING 0x0B50
+#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
+#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52
+#define GL_LIGHT_MODEL_AMBIENT 0x0B53
+#define GL_SHADE_MODEL 0x0B54
+#define GL_COLOR_MATERIAL_FACE 0x0B55
+#define GL_COLOR_MATERIAL_PARAMETER 0x0B56
+#define GL_COLOR_MATERIAL 0x0B57
+#define GL_FOG 0x0B60
+#define GL_FOG_INDEX 0x0B61
+#define GL_FOG_DENSITY 0x0B62
+#define GL_FOG_START 0x0B63
+#define GL_FOG_END 0x0B64
+#define GL_FOG_MODE 0x0B65
+#define GL_FOG_COLOR 0x0B66
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_TEST 0x0B71
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_ACCUM_CLEAR_VALUE 0x0B80
+#define GL_STENCIL_TEST 0x0B90
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_MATRIX_MODE 0x0BA0
+#define GL_NORMALIZE 0x0BA1
+#define GL_VIEWPORT 0x0BA2
+#define GL_MODELVIEW_STACK_DEPTH 0x0BA3
+#define GL_PROJECTION_STACK_DEPTH 0x0BA4
+#define GL_TEXTURE_STACK_DEPTH 0x0BA5
+#define GL_MODELVIEW_MATRIX 0x0BA6
+#define GL_PROJECTION_MATRIX 0x0BA7
+#define GL_TEXTURE_MATRIX 0x0BA8
+#define GL_ATTRIB_STACK_DEPTH 0x0BB0
+#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1
+#define GL_ALPHA_TEST 0x0BC0
+#define GL_ALPHA_TEST_FUNC 0x0BC1
+#define GL_ALPHA_TEST_REF 0x0BC2
+#define GL_DITHER 0x0BD0
+#define GL_BLEND_DST 0x0BE0
+#define GL_BLEND_SRC 0x0BE1
+#define GL_BLEND 0x0BE2
+#define GL_LOGIC_OP_MODE 0x0BF0
+#define GL_INDEX_LOGIC_OP 0x0BF1
+#define GL_COLOR_LOGIC_OP 0x0BF2
+#define GL_AUX_BUFFERS 0x0C00
+#define GL_DRAW_BUFFER 0x0C01
+#define GL_READ_BUFFER 0x0C02
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_INDEX_CLEAR_VALUE 0x0C20
+#define GL_INDEX_WRITEMASK 0x0C21
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_INDEX_MODE 0x0C30
+#define GL_RGBA_MODE 0x0C31
+#define GL_DOUBLEBUFFER 0x0C32
+#define GL_STEREO 0x0C33
+#define GL_RENDER_MODE 0x0C40
+#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50
+#define GL_POINT_SMOOTH_HINT 0x0C51
+#define GL_LINE_SMOOTH_HINT 0x0C52
+#define GL_POLYGON_SMOOTH_HINT 0x0C53
+#define GL_FOG_HINT 0x0C54
+#define GL_TEXTURE_GEN_S 0x0C60
+#define GL_TEXTURE_GEN_T 0x0C61
+#define GL_TEXTURE_GEN_R 0x0C62
+#define GL_TEXTURE_GEN_Q 0x0C63
+#define GL_PIXEL_MAP_I_TO_I 0x0C70
+#define GL_PIXEL_MAP_S_TO_S 0x0C71
+#define GL_PIXEL_MAP_I_TO_R 0x0C72
+#define GL_PIXEL_MAP_I_TO_G 0x0C73
+#define GL_PIXEL_MAP_I_TO_B 0x0C74
+#define GL_PIXEL_MAP_I_TO_A 0x0C75
+#define GL_PIXEL_MAP_R_TO_R 0x0C76
+#define GL_PIXEL_MAP_G_TO_G 0x0C77
+#define GL_PIXEL_MAP_B_TO_B 0x0C78
+#define GL_PIXEL_MAP_A_TO_A 0x0C79
+#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0
+#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1
+#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2
+#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3
+#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4
+#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5
+#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6
+#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7
+#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8
+#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9
+#define GL_UNPACK_SWAP_BYTES 0x0CF0
+#define GL_UNPACK_LSB_FIRST 0x0CF1
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_PACK_SWAP_BYTES 0x0D00
+#define GL_PACK_LSB_FIRST 0x0D01
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_MAP_COLOR 0x0D10
+#define GL_MAP_STENCIL 0x0D11
+#define GL_INDEX_SHIFT 0x0D12
+#define GL_INDEX_OFFSET 0x0D13
+#define GL_RED_SCALE 0x0D14
+#define GL_RED_BIAS 0x0D15
+#define GL_ZOOM_X 0x0D16
+#define GL_ZOOM_Y 0x0D17
+#define GL_GREEN_SCALE 0x0D18
+#define GL_GREEN_BIAS 0x0D19
+#define GL_BLUE_SCALE 0x0D1A
+#define GL_BLUE_BIAS 0x0D1B
+#define GL_ALPHA_SCALE 0x0D1C
+#define GL_ALPHA_BIAS 0x0D1D
+#define GL_DEPTH_SCALE 0x0D1E
+#define GL_DEPTH_BIAS 0x0D1F
+#define GL_MAX_EVAL_ORDER 0x0D30
+#define GL_MAX_LIGHTS 0x0D31
+#define GL_MAX_CLIP_PLANES 0x0D32
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_PIXEL_MAP_TABLE 0x0D34
+#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35
+#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36
+#define GL_MAX_NAME_STACK_DEPTH 0x0D37
+#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38
+#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_INDEX_BITS 0x0D51
+#define GL_RED_BITS 0x0D52
+#define GL_GREEN_BITS 0x0D53
+#define GL_BLUE_BITS 0x0D54
+#define GL_ALPHA_BITS 0x0D55
+#define GL_DEPTH_BITS 0x0D56
+#define GL_STENCIL_BITS 0x0D57
+#define GL_ACCUM_RED_BITS 0x0D58
+#define GL_ACCUM_GREEN_BITS 0x0D59
+#define GL_ACCUM_BLUE_BITS 0x0D5A
+#define GL_ACCUM_ALPHA_BITS 0x0D5B
+#define GL_NAME_STACK_DEPTH 0x0D70
+#define GL_AUTO_NORMAL 0x0D80
+#define GL_MAP1_COLOR_4 0x0D90
+#define GL_MAP1_INDEX 0x0D91
+#define GL_MAP1_NORMAL 0x0D92
+#define GL_MAP1_TEXTURE_COORD_1 0x0D93
+#define GL_MAP1_TEXTURE_COORD_2 0x0D94
+#define GL_MAP1_TEXTURE_COORD_3 0x0D95
+#define GL_MAP1_TEXTURE_COORD_4 0x0D96
+#define GL_MAP1_VERTEX_3 0x0D97
+#define GL_MAP1_VERTEX_4 0x0D98
+#define GL_MAP2_COLOR_4 0x0DB0
+#define GL_MAP2_INDEX 0x0DB1
+#define GL_MAP2_NORMAL 0x0DB2
+#define GL_MAP2_TEXTURE_COORD_1 0x0DB3
+#define GL_MAP2_TEXTURE_COORD_2 0x0DB4
+#define GL_MAP2_TEXTURE_COORD_3 0x0DB5
+#define GL_MAP2_TEXTURE_COORD_4 0x0DB6
+#define GL_MAP2_VERTEX_3 0x0DB7
+#define GL_MAP2_VERTEX_4 0x0DB8
+#define GL_MAP1_GRID_DOMAIN 0x0DD0
+#define GL_MAP1_GRID_SEGMENTS 0x0DD1
+#define GL_MAP2_GRID_DOMAIN 0x0DD2
+#define GL_MAP2_GRID_SEGMENTS 0x0DD3
+#define GL_TEXTURE_1D 0x0DE0
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0
+#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1
+#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2
+#define GL_SELECTION_BUFFER_POINTER 0x0DF3
+#define GL_SELECTION_BUFFER_SIZE 0x0DF4
+#define GL_TEXTURE_WIDTH 0x1000
+#define GL_TEXTURE_HEIGHT 0x1001
+#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
+#define GL_TEXTURE_BORDER_COLOR 0x1004
+#define GL_TEXTURE_BORDER 0x1005
+#define GL_DONT_CARE 0x1100
+#define GL_FASTEST 0x1101
+#define GL_NICEST 0x1102
+#define GL_LIGHT0 0x4000
+#define GL_LIGHT1 0x4001
+#define GL_LIGHT2 0x4002
+#define GL_LIGHT3 0x4003
+#define GL_LIGHT4 0x4004
+#define GL_LIGHT5 0x4005
+#define GL_LIGHT6 0x4006
+#define GL_LIGHT7 0x4007
+#define GL_AMBIENT 0x1200
+#define GL_DIFFUSE 0x1201
+#define GL_SPECULAR 0x1202
+#define GL_POSITION 0x1203
+#define GL_SPOT_DIRECTION 0x1204
+#define GL_SPOT_EXPONENT 0x1205
+#define GL_SPOT_CUTOFF 0x1206
+#define GL_CONSTANT_ATTENUATION 0x1207
+#define GL_LINEAR_ATTENUATION 0x1208
+#define GL_QUADRATIC_ATTENUATION 0x1209
+#define GL_COMPILE 0x1300
+#define GL_COMPILE_AND_EXECUTE 0x1301
+#define GL_CLEAR 0x1500
+#define GL_AND 0x1501
+#define GL_AND_REVERSE 0x1502
+#define GL_COPY 0x1503
+#define GL_AND_INVERTED 0x1504
+#define GL_NOOP 0x1505
+#define GL_XOR 0x1506
+#define GL_OR 0x1507
+#define GL_NOR 0x1508
+#define GL_EQUIV 0x1509
+#define GL_INVERT 0x150A
+#define GL_OR_REVERSE 0x150B
+#define GL_COPY_INVERTED 0x150C
+#define GL_OR_INVERTED 0x150D
+#define GL_NAND 0x150E
+#define GL_SET 0x150F
+#define GL_EMISSION 0x1600
+#define GL_SHININESS 0x1601
+#define GL_AMBIENT_AND_DIFFUSE 0x1602
+#define GL_COLOR_INDEXES 0x1603
+#define GL_MODELVIEW 0x1700
+#define GL_PROJECTION 0x1701
+#define GL_TEXTURE 0x1702
+#define GL_COLOR 0x1800
+#define GL_DEPTH 0x1801
+#define GL_STENCIL 0x1802
+#define GL_COLOR_INDEX 0x1900
+#define GL_STENCIL_INDEX 0x1901
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_RED 0x1903
+#define GL_GREEN 0x1904
+#define GL_BLUE 0x1905
+#define GL_ALPHA 0x1906
+#define GL_RGB 0x1907
+#define GL_RGBA 0x1908
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE_ALPHA 0x190A
+#define GL_BITMAP 0x1A00
+#define GL_POINT 0x1B00
+#define GL_LINE 0x1B01
+#define GL_FILL 0x1B02
+#define GL_RENDER 0x1C00
+#define GL_FEEDBACK 0x1C01
+#define GL_SELECT 0x1C02
+#define GL_FLAT 0x1D00
+#define GL_SMOOTH 0x1D01
+#define GL_KEEP 0x1E00
+#define GL_REPLACE 0x1E01
+#define GL_INCR 0x1E02
+#define GL_DECR 0x1E03
+#define GL_VENDOR 0x1F00
+#define GL_RENDERER 0x1F01
+#define GL_VERSION 0x1F02
+#define GL_EXTENSIONS 0x1F03
+#define GL_S 0x2000
+#define GL_T 0x2001
+#define GL_R 0x2002
+#define GL_Q 0x2003
+#define GL_MODULATE 0x2100
+#define GL_DECAL 0x2101
+#define GL_TEXTURE_ENV_MODE 0x2200
+#define GL_TEXTURE_ENV_COLOR 0x2201
+#define GL_TEXTURE_ENV 0x2300
+#define GL_EYE_LINEAR 0x2400
+#define GL_OBJECT_LINEAR 0x2401
+#define GL_SPHERE_MAP 0x2402
+#define GL_TEXTURE_GEN_MODE 0x2500
+#define GL_OBJECT_PLANE 0x2501
+#define GL_EYE_PLANE 0x2502
+#define GL_NEAREST 0x2600
+#define GL_LINEAR 0x2601
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+#define GL_CLAMP 0x2900
+#define GL_REPEAT 0x2901
+#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001
+#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
+#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_OFFSET_POINT 0x2A01
+#define GL_POLYGON_OFFSET_LINE 0x2A02
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_ALPHA4 0x803B
+#define GL_ALPHA8 0x803C
+#define GL_ALPHA12 0x803D
+#define GL_ALPHA16 0x803E
+#define GL_LUMINANCE4 0x803F
+#define GL_LUMINANCE8 0x8040
+#define GL_LUMINANCE12 0x8041
+#define GL_LUMINANCE16 0x8042
+#define GL_LUMINANCE4_ALPHA4 0x8043
+#define GL_LUMINANCE6_ALPHA2 0x8044
+#define GL_LUMINANCE8_ALPHA8 0x8045
+#define GL_LUMINANCE12_ALPHA4 0x8046
+#define GL_LUMINANCE12_ALPHA12 0x8047
+#define GL_LUMINANCE16_ALPHA16 0x8048
+#define GL_INTENSITY 0x8049
+#define GL_INTENSITY4 0x804A
+#define GL_INTENSITY8 0x804B
+#define GL_INTENSITY12 0x804C
+#define GL_INTENSITY16 0x804D
+#define GL_R3_G3_B2 0x2A10
+#define GL_RGB4 0x804F
+#define GL_RGB5 0x8050
+#define GL_RGB8 0x8051
+#define GL_RGB10 0x8052
+#define GL_RGB12 0x8053
+#define GL_RGB16 0x8054
+#define GL_RGBA2 0x8055
+#define GL_RGBA4 0x8056
+#define GL_RGB5_A1 0x8057
+#define GL_RGBA8 0x8058
+#define GL_RGB10_A2 0x8059
+#define GL_RGBA12 0x805A
+#define GL_RGBA16 0x805B
+#define GL_TEXTURE_RED_SIZE 0x805C
+#define GL_TEXTURE_GREEN_SIZE 0x805D
+#define GL_TEXTURE_BLUE_SIZE 0x805E
+#define GL_TEXTURE_ALPHA_SIZE 0x805F
+#define GL_TEXTURE_LUMINANCE_SIZE 0x8060
+#define GL_TEXTURE_INTENSITY_SIZE 0x8061
+#define GL_PROXY_TEXTURE_1D 0x8063
+#define GL_PROXY_TEXTURE_2D 0x8064
+#define GL_TEXTURE_PRIORITY 0x8066
+#define GL_TEXTURE_RESIDENT 0x8067
+#define GL_TEXTURE_BINDING_1D 0x8068
+#define GL_TEXTURE_BINDING_2D 0x8069
+#define GL_VERTEX_ARRAY 0x8074
+#define GL_NORMAL_ARRAY 0x8075
+#define GL_COLOR_ARRAY 0x8076
+#define GL_INDEX_ARRAY 0x8077
+#define GL_TEXTURE_COORD_ARRAY 0x8078
+#define GL_EDGE_FLAG_ARRAY 0x8079
+#define GL_VERTEX_ARRAY_SIZE 0x807A
+#define GL_VERTEX_ARRAY_TYPE 0x807B
+#define GL_VERTEX_ARRAY_STRIDE 0x807C
+#define GL_NORMAL_ARRAY_TYPE 0x807E
+#define GL_NORMAL_ARRAY_STRIDE 0x807F
+#define GL_COLOR_ARRAY_SIZE 0x8081
+#define GL_COLOR_ARRAY_TYPE 0x8082
+#define GL_COLOR_ARRAY_STRIDE 0x8083
+#define GL_INDEX_ARRAY_TYPE 0x8085
+#define GL_INDEX_ARRAY_STRIDE 0x8086
+#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088
+#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089
+#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A
+#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C
+#define GL_VERTEX_ARRAY_POINTER 0x808E
+#define GL_NORMAL_ARRAY_POINTER 0x808F
+#define GL_COLOR_ARRAY_POINTER 0x8090
+#define GL_INDEX_ARRAY_POINTER 0x8091
+#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092
+#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093
+#define GL_V2F 0x2A20
+#define GL_V3F 0x2A21
+#define GL_C4UB_V2F 0x2A22
+#define GL_C4UB_V3F 0x2A23
+#define GL_C3F_V3F 0x2A24
+#define GL_N3F_V3F 0x2A25
+#define GL_C4F_N3F_V3F 0x2A26
+#define GL_T2F_V3F 0x2A27
+#define GL_T4F_V4F 0x2A28
+#define GL_T2F_C4UB_V3F 0x2A29
+#define GL_T2F_C3F_V3F 0x2A2A
+#define GL_T2F_N3F_V3F 0x2A2B
+#define GL_T2F_C4F_N3F_V3F 0x2A2C
+#define GL_T4F_C4F_N3F_V4F 0x2A2D
+#define GL_LOGIC_OP GL_INDEX_LOGIC_OP
+#define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT
+#define GL_COLOR_INDEX1_EXT 0x80E2
+#define GL_COLOR_INDEX2_EXT 0x80E3
+#define GL_COLOR_INDEX4_EXT 0x80E4
+#define GL_COLOR_INDEX8_EXT 0x80E5
+#define GL_COLOR_INDEX12_EXT 0x80E6
+#define GL_COLOR_INDEX16_EXT 0x80E7
+
+GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value);
+GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref);
+GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences);
+GLAPI void GLAPIENTRY glArrayElement (GLint i);
+GLAPI void GLAPIENTRY glBegin (GLenum mode);
+GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture);
+GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GLAPI void GLAPIENTRY glCallList (GLuint list);
+GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists);
+GLAPI void GLAPIENTRY glClear (GLbitfield mask);
+GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+GLAPI void GLAPIENTRY glClearDepth (GLclampd depth);
+GLAPI void GLAPIENTRY glClearIndex (GLfloat c);
+GLAPI void GLAPIENTRY glClearStencil (GLint s);
+GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation);
+GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue);
+GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v);
+GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue);
+GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue);
+GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue);
+GLAPI void GLAPIENTRY glColor3iv (const GLint *v);
+GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue);
+GLAPI void GLAPIENTRY glColor3sv (const GLshort *v);
+GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue);
+GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v);
+GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue);
+GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v);
+GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue);
+GLAPI void GLAPIENTRY glColor3usv (const GLushort *v);
+GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v);
+GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha);
+GLAPI void GLAPIENTRY glColor4iv (const GLint *v);
+GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha);
+GLAPI void GLAPIENTRY glColor4sv (const GLshort *v);
+GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v);
+GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha);
+GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v);
+GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha);
+GLAPI void GLAPIENTRY glColor4usv (const GLushort *v);
+GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode);
+GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border);
+GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void GLAPIENTRY glCullFace (GLenum mode);
+GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range);
+GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GLAPI void GLAPIENTRY glDepthFunc (GLenum func);
+GLAPI void GLAPIENTRY glDepthMask (GLboolean flag);
+GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar);
+GLAPI void GLAPIENTRY glDisable (GLenum cap);
+GLAPI void GLAPIENTRY glDisableClientState (GLenum array);
+GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode);
+GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag);
+GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer);
+GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag);
+GLAPI void GLAPIENTRY glEnable (GLenum cap);
+GLAPI void GLAPIENTRY glEnableClientState (GLenum array);
+GLAPI void GLAPIENTRY glEnd (void);
+GLAPI void GLAPIENTRY glEndList (void);
+GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u);
+GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u);
+GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u);
+GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u);
+GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v);
+GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u);
+GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v);
+GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u);
+GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2);
+GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+GLAPI void GLAPIENTRY glEvalPoint1 (GLint i);
+GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j);
+GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer);
+GLAPI void GLAPIENTRY glFinish (void);
+GLAPI void GLAPIENTRY glFlush (void);
+GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glFrontFace (GLenum mode);
+GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range);
+GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params);
+GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation);
+GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params);
+GLAPI GLenum GLAPIENTRY glGetError (void);
+GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v);
+GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v);
+GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v);
+GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values);
+GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values);
+GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values);
+GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, GLvoid* *params);
+GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask);
+GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name);
+GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params);
+GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode);
+GLAPI void GLAPIENTRY glIndexMask (GLuint mask);
+GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer);
+GLAPI void GLAPIENTRY glIndexd (GLdouble c);
+GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c);
+GLAPI void GLAPIENTRY glIndexf (GLfloat c);
+GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c);
+GLAPI void GLAPIENTRY glIndexi (GLint c);
+GLAPI void GLAPIENTRY glIndexiv (const GLint *c);
+GLAPI void GLAPIENTRY glIndexs (GLshort c);
+GLAPI void GLAPIENTRY glIndexsv (const GLshort *c);
+GLAPI void GLAPIENTRY glIndexub (GLubyte c);
+GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c);
+GLAPI void GLAPIENTRY glInitNames (void);
+GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer);
+GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap);
+GLAPI GLboolean GLAPIENTRY glIsList (GLuint list);
+GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture);
+GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern);
+GLAPI void GLAPIENTRY glLineWidth (GLfloat width);
+GLAPI void GLAPIENTRY glListBase (GLuint base);
+GLAPI void GLAPIENTRY glLoadIdentity (void);
+GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m);
+GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m);
+GLAPI void GLAPIENTRY glLoadName (GLuint name);
+GLAPI void GLAPIENTRY glLogicOp (GLenum opcode);
+GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2);
+GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2);
+GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glMatrixMode (GLenum mode);
+GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m);
+GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m);
+GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode);
+GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz);
+GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v);
+GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz);
+GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz);
+GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz);
+GLAPI void GLAPIENTRY glNormal3iv (const GLint *v);
+GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz);
+GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v);
+GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer);
+GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+GLAPI void GLAPIENTRY glPassThrough (GLfloat token);
+GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values);
+GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values);
+GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values);
+GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor);
+GLAPI void GLAPIENTRY glPointSize (GLfloat size);
+GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode);
+GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask);
+GLAPI void GLAPIENTRY glPopAttrib (void);
+GLAPI void GLAPIENTRY glPopClientAttrib (void);
+GLAPI void GLAPIENTRY glPopMatrix (void);
+GLAPI void GLAPIENTRY glPopName (void);
+GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities);
+GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask);
+GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask);
+GLAPI void GLAPIENTRY glPushMatrix (void);
+GLAPI void GLAPIENTRY glPushName (GLuint name);
+GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y);
+GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y);
+GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y);
+GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v);
+GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y);
+GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v);
+GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z);
+GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z);
+GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z);
+GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v);
+GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z);
+GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v);
+GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w);
+GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v);
+GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w);
+GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v);
+GLAPI void GLAPIENTRY glReadBuffer (GLenum mode);
+GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2);
+GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2);
+GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2);
+GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2);
+GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2);
+GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode);
+GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z);
+GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z);
+GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer);
+GLAPI void GLAPIENTRY glShadeModel (GLenum mode);
+GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GLAPI void GLAPIENTRY glStencilMask (GLuint mask);
+GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s);
+GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s);
+GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glTexCoord1i (GLint s);
+GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v);
+GLAPI void GLAPIENTRY glTexCoord1s (GLshort s);
+GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v);
+GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t);
+GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t);
+GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t);
+GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v);
+GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t);
+GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v);
+GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r);
+GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r);
+GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r);
+GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v);
+GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r);
+GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v);
+GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q);
+GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v);
+GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q);
+GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v);
+GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param);
+GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params);
+GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z);
+GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z);
+GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y);
+GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y);
+GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y);
+GLAPI void GLAPIENTRY glVertex2iv (const GLint *v);
+GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y);
+GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v);
+GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z);
+GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z);
+GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z);
+GLAPI void GLAPIENTRY glVertex3iv (const GLint *v);
+GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z);
+GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v);
+GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w);
+GLAPI void GLAPIENTRY glVertex4iv (const GLint *v);
+GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w);
+GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v);
+GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+
+#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1)
+
+#endif /* GL_VERSION_1_1 */
+
+/* ---------------------------------- GLU ---------------------------------- */
+
+/* this is where we can safely include GLU */
+#if defined(__APPLE__) && defined(__MACH__)
+#include <OpenGL/glu.h>
+#else
+#include <GL/glu.h>
+#endif
+
+/* ----------------------------- GL_VERSION_1_2 ---------------------------- */
+
+#ifndef GL_VERSION_1_2
+#define GL_VERSION_1_2 1
+
+#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12
+#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22
+#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_UNSIGNED_BYTE_3_3_2 0x8032
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_INT_8_8_8_8 0x8035
+#define GL_UNSIGNED_INT_10_10_10_2 0x8036
+#define GL_RESCALE_NORMAL 0x803A
+#define GL_TEXTURE_BINDING_3D 0x806A
+#define GL_PACK_SKIP_IMAGES 0x806B
+#define GL_PACK_IMAGE_HEIGHT 0x806C
+#define GL_UNPACK_SKIP_IMAGES 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT 0x806E
+#define GL_TEXTURE_3D 0x806F
+#define GL_PROXY_TEXTURE_3D 0x8070
+#define GL_TEXTURE_DEPTH 0x8071
+#define GL_TEXTURE_WRAP_R 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE 0x8073
+#define GL_BGR 0x80E0
+#define GL_BGRA 0x80E1
+#define GL_MAX_ELEMENTS_VERTICES 0x80E8
+#define GL_MAX_ELEMENTS_INDICES 0x80E9
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_TEXTURE_MIN_LOD 0x813A
+#define GL_TEXTURE_MAX_LOD 0x813B
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8
+#define GL_SINGLE_COLOR 0x81F9
+#define GL_SEPARATE_SPECULAR_COLOR 0x81FA
+#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364
+#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365
+#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
+#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+
+typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+
+#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D)
+#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements)
+#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D)
+#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D)
+
+#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2)
+
+#endif /* GL_VERSION_1_2 */
+
+/* ----------------------------- GL_VERSION_1_3 ---------------------------- */
+
+#ifndef GL_VERSION_1_3
+#define GL_VERSION_1_3 1
+
+#define GL_MULTISAMPLE 0x809D
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE 0x809F
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_CLAMP_TO_BORDER 0x812D
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1
+#define GL_MAX_TEXTURE_UNITS 0x84E2
+#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3
+#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4
+#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5
+#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6
+#define GL_SUBTRACT 0x84E7
+#define GL_COMPRESSED_ALPHA 0x84E9
+#define GL_COMPRESSED_LUMINANCE 0x84EA
+#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB
+#define GL_COMPRESSED_INTENSITY 0x84EC
+#define GL_COMPRESSED_RGB 0x84ED
+#define GL_COMPRESSED_RGBA 0x84EE
+#define GL_TEXTURE_COMPRESSION_HINT 0x84EF
+#define GL_NORMAL_MAP 0x8511
+#define GL_REFLECTION_MAP 0x8512
+#define GL_TEXTURE_CUBE_MAP 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
+#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
+#define GL_COMBINE 0x8570
+#define GL_COMBINE_RGB 0x8571
+#define GL_COMBINE_ALPHA 0x8572
+#define GL_RGB_SCALE 0x8573
+#define GL_ADD_SIGNED 0x8574
+#define GL_INTERPOLATE 0x8575
+#define GL_CONSTANT 0x8576
+#define GL_PRIMARY_COLOR 0x8577
+#define GL_PREVIOUS 0x8578
+#define GL_SOURCE0_RGB 0x8580
+#define GL_SOURCE1_RGB 0x8581
+#define GL_SOURCE2_RGB 0x8582
+#define GL_SOURCE0_ALPHA 0x8588
+#define GL_SOURCE1_ALPHA 0x8589
+#define GL_SOURCE2_ALPHA 0x858A
+#define GL_OPERAND0_RGB 0x8590
+#define GL_OPERAND1_RGB 0x8591
+#define GL_OPERAND2_RGB 0x8592
+#define GL_OPERAND0_ALPHA 0x8598
+#define GL_OPERAND1_ALPHA 0x8599
+#define GL_OPERAND2_ALPHA 0x859A
+#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0
+#define GL_TEXTURE_COMPRESSED 0x86A1
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_DOT3_RGB 0x86AE
+#define GL_DOT3_RGBA 0x86AF
+#define GL_MULTISAMPLE_BIT 0x20000000
+
+typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture);
+typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLvoid *img);
+typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]);
+typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]);
+typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]);
+typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert);
+
+#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture)
+#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture)
+#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D)
+#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D)
+#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D)
+#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D)
+#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D)
+#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D)
+#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage)
+#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd)
+#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf)
+#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd)
+#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf)
+#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d)
+#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv)
+#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f)
+#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv)
+#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i)
+#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv)
+#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s)
+#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv)
+#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d)
+#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv)
+#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f)
+#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv)
+#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i)
+#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv)
+#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s)
+#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv)
+#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d)
+#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv)
+#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f)
+#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv)
+#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i)
+#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv)
+#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s)
+#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv)
+#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d)
+#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv)
+#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f)
+#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv)
+#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i)
+#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv)
+#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s)
+#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv)
+#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage)
+
+#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3)
+
+#endif /* GL_VERSION_1_3 */
+
+/* ----------------------------- GL_VERSION_1_4 ---------------------------- */
+
+#ifndef GL_VERSION_1_4
+#define GL_VERSION_1_4 1
+
+#define GL_BLEND_DST_RGB 0x80C8
+#define GL_BLEND_SRC_RGB 0x80C9
+#define GL_BLEND_DST_ALPHA 0x80CA
+#define GL_BLEND_SRC_ALPHA 0x80CB
+#define GL_POINT_SIZE_MIN 0x8126
+#define GL_POINT_SIZE_MAX 0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128
+#define GL_POINT_DISTANCE_ATTENUATION 0x8129
+#define GL_GENERATE_MIPMAP 0x8191
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_DEPTH_COMPONENT16 0x81A5
+#define GL_DEPTH_COMPONENT24 0x81A6
+#define GL_DEPTH_COMPONENT32 0x81A7
+#define GL_MIRRORED_REPEAT 0x8370
+#define GL_FOG_COORDINATE_SOURCE 0x8450
+#define GL_FOG_COORDINATE 0x8451
+#define GL_FRAGMENT_DEPTH 0x8452
+#define GL_CURRENT_FOG_COORDINATE 0x8453
+#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454
+#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455
+#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456
+#define GL_FOG_COORDINATE_ARRAY 0x8457
+#define GL_COLOR_SUM 0x8458
+#define GL_CURRENT_SECONDARY_COLOR 0x8459
+#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A
+#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B
+#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C
+#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D
+#define GL_SECONDARY_COLOR_ARRAY 0x845E
+#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
+#define GL_TEXTURE_FILTER_CONTROL 0x8500
+#define GL_TEXTURE_LOD_BIAS 0x8501
+#define GL_INCR_WRAP 0x8507
+#define GL_DECR_WRAP 0x8508
+#define GL_TEXTURE_DEPTH_SIZE 0x884A
+#define GL_DEPTH_TEXTURE_MODE 0x884B
+#define GL_TEXTURE_COMPARE_MODE 0x884C
+#define GL_TEXTURE_COMPARE_FUNC 0x884D
+#define GL_COMPARE_R_TO_TEXTURE 0x884E
+
+typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p);
+
+#define glBlendColor GLEW_GET_FUN(__glewBlendColor)
+#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation)
+#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate)
+#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer)
+#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd)
+#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv)
+#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf)
+#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv)
+#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays)
+#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements)
+#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf)
+#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv)
+#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b)
+#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv)
+#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d)
+#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv)
+#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f)
+#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv)
+#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i)
+#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv)
+#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s)
+#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv)
+#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub)
+#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv)
+#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui)
+#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv)
+#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us)
+#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv)
+#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer)
+#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d)
+#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv)
+#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f)
+#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv)
+#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i)
+#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv)
+#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s)
+#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv)
+#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d)
+#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv)
+#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f)
+#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv)
+#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i)
+#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv)
+#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s)
+#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv)
+
+#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4)
+
+#endif /* GL_VERSION_1_4 */
+
+/* ----------------------------- GL_VERSION_1_5 ---------------------------- */
+
+#ifndef GL_VERSION_1_5
+#define GL_VERSION_1_5 1
+
+#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE
+#define GL_FOG_COORD GL_FOG_COORDINATE
+#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY
+#define GL_SRC0_RGB GL_SOURCE0_RGB
+#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER
+#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE
+#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA
+#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE
+#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE
+#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA
+#define GL_SRC1_RGB GL_SOURCE1_RGB
+#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING
+#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA
+#define GL_SRC2_RGB GL_SOURCE2_RGB
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_QUERY_COUNTER_BITS 0x8864
+#define GL_CURRENT_QUERY 0x8865
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896
+#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897
+#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898
+#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_READ_ONLY 0x88B8
+#define GL_WRITE_ONLY 0x88B9
+#define GL_READ_WRITE 0x88BA
+#define GL_BUFFER_ACCESS 0x88BB
+#define GL_BUFFER_MAPPED 0x88BC
+#define GL_BUFFER_MAP_POINTER 0x88BD
+#define GL_STREAM_DRAW 0x88E0
+#define GL_STREAM_READ 0x88E1
+#define GL_STREAM_COPY 0x88E2
+#define GL_STATIC_DRAW 0x88E4
+#define GL_STATIC_READ 0x88E5
+#define GL_STATIC_COPY 0x88E6
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_DYNAMIC_READ 0x88E9
+#define GL_DYNAMIC_COPY 0x88EA
+#define GL_SAMPLES_PASSED 0x8914
+
+typedef ptrdiff_t GLsizeiptr;
+typedef ptrdiff_t GLintptr;
+
+typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
+typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
+typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
+typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers);
+typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers);
+typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid** params);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint params);
+typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer);
+typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id);
+typedef GLvoid* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access);
+typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target);
+
+#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery)
+#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer)
+#define glBufferData GLEW_GET_FUN(__glewBufferData)
+#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData)
+#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers)
+#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries)
+#define glEndQuery GLEW_GET_FUN(__glewEndQuery)
+#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers)
+#define glGenQueries GLEW_GET_FUN(__glewGenQueries)
+#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv)
+#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv)
+#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData)
+#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv)
+#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv)
+#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv)
+#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer)
+#define glIsQuery GLEW_GET_FUN(__glewIsQuery)
+#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer)
+#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer)
+
+#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5)
+
+#endif /* GL_VERSION_1_5 */
+
+/* ----------------------------- GL_VERSION_2_0 ---------------------------- */
+
+#ifndef GL_VERSION_2_0
+#define GL_VERSION_2_0 1
+
+#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0)
+
+#endif /* GL_VERSION_2_0 */
+
+/* -------------------------- GL_3DFX_multisample -------------------------- */
+
+#ifndef GL_3DFX_multisample
+#define GL_3DFX_multisample 1
+
+#define GL_MULTISAMPLE_3DFX 0x86B2
+#define GL_SAMPLE_BUFFERS_3DFX 0x86B3
+#define GL_SAMPLES_3DFX 0x86B4
+#define GL_MULTISAMPLE_BIT_3DFX 0x20000000
+
+#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample)
+
+#endif /* GL_3DFX_multisample */
+
+/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */
+
+#ifndef GL_3DFX_tbuffer
+#define GL_3DFX_tbuffer 1
+
+typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask);
+
+#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX)
+
+#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer)
+
+#endif /* GL_3DFX_tbuffer */
+
+/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */
+
+#ifndef GL_3DFX_texture_compression_FXT1
+#define GL_3DFX_texture_compression_FXT1 1
+
+#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0
+#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1
+
+#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1)
+
+#endif /* GL_3DFX_texture_compression_FXT1 */
+
+/* ------------------------ GL_APPLE_client_storage ------------------------ */
+
+#ifndef GL_APPLE_client_storage
+#define GL_APPLE_client_storage 1
+
+#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2
+
+#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage)
+
+#endif /* GL_APPLE_client_storage */
+
+/* ------------------------- GL_APPLE_element_array ------------------------ */
+
+#ifndef GL_APPLE_element_array
+#define GL_APPLE_element_array 1
+
+#define GL_ELEMENT_ARRAY_APPLE 0x8768
+#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769
+#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A
+
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count);
+typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount);
+
+#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE)
+#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE)
+#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE)
+#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE)
+#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE)
+
+#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array)
+
+#endif /* GL_APPLE_element_array */
+
+/* ----------------------------- GL_APPLE_fence ---------------------------- */
+
+#ifndef GL_APPLE_fence
+#define GL_APPLE_fence 1
+
+#define GL_DRAW_PIXELS_APPLE 0x8A0A
+#define GL_FENCE_APPLE 0x8A0B
+
+typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences);
+typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence);
+typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name);
+typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences);
+typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence);
+typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence);
+typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence);
+typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name);
+
+#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE)
+#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE)
+#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE)
+#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE)
+#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE)
+#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE)
+#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE)
+#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE)
+
+#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence)
+
+#endif /* GL_APPLE_fence */
+
+/* ------------------------- GL_APPLE_float_pixels ------------------------- */
+
+#ifndef GL_APPLE_float_pixels
+#define GL_APPLE_float_pixels 1
+
+#define GL_HALF_APPLE 0x140B
+#define GL_RGBA_FLOAT32_APPLE 0x8814
+#define GL_RGB_FLOAT32_APPLE 0x8815
+#define GL_ALPHA_FLOAT32_APPLE 0x8816
+#define GL_INTENSITY_FLOAT32_APPLE 0x8817
+#define GL_LUMINANCE_FLOAT32_APPLE 0x8818
+#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819
+#define GL_RGBA_FLOAT16_APPLE 0x881A
+#define GL_RGB_FLOAT16_APPLE 0x881B
+#define GL_ALPHA_FLOAT16_APPLE 0x881C
+#define GL_INTENSITY_FLOAT16_APPLE 0x881D
+#define GL_LUMINANCE_FLOAT16_APPLE 0x881E
+#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F
+#define GL_COLOR_FLOAT_APPLE 0x8A0F
+
+#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels)
+
+#endif /* GL_APPLE_float_pixels */
+
+/* ------------------------ GL_APPLE_specular_vector ----------------------- */
+
+#ifndef GL_APPLE_specular_vector
+#define GL_APPLE_specular_vector 1
+
+#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0
+
+#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector)
+
+#endif /* GL_APPLE_specular_vector */
+
+/* ------------------------- GL_APPLE_texture_range ------------------------ */
+
+#ifndef GL_APPLE_texture_range
+#define GL_APPLE_texture_range 1
+
+#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7
+#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8
+#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC
+#define GL_STORAGE_PRIVATE_APPLE 0x85BD
+#define GL_STORAGE_CACHED_APPLE 0x85BE
+#define GL_STORAGE_SHARED_APPLE 0x85BF
+
+typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid **params);
+typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, GLvoid *pointer);
+
+#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE)
+#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE)
+
+#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range)
+
+#endif /* GL_APPLE_texture_range */
+
+/* ------------------------ GL_APPLE_transform_hint ------------------------ */
+
+#ifndef GL_APPLE_transform_hint
+#define GL_APPLE_transform_hint 1
+
+#define GL_TRANSFORM_HINT_APPLE 0x85B1
+
+#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint)
+
+#endif /* GL_APPLE_transform_hint */
+
+/* ---------------------- GL_APPLE_vertex_array_object --------------------- */
+
+#ifndef GL_APPLE_vertex_array_object
+#define GL_APPLE_vertex_array_object 1
+
+#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5
+
+typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array);
+typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays);
+typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays);
+typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);
+
+#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE)
+#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE)
+#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE)
+#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE)
+
+#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object)
+
+#endif /* GL_APPLE_vertex_array_object */
+
+/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */
+
+#ifndef GL_APPLE_vertex_array_range
+#define GL_APPLE_vertex_array_range 1
+
+#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D
+#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E
+#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F
+#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520
+#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521
+#define GL_STORAGE_CACHED_APPLE 0x85BE
+#define GL_STORAGE_SHARED_APPLE 0x85BF
+
+typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer);
+
+#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE)
+#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE)
+#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE)
+
+#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range)
+
+#endif /* GL_APPLE_vertex_array_range */
+
+/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */
+
+#ifndef GL_APPLE_ycbcr_422
+#define GL_APPLE_ycbcr_422 1
+
+#define GL_YCBCR_422_APPLE 0x85B9
+#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA
+#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB
+
+#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422)
+
+#endif /* GL_APPLE_ycbcr_422 */
+
+/* ----------------------- GL_ARB_color_buffer_float ----------------------- */
+
+#ifndef GL_ARB_color_buffer_float
+#define GL_ARB_color_buffer_float 1
+
+#define GL_RGBA_FLOAT_MODE_ARB 0x8820
+#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A
+#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B
+#define GL_CLAMP_READ_COLOR_ARB 0x891C
+#define GL_FIXED_ONLY_ARB 0x891D
+
+typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp);
+
+#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB)
+
+#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float)
+
+#endif /* GL_ARB_color_buffer_float */
+
+/* -------------------------- GL_ARB_depth_texture ------------------------- */
+
+#ifndef GL_ARB_depth_texture
+#define GL_ARB_depth_texture 1
+
+#define GL_DEPTH_COMPONENT16_ARB 0x81A5
+#define GL_DEPTH_COMPONENT24_ARB 0x81A6
+#define GL_DEPTH_COMPONENT32_ARB 0x81A7
+#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A
+#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B
+
+#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture)
+
+#endif /* GL_ARB_depth_texture */
+
+/* -------------------------- GL_ARB_draw_buffers -------------------------- */
+
+#ifndef GL_ARB_draw_buffers
+#define GL_ARB_draw_buffers 1
+
+#define GL_MAX_DRAW_BUFFERS_ARB 0x8824
+#define GL_DRAW_BUFFER0_ARB 0x8825
+#define GL_DRAW_BUFFER1_ARB 0x8826
+#define GL_DRAW_BUFFER2_ARB 0x8827
+#define GL_DRAW_BUFFER3_ARB 0x8828
+#define GL_DRAW_BUFFER4_ARB 0x8829
+#define GL_DRAW_BUFFER5_ARB 0x882A
+#define GL_DRAW_BUFFER6_ARB 0x882B
+#define GL_DRAW_BUFFER7_ARB 0x882C
+#define GL_DRAW_BUFFER8_ARB 0x882D
+#define GL_DRAW_BUFFER9_ARB 0x882E
+#define GL_DRAW_BUFFER10_ARB 0x882F
+#define GL_DRAW_BUFFER11_ARB 0x8830
+#define GL_DRAW_BUFFER12_ARB 0x8831
+#define GL_DRAW_BUFFER13_ARB 0x8832
+#define GL_DRAW_BUFFER14_ARB 0x8833
+#define GL_DRAW_BUFFER15_ARB 0x8834
+
+typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs);
+
+#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB)
+
+#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers)
+
+#endif /* GL_ARB_draw_buffers */
+
+/* ------------------------ GL_ARB_fragment_program ------------------------ */
+
+#ifndef GL_ARB_fragment_program
+#define GL_ARB_fragment_program 1
+
+#define GL_FRAGMENT_PROGRAM_ARB 0x8804
+#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805
+#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806
+#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807
+#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808
+#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809
+#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A
+#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B
+#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C
+#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D
+#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E
+#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F
+#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810
+#define GL_MAX_TEXTURE_COORDS_ARB 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872
+
+#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program)
+
+#endif /* GL_ARB_fragment_program */
+
+/* --------------------- GL_ARB_fragment_program_shadow -------------------- */
+
+#ifndef GL_ARB_fragment_program_shadow
+#define GL_ARB_fragment_program_shadow 1
+
+#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow)
+
+#endif /* GL_ARB_fragment_program_shadow */
+
+/* ------------------------- GL_ARB_fragment_shader ------------------------ */
+
+#ifndef GL_ARB_fragment_shader
+#define GL_ARB_fragment_shader 1
+
+#define GL_FRAGMENT_SHADER_ARB 0x8B30
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B
+
+#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader)
+
+#endif /* GL_ARB_fragment_shader */
+
+/* ------------------------ GL_ARB_half_float_pixel ------------------------ */
+
+#ifndef GL_ARB_half_float_pixel
+#define GL_ARB_half_float_pixel 1
+
+#define GL_HALF_FLOAT_ARB 0x140B
+
+#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel)
+
+#endif /* GL_ARB_half_float_pixel */
+
+/* ----------------------------- GL_ARB_imaging ---------------------------- */
+
+#ifndef GL_ARB_imaging
+#define GL_ARB_imaging 1
+
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_BLEND_COLOR 0x8005
+#define GL_FUNC_ADD 0x8006
+#define GL_MIN 0x8007
+#define GL_MAX 0x8008
+#define GL_BLEND_EQUATION 0x8009
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_CONVOLUTION_1D 0x8010
+#define GL_CONVOLUTION_2D 0x8011
+#define GL_SEPARABLE_2D 0x8012
+#define GL_CONVOLUTION_BORDER_MODE 0x8013
+#define GL_CONVOLUTION_FILTER_SCALE 0x8014
+#define GL_CONVOLUTION_FILTER_BIAS 0x8015
+#define GL_REDUCE 0x8016
+#define GL_CONVOLUTION_FORMAT 0x8017
+#define GL_CONVOLUTION_WIDTH 0x8018
+#define GL_CONVOLUTION_HEIGHT 0x8019
+#define GL_MAX_CONVOLUTION_WIDTH 0x801A
+#define GL_MAX_CONVOLUTION_HEIGHT 0x801B
+#define GL_POST_CONVOLUTION_RED_SCALE 0x801C
+#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D
+#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E
+#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F
+#define GL_POST_CONVOLUTION_RED_BIAS 0x8020
+#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021
+#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022
+#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023
+#define GL_HISTOGRAM 0x8024
+#define GL_PROXY_HISTOGRAM 0x8025
+#define GL_HISTOGRAM_WIDTH 0x8026
+#define GL_HISTOGRAM_FORMAT 0x8027
+#define GL_HISTOGRAM_RED_SIZE 0x8028
+#define GL_HISTOGRAM_GREEN_SIZE 0x8029
+#define GL_HISTOGRAM_BLUE_SIZE 0x802A
+#define GL_HISTOGRAM_ALPHA_SIZE 0x802B
+#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C
+#define GL_HISTOGRAM_SINK 0x802D
+#define GL_MINMAX 0x802E
+#define GL_MINMAX_FORMAT 0x802F
+#define GL_MINMAX_SINK 0x8030
+#define GL_TABLE_TOO_LARGE 0x8031
+#define GL_COLOR_MATRIX 0x80B1
+#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3
+#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7
+#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB
+#define GL_COLOR_TABLE 0x80D0
+#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2
+#define GL_PROXY_COLOR_TABLE 0x80D3
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
+#define GL_COLOR_TABLE_SCALE 0x80D6
+#define GL_COLOR_TABLE_BIAS 0x80D7
+#define GL_COLOR_TABLE_FORMAT 0x80D8
+#define GL_COLOR_TABLE_WIDTH 0x80D9
+#define GL_COLOR_TABLE_RED_SIZE 0x80DA
+#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB
+#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC
+#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD
+#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE
+#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF
+#define GL_IGNORE_BORDER 0x8150
+#define GL_CONSTANT_BORDER 0x8151
+#define GL_WRAP_BORDER 0x8152
+#define GL_REPLICATE_BORDER 0x8153
+#define GL_CONVOLUTION_BORDER_COLOR 0x8154
+
+typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image);
+typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values);
+typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink);
+typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+
+#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable)
+#define glColorTable GLEW_GET_FUN(__glewColorTable)
+#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv)
+#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv)
+#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D)
+#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D)
+#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf)
+#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv)
+#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri)
+#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv)
+#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable)
+#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable)
+#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D)
+#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D)
+#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable)
+#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv)
+#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv)
+#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter)
+#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv)
+#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv)
+#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram)
+#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv)
+#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv)
+#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax)
+#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv)
+#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv)
+#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter)
+#define glHistogram GLEW_GET_FUN(__glewHistogram)
+#define glMinmax GLEW_GET_FUN(__glewMinmax)
+#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram)
+#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax)
+#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D)
+
+#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging)
+
+#endif /* GL_ARB_imaging */
+
+/* ------------------------- GL_ARB_matrix_palette ------------------------- */
+
+#ifndef GL_ARB_matrix_palette
+#define GL_ARB_matrix_palette 1
+
+#define GL_MATRIX_PALETTE_ARB 0x8840
+#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841
+#define GL_MAX_PALETTE_MATRICES_ARB 0x8842
+#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843
+#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844
+#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845
+#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846
+#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847
+#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848
+#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849
+
+typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index);
+typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer);
+typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices);
+typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices);
+typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices);
+
+#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB)
+#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB)
+#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB)
+#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB)
+#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB)
+
+#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette)
+
+#endif /* GL_ARB_matrix_palette */
+
+/* --------------------------- GL_ARB_multisample -------------------------- */
+
+#ifndef GL_ARB_multisample
+#define GL_ARB_multisample 1
+
+#define GL_MULTISAMPLE_ARB 0x809D
+#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F
+#define GL_SAMPLE_COVERAGE_ARB 0x80A0
+#define GL_SAMPLE_BUFFERS_ARB 0x80A8
+#define GL_SAMPLES_ARB 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB
+#define GL_MULTISAMPLE_BIT_ARB 0x20000000
+
+typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert);
+
+#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB)
+
+#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample)
+
+#endif /* GL_ARB_multisample */
+
+/* -------------------------- GL_ARB_multitexture -------------------------- */
+
+#ifndef GL_ARB_multitexture
+#define GL_ARB_multitexture 1
+
+#define GL_TEXTURE0_ARB 0x84C0
+#define GL_TEXTURE1_ARB 0x84C1
+#define GL_TEXTURE2_ARB 0x84C2
+#define GL_TEXTURE3_ARB 0x84C3
+#define GL_TEXTURE4_ARB 0x84C4
+#define GL_TEXTURE5_ARB 0x84C5
+#define GL_TEXTURE6_ARB 0x84C6
+#define GL_TEXTURE7_ARB 0x84C7
+#define GL_TEXTURE8_ARB 0x84C8
+#define GL_TEXTURE9_ARB 0x84C9
+#define GL_TEXTURE10_ARB 0x84CA
+#define GL_TEXTURE11_ARB 0x84CB
+#define GL_TEXTURE12_ARB 0x84CC
+#define GL_TEXTURE13_ARB 0x84CD
+#define GL_TEXTURE14_ARB 0x84CE
+#define GL_TEXTURE15_ARB 0x84CF
+#define GL_TEXTURE16_ARB 0x84D0
+#define GL_TEXTURE17_ARB 0x84D1
+#define GL_TEXTURE18_ARB 0x84D2
+#define GL_TEXTURE19_ARB 0x84D3
+#define GL_TEXTURE20_ARB 0x84D4
+#define GL_TEXTURE21_ARB 0x84D5
+#define GL_TEXTURE22_ARB 0x84D6
+#define GL_TEXTURE23_ARB 0x84D7
+#define GL_TEXTURE24_ARB 0x84D8
+#define GL_TEXTURE25_ARB 0x84D9
+#define GL_TEXTURE26_ARB 0x84DA
+#define GL_TEXTURE27_ARB 0x84DB
+#define GL_TEXTURE28_ARB 0x84DC
+#define GL_TEXTURE29_ARB 0x84DD
+#define GL_TEXTURE30_ARB 0x84DE
+#define GL_TEXTURE31_ARB 0x84DF
+#define GL_ACTIVE_TEXTURE_ARB 0x84E0
+#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1
+#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
+
+typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture);
+typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v);
+
+#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB)
+#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB)
+#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB)
+#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB)
+#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB)
+#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB)
+#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB)
+#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB)
+#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB)
+#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB)
+#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB)
+#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB)
+#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB)
+#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB)
+#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB)
+#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB)
+#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB)
+#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB)
+#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB)
+#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB)
+#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB)
+#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB)
+#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB)
+#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB)
+#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB)
+#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB)
+#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB)
+#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB)
+#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB)
+#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB)
+#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB)
+#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB)
+#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB)
+#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB)
+
+#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture)
+
+#endif /* GL_ARB_multitexture */
+
+/* ------------------------- GL_ARB_occlusion_query ------------------------ */
+
+#ifndef GL_ARB_occlusion_query
+#define GL_ARB_occlusion_query 1
+
+#define GL_QUERY_COUNTER_BITS_ARB 0x8864
+#define GL_CURRENT_QUERY_ARB 0x8865
+#define GL_QUERY_RESULT_ARB 0x8866
+#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867
+#define GL_SAMPLES_PASSED_ARB 0x8914
+
+typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id);
+typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id);
+
+#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB)
+#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB)
+#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB)
+#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB)
+#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB)
+#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB)
+#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB)
+#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB)
+
+#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query)
+
+#endif /* GL_ARB_occlusion_query */
+
+/* ------------------------ GL_ARB_point_parameters ------------------------ */
+
+#ifndef GL_ARB_point_parameters
+#define GL_ARB_point_parameters 1
+
+#define GL_POINT_SIZE_MIN_ARB 0x8126
+#define GL_POINT_SIZE_MAX_ARB 0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128
+#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129
+
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, GLfloat* params);
+
+#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB)
+#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB)
+
+#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters)
+
+#endif /* GL_ARB_point_parameters */
+
+/* -------------------------- GL_ARB_point_sprite -------------------------- */
+
+#ifndef GL_ARB_point_sprite
+#define GL_ARB_point_sprite 1
+
+#define GL_POINT_SPRITE_ARB 0x8861
+#define GL_COORD_REPLACE_ARB 0x8862
+
+#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite)
+
+#endif /* GL_ARB_point_sprite */
+
+/* ------------------------- GL_ARB_shader_objects ------------------------- */
+
+#ifndef GL_ARB_shader_objects
+#define GL_ARB_shader_objects 1
+
+#define GL_PROGRAM_OBJECT_ARB 0x8B40
+#define GL_SHADER_OBJECT_ARB 0x8B48
+#define GL_OBJECT_TYPE_ARB 0x8B4E
+#define GL_OBJECT_SUBTYPE_ARB 0x8B4F
+#define GL_FLOAT_VEC2_ARB 0x8B50
+#define GL_FLOAT_VEC3_ARB 0x8B51
+#define GL_FLOAT_VEC4_ARB 0x8B52
+#define GL_INT_VEC2_ARB 0x8B53
+#define GL_INT_VEC3_ARB 0x8B54
+#define GL_INT_VEC4_ARB 0x8B55
+#define GL_BOOL_ARB 0x8B56
+#define GL_BOOL_VEC2_ARB 0x8B57
+#define GL_BOOL_VEC3_ARB 0x8B58
+#define GL_BOOL_VEC4_ARB 0x8B59
+#define GL_FLOAT_MAT2_ARB 0x8B5A
+#define GL_FLOAT_MAT3_ARB 0x8B5B
+#define GL_FLOAT_MAT4_ARB 0x8B5C
+#define GL_SAMPLER_1D_ARB 0x8B5D
+#define GL_SAMPLER_2D_ARB 0x8B5E
+#define GL_SAMPLER_3D_ARB 0x8B5F
+#define GL_SAMPLER_CUBE_ARB 0x8B60
+#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61
+#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62
+#define GL_SAMPLER_2D_RECT_ARB 0x8B63
+#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64
+#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80
+#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81
+#define GL_OBJECT_LINK_STATUS_ARB 0x8B82
+#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83
+#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84
+#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85
+#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86
+#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87
+#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88
+
+typedef char GLcharARB;
+typedef int GLhandleARB;
+
+typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj);
+typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj);
+typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void);
+typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType);
+typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj);
+typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name);
+typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj);
+typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname);
+typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog);
+typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source);
+typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params);
+typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj);
+typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj);
+typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj);
+
+#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB)
+#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB)
+#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB)
+#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB)
+#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB)
+#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB)
+#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB)
+#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB)
+#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB)
+#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB)
+#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB)
+#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB)
+#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB)
+#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB)
+#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB)
+#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB)
+#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB)
+#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB)
+#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB)
+#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB)
+#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB)
+#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB)
+#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB)
+#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB)
+#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB)
+#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB)
+#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB)
+#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB)
+#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB)
+#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB)
+#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB)
+#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB)
+#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB)
+#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB)
+#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB)
+#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB)
+#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB)
+#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB)
+#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB)
+
+#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects)
+
+#endif /* GL_ARB_shader_objects */
+
+/* ---------------------- GL_ARB_shading_language_100 ---------------------- */
+
+#ifndef GL_ARB_shading_language_100
+#define GL_ARB_shading_language_100 1
+
+#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
+
+#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100)
+
+#endif /* GL_ARB_shading_language_100 */
+
+/* ----------------------------- GL_ARB_shadow ----------------------------- */
+
+#ifndef GL_ARB_shadow
+#define GL_ARB_shadow 1
+
+#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C
+#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D
+#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E
+
+#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow)
+
+#endif /* GL_ARB_shadow */
+
+/* ------------------------- GL_ARB_shadow_ambient ------------------------- */
+
+#ifndef GL_ARB_shadow_ambient
+#define GL_ARB_shadow_ambient 1
+
+#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF
+
+#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient)
+
+#endif /* GL_ARB_shadow_ambient */
+
+/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */
+
+#ifndef GL_ARB_texture_border_clamp
+#define GL_ARB_texture_border_clamp 1
+
+#define GL_CLAMP_TO_BORDER_ARB 0x812D
+
+#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp)
+
+#endif /* GL_ARB_texture_border_clamp */
+
+/* ----------------------- GL_ARB_texture_compression ---------------------- */
+
+#ifndef GL_ARB_texture_compression
+#define GL_ARB_texture_compression 1
+
+#define GL_COMPRESSED_ALPHA_ARB 0x84E9
+#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA
+#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB
+#define GL_COMPRESSED_INTENSITY_ARB 0x84EC
+#define GL_COMPRESSED_RGB_ARB 0x84ED
+#define GL_COMPRESSED_RGBA_ARB 0x84EE
+#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF
+#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0
+#define GL_TEXTURE_COMPRESSED_ARB 0x86A1
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3
+
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
+typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void* img);
+
+#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB)
+#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB)
+#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB)
+#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB)
+#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB)
+#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB)
+#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB)
+
+#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression)
+
+#endif /* GL_ARB_texture_compression */
+
+/* ------------------------ GL_ARB_texture_cube_map ------------------------ */
+
+#ifndef GL_ARB_texture_cube_map
+#define GL_ARB_texture_cube_map 1
+
+#define GL_NORMAL_MAP_ARB 0x8511
+#define GL_REFLECTION_MAP_ARB 0x8512
+#define GL_TEXTURE_CUBE_MAP_ARB 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C
+
+#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map)
+
+#endif /* GL_ARB_texture_cube_map */
+
+/* ------------------------- GL_ARB_texture_env_add ------------------------ */
+
+#ifndef GL_ARB_texture_env_add
+#define GL_ARB_texture_env_add 1
+
+#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add)
+
+#endif /* GL_ARB_texture_env_add */
+
+/* ----------------------- GL_ARB_texture_env_combine ---------------------- */
+
+#ifndef GL_ARB_texture_env_combine
+#define GL_ARB_texture_env_combine 1
+
+#define GL_SUBTRACT_ARB 0x84E7
+#define GL_COMBINE_ARB 0x8570
+#define GL_COMBINE_RGB_ARB 0x8571
+#define GL_COMBINE_ALPHA_ARB 0x8572
+#define GL_RGB_SCALE_ARB 0x8573
+#define GL_ADD_SIGNED_ARB 0x8574
+#define GL_INTERPOLATE_ARB 0x8575
+#define GL_CONSTANT_ARB 0x8576
+#define GL_PRIMARY_COLOR_ARB 0x8577
+#define GL_PREVIOUS_ARB 0x8578
+#define GL_SOURCE0_RGB_ARB 0x8580
+#define GL_SOURCE1_RGB_ARB 0x8581
+#define GL_SOURCE2_RGB_ARB 0x8582
+#define GL_SOURCE0_ALPHA_ARB 0x8588
+#define GL_SOURCE1_ALPHA_ARB 0x8589
+#define GL_SOURCE2_ALPHA_ARB 0x858A
+#define GL_OPERAND0_RGB_ARB 0x8590
+#define GL_OPERAND1_RGB_ARB 0x8591
+#define GL_OPERAND2_RGB_ARB 0x8592
+#define GL_OPERAND0_ALPHA_ARB 0x8598
+#define GL_OPERAND1_ALPHA_ARB 0x8599
+#define GL_OPERAND2_ALPHA_ARB 0x859A
+
+#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine)
+
+#endif /* GL_ARB_texture_env_combine */
+
+/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */
+
+#ifndef GL_ARB_texture_env_crossbar
+#define GL_ARB_texture_env_crossbar 1
+
+#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar)
+
+#endif /* GL_ARB_texture_env_crossbar */
+
+/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */
+
+#ifndef GL_ARB_texture_env_dot3
+#define GL_ARB_texture_env_dot3 1
+
+#define GL_DOT3_RGB_ARB 0x86AE
+#define GL_DOT3_RGBA_ARB 0x86AF
+
+#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3)
+
+#endif /* GL_ARB_texture_env_dot3 */
+
+/* -------------------------- GL_ARB_texture_float ------------------------- */
+
+#ifndef GL_ARB_texture_float
+#define GL_ARB_texture_float 1
+
+#define GL_RGBA32F_ARB 0x8814
+#define GL_RGB32F_ARB 0x8815
+#define GL_ALPHA32F_ARB 0x8816
+#define GL_INTENSITY32F_ARB 0x8817
+#define GL_LUMINANCE32F_ARB 0x8818
+#define GL_LUMINANCE_ALPHA32F_ARB 0x8819
+#define GL_RGBA16F_ARB 0x881A
+#define GL_RGB16F_ARB 0x881B
+#define GL_ALPHA16F_ARB 0x881C
+#define GL_INTENSITY16F_ARB 0x881D
+#define GL_LUMINANCE16F_ARB 0x881E
+#define GL_LUMINANCE_ALPHA16F_ARB 0x881F
+#define GL_TEXTURE_RED_TYPE_ARB 0x8C10
+#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11
+#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12
+#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13
+#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14
+#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15
+#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16
+#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17
+
+#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float)
+
+#endif /* GL_ARB_texture_float */
+
+/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */
+
+#ifndef GL_ARB_texture_mirrored_repeat
+#define GL_ARB_texture_mirrored_repeat 1
+
+#define GL_MIRRORED_REPEAT_ARB 0x8370
+
+#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat)
+
+#endif /* GL_ARB_texture_mirrored_repeat */
+
+/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */
+
+#ifndef GL_ARB_texture_non_power_of_two
+#define GL_ARB_texture_non_power_of_two 1
+
+#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two)
+
+#endif /* GL_ARB_texture_non_power_of_two */
+
+/* ------------------------ GL_ARB_texture_rectangle ----------------------- */
+
+#ifndef GL_ARB_texture_rectangle
+#define GL_ARB_texture_rectangle 1
+
+#define GL_TEXTURE_RECTANGLE_ARB 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8
+
+#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle)
+
+#endif /* GL_ARB_texture_rectangle */
+
+/* ------------------------ GL_ARB_transpose_matrix ------------------------ */
+
+#ifndef GL_ARB_transpose_matrix
+#define GL_ARB_transpose_matrix 1
+
+#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3
+#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4
+#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5
+#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6
+
+#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix)
+
+#endif /* GL_ARB_transpose_matrix */
+
+/* -------------------------- GL_ARB_vertex_blend -------------------------- */
+
+#ifndef GL_ARB_vertex_blend
+#define GL_ARB_vertex_blend 1
+
+#define GL_MODELVIEW0_ARB 0x1700
+#define GL_MODELVIEW1_ARB 0x850A
+#define GL_MAX_VERTEX_UNITS_ARB 0x86A4
+#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5
+#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6
+#define GL_VERTEX_BLEND_ARB 0x86A7
+#define GL_CURRENT_WEIGHT_ARB 0x86A8
+#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9
+#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA
+#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB
+#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC
+#define GL_WEIGHT_ARRAY_ARB 0x86AD
+#define GL_MODELVIEW2_ARB 0x8722
+#define GL_MODELVIEW3_ARB 0x8723
+#define GL_MODELVIEW4_ARB 0x8724
+#define GL_MODELVIEW5_ARB 0x8725
+#define GL_MODELVIEW6_ARB 0x8726
+#define GL_MODELVIEW7_ARB 0x8727
+#define GL_MODELVIEW8_ARB 0x8728
+#define GL_MODELVIEW9_ARB 0x8729
+#define GL_MODELVIEW10_ARB 0x872A
+#define GL_MODELVIEW11_ARB 0x872B
+#define GL_MODELVIEW12_ARB 0x872C
+#define GL_MODELVIEW13_ARB 0x872D
+#define GL_MODELVIEW14_ARB 0x872E
+#define GL_MODELVIEW15_ARB 0x872F
+#define GL_MODELVIEW16_ARB 0x8730
+#define GL_MODELVIEW17_ARB 0x8731
+#define GL_MODELVIEW18_ARB 0x8732
+#define GL_MODELVIEW19_ARB 0x8733
+#define GL_MODELVIEW20_ARB 0x8734
+#define GL_MODELVIEW21_ARB 0x8735
+#define GL_MODELVIEW22_ARB 0x8736
+#define GL_MODELVIEW23_ARB 0x8737
+#define GL_MODELVIEW24_ARB 0x8738
+#define GL_MODELVIEW25_ARB 0x8739
+#define GL_MODELVIEW26_ARB 0x873A
+#define GL_MODELVIEW27_ARB 0x873B
+#define GL_MODELVIEW28_ARB 0x873C
+#define GL_MODELVIEW29_ARB 0x873D
+#define GL_MODELVIEW30_ARB 0x873E
+#define GL_MODELVIEW31_ARB 0x873F
+
+typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count);
+typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer);
+typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights);
+
+#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB)
+#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB)
+#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB)
+#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB)
+#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB)
+#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB)
+#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB)
+#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB)
+#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB)
+#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB)
+
+#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend)
+
+#endif /* GL_ARB_vertex_blend */
+
+/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */
+
+#ifndef GL_ARB_vertex_buffer_object
+#define GL_ARB_vertex_buffer_object 1
+
+#define GL_BUFFER_SIZE_ARB 0x8764
+#define GL_BUFFER_USAGE_ARB 0x8765
+#define GL_ARRAY_BUFFER_ARB 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
+#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
+#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896
+#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897
+#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898
+#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F
+#define GL_READ_ONLY_ARB 0x88B8
+#define GL_WRITE_ONLY_ARB 0x88B9
+#define GL_READ_WRITE_ARB 0x88BA
+#define GL_BUFFER_ACCESS_ARB 0x88BB
+#define GL_BUFFER_MAPPED_ARB 0x88BC
+#define GL_BUFFER_MAP_POINTER_ARB 0x88BD
+#define GL_STREAM_DRAW_ARB 0x88E0
+#define GL_STREAM_READ_ARB 0x88E1
+#define GL_STREAM_COPY_ARB 0x88E2
+#define GL_STATIC_DRAW_ARB 0x88E4
+#define GL_STATIC_READ_ARB 0x88E5
+#define GL_STATIC_COPY_ARB 0x88E6
+#define GL_DYNAMIC_DRAW_ARB 0x88E8
+#define GL_DYNAMIC_READ_ARB 0x88E9
+#define GL_DYNAMIC_COPY_ARB 0x88EA
+
+typedef ptrdiff_t GLsizeiptrARB;
+typedef ptrdiff_t GLintptrARB;
+
+typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid* data, GLenum usage);
+typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid* data);
+typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers);
+typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid** params);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid* data);
+typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer);
+typedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access);
+typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target);
+
+#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB)
+#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB)
+#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB)
+#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB)
+#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB)
+#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB)
+#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB)
+#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB)
+#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB)
+#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB)
+#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB)
+
+#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object)
+
+#endif /* GL_ARB_vertex_buffer_object */
+
+/* ------------------------- GL_ARB_vertex_program ------------------------- */
+
+#ifndef GL_ARB_vertex_program
+#define GL_ARB_vertex_program 1
+
+#define GL_COLOR_SUM_ARB 0x8458
+#define GL_VERTEX_PROGRAM_ARB 0x8620
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625
+#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626
+#define GL_PROGRAM_LENGTH_ARB 0x8627
+#define GL_PROGRAM_STRING_ARB 0x8628
+#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E
+#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F
+#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
+#define GL_CURRENT_MATRIX_ARB 0x8641
+#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
+#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B
+#define GL_PROGRAM_BINDING_ARB 0x8677
+#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
+#define GL_PROGRAM_ERROR_STRING_ARB 0x8874
+#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875
+#define GL_PROGRAM_FORMAT_ARB 0x8876
+#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0
+#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1
+#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2
+#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3
+#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4
+#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5
+#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6
+#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7
+#define GL_PROGRAM_PARAMETERS_ARB 0x88A8
+#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9
+#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA
+#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB
+#define GL_PROGRAM_ATTRIBS_ARB 0x88AC
+#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD
+#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE
+#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF
+#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0
+#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1
+#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2
+#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3
+#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4
+#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5
+#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6
+#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7
+#define GL_MATRIX0_ARB 0x88C0
+#define GL_MATRIX1_ARB 0x88C1
+#define GL_MATRIX2_ARB 0x88C2
+#define GL_MATRIX3_ARB 0x88C3
+#define GL_MATRIX4_ARB 0x88C4
+#define GL_MATRIX5_ARB 0x88C5
+#define GL_MATRIX6_ARB 0x88C6
+#define GL_MATRIX7_ARB 0x88C7
+#define GL_MATRIX8_ARB 0x88C8
+#define GL_MATRIX9_ARB 0x88C9
+#define GL_MATRIX10_ARB 0x88CA
+#define GL_MATRIX11_ARB 0x88CB
+#define GL_MATRIX12_ARB 0x88CC
+#define GL_MATRIX13_ARB 0x88CD
+#define GL_MATRIX14_ARB 0x88CE
+#define GL_MATRIX15_ARB 0x88CF
+#define GL_MATRIX16_ARB 0x88D0
+#define GL_MATRIX17_ARB 0x88D1
+#define GL_MATRIX18_ARB 0x88D2
+#define GL_MATRIX19_ARB 0x88D3
+#define GL_MATRIX20_ARB 0x88D4
+#define GL_MATRIX21_ARB 0x88D5
+#define GL_MATRIX22_ARB 0x88D6
+#define GL_MATRIX23_ARB 0x88D7
+#define GL_MATRIX24_ARB 0x88D8
+#define GL_MATRIX25_ARB 0x88D9
+#define GL_MATRIX26_ARB 0x88DA
+#define GL_MATRIX27_ARB 0x88DB
+#define GL_MATRIX28_ARB 0x88DC
+#define GL_MATRIX29_ARB 0x88DD
+#define GL_MATRIX30_ARB 0x88DE
+#define GL_MATRIX31_ARB 0x88DF
+
+typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program);
+typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs);
+typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
+typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
+typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void* string);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid** pointer);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void* string);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer);
+
+#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB)
+#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB)
+#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB)
+#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB)
+#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB)
+#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB)
+#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB)
+#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB)
+#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB)
+#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB)
+#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB)
+#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB)
+#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB)
+#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB)
+#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB)
+#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB)
+#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB)
+#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB)
+#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB)
+#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB)
+#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB)
+#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB)
+#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB)
+#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB)
+#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB)
+#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB)
+#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB)
+#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB)
+#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB)
+#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB)
+#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB)
+#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB)
+#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB)
+#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB)
+#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB)
+#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB)
+#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB)
+#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB)
+#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB)
+#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB)
+#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB)
+#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB)
+#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB)
+#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB)
+#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB)
+#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB)
+#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB)
+#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB)
+#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB)
+#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB)
+#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB)
+#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB)
+#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB)
+#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB)
+#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB)
+#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB)
+#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB)
+#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB)
+#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB)
+#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB)
+#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB)
+#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB)
+
+#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program)
+
+#endif /* GL_ARB_vertex_program */
+
+/* -------------------------- GL_ARB_vertex_shader ------------------------- */
+
+#ifndef GL_ARB_vertex_shader
+#define GL_ARB_vertex_shader 1
+
+#define GL_VERTEX_SHADER_ARB 0x8B31
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A
+#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D
+#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89
+#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A
+
+typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name);
+typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name);
+
+#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB)
+#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB)
+#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB)
+
+#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader)
+
+#endif /* GL_ARB_vertex_shader */
+
+/* --------------------------- GL_ARB_window_pos --------------------------- */
+
+#ifndef GL_ARB_window_pos
+#define GL_ARB_window_pos 1
+
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p);
+
+#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB)
+#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB)
+#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB)
+#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB)
+#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB)
+#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB)
+#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB)
+#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB)
+#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB)
+#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB)
+#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB)
+#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB)
+#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB)
+#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB)
+#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB)
+#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB)
+
+#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos)
+
+#endif /* GL_ARB_window_pos */
+
+/* ------------------------- GL_ATIX_point_sprites ------------------------- */
+
+#ifndef GL_ATIX_point_sprites
+#define GL_ATIX_point_sprites 1
+
+#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites)
+
+#endif /* GL_ATIX_point_sprites */
+
+/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */
+
+#ifndef GL_ATIX_texture_env_combine3
+#define GL_ATIX_texture_env_combine3 1
+
+#define GL_MODULATE_ADD_ATIX 0x8744
+#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745
+#define GL_MODULATE_SUBTRACT_ATIX 0x8746
+
+#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3)
+
+#endif /* GL_ATIX_texture_env_combine3 */
+
+/* ----------------------- GL_ATIX_texture_env_route ----------------------- */
+
+#ifndef GL_ATIX_texture_env_route
+#define GL_ATIX_texture_env_route 1
+
+#define GL_SECONDARY_COLOR_ATIX 0x8747
+#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748
+#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749
+
+#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route)
+
+#endif /* GL_ATIX_texture_env_route */
+
+/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */
+
+#ifndef GL_ATIX_vertex_shader_output_point_size
+#define GL_ATIX_vertex_shader_output_point_size 1
+
+#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E
+
+#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size)
+
+#endif /* GL_ATIX_vertex_shader_output_point_size */
+
+/* -------------------------- GL_ATI_draw_buffers -------------------------- */
+
+#ifndef GL_ATI_draw_buffers
+#define GL_ATI_draw_buffers 1
+
+#define GL_MAX_DRAW_BUFFERS_ATI 0x8824
+#define GL_DRAW_BUFFER0_ATI 0x8825
+#define GL_DRAW_BUFFER1_ATI 0x8826
+#define GL_DRAW_BUFFER2_ATI 0x8827
+#define GL_DRAW_BUFFER3_ATI 0x8828
+#define GL_DRAW_BUFFER4_ATI 0x8829
+#define GL_DRAW_BUFFER5_ATI 0x882A
+#define GL_DRAW_BUFFER6_ATI 0x882B
+#define GL_DRAW_BUFFER7_ATI 0x882C
+#define GL_DRAW_BUFFER8_ATI 0x882D
+#define GL_DRAW_BUFFER9_ATI 0x882E
+#define GL_DRAW_BUFFER10_ATI 0x882F
+#define GL_DRAW_BUFFER11_ATI 0x8830
+#define GL_DRAW_BUFFER12_ATI 0x8831
+#define GL_DRAW_BUFFER13_ATI 0x8832
+#define GL_DRAW_BUFFER14_ATI 0x8833
+#define GL_DRAW_BUFFER15_ATI 0x8834
+
+typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs);
+
+#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI)
+
+#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers)
+
+#endif /* GL_ATI_draw_buffers */
+
+/* -------------------------- GL_ATI_element_array ------------------------- */
+
+#ifndef GL_ATI_element_array
+#define GL_ATI_element_array 1
+
+#define GL_ELEMENT_ARRAY_ATI 0x8768
+#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769
+#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A
+
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count);
+typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count);
+typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void* pointer);
+
+#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI)
+#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI)
+#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI)
+
+#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array)
+
+#endif /* GL_ATI_element_array */
+
+/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */
+
+#ifndef GL_ATI_envmap_bumpmap
+#define GL_ATI_envmap_bumpmap 1
+
+#define GL_BUMP_ROT_MATRIX_ATI 0x8775
+#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776
+#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777
+#define GL_BUMP_TEX_UNITS_ATI 0x8778
+#define GL_DUDV_ATI 0x8779
+#define GL_DU8DV8_ATI 0x877A
+#define GL_BUMP_ENVMAP_ATI 0x877B
+#define GL_BUMP_TARGET_ATI 0x877C
+
+typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param);
+typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param);
+typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param);
+typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param);
+
+#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI)
+#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI)
+#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI)
+#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI)
+
+#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap)
+
+#endif /* GL_ATI_envmap_bumpmap */
+
+/* ------------------------- GL_ATI_fragment_shader ------------------------ */
+
+#ifndef GL_ATI_fragment_shader
+#define GL_ATI_fragment_shader 1
+
+#define GL_RED_BIT_ATI 0x00000001
+#define GL_2X_BIT_ATI 0x00000001
+#define GL_4X_BIT_ATI 0x00000002
+#define GL_GREEN_BIT_ATI 0x00000002
+#define GL_COMP_BIT_ATI 0x00000002
+#define GL_BLUE_BIT_ATI 0x00000004
+#define GL_8X_BIT_ATI 0x00000004
+#define GL_NEGATE_BIT_ATI 0x00000004
+#define GL_BIAS_BIT_ATI 0x00000008
+#define GL_HALF_BIT_ATI 0x00000008
+#define GL_QUARTER_BIT_ATI 0x00000010
+#define GL_EIGHTH_BIT_ATI 0x00000020
+#define GL_SATURATE_BIT_ATI 0x00000040
+#define GL_FRAGMENT_SHADER_ATI 0x8920
+#define GL_REG_0_ATI 0x8921
+#define GL_REG_1_ATI 0x8922
+#define GL_REG_2_ATI 0x8923
+#define GL_REG_3_ATI 0x8924
+#define GL_REG_4_ATI 0x8925
+#define GL_REG_5_ATI 0x8926
+#define GL_CON_0_ATI 0x8941
+#define GL_CON_1_ATI 0x8942
+#define GL_CON_2_ATI 0x8943
+#define GL_CON_3_ATI 0x8944
+#define GL_CON_4_ATI 0x8945
+#define GL_CON_5_ATI 0x8946
+#define GL_CON_6_ATI 0x8947
+#define GL_CON_7_ATI 0x8948
+#define GL_MOV_ATI 0x8961
+#define GL_ADD_ATI 0x8963
+#define GL_MUL_ATI 0x8964
+#define GL_SUB_ATI 0x8965
+#define GL_DOT3_ATI 0x8966
+#define GL_DOT4_ATI 0x8967
+#define GL_MAD_ATI 0x8968
+#define GL_LERP_ATI 0x8969
+#define GL_CND_ATI 0x896A
+#define GL_CND0_ATI 0x896B
+#define GL_DOT2_ADD_ATI 0x896C
+#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D
+#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E
+#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F
+#define GL_NUM_PASSES_ATI 0x8970
+#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971
+#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972
+#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973
+#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974
+#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975
+#define GL_SWIZZLE_STR_ATI 0x8976
+#define GL_SWIZZLE_STQ_ATI 0x8977
+#define GL_SWIZZLE_STR_DR_ATI 0x8978
+#define GL_SWIZZLE_STQ_DQ_ATI 0x8979
+
+typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
+typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
+typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void);
+typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
+typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
+typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void);
+typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range);
+typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle);
+typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle);
+typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value);
+
+#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI)
+#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI)
+#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI)
+#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI)
+#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI)
+#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI)
+#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI)
+#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI)
+#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI)
+#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI)
+#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI)
+#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI)
+#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI)
+#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI)
+
+#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader)
+
+#endif /* GL_ATI_fragment_shader */
+
+/* ------------------------ GL_ATI_map_object_buffer ----------------------- */
+
+#ifndef GL_ATI_map_object_buffer
+#define GL_ATI_map_object_buffer 1
+
+typedef void* (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer);
+
+#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI)
+#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI)
+
+#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer)
+
+#endif /* GL_ATI_map_object_buffer */
+
+/* -------------------------- GL_ATI_pn_triangles -------------------------- */
+
+#ifndef GL_ATI_pn_triangles
+#define GL_ATI_pn_triangles 1
+
+#define GL_PN_TRIANGLES_ATI 0x87F0
+#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1
+#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2
+#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3
+#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4
+#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5
+#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6
+#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7
+#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8
+
+typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param);
+
+#define glPNTrianglesfATI GLEW_GET_FUN(__glPNTrianglewesfATI)
+#define glPNTrianglesiATI GLEW_GET_FUN(__glPNTrianglewesiATI)
+
+#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles)
+
+#endif /* GL_ATI_pn_triangles */
+
+/* ------------------------ GL_ATI_separate_stencil ------------------------ */
+
+#ifndef GL_ATI_separate_stencil
+#define GL_ATI_separate_stencil 1
+
+#define GL_STENCIL_BACK_FUNC_ATI 0x8800
+#define GL_STENCIL_BACK_FAIL_ATI 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803
+
+typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
+typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+
+#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI)
+#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI)
+
+#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil)
+
+#endif /* GL_ATI_separate_stencil */
+
+/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */
+
+#ifndef GL_ATI_text_fragment_shader
+#define GL_ATI_text_fragment_shader 1
+
+#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200
+
+#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader)
+
+#endif /* GL_ATI_text_fragment_shader */
+
+/* --------------------- GL_ATI_texture_compression_3dc -------------------- */
+
+#ifndef GL_ATI_texture_compression_3dc
+#define GL_ATI_texture_compression_3dc 1
+
+#define GL_COMPRESSED_RGB_3DC_ATI 0x8837
+
+#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc)
+
+#endif /* GL_ATI_texture_compression_3dc */
+
+/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */
+
+#ifndef GL_ATI_texture_env_combine3
+#define GL_ATI_texture_env_combine3 1
+
+#define GL_MODULATE_ADD_ATI 0x8744
+#define GL_MODULATE_SIGNED_ADD_ATI 0x8745
+#define GL_MODULATE_SUBTRACT_ATI 0x8746
+
+#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3)
+
+#endif /* GL_ATI_texture_env_combine3 */
+
+/* -------------------------- GL_ATI_texture_float ------------------------- */
+
+#ifndef GL_ATI_texture_float
+#define GL_ATI_texture_float 1
+
+#define GL_RGBA_FLOAT32_ATI 0x8814
+#define GL_RGB_FLOAT32_ATI 0x8815
+#define GL_ALPHA_FLOAT32_ATI 0x8816
+#define GL_INTENSITY_FLOAT32_ATI 0x8817
+#define GL_LUMINANCE_FLOAT32_ATI 0x8818
+#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819
+#define GL_RGBA_FLOAT16_ATI 0x881A
+#define GL_RGB_FLOAT16_ATI 0x881B
+#define GL_ALPHA_FLOAT16_ATI 0x881C
+#define GL_INTENSITY_FLOAT16_ATI 0x881D
+#define GL_LUMINANCE_FLOAT16_ATI 0x881E
+#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F
+
+#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float)
+
+#endif /* GL_ATI_texture_float */
+
+/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */
+
+#ifndef GL_ATI_texture_mirror_once
+#define GL_ATI_texture_mirror_once 1
+
+#define GL_MIRROR_CLAMP_ATI 0x8742
+#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743
+
+#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once)
+
+#endif /* GL_ATI_texture_mirror_once */
+
+/* ----------------------- GL_ATI_vertex_array_object ---------------------- */
+
+#ifndef GL_ATI_vertex_array_object
+#define GL_ATI_vertex_array_object 1
+
+#define GL_STATIC_ATI 0x8760
+#define GL_DYNAMIC_ATI 0x8761
+#define GL_PRESERVE_ATI 0x8762
+#define GL_DISCARD_ATI 0x8763
+#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764
+#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765
+#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766
+#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767
+
+typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);
+typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer);
+typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void* pointer, GLenum usage);
+typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve);
+typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);
+
+#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI)
+#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI)
+#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI)
+#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI)
+#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI)
+#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI)
+#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI)
+#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI)
+#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI)
+#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI)
+#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI)
+#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI)
+
+#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object)
+
+#endif /* GL_ATI_vertex_array_object */
+
+/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */
+
+#ifndef GL_ATI_vertex_attrib_array_object
+#define GL_ATI_vertex_attrib_array_object 1
+
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset);
+
+#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI)
+#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI)
+#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI)
+
+#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object)
+
+#endif /* GL_ATI_vertex_attrib_array_object */
+
+/* ------------------------- GL_ATI_vertex_streams ------------------------- */
+
+#ifndef GL_ATI_vertex_streams
+#define GL_ATI_vertex_streams 1
+
+#define GL_MAX_VERTEX_STREAMS_ATI 0x876B
+#define GL_VERTEX_SOURCE_ATI 0x876C
+#define GL_VERTEX_STREAM0_ATI 0x876D
+#define GL_VERTEX_STREAM1_ATI 0x876E
+#define GL_VERTEX_STREAM2_ATI 0x876F
+#define GL_VERTEX_STREAM3_ATI 0x8770
+#define GL_VERTEX_STREAM4_ATI 0x8771
+#define GL_VERTEX_STREAM5_ATI 0x8772
+#define GL_VERTEX_STREAM6_ATI 0x8773
+#define GL_VERTEX_STREAM7_ATI 0x8774
+
+typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *v);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *v);
+
+#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI)
+#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI)
+#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI)
+#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI)
+#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI)
+#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI)
+#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI)
+#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI)
+#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI)
+#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI)
+#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI)
+#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI)
+#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI)
+#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI)
+#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI)
+#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI)
+#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI)
+#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI)
+#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI)
+#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI)
+#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI)
+#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI)
+#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI)
+#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI)
+#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI)
+#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI)
+#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI)
+#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI)
+#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI)
+#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI)
+#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI)
+#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI)
+#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI)
+#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI)
+#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI)
+#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI)
+#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI)
+
+#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams)
+
+#endif /* GL_ATI_vertex_streams */
+
+/* --------------------------- GL_EXT_422_pixels --------------------------- */
+
+#ifndef GL_EXT_422_pixels
+#define GL_EXT_422_pixels 1
+
+#define GL_422_EXT 0x80CC
+#define GL_422_REV_EXT 0x80CD
+#define GL_422_AVERAGE_EXT 0x80CE
+#define GL_422_REV_AVERAGE_EXT 0x80CF
+
+#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels)
+
+#endif /* GL_EXT_422_pixels */
+
+/* ---------------------------- GL_EXT_Cg_shader --------------------------- */
+
+#ifndef GL_EXT_Cg_shader
+#define GL_EXT_Cg_shader 1
+
+#define GL_CG_VERTEX_SHADER_EXT 0x890E
+#define GL_CG_FRAGMENT_SHADER_EXT 0x890F
+
+#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader)
+
+#endif /* GL_EXT_Cg_shader */
+
+/* ------------------------------ GL_EXT_abgr ------------------------------ */
+
+#ifndef GL_EXT_abgr
+#define GL_EXT_abgr 1
+
+#define GL_ABGR_EXT 0x8000
+
+#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr)
+
+#endif /* GL_EXT_abgr */
+
+/* ------------------------------ GL_EXT_bgra ------------------------------ */
+
+#ifndef GL_EXT_bgra
+#define GL_EXT_bgra 1
+
+#define GL_BGR_EXT 0x80E0
+#define GL_BGRA_EXT 0x80E1
+
+#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra)
+
+#endif /* GL_EXT_bgra */
+
+/* --------------------------- GL_EXT_blend_color -------------------------- */
+
+#ifndef GL_EXT_blend_color
+#define GL_EXT_blend_color 1
+
+#define GL_CONSTANT_COLOR_EXT 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002
+#define GL_CONSTANT_ALPHA_EXT 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004
+#define GL_BLEND_COLOR_EXT 0x8005
+
+typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+
+#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT)
+
+#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color)
+
+#endif /* GL_EXT_blend_color */
+
+/* --------------------- GL_EXT_blend_equation_separate -------------------- */
+
+#ifndef GL_EXT_blend_equation_separate
+#define GL_EXT_blend_equation_separate 1
+
+#define GL_BLEND_EQUATION_RGB_EXT 0x8009
+#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D
+
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha);
+
+#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT)
+
+#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate)
+
+#endif /* GL_EXT_blend_equation_separate */
+
+/* ----------------------- GL_EXT_blend_func_separate ---------------------- */
+
+#ifndef GL_EXT_blend_func_separate
+#define GL_EXT_blend_func_separate 1
+
+#define GL_BLEND_DST_RGB_EXT 0x80C8
+#define GL_BLEND_SRC_RGB_EXT 0x80C9
+#define GL_BLEND_DST_ALPHA_EXT 0x80CA
+#define GL_BLEND_SRC_ALPHA_EXT 0x80CB
+
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT)
+
+#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate)
+
+#endif /* GL_EXT_blend_func_separate */
+
+/* ------------------------- GL_EXT_blend_logic_op ------------------------- */
+
+#ifndef GL_EXT_blend_logic_op
+#define GL_EXT_blend_logic_op 1
+
+#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op)
+
+#endif /* GL_EXT_blend_logic_op */
+
+/* -------------------------- GL_EXT_blend_minmax -------------------------- */
+
+#ifndef GL_EXT_blend_minmax
+#define GL_EXT_blend_minmax 1
+
+#define GL_FUNC_ADD_EXT 0x8006
+#define GL_MIN_EXT 0x8007
+#define GL_MAX_EXT 0x8008
+#define GL_BLEND_EQUATION_EXT 0x8009
+
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode);
+
+#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT)
+
+#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax)
+
+#endif /* GL_EXT_blend_minmax */
+
+/* ------------------------- GL_EXT_blend_subtract ------------------------- */
+
+#ifndef GL_EXT_blend_subtract
+#define GL_EXT_blend_subtract 1
+
+#define GL_FUNC_SUBTRACT_EXT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B
+
+#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract)
+
+#endif /* GL_EXT_blend_subtract */
+
+/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */
+
+#ifndef GL_EXT_clip_volume_hint
+#define GL_EXT_clip_volume_hint 1
+
+#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0
+
+#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint)
+
+#endif /* GL_EXT_clip_volume_hint */
+
+/* ------------------------------ GL_EXT_cmyka ----------------------------- */
+
+#ifndef GL_EXT_cmyka
+#define GL_EXT_cmyka 1
+
+#define GL_CMYK_EXT 0x800C
+#define GL_CMYKA_EXT 0x800D
+#define GL_PACK_CMYK_HINT_EXT 0x800E
+#define GL_UNPACK_CMYK_HINT_EXT 0x800F
+
+#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka)
+
+#endif /* GL_EXT_cmyka */
+
+/* ------------------------- GL_EXT_color_subtable ------------------------- */
+
+#ifndef GL_EXT_color_subtable
+#define GL_EXT_color_subtable 1
+
+typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+
+#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT)
+#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT)
+
+#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable)
+
+#endif /* GL_EXT_color_subtable */
+
+/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */
+
+#ifndef GL_EXT_compiled_vertex_array
+#define GL_EXT_compiled_vertex_array 1
+
+typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count);
+typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void);
+
+#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT)
+#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT)
+
+#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array)
+
+#endif /* GL_EXT_compiled_vertex_array */
+
+/* --------------------------- GL_EXT_convolution -------------------------- */
+
+#ifndef GL_EXT_convolution
+#define GL_EXT_convolution 1
+
+#define GL_CONVOLUTION_1D_EXT 0x8010
+#define GL_CONVOLUTION_2D_EXT 0x8011
+#define GL_SEPARABLE_2D_EXT 0x8012
+#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013
+#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014
+#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015
+#define GL_REDUCE_EXT 0x8016
+#define GL_CONVOLUTION_FORMAT_EXT 0x8017
+#define GL_CONVOLUTION_WIDTH_EXT 0x8018
+#define GL_CONVOLUTION_HEIGHT_EXT 0x8019
+#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A
+#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B
+#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C
+#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D
+#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E
+#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F
+#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020
+#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021
+#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022
+#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023
+
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* image);
+typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* row, void* column, void* span);
+typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column);
+
+#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT)
+#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT)
+#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT)
+#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT)
+#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT)
+#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT)
+#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT)
+#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT)
+#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT)
+#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT)
+#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT)
+#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT)
+#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT)
+
+#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution)
+
+#endif /* GL_EXT_convolution */
+
+/* ------------------------ GL_EXT_coordinate_frame ------------------------ */
+
+#ifndef GL_EXT_coordinate_frame
+#define GL_EXT_coordinate_frame 1
+
+#define GL_TANGENT_ARRAY_EXT 0x8439
+#define GL_BINORMAL_ARRAY_EXT 0x843A
+#define GL_CURRENT_TANGENT_EXT 0x843B
+#define GL_CURRENT_BINORMAL_EXT 0x843C
+#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E
+#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F
+#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440
+#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441
+#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442
+#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443
+#define GL_MAP1_TANGENT_EXT 0x8444
+#define GL_MAP2_TANGENT_EXT 0x8445
+#define GL_MAP1_BINORMAL_EXT 0x8446
+#define GL_MAP2_BINORMAL_EXT 0x8447
+
+typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer);
+typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer);
+
+#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT)
+#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT)
+
+#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame)
+
+#endif /* GL_EXT_coordinate_frame */
+
+/* -------------------------- GL_EXT_copy_texture -------------------------- */
+
+#ifndef GL_EXT_copy_texture
+#define GL_EXT_copy_texture 1
+
+typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+
+#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT)
+#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT)
+#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT)
+#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT)
+#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT)
+
+#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture)
+
+#endif /* GL_EXT_copy_texture */
+
+/* --------------------------- GL_EXT_cull_vertex -------------------------- */
+
+#ifndef GL_EXT_cull_vertex
+#define GL_EXT_cull_vertex 1
+
+typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params);
+
+#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT)
+#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT)
+
+#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex)
+
+#endif /* GL_EXT_cull_vertex */
+
+/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */
+
+#ifndef GL_EXT_depth_bounds_test
+#define GL_EXT_depth_bounds_test 1
+
+#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890
+#define GL_DEPTH_BOUNDS_EXT 0x8891
+
+typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax);
+
+#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT)
+
+#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test)
+
+#endif /* GL_EXT_depth_bounds_test */
+
+/* ----------------------- GL_EXT_draw_range_elements ---------------------- */
+
+#ifndef GL_EXT_draw_range_elements
+#define GL_EXT_draw_range_elements 1
+
+#define GL_MAX_ELEMENTS_VERTICES 0x80E8
+#define GL_MAX_ELEMENTS_INDICES 0x80E9
+
+typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+
+#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT)
+
+#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements)
+
+#endif /* GL_EXT_draw_range_elements */
+
+/* ---------------------------- GL_EXT_fog_coord --------------------------- */
+
+#ifndef GL_EXT_fog_coord
+#define GL_EXT_fog_coord 1
+
+#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450
+#define GL_FOG_COORDINATE_EXT 0x8451
+#define GL_FRAGMENT_DEPTH_EXT 0x8452
+#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453
+#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454
+#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455
+#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456
+#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457
+
+typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord);
+
+#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT)
+#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT)
+#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT)
+#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT)
+#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT)
+
+#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord)
+
+#endif /* GL_EXT_fog_coord */
+
+/* ------------------------ GL_EXT_fragment_lighting ----------------------- */
+
+#ifndef GL_EXT_fragment_lighting
+#define GL_EXT_fragment_lighting 1
+
+#define GL_FRAGMENT_LIGHTING_EXT 0x8400
+#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401
+#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402
+#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403
+#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404
+#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405
+#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406
+#define GL_LIGHT_ENV_MODE_EXT 0x8407
+#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408
+#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409
+#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A
+#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B
+#define GL_FRAGMENT_LIGHT0_EXT 0x840C
+#define GL_FRAGMENT_LIGHT7_EXT 0x8413
+
+typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param);
+
+#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT)
+#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT)
+#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT)
+#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT)
+#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT)
+#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT)
+#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT)
+#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT)
+#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT)
+#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT)
+#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT)
+#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT)
+#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT)
+#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT)
+#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT)
+#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT)
+#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT)
+#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT)
+
+#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting)
+
+#endif /* GL_EXT_fragment_lighting */
+
+/* ---------------------------- GL_EXT_histogram --------------------------- */
+
+#ifndef GL_EXT_histogram
+#define GL_EXT_histogram 1
+
+#define GL_HISTOGRAM_EXT 0x8024
+#define GL_PROXY_HISTOGRAM_EXT 0x8025
+#define GL_HISTOGRAM_WIDTH_EXT 0x8026
+#define GL_HISTOGRAM_FORMAT_EXT 0x8027
+#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028
+#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029
+#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A
+#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B
+#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C
+#define GL_HISTOGRAM_SINK_EXT 0x802D
+#define GL_MINMAX_EXT 0x802E
+#define GL_MINMAX_FORMAT_EXT 0x802F
+#define GL_MINMAX_SINK_EXT 0x8030
+
+typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values);
+typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values);
+typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink);
+typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target);
+
+#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT)
+#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT)
+#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT)
+#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT)
+#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT)
+#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT)
+#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT)
+#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT)
+#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT)
+#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT)
+
+#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram)
+
+#endif /* GL_EXT_histogram */
+
+/* ----------------------- GL_EXT_index_array_formats ---------------------- */
+
+#ifndef GL_EXT_index_array_formats
+#define GL_EXT_index_array_formats 1
+
+#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats)
+
+#endif /* GL_EXT_index_array_formats */
+
+/* --------------------------- GL_EXT_index_func --------------------------- */
+
+#ifndef GL_EXT_index_func
+#define GL_EXT_index_func 1
+
+typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref);
+
+#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT)
+
+#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func)
+
+#endif /* GL_EXT_index_func */
+
+/* ------------------------- GL_EXT_index_material ------------------------- */
+
+#ifndef GL_EXT_index_material
+#define GL_EXT_index_material 1
+
+typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode);
+
+#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT)
+
+#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material)
+
+#endif /* GL_EXT_index_material */
+
+/* -------------------------- GL_EXT_index_texture ------------------------- */
+
+#ifndef GL_EXT_index_texture
+#define GL_EXT_index_texture 1
+
+#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture)
+
+#endif /* GL_EXT_index_texture */
+
+/* -------------------------- GL_EXT_light_texture ------------------------- */
+
+#ifndef GL_EXT_light_texture
+#define GL_EXT_light_texture 1
+
+#define GL_FRAGMENT_MATERIAL_EXT 0x8349
+#define GL_FRAGMENT_NORMAL_EXT 0x834A
+#define GL_FRAGMENT_COLOR_EXT 0x834C
+#define GL_ATTENUATION_EXT 0x834D
+#define GL_SHADOW_ATTENUATION_EXT 0x834E
+#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F
+#define GL_TEXTURE_LIGHT_EXT 0x8350
+#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351
+#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352
+#define GL_FRAGMENT_DEPTH_EXT 0x8452
+
+typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode);
+typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname);
+typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode);
+
+#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT)
+#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT)
+#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT)
+
+#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture)
+
+#endif /* GL_EXT_light_texture */
+
+/* ------------------------- GL_EXT_misc_attribute ------------------------- */
+
+#ifndef GL_EXT_misc_attribute
+#define GL_EXT_misc_attribute 1
+
+#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute)
+
+#endif /* GL_EXT_misc_attribute */
+
+/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */
+
+#ifndef GL_EXT_multi_draw_arrays
+#define GL_EXT_multi_draw_arrays 1
+
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint* first, GLsizei *count, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount);
+
+#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT)
+#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT)
+
+#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays)
+
+#endif /* GL_EXT_multi_draw_arrays */
+
+/* --------------------------- GL_EXT_multisample -------------------------- */
+
+#ifndef GL_EXT_multisample
+#define GL_EXT_multisample 1
+
+#define GL_MULTISAMPLE_EXT 0x809D
+#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F
+#define GL_SAMPLE_MASK_EXT 0x80A0
+#define GL_1PASS_EXT 0x80A1
+#define GL_2PASS_0_EXT 0x80A2
+#define GL_2PASS_1_EXT 0x80A3
+#define GL_4PASS_0_EXT 0x80A4
+#define GL_4PASS_1_EXT 0x80A5
+#define GL_4PASS_2_EXT 0x80A6
+#define GL_4PASS_3_EXT 0x80A7
+#define GL_SAMPLE_BUFFERS_EXT 0x80A8
+#define GL_SAMPLES_EXT 0x80A9
+#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA
+#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB
+#define GL_SAMPLE_PATTERN_EXT 0x80AC
+#define GL_MULTISAMPLE_BIT_EXT 0x20000000
+
+typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert);
+typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern);
+
+#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT)
+#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT)
+
+#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample)
+
+#endif /* GL_EXT_multisample */
+
+/* -------------------------- GL_EXT_packed_pixels ------------------------- */
+
+#ifndef GL_EXT_packed_pixels
+#define GL_EXT_packed_pixels 1
+
+#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032
+#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034
+#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035
+#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036
+
+#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels)
+
+#endif /* GL_EXT_packed_pixels */
+
+/* ------------------------ GL_EXT_paletted_texture ------------------------ */
+
+#ifndef GL_EXT_paletted_texture
+#define GL_EXT_paletted_texture 1
+
+#define GL_TEXTURE_1D 0x0DE0
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_PROXY_TEXTURE_1D 0x8063
+#define GL_PROXY_TEXTURE_2D 0x8064
+#define GL_TEXTURE_3D_EXT 0x806F
+#define GL_PROXY_TEXTURE_3D_EXT 0x8070
+#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8
+#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9
+#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA
+#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB
+#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC
+#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD
+#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE
+#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF
+#define GL_COLOR_INDEX1_EXT 0x80E2
+#define GL_COLOR_INDEX2_EXT 0x80E3
+#define GL_COLOR_INDEX4_EXT 0x80E4
+#define GL_COLOR_INDEX8_EXT 0x80E5
+#define GL_COLOR_INDEX12_EXT 0x80E6
+#define GL_COLOR_INDEX16_EXT 0x80E7
+#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED
+#define GL_TEXTURE_CUBE_MAP_ARB 0x8513
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B
+
+typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* data);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void* data);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
+
+#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT)
+#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT)
+#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT)
+#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT)
+
+#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture)
+
+#endif /* GL_EXT_paletted_texture */
+
+/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */
+
+#ifndef GL_EXT_pixel_buffer_object
+#define GL_EXT_pixel_buffer_object 1
+
+#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF
+
+#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object)
+
+#endif /* GL_EXT_pixel_buffer_object */
+
+/* ------------------------- GL_EXT_pixel_transform ------------------------ */
+
+#ifndef GL_EXT_pixel_transform
+#define GL_EXT_pixel_transform 1
+
+#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330
+#define GL_PIXEL_MAG_FILTER_EXT 0x8331
+#define GL_PIXEL_MIN_FILTER_EXT 0x8332
+#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333
+#define GL_CUBIC_EXT 0x8334
+#define GL_AVERAGE_EXT 0x8335
+#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336
+#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337
+#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338
+
+typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param);
+typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param);
+typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params);
+
+#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT)
+#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT)
+#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT)
+#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT)
+#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT)
+#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT)
+
+#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform)
+
+#endif /* GL_EXT_pixel_transform */
+
+/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */
+
+#ifndef GL_EXT_pixel_transform_color_table
+#define GL_EXT_pixel_transform_color_table 1
+
+#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table)
+
+#endif /* GL_EXT_pixel_transform_color_table */
+
+/* ------------------------ GL_EXT_point_parameters ------------------------ */
+
+#ifndef GL_EXT_point_parameters
+#define GL_EXT_point_parameters 1
+
+#define GL_POINT_SIZE_MIN_EXT 0x8126
+#define GL_POINT_SIZE_MAX_EXT 0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128
+#define GL_DISTANCE_ATTENUATION_EXT 0x8129
+
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params);
+
+#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT)
+#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT)
+
+#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters)
+
+#endif /* GL_EXT_point_parameters */
+
+/* ------------------------- GL_EXT_polygon_offset ------------------------- */
+
+#ifndef GL_EXT_polygon_offset
+#define GL_EXT_polygon_offset 1
+
+#define GL_POLYGON_OFFSET_EXT 0x8037
+#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038
+#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039
+
+typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias);
+
+#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT)
+
+#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset)
+
+#endif /* GL_EXT_polygon_offset */
+
+/* ------------------------- GL_EXT_rescale_normal ------------------------- */
+
+#ifndef GL_EXT_rescale_normal
+#define GL_EXT_rescale_normal 1
+
+#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal)
+
+#endif /* GL_EXT_rescale_normal */
+
+/* -------------------------- GL_EXT_scene_marker -------------------------- */
+
+#ifndef GL_EXT_scene_marker
+#define GL_EXT_scene_marker 1
+
+typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void);
+typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void);
+
+#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT)
+#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT)
+
+#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker)
+
+#endif /* GL_EXT_scene_marker */
+
+/* ------------------------- GL_EXT_secondary_color ------------------------ */
+
+#ifndef GL_EXT_secondary_color
+#define GL_EXT_secondary_color 1
+
+#define GL_COLOR_SUM_EXT 0x8458
+#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459
+#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A
+#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B
+#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C
+#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D
+#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E
+
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer);
+
+#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT)
+#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT)
+#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT)
+#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT)
+#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT)
+#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT)
+#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT)
+#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT)
+#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT)
+#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT)
+#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT)
+#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT)
+#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT)
+#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT)
+#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT)
+#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT)
+#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT)
+
+#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color)
+
+#endif /* GL_EXT_secondary_color */
+
+/* --------------------- GL_EXT_separate_specular_color -------------------- */
+
+#ifndef GL_EXT_separate_specular_color
+#define GL_EXT_separate_specular_color 1
+
+#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8
+#define GL_SINGLE_COLOR_EXT 0x81F9
+#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA
+
+#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color)
+
+#endif /* GL_EXT_separate_specular_color */
+
+/* -------------------------- GL_EXT_shadow_funcs -------------------------- */
+
+#ifndef GL_EXT_shadow_funcs
+#define GL_EXT_shadow_funcs 1
+
+#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs)
+
+#endif /* GL_EXT_shadow_funcs */
+
+/* --------------------- GL_EXT_shared_texture_palette --------------------- */
+
+#ifndef GL_EXT_shared_texture_palette
+#define GL_EXT_shared_texture_palette 1
+
+#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB
+
+#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette)
+
+#endif /* GL_EXT_shared_texture_palette */
+
+/* ------------------------ GL_EXT_stencil_two_side ------------------------ */
+
+#ifndef GL_EXT_stencil_two_side
+#define GL_EXT_stencil_two_side 1
+
+#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910
+#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911
+
+typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face);
+
+#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT)
+
+#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side)
+
+#endif /* GL_EXT_stencil_two_side */
+
+/* -------------------------- GL_EXT_stencil_wrap -------------------------- */
+
+#ifndef GL_EXT_stencil_wrap
+#define GL_EXT_stencil_wrap 1
+
+#define GL_INCR_WRAP_EXT 0x8507
+#define GL_DECR_WRAP_EXT 0x8508
+
+#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap)
+
+#endif /* GL_EXT_stencil_wrap */
+
+/* --------------------------- GL_EXT_subtexture --------------------------- */
+
+#ifndef GL_EXT_subtexture
+#define GL_EXT_subtexture 1
+
+typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels);
+typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
+typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
+
+#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT)
+#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT)
+#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT)
+
+#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture)
+
+#endif /* GL_EXT_subtexture */
+
+/* ----------------------------- GL_EXT_texture ---------------------------- */
+
+#ifndef GL_EXT_texture
+#define GL_EXT_texture 1
+
+#define GL_ALPHA4_EXT 0x803B
+#define GL_ALPHA8_EXT 0x803C
+#define GL_ALPHA12_EXT 0x803D
+#define GL_ALPHA16_EXT 0x803E
+#define GL_LUMINANCE4_EXT 0x803F
+#define GL_LUMINANCE8_EXT 0x8040
+#define GL_LUMINANCE12_EXT 0x8041
+#define GL_LUMINANCE16_EXT 0x8042
+#define GL_LUMINANCE4_ALPHA4_EXT 0x8043
+#define GL_LUMINANCE6_ALPHA2_EXT 0x8044
+#define GL_LUMINANCE8_ALPHA8_EXT 0x8045
+#define GL_LUMINANCE12_ALPHA4_EXT 0x8046
+#define GL_LUMINANCE12_ALPHA12_EXT 0x8047
+#define GL_LUMINANCE16_ALPHA16_EXT 0x8048
+#define GL_INTENSITY_EXT 0x8049
+#define GL_INTENSITY4_EXT 0x804A
+#define GL_INTENSITY8_EXT 0x804B
+#define GL_INTENSITY12_EXT 0x804C
+#define GL_INTENSITY16_EXT 0x804D
+#define GL_RGB2_EXT 0x804E
+#define GL_RGB4_EXT 0x804F
+#define GL_RGB5_EXT 0x8050
+#define GL_RGB8_EXT 0x8051
+#define GL_RGB10_EXT 0x8052
+#define GL_RGB12_EXT 0x8053
+#define GL_RGB16_EXT 0x8054
+#define GL_RGBA2_EXT 0x8055
+#define GL_RGBA4_EXT 0x8056
+#define GL_RGB5_A1_EXT 0x8057
+#define GL_RGBA8_EXT 0x8058
+#define GL_RGB10_A2_EXT 0x8059
+#define GL_RGBA12_EXT 0x805A
+#define GL_RGBA16_EXT 0x805B
+#define GL_TEXTURE_RED_SIZE_EXT 0x805C
+#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D
+#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E
+#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F
+#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060
+#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061
+#define GL_REPLACE_EXT 0x8062
+#define GL_PROXY_TEXTURE_1D_EXT 0x8063
+#define GL_PROXY_TEXTURE_2D_EXT 0x8064
+
+#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture)
+
+#endif /* GL_EXT_texture */
+
+/* ---------------------------- GL_EXT_texture3D --------------------------- */
+
+#ifndef GL_EXT_texture3D
+#define GL_EXT_texture3D 1
+
+#define GL_PACK_SKIP_IMAGES_EXT 0x806B
+#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C
+#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E
+#define GL_TEXTURE_3D_EXT 0x806F
+#define GL_PROXY_TEXTURE_3D_EXT 0x8070
+#define GL_TEXTURE_DEPTH_EXT 0x8071
+#define GL_TEXTURE_WRAP_R_EXT 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073
+
+typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
+
+#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT)
+
+#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D)
+
+#endif /* GL_EXT_texture3D */
+
+/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */
+
+#ifndef GL_EXT_texture_compression_dxt1
+#define GL_EXT_texture_compression_dxt1 1
+
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
+
+#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1)
+
+#endif /* GL_EXT_texture_compression_dxt1 */
+
+/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */
+
+#ifndef GL_EXT_texture_compression_s3tc
+#define GL_EXT_texture_compression_s3tc 1
+
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
+
+#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc)
+
+#endif /* GL_EXT_texture_compression_s3tc */
+
+/* ------------------------ GL_EXT_texture_cube_map ------------------------ */
+
+#ifndef GL_EXT_texture_cube_map
+#define GL_EXT_texture_cube_map 1
+
+#define GL_NORMAL_MAP_EXT 0x8511
+#define GL_REFLECTION_MAP_EXT 0x8512
+#define GL_TEXTURE_CUBE_MAP_EXT 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A
+#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C
+
+#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map)
+
+#endif /* GL_EXT_texture_cube_map */
+
+/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */
+
+#ifndef GL_EXT_texture_edge_clamp
+#define GL_EXT_texture_edge_clamp 1
+
+#define GL_CLAMP_TO_EDGE_EXT 0x812F
+
+#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp)
+
+#endif /* GL_EXT_texture_edge_clamp */
+
+/* --------------------------- GL_EXT_texture_env -------------------------- */
+
+#ifndef GL_EXT_texture_env
+#define GL_EXT_texture_env 1
+
+#define GL_TEXTURE_ENV0_EXT 0
+#define GL_ENV_BLEND_EXT 0
+#define GL_TEXTURE_ENV_SHIFT_EXT 0
+#define GL_ENV_REPLACE_EXT 0
+#define GL_ENV_ADD_EXT 0
+#define GL_ENV_SUBTRACT_EXT 0
+#define GL_TEXTURE_ENV_MODE_ALPHA_EXT 0
+#define GL_ENV_REVERSE_SUBTRACT_EXT 0
+#define GL_ENV_REVERSE_BLEND_EXT 0
+#define GL_ENV_COPY_EXT 0
+#define GL_ENV_MODULATE_EXT 0
+
+#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env)
+
+#endif /* GL_EXT_texture_env */
+
+/* ------------------------- GL_EXT_texture_env_add ------------------------ */
+
+#ifndef GL_EXT_texture_env_add
+#define GL_EXT_texture_env_add 1
+
+#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add)
+
+#endif /* GL_EXT_texture_env_add */
+
+/* ----------------------- GL_EXT_texture_env_combine ---------------------- */
+
+#ifndef GL_EXT_texture_env_combine
+#define GL_EXT_texture_env_combine 1
+
+#define GL_COMBINE_EXT 0x8570
+#define GL_COMBINE_RGB_EXT 0x8571
+#define GL_COMBINE_ALPHA_EXT 0x8572
+#define GL_RGB_SCALE_EXT 0x8573
+#define GL_ADD_SIGNED_EXT 0x8574
+#define GL_INTERPOLATE_EXT 0x8575
+#define GL_CONSTANT_EXT 0x8576
+#define GL_PRIMARY_COLOR_EXT 0x8577
+#define GL_PREVIOUS_EXT 0x8578
+#define GL_SOURCE0_RGB_EXT 0x8580
+#define GL_SOURCE1_RGB_EXT 0x8581
+#define GL_SOURCE2_RGB_EXT 0x8582
+#define GL_SOURCE0_ALPHA_EXT 0x8588
+#define GL_SOURCE1_ALPHA_EXT 0x8589
+#define GL_SOURCE2_ALPHA_EXT 0x858A
+#define GL_OPERAND0_RGB_EXT 0x8590
+#define GL_OPERAND1_RGB_EXT 0x8591
+#define GL_OPERAND2_RGB_EXT 0x8592
+#define GL_OPERAND0_ALPHA_EXT 0x8598
+#define GL_OPERAND1_ALPHA_EXT 0x8599
+#define GL_OPERAND2_ALPHA_EXT 0x859A
+
+#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine)
+
+#endif /* GL_EXT_texture_env_combine */
+
+/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */
+
+#ifndef GL_EXT_texture_env_dot3
+#define GL_EXT_texture_env_dot3 1
+
+#define GL_DOT3_RGB_EXT 0x8740
+#define GL_DOT3_RGBA_EXT 0x8741
+
+#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3)
+
+#endif /* GL_EXT_texture_env_dot3 */
+
+/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */
+
+#ifndef GL_EXT_texture_filter_anisotropic
+#define GL_EXT_texture_filter_anisotropic 1
+
+#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+
+#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic)
+
+#endif /* GL_EXT_texture_filter_anisotropic */
+
+/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */
+
+#ifndef GL_EXT_texture_lod_bias
+#define GL_EXT_texture_lod_bias 1
+
+#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD
+#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500
+#define GL_TEXTURE_LOD_BIAS_EXT 0x8501
+
+#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias)
+
+#endif /* GL_EXT_texture_lod_bias */
+
+/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */
+
+#ifndef GL_EXT_texture_mirror_clamp
+#define GL_EXT_texture_mirror_clamp 1
+
+#define GL_MIRROR_CLAMP_EXT 0x8742
+#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743
+#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912
+
+#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp)
+
+#endif /* GL_EXT_texture_mirror_clamp */
+
+/* ------------------------- GL_EXT_texture_object ------------------------- */
+
+#ifndef GL_EXT_texture_object
+#define GL_EXT_texture_object 1
+
+#define GL_TEXTURE_PRIORITY_EXT 0x8066
+#define GL_TEXTURE_RESIDENT_EXT 0x8067
+#define GL_TEXTURE_1D_BINDING_EXT 0x8068
+#define GL_TEXTURE_2D_BINDING_EXT 0x8069
+#define GL_TEXTURE_3D_BINDING_EXT 0x806A
+
+typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences);
+typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture);
+typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures);
+typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures);
+typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture);
+typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities);
+
+#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT)
+#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT)
+#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT)
+#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT)
+#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT)
+#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT)
+
+#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object)
+
+#endif /* GL_EXT_texture_object */
+
+/* --------------------- GL_EXT_texture_perturb_normal --------------------- */
+
+#ifndef GL_EXT_texture_perturb_normal
+#define GL_EXT_texture_perturb_normal 1
+
+#define GL_PERTURB_EXT 0x85AE
+#define GL_TEXTURE_NORMAL_EXT 0x85AF
+
+typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode);
+
+#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT)
+
+#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal)
+
+#endif /* GL_EXT_texture_perturb_normal */
+
+/* ------------------------ GL_EXT_texture_rectangle ----------------------- */
+
+#ifndef GL_EXT_texture_rectangle
+#define GL_EXT_texture_rectangle 1
+
+#define GL_TEXTURE_RECTANGLE_EXT 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8
+
+#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle)
+
+#endif /* GL_EXT_texture_rectangle */
+
+/* -------------------------- GL_EXT_vertex_array -------------------------- */
+
+#ifndef GL_EXT_vertex_array
+#define GL_EXT_vertex_array 1
+
+#define GL_DOUBLE_EXT 0x140A
+#define GL_VERTEX_ARRAY_EXT 0x8074
+#define GL_NORMAL_ARRAY_EXT 0x8075
+#define GL_COLOR_ARRAY_EXT 0x8076
+#define GL_INDEX_ARRAY_EXT 0x8077
+#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078
+#define GL_EDGE_FLAG_ARRAY_EXT 0x8079
+#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A
+#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B
+#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C
+#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D
+#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E
+#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F
+#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080
+#define GL_COLOR_ARRAY_SIZE_EXT 0x8081
+#define GL_COLOR_ARRAY_TYPE_EXT 0x8082
+#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083
+#define GL_COLOR_ARRAY_COUNT_EXT 0x8084
+#define GL_INDEX_ARRAY_TYPE_EXT 0x8085
+#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086
+#define GL_INDEX_ARRAY_COUNT_EXT 0x8087
+#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088
+#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089
+#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
+#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B
+#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C
+#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D
+#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E
+#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F
+#define GL_COLOR_ARRAY_POINTER_EXT 0x8090
+#define GL_INDEX_ARRAY_POINTER_EXT 0x8091
+#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
+#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093
+
+typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i);
+typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer);
+typedef void (GLAPIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, void** params);
+typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer);
+
+#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT)
+#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT)
+#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT)
+#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT)
+#define glGetPointervEXT GLEW_GET_FUN(__glewGetPointervEXT)
+#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT)
+#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT)
+#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT)
+#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT)
+
+#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array)
+
+#endif /* GL_EXT_vertex_array */
+
+/* -------------------------- GL_EXT_vertex_shader ------------------------- */
+
+#ifndef GL_EXT_vertex_shader
+#define GL_EXT_vertex_shader 1
+
+#define GL_VERTEX_SHADER_EXT 0x8780
+#define GL_VERTEX_SHADER_BINDING_EXT 0x8781
+#define GL_OP_INDEX_EXT 0x8782
+#define GL_OP_NEGATE_EXT 0x8783
+#define GL_OP_DOT3_EXT 0x8784
+#define GL_OP_DOT4_EXT 0x8785
+#define GL_OP_MUL_EXT 0x8786
+#define GL_OP_ADD_EXT 0x8787
+#define GL_OP_MADD_EXT 0x8788
+#define GL_OP_FRAC_EXT 0x8789
+#define GL_OP_MAX_EXT 0x878A
+#define GL_OP_MIN_EXT 0x878B
+#define GL_OP_SET_GE_EXT 0x878C
+#define GL_OP_SET_LT_EXT 0x878D
+#define GL_OP_CLAMP_EXT 0x878E
+#define GL_OP_FLOOR_EXT 0x878F
+#define GL_OP_ROUND_EXT 0x8790
+#define GL_OP_EXP_BASE_2_EXT 0x8791
+#define GL_OP_LOG_BASE_2_EXT 0x8792
+#define GL_OP_POWER_EXT 0x8793
+#define GL_OP_RECIP_EXT 0x8794
+#define GL_OP_RECIP_SQRT_EXT 0x8795
+#define GL_OP_SUB_EXT 0x8796
+#define GL_OP_CROSS_PRODUCT_EXT 0x8797
+#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798
+#define GL_OP_MOV_EXT 0x8799
+#define GL_OUTPUT_VERTEX_EXT 0x879A
+#define GL_OUTPUT_COLOR0_EXT 0x879B
+#define GL_OUTPUT_COLOR1_EXT 0x879C
+#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D
+#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E
+#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F
+#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0
+#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1
+#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2
+#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3
+#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4
+#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5
+#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6
+#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7
+#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8
+#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9
+#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA
+#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB
+#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC
+#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD
+#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE
+#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF
+#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0
+#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1
+#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2
+#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3
+#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4
+#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5
+#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6
+#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7
+#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8
+#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9
+#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA
+#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB
+#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC
+#define GL_OUTPUT_FOG_EXT 0x87BD
+#define GL_SCALAR_EXT 0x87BE
+#define GL_VECTOR_EXT 0x87BF
+#define GL_MATRIX_EXT 0x87C0
+#define GL_VARIANT_EXT 0x87C1
+#define GL_INVARIANT_EXT 0x87C2
+#define GL_LOCAL_CONSTANT_EXT 0x87C3
+#define GL_LOCAL_EXT 0x87C4
+#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5
+#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6
+#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7
+#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8
+#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE
+#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF
+#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0
+#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1
+#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2
+#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3
+#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4
+#define GL_X_EXT 0x87D5
+#define GL_Y_EXT 0x87D6
+#define GL_Z_EXT 0x87D7
+#define GL_W_EXT 0x87D8
+#define GL_NEGATIVE_X_EXT 0x87D9
+#define GL_NEGATIVE_Y_EXT 0x87DA
+#define GL_NEGATIVE_Z_EXT 0x87DB
+#define GL_NEGATIVE_W_EXT 0x87DC
+#define GL_ZERO_EXT 0x87DD
+#define GL_ONE_EXT 0x87DE
+#define GL_NEGATIVE_ONE_EXT 0x87DF
+#define GL_NORMALIZED_RANGE_EXT 0x87E0
+#define GL_FULL_RANGE_EXT 0x87E1
+#define GL_CURRENT_VERTEX_EXT 0x87E2
+#define GL_MVP_MATRIX_EXT 0x87E3
+#define GL_VARIANT_VALUE_EXT 0x87E4
+#define GL_VARIANT_DATATYPE_EXT 0x87E5
+#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6
+#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7
+#define GL_VARIANT_ARRAY_EXT 0x87E8
+#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9
+#define GL_INVARIANT_VALUE_EXT 0x87EA
+#define GL_INVARIANT_DATATYPE_EXT 0x87EB
+#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC
+#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED
+
+typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void);
+typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value);
+typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value);
+typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value);
+typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value);
+typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value);
+typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void);
+typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);
+typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components);
+typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range);
+typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
+typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
+typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
+typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
+typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
+typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
+typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
+typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
+typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
+typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid **data);
+typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);
+typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap);
+typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr);
+typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr);
+typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1);
+typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2);
+typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3);
+typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);
+typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, GLvoid *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr);
+typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);
+
+#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT)
+#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT)
+#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT)
+#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT)
+#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT)
+#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT)
+#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT)
+#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT)
+#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT)
+#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT)
+#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT)
+#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT)
+#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT)
+#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT)
+#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT)
+#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT)
+#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT)
+#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT)
+#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT)
+#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT)
+#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT)
+#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT)
+#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT)
+#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT)
+#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT)
+#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT)
+#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT)
+#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT)
+#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT)
+#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT)
+#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT)
+#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT)
+#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT)
+#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT)
+#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT)
+#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT)
+#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT)
+#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT)
+#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT)
+#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT)
+#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT)
+#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT)
+
+#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader)
+
+#endif /* GL_EXT_vertex_shader */
+
+/* ------------------------ GL_EXT_vertex_weighting ------------------------ */
+
+#ifndef GL_EXT_vertex_weighting
+#define GL_EXT_vertex_weighting 1
+
+#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3
+#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6
+#define GL_MODELVIEW0_EXT 0x1700
+#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502
+#define GL_MODELVIEW1_MATRIX_EXT 0x8506
+#define GL_VERTEX_WEIGHTING_EXT 0x8509
+#define GL_MODELVIEW1_EXT 0x850A
+#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B
+#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C
+#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D
+#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E
+#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F
+#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510
+
+typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void* pointer);
+typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight);
+typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight);
+
+#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT)
+#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT)
+#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT)
+
+#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting)
+
+#endif /* GL_EXT_vertex_weighting */
+
+/* --------------------- GL_HP_convolution_border_modes -------------------- */
+
+#ifndef GL_HP_convolution_border_modes
+#define GL_HP_convolution_border_modes 1
+
+#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes)
+
+#endif /* GL_HP_convolution_border_modes */
+
+/* ------------------------- GL_HP_image_transform ------------------------- */
+
+#ifndef GL_HP_image_transform
+#define GL_HP_image_transform 1
+
+typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param);
+typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param);
+typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params);
+
+#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP)
+#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP)
+#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP)
+#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP)
+#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP)
+#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP)
+
+#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform)
+
+#endif /* GL_HP_image_transform */
+
+/* -------------------------- GL_HP_occlusion_test ------------------------- */
+
+#ifndef GL_HP_occlusion_test
+#define GL_HP_occlusion_test 1
+
+#define GL_OCCLUSION_TEST_HP 0x8165
+#define GL_OCCLUSION_TEST_RESULT_HP 0x8166
+
+#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test)
+
+#endif /* GL_HP_occlusion_test */
+
+/* ------------------------- GL_HP_texture_lighting ------------------------ */
+
+#ifndef GL_HP_texture_lighting
+#define GL_HP_texture_lighting 1
+
+#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting)
+
+#endif /* GL_HP_texture_lighting */
+
+/* --------------------------- GL_IBM_cull_vertex -------------------------- */
+
+#ifndef GL_IBM_cull_vertex
+#define GL_IBM_cull_vertex 1
+
+#define GL_CULL_VERTEX_IBM 103050
+
+#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex)
+
+#endif /* GL_IBM_cull_vertex */
+
+/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */
+
+#ifndef GL_IBM_multimode_draw_arrays
+#define GL_IBM_multimode_draw_arrays 1
+
+typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride);
+typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei primcount, GLint modestride);
+
+#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM)
+#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM)
+
+#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays)
+
+#endif /* GL_IBM_multimode_draw_arrays */
+
+/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */
+
+#ifndef GL_IBM_rasterpos_clip
+#define GL_IBM_rasterpos_clip 1
+
+#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010
+
+#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip)
+
+#endif /* GL_IBM_rasterpos_clip */
+
+/* --------------------------- GL_IBM_static_data -------------------------- */
+
+#ifndef GL_IBM_static_data
+#define GL_IBM_static_data 1
+
+#define GL_ALL_STATIC_DATA_IBM 103060
+#define GL_STATIC_VERTEX_ARRAY_IBM 103061
+
+#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data)
+
+#endif /* GL_IBM_static_data */
+
+/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */
+
+#ifndef GL_IBM_texture_mirrored_repeat
+#define GL_IBM_texture_mirrored_repeat 1
+
+#define GL_MIRRORED_REPEAT_IBM 0x8370
+
+#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat)
+
+#endif /* GL_IBM_texture_mirrored_repeat */
+
+/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */
+
+#ifndef GL_IBM_vertex_array_lists
+#define GL_IBM_vertex_array_lists 1
+
+#define GL_VERTEX_ARRAY_LIST_IBM 103070
+#define GL_NORMAL_ARRAY_LIST_IBM 103071
+#define GL_COLOR_ARRAY_LIST_IBM 103072
+#define GL_INDEX_ARRAY_LIST_IBM 103073
+#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074
+#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075
+#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076
+#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077
+#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080
+#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081
+#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082
+#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083
+#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084
+#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085
+#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086
+#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087
+
+typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+
+#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM)
+#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM)
+#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM)
+#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM)
+#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM)
+#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM)
+#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM)
+#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM)
+
+#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists)
+
+#endif /* GL_IBM_vertex_array_lists */
+
+/* -------------------------- GL_INGR_color_clamp -------------------------- */
+
+#ifndef GL_INGR_color_clamp
+#define GL_INGR_color_clamp 1
+
+#define GL_RED_MIN_CLAMP_INGR 0x8560
+#define GL_GREEN_MIN_CLAMP_INGR 0x8561
+#define GL_BLUE_MIN_CLAMP_INGR 0x8562
+#define GL_ALPHA_MIN_CLAMP_INGR 0x8563
+#define GL_RED_MAX_CLAMP_INGR 0x8564
+#define GL_GREEN_MAX_CLAMP_INGR 0x8565
+#define GL_BLUE_MAX_CLAMP_INGR 0x8566
+#define GL_ALPHA_MAX_CLAMP_INGR 0x8567
+
+#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp)
+
+#endif /* GL_INGR_color_clamp */
+
+/* ------------------------- GL_INGR_interlace_read ------------------------ */
+
+#ifndef GL_INGR_interlace_read
+#define GL_INGR_interlace_read 1
+
+#define GL_INTERLACE_READ_INGR 0x8568
+
+#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read)
+
+#endif /* GL_INGR_interlace_read */
+
+/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */
+
+#ifndef GL_INTEL_parallel_arrays
+#define GL_INTEL_parallel_arrays 1
+
+#define GL_PARALLEL_ARRAYS_INTEL 0x83F4
+#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5
+#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6
+#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7
+#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8
+
+typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer);
+typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer);
+typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer);
+
+#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL)
+#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL)
+#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL)
+#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL)
+
+#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays)
+
+#endif /* GL_INTEL_parallel_arrays */
+
+/* ------------------------ GL_INTEL_texture_scissor ----------------------- */
+
+#ifndef GL_INTEL_texture_scissor
+#define GL_INTEL_texture_scissor 1
+
+typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc);
+typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh);
+
+#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL)
+#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL)
+
+#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor)
+
+#endif /* GL_INTEL_texture_scissor */
+
+/* -------------------------- GL_KTX_buffer_region ------------------------- */
+
+#ifndef GL_KTX_buffer_region
+#define GL_KTX_buffer_region 1
+
+#define GL_KTX_FRONT_REGION 0x0
+#define GL_KTX_BACK_REGION 0x1
+#define GL_KTX_Z_REGION 0x2
+#define GL_KTX_STENCIL_REGION 0x3
+
+typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDEXTPROC) (void);
+typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONEXTPROC) (GLenum region);
+typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest);
+typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONEXTPROC) (GLenum region);
+typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height);
+
+#define glBufferRegionEnabledEXT GLEW_GET_FUN(__glewBufferRegionEnabledEXT)
+#define glDeleteBufferRegionEXT GLEW_GET_FUN(__glewDeleteBufferRegionEXT)
+#define glDrawBufferRegionEXT GLEW_GET_FUN(__glewDrawBufferRegionEXT)
+#define glNewBufferRegionEXT GLEW_GET_FUN(__glewNewBufferRegionEXT)
+#define glReadBufferRegionEXT GLEW_GET_FUN(__glewReadBufferRegionEXT)
+
+#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region)
+
+#endif /* GL_KTX_buffer_region */
+
+/* -------------------------- GL_MESA_pack_invert -------------------------- */
+
+#ifndef GL_MESA_pack_invert
+#define GL_MESA_pack_invert 1
+
+#define GL_PACK_INVERT_MESA 0x8758
+
+#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert)
+
+#endif /* GL_MESA_pack_invert */
+
+/* ------------------------- GL_MESA_resize_buffers ------------------------ */
+
+#ifndef GL_MESA_resize_buffers
+#define GL_MESA_resize_buffers 1
+
+typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void);
+
+#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA)
+
+#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers)
+
+#endif /* GL_MESA_resize_buffers */
+
+/* --------------------------- GL_MESA_window_pos -------------------------- */
+
+#ifndef GL_MESA_window_pos
+#define GL_MESA_window_pos 1
+
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p);
+
+#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA)
+#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA)
+#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA)
+#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA)
+#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA)
+#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA)
+#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA)
+#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA)
+#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA)
+#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA)
+#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA)
+#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA)
+#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA)
+#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA)
+#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA)
+#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA)
+#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA)
+#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA)
+#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA)
+#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA)
+#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA)
+#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA)
+#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA)
+#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA)
+
+#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos)
+
+#endif /* GL_MESA_window_pos */
+
+/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */
+
+#ifndef GL_MESA_ycbcr_texture
+#define GL_MESA_ycbcr_texture 1
+
+#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA
+#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB
+#define GL_YCBCR_MESA 0x8757
+
+#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture)
+
+#endif /* GL_MESA_ycbcr_texture */
+
+/* --------------------------- GL_NV_blend_square -------------------------- */
+
+#ifndef GL_NV_blend_square
+#define GL_NV_blend_square 1
+
+#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square)
+
+#endif /* GL_NV_blend_square */
+
+/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */
+
+#ifndef GL_NV_copy_depth_to_color
+#define GL_NV_copy_depth_to_color 1
+
+#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E
+#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F
+
+#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color)
+
+#endif /* GL_NV_copy_depth_to_color */
+
+/* --------------------------- GL_NV_depth_clamp --------------------------- */
+
+#ifndef GL_NV_depth_clamp
+#define GL_NV_depth_clamp 1
+
+#define GL_DEPTH_CLAMP_NV 0x864F
+
+#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp)
+
+#endif /* GL_NV_depth_clamp */
+
+/* ---------------------------- GL_NV_evaluators --------------------------- */
+
+#ifndef GL_NV_evaluators
+#define GL_NV_evaluators 1
+
+#define GL_EVAL_2D_NV 0x86C0
+#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1
+#define GL_MAP_TESSELLATION_NV 0x86C2
+#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3
+#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4
+#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5
+#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6
+#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7
+#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8
+#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9
+#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA
+#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB
+#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC
+#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD
+#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE
+#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF
+#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0
+#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1
+#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2
+#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3
+#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4
+#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5
+#define GL_MAX_MAP_TESSELLATION_NV 0x86D6
+#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7
+
+typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points);
+typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points);
+typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params);
+
+#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV)
+#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV)
+#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV)
+#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV)
+#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV)
+#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV)
+#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV)
+#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV)
+#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV)
+
+#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators)
+
+#endif /* GL_NV_evaluators */
+
+/* ------------------------------ GL_NV_fence ------------------------------ */
+
+#ifndef GL_NV_fence
+#define GL_NV_fence 1
+
+#define GL_ALL_COMPLETED_NV 0x84F2
+#define GL_FENCE_STATUS_NV 0x84F3
+#define GL_FENCE_CONDITION_NV 0x84F4
+
+typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences);
+typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence);
+typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences);
+typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence);
+typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);
+typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence);
+
+#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV)
+#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV)
+#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV)
+#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV)
+#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV)
+#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV)
+#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV)
+
+#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence)
+
+#endif /* GL_NV_fence */
+
+/* --------------------------- GL_NV_float_buffer -------------------------- */
+
+#ifndef GL_NV_float_buffer
+#define GL_NV_float_buffer 1
+
+#define GL_FLOAT_R_NV 0x8880
+#define GL_FLOAT_RG_NV 0x8881
+#define GL_FLOAT_RGB_NV 0x8882
+#define GL_FLOAT_RGBA_NV 0x8883
+#define GL_FLOAT_R16_NV 0x8884
+#define GL_FLOAT_R32_NV 0x8885
+#define GL_FLOAT_RG16_NV 0x8886
+#define GL_FLOAT_RG32_NV 0x8887
+#define GL_FLOAT_RGB16_NV 0x8888
+#define GL_FLOAT_RGB32_NV 0x8889
+#define GL_FLOAT_RGBA16_NV 0x888A
+#define GL_FLOAT_RGBA32_NV 0x888B
+#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C
+#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D
+#define GL_FLOAT_RGBA_MODE_NV 0x888E
+
+#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer)
+
+#endif /* GL_NV_float_buffer */
+
+/* --------------------------- GL_NV_fog_distance -------------------------- */
+
+#ifndef GL_NV_fog_distance
+#define GL_NV_fog_distance 1
+
+#define GL_FOG_DISTANCE_MODE_NV 0x855A
+#define GL_EYE_RADIAL_NV 0x855B
+#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C
+
+#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance)
+
+#endif /* GL_NV_fog_distance */
+
+/* ------------------------- GL_NV_fragment_program ------------------------ */
+
+#ifndef GL_NV_fragment_program
+#define GL_NV_fragment_program 1
+
+#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868
+#define GL_FRAGMENT_PROGRAM_NV 0x8870
+#define GL_MAX_TEXTURE_COORDS_NV 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872
+#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873
+#define GL_PROGRAM_ERROR_STRING_NV 0x8874
+
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]);
+typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]);
+
+#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV)
+#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV)
+#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV)
+#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV)
+#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV)
+#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV)
+
+#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program)
+
+#endif /* GL_NV_fragment_program */
+
+/* ------------------------ GL_NV_fragment_program2 ------------------------ */
+
+#ifndef GL_NV_fragment_program2
+#define GL_NV_fragment_program2 1
+
+#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4
+#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5
+#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6
+#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7
+#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8
+
+#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2)
+
+#endif /* GL_NV_fragment_program2 */
+
+/* --------------------- GL_NV_fragment_program_option --------------------- */
+
+#ifndef GL_NV_fragment_program_option
+#define GL_NV_fragment_program_option 1
+
+#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option)
+
+#endif /* GL_NV_fragment_program_option */
+
+/* ---------------------------- GL_NV_half_float --------------------------- */
+
+#ifndef GL_NV_half_float
+#define GL_NV_half_float 1
+
+#define GL_HALF_FLOAT_NV 0x140B
+
+typedef unsigned short GLhalf;
+
+typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLuint red, GLuint green, GLuint blue);
+typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha);
+typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLuint fog);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLuint* fog);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLuint s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLuint s, GLuint t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLuint s, GLuint t, GLuint r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLuint s, GLuint t, GLuint r, GLuint q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLuint nx, GLuint ny, GLuint nz);
+typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLuint red, GLuint green, GLuint blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLuint s);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLuint s, GLuint t);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLuint s, GLuint t, GLuint r);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLuint s, GLuint t, GLuint r, GLuint q);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLuint x, GLuint y);
+typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLuint x, GLuint y, GLuint z);
+typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLuint x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLuint x, GLuint y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLuint x, GLuint y, GLuint z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLuint weight);
+typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLuint* weight);
+
+#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV)
+#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV)
+#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV)
+#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV)
+#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV)
+#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV)
+#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV)
+#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV)
+#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV)
+#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV)
+#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV)
+#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV)
+#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV)
+#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV)
+#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV)
+#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV)
+#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV)
+#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV)
+#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV)
+#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV)
+#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV)
+#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV)
+#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV)
+#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV)
+#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV)
+#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV)
+#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV)
+#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV)
+#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV)
+#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV)
+#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV)
+#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV)
+#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV)
+#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV)
+#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV)
+#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV)
+#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV)
+#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV)
+#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV)
+#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV)
+#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV)
+#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV)
+#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV)
+#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV)
+#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV)
+#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV)
+
+#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float)
+
+#endif /* GL_NV_half_float */
+
+/* ------------------------ GL_NV_light_max_exponent ----------------------- */
+
+#ifndef GL_NV_light_max_exponent
+#define GL_NV_light_max_exponent 1
+
+#define GL_MAX_SHININESS_NV 0x8504
+#define GL_MAX_SPOT_EXPONENT_NV 0x8505
+
+#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent)
+
+#endif /* GL_NV_light_max_exponent */
+
+/* --------------------- GL_NV_multisample_filter_hint --------------------- */
+
+#ifndef GL_NV_multisample_filter_hint
+#define GL_NV_multisample_filter_hint 1
+
+#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534
+
+#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint)
+
+#endif /* GL_NV_multisample_filter_hint */
+
+/* ------------------------- GL_NV_occlusion_query ------------------------- */
+
+#ifndef GL_NV_occlusion_query
+#define GL_NV_occlusion_query 1
+
+#define GL_PIXEL_COUNTER_BITS_NV 0x8864
+#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865
+#define GL_PIXEL_COUNT_NV 0x8866
+#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867
+
+typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void);
+typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id);
+
+#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV)
+#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV)
+#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV)
+#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV)
+#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV)
+#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV)
+#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV)
+
+#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query)
+
+#endif /* GL_NV_occlusion_query */
+
+/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */
+
+#ifndef GL_NV_packed_depth_stencil
+#define GL_NV_packed_depth_stencil 1
+
+#define GL_DEPTH_STENCIL_NV 0x84F9
+#define GL_UNSIGNED_INT_24_8_NV 0x84FA
+
+#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil)
+
+#endif /* GL_NV_packed_depth_stencil */
+
+/* ------------------------- GL_NV_pixel_data_range ------------------------ */
+
+#ifndef GL_NV_pixel_data_range
+#define GL_NV_pixel_data_range 1
+
+#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878
+#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879
+#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A
+#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B
+#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C
+#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D
+
+typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void* pointer);
+
+#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV)
+#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV)
+
+#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range)
+
+#endif /* GL_NV_pixel_data_range */
+
+/* --------------------------- GL_NV_point_sprite -------------------------- */
+
+#ifndef GL_NV_point_sprite
+#define GL_NV_point_sprite 1
+
+#define GL_POINT_SPRITE_NV 0x8861
+#define GL_COORD_REPLACE_NV 0x8862
+#define GL_POINT_SPRITE_R_MODE_NV 0x8863
+
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params);
+
+#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV)
+#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV)
+
+#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite)
+
+#endif /* GL_NV_point_sprite */
+
+/* ------------------------ GL_NV_primitive_restart ------------------------ */
+
+#ifndef GL_NV_primitive_restart
+#define GL_NV_primitive_restart 1
+
+#define GL_PRIMITIVE_RESTART_NV 0x8558
+#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559
+
+typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index);
+typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void);
+
+#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV)
+#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV)
+
+#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart)
+
+#endif /* GL_NV_primitive_restart */
+
+/* ------------------------ GL_NV_register_combiners ----------------------- */
+
+#ifndef GL_NV_register_combiners
+#define GL_NV_register_combiners 1
+
+#define GL_REGISTER_COMBINERS_NV 0x8522
+#define GL_VARIABLE_A_NV 0x8523
+#define GL_VARIABLE_B_NV 0x8524
+#define GL_VARIABLE_C_NV 0x8525
+#define GL_VARIABLE_D_NV 0x8526
+#define GL_VARIABLE_E_NV 0x8527
+#define GL_VARIABLE_F_NV 0x8528
+#define GL_VARIABLE_G_NV 0x8529
+#define GL_CONSTANT_COLOR0_NV 0x852A
+#define GL_CONSTANT_COLOR1_NV 0x852B
+#define GL_PRIMARY_COLOR_NV 0x852C
+#define GL_SECONDARY_COLOR_NV 0x852D
+#define GL_SPARE0_NV 0x852E
+#define GL_SPARE1_NV 0x852F
+#define GL_DISCARD_NV 0x8530
+#define GL_E_TIMES_F_NV 0x8531
+#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532
+#define GL_UNSIGNED_IDENTITY_NV 0x8536
+#define GL_UNSIGNED_INVERT_NV 0x8537
+#define GL_EXPAND_NORMAL_NV 0x8538
+#define GL_EXPAND_NEGATE_NV 0x8539
+#define GL_HALF_BIAS_NORMAL_NV 0x853A
+#define GL_HALF_BIAS_NEGATE_NV 0x853B
+#define GL_SIGNED_IDENTITY_NV 0x853C
+#define GL_SIGNED_NEGATE_NV 0x853D
+#define GL_SCALE_BY_TWO_NV 0x853E
+#define GL_SCALE_BY_FOUR_NV 0x853F
+#define GL_SCALE_BY_ONE_HALF_NV 0x8540
+#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541
+#define GL_COMBINER_INPUT_NV 0x8542
+#define GL_COMBINER_MAPPING_NV 0x8543
+#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544
+#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545
+#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546
+#define GL_COMBINER_MUX_SUM_NV 0x8547
+#define GL_COMBINER_SCALE_NV 0x8548
+#define GL_COMBINER_BIAS_NV 0x8549
+#define GL_COMBINER_AB_OUTPUT_NV 0x854A
+#define GL_COMBINER_CD_OUTPUT_NV 0x854B
+#define GL_COMBINER_SUM_OUTPUT_NV 0x854C
+#define GL_MAX_GENERAL_COMBINERS_NV 0x854D
+#define GL_NUM_GENERAL_COMBINERS_NV 0x854E
+#define GL_COLOR_SUM_CLAMP_NV 0x854F
+#define GL_COMBINER0_NV 0x8550
+#define GL_COMBINER1_NV 0x8551
+#define GL_COMBINER2_NV 0x8552
+#define GL_COMBINER3_NV 0x8553
+#define GL_COMBINER4_NV 0x8554
+#define GL_COMBINER5_NV 0x8555
+#define GL_COMBINER6_NV 0x8556
+#define GL_COMBINER7_NV 0x8557
+
+typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
+typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
+typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
+typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params);
+
+#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV)
+#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV)
+#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV)
+#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV)
+#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV)
+#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV)
+#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV)
+#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV)
+#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV)
+#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV)
+#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV)
+#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV)
+#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV)
+
+#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners)
+
+#endif /* GL_NV_register_combiners */
+
+/* ----------------------- GL_NV_register_combiners2 ----------------------- */
+
+#ifndef GL_NV_register_combiners2
+#define GL_NV_register_combiners2 1
+
+#define GL_PER_STAGE_CONSTANTS_NV 0x8535
+
+typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params);
+
+#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV)
+#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV)
+
+#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2)
+
+#endif /* GL_NV_register_combiners2 */
+
+/* -------------------------- GL_NV_texgen_emboss -------------------------- */
+
+#ifndef GL_NV_texgen_emboss
+#define GL_NV_texgen_emboss 1
+
+#define GL_EMBOSS_LIGHT_NV 0x855D
+#define GL_EMBOSS_CONSTANT_NV 0x855E
+#define GL_EMBOSS_MAP_NV 0x855F
+
+#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss)
+
+#endif /* GL_NV_texgen_emboss */
+
+/* ------------------------ GL_NV_texgen_reflection ------------------------ */
+
+#ifndef GL_NV_texgen_reflection
+#define GL_NV_texgen_reflection 1
+
+#define GL_NORMAL_MAP_NV 0x8511
+#define GL_REFLECTION_MAP_NV 0x8512
+
+#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection)
+
+#endif /* GL_NV_texgen_reflection */
+
+/* --------------------- GL_NV_texture_compression_vtc --------------------- */
+
+#ifndef GL_NV_texture_compression_vtc
+#define GL_NV_texture_compression_vtc 1
+
+#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc)
+
+#endif /* GL_NV_texture_compression_vtc */
+
+/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */
+
+#ifndef GL_NV_texture_env_combine4
+#define GL_NV_texture_env_combine4 1
+
+#define GL_COMBINE4_NV 0x8503
+#define GL_SOURCE3_RGB_NV 0x8583
+#define GL_SOURCE3_ALPHA_NV 0x858B
+#define GL_OPERAND3_RGB_NV 0x8593
+#define GL_OPERAND3_ALPHA_NV 0x859B
+
+#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4)
+
+#endif /* GL_NV_texture_env_combine4 */
+
+/* ---------------------- GL_NV_texture_expand_normal ---------------------- */
+
+#ifndef GL_NV_texture_expand_normal
+#define GL_NV_texture_expand_normal 1
+
+#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F
+
+#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal)
+
+#endif /* GL_NV_texture_expand_normal */
+
+/* ------------------------ GL_NV_texture_rectangle ------------------------ */
+
+#ifndef GL_NV_texture_rectangle
+#define GL_NV_texture_rectangle 1
+
+#define GL_TEXTURE_RECTANGLE_NV 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8
+
+#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle)
+
+#endif /* GL_NV_texture_rectangle */
+
+/* -------------------------- GL_NV_texture_shader ------------------------- */
+
+#ifndef GL_NV_texture_shader
+#define GL_NV_texture_shader 1
+
+#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C
+#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D
+#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E
+#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9
+#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA
+#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB
+#define GL_DSDT_MAG_INTENSITY_NV 0x86DC
+#define GL_SHADER_CONSISTENT_NV 0x86DD
+#define GL_TEXTURE_SHADER_NV 0x86DE
+#define GL_SHADER_OPERATION_NV 0x86DF
+#define GL_CULL_MODES_NV 0x86E0
+#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1
+#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2
+#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3
+#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4
+#define GL_CONST_EYE_NV 0x86E5
+#define GL_PASS_THROUGH_NV 0x86E6
+#define GL_CULL_FRAGMENT_NV 0x86E7
+#define GL_OFFSET_TEXTURE_2D_NV 0x86E8
+#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9
+#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA
+#define GL_DOT_PRODUCT_NV 0x86EC
+#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED
+#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE
+#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0
+#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1
+#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2
+#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3
+#define GL_HILO_NV 0x86F4
+#define GL_DSDT_NV 0x86F5
+#define GL_DSDT_MAG_NV 0x86F6
+#define GL_DSDT_MAG_VIB_NV 0x86F7
+#define GL_HILO16_NV 0x86F8
+#define GL_SIGNED_HILO_NV 0x86F9
+#define GL_SIGNED_HILO16_NV 0x86FA
+#define GL_SIGNED_RGBA_NV 0x86FB
+#define GL_SIGNED_RGBA8_NV 0x86FC
+#define GL_SIGNED_RGB_NV 0x86FE
+#define GL_SIGNED_RGB8_NV 0x86FF
+#define GL_SIGNED_LUMINANCE_NV 0x8701
+#define GL_SIGNED_LUMINANCE8_NV 0x8702
+#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703
+#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704
+#define GL_SIGNED_ALPHA_NV 0x8705
+#define GL_SIGNED_ALPHA8_NV 0x8706
+#define GL_SIGNED_INTENSITY_NV 0x8707
+#define GL_SIGNED_INTENSITY8_NV 0x8708
+#define GL_DSDT8_NV 0x8709
+#define GL_DSDT8_MAG8_NV 0x870A
+#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B
+#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C
+#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D
+#define GL_HI_SCALE_NV 0x870E
+#define GL_LO_SCALE_NV 0x870F
+#define GL_DS_SCALE_NV 0x8710
+#define GL_DT_SCALE_NV 0x8711
+#define GL_MAGNITUDE_SCALE_NV 0x8712
+#define GL_VIBRANCE_SCALE_NV 0x8713
+#define GL_HI_BIAS_NV 0x8714
+#define GL_LO_BIAS_NV 0x8715
+#define GL_DS_BIAS_NV 0x8716
+#define GL_DT_BIAS_NV 0x8717
+#define GL_MAGNITUDE_BIAS_NV 0x8718
+#define GL_VIBRANCE_BIAS_NV 0x8719
+#define GL_TEXTURE_BORDER_VALUES_NV 0x871A
+#define GL_TEXTURE_HI_SIZE_NV 0x871B
+#define GL_TEXTURE_LO_SIZE_NV 0x871C
+#define GL_TEXTURE_DS_SIZE_NV 0x871D
+#define GL_TEXTURE_DT_SIZE_NV 0x871E
+#define GL_TEXTURE_MAG_SIZE_NV 0x871F
+
+#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader)
+
+#endif /* GL_NV_texture_shader */
+
+/* ------------------------- GL_NV_texture_shader2 ------------------------- */
+
+#ifndef GL_NV_texture_shader2
+#define GL_NV_texture_shader2 1
+
+#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA
+#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB
+#define GL_DSDT_MAG_INTENSITY_NV 0x86DC
+#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF
+#define GL_HILO_NV 0x86F4
+#define GL_DSDT_NV 0x86F5
+#define GL_DSDT_MAG_NV 0x86F6
+#define GL_DSDT_MAG_VIB_NV 0x86F7
+#define GL_HILO16_NV 0x86F8
+#define GL_SIGNED_HILO_NV 0x86F9
+#define GL_SIGNED_HILO16_NV 0x86FA
+#define GL_SIGNED_RGBA_NV 0x86FB
+#define GL_SIGNED_RGBA8_NV 0x86FC
+#define GL_SIGNED_RGB_NV 0x86FE
+#define GL_SIGNED_RGB8_NV 0x86FF
+#define GL_SIGNED_LUMINANCE_NV 0x8701
+#define GL_SIGNED_LUMINANCE8_NV 0x8702
+#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703
+#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704
+#define GL_SIGNED_ALPHA_NV 0x8705
+#define GL_SIGNED_ALPHA8_NV 0x8706
+#define GL_SIGNED_INTENSITY_NV 0x8707
+#define GL_SIGNED_INTENSITY8_NV 0x8708
+#define GL_DSDT8_NV 0x8709
+#define GL_DSDT8_MAG8_NV 0x870A
+#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B
+#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C
+#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D
+
+#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2)
+
+#endif /* GL_NV_texture_shader2 */
+
+/* ------------------------- GL_NV_texture_shader3 ------------------------- */
+
+#ifndef GL_NV_texture_shader3
+#define GL_NV_texture_shader3 1
+
+#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850
+#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851
+#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852
+#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853
+#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854
+#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855
+#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856
+#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857
+#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858
+#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859
+#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A
+#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B
+#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C
+#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D
+#define GL_HILO8_NV 0x885E
+#define GL_SIGNED_HILO8_NV 0x885F
+#define GL_FORCE_BLUE_TO_ONE_NV 0x8860
+
+#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3)
+
+#endif /* GL_NV_texture_shader3 */
+
+/* ------------------------ GL_NV_vertex_array_range ----------------------- */
+
+#ifndef GL_NV_vertex_array_range
+#define GL_NV_vertex_array_range 1
+
+#define GL_VERTEX_ARRAY_RANGE_NV 0x851D
+#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E
+#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F
+#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520
+#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521
+
+typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void* pointer);
+
+#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV)
+#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV)
+
+#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range)
+
+#endif /* GL_NV_vertex_array_range */
+
+/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */
+
+#ifndef GL_NV_vertex_array_range2
+#define GL_NV_vertex_array_range2 1
+
+#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533
+
+#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2)
+
+#endif /* GL_NV_vertex_array_range2 */
+
+/* -------------------------- GL_NV_vertex_program ------------------------- */
+
+#ifndef GL_NV_vertex_program
+#define GL_NV_vertex_program 1
+
+#define GL_VERTEX_PROGRAM_NV 0x8620
+#define GL_VERTEX_STATE_PROGRAM_NV 0x8621
+#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623
+#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624
+#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625
+#define GL_CURRENT_ATTRIB_NV 0x8626
+#define GL_PROGRAM_LENGTH_NV 0x8627
+#define GL_PROGRAM_STRING_NV 0x8628
+#define GL_MODELVIEW_PROJECTION_NV 0x8629
+#define GL_IDENTITY_NV 0x862A
+#define GL_INVERSE_NV 0x862B
+#define GL_TRANSPOSE_NV 0x862C
+#define GL_INVERSE_TRANSPOSE_NV 0x862D
+#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E
+#define GL_MAX_TRACK_MATRICES_NV 0x862F
+#define GL_MATRIX0_NV 0x8630
+#define GL_MATRIX1_NV 0x8631
+#define GL_MATRIX2_NV 0x8632
+#define GL_MATRIX3_NV 0x8633
+#define GL_MATRIX4_NV 0x8634
+#define GL_MATRIX5_NV 0x8635
+#define GL_MATRIX6_NV 0x8636
+#define GL_MATRIX7_NV 0x8637
+#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640
+#define GL_CURRENT_MATRIX_NV 0x8641
+#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643
+#define GL_PROGRAM_PARAMETER_NV 0x8644
+#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645
+#define GL_PROGRAM_TARGET_NV 0x8646
+#define GL_PROGRAM_RESIDENT_NV 0x8647
+#define GL_TRACK_MATRIX_NV 0x8648
+#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649
+#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A
+#define GL_PROGRAM_ERROR_POSITION_NV 0x864B
+#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650
+#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651
+#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652
+#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653
+#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654
+#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655
+#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656
+#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657
+#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658
+#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659
+#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A
+#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B
+#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C
+#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D
+#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E
+#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F
+#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660
+#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661
+#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662
+#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663
+#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664
+#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665
+#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666
+#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667
+#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668
+#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669
+#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A
+#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B
+#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C
+#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D
+#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E
+#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F
+#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670
+#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671
+#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672
+#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673
+#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674
+#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675
+#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676
+#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677
+#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678
+#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679
+#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A
+#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B
+#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C
+#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D
+#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E
+#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F
+
+typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences);
+typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id);
+typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid** pointer);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint num, const GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint num, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v);
+
+#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV)
+#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV)
+#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV)
+#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV)
+#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV)
+#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV)
+#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV)
+#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV)
+#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV)
+#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV)
+#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV)
+#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV)
+#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV)
+#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV)
+#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV)
+#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV)
+#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV)
+#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV)
+#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV)
+#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV)
+#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV)
+#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV)
+#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV)
+#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV)
+#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV)
+#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV)
+#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV)
+#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV)
+#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV)
+#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV)
+#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV)
+#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV)
+#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV)
+#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV)
+#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV)
+#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV)
+#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV)
+#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV)
+#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV)
+#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV)
+#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV)
+#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV)
+#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV)
+#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV)
+#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV)
+#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV)
+#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV)
+#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV)
+#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV)
+#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV)
+#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV)
+#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV)
+#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV)
+#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV)
+#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV)
+#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV)
+#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV)
+#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV)
+#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV)
+#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV)
+#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV)
+#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV)
+#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV)
+#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV)
+
+#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program)
+
+#endif /* GL_NV_vertex_program */
+
+/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */
+
+#ifndef GL_NV_vertex_program1_1
+#define GL_NV_vertex_program1_1 1
+
+#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1)
+
+#endif /* GL_NV_vertex_program1_1 */
+
+/* ------------------------- GL_NV_vertex_program2 ------------------------- */
+
+#ifndef GL_NV_vertex_program2
+#define GL_NV_vertex_program2 1
+
+#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2)
+
+#endif /* GL_NV_vertex_program2 */
+
+/* ---------------------- GL_NV_vertex_program2_option --------------------- */
+
+#ifndef GL_NV_vertex_program2_option
+#define GL_NV_vertex_program2_option 1
+
+#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4
+#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5
+
+#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option)
+
+#endif /* GL_NV_vertex_program2_option */
+
+/* ------------------------- GL_NV_vertex_program3 ------------------------- */
+
+#ifndef GL_NV_vertex_program3
+#define GL_NV_vertex_program3 1
+
+#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
+
+#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3)
+
+#endif /* GL_NV_vertex_program3 */
+
+/* ---------------------------- GL_OML_interlace --------------------------- */
+
+#ifndef GL_OML_interlace
+#define GL_OML_interlace 1
+
+#define GL_INTERLACE_OML 0x8980
+#define GL_INTERLACE_READ_OML 0x8981
+
+#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace)
+
+#endif /* GL_OML_interlace */
+
+/* ---------------------------- GL_OML_resample ---------------------------- */
+
+#ifndef GL_OML_resample
+#define GL_OML_resample 1
+
+#define GL_PACK_RESAMPLE_OML 0x8984
+#define GL_UNPACK_RESAMPLE_OML 0x8985
+#define GL_RESAMPLE_REPLICATE_OML 0x8986
+#define GL_RESAMPLE_ZERO_FILL_OML 0x8987
+#define GL_RESAMPLE_AVERAGE_OML 0x8988
+#define GL_RESAMPLE_DECIMATE_OML 0x8989
+
+#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample)
+
+#endif /* GL_OML_resample */
+
+/* ---------------------------- GL_OML_subsample --------------------------- */
+
+#ifndef GL_OML_subsample
+#define GL_OML_subsample 1
+
+#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982
+#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983
+
+#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample)
+
+#endif /* GL_OML_subsample */
+
+/* --------------------------- GL_PGI_misc_hints --------------------------- */
+
+#ifndef GL_PGI_misc_hints
+#define GL_PGI_misc_hints 1
+
+#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000
+#define GL_CONSERVE_MEMORY_HINT_PGI 107005
+#define GL_RECLAIM_MEMORY_HINT_PGI 107006
+#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010
+#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011
+#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012
+#define GL_ALWAYS_FAST_HINT_PGI 107020
+#define GL_ALWAYS_SOFT_HINT_PGI 107021
+#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022
+#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023
+#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024
+#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025
+#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030
+#define GL_STRICT_LIGHTING_HINT_PGI 107031
+#define GL_STRICT_SCISSOR_HINT_PGI 107032
+#define GL_FULL_STIPPLE_HINT_PGI 107033
+#define GL_CLIP_NEAR_HINT_PGI 107040
+#define GL_CLIP_FAR_HINT_PGI 107041
+#define GL_WIDE_LINE_HINT_PGI 107042
+#define GL_BACK_NORMALS_HINT_PGI 107043
+
+#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints)
+
+#endif /* GL_PGI_misc_hints */
+
+/* -------------------------- GL_PGI_vertex_hints -------------------------- */
+
+#ifndef GL_PGI_vertex_hints
+#define GL_PGI_vertex_hints 1
+
+#define GL_VERTEX23_BIT_PGI 0x00000004
+#define GL_VERTEX4_BIT_PGI 0x00000008
+#define GL_COLOR3_BIT_PGI 0x00010000
+#define GL_COLOR4_BIT_PGI 0x00020000
+#define GL_EDGEFLAG_BIT_PGI 0x00040000
+#define GL_INDEX_BIT_PGI 0x00080000
+#define GL_MAT_AMBIENT_BIT_PGI 0x00100000
+#define GL_VERTEX_DATA_HINT_PGI 107050
+#define GL_VERTEX_CONSISTENT_HINT_PGI 107051
+#define GL_MATERIAL_SIDE_HINT_PGI 107052
+#define GL_MAX_VERTEX_HINT_PGI 107053
+#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000
+#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000
+#define GL_MAT_EMISSION_BIT_PGI 0x00800000
+#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000
+#define GL_MAT_SHININESS_BIT_PGI 0x02000000
+#define GL_MAT_SPECULAR_BIT_PGI 0x04000000
+#define GL_NORMAL_BIT_PGI 0x08000000
+#define GL_TEXCOORD1_BIT_PGI 0x10000000
+#define GL_TEXCOORD2_BIT_PGI 0x20000000
+#define GL_TEXCOORD3_BIT_PGI 0x40000000
+#define GL_TEXCOORD4_BIT_PGI 0x80000000
+
+#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints)
+
+#endif /* GL_PGI_vertex_hints */
+
+/* ----------------------- GL_REND_screen_coordinates ---------------------- */
+
+#ifndef GL_REND_screen_coordinates
+#define GL_REND_screen_coordinates 1
+
+#define GL_SCREEN_COORDINATES_REND 0x8490
+#define GL_INVERTED_SCREEN_W_REND 0x8491
+
+#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates)
+
+#endif /* GL_REND_screen_coordinates */
+
+/* ------------------------------- GL_S3_s3tc ------------------------------ */
+
+#ifndef GL_S3_s3tc
+#define GL_S3_s3tc 1
+
+#define GL_RGB_S3TC 0x83A0
+#define GL_RGB4_S3TC 0x83A1
+#define GL_RGBA_S3TC 0x83A2
+#define GL_RGBA4_S3TC 0x83A3
+#define GL_RGBA_DXT5_S3TC 0x83A4
+#define GL_RGBA4_DXT5_S3TC 0x83A5
+
+#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc)
+
+#endif /* GL_S3_s3tc */
+
+/* -------------------------- GL_SGIS_color_range -------------------------- */
+
+#ifndef GL_SGIS_color_range
+#define GL_SGIS_color_range 1
+
+#define GL_EXTENDED_RANGE_SGIS 0x85A5
+#define GL_MIN_RED_SGIS 0x85A6
+#define GL_MAX_RED_SGIS 0x85A7
+#define GL_MIN_GREEN_SGIS 0x85A8
+#define GL_MAX_GREEN_SGIS 0x85A9
+#define GL_MIN_BLUE_SGIS 0x85AA
+#define GL_MAX_BLUE_SGIS 0x85AB
+#define GL_MIN_ALPHA_SGIS 0x85AC
+#define GL_MAX_ALPHA_SGIS 0x85AD
+
+#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range)
+
+#endif /* GL_SGIS_color_range */
+
+/* ------------------------- GL_SGIS_detail_texture ------------------------ */
+
+#ifndef GL_SGIS_detail_texture
+#define GL_SGIS_detail_texture 1
+
+typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points);
+typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points);
+
+#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS)
+#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS)
+
+#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture)
+
+#endif /* GL_SGIS_detail_texture */
+
+/* -------------------------- GL_SGIS_fog_function ------------------------- */
+
+#ifndef GL_SGIS_fog_function
+#define GL_SGIS_fog_function 1
+
+typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points);
+typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points);
+
+#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS)
+#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS)
+
+#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function)
+
+#endif /* GL_SGIS_fog_function */
+
+/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */
+
+#ifndef GL_SGIS_generate_mipmap
+#define GL_SGIS_generate_mipmap 1
+
+#define GL_GENERATE_MIPMAP_SGIS 0x8191
+#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192
+
+#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap)
+
+#endif /* GL_SGIS_generate_mipmap */
+
+/* -------------------------- GL_SGIS_multisample -------------------------- */
+
+#ifndef GL_SGIS_multisample
+#define GL_SGIS_multisample 1
+
+#define GL_MULTISAMPLE_SGIS 0x809D
+#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F
+#define GL_SAMPLE_MASK_SGIS 0x80A0
+#define GL_1PASS_SGIS 0x80A1
+#define GL_2PASS_0_SGIS 0x80A2
+#define GL_2PASS_1_SGIS 0x80A3
+#define GL_4PASS_0_SGIS 0x80A4
+#define GL_4PASS_1_SGIS 0x80A5
+#define GL_4PASS_2_SGIS 0x80A6
+#define GL_4PASS_3_SGIS 0x80A7
+#define GL_SAMPLE_BUFFERS_SGIS 0x80A8
+#define GL_SAMPLES_SGIS 0x80A9
+#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA
+#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB
+#define GL_SAMPLE_PATTERN_SGIS 0x80AC
+#define GL_MULTISAMPLE_BIT_EXT 0x20000000
+
+typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert);
+typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern);
+
+#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS)
+#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS)
+
+#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample)
+
+#endif /* GL_SGIS_multisample */
+
+/* ------------------------- GL_SGIS_pixel_texture ------------------------- */
+
+#ifndef GL_SGIS_pixel_texture
+#define GL_SGIS_pixel_texture 1
+
+#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture)
+
+#endif /* GL_SGIS_pixel_texture */
+
+/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */
+
+#ifndef GL_SGIS_sharpen_texture
+#define GL_SGIS_sharpen_texture 1
+
+typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points);
+typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points);
+
+#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS)
+#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS)
+
+#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture)
+
+#endif /* GL_SGIS_sharpen_texture */
+
+/* --------------------------- GL_SGIS_texture4D --------------------------- */
+
+#ifndef GL_SGIS_texture4D
+#define GL_SGIS_texture4D 1
+
+typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void* pixels);
+typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void* pixels);
+
+#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS)
+#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS)
+
+#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D)
+
+#endif /* GL_SGIS_texture4D */
+
+/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */
+
+#ifndef GL_SGIS_texture_border_clamp
+#define GL_SGIS_texture_border_clamp 1
+
+#define GL_CLAMP_TO_BORDER_SGIS 0x812D
+
+#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp)
+
+#endif /* GL_SGIS_texture_border_clamp */
+
+/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */
+
+#ifndef GL_SGIS_texture_edge_clamp
+#define GL_SGIS_texture_edge_clamp 1
+
+#define GL_CLAMP_TO_EDGE_SGIS 0x812F
+
+#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp)
+
+#endif /* GL_SGIS_texture_edge_clamp */
+
+/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */
+
+#ifndef GL_SGIS_texture_filter4
+#define GL_SGIS_texture_filter4 1
+
+typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights);
+typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights);
+
+#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS)
+#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS)
+
+#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4)
+
+#endif /* GL_SGIS_texture_filter4 */
+
+/* -------------------------- GL_SGIS_texture_lod -------------------------- */
+
+#ifndef GL_SGIS_texture_lod
+#define GL_SGIS_texture_lod 1
+
+#define GL_TEXTURE_MIN_LOD_SGIS 0x813A
+#define GL_TEXTURE_MAX_LOD_SGIS 0x813B
+#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C
+#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D
+
+#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod)
+
+#endif /* GL_SGIS_texture_lod */
+
+/* ------------------------- GL_SGIS_texture_select ------------------------ */
+
+#ifndef GL_SGIS_texture_select
+#define GL_SGIS_texture_select 1
+
+#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select)
+
+#endif /* GL_SGIS_texture_select */
+
+/* ----------------------------- GL_SGIX_async ----------------------------- */
+
+#ifndef GL_SGIX_async
+#define GL_SGIX_async 1
+
+#define GL_ASYNC_MARKER_SGIX 0x8329
+
+typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker);
+typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range);
+typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp);
+typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range);
+typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker);
+typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp);
+
+#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX)
+#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX)
+#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX)
+#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX)
+#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX)
+#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX)
+
+#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async)
+
+#endif /* GL_SGIX_async */
+
+/* ------------------------ GL_SGIX_async_histogram ------------------------ */
+
+#ifndef GL_SGIX_async_histogram
+#define GL_SGIX_async_histogram 1
+
+#define GL_ASYNC_HISTOGRAM_SGIX 0x832C
+#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D
+
+#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram)
+
+#endif /* GL_SGIX_async_histogram */
+
+/* -------------------------- GL_SGIX_async_pixel -------------------------- */
+
+#ifndef GL_SGIX_async_pixel
+#define GL_SGIX_async_pixel 1
+
+#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C
+#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D
+#define GL_ASYNC_READ_PIXELS_SGIX 0x835E
+#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F
+#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360
+#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361
+
+#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel)
+
+#endif /* GL_SGIX_async_pixel */
+
+/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */
+
+#ifndef GL_SGIX_blend_alpha_minmax
+#define GL_SGIX_blend_alpha_minmax 1
+
+#define GL_ALPHA_MIN_SGIX 0x8320
+#define GL_ALPHA_MAX_SGIX 0x8321
+
+#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax)
+
+#endif /* GL_SGIX_blend_alpha_minmax */
+
+/* ---------------------------- GL_SGIX_clipmap ---------------------------- */
+
+#ifndef GL_SGIX_clipmap
+#define GL_SGIX_clipmap 1
+
+#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap)
+
+#endif /* GL_SGIX_clipmap */
+
+/* ------------------------- GL_SGIX_depth_texture ------------------------- */
+
+#ifndef GL_SGIX_depth_texture
+#define GL_SGIX_depth_texture 1
+
+#define GL_DEPTH_COMPONENT16_SGIX 0x81A5
+#define GL_DEPTH_COMPONENT24_SGIX 0x81A6
+#define GL_DEPTH_COMPONENT32_SGIX 0x81A7
+
+#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture)
+
+#endif /* GL_SGIX_depth_texture */
+
+/* -------------------------- GL_SGIX_flush_raster ------------------------- */
+
+#ifndef GL_SGIX_flush_raster
+#define GL_SGIX_flush_raster 1
+
+typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void);
+
+#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX)
+
+#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster)
+
+#endif /* GL_SGIX_flush_raster */
+
+/* --------------------------- GL_SGIX_fog_offset -------------------------- */
+
+#ifndef GL_SGIX_fog_offset
+#define GL_SGIX_fog_offset 1
+
+#define GL_FOG_OFFSET_SGIX 0x8198
+#define GL_FOG_OFFSET_VALUE_SGIX 0x8199
+
+#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset)
+
+#endif /* GL_SGIX_fog_offset */
+
+/* -------------------------- GL_SGIX_fog_texture -------------------------- */
+
+#ifndef GL_SGIX_fog_texture
+#define GL_SGIX_fog_texture 1
+
+#define GL_TEXTURE_FOG_SGIX 0
+#define GL_FOG_PATCHY_FACTOR_SGIX 0
+#define GL_FRAGMENT_FOG_SGIX 0
+
+typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname);
+
+#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX)
+
+#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture)
+
+#endif /* GL_SGIX_fog_texture */
+
+/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */
+
+#ifndef GL_SGIX_fragment_specular_lighting
+#define GL_SGIX_fragment_specular_lighting 1
+
+typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data);
+
+#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX)
+#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX)
+#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX)
+#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX)
+#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX)
+#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX)
+#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX)
+#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX)
+#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX)
+#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX)
+#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX)
+#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX)
+#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX)
+#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX)
+#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX)
+#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX)
+#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX)
+
+#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting)
+
+#endif /* GL_SGIX_fragment_specular_lighting */
+
+/* --------------------------- GL_SGIX_framezoom --------------------------- */
+
+#ifndef GL_SGIX_framezoom
+#define GL_SGIX_framezoom 1
+
+typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor);
+
+#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX)
+
+#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom)
+
+#endif /* GL_SGIX_framezoom */
+
+/* --------------------------- GL_SGIX_interlace --------------------------- */
+
+#ifndef GL_SGIX_interlace
+#define GL_SGIX_interlace 1
+
+#define GL_INTERLACE_SGIX 0x8094
+
+#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace)
+
+#endif /* GL_SGIX_interlace */
+
+/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */
+
+#ifndef GL_SGIX_ir_instrument1
+#define GL_SGIX_ir_instrument1 1
+
+#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1)
+
+#endif /* GL_SGIX_ir_instrument1 */
+
+/* ------------------------- GL_SGIX_list_priority ------------------------- */
+
+#ifndef GL_SGIX_list_priority
+#define GL_SGIX_list_priority 1
+
+#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority)
+
+#endif /* GL_SGIX_list_priority */
+
+/* ------------------------- GL_SGIX_pixel_texture ------------------------- */
+
+#ifndef GL_SGIX_pixel_texture
+#define GL_SGIX_pixel_texture 1
+
+typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode);
+
+#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX)
+
+#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture)
+
+#endif /* GL_SGIX_pixel_texture */
+
+/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */
+
+#ifndef GL_SGIX_pixel_texture_bits
+#define GL_SGIX_pixel_texture_bits 1
+
+#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits)
+
+#endif /* GL_SGIX_pixel_texture_bits */
+
+/* ------------------------ GL_SGIX_reference_plane ------------------------ */
+
+#ifndef GL_SGIX_reference_plane
+#define GL_SGIX_reference_plane 1
+
+typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation);
+
+#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX)
+
+#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane)
+
+#endif /* GL_SGIX_reference_plane */
+
+/* ---------------------------- GL_SGIX_resample --------------------------- */
+
+#ifndef GL_SGIX_resample
+#define GL_SGIX_resample 1
+
+#define GL_PACK_RESAMPLE_SGIX 0x842E
+#define GL_UNPACK_RESAMPLE_SGIX 0x842F
+#define GL_RESAMPLE_DECIMATE_SGIX 0x8430
+#define GL_RESAMPLE_REPLICATE_SGIX 0x8433
+#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434
+
+#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample)
+
+#endif /* GL_SGIX_resample */
+
+/* ----------------------------- GL_SGIX_shadow ---------------------------- */
+
+#ifndef GL_SGIX_shadow
+#define GL_SGIX_shadow 1
+
+#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow)
+
+#endif /* GL_SGIX_shadow */
+
+/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */
+
+#ifndef GL_SGIX_shadow_ambient
+#define GL_SGIX_shadow_ambient 1
+
+#define GL_SHADOW_AMBIENT_SGIX 0x80BF
+
+#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient)
+
+#endif /* GL_SGIX_shadow_ambient */
+
+/* ----------------------------- GL_SGIX_sprite ---------------------------- */
+
+#ifndef GL_SGIX_sprite
+#define GL_SGIX_sprite 1
+
+typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params);
+
+#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX)
+#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX)
+#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX)
+#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX)
+
+#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite)
+
+#endif /* GL_SGIX_sprite */
+
+/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */
+
+#ifndef GL_SGIX_tag_sample_buffer
+#define GL_SGIX_tag_sample_buffer 1
+
+typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void);
+
+#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX)
+
+#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer)
+
+#endif /* GL_SGIX_tag_sample_buffer */
+
+/* ------------------------ GL_SGIX_texture_add_env ------------------------ */
+
+#ifndef GL_SGIX_texture_add_env
+#define GL_SGIX_texture_add_env 1
+
+#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env)
+
+#endif /* GL_SGIX_texture_add_env */
+
+/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */
+
+#ifndef GL_SGIX_texture_coordinate_clamp
+#define GL_SGIX_texture_coordinate_clamp 1
+
+#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369
+#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A
+#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B
+
+#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp)
+
+#endif /* GL_SGIX_texture_coordinate_clamp */
+
+/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */
+
+#ifndef GL_SGIX_texture_lod_bias
+#define GL_SGIX_texture_lod_bias 1
+
+#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias)
+
+#endif /* GL_SGIX_texture_lod_bias */
+
+/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */
+
+#ifndef GL_SGIX_texture_multi_buffer
+#define GL_SGIX_texture_multi_buffer 1
+
+#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E
+
+#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer)
+
+#endif /* GL_SGIX_texture_multi_buffer */
+
+/* ------------------------- GL_SGIX_texture_range ------------------------- */
+
+#ifndef GL_SGIX_texture_range
+#define GL_SGIX_texture_range 1
+
+#define GL_RGB_SIGNED_SGIX 0x85E0
+#define GL_RGBA_SIGNED_SGIX 0x85E1
+#define GL_ALPHA_SIGNED_SGIX 0x85E2
+#define GL_LUMINANCE_SIGNED_SGIX 0x85E3
+#define GL_INTENSITY_SIGNED_SGIX 0x85E4
+#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5
+#define GL_RGB16_SIGNED_SGIX 0x85E6
+#define GL_RGBA16_SIGNED_SGIX 0x85E7
+#define GL_ALPHA16_SIGNED_SGIX 0x85E8
+#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9
+#define GL_INTENSITY16_SIGNED_SGIX 0x85EA
+#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB
+#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC
+#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED
+#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE
+#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF
+#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0
+#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1
+#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2
+#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3
+#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4
+#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5
+#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6
+#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7
+#define GL_MIN_LUMINANCE_SGIS 0x85F8
+#define GL_MAX_LUMINANCE_SGIS 0x85F9
+#define GL_MIN_INTENSITY_SGIS 0x85FA
+#define GL_MAX_INTENSITY_SGIS 0x85FB
+
+#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range)
+
+#endif /* GL_SGIX_texture_range */
+
+/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */
+
+#ifndef GL_SGIX_texture_scale_bias
+#define GL_SGIX_texture_scale_bias 1
+
+#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179
+#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A
+#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B
+#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C
+
+#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias)
+
+#endif /* GL_SGIX_texture_scale_bias */
+
+/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */
+
+#ifndef GL_SGIX_vertex_preclip
+#define GL_SGIX_vertex_preclip 1
+
+#define GL_VERTEX_PRECLIP_SGIX 0x83EE
+#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF
+
+#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip)
+
+#endif /* GL_SGIX_vertex_preclip */
+
+/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */
+
+#ifndef GL_SGIX_vertex_preclip_hint
+#define GL_SGIX_vertex_preclip_hint 1
+
+#define GL_VERTEX_PRECLIP_SGIX 0x83EE
+#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF
+
+#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint)
+
+#endif /* GL_SGIX_vertex_preclip_hint */
+
+/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */
+
+#ifndef GL_SGIX_ycrcb
+#define GL_SGIX_ycrcb 1
+
+#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb)
+
+#endif /* GL_SGIX_ycrcb */
+
+/* -------------------------- GL_SGI_color_matrix -------------------------- */
+
+#ifndef GL_SGI_color_matrix
+#define GL_SGI_color_matrix 1
+
+#define GL_COLOR_MATRIX_SGI 0x80B1
+#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3
+#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7
+#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB
+
+#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix)
+
+#endif /* GL_SGI_color_matrix */
+
+/* --------------------------- GL_SGI_color_table -------------------------- */
+
+#ifndef GL_SGI_color_table
+#define GL_SGI_color_table 1
+
+#define GL_COLOR_TABLE_SGI 0x80D0
+#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2
+#define GL_PROXY_COLOR_TABLE_SGI 0x80D3
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5
+#define GL_COLOR_TABLE_SCALE_SGI 0x80D6
+#define GL_COLOR_TABLE_BIAS_SGI 0x80D7
+#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8
+#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9
+#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA
+#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB
+#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC
+#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD
+#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE
+#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF
+
+typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* table);
+typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void* table);
+
+#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI)
+#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI)
+#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI)
+#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI)
+#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI)
+#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI)
+#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI)
+
+#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table)
+
+#endif /* GL_SGI_color_table */
+
+/* ----------------------- GL_SGI_texture_color_table ---------------------- */
+
+#ifndef GL_SGI_texture_color_table
+#define GL_SGI_texture_color_table 1
+
+#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC
+#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD
+
+#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table)
+
+#endif /* GL_SGI_texture_color_table */
+
+/* ------------------------- GL_SUNX_constant_data ------------------------- */
+
+#ifndef GL_SUNX_constant_data
+#define GL_SUNX_constant_data 1
+
+#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5
+#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6
+
+typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void);
+
+#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX)
+
+#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data)
+
+#endif /* GL_SUNX_constant_data */
+
+/* -------------------- GL_SUN_convolution_border_modes -------------------- */
+
+#ifndef GL_SUN_convolution_border_modes
+#define GL_SUN_convolution_border_modes 1
+
+#define GL_WRAP_BORDER_SUN 0x81D4
+
+#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes)
+
+#endif /* GL_SUN_convolution_border_modes */
+
+/* -------------------------- GL_SUN_global_alpha -------------------------- */
+
+#ifndef GL_SUN_global_alpha
+#define GL_SUN_global_alpha 1
+
+#define GL_GLOBAL_ALPHA_SUN 0x81D9
+#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA
+
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor);
+
+#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN)
+#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN)
+#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN)
+#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN)
+#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN)
+#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN)
+#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN)
+#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN)
+
+#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha)
+
+#endif /* GL_SUN_global_alpha */
+
+/* --------------------------- GL_SUN_mesh_array --------------------------- */
+
+#ifndef GL_SUN_mesh_array
+#define GL_SUN_mesh_array 1
+
+#define GL_QUAD_MESH_SUN 0x8614
+#define GL_TRIANGLE_MESH_SUN 0x8615
+
+#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array)
+
+#endif /* GL_SUN_mesh_array */
+
+/* ------------------------ GL_SUN_read_video_pixels ----------------------- */
+
+#ifndef GL_SUN_read_video_pixels
+#define GL_SUN_read_video_pixels 1
+
+typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
+
+#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN)
+
+#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels)
+
+#endif /* GL_SUN_read_video_pixels */
+
+/* --------------------------- GL_SUN_slice_accum -------------------------- */
+
+#ifndef GL_SUN_slice_accum
+#define GL_SUN_slice_accum 1
+
+#define GL_SLICE_ACCUM_SUN 0x85CC
+
+#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum)
+
+#endif /* GL_SUN_slice_accum */
+
+/* -------------------------- GL_SUN_triangle_list ------------------------- */
+
+#ifndef GL_SUN_triangle_list
+#define GL_SUN_triangle_list 1
+
+#define GL_RESTART_SUN 0x01
+#define GL_REPLACE_MIDDLE_SUN 0x02
+#define GL_REPLACE_OLDEST_SUN 0x03
+#define GL_TRIANGLE_LIST_SUN 0x81D7
+#define GL_REPLACEMENT_CODE_SUN 0x81D8
+#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0
+#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1
+#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2
+#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3
+#define GL_R1UI_V3F_SUN 0x85C4
+#define GL_R1UI_C4UB_V3F_SUN 0x85C5
+#define GL_R1UI_C3F_V3F_SUN 0x85C6
+#define GL_R1UI_N3F_V3F_SUN 0x85C7
+#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8
+#define GL_R1UI_T2F_V3F_SUN 0x85C9
+#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA
+#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB
+
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code);
+
+#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN)
+#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN)
+#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN)
+#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN)
+#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN)
+#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN)
+#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN)
+
+#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list)
+
+#endif /* GL_SUN_triangle_list */
+
+/* ----------------------------- GL_SUN_vertex ----------------------------- */
+
+#ifndef GL_SUN_vertex
+#define GL_SUN_vertex 1
+
+typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v);
+
+#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN)
+#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN)
+#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN)
+#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN)
+#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN)
+#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN)
+#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN)
+#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN)
+#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN)
+#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN)
+#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN)
+#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN)
+#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN)
+#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN)
+#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN)
+#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN)
+#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN)
+#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN)
+#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN)
+#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN)
+#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN)
+#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN)
+#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN)
+#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN)
+#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN)
+#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN)
+#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN)
+#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN)
+#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN)
+#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN)
+#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN)
+#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN)
+#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN)
+#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN)
+#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN)
+#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN)
+#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN)
+#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN)
+#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN)
+#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN)
+
+#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex)
+
+#endif /* GL_SUN_vertex */
+
+/* -------------------------- GL_WIN_phong_shading ------------------------- */
+
+#ifndef GL_WIN_phong_shading
+#define GL_WIN_phong_shading 1
+
+#define GL_PHONG_WIN 0x80EA
+#define GL_PHONG_HINT_WIN 0x80EB
+
+#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading)
+
+#endif /* GL_WIN_phong_shading */
+
+/* -------------------------- GL_WIN_specular_fog -------------------------- */
+
+#ifndef GL_WIN_specular_fog
+#define GL_WIN_specular_fog 1
+
+#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC
+
+#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog)
+
+#endif /* GL_WIN_specular_fog */
+
+/* ---------------------------- GL_WIN_swap_hint --------------------------- */
+
+#ifndef GL_WIN_swap_hint
+#define GL_WIN_swap_hint 1
+
+typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+
+#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN)
+
+#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint)
+
+#endif /* GL_WIN_swap_hint */
+
+/* ------------------------------------------------------------------------- */
+
+#if defined(GLEW_MX) && defined(_WIN32)
+#define GLEW_FUN_EXPORT
+#else
+#define GLEW_FUN_EXPORT GLEWAPI
+#endif /* GLEW_MX */
+
+#if defined(GLEW_MX)
+#define GLEW_VAR_EXPORT
+#else
+#define GLEW_VAR_EXPORT GLEWAPI
+#endif /* GLEW_MX */
+
+#if defined(GLEW_MX) && defined(_WIN32)
+struct GLEWContextStruct
+{
+#endif /* GLEW_MX */
+
+GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D;
+GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements;
+GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D;
+GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D;
+
+GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture;
+GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D;
+GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage;
+GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd;
+GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf;
+GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd;
+GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv;
+GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage;
+
+GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor;
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate;
+GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer;
+GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd;
+GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv;
+GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf;
+GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements;
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf;
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv;
+
+GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery;
+GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer;
+GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData;
+GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData;
+GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers;
+GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries;
+GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery;
+GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers;
+GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries;
+GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv;
+GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv;
+GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData;
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv;
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv;
+GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv;
+GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer;
+GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery;
+GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer;
+GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer;
+
+GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX;
+
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE;
+GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE;
+GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE;
+
+GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE;
+GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE;
+GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE;
+GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE;
+GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE;
+GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE;
+GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE;
+GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE;
+
+GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE;
+GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE;
+
+GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE;
+GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE;
+GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE;
+GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE;
+
+GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE;
+
+GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB;
+
+GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB;
+
+GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable;
+GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable;
+GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv;
+GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv;
+GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable;
+GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable;
+GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D;
+GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv;
+GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter;
+GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv;
+GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv;
+GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram;
+GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv;
+GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv;
+GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax;
+GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv;
+GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv;
+GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter;
+GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram;
+GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax;
+GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram;
+GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax;
+GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D;
+
+GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB;
+GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB;
+GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB;
+GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB;
+GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB;
+
+GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB;
+
+GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB;
+GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB;
+
+GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB;
+GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB;
+GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB;
+GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB;
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB;
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB;
+GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB;
+GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB;
+
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB;
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB;
+
+GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB;
+GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB;
+GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB;
+GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB;
+GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB;
+GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB;
+GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB;
+GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB;
+GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB;
+GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB;
+GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB;
+GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB;
+GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB;
+GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB;
+GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB;
+GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB;
+GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB;
+
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB;
+GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB;
+
+GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB;
+
+GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB;
+GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB;
+GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB;
+GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB;
+GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB;
+GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB;
+GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB;
+GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB;
+GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB;
+GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB;
+GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB;
+
+GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB;
+GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB;
+GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB;
+GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB;
+GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB;
+GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB;
+
+GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB;
+GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB;
+GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB;
+
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB;
+
+GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI;
+
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI;
+GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI;
+GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI;
+
+GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI;
+GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI;
+GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI;
+GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI;
+
+GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI;
+GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI;
+GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI;
+GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI;
+GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI;
+GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI;
+GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI;
+GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI;
+GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI;
+GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI;
+GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI;
+GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI;
+GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI;
+GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI;
+
+GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI;
+GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI;
+
+GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glPNTrianglewesfATI;
+GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glPNTrianglewesiATI;
+
+GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI;
+GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI;
+
+GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI;
+GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI;
+GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI;
+GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI;
+GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI;
+GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI;
+GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI;
+GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI;
+GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI;
+GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI;
+GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI;
+GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI;
+
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI;
+
+GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI;
+GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI;
+GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI;
+
+GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT;
+
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT;
+
+GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT;
+
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT;
+
+GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT;
+GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT;
+
+GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT;
+GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT;
+
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT;
+GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT;
+GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT;
+GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT;
+GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT;
+
+GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT;
+GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT;
+
+GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT;
+
+GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT;
+GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT;
+
+GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT;
+
+GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT;
+
+GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT;
+GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT;
+GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT;
+GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT;
+GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT;
+
+GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT;
+GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT;
+
+GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT;
+GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT;
+GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT;
+GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT;
+GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT;
+GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT;
+GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT;
+
+GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT;
+
+GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT;
+
+GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT;
+GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT;
+GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT;
+
+GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT;
+
+GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT;
+GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT;
+
+GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT;
+
+GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT;
+GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT;
+GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT;
+GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT;
+
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT;
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT;
+
+GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT;
+
+GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT;
+GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT;
+
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT;
+
+GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT;
+
+GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT;
+GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT;
+GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT;
+
+GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT;
+
+GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT;
+GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT;
+GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT;
+GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT;
+GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT;
+GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT;
+
+GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT;
+
+GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT;
+GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT;
+GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT;
+GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT;
+GLEW_FUN_EXPORT PFNGLGETPOINTERVEXTPROC __glewGetPointervEXT;
+GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT;
+GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT;
+GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT;
+
+GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT;
+GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT;
+GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT;
+GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT;
+GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT;
+GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT;
+GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT;
+GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT;
+GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT;
+GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT;
+GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT;
+GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT;
+GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT;
+GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT;
+GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT;
+GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT;
+GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT;
+GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT;
+GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT;
+GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT;
+GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT;
+GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT;
+GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT;
+GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT;
+GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT;
+GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT;
+GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT;
+GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT;
+GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT;
+GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT;
+GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT;
+GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT;
+GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT;
+
+GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT;
+
+GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP;
+GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP;
+GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP;
+GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP;
+GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP;
+GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP;
+
+GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM;
+GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM;
+
+GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM;
+GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM;
+GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM;
+GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM;
+GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM;
+GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM;
+GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM;
+
+GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL;
+GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL;
+GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL;
+GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL;
+
+GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL;
+GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL;
+
+GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDEXTPROC __glewBufferRegionEnabledEXT;
+GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONEXTPROC __glewDeleteBufferRegionEXT;
+GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONEXTPROC __glewDrawBufferRegionEXT;
+GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONEXTPROC __glewNewBufferRegionEXT;
+GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONEXTPROC __glewReadBufferRegionEXT;
+
+GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA;
+
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA;
+
+GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV;
+GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV;
+GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV;
+GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV;
+GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV;
+GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV;
+GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV;
+
+GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV;
+GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV;
+GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV;
+GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV;
+GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV;
+GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV;
+GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV;
+
+GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV;
+
+GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV;
+GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV;
+GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV;
+GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV;
+GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV;
+GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV;
+GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV;
+GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV;
+GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV;
+GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV;
+GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV;
+GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV;
+
+GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV;
+GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV;
+GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV;
+GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV;
+GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV;
+GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV;
+GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV;
+
+GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV;
+GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV;
+
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV;
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV;
+
+GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV;
+GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV;
+
+GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV;
+GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV;
+GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV;
+GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV;
+GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV;
+GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV;
+GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV;
+GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV;
+GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV;
+GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV;
+
+GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV;
+
+GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV;
+
+GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV;
+GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV;
+GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV;
+GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV;
+GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV;
+GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV;
+GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV;
+GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV;
+GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV;
+GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV;
+
+GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS;
+GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS;
+
+GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS;
+GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS;
+
+GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS;
+GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS;
+
+GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS;
+GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS;
+
+GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS;
+GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS;
+
+GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS;
+GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS;
+
+GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX;
+GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX;
+GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX;
+GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX;
+GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX;
+GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX;
+
+GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX;
+
+GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX;
+
+GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX;
+
+GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX;
+
+GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX;
+
+GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX;
+
+GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX;
+GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX;
+GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX;
+GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX;
+
+GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX;
+
+GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI;
+GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI;
+GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI;
+GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI;
+
+GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX;
+
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN;
+
+GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN;
+
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN;
+
+GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN;
+
+GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN;
+
+#if defined(GLEW_MX) && !defined(_WIN32)
+struct GLEWContextStruct
+{
+#endif /* GLEW_MX */
+
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0;
+GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample;
+GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting;
+GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes;
+GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform;
+GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test;
+GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting;
+GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex;
+GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays;
+GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip;
+GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data;
+GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat;
+GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists;
+GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read;
+GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays;
+GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor;
+GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region;
+GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert;
+GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers;
+GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos;
+GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3;
+GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace;
+GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample;
+GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample;
+GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints;
+GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints;
+GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates;
+GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex;
+GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading;
+GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog;
+GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint;
+
+#ifdef GLEW_MX
+}; /* GLEWContextStruct */
+#endif /* GLEW_MX */
+
+/* ------------------------------------------------------------------------- */
+
+/* error codes */
+#define GLEW_OK 0
+#define GLEW_NO_ERROR 0
+#define GLEW_ERROR_NO_GL_VERSION 1  /* missing GL version */
+#define GLEW_ERROR_GL_VERSION_10_ONLY 2  /* GL 1.1 and up are not supported */
+#define GLEW_ERROR_GLX_VERSION_11_ONLY 3  /* GLX 1.2 and up are not supported */
+
+/* string codes */
+#define GLEW_VERSION 1
+
+/* API */
+#ifdef GLEW_MX
+
+typedef struct GLEWContextStruct GLEWContext;
+GLEWAPI GLenum glewContextInit (GLEWContext* ctx);
+
+#ifdef _WIN32
+#  define GLEW_GET_VAR(x) glewGetContext()->x
+#  define GLEW_GET_FUN(x) glewGetContext()->x
+#else
+#  define GLEW_GET_VAR(x) glewGetContext()->x
+#  define GLEW_GET_FUN(x) x
+#endif
+
+#else /* GLEW_MX */
+
+GLEWAPI GLenum glewInit ();
+
+#define GLEW_GET_VAR(x) x
+#define GLEW_GET_FUN(x) x
+
+#endif /* GLEW_MX */
+
+GLEWAPI GLboolean glewExperimental;
+GLEWAPI GLboolean glewGetExtension (const char* name);
+GLEWAPI const GLubyte* glewGetErrorString (GLenum error);
+GLEWAPI const GLubyte* glewGetString (GLenum name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef GLEW_APIENTRY_DEFINED
+#undef GLEW_APIENTRY_DEFINED
+#undef APIENTRY
+#undef GLAPIENTRY
+#endif
+
+#ifdef GLEW_CALLBACK_DEFINED
+#undef GLEW_CALLBACK_DEFINED
+#undef CALLBACK
+#endif
+
+#ifdef GLEW_WINGDIAPI_DEFINED
+#undef GLEW_WINGDIAPI_DEFINED
+#undef WINGDIAPI
+#endif
+
+#undef GLAPI
+/* #undef GLEWAPI */
+
+#endif /* __glew_h__ */
Index: /tags/DummyModules/VUT/chcdemo/GL/wglew.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/GL/wglew.h	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/GL/wglew.h	(revision 10)
@@ -0,0 +1,922 @@
+/*
+** The OpenGL Extension Wrangler Library
+** Copyright (C) 2004, 2003, 2002, Milan Ikits <milan ikits[at]ieee org>
+** Copyright (C) 2004, 2003, 2002, Marcelo E. Magallon <mmagallo[at]debian org>
+** Copyright (C) 2002, Lev Povalahev
+** All rights reserved.
+** 
+** Redistribution and use in source and binary forms, with or without 
+** modification, are permitted provided that the following conditions are met:
+** 
+** * Redistributions of source code must retain the above copyright notice, 
+**   this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright notice, 
+**   this list of conditions and the following disclaimer in the documentation 
+**   and/or other materials provided with the distribution.
+** * The name of the author may be used to endorse or promote products 
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+** THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+** License Applicability. Except to the extent portions of this file are
+** made subject to an alternative license as permitted in the SGI Free
+** Software License B, Version 1.1 (the "License"), the contents of this
+** file are subject only to the provisions of the License. You may not use
+** this file except in compliance with the License. You may obtain a copy
+** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
+** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
+** 
+** http://oss.sgi.com/projects/FreeB
+** 
+** Note that, as provided in the License, the Software is distributed on an
+** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
+** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
+** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
+** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
+** 
+** Original Code. The Original Code is: OpenGL Sample Implementation,
+** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
+** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
+** Copyright in any portions created by third parties is as indicated
+** elsewhere herein. All Rights Reserved.
+** 
+** Additional Notice Provisions: This software was created using the
+** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has
+** not been independently verified as being compliant with the OpenGL(R)
+** version 1.2.1 Specification.
+*/
+
+#ifndef __wglew_h__
+#define __wglew_h__
+#define __WGLEW_H__
+
+#ifdef __wglext_h_
+#error wglext.h included before wglew.h
+#endif
+
+#define __wglext_h_
+
+#if !defined(APIENTRY) && !defined(__CYGWIN__)
+#define WIN32_LEAN_AND_MEAN 1
+#include <windows.h>
+#endif
+
+/*
+ * GLEW_STATIC needs to be set when using the static version.
+ * GLEW_BUILD is set when building the DLL version.
+ */
+#ifdef GLEW_STATIC
+#  define GLEWAPI extern
+#else
+#  ifdef GLEW_BUILD
+#    define GLEWAPI extern __declspec(dllexport)
+#  else
+#    define GLEWAPI extern __declspec(dllimport)
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* -------------------------- WGL_3DFX_multisample ------------------------- */
+
+#ifndef WGL_3DFX_multisample
+#define WGL_3DFX_multisample 1
+
+#define WGL_SAMPLE_BUFFERS_3DFX 0x2060
+#define WGL_SAMPLES_3DFX 0x2061
+
+#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample)
+
+#endif /* WGL_3DFX_multisample */
+
+/* ------------------------- WGL_ARB_buffer_region ------------------------- */
+
+#ifndef WGL_ARB_buffer_region
+#define WGL_ARB_buffer_region 1
+
+#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001
+#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002
+#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004
+#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008
+
+typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType);
+typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion);
+typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);
+typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height);
+
+#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB)
+#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB)
+#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB)
+#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB)
+
+#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region)
+
+#endif /* WGL_ARB_buffer_region */
+
+/* ----------------------- WGL_ARB_extensions_string ----------------------- */
+
+#ifndef WGL_ARB_extensions_string
+#define WGL_ARB_extensions_string 1
+
+typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
+
+#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB)
+
+#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string)
+
+#endif /* WGL_ARB_extensions_string */
+
+/* ----------------------- WGL_ARB_make_current_read ----------------------- */
+
+#ifndef WGL_ARB_make_current_read
+#define WGL_ARB_make_current_read 1
+
+typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID);
+typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
+
+#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB)
+#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB)
+
+#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read)
+
+#endif /* WGL_ARB_make_current_read */
+
+/* -------------------------- WGL_ARB_multisample -------------------------- */
+
+#ifndef WGL_ARB_multisample
+#define WGL_ARB_multisample 1
+
+#define WGL_SAMPLE_BUFFERS_ARB 0x2041
+#define WGL_SAMPLES_ARB 0x2042
+
+#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample)
+
+#endif /* WGL_ARB_multisample */
+
+/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */
+
+#ifndef WGL_ARB_pbuffer
+#define WGL_ARB_pbuffer 1
+
+#define WGL_DRAW_TO_PBUFFER_ARB 0x202D
+#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
+#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
+#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
+#define WGL_PBUFFER_LARGEST_ARB 0x2033
+#define WGL_PBUFFER_WIDTH_ARB 0x2034
+#define WGL_PBUFFER_HEIGHT_ARB 0x2035
+#define WGL_PBUFFER_LOST_ARB 0x2036
+
+DECLARE_HANDLE(HPBUFFERARB);
+
+typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList);
+typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);
+typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);
+typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue);
+typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);
+
+#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB)
+#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB)
+#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB)
+#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB)
+#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB)
+
+#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer)
+
+#endif /* WGL_ARB_pbuffer */
+
+/* -------------------------- WGL_ARB_pixel_format ------------------------- */
+
+#ifndef WGL_ARB_pixel_format
+#define WGL_ARB_pixel_format 1
+
+#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
+#define WGL_DRAW_TO_WINDOW_ARB 0x2001
+#define WGL_DRAW_TO_BITMAP_ARB 0x2002
+#define WGL_ACCELERATION_ARB 0x2003
+#define WGL_NEED_PALETTE_ARB 0x2004
+#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
+#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
+#define WGL_SWAP_METHOD_ARB 0x2007
+#define WGL_NUMBER_OVERLAYS_ARB 0x2008
+#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
+#define WGL_TRANSPARENT_ARB 0x200A
+#define WGL_SHARE_DEPTH_ARB 0x200C
+#define WGL_SHARE_STENCIL_ARB 0x200D
+#define WGL_SHARE_ACCUM_ARB 0x200E
+#define WGL_SUPPORT_GDI_ARB 0x200F
+#define WGL_SUPPORT_OPENGL_ARB 0x2010
+#define WGL_DOUBLE_BUFFER_ARB 0x2011
+#define WGL_STEREO_ARB 0x2012
+#define WGL_PIXEL_TYPE_ARB 0x2013
+#define WGL_COLOR_BITS_ARB 0x2014
+#define WGL_RED_BITS_ARB 0x2015
+#define WGL_RED_SHIFT_ARB 0x2016
+#define WGL_GREEN_BITS_ARB 0x2017
+#define WGL_GREEN_SHIFT_ARB 0x2018
+#define WGL_BLUE_BITS_ARB 0x2019
+#define WGL_BLUE_SHIFT_ARB 0x201A
+#define WGL_ALPHA_BITS_ARB 0x201B
+#define WGL_ALPHA_SHIFT_ARB 0x201C
+#define WGL_ACCUM_BITS_ARB 0x201D
+#define WGL_ACCUM_RED_BITS_ARB 0x201E
+#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
+#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
+#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
+#define WGL_DEPTH_BITS_ARB 0x2022
+#define WGL_STENCIL_BITS_ARB 0x2023
+#define WGL_AUX_BUFFERS_ARB 0x2024
+#define WGL_NO_ACCELERATION_ARB 0x2025
+#define WGL_GENERIC_ACCELERATION_ARB 0x2026
+#define WGL_FULL_ACCELERATION_ARB 0x2027
+#define WGL_SWAP_EXCHANGE_ARB 0x2028
+#define WGL_SWAP_COPY_ARB 0x2029
+#define WGL_SWAP_UNDEFINED_ARB 0x202A
+#define WGL_TYPE_RGBA_ARB 0x202B
+#define WGL_TYPE_COLORINDEX_ARB 0x202C
+#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
+#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
+#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
+#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
+#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
+
+typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues);
+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues);
+
+#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB)
+#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB)
+#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB)
+
+#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format)
+
+#endif /* WGL_ARB_pixel_format */
+
+/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */
+
+#ifndef WGL_ARB_pixel_format_float
+#define WGL_ARB_pixel_format_float 1
+
+#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0
+
+#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float)
+
+#endif /* WGL_ARB_pixel_format_float */
+
+/* ------------------------- WGL_ARB_render_texture ------------------------ */
+
+#ifndef WGL_ARB_render_texture
+#define WGL_ARB_render_texture 1
+
+#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070
+#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071
+#define WGL_TEXTURE_FORMAT_ARB 0x2072
+#define WGL_TEXTURE_TARGET_ARB 0x2073
+#define WGL_MIPMAP_TEXTURE_ARB 0x2074
+#define WGL_TEXTURE_RGB_ARB 0x2075
+#define WGL_TEXTURE_RGBA_ARB 0x2076
+#define WGL_NO_TEXTURE_ARB 0x2077
+#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078
+#define WGL_TEXTURE_1D_ARB 0x2079
+#define WGL_TEXTURE_2D_ARB 0x207A
+#define WGL_MIPMAP_LEVEL_ARB 0x207B
+#define WGL_CUBE_MAP_FACE_ARB 0x207C
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082
+#define WGL_FRONT_LEFT_ARB 0x2083
+#define WGL_FRONT_RIGHT_ARB 0x2084
+#define WGL_BACK_LEFT_ARB 0x2085
+#define WGL_BACK_RIGHT_ARB 0x2086
+#define WGL_AUX0_ARB 0x2087
+#define WGL_AUX1_ARB 0x2088
+#define WGL_AUX2_ARB 0x2089
+#define WGL_AUX3_ARB 0x208A
+#define WGL_AUX4_ARB 0x208B
+#define WGL_AUX5_ARB 0x208C
+#define WGL_AUX6_ARB 0x208D
+#define WGL_AUX7_ARB 0x208E
+#define WGL_AUX8_ARB 0x208F
+#define WGL_AUX9_ARB 0x2090
+
+typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
+typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
+typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList);
+
+#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB)
+#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB)
+#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB)
+
+#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture)
+
+#endif /* WGL_ARB_render_texture */
+
+/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */
+
+#ifndef WGL_ATI_pixel_format_float
+#define WGL_ATI_pixel_format_float 1
+
+#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0
+#define GL_RGBA_FLOAT_MODE_ATI 0x8820
+#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835
+
+#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float)
+
+#endif /* WGL_ATI_pixel_format_float */
+
+/* -------------------------- WGL_EXT_depth_float -------------------------- */
+
+#ifndef WGL_EXT_depth_float
+#define WGL_EXT_depth_float 1
+
+#define WGL_DEPTH_FLOAT_EXT 0x2040
+
+#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float)
+
+#endif /* WGL_EXT_depth_float */
+
+/* ---------------------- WGL_EXT_display_color_table ---------------------- */
+
+#ifndef WGL_EXT_display_color_table
+#define WGL_EXT_display_color_table 1
+
+typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id);
+typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id);
+typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id);
+typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length);
+
+#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT)
+#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT)
+#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT)
+#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT)
+
+#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table)
+
+#endif /* WGL_EXT_display_color_table */
+
+/* ----------------------- WGL_EXT_extensions_string ----------------------- */
+
+#ifndef WGL_EXT_extensions_string
+#define WGL_EXT_extensions_string 1
+
+typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void);
+
+#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT)
+
+#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string)
+
+#endif /* WGL_EXT_extensions_string */
+
+/* ----------------------- WGL_EXT_make_current_read ----------------------- */
+
+#ifndef WGL_EXT_make_current_read
+#define WGL_EXT_make_current_read 1
+
+typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID);
+typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
+
+#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT)
+#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT)
+
+#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read)
+
+#endif /* WGL_EXT_make_current_read */
+
+/* -------------------------- WGL_EXT_multisample -------------------------- */
+
+#ifndef WGL_EXT_multisample
+#define WGL_EXT_multisample 1
+
+#define WGL_SAMPLE_BUFFERS_EXT 0x2041
+#define WGL_SAMPLES_EXT 0x2042
+
+#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample)
+
+#endif /* WGL_EXT_multisample */
+
+/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */
+
+#ifndef WGL_EXT_pbuffer
+#define WGL_EXT_pbuffer 1
+
+#define WGL_DRAW_TO_PBUFFER_EXT 0x202D
+#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E
+#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F
+#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030
+#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031
+#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032
+#define WGL_PBUFFER_LARGEST_EXT 0x2033
+#define WGL_PBUFFER_WIDTH_EXT 0x2034
+#define WGL_PBUFFER_HEIGHT_EXT 0x2035
+
+DECLARE_HANDLE(HPBUFFEREXT);
+
+typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList);
+typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer);
+typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer);
+typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue);
+typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC);
+
+#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT)
+#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT)
+#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT)
+#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT)
+#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT)
+
+#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer)
+
+#endif /* WGL_EXT_pbuffer */
+
+/* -------------------------- WGL_EXT_pixel_format ------------------------- */
+
+#ifndef WGL_EXT_pixel_format
+#define WGL_EXT_pixel_format 1
+
+#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000
+#define WGL_DRAW_TO_WINDOW_EXT 0x2001
+#define WGL_DRAW_TO_BITMAP_EXT 0x2002
+#define WGL_ACCELERATION_EXT 0x2003
+#define WGL_NEED_PALETTE_EXT 0x2004
+#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005
+#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006
+#define WGL_SWAP_METHOD_EXT 0x2007
+#define WGL_NUMBER_OVERLAYS_EXT 0x2008
+#define WGL_NUMBER_UNDERLAYS_EXT 0x2009
+#define WGL_TRANSPARENT_EXT 0x200A
+#define WGL_TRANSPARENT_VALUE_EXT 0x200B
+#define WGL_SHARE_DEPTH_EXT 0x200C
+#define WGL_SHARE_STENCIL_EXT 0x200D
+#define WGL_SHARE_ACCUM_EXT 0x200E
+#define WGL_SUPPORT_GDI_EXT 0x200F
+#define WGL_SUPPORT_OPENGL_EXT 0x2010
+#define WGL_DOUBLE_BUFFER_EXT 0x2011
+#define WGL_STEREO_EXT 0x2012
+#define WGL_PIXEL_TYPE_EXT 0x2013
+#define WGL_COLOR_BITS_EXT 0x2014
+#define WGL_RED_BITS_EXT 0x2015
+#define WGL_RED_SHIFT_EXT 0x2016
+#define WGL_GREEN_BITS_EXT 0x2017
+#define WGL_GREEN_SHIFT_EXT 0x2018
+#define WGL_BLUE_BITS_EXT 0x2019
+#define WGL_BLUE_SHIFT_EXT 0x201A
+#define WGL_ALPHA_BITS_EXT 0x201B
+#define WGL_ALPHA_SHIFT_EXT 0x201C
+#define WGL_ACCUM_BITS_EXT 0x201D
+#define WGL_ACCUM_RED_BITS_EXT 0x201E
+#define WGL_ACCUM_GREEN_BITS_EXT 0x201F
+#define WGL_ACCUM_BLUE_BITS_EXT 0x2020
+#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021
+#define WGL_DEPTH_BITS_EXT 0x2022
+#define WGL_STENCIL_BITS_EXT 0x2023
+#define WGL_AUX_BUFFERS_EXT 0x2024
+#define WGL_NO_ACCELERATION_EXT 0x2025
+#define WGL_GENERIC_ACCELERATION_EXT 0x2026
+#define WGL_FULL_ACCELERATION_EXT 0x2027
+#define WGL_SWAP_EXCHANGE_EXT 0x2028
+#define WGL_SWAP_COPY_EXT 0x2029
+#define WGL_SWAP_UNDEFINED_EXT 0x202A
+#define WGL_TYPE_RGBA_EXT 0x202B
+#define WGL_TYPE_COLORINDEX_EXT 0x202C
+
+typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues);
+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues);
+
+#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT)
+#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT)
+#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT)
+
+#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format)
+
+#endif /* WGL_EXT_pixel_format */
+
+/* -------------------------- WGL_EXT_swap_control ------------------------- */
+
+#ifndef WGL_EXT_swap_control
+#define WGL_EXT_swap_control 1
+
+typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);
+typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
+
+#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT)
+#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT)
+
+#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control)
+
+#endif /* WGL_EXT_swap_control */
+
+/* --------------------- WGL_I3D_digital_video_control --------------------- */
+
+#ifndef WGL_I3D_digital_video_control
+#define WGL_I3D_digital_video_control 1
+
+#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050
+#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051
+#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052
+#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053
+
+typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue);
+typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue);
+
+#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D)
+#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D)
+
+#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control)
+
+#endif /* WGL_I3D_digital_video_control */
+
+/* ----------------------------- WGL_I3D_gamma ----------------------------- */
+
+#ifndef WGL_I3D_gamma
+#define WGL_I3D_gamma 1
+
+#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E
+#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F
+
+typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue);
+typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue);
+typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue);
+typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue);
+
+#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D)
+#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D)
+#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D)
+#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D)
+
+#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma)
+
+#endif /* WGL_I3D_gamma */
+
+/* ---------------------------- WGL_I3D_genlock ---------------------------- */
+
+#ifndef WGL_I3D_genlock
+#define WGL_I3D_genlock 1
+
+#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044
+#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045
+#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046
+#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047
+#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048
+#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049
+#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A
+#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B
+#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C
+
+typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC);
+typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC);
+typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate);
+typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay);
+typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge);
+typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource);
+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate);
+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay);
+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge);
+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource);
+typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag);
+typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay);
+
+#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D)
+#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D)
+#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D)
+#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D)
+#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D)
+#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D)
+#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D)
+#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D)
+#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D)
+#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D)
+#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D)
+#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D)
+
+#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock)
+
+#endif /* WGL_I3D_genlock */
+
+/* -------------------------- WGL_I3D_image_buffer ------------------------- */
+
+#ifndef WGL_I3D_image_buffer
+#define WGL_I3D_image_buffer 1
+
+#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001
+#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002
+
+typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count);
+typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags);
+typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress);
+typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count);
+
+#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D)
+#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D)
+#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D)
+#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D)
+
+#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer)
+
+#endif /* WGL_I3D_image_buffer */
+
+/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */
+
+#ifndef WGL_I3D_swap_frame_lock
+#define WGL_I3D_swap_frame_lock 1
+
+typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID);
+typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID);
+typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag);
+typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag);
+
+#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D)
+#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D)
+#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D)
+#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D)
+
+#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock)
+
+#endif /* WGL_I3D_swap_frame_lock */
+
+/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */
+
+#ifndef WGL_I3D_swap_frame_usage
+#define WGL_I3D_swap_frame_usage 1
+
+typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void);
+typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void);
+typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage);
+typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage);
+
+#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D)
+#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D)
+#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D)
+#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D)
+
+#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage)
+
+#endif /* WGL_I3D_swap_frame_usage */
+
+/* -------------------------- WGL_NV_float_buffer -------------------------- */
+
+#ifndef WGL_NV_float_buffer
+#define WGL_NV_float_buffer 1
+
+#define WGL_FLOAT_COMPONENTS_NV 0x20B0
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4
+#define WGL_TEXTURE_FLOAT_R_NV 0x20B5
+#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6
+#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7
+#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8
+
+#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer)
+
+#endif /* WGL_NV_float_buffer */
+
+/* ---------------------- WGL_NV_render_depth_texture ---------------------- */
+
+#ifndef WGL_NV_render_depth_texture
+#define WGL_NV_render_depth_texture 1
+
+#define WGL_NO_TEXTURE_ARB 0x2077
+#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4
+#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5
+#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6
+#define WGL_DEPTH_COMPONENT_NV 0x20A7
+
+#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture)
+
+#endif /* WGL_NV_render_depth_texture */
+
+/* -------------------- WGL_NV_render_texture_rectangle -------------------- */
+
+#ifndef WGL_NV_render_texture_rectangle
+#define WGL_NV_render_texture_rectangle 1
+
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1
+#define WGL_TEXTURE_RECTANGLE_NV 0x20A2
+
+#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle)
+
+#endif /* WGL_NV_render_texture_rectangle */
+
+/* ----------------------- WGL_NV_vertex_array_range ----------------------- */
+
+#ifndef WGL_NV_vertex_array_range
+#define WGL_NV_vertex_array_range 1
+
+typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority);
+typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer);
+
+#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV)
+#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV)
+
+#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range)
+
+#endif /* WGL_NV_vertex_array_range */
+
+/* -------------------------- WGL_OML_sync_control ------------------------- */
+
+#ifndef WGL_OML_sync_control
+#define WGL_OML_sync_control 1
+
+typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator);
+typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc);
+typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);
+typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);
+typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc);
+typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc);
+
+#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML)
+#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML)
+#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML)
+#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML)
+#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML)
+#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML)
+
+#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control)
+
+#endif /* WGL_OML_sync_control */
+
+/* ------------------------------------------------------------------------- */
+
+#ifdef GLEW_MX
+#define WGLEW_EXPORT
+#else
+#define WGLEW_EXPORT GLEWAPI
+#endif /* GLEW_MX */
+
+#ifdef GLEW_MX
+struct WGLEWContextStruct
+{
+#endif /* GLEW_MX */
+
+WGLEW_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB;
+WGLEW_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB;
+WGLEW_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB;
+WGLEW_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB;
+
+WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB;
+
+WGLEW_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB;
+WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB;
+
+WGLEW_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB;
+WGLEW_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB;
+WGLEW_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB;
+WGLEW_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB;
+WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB;
+
+WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB;
+WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB;
+WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB;
+
+WGLEW_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB;
+WGLEW_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB;
+WGLEW_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB;
+
+WGLEW_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT;
+WGLEW_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT;
+WGLEW_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT;
+WGLEW_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT;
+
+WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT;
+
+WGLEW_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT;
+WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT;
+
+WGLEW_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT;
+WGLEW_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT;
+WGLEW_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT;
+WGLEW_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT;
+WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT;
+
+WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT;
+WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT;
+WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT;
+
+WGLEW_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT;
+WGLEW_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT;
+
+WGLEW_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D;
+WGLEW_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D;
+
+WGLEW_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D;
+WGLEW_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D;
+WGLEW_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D;
+WGLEW_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D;
+
+WGLEW_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D;
+WGLEW_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D;
+WGLEW_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D;
+WGLEW_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D;
+WGLEW_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D;
+WGLEW_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D;
+WGLEW_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D;
+WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D;
+WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D;
+WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D;
+WGLEW_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D;
+WGLEW_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D;
+
+WGLEW_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D;
+WGLEW_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D;
+WGLEW_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D;
+WGLEW_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D;
+
+WGLEW_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D;
+WGLEW_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D;
+WGLEW_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D;
+WGLEW_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D;
+
+WGLEW_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D;
+WGLEW_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D;
+WGLEW_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D;
+WGLEW_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D;
+
+WGLEW_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV;
+WGLEW_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV;
+
+WGLEW_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML;
+WGLEW_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML;
+WGLEW_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML;
+WGLEW_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML;
+WGLEW_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML;
+WGLEW_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML;
+WGLEW_EXPORT GLboolean __WGLEW_3DFX_multisample;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_buffer_region;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_extensions_string;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_make_current_read;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_multisample;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_pbuffer;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format_float;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_render_texture;
+WGLEW_EXPORT GLboolean __WGLEW_ATI_pixel_format_float;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_depth_float;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_display_color_table;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_extensions_string;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_make_current_read;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_multisample;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_pbuffer;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_swap_control;
+WGLEW_EXPORT GLboolean __WGLEW_I3D_digital_video_control;
+WGLEW_EXPORT GLboolean __WGLEW_I3D_gamma;
+WGLEW_EXPORT GLboolean __WGLEW_I3D_genlock;
+WGLEW_EXPORT GLboolean __WGLEW_I3D_image_buffer;
+WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock;
+WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage;
+WGLEW_EXPORT GLboolean __WGLEW_NV_float_buffer;
+WGLEW_EXPORT GLboolean __WGLEW_NV_render_depth_texture;
+WGLEW_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle;
+WGLEW_EXPORT GLboolean __WGLEW_NV_vertex_array_range;
+WGLEW_EXPORT GLboolean __WGLEW_OML_sync_control;
+
+#ifdef GLEW_MX
+}; /* WGLEWContextStruct */
+#endif /* GLEW_MX */
+
+/* ------------------------------------------------------------------------- */
+
+#ifdef GLEW_MX
+
+typedef struct WGLEWContextStruct WGLEWContext;
+GLEWAPI GLenum wglewContextInit (WGLEWContext* ctx);
+
+#define WGLEW_GET_VAR(x) wglewGetContext()->x
+#define WGLEW_GET_FUN(x) wglewGetContext()->x
+
+#else /* GLEW_MX */
+
+#define WGLEW_GET_VAR(x) x
+#define WGLEW_GET_FUN(x) x
+
+#endif /* GLEW_MX */
+
+GLEWAPI GLboolean wglewGetExtension (const char* name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#undef GLEWAPI
+
+#endif /* __wglew_h__ */
Index: /tags/DummyModules/VUT/chcdemo/GL/glxew.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/GL/glxew.h	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/GL/glxew.h	(revision 10)
@@ -0,0 +1,1055 @@
+/*
+** The OpenGL Extension Wrangler Library
+** Copyright (C) 2004, 2003, 2002, Milan Ikits <milan ikits[at]ieee org>
+** Copyright (C) 2004, 2003, 2002, Marcelo E. Magallon <mmagallo[at]debian org>
+** Copyright (C) 2002, Lev Povalahev
+** All rights reserved.
+** 
+** Redistribution and use in source and binary forms, with or without 
+** modification, are permitted provided that the following conditions are met:
+** 
+** * Redistributions of source code must retain the above copyright notice, 
+**   this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright notice, 
+**   this list of conditions and the following disclaimer in the documentation 
+**   and/or other materials provided with the distribution.
+** * The name of the author may be used to endorse or promote products 
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+** THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+** The contents of this file are subject to the GLX Public License Version 1.0
+** (the "License"). You may not use this file except in compliance with the
+** License. You may obtain a copy of the License at Silicon Graphics, Inc.,
+** attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043
+** or at http://www.sgi.com/software/opensource/glx/license.html.
+**
+** Software distributed under the License is distributed on an "AS IS"
+** basis. ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY
+** IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR
+** PURPOSE OR OF NON- INFRINGEMENT. See the License for the specific
+** language governing rights and limitations under the License.
+**
+** The Original Software is GLX version 1.2 source code, released February,
+** 1999. The developer of the Original Software is Silicon Graphics, Inc.
+** Those portions of the Subject Software created by Silicon Graphics, Inc.
+** are Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved.
+*/
+
+#ifndef __glxew_h__
+#define __glxew_h__
+#define __GLXEW_H__
+
+#ifdef __glxext_h_
+#error glxext.h included before glxew.h
+#endif
+
+#define __glxext_h_
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xmd.h>
+#include <GL/glew.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ---------------------------- GLX_VERSION_1_0 --------------------------- */
+
+#ifndef GLX_VERSION_1_0
+#define GLX_VERSION_1_0 1
+
+#define GLX_USE_GL 1
+#define GLX_BUFFER_SIZE 2
+#define GLX_LEVEL 3
+#define GLX_RGBA 4
+#define GLX_DOUBLEBUFFER 5
+#define GLX_STEREO 6
+#define GLX_AUX_BUFFERS 7
+#define GLX_RED_SIZE 8
+#define GLX_GREEN_SIZE 9
+#define GLX_BLUE_SIZE 10
+#define GLX_ALPHA_SIZE 11
+#define GLX_DEPTH_SIZE 12
+#define GLX_STENCIL_SIZE 13
+#define GLX_ACCUM_RED_SIZE 14
+#define GLX_ACCUM_GREEN_SIZE 15
+#define GLX_ACCUM_BLUE_SIZE 16
+#define GLX_ACCUM_ALPHA_SIZE 17
+#define GLX_BAD_SCREEN 1
+#define GLX_BAD_ATTRIBUTE 2
+#define GLX_NO_EXTENSION 3
+#define GLX_BAD_VISUAL 4
+#define GLX_BAD_CONTEXT 5
+#define GLX_BAD_VALUE 6
+#define GLX_BAD_ENUM 7
+
+typedef XID GLXDrawable;
+typedef XID GLXPixmap;
+typedef struct __GLXcontextRec *GLXContext;
+
+extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase);
+extern Bool glXQueryVersion (Display *dpy, int *major, int *minor);
+extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value);
+extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList);
+extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap);
+extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix);
+extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);
+extern void glXDestroyContext (Display *dpy, GLXContext ctx);
+extern Bool glXIsDirect (Display *dpy, GLXContext ctx);
+extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLuint mask);
+extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx);
+extern GLXContext glXGetCurrentContext (void);
+extern GLXDrawable glXGetCurrentDrawable (void);
+extern void glXWaitGL (void);
+extern void glXWaitX (void);
+extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable);
+extern void glXUseXFont (Font font, int first, int count, int listBase);
+
+#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0)
+
+#endif /* GLX_VERSION_1_0 */
+
+/* ---------------------------- GLX_VERSION_1_1 --------------------------- */
+
+#ifndef GLX_VERSION_1_1
+#define GLX_VERSION_1_1
+
+#define GLX_VENDOR 0x1
+#define GLX_VERSION 0x2
+#define GLX_EXTENSIONS 0x3
+
+extern const char* glXQueryExtensionsString (Display *dpy, int screen);
+extern const char* glXGetClientString (Display *dpy, int name);
+extern const char* glXQueryServerString (Display *dpy, int screen, int name);
+
+#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1)
+
+#endif /* GLX_VERSION_1_1 */
+
+/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */
+
+#ifndef GLX_VERSION_1_2
+#define GLX_VERSION_1_2 1
+
+typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void);
+
+#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay)
+
+#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2)
+
+#endif /* GLX_VERSION_1_2 */
+
+/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */
+
+#ifndef GLX_VERSION_1_3
+#define GLX_VERSION_1_3 1
+
+#define GLX_RGBA_BIT 0x00000001
+#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001
+#define GLX_WINDOW_BIT 0x00000001
+#define GLX_COLOR_INDEX_BIT 0x00000002
+#define GLX_PIXMAP_BIT 0x00000002
+#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002
+#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004
+#define GLX_PBUFFER_BIT 0x00000004
+#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008
+#define GLX_AUX_BUFFERS_BIT 0x00000010
+#define GLX_CONFIG_CAVEAT 0x20
+#define GLX_DEPTH_BUFFER_BIT 0x00000020
+#define GLX_X_VISUAL_TYPE 0x22
+#define GLX_TRANSPARENT_TYPE 0x23
+#define GLX_TRANSPARENT_INDEX_VALUE 0x24
+#define GLX_TRANSPARENT_RED_VALUE 0x25
+#define GLX_TRANSPARENT_GREEN_VALUE 0x26
+#define GLX_TRANSPARENT_BLUE_VALUE 0x27
+#define GLX_TRANSPARENT_ALPHA_VALUE 0x28
+#define GLX_STENCIL_BUFFER_BIT 0x00000040
+#define GLX_ACCUM_BUFFER_BIT 0x00000080
+#define GLX_NONE 0x8000
+#define GLX_SLOW_CONFIG 0x8001
+#define GLX_TRUE_COLOR 0x8002
+#define GLX_DIRECT_COLOR 0x8003
+#define GLX_PSEUDO_COLOR 0x8004
+#define GLX_STATIC_COLOR 0x8005
+#define GLX_GRAY_SCALE 0x8006
+#define GLX_STATIC_GRAY 0x8007
+#define GLX_TRANSPARENT_RGB 0x8008
+#define GLX_TRANSPARENT_INDEX 0x8009
+#define GLX_VISUAL_ID 0x800B
+#define GLX_SCREEN 0x800C
+#define GLX_NON_CONFORMANT_CONFIG 0x800D
+#define GLX_DRAWABLE_TYPE 0x8010
+#define GLX_RENDER_TYPE 0x8011
+#define GLX_X_RENDERABLE 0x8012
+#define GLX_FBCONFIG_ID 0x8013
+#define GLX_RGBA_TYPE 0x8014
+#define GLX_COLOR_INDEX_TYPE 0x8015
+#define GLX_MAX_PBUFFER_WIDTH 0x8016
+#define GLX_MAX_PBUFFER_HEIGHT 0x8017
+#define GLX_MAX_PBUFFER_PIXELS 0x8018
+#define GLX_PRESERVED_CONTENTS 0x801B
+#define GLX_LARGEST_PBUFFER 0x801C
+#define GLX_WIDTH 0x801D
+#define GLX_HEIGHT 0x801E
+#define GLX_EVENT_MASK 0x801F
+#define GLX_DAMAGED 0x8020
+#define GLX_SAVED 0x8021
+#define GLX_WINDOW 0x8022
+#define GLX_PBUFFER 0x8023
+#define GLX_PBUFFER_HEIGHT 0x8040
+#define GLX_PBUFFER_WIDTH 0x8041
+#define GLX_PBUFFER_CLOBBER_MASK 0x08000000
+#define GLX_DONT_CARE 0xFFFFFFFF
+
+typedef XID GLXFBConfigID;
+typedef XID GLXWindow;
+typedef XID GLXPbuffer;
+typedef struct __GLXFBConfigRec *GLXFBConfig;
+typedef struct { int event_type; int draw_type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; unsigned int buffer_mask; unsigned int aux_buffer; int x, y; int width, height; int count; } GLXPbufferClobberEvent;
+typedef union __GLXEvent { GLXPbufferClobberEvent glxpbufferclobber; long pad[24]; } GLXEvent;
+
+typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements);
+typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
+typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list);
+typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list);
+typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list);
+typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf);
+typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap);
+typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win);
+typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void);
+typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value);
+typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements);
+typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask);
+typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config);
+typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
+typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value);
+typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
+typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask);
+
+#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig)
+#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext)
+#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer)
+#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap)
+#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow)
+#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer)
+#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap)
+#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow)
+#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable)
+#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib)
+#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs)
+#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent)
+#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig)
+#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent)
+#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext)
+#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable)
+#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent)
+
+#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3)
+
+#endif /* GLX_VERSION_1_3 */
+
+/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */
+
+#ifndef GLX_VERSION_1_4
+#define GLX_VERSION_1_4 1
+
+#define GLX_SAMPLE_BUFFERS 100000
+#define GLX_SAMPLES 100001
+
+extern void ( * glXGetProcAddress (const GLubyte *procName)) (void);
+
+#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4)
+
+#endif /* GLX_VERSION_1_4 */
+
+/* -------------------------- GLX_3DFX_multisample ------------------------- */
+
+#ifndef GLX_3DFX_multisample
+#define GLX_3DFX_multisample 1
+
+#define GLX_SAMPLE_BUFFERS_3DFX 0x8050
+#define GLX_SAMPLES_3DFX 0x8051
+
+#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample)
+
+#endif /* GLX_3DFX_multisample */
+
+/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */
+
+#ifndef GLX_ARB_fbconfig_float
+#define GLX_ARB_fbconfig_float 1
+
+#define GLX_RGBA_FLOAT_BIT 0x00000004
+#define GLX_RGBA_FLOAT_TYPE 0x20B9
+
+#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float)
+
+#endif /* GLX_ARB_fbconfig_float */
+
+/* ------------------------ GLX_ARB_get_proc_address ----------------------- */
+
+#ifndef GLX_ARB_get_proc_address
+#define GLX_ARB_get_proc_address 1
+
+extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void);
+
+#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address)
+
+#endif /* GLX_ARB_get_proc_address */
+
+/* -------------------------- GLX_ARB_multisample -------------------------- */
+
+#ifndef GLX_ARB_multisample
+#define GLX_ARB_multisample 1
+
+#define GLX_SAMPLE_BUFFERS_ARB 100000
+#define GLX_SAMPLES_ARB 100001
+
+#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample)
+
+#endif /* GLX_ARB_multisample */
+
+/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */
+
+#ifndef GLX_ATI_pixel_format_float
+#define GLX_ATI_pixel_format_float 1
+
+#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100
+
+#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float)
+
+#endif /* GLX_ATI_pixel_format_float */
+
+/* ------------------------- GLX_ATI_render_texture ------------------------ */
+
+#ifndef GLX_ATI_render_texture
+#define GLX_ATI_render_texture 1
+
+#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800
+#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801
+#define GLX_TEXTURE_FORMAT_ATI 0x9802
+#define GLX_TEXTURE_TARGET_ATI 0x9803
+#define GLX_MIPMAP_TEXTURE_ATI 0x9804
+#define GLX_TEXTURE_RGB_ATI 0x9805
+#define GLX_TEXTURE_RGBA_ATI 0x9806
+#define GLX_NO_TEXTURE_ATI 0x9807
+#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808
+#define GLX_TEXTURE_1D_ATI 0x9809
+#define GLX_TEXTURE_2D_ATI 0x980A
+#define GLX_MIPMAP_LEVEL_ATI 0x980B
+#define GLX_CUBE_MAP_FACE_ATI 0x980C
+#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D
+#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E
+#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F
+#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810
+#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811
+#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812
+#define GLX_FRONT_LEFT_ATI 0x9813
+#define GLX_FRONT_RIGHT_ATI 0x9814
+#define GLX_BACK_LEFT_ATI 0x9815
+#define GLX_BACK_RIGHT_ATI 0x9816
+#define GLX_AUX0_ATI 0x9817
+#define GLX_AUX1_ATI 0x9818
+#define GLX_AUX2_ATI 0x9819
+#define GLX_AUX3_ATI 0x981A
+#define GLX_AUX4_ATI 0x981B
+#define GLX_AUX5_ATI 0x981C
+#define GLX_AUX6_ATI 0x981D
+#define GLX_AUX7_ATI 0x981E
+#define GLX_AUX8_ATI 0x981F
+#define GLX_AUX9_ATI 0x9820
+#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821
+#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822
+
+typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer);
+typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list);
+typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer);
+
+#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI)
+#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI)
+#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI)
+
+#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture)
+
+#endif /* GLX_ATI_render_texture */
+
+/* ------------------------- GLX_EXT_import_context ------------------------ */
+
+#ifndef GLX_EXT_import_context
+#define GLX_EXT_import_context 1
+
+#define GLX_SHARE_CONTEXT_EXT 0x800A
+#define GLX_VISUAL_ID_EXT 0x800B
+#define GLX_SCREEN_EXT 0x800C
+
+typedef XID GLXContextID;
+
+typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context);
+typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context);
+typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID);
+typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value);
+
+#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT)
+#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT)
+#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT)
+#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT)
+
+#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context)
+
+#endif /* GLX_EXT_import_context */
+
+/* -------------------------- GLX_EXT_scene_marker ------------------------- */
+
+#ifndef GLX_EXT_scene_marker
+#define GLX_EXT_scene_marker 1
+
+#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker)
+
+#endif /* GLX_EXT_scene_marker */
+
+/* -------------------------- GLX_EXT_visual_info -------------------------- */
+
+#ifndef GLX_EXT_visual_info
+#define GLX_EXT_visual_info 1
+
+#define GLX_X_VISUAL_TYPE_EXT 0x22
+#define GLX_TRANSPARENT_TYPE_EXT 0x23
+#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24
+#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25
+#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26
+#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27
+#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28
+#define GLX_NONE_EXT 0x8000
+#define GLX_TRUE_COLOR_EXT 0x8002
+#define GLX_DIRECT_COLOR_EXT 0x8003
+#define GLX_PSEUDO_COLOR_EXT 0x8004
+#define GLX_STATIC_COLOR_EXT 0x8005
+#define GLX_GRAY_SCALE_EXT 0x8006
+#define GLX_STATIC_GRAY_EXT 0x8007
+#define GLX_TRANSPARENT_RGB_EXT 0x8008
+#define GLX_TRANSPARENT_INDEX_EXT 0x8009
+
+#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info)
+
+#endif /* GLX_EXT_visual_info */
+
+/* ------------------------- GLX_EXT_visual_rating ------------------------- */
+
+#ifndef GLX_EXT_visual_rating
+#define GLX_EXT_visual_rating 1
+
+#define GLX_VISUAL_CAVEAT_EXT 0x20
+#define GLX_SLOW_VISUAL_EXT 0x8001
+#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D
+
+#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating)
+
+#endif /* GLX_EXT_visual_rating */
+
+/* -------------------------- GLX_MESA_agp_offset -------------------------- */
+
+#ifndef GLX_MESA_agp_offset
+#define GLX_MESA_agp_offset 1
+
+typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer);
+
+#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA)
+
+#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset)
+
+#endif /* GLX_MESA_agp_offset */
+
+/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */
+
+#ifndef GLX_MESA_copy_sub_buffer
+#define GLX_MESA_copy_sub_buffer 1
+
+typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height);
+
+#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA)
+
+#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer)
+
+#endif /* GLX_MESA_copy_sub_buffer */
+
+/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */
+
+#ifndef GLX_MESA_pixmap_colormap
+#define GLX_MESA_pixmap_colormap 1
+
+typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap);
+
+#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA)
+
+#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap)
+
+#endif /* GLX_MESA_pixmap_colormap */
+
+/* ------------------------ GLX_MESA_release_buffers ----------------------- */
+
+#ifndef GLX_MESA_release_buffers
+#define GLX_MESA_release_buffers 1
+
+typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d);
+
+#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA)
+
+#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers)
+
+#endif /* GLX_MESA_release_buffers */
+
+/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */
+
+#ifndef GLX_MESA_set_3dfx_mode
+#define GLX_MESA_set_3dfx_mode 1
+
+#define GLX_3DFX_WINDOW_MODE_MESA 0x1
+#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2
+
+typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode);
+
+#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA)
+
+#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode)
+
+#endif /* GLX_MESA_set_3dfx_mode */
+
+/* -------------------------- GLX_NV_float_buffer -------------------------- */
+
+#ifndef GLX_NV_float_buffer
+#define GLX_NV_float_buffer 1
+
+#define GLX_FLOAT_COMPONENTS_NV 0x20B0
+
+#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer)
+
+#endif /* GLX_NV_float_buffer */
+
+/* ----------------------- GLX_NV_vertex_array_range ----------------------- */
+
+#ifndef GLX_NV_vertex_array_range
+#define GLX_NV_vertex_array_range 1
+
+typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority);
+typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer);
+
+#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV)
+#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV)
+
+#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range)
+
+#endif /* GLX_NV_vertex_array_range */
+
+/* -------------------------- GLX_OML_swap_method -------------------------- */
+
+#ifndef GLX_OML_swap_method
+#define GLX_OML_swap_method 1
+
+#define GLX_SWAP_METHOD_OML 0x8060
+#define GLX_SWAP_EXCHANGE_OML 0x8061
+#define GLX_SWAP_COPY_OML 0x8062
+#define GLX_SWAP_UNDEFINED_OML 0x8063
+
+#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method)
+
+#endif /* GLX_OML_swap_method */
+
+/* -------------------------- GLX_OML_sync_control ------------------------- */
+
+#if !defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
+#include <inttypes.h>
+#define GLX_OML_sync_control 1
+
+typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator);
+typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc);
+typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder);
+typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc);
+typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc);
+
+#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML)
+#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML)
+#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML)
+#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML)
+#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML)
+
+#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control)
+
+#endif /* GLX_OML_sync_control */
+
+/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */
+
+#ifndef GLX_SGIS_blended_overlay
+#define GLX_SGIS_blended_overlay 1
+
+#define GLX_BLENDED_RGBA_SGIS 0x8025
+
+#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay)
+
+#endif /* GLX_SGIS_blended_overlay */
+
+/* -------------------------- GLX_SGIS_color_range ------------------------- */
+
+#ifndef GLX_SGIS_color_range
+#define GLX_SGIS_color_range 1
+
+#define GLX_MIN_RED_SGIS 0
+#define GLX_MAX_GREEN_SGIS 0
+#define GLX_MIN_BLUE_SGIS 0
+#define GLX_MAX_ALPHA_SGIS 0
+#define GLX_MIN_GREEN_SGIS 0
+#define GLX_MIN_ALPHA_SGIS 0
+#define GLX_MAX_RED_SGIS 0
+#define GLX_EXTENDED_RANGE_SGIS 0
+#define GLX_MAX_BLUE_SGIS 0
+
+#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range)
+
+#endif /* GLX_SGIS_color_range */
+
+/* -------------------------- GLX_SGIS_multisample ------------------------- */
+
+#ifndef GLX_SGIS_multisample
+#define GLX_SGIS_multisample 1
+
+#define GLX_SAMPLE_BUFFERS_SGIS 100000
+#define GLX_SAMPLES_SGIS 100001
+
+#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample)
+
+#endif /* GLX_SGIS_multisample */
+
+/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */
+
+#ifndef GLX_SGIS_shared_multisample
+#define GLX_SGIS_shared_multisample 1
+
+#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026
+#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027
+
+#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample)
+
+#endif /* GLX_SGIS_shared_multisample */
+
+/* --------------------------- GLX_SGIX_fbconfig --------------------------- */
+
+#ifndef GLX_SGIX_fbconfig
+#define GLX_SGIX_fbconfig 1
+
+#define GLX_WINDOW_BIT_SGIX 0x00000001
+#define GLX_RGBA_BIT_SGIX 0x00000001
+#define GLX_PIXMAP_BIT_SGIX 0x00000002
+#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002
+#define GLX_SCREEN_EXT 0x800C
+#define GLX_DRAWABLE_TYPE_SGIX 0x8010
+#define GLX_RENDER_TYPE_SGIX 0x8011
+#define GLX_X_RENDERABLE_SGIX 0x8012
+#define GLX_FBCONFIG_ID_SGIX 0x8013
+#define GLX_RGBA_TYPE_SGIX 0x8014
+#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015
+
+typedef XID GLXFBConfigIDSGIX;
+typedef struct __GLXFBConfigRec *GLXFBConfigSGIX;
+
+typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements);
+typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
+typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap);
+typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value);
+typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis);
+typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config);
+
+#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX)
+#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX)
+#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX)
+#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX)
+#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX)
+#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX)
+
+#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig)
+
+#endif /* GLX_SGIX_fbconfig */
+
+/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */
+
+#ifndef GLX_SGIX_pbuffer
+#define GLX_SGIX_pbuffer 1
+
+#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001
+#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002
+#define GLX_PBUFFER_BIT_SGIX 0x00000004
+#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004
+#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008
+#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010
+#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020
+#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040
+#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080
+#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100
+#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016
+#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017
+#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018
+#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019
+#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A
+#define GLX_PRESERVED_CONTENTS_SGIX 0x801B
+#define GLX_LARGEST_PBUFFER_SGIX 0x801C
+#define GLX_WIDTH_SGIX 0x801D
+#define GLX_HEIGHT_SGIX 0x801E
+#define GLX_EVENT_MASK_SGIX 0x801F
+#define GLX_DAMAGED_SGIX 0x8020
+#define GLX_SAVED_SGIX 0x8021
+#define GLX_WINDOW_SGIX 0x8022
+#define GLX_PBUFFER_SGIX 0x8023
+#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000
+
+typedef XID GLXPbufferSGIX;
+typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX;
+
+typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list);
+typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf);
+typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask);
+typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value);
+typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask);
+
+#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX)
+#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX)
+#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX)
+#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX)
+#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX)
+
+#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer)
+
+#endif /* GLX_SGIX_pbuffer */
+
+/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */
+
+#ifndef GLX_SGIX_swap_barrier
+#define GLX_SGIX_swap_barrier 1
+
+typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier);
+typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max);
+
+#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX)
+#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX)
+
+#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier)
+
+#endif /* GLX_SGIX_swap_barrier */
+
+/* -------------------------- GLX_SGIX_swap_group -------------------------- */
+
+#ifndef GLX_SGIX_swap_group
+#define GLX_SGIX_swap_group 1
+
+typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member);
+
+#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX)
+
+#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group)
+
+#endif /* GLX_SGIX_swap_group */
+
+/* ------------------------- GLX_SGIX_video_resize ------------------------- */
+
+#ifndef GLX_SGIX_video_resize
+#define GLX_SGIX_video_resize 1
+
+#define GLX_SYNC_FRAME_SGIX 0x00000000
+#define GLX_SYNC_SWAP_SGIX 0x00000001
+
+typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window);
+typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h);
+typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype);
+typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h);
+typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh);
+
+#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX)
+#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX)
+#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX)
+#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX)
+#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX)
+
+#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize)
+
+#endif /* GLX_SGIX_video_resize */
+
+/* ---------------------- GLX_SGIX_visual_select_group --------------------- */
+
+#ifndef GLX_SGIX_visual_select_group
+#define GLX_SGIX_visual_select_group 1
+
+#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028
+
+#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group)
+
+#endif /* GLX_SGIX_visual_select_group */
+
+/* ---------------------------- GLX_SGI_cushion ---------------------------- */
+
+#ifndef GLX_SGI_cushion
+#define GLX_SGI_cushion 1
+
+typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion);
+
+#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI)
+
+#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion)
+
+#endif /* GLX_SGI_cushion */
+
+/* ----------------------- GLX_SGI_make_current_read ----------------------- */
+
+#ifndef GLX_SGI_make_current_read
+#define GLX_SGI_make_current_read 1
+
+typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void);
+typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
+
+#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI)
+#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI)
+
+#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read)
+
+#endif /* GLX_SGI_make_current_read */
+
+/* -------------------------- GLX_SGI_swap_control ------------------------- */
+
+#ifndef GLX_SGI_swap_control
+#define GLX_SGI_swap_control 1
+
+typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval);
+
+#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI)
+
+#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control)
+
+#endif /* GLX_SGI_swap_control */
+
+/* --------------------------- GLX_SGI_video_sync -------------------------- */
+
+#ifndef GLX_SGI_video_sync
+#define GLX_SGI_video_sync 1
+
+typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (uint* count);
+typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count);
+
+#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI)
+#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI)
+
+#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync)
+
+#endif /* GLX_SGI_video_sync */
+
+/* --------------------- GLX_SUN_get_transparent_index --------------------- */
+
+#ifndef GLX_SUN_get_transparent_index
+#define GLX_SUN_get_transparent_index 1
+
+typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex);
+
+#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN)
+
+#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index)
+
+#endif /* GLX_SUN_get_transparent_index */
+
+/* -------------------------- GLX_SUN_video_resize ------------------------- */
+
+#ifndef GLX_SUN_video_resize
+#define GLX_SUN_video_resize 1
+
+#define GLX_VIDEO_RESIZE_SUN 0x8171
+#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD
+
+typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor);
+typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor);
+
+#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN)
+#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN)
+
+#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize)
+
+#endif /* GLX_SUN_video_resize */
+
+/* ------------------------------------------------------------------------- */
+
+#ifdef GLEW_MX
+#define GLXEW_EXPORT
+#else
+#define GLXEW_EXPORT extern
+#endif /* GLEW_MX */
+
+extern PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay;
+
+extern PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig;
+extern PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext;
+extern PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer;
+extern PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap;
+extern PFNGLXCREATEWINDOWPROC __glewXCreateWindow;
+extern PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer;
+extern PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap;
+extern PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow;
+extern PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable;
+extern PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib;
+extern PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs;
+extern PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent;
+extern PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig;
+extern PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent;
+extern PFNGLXQUERYCONTEXTPROC __glewXQueryContext;
+extern PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable;
+extern PFNGLXSELECTEVENTPROC __glewXSelectEvent;
+
+extern PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI;
+extern PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI;
+extern PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI;
+
+extern PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT;
+extern PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT;
+extern PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT;
+extern PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT;
+
+extern PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA;
+
+extern PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA;
+
+extern PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA;
+
+extern PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA;
+
+extern PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA;
+
+extern PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV;
+extern PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV;
+
+#ifdef GLX_OML_sync_control
+extern PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML;
+extern PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML;
+extern PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML;
+extern PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML;
+extern PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML;
+#endif
+
+extern PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX;
+extern PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX;
+extern PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX;
+extern PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX;
+extern PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX;
+extern PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX;
+
+extern PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX;
+extern PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX;
+extern PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX;
+extern PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX;
+extern PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX;
+
+extern PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX;
+extern PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX;
+
+extern PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX;
+
+extern PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX;
+extern PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX;
+extern PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX;
+extern PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX;
+extern PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX;
+
+extern PFNGLXCUSHIONSGIPROC __glewXCushionSGI;
+
+extern PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI;
+extern PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI;
+
+extern PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI;
+
+extern PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI;
+extern PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI;
+
+extern PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN;
+
+extern PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN;
+extern PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN;
+
+#if defined(GLEW_MX)
+struct GLXEWContextStruct
+{
+#endif /* GLEW_MX */
+
+GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_0;
+GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_1;
+GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_2;
+GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_3;
+GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_4;
+GLXEW_EXPORT GLboolean __GLXEW_3DFX_multisample;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_fbconfig_float;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_get_proc_address;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_multisample;
+GLXEW_EXPORT GLboolean __GLXEW_ATI_pixel_format_float;
+GLXEW_EXPORT GLboolean __GLXEW_ATI_render_texture;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_import_context;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_scene_marker;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_info;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_rating;
+GLXEW_EXPORT GLboolean __GLXEW_MESA_agp_offset;
+GLXEW_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer;
+GLXEW_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap;
+GLXEW_EXPORT GLboolean __GLXEW_MESA_release_buffers;
+GLXEW_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode;
+GLXEW_EXPORT GLboolean __GLXEW_NV_float_buffer;
+GLXEW_EXPORT GLboolean __GLXEW_NV_vertex_array_range;
+GLXEW_EXPORT GLboolean __GLXEW_OML_swap_method;
+GLXEW_EXPORT GLboolean __GLXEW_OML_sync_control;
+GLXEW_EXPORT GLboolean __GLXEW_SGIS_blended_overlay;
+GLXEW_EXPORT GLboolean __GLXEW_SGIS_color_range;
+GLXEW_EXPORT GLboolean __GLXEW_SGIS_multisample;
+GLXEW_EXPORT GLboolean __GLXEW_SGIS_shared_multisample;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_fbconfig;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_pbuffer;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_barrier;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_group;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_video_resize;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_visual_select_group;
+GLXEW_EXPORT GLboolean __GLXEW_SGI_cushion;
+GLXEW_EXPORT GLboolean __GLXEW_SGI_make_current_read;
+GLXEW_EXPORT GLboolean __GLXEW_SGI_swap_control;
+GLXEW_EXPORT GLboolean __GLXEW_SGI_video_sync;
+GLXEW_EXPORT GLboolean __GLXEW_SUN_get_transparent_index;
+GLXEW_EXPORT GLboolean __GLXEW_SUN_video_resize;
+
+#ifdef GLEW_MX
+}; /* GLXEWContextStruct */
+#endif /* GLEW_MX */
+
+/* ------------------------------------------------------------------------ */
+
+#ifdef GLEW_MX
+
+typedef struct GLXEWContextStruct GLXEWContext;
+extern GLenum glxewContextInit (GLXEWContext* ctx);
+
+#define GLXEW_GET_VAR(x) glxewGetContext()->x
+#define GLXEW_GET_FUN(x) x
+
+#else /* GLEW_MX */
+
+#define GLXEW_GET_VAR(x) x
+#define GLXEW_GET_FUN(x) x
+
+#endif /* GLEW_MX */
+
+extern GLboolean glxewGetExtension (const char* name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __glxew_h__ */
Index: /tags/DummyModules/VUT/chcdemo/RenderTraverser.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/RenderTraverser.h	(revision 22)
+++ /tags/DummyModules/VUT/chcdemo/RenderTraverser.h	(revision 22)
@@ -0,0 +1,123 @@
+#ifndef NO_PRAGMA_ONCE
+#pragma once
+#endif
+
+#ifndef RENDERTRAVERSER_H
+#define RENDERTRAVERSER_H
+
+#include "glInterface.h"
+#include "HierarchyNode.h"
+#include <queue>
+//#include <priority_queue>
+#include <stack>
+
+using namespace std;
+
+typedef stack<HierarchyNode *> TraversalStack;
+typedef queue<HierarchyNode *> QueryQueue;
+typedef priority_queue<HierarchyNode *, vector<HierarchyNode *>, myless<vector<HierarchyNode *>::value_type> > PriorityQueue;
+
+class RenderTraverser
+{
+public:
+	enum {RENDER_CULL_FRUSTUM, RENDER_STOP_AND_WAIT, RENDER_COHERENT, NUM_RENDERMODES};
+
+	RenderTraverser();
+	//! Renders the scene with the specified method
+	/**
+		The mode is one of
+		RENDER_CULL_FRUSTUM: renders the scene with view frustum culling only
+		RENDER_STOP_AND_WAIT: renders the scene with the hierarchical stop and wait algorithm
+		RENDER_COHERENT: renders the scene with the coherent hierarchical algorithm
+	*/
+	void Render(int mode=RENDER_CULL_FRUSTUM);
+	//! sets the scene hierarchy.
+	void SetHierarchy(HierarchyNode *sceneRoot);
+	//! sets viewpoint
+	void SetViewpoint(Vector3 const &viewpoint);
+	//! sets view projection matrix
+	void SetProjViewMatrix(Matrix4x4 const &projViewMatrix);
+	//! returns root of hierarchy
+	HierarchyNode *GetHierarchy();
+	//! sets visible pixels threshold for visibility classification
+	void SetVisibilityThreshold(int threshold);
+	//! returns visibility threshold
+	int GetVisibilityThreshold();
+
+	// several statistics for a rendering pass
+	long GetRenderTime();
+	int GetNumTraversedNodes();
+	int GetNumQueryCulledNodes();
+	int GetNumFrustumCulledNodes();
+	int GetNumRenderedGeometry();
+
+	//! renders a visualization of the hierarchy
+	void RenderVisualization();
+
+	//! use optimization to take leaf nodes instead of bounding box for occlusion queries	
+	void SetUseOptimization(bool useOptimization);
+
+protected:
+
+	//! renders the scene with view frustum culling only
+	void RenderCullFrustum();
+	//! renders the scene with the hierarchical stop and wait algorithm
+	void RenderStopAndWait();
+	//! renders the scene with the coherent hierarchical algorithm and the query queye
+	void RenderCoherentWithQueue();
+	//! does some importand initialisations
+	void Preprocess();
+	
+	//! returns occlusion query result for specified node
+	int GetOcclusionQueryResult(HierarchyNode *node);
+	//! the node is traversed as usual
+	void TraverseNode(HierarchyNode *node);
+	//! visibility is pulled up from visibility of children 
+	void PullUpVisibility(HierarchyNode *node);
+	//! is result available from query queue?
+	bool ResultAvailable(HierarchyNode *node);
+	//! issues occlusion query for specified node
+	void IssueOcclusionQuery(HierarchyNode *node, bool wasVisible);
+	//! resets occlusion queries after a traversal
+	void ResetQueries();
+	//! does view frustum culling. returns intersect (if intersects view plane)
+	bool InsideViewFrustum(HierarchyNode *node, bool &intersects);
+	//! switches to normal render mode
+	void Switch2GLRenderState();
+	//! switches to occlusion query mode (geometry not rendered on the screen)
+	void Switch2GLQueryState();
+
+protected:
+
+	// the current clip planes of the view frustum
+	VecPlane mClipPlanes;
+	// the indices of the np-vertices of the bounding box for view frustum culling
+	int mNPVertexIndices[12];
+
+	Vector3 mViewpoint;
+	Matrix4x4 mProjViewMatrix;
+	HierarchyNode *mHierarchyRoot;
+	//TraversalStack mTraversalStack;
+	PriorityQueue mDistanceQueue; // use a priority queue rather than a renderstack
+	
+	//priority_queue<vector<HierarchyNode *>, HierarchyNode *> mPriorityQueue;
+	int mFrameID;
+	int mVisibilityThreshold;
+	unsigned int *mOcclusionQueries;
+	int mCurrentTestIdx;
+	bool mIsQueryMode;
+	
+	bool mIntersects;
+
+	// statistics
+	int mNumTraversedNodes;
+	int mNumQueryCulledNodes;
+	int mNumFrustumCulledNodes;
+	int mNumRenderedGeometry;
+
+	long mRenderTime;
+
+	bool mUseOptimization;
+};
+
+#endif // RENDERTRAVERSER_H
Index: /tags/DummyModules/VUT/chcdemo/HierarchyNode.cpp
===================================================================
--- /tags/DummyModules/VUT/chcdemo/HierarchyNode.cpp	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/HierarchyNode.cpp	(revision 10)
@@ -0,0 +1,471 @@
+#include "HierarchyNode.h"
+#include "glInterface.h"
+#include <math.h>
+#include <limits.h>
+#include <float.h>
+
+typedef vector<Geometry *> GeometryList;
+
+// criteria and values partly taken from Piringer's thesis
+
+// values used as termination criteria for the tree generation
+// the overall surface
+float HierarchyNode::sSurfaceThreshold;
+// the maximum tree depth
+int HierarchyNode::sMaxDepth;
+// maximum number of objects in a node
+int HierarchyNode::sGeometryThreshold;
+
+// percentage of allowed deviation from the center split plane
+float HierarchyNode::sSplitBandwith;
+
+// also render bounding volume
+bool HierarchyNode::sRenderBoundingVolume = false;
+
+HierarchyNode::HierarchyNode(): mVisible(false), mLastVisited(0), 
+mParent(NULL), mOcclusionQuery(0), mAABValid(false), mLeftChild(NULL), mRightChild(NULL),
+mNumHierarchyNodes(1), mSplitAxis(X_AXIS), mLastRendered(-1), mSplitValue(0),
+mDepth(0), mEnclosedSpaceValid(false), mDistance(0)
+{
+	copyVector3Values(mBoundingBox.min, 0, 0, 0);
+	copyVector3Values(mBoundingBox.max, 0, 0, 0);
+
+	copyVector3Values(mEnclosedSpace.min, 0, 0, 0);
+	copyVector3Values(mEnclosedSpace.max, 0, 0, 0);
+
+	// bounding box color
+	mBoxColor[0] = mBoxColor[2] = 0; mBoxColor[1] = 1.0;
+}
+
+HierarchyNode::HierarchyNode(const Vector3 boundLower, const Vector3 boundUpper, 
+							 HierarchyNode *parent, int depth)
+:mNumHierarchyNodes(1), mOcclusionQuery(0), mLeftChild(NULL), 
+mRightChild(NULL), mSplitAxis(X_AXIS), mVisible(false), 
+mLastVisited(0), mParent(parent), mAABValid(false), 
+mLastRendered(-1), mSplitValue(0), mDepth(depth), 
+mEnclosedSpaceValid(true), mDistance(0)
+{
+	copyVector3Values(mBoundingBox.min, 0, 0, 0);
+	copyVector3Values(mBoundingBox.max, 0, 0, 0);
+
+	copyVector3(mEnclosedSpace.min, boundLower);
+	copyVector3(mEnclosedSpace.max, boundUpper);
+
+	float vol = calcAABoxSurface(mEnclosedSpace);
+
+	mBoxColor[0] = mBoxColor[2] = 0; mBoxColor[1] = 1.0;
+}
+
+
+void HierarchyNode::InitKdTree(HierarchyNode *root)
+{
+	sMaxDepth = (int)((log((float) root->GetGeometry().size())/log(2.0f)) * 20.0f);
+
+	sSurfaceThreshold = FLT_MAX;
+
+	// factor times mininal surface as determination criterium
+	const float factor = 2.5;
+
+	for (GeometryList::const_iterator it = root->GetGeometry().begin(); it != root->GetGeometry().end(); it++)
+	{
+		// same geometry can possible be in to or more nodes => also test for them
+		float surface = calcAABoxSurface((*it)->GetBoundingVolume()) * factor;
+
+		if(surface < sSurfaceThreshold) sSurfaceThreshold = surface;
+	}
+
+	// number of objects in a leaf
+	sGeometryThreshold = 1;
+
+	// percentage of allowed deviation from the center split plane
+	sSplitBandwith = 0.15;
+}
+
+
+HierarchyNode::~HierarchyNode()
+{
+	if(mLeftChild)
+		delete mLeftChild;
+
+	if(mRightChild)
+		delete mRightChild;
+}
+
+int HierarchyNode::Render()
+{
+	int renderedGeometry = 0;
+
+	if(sRenderBoundingVolume)
+	{
+		glColor3fv(mBoxColor);
+        RenderBoundingVolumeForVisualization();
+	}
+
+	// prevent the geometry to be rendered several times in the same frame
+	if(mLastRendered != mLastVisited)
+	{
+		for (GeometryList::const_iterator it = mGeometry.begin(); it != mGeometry.end(); it++)
+		{
+			// same geometry can possible be in to or more nodes => also test for them
+			if((*it)->GetLastVisited() != mLastVisited)
+			{
+				(*it)->SetLastVisited(mLastVisited);
+				(*it)->Render();
+				renderedGeometry ++;
+			}
+		}
+		mLastRendered = mLastVisited;
+	}
+
+	return renderedGeometry;
+}
+
+bool HierarchyNode::Visible()
+{
+	return mVisible;
+}
+
+void HierarchyNode::SetVisible(bool visible)
+{
+	mVisible = visible;
+}
+
+void HierarchyNode::SetLeftChild(HierarchyNode *child)
+{
+	mLeftChild = child;
+}
+
+void HierarchyNode::SetRightChild(HierarchyNode *child)
+{
+	mRightChild = child;
+}
+
+HierarchyNode *HierarchyNode::GetLeftChild()
+{
+	return mLeftChild;
+}
+
+HierarchyNode *HierarchyNode::GetRightChild()
+{
+	return mRightChild;
+}
+
+int HierarchyNode::LastVisited()
+{
+	return mLastVisited;
+}
+
+void HierarchyNode::SetLastVisited(int lastVisited)
+{
+	mLastVisited = lastVisited;
+}
+
+bool HierarchyNode::IsLeaf()
+{
+	return (!mLeftChild && !mRightChild);
+}
+
+void HierarchyNode::AddGeometry(Geometry *geometry)
+{
+	mGeometry.push_back(geometry);
+		
+	if(!mAABValid)
+	{
+		copyVector3(mBoundingBox.min, geometry->GetBoundingVolume().min);
+		copyVector3(mBoundingBox.max, geometry->GetBoundingVolume().max);
+
+		mAABValid = true;
+	}
+	else
+		combineAABoxes(&mBoundingBox, geometry->GetBoundingVolume());
+
+	// root node
+	if(mDepth == 0)
+	{
+		if(!mEnclosedSpaceValid)
+		{
+			copyVector3(mEnclosedSpace.min, geometry->GetBoundingVolume().min);
+			copyVector3(mEnclosedSpace.max, geometry->GetBoundingVolume().max);
+
+			mEnclosedSpaceValid = true;
+		}
+		else 
+			combineAABoxes(&mEnclosedSpace, geometry->GetBoundingVolume());	
+	}
+	else
+	{
+		// cut boxes so they fit into the enclosed space
+		clipAABoxByAABox(&mBoundingBox, mEnclosedSpace);
+	}
+}
+
+HierarchyNode *HierarchyNode::GetParent()
+{
+	return mParent;
+}
+
+int HierarchyNode::GetOcclusionQuery()
+{
+	return mOcclusionQuery;
+}
+
+void HierarchyNode::SetOcclusionQuery(int occlusionQuery)
+{
+	mOcclusionQuery = occlusionQuery;
+}
+
+void HierarchyNode::RenderBoundingVolume()
+{
+	Vector3x8 vertices;
+
+	calcAABoxPoints(vertices, mBoundingBox);
+
+	//glPolygonMode(GL_FRONT, GL_LINE);
+	//     7+------+6
+	//     /|     /|
+	//    / |    / |
+	//   / 4+---/--+5
+	// 3+------+2 /    y   z
+	//  | /    | /     |  /
+	//  |/     |/      |/
+	// 0+------+1      *---x
+
+	//---- render AABB
+	glBegin(GL_TRIANGLE_FAN);
+		glVertex3dv(vertices[6]);
+		glVertex3dv(vertices[5]);
+		glVertex3dv(vertices[4]);
+		glVertex3dv(vertices[7]);
+		glVertex3dv(vertices[3]);
+		glVertex3dv(vertices[2]);
+		glVertex3dv(vertices[1]);
+		glVertex3dv(vertices[5]);
+	glEnd();
+
+	//---- render second half of AABB
+	glBegin(GL_TRIANGLE_FAN);
+		glVertex3dv(vertices[0]);
+		glVertex3dv(vertices[1]);
+		glVertex3dv(vertices[2]);
+		glVertex3dv(vertices[3]);
+		glVertex3dv(vertices[7]);
+		glVertex3dv(vertices[4]);
+		glVertex3dv(vertices[5]);
+		glVertex3dv(vertices[1]);
+	glEnd();
+}
+
+
+void HierarchyNode::RenderBoundingVolumeForVisualization()
+{
+	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+	glDisable(GL_LIGHTING);
+	glDisable(GL_CULL_FACE);
+		
+	RenderBoundingVolume();
+
+	glEnable(GL_CULL_FACE);
+	glEnable(GL_LIGHTING);
+	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+}
+
+
+
+const AABox &HierarchyNode::GetBoundingVolume()
+{
+	return mBoundingBox;
+}
+
+int	HierarchyNode::GenerateKdTree()
+{
+	// check the termination criterium (a heuristic)
+	if (SimpleEnough()) 
+	{
+		return 1;
+	}
+
+	// largest dimension will be split
+	Vector3 size;
+	diffVector3(size, mBoundingBox.max, mBoundingBox.min);
+    
+	if (size[X_AXIS] > size[Y_AXIS])	
+		mSplitAxis	= (size[X_AXIS] > size[Z_AXIS]) ? X_AXIS : Z_AXIS;
+	else					
+		mSplitAxis	= (size[Y_AXIS] > size[Z_AXIS]) ? Y_AXIS : Z_AXIS;
+
+	// select the value of the split plane
+	mSplitValue = ComputeSplitPlane();
+	
+	// generate the children
+	Vector3 changedLower;
+	Vector3 changedUpper;
+
+	copyVector3(changedLower, mEnclosedSpace.min);
+	copyVector3(changedUpper, mEnclosedSpace.max);
+	   	
+	changedLower[mSplitAxis] = mSplitValue;
+	changedUpper[mSplitAxis] = mSplitValue;
+
+	mLeftChild	= new HierarchyNode(mEnclosedSpace.min, changedUpper, this, mDepth + 1);
+	mRightChild	= new HierarchyNode(changedLower, mEnclosedSpace.max, this, mDepth + 1);
+
+	// add the geometry to the according children
+	for (GeometryList::iterator it = mGeometry.begin(); it != mGeometry.end(); it++)
+	{
+		if ((*it)->GetBoundingVolume().min[mSplitAxis] >= mSplitValue)
+		{
+			// box lies completely within right part
+			mRightChild->AddGeometry(*it);
+		}
+		else if ((*it)->GetBoundingVolume().max[mSplitAxis] <= mSplitValue)
+		{
+			// box lies completely within left part
+			mLeftChild->AddGeometry((*it));
+		}
+		else
+		{
+			//---- box intersects both parts
+			mLeftChild->AddGeometry((*it));
+			mRightChild->AddGeometry((*it));
+		}
+	}
+
+	//---- we continue with the children
+	int leftSize  = mLeftChild->GenerateKdTree();
+	int rightSize = mRightChild->GenerateKdTree();
+
+	// since the geometry is now referenced by the children
+	mGeometry.clear();
+	
+	mNumHierarchyNodes = leftSize + rightSize + 1;
+
+	return mNumHierarchyNodes;
+}
+
+bool HierarchyNode::SimpleEnough()
+{
+	return ((mGeometry.size() <= (unsigned int)sGeometryThreshold) ||
+		    (calcAABoxSurface(mBoundingBox) <= sSurfaceThreshold) ||
+			(sMaxDepth <= mDepth));
+}
+
+float HierarchyNode::ComputeSplitPlane()
+{
+	float left	= mBoundingBox.min[mSplitAxis];
+	float right	= mBoundingBox.max[mSplitAxis];
+
+	// the smaller the value returned from the heuristic, the better => big starting value
+	float bestValue	= FLT_MAX; 
+	float result = 0.0f;
+
+	bool found	= false;
+
+	// calculate the borders of the band
+	float currLeft, currRight;
+	currLeft = currRight = (left + right) / 2.0f;
+	
+	currLeft  -= (right - left) * sSplitBandwith;
+	currRight += (right - left) * sSplitBandwith;
+
+	// check all geometry within that node
+	for (GeometryList::const_iterator it = mGeometry.begin(); it != mGeometry.end(); it++)
+	{
+		// one border of the geometry's AABB
+		float leftPlane	 = (*it)->GetBoundingVolume().min[mSplitAxis];
+		// the other border of the geometry's AABB
+		float rightPlane = (*it)->GetBoundingVolume().max[mSplitAxis];
+		
+		// only consider planes that lie within the band
+		if ((leftPlane > currLeft) && (leftPlane < currRight))
+		{
+			// compute the heuristic for the left plane and note the value if it was good
+			float currValue	= ComputeHeuristics(leftPlane);
+
+			if (currValue < bestValue)
+			{
+				bestValue = currValue;
+				result	  = leftPlane;
+				found	  = true;
+			}
+		}
+
+		if ((rightPlane > currLeft) && (rightPlane < currRight))
+		{
+			// compute the heuristic for the right plane and note the value if it was good
+			float currValue = ComputeHeuristics(rightPlane);
+
+			if (currValue < bestValue)
+			{
+				bestValue	= currValue;
+				result		= rightPlane;
+				found		= true;
+			}
+		}
+	}
+
+	// in case we haven't found any proper plane, we simply take the center
+	if (!found)	
+		result = (left + right) / 2.0f;
+			
+	return result;
+}
+
+float HierarchyNode::ComputeHeuristics(float pos)
+{
+	// this implements a very simple heuristic: it simply counts the nodes being intersected by the splitplane
+	float result = 0.0f;
+
+	for (GeometryList::const_iterator it = mGeometry.begin(); it != mGeometry.end(); it++)
+	{
+		if (((*it)->GetBoundingVolume().min[mSplitAxis] < pos) &&
+			((*it)->GetBoundingVolume().max[mSplitAxis] > pos))
+		{
+			result += 1.0f;
+		}
+	}
+
+	return result;
+}
+
+int HierarchyNode::GetNumHierarchyNodes()
+{
+	return mNumHierarchyNodes;
+}
+
+void HierarchyNode::PushChildrenOrdered(const Vector3 viewpoint, TraversalStack &traversalStack)
+{
+	if(viewpoint[mSplitAxis] > mSplitValue)
+	{
+		traversalStack.push(mLeftChild);
+		traversalStack.push(mRightChild);
+	}
+	else
+	{
+		traversalStack.push(mRightChild);
+		traversalStack.push(mLeftChild);
+	}
+}
+
+
+void HierarchyNode::SetRenderBoundingVolume(bool renderBoundingVolume)
+{
+	sRenderBoundingVolume = renderBoundingVolume;
+}
+
+
+GeometryList &HierarchyNode::GetGeometry()
+{
+	return mGeometry;
+}
+
+
+float HierarchyNode::GetDistance()
+{
+	return mDistance;
+}
+
+
+void HierarchyNode::SetDistance(float distance)
+{
+	mDistance = distance;
+}
Index: /tags/DummyModules/VUT/chcdemo/glInterface.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/glInterface.h	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/glInterface.h	(revision 10)
@@ -0,0 +1,25 @@
+//Copyright and Disclaimer:
+//This code is copyright Vienna University of Technology, 2004.
+
+#ifndef NO_PRAGMA_ONCE
+#pragma once
+#endif
+
+#ifndef GLINTERFACE_H
+#define GLINTERFACE_H
+
+//includes an openGL extension header file
+//http://glew.sourceforge.net/
+#include "GL/glew.h"
+//includes the glut header file
+#include "GL/glut.h"
+
+//includes  windows specific stuff
+#ifdef _WIN32
+	#include "GL/wglew.h"
+#else
+//include linux specific stuff
+	#include "GL/glxew.h"
+#endif	
+
+#endif // GLINTERFACE_H
Index: /tags/DummyModules/VUT/chcdemo/HierarchyNode.h
===================================================================
--- /tags/DummyModules/VUT/chcdemo/HierarchyNode.h	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/HierarchyNode.h	(revision 10)
@@ -0,0 +1,168 @@
+#ifndef NO_PRAGMA_ONCE
+#pragma once
+#endif
+
+#ifndef HIERARCHYNODE_H
+#define HIERARCHYNODE_H
+
+#include "Geometry.h"
+extern "C"
+{
+	#include "DataTypes.h"
+}
+#include <vector>
+#include <stack>
+
+using namespace std;
+
+class HierarchyNode;
+
+/**
+	This class implements the compare operator for the priority queue.
+	a lower distance has a higher value in the queue
+*/
+template <typename T> class myless
+{
+public:
+	
+	//bool operator() (HierarchyNode *v1, HierarchyNode *v2) const
+	bool operator() (T v1, T v2) const
+    {
+		return (v1->mDistance > v2->mDistance);
+    }
+};
+
+/** This class represents a node in a k-d tree hierarchy. A
+node has two children. The node can be either an interior node (i.e., left and right child
+NULL) or a leaf node, which holds the actual geometry.
+*/
+
+class HierarchyNode
+{
+	friend class myless;
+
+public:
+	typedef stack<HierarchyNode *> TraversalStack;
+    typedef vector<Geometry *> GeometryList;
+
+	HierarchyNode();
+	HierarchyNode(const Vector3 boundLower, const Vector3 boundUpper, 
+				 HierarchyNode *parent, int depth);
+	~HierarchyNode();
+	//! was this node visible the last time it was visited?
+	bool Visible();
+	//! last time this node was visited (in framenumber)
+	int LastVisited();
+	//! sets visible flag
+	void SetVisible(bool visible);
+	//! sets timestamp (current framenumber)
+	void SetLastVisited(int lastVisited);
+	//! is this node a leaf node (i.e., geometry)
+	bool IsLeaf();
+	//! renders the geometry in this node. returns number of rendered geometry
+	int Render();
+	//! returns occlusion query id
+	int GetOcclusionQuery();
+	//! sets occlusion query id
+	void SetOcclusionQuery(int occlusionQuery);
+	//! renders the bounding volume  (i.e., a axis aligned bounding box) of the node
+	void RenderBoundingVolume();
+	//! adds geometry to this node (rendered if this node is a leaf)
+	void AddGeometry(Geometry *geometry);
+
+	void SetLeftChild(HierarchyNode *child);
+	void SetRightChild(HierarchyNode *child);
+
+	HierarchyNode *GetParent();
+    HierarchyNode *GetLeftChild();
+	HierarchyNode *GetRightChild();
+
+	//! compute bounding volume (i.e., a axis aligned bounding box) for this geometry.
+	//void CalcBoundingVolume();
+	const AABox& GetBoundingVolume();
+	
+	//! generates the kd-tree from this root-node, returns number of nodes in hierarchy.
+	int	GenerateKdTree();
+
+	//! returns number of nodes in hierarchy with this node.
+	int GetNumHierarchyNodes();
+
+	//! add children of this node ordered to a traversal stack with respect to the view point
+	void PushChildrenOrdered(const Vector3 viewpoint, TraversalStack &traversalStack);
+
+	//! if this node was culled, set the type of culling (frustum, query)
+	void SetCulledType(int culledtype);
+	//! returns type of culling
+	int GetCulledType();
+	//! set gl state to visible render bounding volume
+	void RenderBoundingVolumeForVisualization();
+	//! returns geometry list
+	GeometryList &GetGeometry();
+
+	//! visibly renders also bounding volume of this node
+	static void SetRenderBoundingVolume(bool renderBoundingVolume);
+	
+	/**
+		initialises the static termination criteria.
+		shall be called after all geometry has been added to the root node.
+	*/
+	static void InitKdTree(HierarchyNode *root);
+
+	float GetDistance();
+	void SetDistance(float distance);
+
+	float mDistance;
+
+protected:
+	
+	enum {X_AXIS, Y_AXIS, Z_AXIS};
+
+	//! criteria to stop the splitting of this kd-tree node
+	bool SimpleEnough();
+	//! split plane of the kd-tree (according to mSplitAxis, it is the x, y, or z axis)
+	float ComputeSplitPlane();
+
+	/** calculates a value that expresses if it's reasonable to split the 
+	   node at the specified position (the smaller the value the better the split)
+	   */
+	float ComputeHeuristics(float pos);
+
+	GeometryList mGeometry;
+	//! id of this occlusion query of this node
+	int mOcclusionQuery;
+
+	HierarchyNode *mLeftChild;	
+	HierarchyNode *mRightChild;
+	HierarchyNode *mParent;
+	
+	bool  mVisible;
+	int mLastVisited;
+	bool mAABValid;
+	bool mEnclosedSpaceValid;
+	int mNumHierarchyNodes;
+	
+	AABox mBoundingBox;
+	// the enclosed space of the pure kd-treenode (without considering the geometry)
+	AABox mEnclosedSpace;
+	
+	int mSplitAxis;
+	int mLastRendered;
+	float mSplitValue;
+	int mDepth;
+
+	static bool sRenderBoundingVolume;
+	static float sSplitBandwith;
+
+	// --termination criteria
+
+	static int sGeometryThreshold;
+	// the maximum bounding box surface
+	static float HierarchyNode::sSurfaceThreshold;
+	// the maximum tree depth
+	static int HierarchyNode::sMaxDepth;
+	// the default bounding box drawing color
+	float mBoxColor[3];
+	// distance to the view point
+};
+
+#endif // HIERARCHYNODE_H
Index: /tags/DummyModules/VUT/chcdemo/stdafx.cpp
===================================================================
--- /tags/DummyModules/VUT/chcdemo/stdafx.cpp	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/stdafx.cpp	(revision 10)
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// occquery.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
Index: /tags/DummyModules/VUT/chcdemo/Readme.txt
===================================================================
--- /tags/DummyModules/VUT/chcdemo/Readme.txt	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/Readme.txt	(revision 10)
@@ -0,0 +1,101 @@
+HARDWARE OCCLUSION QUERIES MADE USEFUL
+======================================
+
+This programn is a demonstration of the Coherent Hierarchical Culling algorithm 
+described in the chapter "Hardware Occlusion Queries Made Useful" of the book GPU 
+Gems II. Additional information and sample images are available at
+
+http://www.cg.tuwien.ac.at/research/vr/chcull/
+
+Updates to this demo can can be found on the same webpage.
+
+Copyright and Disclaimer:
+
+This code is copyright Vienna University of Technology, 2004.
+
+
+Please feel FREE to COPY and USE the code to include it in your own work,
+provided you include this copyright notice.
+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.
+
+Author of this demo:
+
+Oliver Mattausch (matt@cg.tuwien.ac.at)
+
+Authors of the book chapter:
+
+Michael Wimmer (wimmer@cg.tuwien.ac.at)
+Jiri Bittner (bittner@cg.tuwien.ac.at)
+
+Date: December 18, 2004
+
+----------
+Input
+----------
+
+Help for keybord and mouse is available with F1.
+
+You can switch between the different occlusion modes described in the book chapter using the 
+SPACE key (view-frustum culling, hierarchical stop and wait, coherent hierarchical culling).
+
+A visualization of the culling algorithm from can be shown by pressing '1' on the keyboard. Note that the 
+classification of nodes usually changes in consecutive frames, so that the hierarchy seems to oscillate. 
+This is expected, since the classification of previously visible interior nodes is based on the classification 
+of their children, which might be more accurate (leading to the interior node to become occluded) than the 
+query for the node itself.
+
+----------
+The scene
+----------
+
+The scene used in this program consists of basic objects randomly placed in a box. The extent of the box and the 
+number and size of objects can be changed (see F1).
+
+The hierarchical structure is a kd-tree with objects intersecting a split plane placed into multiple leaf nodes.
+
+By playing with the parameters and moving around, the user can explore situtations where occlusion culling is extremly 
+useful, and where it is not (because the objects are too sparse or there is too much to see from this viewpoint).
+
+The hierarchical coherent culling algorithm is compared to simple view-frustum culling and the hierarchical stop and wait 
+algorithm (which also uses hardware occlusion queries, but in a less sophisticated way).
+
+----------
+Installation
+----------
+
+A binary for Win32 is included.
+
+The program should compile under Windows and Linux, a CMAKE makefile for multi-platform
+compilation is included (see www.cmake.org for details).
+
+For Linux, you need to have a working GLUT and GLEW installation.
+
+----------
+Structure
+----------
+
+This demo is written in C++ and partly C and uses OpenGL.
+It has few external needs like limits.h, stdlib.h, math.h, string.h, stdio.h, or time.h.
+We also make heavy use of stl classes, like priority_queue.
+
+The program expects the GL_ARB_occlusion_query extension.
+
+The program and especially the mathematical routines are not designed for speed or
+efficiency, but for simplicity and clarity.
+
+RenderTraverser.cpp: implements the core algorithm described in the paper
+
+occquery.cpp: contains the OpenGl setup code, glut stuff, and sets up of the scene hierarchy
+HierarchyNode.cpp: contains a kd-tree hierarchy implementation, which can be traversed by the culling algorithm
+Geometry.cpp: represents simple drawable geometry, so that we have something to cull for the algorithm
+
+Timers.cpp: contains exact timer functions in order to accurately measure the frame render time
+stdafx.cpp: source file that includes just the standard includes
+glInterface.h: includes gl, glut and glew headers
+DataTypes.c: defines basic geometric datatypes
+MathStuff.c: declares some handy mathematical routines
+teapot.h: contains the teapot geometry
+
+If you find any problem with the code or have any comments, we would like to hear from you!
Index: /tags/DummyModules/VUT/chcdemo/occquery.cpp
===================================================================
--- /tags/DummyModules/VUT/chcdemo/occquery.cpp	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/occquery.cpp	(revision 10)
@@ -0,0 +1,828 @@
+// occquery.cpp : Defines the entry point for the console application.
+//
+
+#include "stdafx.h"
+
+extern "C"
+{
+	#include "MathStuff.h"
+	#include "DataTypes.h"
+}
+
+#include "glInterface.h"
+#include "RenderTraverser.h"
+#include <math.h>
+#include <time.h>
+
+double nearDist = 0.1; // eye near plane distance
+int winWidth, winHeight;
+int objectType = Geometry::TEAPOT;
+int nextObjectType = objectType;
+
+float visZoomFactor = 1.5f;
+
+bool showHelp = false;
+bool showStatistics = true;
+bool showBoundingVolumes = false;
+bool visMode = false;
+bool showCreateParams = false;
+
+// traverses and renders the hierarchy
+RenderTraverser traverser;
+
+Vector3 eyePos = {0.0, 0.0, 3.0};  // eye position 
+Vector3 viewDir = {0.0, 0.0, -1.0};  // eye view dir 
+Vector3 lightDir = {0.0, 0.0, 1.0};  // light dir 
+
+Matrix4x4 eyeView; // eye view matrix
+Matrix4x4 eyeProjection; // eye projection matrix
+Matrix4x4 eyeProjView; //= eyeProjection*eyeView
+Matrix4x4 invEyeProjView; //= eyeProjView^(-1)
+Matrix4x4 visView; // visualisation view matrix
+
+//mouse navigation state
+int xEyeBegin, yEyeBegin, yMotionBegin, verticalMotionBegin, horizontalMotionBegin = 0;
+int renderMode = RenderTraverser::RENDER_COHERENT;
+
+// relative size of an object
+float objectSize = 3.5f;
+
+int numObjects = 2000;
+int numNextObjects = numObjects;
+float zLength = 30.0f;
+
+// this defines the volume where objects can be drawn
+Vector3 minTranslation = {-2.5f, -2.5f, -3.0f};
+Vector3 maxTranslation = {2.5f, 2.5f, -3.0 - zLength};
+
+const float minAngle = 0;
+const float maxAngle = 360;
+
+const int renderTimeSize = 100;
+long renderTimes[renderTimeSize];
+int renderTimesIdx = 0;
+int renderTimesValid = 0;
+
+typedef vector<Geometry *> GeometryList;
+GeometryList geometry;
+
+bool useOptimization = true;
+
+Vector3 amb[2];
+Vector3 dif[2];
+Vector3 spec[2];
+
+void begin2D(void);
+void end2D(void);
+void output(const int x, const int y, const char *string);
+void initGLstate(void);
+void keyboard(const unsigned char c, const int x, const int y);
+void drawHelpMessage(void);
+void drawStatistics(void);
+void display(void);
+void special(const int c, const int x, const int y);
+void reshape(const int w, const int h);
+void mouse(int button, int state, int x, int y);
+void initExtensions(void);
+void leftMotion(int x, int y);
+//void rightMotion(int x, int y);
+void middleMotion(int x, int y);
+void drawEyeView(void);
+void setupEyeView(void);
+void setupVisView(void);
+void updateEyeMtx(void);
+long calcRenderTime(void);
+void resetTimer(void);
+void cleanUp(void);
+void calcDecimalPoint(string &str, int d);
+
+HierarchyNode* generateHierarchy(int numObjects);
+Geometry *generateGeometry(Vector3 translateRatio, float xRotRatio, 
+						   float yRotRatio, float zRotRatio, int materialIdx);
+void displayVisualization();
+
+void deleteGeometry();
+
+
+int _tmain(int argc, _TCHAR* argv[])
+{
+	glutInitWindowSize(800,600);
+	glutInit(&argc,argv);
+	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
+	
+	glutCreateWindow("Coherent Hierarchical Culling");
+
+	glutDisplayFunc(display);
+	glutKeyboardFunc(keyboard);
+	glutSpecialFunc(special);
+	glutReshapeFunc(reshape);
+	glutMouseFunc(mouse);
+	glutIdleFunc(display);
+	initExtensions();
+	initGLstate();
+
+	leftMotion(0,0);
+	middleMotion(0,0);
+	
+	HierarchyNode *hierarchy = generateHierarchy(numObjects);
+	traverser.SetHierarchy(hierarchy);
+
+	/// initialise rendertime array
+	for(int i=0; i<renderTimeSize; i++)
+		renderTimes[i] = 0;
+
+	glutMainLoop();
+
+	// clean up
+	cleanUp();
+	
+	return 0;
+}
+
+
+void initGLstate(void) 
+{
+	glClearColor(0.6, 0.6, 0.8, 1.0);
+	
+	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+	glPixelStorei(GL_PACK_ALIGNMENT,1); 
+	
+	glDepthRange(0.0, 1.0);
+	glClearDepth(1.0);
+	glDepthFunc(GL_LESS);
+
+	glEnable(GL_LIGHTING);
+	glEnable(GL_LIGHT0);
+
+	glShadeModel(GL_SMOOTH);
+	
+	GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+	GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+	GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };
+	GLfloat position[] = { 0.0, 3.0, 3.0, 0.0 };
+    
+	GLfloat lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
+	GLfloat local_view[] = { 0.0 };
+
+	glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+	glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+	glLightfv(GL_LIGHT0, GL_POSITION, position);
+	
+	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+	glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);
+
+	glMaterialf(GL_FRONT, GL_SHININESS, 64);
+	glEnable(GL_NORMALIZE);
+			
+	glFrontFace(GL_CCW);
+	glCullFace(GL_BACK);
+	glEnable(GL_CULL_FACE);
+	
+	glClearColor(0.2, 0.2, 0.8, 0.0);
+
+	setupVisView();
+}
+
+
+void drawHelpMessage(void) 
+{
+	const char *message[] = 
+	{
+		"Help information",
+		"",
+		"'F1'           - shows/dismisses this message",
+		"'F2'           - decreases number of objects (valid after scene recreation)",
+		"'F3'           - increases number of objects (valid after scene recreation)",
+		"'F4'           - decreases box length in z direction (valid after scene recreation)",
+		"'F5'           - increases box length in z direction (valid after scene recreation)",
+		"'F6'           - decreases object size (valid after scene recreation)",
+		"'F7'           - increases object size (valid after scene recreation)",
+		"'F8'           - cycles through object types (teapot, ...) (valid after scene recreation)",
+		"",
+		"'MOUSE-LEFT'   - turn left/right, move forward/backward",
+		"'MOUSE-RIGHT'  - turn left/right, move forward/backward",
+		"'MOUSE-MIDDLE' - move up/down, left/right",
+		"'CURSOR UP'    - move forward",
+		"'CURSOR BACK'  - move backward",
+		"'CURSOR RIGHT' - turn right",
+		"'CURSOR LEFT'  - turn left",
+		"",
+		"'SPACE'        - cycles through occlusion culling algorithms",
+		"'-'            - decreases visibility threshold",
+		"'+'            - increases visibility threshold",
+		"'C'            - recreates the scene hierarchy",
+		"'G'            - enables/disables optimization to take geometry as occluder",
+		"",
+		"'R'            - shows/hides recreation parameters",
+		"'S'            - shows/hides statistics",
+		"'V'            - shows/hides bounding volumes",
+		"",
+		"'1'            - shows/hides visualization",
+		"'2'            - zooms out visualization",
+		"'3'            - zooms in visualization",
+		0,
+	};
+	
+	int i;
+	int x = 40, y = 42;
+	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+	glEnable(GL_BLEND);
+	glColor4f(0.0,1.0,0.0,0.2);  // 20% green. 
+
+	// Drawn clockwise because the flipped Y axis flips CCW and CW. 
+	glRecti(winWidth - 30, 30, 30, winHeight - 30);
+	
+	glDisable(GL_BLEND);
+	
+
+	glColor3f(1.0,1.0,1.0);
+	for(i = 0; message[i] != 0; i++) {
+		if(message[i][0] == '\0') {
+			y += 7;
+		} else {
+			output(x,y,message[i]);
+			y += 14;
+		}
+	}
+
+}
+
+// generates a teapot, all parameters between zero and one
+Geometry *generateGeometry(Vector3 translationRatio, float xRotRatio, 
+						   float yRotRatio, float zRotRatio, int materialIdx)
+{
+	float xRot = minAngle + xRotRatio * (maxAngle - minAngle);
+	float yRot = minAngle + yRotRatio * (maxAngle - minAngle);
+	float zRot = minAngle + zRotRatio * (maxAngle - minAngle);
+
+	Vector3 translation;
+	translation[0] = minTranslation[0] + translationRatio[0] * (maxTranslation[0] - minTranslation[0]);
+	translation[1] = minTranslation[1] + translationRatio[1] * (maxTranslation[1] - minTranslation[1]);
+	translation[2] = minTranslation[2] + translationRatio[2] * (maxTranslation[2] - minTranslation[2]);
+
+	Geometry *result = new Geometry(translation, xRot, yRot, zRot, objectSize, objectType);
+
+	result->SetAmbientColor(amb[materialIdx][0], amb[materialIdx][1], amb[materialIdx][2]);
+	result->SetDiffuseColor(dif[materialIdx][0], dif[materialIdx][1], dif[materialIdx][2]);
+	result->SetSpecularColor(spec[materialIdx][0], spec[materialIdx][1], spec[materialIdx][2]);
+
+	return result;
+}
+
+// generates a the scene hierarchy with random values
+HierarchyNode* generateHierarchy(int numObjects)
+{
+    HierarchyNode *hierarchy = new HierarchyNode();
+
+	// initialise materials
+	copyVector3Values(amb[0], 0.0215, 0.1745, 0.0215);
+	copyVector3Values(dif[0], 0.727811, 0.633, 0.6);
+	copyVector3Values(spec[0], 0.633, 0.727811, 0.633);
+
+	copyVector3Values(amb[1], 0.1745, 0.01175, 0.01175);
+	copyVector3Values(dif[1], 0.61424, 0.04136, 0.04136);
+	copyVector3Values(spec[1], 0.727811, 0.626959, 0.626959);
+
+	srand (time (0));
+	
+	printf("generating geometry with random position and orientation ... ");
+
+	for(int i=0; i < numObjects; i++)
+	{
+		float xRotRatio = rand() / (float) RAND_MAX;
+		float yRotRatio = rand() / (float) RAND_MAX;
+		float zRotRatio = rand() / (float) RAND_MAX;
+
+		Vector3 translationRatio = {rand() / (float) RAND_MAX, 
+									rand() / (float) RAND_MAX, 
+									rand() / (float) RAND_MAX};
+
+		int materialIdx = int(2 * rand() / (float) RAND_MAX);
+			
+		Geometry *geo = generateGeometry(translationRatio, xRotRatio, 
+									     yRotRatio, zRotRatio, materialIdx);
+		hierarchy->AddGeometry(geo);
+
+		// put into global geometry list for later deletion
+		geometry.push_back(geo);
+	}
+
+	printf("finished\n");
+	printf("generating new kd-tree hierarchy ... ");
+	HierarchyNode::InitKdTree(hierarchy);
+	hierarchy->GenerateKdTree();
+	printf("finished\n");
+
+	return hierarchy;
+}
+
+
+void updateEyeMtx(void) 
+{
+	const Vector3 up = {0.0, 1.0, 0.0};
+
+	look(eyeView, eyePos, viewDir, up);
+	mult(eyeProjView, eyeProjection, eyeView); //eyeProjView = eyeProjection*eyeView
+	invert(invEyeProjView, eyeProjView); //invert matrix
+}
+
+
+void setupEyeView(void)
+{
+	glMatrixMode(GL_PROJECTION);
+	glLoadMatrixd(eyeProjection);
+
+	glMatrixMode(GL_MODELVIEW);
+	glLoadMatrixd(eyeView);
+}
+
+
+void display(void) 
+{
+	char * msg[] = {"Frustum culling only", "Hierarchical stop and wait",
+				    "Coherent hierarchical culling"};
+
+	char msg2[200];
+	char msg3[200];
+	char msg4[100];
+	char msg5[100];
+	char msg6[100];
+	char msg7[100];
+	char msg8[100];
+
+	sprintf(msg2, "Traversed: %4d, frustum culled: %4d, query culled: %4d (of %d nodes)",
+			traverser.GetNumTraversedNodes(), traverser.GetNumFrustumCulledNodes(),
+			traverser.GetNumQueryCulledNodes(), 
+			traverser.GetHierarchy()->GetNumHierarchyNodes());
+	
+	char *optstr[2] = {"", ", using optimization"};
+	
+	float fps = 1000.0;
+	long renderTime = calcRenderTime();
+	if(renderTime) fps = 1000000.0f / (float)calcRenderTime();
+
+	sprintf(msg3, "Threshold: %4d, algorithm rendering time: %ld ms (%3.3f fps)%s", 
+			traverser.GetVisibilityThreshold(), renderTime / 1000, fps, optstr[useOptimization]);
+
+	string str;
+	string str2;
+
+	calcDecimalPoint(str, Geometry::CountTriangles(objectType) * traverser.GetNumRenderedGeometry());
+	calcDecimalPoint(str2, Geometry::CountTriangles(objectType) * numObjects);
+
+	sprintf(msg4, "Rendered objects %d (of %d), rendered triangles: %s (of %s)", 
+			traverser.GetNumRenderedGeometry(), numObjects, str.c_str(), str2.c_str()); 
+
+	sprintf(msg5, "Next object num: %d", numNextObjects);
+	sprintf(msg6, "Next length in z dir: %3.3f", zLength);
+	
+	char *objectTypeStr[3] = {"teapot", "torus", "sphere"};
+
+	sprintf(msg7, "Next object type: %s", objectTypeStr[nextObjectType]);
+	sprintf(msg8, "Next object size: %3.3f", objectSize);
+
+	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+	updateEyeMtx(); // bring eye modelview matrix up-to-date
+	setupEyeView();
+
+	traverser.SetViewpoint(eyePos);
+	traverser.SetProjViewMatrix(eyeProjView);
+	traverser.Render(renderMode);
+
+	// cycle through rendertime array
+	renderTimes[renderTimesIdx] = traverser.GetRenderTime();
+	renderTimesIdx = (renderTimesIdx + 1) % renderTimeSize;
+
+	if(renderTimesIdx  > renderTimesValid) 
+		renderTimesValid = renderTimesIdx;
+
+	if(visMode)
+	{
+		displayVisualization();
+	}
+	
+	begin2D();
+	if(showHelp)
+		drawHelpMessage();
+	else
+	{
+		glColor3f(1.0,1.0,1.0);
+		output(10,winHeight-10, msg[renderMode]);
+
+		if(showStatistics)
+		{
+			if(showCreateParams)
+			{
+				output(10, winHeight-150, msg8);
+				output(10, winHeight-130, msg7);
+				output(10, winHeight-110, msg6);
+				output(10, winHeight-90,  msg5);
+			}
+			output(10, winHeight-70, msg3);
+			output(10, winHeight-50, msg4);
+			output(10, winHeight-30, msg2);
+		}
+	}
+	end2D();
+
+	glutSwapBuffers();
+}
+
+
+#pragma warning( disable : 4100 )
+void keyboard(const unsigned char c, const int x, const int y) 
+{
+	int threshold;
+	HierarchyNode *hierarchy;
+
+	switch(c) 
+	{
+	case 27:
+		exit(0);
+		break;
+	case 32: //space
+		renderMode = (renderMode + 1) % RenderTraverser::NUM_RENDERMODES;
+		
+		resetTimer();
+		traverser.Render(renderMode);		// render once so stats are updated
+		break;
+	case 'h':
+	case 'H':
+		showHelp = !showHelp;
+		break;
+	case 'v':
+	case 'V':
+		showBoundingVolumes = !showBoundingVolumes;
+		HierarchyNode::SetRenderBoundingVolume(showBoundingVolumes);
+		break;
+	case 's':
+	case 'S':
+		showStatistics = !showStatistics;
+		break;
+	case '+':
+		threshold = traverser.GetVisibilityThreshold() + 10;
+		traverser.SetVisibilityThreshold(threshold);
+		break;
+	case '-':
+		threshold = traverser.GetVisibilityThreshold() - 10;
+		if(threshold < 0) threshold = 0;
+
+		traverser.SetVisibilityThreshold(threshold);		
+		break;
+	case '1':
+		visMode = !visMode;
+		break;
+	
+	case '2':
+		visZoomFactor += 0.1;	
+		setupVisView();
+		break;
+	case '3':
+		visZoomFactor -= 0.1;
+		if(visZoomFactor < 0.1) visZoomFactor = 0.1;
+	
+		setupVisView();
+		break;
+	case 'r':
+	case 'R':
+		showCreateParams = !showCreateParams;
+		break;
+	case 'g':
+	case 'G':
+		useOptimization = !useOptimization;
+		traverser.SetUseOptimization(useOptimization);
+		break;
+	case 'c':
+	case 'C':	
+		
+		hierarchy = traverser.GetHierarchy();
+		// delete old hierarchy
+		if(hierarchy) delete hierarchy; 
+		deleteGeometry();
+
+		maxTranslation[2] = -3.0 - zLength;
+		numObjects = numNextObjects;
+		objectType = nextObjectType;
+		
+		hierarchy = generateHierarchy(numObjects);
+		traverser.SetHierarchy(hierarchy);
+
+		showCreateParams = false;
+
+		traverser.Render(renderMode); // render once to update stats
+		resetTimer();
+		break;
+
+	default:
+		return;
+	}
+
+	glutPostRedisplay();
+}
+
+
+void special(const int c, const int x, const int y) 
+{
+	// used to avoid vertical motion with the keys
+	Vector3 hvec = {viewDir[0], 0, viewDir[2]};
+	
+	switch(c) 
+	{
+	case GLUT_KEY_F1:
+		showHelp = !showHelp;
+		break;
+	case GLUT_KEY_F2:
+		numNextObjects -= 100;
+		if(numNextObjects < 100) numNextObjects = 100;
+		break;
+	case GLUT_KEY_F3:
+        numNextObjects += 100;
+		break;
+	case GLUT_KEY_F4:
+		zLength -= 1;
+		if(zLength < 0) zLength = 0;
+		break;
+	case GLUT_KEY_F5:
+		zLength += 1;
+		break;		
+	case GLUT_KEY_F6:
+		objectSize -= 0.1;
+		if(objectSize < 0.1) objectSize = 0.1;
+		break;
+	case GLUT_KEY_F7:
+		objectSize += 0.1;
+		break;
+	case GLUT_KEY_F8:
+		nextObjectType = (nextObjectType + 1) % Geometry::NUM_OBJECTS;
+		break;
+	case GLUT_KEY_LEFT:
+		rotateVectorY(viewDir, 0.2);
+		break;
+	case GLUT_KEY_RIGHT:
+		rotateVectorY(viewDir, -0.2);
+		break;
+	case GLUT_KEY_UP:
+		linCombVector3(eyePos, eyePos, hvec, 0.6);
+		break;
+	case GLUT_KEY_DOWN:
+		linCombVector3(eyePos, eyePos, hvec, -0.6);
+		break;
+	default:
+		return;
+
+	}
+
+	glutPostRedisplay();
+}
+#pragma warning( default : 4100 )
+
+
+void reshape(const int w, const int h) 
+{
+	double winAspectRatio = 1.0;
+
+	glViewport(0, 0, w, h);
+	
+	winWidth = w;
+	winHeight = h;
+
+	if(w) winAspectRatio = (double) h / (double) w;
+
+	perspectiveDeg(eyeProjection, 60.0, 1.0/winAspectRatio, nearDist, 150.0);
+
+	glutPostRedisplay();
+}
+
+
+void mouse(int button, int state, int x, int y) 
+{
+	if(((button == GLUT_LEFT_BUTTON) || (button == GLUT_RIGHT_BUTTON)) && state == GLUT_DOWN) 
+	{
+		xEyeBegin = x;
+		yMotionBegin = y;
+
+		glutMotionFunc(leftMotion);
+	}
+	else if(button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)
+	{
+		horizontalMotionBegin = x;
+		verticalMotionBegin = y;
+		glutMotionFunc(middleMotion);
+	}
+
+	glutPostRedisplay();
+}
+
+/**
+	rotation for left/right mouse drag
+	motion for up/down mouse drag
+*/
+void leftMotion(int x, int y) 
+{
+	static double eyeXAngle = 0.0;
+	// not move in the vertical direction
+	Vector3 horView = {viewDir[0], 0, viewDir[2]};
+	
+	eyeXAngle = 0.6 *  PI * (xEyeBegin - x) / 180.0;
+	linCombVector3(eyePos, eyePos, horView, (yMotionBegin - y) * 0.1);
+	
+	rotateVectorY(viewDir, eyeXAngle);
+	
+	xEyeBegin = x;
+	yMotionBegin = y;
+
+	glutPostRedisplay();
+}
+
+// strafe
+void middleMotion(int x, int y) 
+{
+	// the 90 degree rotated view vector 
+	// y zero so we don't move in the vertical
+	Vector3 rVec = {viewDir[0], 0, viewDir[2]};
+	
+	rotateVectorY(rVec, PI / 2.0);
+	linCombVector3(eyePos, eyePos, rVec, (horizontalMotionBegin - x) * 0.1);
+	
+	eyePos[1] += (verticalMotionBegin - y) * 0.1;
+
+	horizontalMotionBegin = x;
+	verticalMotionBegin = y;
+
+	glutPostRedisplay();
+}
+
+
+void initExtensions(void) 
+{
+	GLenum err = glewInit();
+	if(GLEW_OK != err) {
+		// problem: glewInit failed, something is seriously wrong
+		fprintf(stderr,"Error: %s\n",glewGetErrorString(err));
+		exit(1);
+	}
+
+	if(!GLEW_ARB_occlusion_query) {
+		printf("I require the GL_ARB_occlusion_query OpenGL extension to work.\n");
+		exit(1);
+	}
+}
+
+
+void begin2D(void) 
+{
+	glDisable(GL_LIGHTING);
+	glDisable(GL_DEPTH_TEST);
+
+	glPushMatrix();
+	glLoadIdentity();
+
+	glMatrixMode(GL_PROJECTION);
+	glPushMatrix();
+	glLoadIdentity();
+	gluOrtho2D(0, winWidth, winHeight, 0);
+}
+
+
+void end2D(void) 
+{
+	glPopMatrix();
+	glMatrixMode(GL_MODELVIEW);
+	glPopMatrix();
+
+	glEnable(GL_LIGHTING);
+	glEnable(GL_DEPTH_TEST);
+}
+
+
+void output(const int x, const int y, const char *string) 
+{
+	if(string != 0) 
+	{
+		int len, i;
+		glRasterPos2f(x,y);
+		len = (int) strlen(string);
+		
+		for (i = 0; i < len; i++) 
+		{
+			glutBitmapCharacter(GLUT_BITMAP_8_BY_13,string[i]);
+		}
+	}
+}
+
+// explicitly deletes geometry generated for hierarchy 
+// (deleting the hierarchy does not delete the geometry)
+void deleteGeometry()
+{
+	for (GeometryList::iterator it = geometry.begin(); it != geometry.end(); it++)
+		if(*it)	delete (*it);
+	
+	geometry.clear();
+}
+
+// displays the visualisation of the kd tree node culling
+void displayVisualization()
+{
+	begin2D();
+	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+	glEnable(GL_BLEND);
+	glColor4f(0.0,0.0,0.0,0.5); 
+
+	glRecti(winWidth, 0, winWidth / 2, winHeight / 2);
+	glDisable(GL_BLEND);
+	end2D();
+
+	glViewport(winWidth / 2, winHeight / 2, winWidth, winHeight);
+	glPushMatrix();
+	glLoadMatrixd(visView);
+	
+	glClear(GL_DEPTH_BUFFER_BIT);
+
+	// --- visualization of the occlusion culling
+	HierarchyNode::SetRenderBoundingVolume(true);
+	traverser.RenderVisualization();
+	HierarchyNode::SetRenderBoundingVolume(showBoundingVolumes);
+
+	glPopMatrix();
+	glViewport(0, 0, winWidth, winHeight);
+}
+
+/**
+	sets up view matrix in order to get a good position 
+	for viewing the kd tree node culling
+*/
+void setupVisView()
+{
+	const Vector3 up = {0.0, 1.0, 0.0};
+	
+	Vector3 visPos = {24, 23, -6};
+	
+	visPos[0] *= visZoomFactor; 
+	visPos[1] *= visZoomFactor; 
+	visPos[2] *= visZoomFactor;
+
+	Vector3 visDir = {-1.3,-1,-1};
+	
+	normalize(visDir);
+	look(visView, visPos, visDir, up);
+}
+
+// we take a couple of measurements and compute the average
+long calcRenderTime()
+{
+	long result = 0;
+
+	for(int i=0; i<renderTimesValid; i++)
+		result += renderTimes[i];
+    
+	if(renderTimesValid)
+		result /= renderTimesValid;
+
+	return result;
+}
+
+
+// reset the timer array for a new traversal method
+void resetTimer()
+{
+	renderTimesValid = 0;
+	renderTimesIdx = 0;
+}
+
+// cleanup routine after the main loop
+void cleanUp()
+{
+	if(traverser.GetHierarchy()) 
+		delete traverser.GetHierarchy();
+
+	deleteGeometry();
+
+	Geometry::CleanUp();
+}
+
+// this function inserts a dezimal point after each 1000
+void calcDecimalPoint(string &str, int d)
+{
+	vector<int> numbers;
+	char hstr[100];
+
+	while(d != 0)
+	{
+		numbers.push_back(d % 1000);
+		d /= 1000;
+	}
+
+	// first element without leading zeros
+	if(numbers.size() > 0)
+	{
+		sprintf(hstr, "%d", numbers.back());
+		str.append(hstr);
+	}
+	
+	for(int i=numbers.size()-2; i >= 0; i--)
+	{
+		sprintf(hstr, ",%03d", numbers[i]);
+		str.append(hstr);
+	}
+}
Index: /tags/DummyModules/VUT/chcdemo/Geometry.cpp
===================================================================
--- /tags/DummyModules/VUT/chcdemo/Geometry.cpp	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/Geometry.cpp	(revision 10)
@@ -0,0 +1,538 @@
+#include "Geometry.h"
+#include "glInterface.h"
+#include "stdio.h"
+#include "teapot.h"
+#include <math.h>
+
+#define NO_LIST    -1
+#define STRIP_END  -1
+
+int Geometry::num_torus_indices;
+int Geometry::num_torus_vertices;
+int Geometry::num_torus_normals;
+
+const int Geometry::torus_precision = 24;
+const int Geometry::sphere_precision = 24;
+
+float *Geometry::torus_vertices;
+float *Geometry::torus_normals;
+int *Geometry::torus_indices;
+
+// choose size so the glut-rendered sphere is approximately
+// as big as the other objects
+const float Geometry::sphere_radius = 1.0 / 9.0f;
+const float Geometry::torus_inner_radius = 0.05;
+const float Geometry::torus_outer_radius = 0.07;
+
+int Geometry::sDisplayList[NUM_OBJECTS];
+
+bool Geometry::sIsInitialised = Init();
+
+Geometry::Geometry(): 
+mXRotation(0), mYRotation(0), mZRotation(0), mScale(1.0), mObjectType(TEAPOT)
+{
+	copyVector3Values(mTranslation, 0, 0, 0);
+	
+	SetAmbientColor(0.1745, 0.01175, 0.01175);
+	SetDiffuseColor(0.61424, 0.04136, 0.04136);
+	SetSpecularColor(0.727811, 0.626959, 0.626959);
+	
+	CalcBoundingVolume();
+	CalcTransform();
+	GenerateList();
+}
+
+Geometry::Geometry(Vector3 translation, float xRot, float yRot, float zRot, float scale, int objectType):
+mXRotation(xRot), mYRotation(yRot), mZRotation(zRot), mScale(scale), mObjectType(objectType)
+{
+	copyVector3(mTranslation, translation);
+
+	SetAmbientColor(0.1745, 0.01175, 0.01175);
+	SetDiffuseColor(0.61424, 0.04136, 0.04136);
+	SetSpecularColor(0.727811, 0.626959, 0.626959);
+	
+	CalcBoundingVolume();
+	CalcTransform();
+	GenerateList();
+}
+
+void Geometry::ResetLists()
+{
+	for(int i = 0; i < NUM_OBJECTS; i++)
+	{
+        if(sDisplayList[i] == NO_LIST)
+			glDeleteLists(sDisplayList[i], 1);
+
+		sDisplayList[i] = NO_LIST;
+	}
+}
+
+void Geometry::CleanUp()
+{
+	ResetLists();
+
+	delete [] torus_vertices;
+	delete [] torus_normals;
+	delete [] torus_indices;
+}
+
+
+bool Geometry::Init()
+{
+	for(int i=0; i < NUM_OBJECTS; i++)
+		sDisplayList[i] = NO_LIST;
+
+	// parameters chosen so torus is approximately as big as teapot
+	CreateTorus(torus_inner_radius, torus_outer_radius, torus_precision);
+
+	return true;
+}
+
+void Geometry::GenerateList()
+{
+	if(sDisplayList[mObjectType] == NO_LIST)
+	{
+		sDisplayList[mObjectType] = glGenLists(1);
+		glNewList(sDisplayList[mObjectType], GL_COMPILE);
+
+		switch(mObjectType)
+		{
+			case TEAPOT:
+				RenderTeapot();
+				break;
+			case TORUS:
+				RenderTorus();
+				break;
+			case SPHERE:	
+				RenderSphere();
+				break;
+			
+			default:
+				break;
+		}
+		glEndList();
+	}
+}
+
+void Geometry::Render()
+{
+	glMaterialfv(GL_FRONT, GL_AMBIENT, mAmbientColor);
+	glMaterialfv(GL_FRONT, GL_DIFFUSE, mDiffuseColor);
+	glMaterialfv(GL_FRONT, GL_SPECULAR, mSpecularColor);
+	
+	glPushMatrix();
+	
+	Transform();
+	
+	glCallList(sDisplayList[mObjectType]);
+
+	glPopMatrix();
+}
+
+
+//! sets rotations around the three axis: executed in the order specified here
+void Geometry::SetRotations(float xRot, float yRot, float zRot)
+{
+	mXRotation = xRot;
+	mYRotation = yRot;
+	mZRotation = zRot;
+
+	CalcBoundingVolume();
+	CalcTransform();
+}
+
+
+void Geometry::SetTranslation(Vector3 translation)
+{
+	copyVector3(mTranslation, translation);
+
+	CalcBoundingVolume();
+	CalcTransform();
+}
+
+
+void Geometry::SetScale(float scale)
+{
+	mScale = scale;
+	CalcTransform();
+
+	CalcBoundingVolume();
+}
+
+
+void Geometry::SetAmbientColor(float ambientR, float ambientG, float ambientB)
+{
+	mAmbientColor[0] = ambientR;
+	mAmbientColor[1] = ambientG;
+	mAmbientColor[2] = ambientB;
+}
+
+
+void Geometry::SetDiffuseColor(float diffuseR, float diffuseG, float diffuseB)
+{
+	mDiffuseColor[0] = diffuseR;
+	mDiffuseColor[1] = diffuseG;
+	mDiffuseColor[2] = diffuseB;
+}
+
+
+void Geometry::SetSpecularColor(float specularR, float specularG, float specularB)
+{
+	mSpecularColor[0] = specularR;
+	mSpecularColor[1] = specularG;
+	mSpecularColor[2] = specularB;
+}
+
+
+float Geometry::GetScale()
+{
+	return mScale;
+}
+
+
+void Geometry::GetTranslation(Vector3 translation)
+{
+	copyVector3(translation, mTranslation);
+}
+
+
+void Geometry::GetRotations(float &xRot, float &yRot, float &zRot)
+{
+	xRot = mXRotation;
+	yRot = mYRotation;
+	zRot = mZRotation;
+}
+
+	
+const AABox &Geometry::GetBoundingVolume()
+{
+	return mBoundingBox;
+}
+
+
+void Geometry::SetLastVisited(int lastVisited)
+{
+	mLastVisited = lastVisited;
+}
+
+
+int Geometry::GetLastVisited()
+{
+	return mLastVisited;
+}
+
+
+void Geometry::SetObjectType(int type)
+{
+	mObjectType = type;
+	GenerateList();
+}
+
+
+void Geometry::RenderTeapot()
+{
+	int i = 0;
+
+	while(i < num_teapot_indices)
+	{
+		glBegin(GL_TRIANGLE_STRIP);
+			while(teapot_indices[i] != STRIP_END)
+			{	
+				int index = teapot_indices[i] * 3;
+				
+				glNormal3fv(teapot_normals + index);
+				glVertex3fv(teapot_vertices + index);
+				
+				i++;		
+			}
+		glEnd();
+		
+		i++; // skip strip end flag
+	}
+}
+
+void Geometry::CalcBoundingVolume()
+{
+    switch(mObjectType)
+	{
+		case TORUS:
+			CalcBoundingVolume(torus_vertices, num_torus_vertices);
+			break;
+		case SPHERE:
+			CalcSphereBoundingVolume();
+			break;
+		case TEAPOT:
+			CalcBoundingVolume(teapot_vertices, num_teapot_vertices);
+			break;
+		default:
+			break;
+	}
+}
+
+
+void Geometry::CalcBoundingVolume(float *vertices, const int num_vertices)
+{
+	Vector3 *rotatedPoints = new Vector3[num_vertices];
+	
+	for(int i = 0; i < num_vertices; i++)
+	{
+		copyVector3Values(rotatedPoints[i], vertices[i * 3],
+						  vertices[i * 3 + 1], vertices[i * 3 + 2]);
+	
+		rotateVectorZ(rotatedPoints[i], mZRotation * PI_180);
+		rotateVectorY(rotatedPoints[i], mYRotation * PI_180);
+		rotateVectorX(rotatedPoints[i], mXRotation * PI_180);
+	}
+
+	calcCubicHull(mBoundingBox.min, mBoundingBox.max, rotatedPoints, num_vertices);
+
+	for(int i=0; i< 3; i++)
+	{
+		mBoundingBox.min[i] *= mScale;
+		mBoundingBox.max[i] *= mScale;
+	}
+
+	addVector3(mBoundingBox.min, mTranslation, mBoundingBox.min);
+    addVector3(mBoundingBox.max, mTranslation, mBoundingBox.max);
+
+	delete [] rotatedPoints;
+}
+
+
+void Geometry::CalcSphereBoundingVolume()
+{
+	float len = mScale * sphere_radius;
+	Vector3 size = {len, len, len};
+					
+	diffVector3(mBoundingBox.min, mTranslation, size);
+	addVector3(mBoundingBox.max, mTranslation, size);
+}
+
+
+void Geometry::RenderTorus()
+{
+	glVertexPointer(3, GL_FLOAT, sizeof(float), torus_vertices);
+	glEnableClientState(GL_VERTEX_ARRAY);
+
+	glNormalPointer(GL_FLOAT, sizeof(float), torus_normals);
+	glEnableClientState(GL_NORMAL_ARRAY);
+
+    glDrawElements(GL_TRIANGLES, num_torus_indices, GL_UNSIGNED_INT, torus_indices);
+
+	glDisableClientState(GL_VERTEX_ARRAY);
+	glDisableClientState(GL_NORMAL_ARRAY);
+}
+
+/*
+	creates a torus with specified radii, with number of rings and ring
+	subdivision = precision.
+*/
+void Geometry::CreateTorus(float innerRadius, float outerRadius, int precision)
+{
+	num_torus_vertices = num_torus_normals = (precision + 1) * (precision + 1);
+	num_torus_indices = 2 * precision * precision * 3;
+
+	torus_vertices = new float[num_torus_vertices * 3];
+	torus_normals = new float[num_torus_normals * 3];
+	torus_indices = new int[num_torus_indices];
+
+	for(int i=0; i<precision+1; i++)
+	{
+		int index = i * 3;
+
+		Vector3 currentVertex = {innerRadius, 0.0f, 0.0f};
+		rotateVectorZ(currentVertex, ((float)i * 2.0 * PI) / (float)precision);
+
+		currentVertex[0] += outerRadius;
+		
+		Vector3 sTangent = {0.0f, 0.0f, -1.0f};
+		Vector3 tTangent = {0, -1, 0};
+		rotateVectorZ(tTangent, ((float)i * 2.0 * PI) / (float)precision);
+
+      	Vector3 currentNormal;
+
+		cross(currentNormal, tTangent, sTangent);
+
+		torus_normals[index + 0] = currentNormal[0];
+		torus_normals[index + 1] = currentNormal[1];
+		torus_normals[index + 2] = currentNormal[2];
+		
+		torus_vertices[index + 0] = currentVertex[0];
+		torus_vertices[index + 1] = currentVertex[1];
+		torus_vertices[index + 2] = currentVertex[2];
+	}
+
+	for(int i_rng=1; i_rng<precision+1; ++i_rng)
+	{
+		for(int i=0; i<precision+1; ++i)
+		{
+			int index = 3 * (i_rng * (precision + 1) + i);
+
+			Vector3 currentVertex = {torus_vertices[i*3], torus_vertices[i*3+1], torus_vertices[i*3+2]};
+			
+			rotateVectorY(currentVertex, ((float)i_rng * 2.0 * PI) / (float)precision);
+						
+			Vector3 currentNormal = {torus_normals[i*3], torus_normals[i*3+1], torus_normals[i*3+2]};
+			
+			rotateVectorY(currentNormal, ((float)i_rng * 2.0 * PI) / (float)precision);
+
+			torus_normals[index + 0] = currentNormal[0];
+			torus_normals[index + 1] = currentNormal[1];
+			torus_normals[index + 2] = currentNormal[2];
+		
+			torus_vertices[index + 0] = currentVertex[0];
+			torus_vertices[index + 1] = currentVertex[1];
+			torus_vertices[index + 2] = currentVertex[2];
+		}
+	}
+
+	for(i_rng=0; i_rng<precision; ++i_rng)
+	{
+		for(i=0; i<precision; ++i)
+		{
+			int index = ((i_rng * precision + i) * 2) * 3;
+
+			torus_indices[index+0] = (i_rng     * (precision+1) + i)*3;
+			torus_indices[index+1] = ((i_rng+1) * (precision+1) + i)*3;
+			torus_indices[index+2] = (i_rng     * (precision+1) + i + 1)*3;
+
+			index = ((i_rng * precision + i) * 2 + 1) * 3;
+
+			torus_indices[index+0] = (i_rng     * (precision+1) + i + 1)*3;
+			torus_indices[index+1] = ((i_rng+1) * (precision+1) + i)*3;
+			torus_indices[index+2] = ((i_rng+1) * (precision+1) + i + 1)*3;
+		}
+	}
+}
+
+/**
+	counts the triangles of the teapot.
+	traverses through all the triangle strips.
+*/
+int Geometry::CountTeapotTriangles()
+{
+	int result = 0;
+	int i=0;
+	// n - 2 triangles are drawn for a strip
+	while(i < num_teapot_indices)
+	{
+		while(teapot_indices[i] != STRIP_END)
+		{	
+			result ++;;
+			i++;		
+		}
+		result -= 2;
+		i++; // skip STRIP_END
+	}
+	return result;
+}
+
+/**
+	counts the triangles of the torus
+*/
+int Geometry::CountTorusTriangles()
+{
+	// every 3 indices specify one triangle
+	return num_torus_indices / 3;
+}
+
+/**
+	counts the triangles of the sphere.
+	sphere_precision / 2 + 1 strips with sphere_precision * 2 - 2 triangles each
+*/
+int Geometry::CountSphereTriangles()
+{
+	return sphere_precision * sphere_precision;
+}
+
+
+int Geometry::CountTriangles(int objectType)
+{
+	int result = 0;
+
+	switch(objectType)
+	{
+		case TEAPOT:
+			result = CountTeapotTriangles();
+			break;
+		case TORUS:
+			result = CountTorusTriangles();
+			break;
+		case SPHERE:	
+			result = CountSphereTriangles();
+			break;
+		default:
+			break;
+	}
+	return result;
+}
+
+
+void Geometry::Transform()
+{
+	glMultMatrixd(mTransform);
+}
+
+void Geometry::CalcTransform()
+{
+	Matrix4x4 scale;
+	Matrix4x4 xrot;
+	Matrix4x4 yrot;
+	Matrix4x4 zrot;
+	Matrix4x4 transl;
+
+	makeScaleMtx(scale, mScale, mScale, mScale);
+	makeTranslationMtx(transl, mTranslation);
+	makeRotationXMtx(xrot, mXRotation * PI_180);
+	makeRotationYMtx(yrot, mYRotation * PI_180);
+	makeRotationZMtx(zrot, mZRotation * PI_180);
+
+	copyMatrix(mTransform, IDENTITY);
+	mult(mTransform, mTransform, transl);
+	mult(mTransform, mTransform, xrot);
+	mult(mTransform, mTransform, yrot);
+	mult(mTransform, mTransform, zrot);
+	mult(mTransform, mTransform, scale);
+}
+
+/**
+   renders a sphere with sphere_precision subdivisions.
+   note: works only for even sphere_precision
+*/
+void Geometry::RenderSphere()
+{
+	Vector3 vertex;
+
+	// this algorithm renders the triangles clockwise
+	glFrontFace(GL_CW);
+
+	for (int j = 0; j < sphere_precision/2; ++j) 
+	{
+		double alpha = j * PI * 2.0 / (double)sphere_precision - PI_2;
+		double beta = (j + 1) * PI * 2.0 / (double)sphere_precision - PI_2;
+
+		glBegin(GL_TRIANGLE_STRIP);
+
+		for (int i = 0; i <= sphere_precision; ++i) 
+		{
+			double gamma = i * PI * 2.0 / (double)sphere_precision;
+	
+			vertex[0] = sphere_radius * cos(beta) * cos(gamma);
+			vertex[1] = sphere_radius * sin(beta);
+			vertex[2] = sphere_radius * cos(beta) * sin(gamma);
+
+			glNormal3dv(vertex);
+			glVertex3dv(vertex);
+
+			vertex[0] = sphere_radius * cos(alpha) * cos(gamma);
+			vertex[1] = sphere_radius * sin(alpha);
+			vertex[2] = sphere_radius * cos(alpha) * sin(gamma);
+
+		    glNormal3dv(vertex);
+			glVertex3dv(vertex);
+
+		}
+		glEnd();
+	}
+	glFrontFace(GL_CCW);
+}
Index: /tags/DummyModules/VUT/chcdemo/CMakeLists.txt
===================================================================
--- /tags/DummyModules/VUT/chcdemo/CMakeLists.txt	(revision 10)
+++ /tags/DummyModules/VUT/chcdemo/CMakeLists.txt	(revision 10)
@@ -0,0 +1,11 @@
+PROJECT (occquery C)
+
+ADD_EXECUTABLE(occquery DataTypes.c occquery.cpp MathStuff.c  DataTypes.h MathStuff.h HierarchyNode.h HierarchyNode.cpp Geometry.h Geometry.cpp RenderTraverser.cpp RenderTraverser.h Timers.h Timers.cpp)
+
+IF (WIN32)
+  TARGET_LINK_LIBRARIES(occquery ${CMAKE_CURRENT_SOURCE_DIR}/GL/glew32.lib)
+  TARGET_LINK_LIBRARIES(occquery ${CMAKE_CURRENT_SOURCE_DIR}/GL/glut32.lib)
+ELSE (WIN32)
+  TARGET_LINK_LIBRARIES(occquery glew)
+  TARGET_LINK_LIBRARIES(occquery glut)
+ENDIF (WIN32)
Index: /tags/DummyModules/VUT/work/todo_occlusionculling.txt
===================================================================
--- /tags/DummyModules/VUT/work/todo_occlusionculling.txt	(revision 61)
+++ /tags/DummyModules/VUT/work/todo_occlusionculling.txt	(revision 61)
@@ -0,0 +1,29 @@
+1) write into ogre forum
+2) mode_render does not do any change
+3) scenenode::_rendervisibleobjects already uses frustum culling
+4) implement for bsp trees
+5) improve mouse control (strave)
+6) cull camera for testing
+7) error when near plane crosses bounding volume
+8) bounding box should be not two parts
+9) implement z-buffer pass
+10) nice scene for dotscenemanager + terrainscenemanager
+11) ask about ogre changes
+12) preprocess: do not always destroy occlusion queries
+13) prevent multiple rendering of objects, scene nodes and hierarchy nodes
+14) learn to create terrains (heightmaps)
+15) work with maya
+16) occlusion culling + transparent materials, shadows!!
+17) minimize code for new scenemanager (macros?)
+18) make more flexible: callbacks
+19) find out how rotations happen
+20) investigate time coherence options (i.e., query only every nth frame
+21) möllers acceleration for frustum culling
+22) update so less code has to be replicated in terrainscenetraverser
+23) implement frustum test where intersect by near plane is considered
+24) tell ogre-people about changes
+25) check glfinish error
+26) also disable frustum culling on mouse click
+27) better comments
+28) setrendermode: change!!!
+29) problems with coherent & geometry not in leave
Index: /tags/DummyModules/VUT/work/tools/replid
===================================================================
--- /tags/DummyModules/VUT/work/tools/replid	(revision 65)
+++ /tags/DummyModules/VUT/work/tools/replid	(revision 65)
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+#$Id: replid,v 1.2 1999/11/06 21:23:19 bittner Exp $
+# Initially coding Jiri Bittner
+    
+if [ $# -lt 3 ]; then echo "Usage: replid strA strB file_list $1 $2"; fi
+
+STR1=$1
+STR2=$2
+
+shift
+shift
+FILES=`grep -l $STR1 $*`
+
+echo $FILES
+
+SEPARATORS='[^a-zA-Z0-9_\.]'
+BACKUPDIR="Backup"
+
+if [ ! -d $BACKUPDIR ]; then  mkdir $BACKUPDIR; fi
+
+for FILE in $FILES; do
+ echo "Replacing in $FILE"
+ cp $FILE $BACKUPDIR/$FILE
+ CMD='-e s/\('$SEPARATORS'\)'$STR1'\('$SEPARATORS'\)/\1'$STR2'\2/g -e  s/^'$STR1'\('$SEPARATORS'\)/'$STR2'\1/g  -e  s/\('$SEPARATORS'\)'$STR1'$/\1'$STR2'/g -e  s/^'$STR1'$/'$STR2'/g'
+# echo $CMD
+ sed $CMD < $BACKUPDIR/$FILE > $FILE.tmp
+ mv $FILE.tmp $FILE
+done
+
+
+
+
+
+
+
Index: /tags/DummyModules/VUT/work/tools/batch_replace
===================================================================
--- /tags/DummyModules/VUT/work/tools/batch_replace	(revision 65)
+++ /tags/DummyModules/VUT/work/tools/batch_replace	(revision 65)
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# $Id: brepl,v 1.2 1999/11/06 21:23:19 bittner Exp $
+# Script used to globaly replace identifiers in GOLEM on 6.11. 1999
+# Initially coding Jiri Bittner
+
+# some manual changed to the code were also neccesary
+# - stats.h members of classes CIntersections and CObjects (class name collisions)
+# - hfield.h member BoundingBox
+# - world.cpp environment strings (e.g. CBSP -> BSP)
+# ...
+
+    
+FILES=$*
+
+#replid  Vector3D Vector3 $FILES
+#replid  Visibility GtpVisibility $FILES
+#replid  SceneTraverser HierarchyInterface $FILES
+replid  Visibility GtpVisibilityPreprocessor $FILES
+
+
Index: /tags/DummyModules/VUT/work/TestCullingDotScene/TestCullingDotScene.vcproj
===================================================================
--- /tags/DummyModules/VUT/work/TestCullingDotScene/TestCullingDotScene.vcproj	(revision 64)
+++ /tags/DummyModules/VUT/work/TestCullingDotScene/TestCullingDotScene.vcproj	(revision 64)
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="TestCullingDotScene"
+	ProjectGUID="{BE13944C-D05E-467F-B0AC-8A65A3B5FE60}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory=".\bin\$(ConfigurationName)"
+			IntermediateDirectory=".\obj\$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(OGRE_PATH)\Dependencies\include&quot;;&quot;$(OGRE_PATH)\OgreMain\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include\CEGUI&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\include&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\include&quot;;../include"
+				PreprocessorDefinitions="_WINDOWS;_STLP_USE_DYNAMIC_LIB;OGRE_LIBRARY_IMPORTS;_DEBUG;WIN32;_STLP_DEBUG"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="Plugin_OctreeSceneManager.lib OGREMain_d.LIB CEGUIBase_d.lib OgreGUIRenderer_d.lib Plugin_DotSceneManager.lib"
+				OutputFile="$(OGRE_PATH)/Samples/Common/bin/Debug/TestCullingDotScene.exe"
+				LinkIncremental="2"
+				AdditionalLibraryDirectories="&quot;$(OGRE_PATH)\Dependencies\Lib\Debug&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\bin\debug&quot;;&quot;$(OGRE_PATH)\OgreMain\Lib\Debug&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\bin\debug&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\lib&quot;"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/TestCullingDotScene.pdb"
+				SubSystem="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/TestCullingDotScene.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath=".\TestCullingDotSceneApplication.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath=".\TestCullingDotSceneApplication.h">
+			</File>
+		</Filter>
+		<Filter
+			Name="tinyxml"
+			Filter="">
+			<File
+				RelativePath="..\tinyxml\tinystr.cpp">
+			</File>
+			<File
+				RelativePath="..\tinyxml\tinystr.h">
+			</File>
+			<File
+				RelativePath="..\tinyxml\tinyxml.cpp">
+			</File>
+			<File
+				RelativePath="..\tinyxml\tinyxml.h">
+			</File>
+			<File
+				RelativePath="..\tinyxml\tinyxmlerror.cpp">
+			</File>
+			<File
+				RelativePath="..\tinyxml\tinyxmlparser.cpp">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: /tags/DummyModules/VUT/work/TestCullingDotScene/TestCullingDotSceneApplication.cpp
===================================================================
--- /tags/DummyModules/VUT/work/TestCullingDotScene/TestCullingDotSceneApplication.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCullingDotScene/TestCullingDotSceneApplication.cpp	(revision 61)
@@ -0,0 +1,593 @@
+/**
+    \file 
+        TestCullingApplication.cpp
+    \brief
+        Tests the occlusion culling algorithm
+*/
+
+#include <OgreNoMemoryMacros.h>
+#include <CEGUI/CEGUI.h>
+#include <../CEGUIRenderer/include/OgreCEGUIRenderer.h>
+#include <../CEGUIRenderer/include/OgreCEGUIResourceProvider.h>
+#include <../CEGUIRenderer/include/OgreCEGUITexture.h>
+#include <OgreMemoryMacros.h>
+
+#include "Ogre.h"
+#include "OgreLight.h"
+#include "tinyxml.h"
+#include "TestCullingDotSceneApplication.h"
+
+#define WIN32_LEAN_AND_MEAN
+#include "windows.h"
+
+/***********************************************/
+/* TestCullingDotSceneApplication implementation       */
+/***********************************************/
+void TestCullingDotSceneApplication::ParseDotScene( const String &SceneName, const String& groupName )
+{
+	TiXmlDocument	*XMLDoc;
+	TiXmlElement	*XMLRoot, *XMLNodes, *XMLPathFind;
+	try
+	{
+		DataStreamPtr pStream = ResourceGroupManager::getSingleton().openResource( SceneName, groupName );
+
+		String data = pStream->getAsString();
+
+		// Open the .scene File
+		XMLDoc = new TiXmlDocument();
+		XMLDoc->Parse( data.c_str() );
+		pStream->close();
+		pStream.setNull();
+
+		if( XMLDoc->Error() )
+		{
+			//We'll just log, and continue on gracefully
+			LogManager::getSingleton().logMessage("Error in dotscene demo app!!!!!");
+			delete XMLDoc;
+			return;
+		}
+	}
+	catch(...)
+	{
+		//We'll just log, and continue on gracefully
+		LogManager::getSingleton().logMessage("Error in dotscene demo app!!!!!");
+		delete XMLDoc;
+		return;
+	}
+
+	// Validate the File
+	XMLRoot = XMLDoc->RootElement();
+	if( String( XMLRoot->Value()) != "scene"  ) {
+		LogManager::getSingleton().logMessage( "Error: Invalid .scene File. Missing <scene>" );
+		delete XMLDoc;		
+		return;
+	}
+		
+	XMLNodes = XMLRoot->FirstChildElement( "nodes" );
+	
+	// Read in the scene nodes
+	if( XMLNodes )
+	{
+		TiXmlElement *XMLNode, *XMLPosition, *XMLRotation, *XMLScale,  *XMLEntity, *XMLBillboardSet,  *XMLLight;
+
+		XMLNode = XMLNodes->FirstChildElement( "node" );
+		
+		while( XMLNode )
+		{
+			// Process the current node
+			// Grab the name of the node
+			String NodeName = XMLNode->Attribute("name");
+			// First create the new scene node
+			SceneNode* NewNode = static_cast<SceneNode*>( mSceneMgr->getRootSceneNode()->createChild( NodeName ) );
+
+			Vector3 TempVec;
+			String TempValue;
+				
+			// Now position it...
+			XMLPosition = XMLNode->FirstChildElement("position");
+			
+			if( XMLPosition )
+			{
+				TempValue = XMLPosition->Attribute("x");
+				TempVec.x = StringConverter::parseReal(TempValue);
+				TempValue = XMLPosition->Attribute("y");
+				TempVec.y = StringConverter::parseReal(TempValue);
+				TempValue = XMLPosition->Attribute("z");
+				TempVec.z = StringConverter::parseReal(TempValue);
+				NewNode->setPosition( TempVec );
+			}
+
+			// Rotate it...
+			XMLRotation = XMLNode->FirstChildElement("rotation");
+			if( XMLRotation )
+			{
+				Quaternion TempQuat;
+				TempValue = XMLRotation->Attribute("qx");
+				TempQuat.x = StringConverter::parseReal(TempValue);
+				TempValue = XMLRotation->Attribute("qy");
+				TempQuat.y = StringConverter::parseReal(TempValue);
+				TempValue = XMLRotation->Attribute("qz");
+				TempQuat.z = StringConverter::parseReal(TempValue);
+				TempValue = XMLRotation->Attribute("qw");
+				TempQuat.w = StringConverter::parseReal(TempValue);
+				NewNode->setOrientation( TempQuat );
+			}
+
+			// Scale it.
+			XMLScale = XMLNode->FirstChildElement("scale");
+			
+			if( XMLScale )
+			{
+				TempValue = XMLScale->Attribute("x");
+				TempVec.x = StringConverter::parseReal(TempValue);
+				TempValue = XMLScale->Attribute("y");
+				TempVec.y = StringConverter::parseReal(TempValue);
+				TempValue = XMLScale->Attribute("z");
+				TempVec.z = StringConverter::parseReal(TempValue);
+				NewNode->setScale( TempVec );
+			}
+
+			XMLLight = XMLNode->FirstChildElement( "light" );
+			
+			if( XMLLight )
+				NewNode->attachObject( LoadLight( XMLLight ) );
+
+			// Check for an Entity
+			XMLEntity = XMLNode->FirstChildElement("entity");
+			
+			if( XMLEntity )
+			{
+				if( XMLEntity->Attribute("static") )
+				{
+					if( strcmp( XMLEntity->Attribute("static"), "false" )==0 ){
+						String EntityName, EntityMeshFilename;
+						EntityName = XMLEntity->Attribute( "name" );
+						EntityMeshFilename = XMLEntity->Attribute( "meshFile" );
+
+						// Create entity
+						Entity* NewEntity = mSceneMgr->createEntity(EntityName, EntityMeshFilename);
+						NewNode->attachObject( NewEntity );
+					}
+				}
+			}
+
+			XMLBillboardSet = XMLNode->FirstChildElement( "billboardSet" );
+			if( XMLBillboardSet )
+			{
+				String TempValue;
+
+				BillboardSet* bSet = mSceneMgr->createBillboardSet( NewNode->getName() );
+
+				BillboardType Type;
+				TempValue = XMLBillboardSet->Attribute( "type" );
+				if( TempValue == "orientedCommon" ) 
+					Type = BBT_ORIENTED_COMMON;
+				else if( TempValue == "orientedSelf" )
+					Type = BBT_ORIENTED_SELF;
+				else Type = BBT_POINT;
+
+				BillboardOrigin Origin;
+				TempValue = XMLBillboardSet->Attribute( "type" );
+				if( TempValue == "bottom_left" )
+					Origin = BBO_BOTTOM_LEFT;
+				else if( TempValue == "bottom_center" )
+					Origin = BBO_BOTTOM_CENTER;
+				else if( TempValue == "bottomRight"  )
+					Origin = BBO_BOTTOM_RIGHT;
+				else if( TempValue == "left" )
+					Origin = BBO_CENTER_LEFT;
+				else if( TempValue == "right" )
+					Origin = BBO_CENTER_RIGHT;
+				else if( TempValue == "topLeft" )
+					Origin = BBO_TOP_LEFT;
+				else if( TempValue == "topCenter" )
+					Origin = BBO_TOP_CENTER;
+				else if( TempValue == "topRight" )
+					Origin = BBO_TOP_RIGHT;
+				else 
+					Origin = BBO_CENTER;
+
+				bSet->setBillboardType( Type );
+				bSet->setBillboardOrigin( Origin );
+
+				TempValue = XMLBillboardSet->Attribute( "name" );
+				bSet->setMaterialName( TempValue );
+
+				int width, height;
+				width = StringConverter::parseReal( XMLBillboardSet->Attribute( "width" ) );
+				height = StringConverter::parseReal( XMLBillboardSet->Attribute( "height" ) );
+				bSet->setDefaultDimensions( width, height );
+				bSet->setVisible( true );
+				NewNode->attachObject( bSet );
+
+				TiXmlElement *XMLBillboard;
+
+				XMLBillboard = XMLBillboardSet->FirstChildElement( "billboard" );
+
+				while( XMLBillboard )
+				{
+					Billboard *b;
+					TempValue;
+					TempVec = Vector3( 0, 0, 0 );
+					ColourValue TempColour(1,1,1,1);
+
+					XMLPosition = XMLBillboard->FirstChildElement( "position" );
+					if( XMLPosition ){
+						TempValue = XMLPosition->Attribute("x");
+						TempVec.x = StringConverter::parseReal(TempValue);
+						TempValue = XMLPosition->Attribute("y");
+						TempVec.y = StringConverter::parseReal(TempValue);
+						TempValue = XMLPosition->Attribute("z");
+						TempVec.z = StringConverter::parseReal(TempValue);
+					}
+
+					TiXmlElement* XMLColour = XMLBillboard->FirstChildElement( "colourDiffuse" );
+					if( XMLColour )
+					{
+						TempValue = XMLColour->Attribute("r");
+						TempColour.r = StringConverter::parseReal(TempValue);
+						TempValue = XMLColour->Attribute("g");
+						TempColour.g = StringConverter::parseReal(TempValue);
+						TempValue = XMLColour->Attribute("b");
+						TempColour.b = StringConverter::parseReal(TempValue);
+					}
+
+					b = bSet->createBillboard( TempVec, TempColour);
+
+					XMLBillboard = XMLBillboard->NextSiblingElement( "billboard" );
+				}
+			}
+
+			// Move to the next node
+			XMLNode = XMLNode->NextSiblingElement( "node" );
+		}
+	}
+
+	// Close the XML File
+	delete XMLDoc;
+}
+
+Light* TestCullingDotSceneApplication::LoadLight( TiXmlElement *XMLLight )
+{
+	TiXmlElement *XMLDiffuse, *XMLSpecular, *XMLAttentuation, *XMLPosition;
+
+	// Create a light (point | directional | spot | radPoint)
+	Light* light = mSceneMgr->createLight( XMLLight->Attribute("name") );
+	if( !XMLLight->Attribute("type") || String(XMLLight->Attribute("type")) == "point" )
+		light->setType( Light::LT_POINT );
+	else if( String(XMLLight->Attribute("type")) == "directional")
+		light->setType( Light::LT_DIRECTIONAL );
+	else if( String(XMLLight->Attribute("type")) == "spot")
+		light->setType( Light::LT_SPOTLIGHT );
+	else if( String(XMLLight->Attribute("type")) == "radPoint")
+		light->setType( Light::LT_POINT );
+
+	XMLDiffuse = XMLLight->FirstChildElement("colourDiffuse");
+	if( XMLDiffuse )
+	{
+		ColourValue Diffuse;
+		Diffuse.r = Ogre::StringConverter::parseReal( XMLDiffuse->Attribute("r") );
+		Diffuse.g = Ogre::StringConverter::parseReal( XMLDiffuse->Attribute("g") );
+		Diffuse.b = Ogre::StringConverter::parseReal( XMLDiffuse->Attribute("b") );
+		Diffuse.a = 1;
+		light->setDiffuseColour(Diffuse);
+	}
+	
+	XMLSpecular = XMLLight->FirstChildElement("colourSpecular");
+	
+	if( XMLSpecular )
+	{
+		ColourValue Specular;
+		Specular.r = Ogre::StringConverter::parseReal( XMLSpecular->Attribute("r") );
+		Specular.g = Ogre::StringConverter::parseReal( XMLSpecular->Attribute("g") );
+		Specular.b = Ogre::StringConverter::parseReal( XMLSpecular->Attribute("b") );
+		Specular.a = 1;
+		light->setSpecularColour(Specular);
+	}
+
+	XMLAttentuation = XMLLight->FirstChildElement("lightAttenuation");
+	if( XMLAttentuation )
+	{
+		//get defaults incase not all values specified
+		Real range, constant, linear, quadratic;
+		range = light->getAttenuationRange();
+		constant = light->getAttenuationConstant();
+		linear = light->getAttenuationLinear();
+		quadratic = light->getAttenuationQuadric();
+			
+		if( XMLAttentuation->Attribute("range") )
+			range = StringConverter::parseReal( XMLAttentuation->Attribute("range") );
+		if( XMLAttentuation->Attribute("constant") )
+			constant = StringConverter::parseReal( XMLAttentuation->Attribute("constant") );
+		if( XMLAttentuation->Attribute("linear") )
+			linear = StringConverter::parseReal( XMLAttentuation->Attribute("linear") );
+		if( XMLAttentuation->Attribute("quadratic") )
+			quadratic = StringConverter::parseReal( XMLAttentuation->Attribute("quadratic") );
+			light->setAttenuation( range, constant, linear, quadratic );
+	}
+
+	XMLPosition = XMLLight->FirstChildElement("position");
+	if( XMLPosition ) 
+	{
+		Vector3 p = Vector3(0,0,0);
+		if( XMLPosition->Attribute("x") )
+			p.x = StringConverter::parseReal( XMLPosition->Attribute("x") );
+		if( XMLPosition->Attribute("y") )
+			p.y = StringConverter::parseReal( XMLPosition->Attribute("y") );
+		if( XMLPosition->Attribute("z") )
+			p.z = StringConverter::parseReal( XMLPosition->Attribute("z") );
+            
+		light->setPosition( p );
+	}
+
+	//castShadows		(true | false) "true"
+	light->setCastShadows( true );
+	if( XMLLight->Attribute("visible") )
+		if( String(XMLLight->Attribute("visible")) == "false" )
+				light->setCastShadows( false );
+			
+	//visible			(true | false) "true"		
+	light->setVisible( true );
+	if( XMLLight->Attribute("visible") )
+		if( String(XMLLight->Attribute("visible")) == "false" )
+			light->setVisible( false );
+
+	return light;
+}
+//-----------------------------------------------------------------------
+void TestCullingDotSceneApplication::createScene(void)
+{
+	mSceneMgr->setAmbientLight(ColourValue(0.09f, 0.09f, 0.09f));
+	mSceneMgr->setSkyBox(true, "Examples/MorningSkyBox" );
+		
+	//This is default, though, set it anyway :)
+	ResourceGroupManager::getSingleton().setWorldResourceGroupName("General");
+	mSceneMgr->setWorldGeometry( "MyScene.scene" );
+	//mSceneMgr->SetOctreeVisible( 1 );
+		
+	ParseDotScene( "MyScene.scene", "General" );
+	// CEGUI setup
+	setupGui();
+}
+//-----------------------------------------------------------------------
+void TestCullingDotSceneApplication::setupGui( void )
+{
+	 mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, ST_GENERIC);
+     mGUISystem = new CEGUI::System(mGUIRenderer);
+
+	 // Mouse
+     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
+     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
+	 mGUISystem->setDefaultMouseCursor(
+                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
+
+	 CEGUI::MouseCursor::getSingleton().show( );
+     
+	/* CEGUI::Window* sheet = 
+            CEGUI::WindowManager::getSingleton().loadWindowLayout(
+                (CEGUI::utf8*)"ogregui.layout"); 
+
+     mGUISystem->setGUISheet(sheet);*/
+}
+//-----------------------------------------------------------------------
+void TestCullingDotSceneApplication::createFrameListener(void)
+{
+	mFrameListener= new MouseQueryListener(mWindow, mCamera, mSceneMgr, mGUIRenderer);
+	mFrameListener->showDebugOverlay(true);
+	mRoot->addFrameListener(mFrameListener);
+}
+//-----------------------------------------------------------------------
+void TestCullingDotSceneApplication::chooseSceneManager(void)
+{
+	mSceneMgr = mRoot->getSceneManager(ST_GENERIC);
+
+}
+//-----------------------------------------------------------------------
+void TestCullingDotSceneApplication::createViewports(void)
+{
+	// Create one viewport, entire window
+	Viewport* vp = mWindow->addViewport(mCamera);
+	// Look back along -Z
+    mCamera->lookAt(Vector3(0, 0, -300));
+	mCamera->setPosition(0 , 100, 600);
+}
+
+/***********************************************/
+/* MouseQueryListener implementation           */
+/***********************************************/
+
+//-----------------------------------------------------------------------
+MouseQueryListener::MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer)
+        : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer), 
+		mShutdownRequested(false)
+{
+
+	// Setup default variables
+//	mCurrentObject = NULL;
+	mLMouseDown = false;
+	mRMouseDown = false;
+	mSceneMgr = sceneManager;
+
+    // Reduce move speed
+	mMoveSpeed = 50;
+	mRotateSpeed *= 2;
+
+	mCurrentAlgorithm = 0;//GtpVisibility::VisibilityEnvironment::FRUSTUM_CULLING;
+	mThreshold = 0;
+    
+	// Register this so that we get mouse events.
+	mEventProcessor->addMouseListener(this);
+	mEventProcessor->addMouseMotionListener(this);
+	mEventProcessor->addKeyListener(this);
+
+	// show overlay
+	Overlay* pOver = OverlayManager::getSingleton().getByName("Example/VisibilityDemoOverlay"); 
+
+	mAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/AlgorithmInfo");
+	mThresholdInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/ThresholdInfo");
+	mFrustumCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/FrustumCulledNodesInfo");
+	mQueryCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/QueryCulledNodesInfo");
+    mTraversedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/TraversedNodesInfo");
+
+	mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
+	mThresholdInfo->setCaption(": 0");
+	mFrustumCulledNodesInfo->setCaption(": 0");
+	mQueryCulledNodesInfo->setCaption(": 0");
+	mTraversedNodesInfo->setCaption(": 0");
+
+    pOver->show();
+} // MouseQueryListener
+//-----------------------------------------------------------------------
+void MouseQueryListener::mouseMoved (MouseEvent *e)
+{
+	// Update CEGUI with the mouse motion
+    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() * mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::mousePressed(MouseEvent* e)
+{
+     // Left mouse button down
+     if (e->getButtonID() & InputEvent::BUTTON0_MASK)
+     {
+		 CEGUI::MouseCursor::getSingleton().hide( );
+		 mLMouseDown = true;
+     } // if
+     // Right mouse button down
+     else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
+     {
+         CEGUI::MouseCursor::getSingleton().hide( );
+         mRMouseDown = true;
+     } // else if
+} // mousePressed
+
+ //-----------------------------------------------------------------------
+void MouseQueryListener::mouseReleased(MouseEvent* e)
+{
+    // Left mouse button up
+    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
+    {
+		CEGUI::MouseCursor::getSingleton().show( );
+        mLMouseDown = false;
+    }
+    // Right mouse button up
+    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
+    {
+        CEGUI::MouseCursor::getSingleton().show( );
+        mRMouseDown = false;
+    }
+} 
+//-----------------------------------------------------------------------
+void MouseQueryListener::mouseDragged (MouseEvent *e)
+ {
+	 // If we are dragging the left mouse button.	 
+	 if ( mLMouseDown )
+	 {
+		mCamera->yaw( -e->getRelX() * mRotateSpeed );
+		mCamera->pitch( -e->getRelY() * mRotateSpeed );
+     }
+	 	 
+	 // If we are dragging the right mouse button.
+	 if ( mRMouseDown )
+	 {
+		 Vector3 translation;
+		 translation.x += -e->getRelX() * 0.13;
+		 translation.y -= -e->getRelY() * 0.13;
+
+		 mCamera->moveRelative(translation);		
+	 }
+}
+//-----------------------------------------------------------------------
+bool MouseQueryListener::frameEnded(const FrameEvent& evt)
+{
+	if (mShutdownRequested)
+		return false;
+
+    if (timeDelay >= 0) 
+        timeDelay -= evt.timeSinceLastFrame;
+
+    KEY_PRESSED(KC_SPACE, 0.3, changeAlgorithm());
+
+	KEY_PRESSED(KC_SUBTRACT, 0.0, changeThreshold(-10));
+	KEY_PRESSED(KC_ADD, 0, changeThreshold(10));
+	//KEY_PRESSED(KC_T, 1, change);
+      
+	changeStats();
+
+    return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);        
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeThreshold(int incr)
+{
+	mThreshold += incr; if(mThreshold < 0) mThreshold = 0;
+	
+	char str[100]; sprintf(str,": %d", mThreshold);
+
+	mSceneMgr->setOption("Threshold", &mThreshold); 
+	mThresholdInfo->setCaption(str);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeAlgorithm()
+{
+//    mCurrentAlgorithm = ++mCurrentAlgorithm % VisibilitySceneTraverser::NUM_RENDERMODES;
+
+	mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
+	mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeStats()
+{
+	unsigned int opt = 0;
+	char str[100];
+	
+	mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt); 
+	mFrustumCulledNodesInfo->setCaption(str);
+	
+	mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt); 
+	mQueryCulledNodesInfo->setCaption(str);
+	
+	mSceneMgr->getOption("NumTraversedNodes", &opt); sprintf(str,": %d", opt); 
+	mTraversedNodesInfo->setCaption(str);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyPressed(KeyEvent* e)
+{
+	if(e->getKey() == KC_ESCAPE)
+    {
+		mShutdownRequested = true;
+		e->consume();
+		return;
+	}
+
+	CEGUI::System::getSingleton().injectKeyDown(e->getKey());
+	CEGUI::System::getSingleton().injectChar(e->getKeyChar());
+	e->consume();
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyReleased(KeyEvent* e)
+{
+	CEGUI::System::getSingleton().injectKeyUp(e->getKey());
+	e->consume();
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyClicked(KeyEvent* e) 
+{
+	// Do nothing
+	e->consume();
+}
+//-----------------------------------------------------------------------
+INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
+{
+    // Create application object
+    TestCullingDotSceneApplication app;
+
+	try 
+	{
+        app.go();
+    } 
+	catch( Ogre::Exception& e ) 
+	{
+        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
+    }	
+
+    return 0;
+}
Index: /tags/DummyModules/VUT/work/TestCullingDotScene/TestCullingDotSceneApplication.h
===================================================================
--- /tags/DummyModules/VUT/work/TestCullingDotScene/TestCullingDotSceneApplication.h	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCullingDotScene/TestCullingDotSceneApplication.h	(revision 61)
@@ -0,0 +1,110 @@
+/**
+    \file 
+        TestCullingApplication.h
+*/
+#include "CEGUIForwardRefs.h"
+#include "ExampleApplication.h"
+#include "OgreLight.h"
+//#include "OgreVisibilitySceneTraverser.h"
+
+Real timeDelay = 0;
+#define KEY_PRESSED(_key,_timeDelay, _macro) \
+{ \
+    if (mInputDevice->isKeyDown(_key) && timeDelay <= 0) \
+{ \
+    timeDelay = _timeDelay; \
+    _macro ; \
+} \
+}
+
+String mCurrentAlgorithmCaptions[3/*VisibilitySceneTraverser::NUM_RENDERMODES*/] = 
+{
+    "Cull Frustum", 
+	"Stop and Wait", 
+	"Coherent Occlusion Culling"
+};
+
+class MouseQueryListener : public ExampleFrameListener, public MouseListener, public MouseMotionListener
+{
+public:
+
+    MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer);
+
+
+    ~MouseQueryListener( )
+    {
+    }
+
+//	bool frameStarted(const FrameEvent& evt);
+	bool frameEnded(const FrameEvent& evt);
+
+    /* MouseListener callbacks. */
+    virtual void mouseClicked(MouseEvent* e) { }
+    virtual void mouseEntered(MouseEvent* e) { }
+    virtual void mouseExited(MouseEvent* e)  { }
+
+    // This is when the mouse button goes DOWN.
+    virtual void mousePressed(MouseEvent* e);
+
+    // This is when the mouse button is let UP.
+    virtual void mouseReleased(MouseEvent* e);
+
+    /* MouseMotionListener callbacks */
+    virtual void mouseMoved (MouseEvent *e);
+   
+    // This is when the mouse is clicked, held and dragged.
+    virtual void mouseDragged (MouseEvent *e);
+
+    void keyPressed(KeyEvent* e);
+
+	void keyReleased(KeyEvent* e);
+	void keyClicked(KeyEvent* e);
+
+	void changeAlgorithm();
+	void changeThreshold(int incr);
+	void changeStats();
+
+protected:
+    bool mLMouseDown, mRMouseDown;     // True if the mouse buttons are down
+    SceneManager *mSceneMgr;           // A pointer to the scene manager
+    
+	CEGUI::Renderer *mGUIRenderer;     // cegui renderer
+	
+	bool mShutdownRequested;
+	int mCurrentAlgorithm;
+	int mThreshold;
+
+	OverlayElement *mAlgorithmInfo;
+	OverlayElement *mThresholdInfo;
+	OverlayElement *mFrustumCulledNodesInfo;
+	OverlayElement *mQueryCulledNodesInfo;
+    OverlayElement *mTraversedNodesInfo;
+	OverlayElement *mSceneNodesInfo;
+};
+
+
+class TestCullingDotSceneApplication : public ExampleApplication
+{
+public:
+	//~TestCullingDotSceneApplication();
+
+protected:
+	void createScene(void);
+	void createFrameListener(void);
+	void setupGui(void);
+	void ParseDotScene( const String &SceneName, const String& groupName );
+	Light* LoadLight( TiXmlElement *XMLLight );
+
+	virtual void createViewports(void);
+
+	CEGUI::OgreCEGUIRenderer *mGUIRenderer;
+	CEGUI::System *mGUISystem;
+
+private:
+	void chooseSceneManager(void);
+
+	//SceneManager* mSceneMgr;
+	//Entity* mShip;
+	//SceneNode* mShipNode;
+};
+
Index: /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.dsw
===================================================================
--- /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.dsw	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.dsw	(revision 61)
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "Demo_TestCullingTerrain"=.\TestCullingTerrainApplication.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
Index: /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrain.vcproj
===================================================================
--- /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrain.vcproj	(revision 64)
+++ /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrain.vcproj	(revision 64)
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="TestCullingTerrain"
+	ProjectGUID="{248F19A6-2FE0-4F5D-8928-E0EA10609887}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory=".\bin\$(ConfigurationName)"
+			IntermediateDirectory=".\obj\$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(OGRE_PATH)\Dependencies\include&quot;;&quot;$(OGRE_PATH)\OgreMain\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include\CEGUI&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\include&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\include&quot;;../include"
+				PreprocessorDefinitions="_WINDOWS;_STLP_USE_DYNAMIC_LIB;OGRE_LIBRARY_IMPORTS;_DEBUG;WIN32;_STLP_DEBUG;PLUGIN_TERRAIN_IMPORTS"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="Plugin_OctreeSceneManager.lib OGREMain_d.LIB CEGUIBase_d.lib OgreGUIRenderer_d.lib Plugin_DotSceneManager.lib"
+				OutputFile="$(OGRE_PATH)/Samples/Common/bin/Debug/TestCullingTerrain.exe"
+				LinkIncremental="2"
+				AdditionalLibraryDirectories="&quot;$(OGRE_PATH)\Dependencies\Lib\Debug&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\bin\debug&quot;;&quot;$(OGRE_PATH)\OgreMain\Lib\Debug&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\bin\debug&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\lib&quot;"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/TestCullingTerrain.pdb"
+				SubSystem="2"
+				ImportLibrary=""
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\..\Samples\Common\Include, ..\..\..\OgreMain\include"
+				PreprocessorDefinitions="_WINDOWS,_STLP_USE_DYNAMIC_LIB,OGRE_LIBRARY_IMPORTS,_RELEASE,WIN32,_STLP_RELEASE"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="OGREMain.LIB"
+				OutputFile="..\..\..\Samples\Common\Bin\Release\TestCullingTerrain.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="..\..\..\OgreMain\Lib\Release"
+				GenerateDebugInformation="TRUE"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath=".\TerrainContentGenerator.cpp">
+			</File>
+			<File
+				RelativePath=".\TestCullingTerrainApplication.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath=".\TerrainContentGenerator.h">
+			</File>
+			<File
+				RelativePath=".\TestCullingTerrainApplication.h">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: /tags/DummyModules/VUT/work/TestCullingTerrain/TerrainContentGenerator.cpp
===================================================================
--- /tags/DummyModules/VUT/work/TestCullingTerrain/TerrainContentGenerator.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCullingTerrain/TerrainContentGenerator.cpp	(revision 61)
@@ -0,0 +1,96 @@
+/**
+    \file 
+        TerrainContentGenerator.cpp
+    \brief
+        Creates content for the terrain,
+*/
+#include "TerrainContentGenerator.h"
+
+//-----------------------------------------------------------------------
+TerrainContentGenerator::TerrainContentGenerator( SceneManager *sm, RayQueryExecutor *rayQueryEx )
+{
+	mSceneMgr = sm;
+	mRayQueryExecutor = rayQueryEx;
+
+	mMinTranslation = Vector3(-70.0f, -70.0f, 0.0f);
+	mMaxTranslation = Vector3(70.0f, 70.0f, 600.0f);
+
+	mMinAngle = 0;
+	mMaxAngle = 360;
+
+	mCount = 0;
+}
+//-----------------------------------------------------------------------
+void TerrainContentGenerator::generateScene( int numObjects )
+{
+	srand (time (0));
+	
+	Vector3 rotationRatio;
+	Vector3 translationRatio;
+
+	for(int i=0; i < numObjects; i++)
+	{
+		rotationRatio.x = rand() / (float) RAND_MAX;
+		rotationRatio.y = rand() / (float) RAND_MAX;
+		rotationRatio.z = rand() / (float) RAND_MAX;
+
+		translationRatio.x = rand() / (float) RAND_MAX;
+		translationRatio.y = rand() / (float) RAND_MAX;
+		translationRatio.z = rand() / (float) RAND_MAX;
+
+		generateSceneObject(translationRatio, rotationRatio, i, "sphere.mesh");
+	}
+}
+//-----------------------------------------------------------------------
+void TerrainContentGenerator::generateSceneObject(const Vector3 &translationRatio, 
+					 const Vector3 &rotationRatio, const int idx, const String& entName)
+{
+	// Setup the ray scene query
+	Real rotation = mMinAngle + rotationRatio.x * (mMaxAngle - mMinAngle);
+	Vector3 translation = mMinTranslation + translationRatio * (mMaxTranslation - mMinTranslation);
+
+	translation.y = 5000;
+    
+	Vector3 queryResult;
+
+	if(mRayQueryExecutor->executeRayQuery(&queryResult, translation, Vector3::NEGATIVE_UNIT_Y))
+	{
+		char name[16];
+		sprintf( name, "%s%d", entName.c_str(), mCount++);
+
+		Entity *ent = mSceneMgr->createEntity(name, entName);
+		SceneNode *currentObject = mSceneMgr->getRootSceneNode( )->createChildSceneNode( String(name) + "Node", queryResult);
+		currentObject->attachObject(ent);
+		currentObject->setScale(0.1f, 0.1f, 0.1f);
+	}
+}
+//-----------------------------------------------------------------------
+RayQueryExecutor::RayQueryExecutor( SceneManager *sm )
+{
+	mRaySceneQuery = sm->createRayQuery(Ray());
+}
+//-----------------------------------------------------------------------
+RayQueryExecutor::~RayQueryExecutor()
+{
+	delete mRaySceneQuery;
+}
+//-----------------------------------------------------------------------
+bool RayQueryExecutor::executeRayQuery( Vector3 *result, const Vector3 &pos, const Vector3 &dir )
+{
+	Ray ray(pos, dir);
+    mRaySceneQuery->setRay(ray);
+
+    // Perform the scene query
+    RaySceneQueryResult &queryResult = mRaySceneQuery->execute();
+    RaySceneQueryResult::iterator it = queryResult.begin( );
+
+	if (it != queryResult.end() && it->worldFragment)
+	{
+		SceneQuery::WorldFragment* wf = it->worldFragment;
+
+		*result = wf->singleIntersection; 
+		return true;
+	}
+
+	return false;
+}
Index: /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.cpp
===================================================================
--- /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.cpp	(revision 61)
@@ -0,0 +1,420 @@
+/**
+    \file 
+        TestCullingTerrainApplication.cpp
+    \brief
+        Tests the occlusion culling algorithm
+*/
+
+#include <OgreNoMemoryMacros.h>
+#include <CEGUI/CEGUI.h>
+#include <../CEGUIRenderer/include/OgreCEGUIRenderer.h>
+#include <../CEGUIRenderer/include/OgreCEGUIResourceProvider.h>
+#include <../CEGUIRenderer/include/OgreCEGUITexture.h>
+#include <OgreMemoryMacros.h>
+
+#include "Ogre.h"
+#include "TestCullingTerrainApplication.h"
+
+#define WIN32_LEAN_AND_MEAN
+#include "windows.h"
+
+
+/************************************************/
+/* TestCullingTerrainApplication implementation */
+/************************************************/
+TestCullingTerrainApplication::~TestCullingTerrainApplication()
+{
+	delete mRayQueryExecutor;
+	delete mTerrainContentGenerator;
+}
+
+//-----------------------------------------------------------------------
+void TestCullingTerrainApplication::createCamera( void )
+{
+	// Create the camera
+	mCamera = mSceneMgr->createCamera("PlayerCam");
+
+	// Position it at 500 in Z direction
+	mCamera->setPosition(Vector3(128,25,128));
+
+	// Look back along -Z
+    mCamera->lookAt(Vector3(0,0,-300));
+    mCamera->setNearClipDistance(1);
+    mCamera->setFarClipDistance(1000);
+}
+//-----------------------------------------------------------------------
+void TestCullingTerrainApplication::generateSceneObject(const Vector3 &translationRatio, 
+					 const Vector3 &rotationRatio, const int idx, const String& entName)
+{
+	// Setup the ray scene query
+	/*Vector3 rotation = mMinAngle + rotationRatio * (mMaxAngle - mMinAngle);
+	Vector3 translation = mMinTranslation + translationRatio * (mMaxTranslation - mMinTranslation);
+
+	translation.y = 5000;
+    Ray ray(translation, Vector3::NEGATIVE_UNIT_Y);
+    mRaySceneQuery->setRay(ray);
+
+    // Execute query
+	RaySceneQueryResult &result = mRaySceneQuery->execute();
+	RaySceneQueryResult::iterator itr = result.begin( );
+
+	// Get results, create a node/entity on the position
+	if ( itr != result.end() && itr->worldFragment )
+	{
+		char name[16];
+		sprintf( name, "%s%d", entName.c_str(), mCount++ );
+
+		Entity *ent = mSceneMgr->createEntity( name, entName );
+		SceneNode currentObject = mSceneMgr->getRootSceneNode( )->createChildSceneNode( String(name) + "Node", itr->worldFragment->singleIntersection );
+		currentObject->attachObject( ent );
+		currentObject->setScale( 0.1f, 0.1f, 0.1f );
+	}*/
+}
+
+//-----------------------------------------------------------------------
+void TestCullingTerrainApplication::createScene( void )
+{
+	mRayQueryExecutor = new RayQueryExecutor(mSceneMgr);
+	mTerrainContentGenerator = new TerrainContentGenerator(mSceneMgr, mRayQueryExecutor);
+	// Set ambient light
+	mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
+	
+	// Create a light
+	Light* l = mSceneMgr->createLight("MainLight");
+	// Accept default settings: point light, white diffuse, just set position
+	// NB I could attach the light to a SceneNode if I wanted it to move automatically with
+	//  other objects, but I don't
+	l->setPosition(20,80,50);
+
+	// --Fog
+	// NB it's VERY important to set this before calling setWorldGeometry 
+	// because the vertex program picked will be different
+	ColourValue fadeColour(0.93, 0.86, 0.76);
+	mWindow->getViewport(0)->setBackgroundColour(fadeColour);
+	//mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000);
+
+	// Create a skybox
+    //mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 500, false);
+	//mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8, 500, false );
+
+	/*	// Define the required skyplane
+	Plane plane;
+	// 5000 world units from the camera
+	plane.d = 5000;
+	// Above the camera, facing down
+	plane.normal = -Vector3::UNIT_Y;
+	// Create the plane 10000 units wide, tile the texture 3 times
+    mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane",10000,3);*/
+
+	std::string terrain_cfg("terrain.cfg");
+#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
+	terrain_cfg = mResourcePath + terrain_cfg;
+#endif
+	mSceneMgr -> setWorldGeometry( terrain_cfg );
+	// Infinite far plane?
+	if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))
+	{
+		mCamera->setFarClipDistance(0);
+	}
+
+	// Set a nice viewpoint
+	mCamera->setPosition(707,2500,528);
+	mCamera->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329));
+
+	// CEGUI setup
+	setupGui();
+}
+//-----------------------------------------------------------------------
+void TestCullingTerrainApplication::setupGui( void )
+{
+	 mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, ST_EXTERIOR_CLOSE);
+     mGUISystem = new CEGUI::System(mGUIRenderer);
+
+	 // Mouse
+     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
+     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
+	 mGUISystem->setDefaultMouseCursor(
+                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
+
+	 CEGUI::MouseCursor::getSingleton().show( );
+}
+//-----------------------------------------------------------------------
+void TestCullingTerrainApplication::createFrameListener(void)
+{
+	mFrameListener= new MouseQueryListener(mWindow, mCamera, mSceneMgr, mGUIRenderer, mRayQueryExecutor);
+	mFrameListener->showDebugOverlay(true);
+	mRoot->addFrameListener(mFrameListener);
+}
+//-----------------------------------------------------------------------
+void TestCullingTerrainApplication::chooseSceneManager(void)
+{
+    //mSceneMgr = mRoot->getSceneManager(ST_GENERIC);
+	mSceneMgr = mRoot->getSceneManager(ST_EXTERIOR_CLOSE);
+}
+
+/***********************************************/
+/* MouseQueryListener implementation           */
+/***********************************************/
+//-----------------------------------------------------------------------
+MouseQueryListener::MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, RayQueryExecutor *rqe)
+        : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer), mShutdownRequested(false), mRayQueryExecutor(rqe)
+{
+
+	// Setup default variables
+	mCurrentObject = NULL;
+	mLMouseDown = false;
+	mRMouseDown = false;
+	mSceneMgr = sceneManager;
+
+    // Reduce move speed
+	mMoveSpeed = 50;
+	mRotateSpeed *= 2;
+
+	mCurrentAlgorithm = 0;//VisibilitySceneTraverser::RENDER_COHERENT;
+	mThreshold = 0;
+    
+	// Register this so that we get mouse events.
+	mEventProcessor->addMouseListener(this);
+	mEventProcessor->addMouseMotionListener(this);
+	mEventProcessor->addKeyListener(this);
+
+	mRaySceneQuery = mSceneMgr->createRayQuery(Ray());
+
+	// show overlay
+	Overlay* pOver = OverlayManager::getSingleton().getByName("Example/VisibilityDemoOverlay"); 
+
+	mAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/AlgorithmInfo");
+	mThresholdInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/ThresholdInfo");
+	mFrustumCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/FrustumCulledNodesInfo");
+	mQueryCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/QueryCulledNodesInfo");
+    mTraversedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/TraversedNodesInfo");
+	mSceneNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/SceneNodesInfo");
+	mHierarchyNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/HierarchyNodesInfo");
+	mRenderedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/RenderedNodesInfo");
+
+	mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
+	mThresholdInfo->setCaption(": 0");
+	mFrustumCulledNodesInfo->setCaption(": 0");
+	mQueryCulledNodesInfo->setCaption(": 0");
+	mTraversedNodesInfo->setCaption(": 0");
+	mSceneNodesInfo->setCaption(": 0");
+	mHierarchyNodesInfo->setCaption(": 0");
+	mRenderedNodesInfo->setCaption(": 0");
+		
+    pOver->show();
+} 
+//-----------------------------------------------------------------------
+MouseQueryListener::~MouseQueryListener( )
+{
+	delete mRaySceneQuery;
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::mouseMoved (MouseEvent *e)
+{
+	// Update CEGUI with the mouse motion
+    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() * mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::mousePressed(MouseEvent* e)
+{
+     // Left mouse button down
+     if (e->getButtonID() & InputEvent::BUTTON0_MASK)
+     {
+		 CEGUI::MouseCursor::getSingleton().hide( );
+
+		 // Setup the ray scene query
+         Ray mouseRay = mCamera->getCameraToViewportRay( e->getX(), e->getY() );
+         mRaySceneQuery->setRay( mouseRay );
+
+         // Execute query
+         RaySceneQueryResult &result = mRaySceneQuery->execute();
+         RaySceneQueryResult::iterator itr = result.begin( );
+
+         // Get results, create a node/entity on the position
+         if ( itr != result.end() && itr->worldFragment )
+         {
+			 char name[16];
+             sprintf( name, "Robot%d", mCount++ );
+
+             Entity *ent = mSceneMgr->createEntity( name, "robot.mesh" );
+             mCurrentObject = mSceneMgr->getRootSceneNode( )->createChildSceneNode( String(name) + "Node", itr->worldFragment->singleIntersection );
+             mCurrentObject->attachObject( ent );
+             mCurrentObject->setScale( 0.1f, 0.1f, 0.1f );
+         }
+
+         mLMouseDown = true; 
+     }
+     // Right mouse button down
+     else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
+     {
+         CEGUI::MouseCursor::getSingleton().hide( );
+         mRMouseDown = true;
+     } // else if
+} // mousePressed
+
+ //-----------------------------------------------------------------------
+void MouseQueryListener::mouseReleased(MouseEvent* e)
+{
+    // Left mouse button up
+    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
+    {
+		CEGUI::MouseCursor::getSingleton().show( );
+        mLMouseDown = false;
+    }
+    // Right mouse button up
+    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
+    {
+        CEGUI::MouseCursor::getSingleton().show( );
+        mRMouseDown = false;
+    }
+} 
+//-----------------------------------------------------------------------
+void MouseQueryListener::mouseDragged (MouseEvent *e)
+ {
+	 // If we are dragging the left mouse button.	 	 
+	 if ( mLMouseDown )
+     {
+		 Ray mouseRay = mCamera->getCameraToViewportRay( e->getX(), e->getY() );
+		 mRaySceneQuery->setRay( mouseRay );
+
+		 RaySceneQueryResult &result = mRaySceneQuery->execute();
+		 RaySceneQueryResult::iterator itr = result.begin( );
+
+		 if ( itr != result.end() && itr->worldFragment )
+		 {
+			 mCurrentObject->setPosition( itr->worldFragment->singleIntersection );
+		 } 
+     }
+	 // If we are dragging the right mouse button.
+	 if ( mRMouseDown )
+	 {
+		 mCamera->yaw( -e->getRelX() * mRotateSpeed );
+		 mCamera->pitch( -e->getRelY() * mRotateSpeed );
+	 }
+}
+//-----------------------------------------------------------------------
+bool MouseQueryListener::frameStarted(const FrameEvent &evt)
+{
+	// clamp to terrain
+	Vector3 camPos = mCamera->getPosition( );
+    Ray cameraRay( Vector3(camPos.x, 5000.0f, camPos.z), Vector3::NEGATIVE_UNIT_Y );
+    mRaySceneQuery->setRay( cameraRay );
+
+    // Perform the scene query
+    RaySceneQueryResult &queryResult = mRaySceneQuery->execute();
+    RaySceneQueryResult::iterator it = queryResult.begin( );
+
+	if (it != queryResult.end() && it->worldFragment)
+	{
+		SceneQuery::WorldFragment* wf = it->worldFragment;
+
+		mCamera->setPosition(mCamera->getPosition().x, wf->singleIntersection.y + 10, 
+			mCamera->getPosition().z);
+	}
+	 
+	return ExampleFrameListener::frameStarted(evt);
+}
+//-----------------------------------------------------------------------
+bool MouseQueryListener::frameEnded(const FrameEvent& evt)
+{
+	if (mShutdownRequested)
+		return false;
+
+    if (timeDelay >= 0) 
+        timeDelay -= evt.timeSinceLastFrame;
+
+    KEY_PRESSED(KC_SPACE, 0.3, changeAlgorithm());
+
+	KEY_PRESSED(KC_SUBTRACT, 0, changeThreshold(-10));
+	KEY_PRESSED(KC_ADD, 0, changeThreshold(10));
+	//KEY_PRESSED(KC_T, 1, change);
+      
+	changeStats();
+
+    return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);        
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeThreshold(int incr)
+{
+	mThreshold += incr; if(mThreshold < 0) mThreshold = 0;
+	
+	char str[100]; sprintf(str,": %d", mThreshold);
+
+	mSceneMgr->setOption("Threshold", &mThreshold); 
+	mThresholdInfo->setCaption(str);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeAlgorithm()
+{
+    //mCurrentAlgorithm = ++mCurrentAlgorithm % VisibilitySceneTraverser::NUM_RENDERMODES;
+
+	mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
+	mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeStats()
+{
+	unsigned int opt = 0;
+	char str[100];
+	
+	mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt); 
+	mFrustumCulledNodesInfo->setCaption(str);
+	
+	mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt); 
+	mQueryCulledNodesInfo->setCaption(str);
+	
+	mSceneMgr->getOption("NumTraversedNodes", &opt); sprintf(str,": %d", opt); 
+	mTraversedNodesInfo->setCaption(str);
+
+	mSceneMgr->getOption("NumSceneNodes", &opt); sprintf(str,": %d", opt); 
+	mSceneNodesInfo->setCaption(str);
+
+	mSceneMgr->getOption("NumOctreeNodes", &opt); sprintf(str,": %d", opt); 
+	mHierarchyNodesInfo->setCaption(str);
+
+	mSceneMgr->getOption("NumRenderedNodes", &opt); sprintf(str,": %d", opt); 
+	mRenderedNodesInfo->setCaption(str);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyPressed(KeyEvent* e)
+{
+	if(e->getKey() == KC_ESCAPE)
+    {
+		mShutdownRequested = true;
+		e->consume();
+		return;
+	}
+
+	CEGUI::System::getSingleton().injectKeyDown(e->getKey());
+	CEGUI::System::getSingleton().injectChar(e->getKeyChar());
+	e->consume();
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyReleased(KeyEvent* e)
+{
+	CEGUI::System::getSingleton().injectKeyUp(e->getKey());
+	e->consume();
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyClicked(KeyEvent* e) 
+{
+	// Do nothing
+	e->consume();
+}
+//-----------------------------------------------------------------------
+INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
+{
+    // Create application object
+    TestCullingTerrainApplication app;
+
+	try 
+	{
+        app.go();
+    } 
+	catch( Ogre::Exception& e ) 
+	{
+        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
+    }	
+
+    return 0;
+}
Index: /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.dsp
===================================================================
--- /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.dsp	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.dsp	(revision 61)
@@ -0,0 +1,109 @@
+# Microsoft Developer Studio Project File - Name="Demo_TestCullingTerrainApplication" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=Demo_TestCullingTerrainApplication - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "TestCullingTerrainApplication.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "TestCullingTerrainApplication.mak" CFG="Demo_TestCullingTerrainApplication - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "Demo_TestCullingTerrainApplication - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "Demo_TestCullingTerrainApplication - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "Demo_TestCullingTerrainApplication - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "..\bin\Release"
+# PROP BASE Intermediate_Dir "..\obj\Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\bin\Release"
+# PROP Intermediate_Dir "..\obj\Release"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /Zi /Od /I "." /I "$(OGRE_PATH)\OgreMain\include" /I "$(OGRE_PATH)\Samples/Common/include" /D "NDEBUG" /D "_MBCS" /D "_WINDOWS" /D "WIN32" /YX /FD /Zm1000 /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OgreMain.lib /nologo /subsystem:windows /machine:I386 /out:"$(OGRE_PATH)\Samples\Common\Bin\Release\Demo_TestCullingTerrainApplication.exe" /libpath:"$(OGRE_PATH)\OgreMain\lib\release" 
+# SUBTRACT LINK32 /profile /debug
+
+!ELSEIF  "$(CFG)" == "Demo_TestCullingTerrainApplication - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "..\bin\Debug"
+# PROP BASE Intermediate_Dir "..\obj\Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "..\bin\Debug"
+# PROP Intermediate_Dir "..\obj\Debug"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "$(OGRE_PATH)\OgreMain\include" /I "$(OGRE_PATH)\Samples/Common/include" /D "_MBCS" /D "_WINDOWS" /D "_DEBUG" /D "WIN32" /FD /GZ /Zm1000 /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OgreMain_d.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"LIBCMT" /out:"$(OGRE_PATH)\Samples\Common\Bin\Debug\Demo_TestCullingTerrainApplication.exe" /pdbtype:sept /libpath:"$(OGRE_PATH)\OgreMain\lib\debug" 
+# SUBTRACT LINK32 /verbose
+
+!ENDIF 
+
+# Begin Target
+
+# Name "Demo_TestCullingTerrainApplication - Win32 Release"
+# Name "Demo_TestCullingTerrainApplication - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=TestCullingTerrainApplication.cpp
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
Index: /tags/DummyModules/VUT/work/TestCullingTerrain/TerrainContentGenerator.h
===================================================================
--- /tags/DummyModules/VUT/work/TestCullingTerrain/TerrainContentGenerator.h	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCullingTerrain/TerrainContentGenerator.h	(revision 61)
@@ -0,0 +1,46 @@
+/**
+    \file 
+        TerrainContentGenerator.h
+*/
+#include "ExampleApplication.h"
+
+class RayQueryExecutor
+{
+public:
+	RayQueryExecutor( SceneManager *sm );
+	~RayQueryExecutor( );
+	bool executeRayQuery( Vector3 *result, const Vector3 &pos, const Vector3 &dir );
+protected:
+	RaySceneQuery *mRaySceneQuery;
+};
+
+class TerrainContentGenerator
+{
+public:
+	TerrainContentGenerator(  SceneManager *sm, RayQueryExecutor *rayQueryEx );
+	/** Generates a the scene hierarchy with random values .
+	@param number of objects to generate
+	*/
+	void generateScene( int numObjects );
+	/** 
+		generates a new scene object 
+		@param tranlationRatio ratio between minimal and maximal possible translation
+		@param rotationRatio ratio between minimal and maximal possible rotation
+		@idx the index of the new object
+		@entName the name of the object entity
+	*/
+	void generateSceneObject( const Vector3 &translationRatio, const Vector3 &rotationRatio, 
+							  const int idx, const String &entName );
+
+protected:
+
+	Real mMinAngle;
+	Real mMaxAngle;
+	Vector3 mMaxTranslation;
+	Vector3 mMinTranslation;
+
+	RayQueryExecutor *mRayQueryExecutor;
+	SceneManager *mSceneMgr;
+	int mCount;		// The number of objects on the screen
+};
+
Index: /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.h
===================================================================
--- /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.h	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.h	(revision 61)
@@ -0,0 +1,127 @@
+/**
+    \file 
+        TestCullingTerrainApplication.h
+*/
+#include "CEGUIForwardRefs.h"
+#include "ExampleApplication.h"
+#include "TerrainContentGenerator.h"
+
+Real timeDelay = 0;
+#define KEY_PRESSED(_key,_timeDelay, _macro) \
+{ \
+    if (mInputDevice->isKeyDown(_key) && timeDelay <= 0) \
+{ \
+    timeDelay = _timeDelay; \
+    _macro ; \
+} \
+}
+
+String mCurrentAlgorithmCaptions[3/*VisibilitySceneTraverser::NUM_RENDERMODES*/] = 
+{
+    "Cull Frustum", 
+	"Stop and Wait", 
+	"Coherent Occlusion Culling"
+};
+
+class MouseQueryListener : public ExampleFrameListener, public MouseListener, public MouseMotionListener
+{
+public:
+
+    MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, 
+		CEGUI::Renderer *renderer, RayQueryExecutor *rqe);
+
+
+    ~MouseQueryListener( );
+
+	bool frameStarted(const FrameEvent& evt);
+	bool frameEnded(const FrameEvent& evt);
+
+    /* MouseListener callbacks. */
+    virtual void mouseClicked(MouseEvent* e) { }
+    virtual void mouseEntered(MouseEvent* e) { }
+    virtual void mouseExited(MouseEvent* e)  { }
+
+    // This is when the mouse button goes DOWN.
+    virtual void mousePressed(MouseEvent* e);
+
+    // This is when the mouse button is let UP.
+    virtual void mouseReleased(MouseEvent* e);
+
+    /* MouseMotionListener callbacks */
+    virtual void mouseMoved (MouseEvent *e);
+   
+    // This is when the mouse is clicked, held and dragged.
+    virtual void mouseDragged (MouseEvent *e);
+
+    void keyPressed(KeyEvent* e);
+
+	void keyReleased(KeyEvent* e);
+	void keyClicked(KeyEvent* e);
+
+	void changeAlgorithm();
+	void changeThreshold(int incr);
+	void changeStats();
+
+protected:
+    bool mLMouseDown, mRMouseDown;     // True if the mouse buttons are down
+    SceneManager *mSceneMgr;           // A pointer to the scene manager
+    
+	CEGUI::Renderer *mGUIRenderer;     // cegui renderer
+	
+	bool mShutdownRequested;
+	int mCurrentAlgorithm;
+	int mThreshold;
+
+	OverlayElement *mAlgorithmInfo;
+	OverlayElement *mThresholdInfo;
+	OverlayElement *mFrustumCulledNodesInfo;
+	OverlayElement *mQueryCulledNodesInfo;
+    OverlayElement *mTraversedNodesInfo;
+	OverlayElement *mHierarchyNodesInfo;
+	OverlayElement *mSceneNodesInfo;
+	OverlayElement *mRenderedNodesInfo;
+
+	SceneNode *mCurrentObject;         // The newly created object
+	RaySceneQuery *mRaySceneQuery;     // The ray scene query pointer
+	int mCount;                        // The number of robots on the screen
+
+	RayQueryExecutor *mRayQueryExecutor;
+};
+
+
+class TestCullingTerrainApplication : public ExampleApplication
+{
+public:
+	~TestCullingTerrainApplication();
+
+protected:
+	void createScene(void);
+	void createFrameListener(void);
+	void setupGui(void);
+	virtual void createCamera(void);
+
+	/** 
+		generates a new scene object 
+		@param tranlationRatio ratio between minimal and maximal possible translation
+		@param rotationRatio ratio between minimal and maximal possible rotation
+		@idx the index of the new object
+		@entName the name of the object entity
+	*/
+	void generateSceneObject(const Vector3 &translationRatio, const Vector3 &rotationRatio, 
+							 const int idx, const String &entName);
+
+	CEGUI::OgreCEGUIRenderer *mGUIRenderer;
+	CEGUI::System *mGUISystem;
+	RayQueryExecutor *mRayQueryExecutor;
+	TerrainContentGenerator *mTerrainContentGenerator;
+
+	Vector3 mMinTranslation;
+	Vector3 mMaxTranslation;
+
+	Vector3 mMinAngle;
+	Vector3 mMaxAngle;
+
+private:
+	void chooseSceneManager(void);
+};
+
Index: /tags/DummyModules/VUT/work/ogre_changes/OgreMain/include/OgreHardwareOcclusionQuery.h
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/OgreMain/include/OgreHardwareOcclusionQuery.h	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/OgreMain/include/OgreHardwareOcclusionQuery.h	(revision 61)
@@ -0,0 +1,154 @@
+/*
+-----------------------------------------------------------------------------
+This source file is part of OGRE
+    (Object-oriented Graphics Rendering Engine)
+For the latest info, see http://ogre.sourceforge.net/
+
+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.
+-----------------------------------------------------------------------------
+*/
+#ifndef _HardwareOcclusionQuery__
+#define _HardwareOcclusionQuery__
+
+// Precompiler options
+#include "OgrePrerequisites.h"
+
+namespace Ogre {
+
+
+/**
+  * Hardware occlusion query flags
+  */
+typedef enum _OCCLUSIONQUERY 
+{
+	HWOCCLUSIONQUERY_FLUSH,   /** Direct3D uses this, but not OpenGL */
+	HWOCCLUSIONQUERY_NOFLUSH, /** To decide if the driver should flush all batched API calls to serve an occlusion query faster. */
+} HW_OCCLUSIONQUERY;
+
+/**
+  * This is a abstract class that that provides the interface for the query class for 
+  * hardware occlusion.
+  *
+  * @author Lee Sandberg
+  */
+class _OgreExport HardwareOcclusionQuery
+{
+//----------------------------------------------------------------------
+// Public methods
+//--
+public:
+	/**
+	  * Object public member functions
+	  */
+
+	/**
+	  * Default object constructor
+	  * 
+	  */
+	HardwareOcclusionQuery();
+
+	/**
+	  * Object destructor
+	  */
+	virtual ~HardwareOcclusionQuery();
+
+	/**
+	  * Starts the hardware occlusion query
+	  * @Remarks	Simple usage: Create one or more OcclusionQuery object one per outstanding query or one per tested object 
+	  *				OcclusionQuery* m_pOcclusionQuery;
+	  *				createOcclusionQuery( &m_pOcclusionQuery );
+	  *				In the rendering loop:
+	  *				Draw all occluders
+	  *				m_pOcclusionQuery->startOcclusionQuery();
+	  *				Draw the polygons to be tested
+	  *				m_pOcclusionQuery->endOcclusionQuery();
+	  *
+	  *				Results must be pulled using:
+	  *				UINT	m_uintNumberOfPixelsVisable;
+	  *				pullOcclusionQuery( &m_dwNumberOfPixelsVisable );
+	  *				You may not get the result directlly after the first pass or frame.
+	  *				Objects not visable must be tested every frame, visable objects may be tested less freqvent.
+	  *			
+	  */
+	virtual void beginOcclusionQuery() = 0;
+
+	/**
+	  * Ends the hardware occlusion test
+	  */
+	virtual void endOcclusionQuery() = 0;
+
+	/**
+      * Pulls the hardware occlusion query too see if there is a result.
+      * @retval NumOfFragments will get the resulting number of fragments.
+      * @return True if success or false if not.
+	  * @Remarks Hardware occlusion is an assyncronius process the result may take a frame or so.
+	  *			one idea is to test pass1 and if not visable skip pass2. Also note that objects
+	  *			not visable must be tested evrey frame. Visable objects don't need testing every frame.
+	  *			Testing non visable objects can be don unlit, no texture with low LOD object.
+	  *        0 will generate all the levels till 1x1. [default: 0]
+      */
+	virtual bool pullOcclusionQuery( unsigned int* NumOfFragments ) = 0;
+
+	/**
+      * Pulls the hardware occlusion query too see if there is a result.
+      * @retval NumOfFragments will get the resulting number of fragments.
+      * @return True if success or false if not.
+	  * @Remarks In DX9 mode specifying OCCLUSIONQUERY_FLUSH as the flag, will case the driver to flush whatever API calls are batched.
+	  * In OpenGL mode it makes no difference if you specify OCCLUSIONQUERY_FLUSH or OCCLUSIONQUERY_NOFLUSH.
+      */
+	virtual bool pullOcclusionQuery( unsigned int* NumOfFragments, const HW_OCCLUSIONQUERY flag  ) = 0;
+
+	/**
+	  * Let's you get the last pixel count with out doing the hardware occlusion test
+	  * @return The last fragment count from the last test.
+	  * Remarks This function won't give you new values, just the old value.
+	  */
+	virtual unsigned int getLastQuerysPixelcount() = 0;
+
+	/**
+	  *   
+	  * @Remarks This function allows you to set how often the hardware occlusion really are sent to the driver
+	  * if you set it to 0 every hw occlusion test is acctually made. If you set it to 1 only the half of your queries are sent 
+	  * for all visable objects. 2 will result in 25% of all queries to acctualy be sent. 
+	  * New and none visable objects will be tested all the time.
+	  * This functionality is here because this class can keep track on visable and none visable objects for you.
+	  * Once you you set the SkipRate for any hardware occlusion instance it effects all others.
+	  */
+
+	virtual void	setSkipRate( int skip ) = 0;
+	virtual int		getSkipRate() = 0;
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	/**
+	  *   
+	  * @Remarks This function returns true if the result of the 
+	  * query is already availbable, false otherwise.
+	  */
+	virtual bool resultAvailable() = 0;
+#endif // GTP_VISIBILITY_MODIFIED_OGRE
+
+//----------------------------------------------------------------------
+// Private members
+//--
+private:
+
+};
+
+}
+#endif
+
Index: /tags/DummyModules/VUT/work/ogre_changes/OgreMain/include/OgreSceneNode.h
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/OgreMain/include/OgreSceneNode.h	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/OgreMain/include/OgreSceneNode.h	(revision 61)
@@ -0,0 +1,458 @@
+/*
+-----------------------------------------------------------------------------
+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.
+-----------------------------------------------------------------------------
+*/
+#ifndef _SceneNode_H__
+#define _SceneNode_H__
+
+#include "OgrePrerequisites.h"
+
+#include "OgreNode.h"
+#include "OgreIteratorWrappers.h"
+#include "OgreAxisAlignedBox.h"
+
+namespace Ogre {
+
+    /** Class representing a node in the scene graph.
+        @remarks
+            A SceneNode is a type of Node which is used to organise objects in a scene.
+            It has the same hierarchical transformation properties of the generic Node class,
+            but also adds the ability to attach world objects to the node, and stores hierarchical
+            bounding volumes of the nodes in the tree.
+            Child nodes are contained within the bounds of the parent, and so on down the
+            tree, allowing for fast culling.
+    */
+    class _OgreExport SceneNode : public Node
+    {
+    public:
+        typedef HashMap<String, MovableObject*> ObjectMap;
+        typedef MapIterator<ObjectMap> ObjectIterator;
+		typedef ConstMapIterator<ObjectMap> ConstObjectIterator;
+
+    protected:
+        ObjectMap mObjectsByName;
+        mutable LightList mLightList;
+        mutable bool mLightListDirty;
+
+		/// Pointer to a Wire Bounding Box for this Node
+		WireBoundingBox *mWireBoundingBox;
+		/// Flag that determines if the bounding box of the node should be displayed
+		bool mShowBoundingBox;
+
+        /// SceneManager which created this node
+        SceneManager* mCreator;
+
+        /// World-Axis aligned bounding box, updated only through _update
+        AxisAlignedBox mWorldAABB;
+
+        /** Tells the SceneNode to update the world bound info it stores.
+        */
+        virtual void _updateBounds(void);
+
+        /** See Node. */
+        Node* createChildImpl(void);
+
+        /** See Node. */
+        Node* createChildImpl(const String& name);
+
+		/** See Node */
+		void setParent(Node* parent);
+
+		/** Internal method for setting whether the node is in the scene 
+			graph.
+		*/
+		void setInSceneGraph(bool inGraph);
+
+        /// Whether to yaw around a fixed axis.
+        bool mYawFixed;
+        /// Fixed axis to yaw around
+        Vector3 mYawFixedAxis;
+
+        /// Auto tracking target
+        SceneNode* mAutoTrackTarget;
+        /// Tracking offset for fine tuning
+        Vector3 mAutoTrackOffset;
+        /// Local 'normal' direction vector
+        Vector3 mAutoTrackLocalDirection;
+		/// Is this node a current part of the scene graph?
+		bool mIsInSceneGraph;
+    public:
+        /** Constructor, only to be called by the creator SceneManager.
+        @remarks
+            Creates a node with a generated name.
+        */
+        SceneNode(SceneManager* creator);
+        /** Constructor, only to be called by the creator SceneManager.
+        @remarks
+            Creates a node with a specified name.
+        */
+        SceneNode(SceneManager* creator, const String& name);
+        ~SceneNode();
+
+        /** Adds an instance of a scene object to this node.
+        @remarks
+            Scene objects can include Entity objects, Camera objects, Light objects, 
+            ParticleSystem objects etc. Anything that subclasses from MovableObject.
+        */
+        virtual void attachObject(MovableObject* obj);
+
+        /** Reports the number of objects attached to this node.
+        */
+        virtual unsigned short numAttachedObjects(void) const;
+
+        /** Retrieves a pointer to an attached object.
+        @remarks Retrieves by index, see alternate version to retrieve by name. The index
+        of an object may change as other objects are added / removed.
+        */
+        virtual MovableObject* getAttachedObject(unsigned short index);
+
+        /** Retrieves a pointer to an attached object.
+        @remarks Retrieves by object name, see alternate version to retrieve by index.
+        */
+        virtual MovableObject* getAttachedObject(const String& name);
+
+        /** Detaches the indexed object from this scene node.
+        @remarks
+            Detaches by index, see the alternate version to detach by name. Object indexes
+            may change as other objects are added / removed.
+        */
+        virtual MovableObject* detachObject(unsigned short index);
+        /** Detaches an object by pointer. */
+        virtual void detachObject(MovableObject* obj);
+
+        /** Detaches the named object from this node and returns a pointer to it. */
+        virtual MovableObject* detachObject(const String& name);
+
+        /** Detaches all objects attached to this node.
+        */
+        virtual void detachAllObjects(void);
+
+		/** Determines whether this node is in the scene graph, ie
+			whether it's ulitimate ancestor is the root scene node.
+		*/
+		virtual bool isInSceneGraph(void) const { return mIsInSceneGraph; }
+
+		/** Notifies this SceneNode that it is the root scene node. 
+		@remarks
+			Only SceneManager should call this!
+		*/
+		virtual void _notifyRootNode(void) { mIsInSceneGraph = true; }
+			
+
+        /** Internal method to update the Node.
+            @note
+                Updates this scene node and any relevant children to incorporate transforms etc.
+                Don't call this yourself unless you are writing a SceneManager implementation.
+            @param
+                updateChildren If true, the update cascades down to all children. Specify false if you wish to
+                update children separately, e.g. because of a more selective SceneManager implementation.
+            @param
+                parentHasChanged This flag indicates that the parent xform has changed,
+                    so the child should retrieve the parent's xform and combine it with its own
+                    even if it hasn't changed itself.
+        */
+        virtual void _update(bool updateChildren, bool parentHasChanged);
+
+        /** Internal method which locates any visible objects attached to this node and adds them to the passed in queue.
+            @remarks
+                Should only be called by a SceneManager implementation, and only after the _updat method has been called to
+                ensure transforms and world bounds are up to date.
+                SceneManager implementations can choose to let the search cascade automatically, or choose to prevent this
+                and select nodes themselves based on some other criteria.
+            @param
+                cam The active camera
+            @param
+                queue The SceneManager's rendering queue
+            @param
+                includeChildren If true, the call is cascaded down to all child nodes automatically.
+            @param
+                displayNodes If true, the nodes themselves are rendered as a set of 3 axes as well
+                    as the objects being rendered. For debugging purposes.
+        */
+        virtual void _findVisibleObjects(Camera* cam, RenderQueue* queue, 
+            bool includeChildren = true, bool displayNodes = false, bool onlyShadowCasters = false);
+
+        /** Gets the axis-aligned bounding box of this node (and hence all subnodes).
+        @remarks
+            Recommended only if you are extending a SceneManager, because the bounding box returned
+            from this method is only up to date after the SceneManager has called _update.
+        */
+        virtual AxisAlignedBox _getWorldAABB(void) const;
+
+        /** Retrieves an iterator which can be used to efficiently step through the objects 
+            attached to this node.
+        @remarks
+            This is a much faster way to go through <B>all</B> the objects attached to the node
+            than using getAttachedObject. But the iterator returned is only valid until a change
+            is made to the collection (ie an addition or removal) so treat the returned iterator
+            as transient, and don't add / remove items as you go through the iterator, save changes
+            until the end, or retrieve a new iterator after making the change. Making changes to
+            the object returned through the iterator is OK though.
+        */
+        virtual ObjectIterator getAttachedObjectIterator(void);
+        /** Retrieves an iterator which can be used to efficiently step through the objects 
+            attached to this node.
+        @remarks
+            This is a much faster way to go through <B>all</B> the objects attached to the node
+            than using getAttachedObject. But the iterator returned is only valid until a change
+            is made to the collection (ie an addition or removal) so treat the returned iterator
+            as transient, and don't add / remove items as you go through the iterator, save changes
+            until the end, or retrieve a new iterator after making the change. Making changes to
+            the object returned through the iterator is OK though.
+        */
+		virtual ConstObjectIterator getAttachedObjectIterator(void) const;
+
+        /** Gets the creator of this scene node. 
+        @remarks
+            This method returns the SceneManager which created this node.
+            This can be useful for destroying this node.
+        */
+        SceneManager* getCreator(void) const;
+
+        /** This method removes and destroys the named child and all of its children.
+        @remarks
+            Unlike removeChild, which removes a single named child from this
+            node but does not destroy it, this method destroys the child
+            and all of it's children. 
+        @par
+            Use this if you wish to recursively destroy a node as well as 
+            detaching it from it's parent. Note that any objects attached to
+            the nodes will be detached but will not themselves be destroyed.
+        */
+        virtual void removeAndDestroyChild(const String& name);
+
+        /** This method removes and destroys the child and all of its children.
+        @remarks
+            Unlike removeChild, which removes a single named child from this
+            node but does not destroy it, this method destroys the child
+            and all of it's children. 
+        @par
+            Use this if you wish to recursively destroy a node as well as 
+            detaching it from it's parent. Note that any objects attached to
+            the nodes will be detached but will not themselves be destroyed.
+        */
+        virtual void removeAndDestroyChild(unsigned short index);
+
+        /** Removes and destroys all children of this node.
+        @remarks
+            Use this to destroy all child nodes of this node and remove
+            them from the scene graph. Note that all objects attached to this
+            node will be detached but will not be destroyed.
+        */
+        virtual void removeAndDestroyAllChildren(void);
+
+        /** Allows the showing of the node's bounding box.
+        @remarks
+            Use this to show or hide the bounding box of the node.
+        */
+		virtual void showBoundingBox(bool bShow);
+
+        /** Add the bounding box to the rendering queue.
+        */
+		virtual void _addBoundingBoxToQueue(RenderQueue* queue);
+
+        /** This allows scene managers to determine if the node's bounding box
+			should be added to the rendering queue.
+        @remarks
+            Scene Managers that implement their own _findVisibleObjects will have to 
+			check this flag and then use _addBoundingBoxToQueue to add the bounding box
+			wireframe.
+        */
+		virtual bool getShowBoundingBox() const;
+
+        /** Creates an unnamed new SceneNode as a child of this node.
+        @param
+            translate Initial translation offset of child relative to parent
+        @param
+            rotate Initial rotation relative to parent
+        */
+        virtual SceneNode* createChildSceneNode(
+            const Vector3& translate = Vector3::ZERO, 
+            const Quaternion& rotate = Quaternion::IDENTITY );
+
+        /** Creates a new named SceneNode as a child of this node.
+        @remarks
+            This creates a child node with a given name, which allows you to look the node up from 
+            the parent which holds this collection of nodes.
+            @param
+                translate Initial translation offset of child relative to parent
+            @param
+                rotate Initial rotation relative to parent
+        */
+        virtual SceneNode* createChildSceneNode(const String& name, const Vector3& translate = Vector3::ZERO, const Quaternion& rotate = Quaternion::IDENTITY);
+
+        /** Allows retrieval of the nearest lights to the centre of this SceneNode.
+        @remarks
+            This method allows a list of lights, ordered by proximity to the centre of
+            this SceneNode, to be retrieved. Multiple access to this method when neither 
+            the node nor the lights have moved will result in the same list being returned
+            without recalculation. Can be useful when implementing Renderable::getLights.
+        @param radius Optional parameter to specify lights intersecting a given radius of
+            this SceneNode's centre.
+        */
+        const LightList& findLights(Real radius) const;
+
+        /** Tells the node whether to yaw around it's own local Y axis or a fixed axis of choice.
+        @remarks
+        This method allows you to change the yaw behaviour of the node - by default, it
+        yaws around it's own local Y axis when told to yaw with TS_LOCAL, this makes it
+        yaw around a fixed axis. 
+        You only really need this when you're using auto tracking (see setAutoTracking,
+        because when you're manually rotating a node you can specify the TransformSpace
+        in which you wish to work anyway.
+        @param
+        useFixed If true, the axis passed in the second parameter will always be the yaw axis no
+        matter what the node orientation. If false, the node returns to it's default behaviour.
+        @param
+        fixedAxis The axis to use if the first parameter is true.
+        */
+        void setFixedYawAxis( bool useFixed, const Vector3& fixedAxis = Vector3::UNIT_Y );
+
+		/** Rotate the node around the Y-axis.
+		*/
+		virtual void yaw(const Radian& angle, TransformSpace relativeTo = TS_LOCAL);
+#ifndef OGRE_FORCE_ANGLE_TYPES
+		inline void yaw(Real degrees, TransformSpace relativeTo = TS_LOCAL) {
+			yaw ( Angle(degrees), relativeTo );
+		}
+#endif//OGRE_FORCE_ANGLE_TYPES
+        /** Sets the node's direction vector ie it's local -z.
+        @remarks
+        Note that the 'up' vector for the orientation will automatically be 
+        recalculated based on the current 'up' vector (i.e. the roll will 
+        remain the same). If you need more control, use setOrientation.
+        @param x,y,z The components of the direction vector
+        @param relativeTo The space in which this direction vector is expressed
+        @param localDirectionVector The vector which normally describes the natural
+        direction of the node, usually -Z
+        */
+        void setDirection(Real x, Real y, Real z, 
+            TransformSpace relativeTo = TS_LOCAL, 
+            const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z);
+
+        /** Sets the node's direction vector ie it's local -z.
+        @remarks
+        Note that the 'up' vector for the orientation will automatically be 
+        recalculated based on the current 'up' vector (i.e. the roll will 
+        remain the same). If you need more control, use setOrientation.
+        @param vec The direction vector
+        @param relativeTo The space in which this direction vector is expressed
+        @param localDirectionVector The vector which normally describes the natural
+        direction of the node, usually -Z
+        */
+        void setDirection(const Vector3& vec, TransformSpace relativeTo = TS_LOCAL, 
+            const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z);
+        /** Points the local -Z direction of this node at a point in space.
+        @param targetPoint A vector specifying the look at point.
+        @param relativeTo The space in which the point resides
+        @param localDirectionVector The vector which normally describes the natural
+        direction of the node, usually -Z
+        */
+        void lookAt( const Vector3& targetPoint, TransformSpace relativeTo,
+            const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z);
+        /** Enables / disables automatic tracking of another SceneNode.
+        @remarks
+        If you enable auto-tracking, this SceneNode will automatically rotate to
+        point it's -Z at the target SceneNode every frame, no matter how 
+        it or the other SceneNode move. Note that by default the -Z points at the 
+        origin of the target SceneNode, if you want to tweak this, provide a 
+        vector in the 'offset' parameter and the target point will be adjusted.
+        @param enabled If true, tracking will be enabled and the next 
+        parameter cannot be null. If false tracking will be disabled and the 
+        current orientation will be maintained.
+        @param target Pointer to the SceneNode to track. Make sure you don't
+        delete this SceneNode before turning off tracking (e.g. SceneManager::clearScene will
+        delete it so be careful of this). Can be null if and only if the enabled param is false.
+        @param localDirectionVector The local vector considered to be the usual 'direction'
+        of the node; normally the local -Z but can be another direction.
+        @param offset If supplied, this is the target point in local space of the target node
+        instead of the origin of the target node. Good for fine tuning the look at point.
+        */
+        void setAutoTracking(bool enabled, SceneNode* target = 0, 
+            const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z,
+            const Vector3& offset = Vector3::ZERO);
+		/** Get the auto tracking target for this node, if any. */
+        SceneNode* getAutoTrackTarget(void) { return mAutoTrackTarget; }
+		/** Get the auto tracking offset for this node, if the node is auto tracking. */
+		const Vector3& getAutoTrackOffset(void) { return mAutoTrackOffset; }
+		/** Get the auto tracking local direction for this node, if it is auto tracking. */
+		const Vector3& getAutoTrackLocalDirection(void) { return mAutoTrackLocalDirection; }
+		/** Internal method used by OGRE to update auto-tracking cameras. */
+        void _autoTrack(void);
+        /** Gets the parent of this SceneNode. */
+        SceneNode* getParentSceneNode(void) const;
+        /** Makes all objects attached to this node become visible / invisble.
+        @remarks    
+            This is a shortcut to calling setVisible() on the objects attached
+            to this node, and optionally to all objects attached to child
+            nodes. 
+        @param visible Whether the objects are to be made visible or invisible
+        @param cascade If true, this setting cascades into child nodes too.
+        */
+        void setVisible(bool visible, bool cascade = true);
+        /** Inverts the visibility of all objects attached to this node.
+        @remarks    
+        This is a shortcut to calling setVisible(!isVisible()) on the objects attached
+        to this node, and optionally to all objects attached to child
+        nodes. 
+        @param cascade If true, this setting cascades into child nodes too.
+        */
+        void flipVisibility(bool cascade = true);
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	public:
+		/** Returns last visited frame id. */
+		int lastVisited(void);
+		/** Set to current frame id.
+        @param current frame id.
+        */
+		void setLastVisited(int frameid);
+		/** Makes this node become visible / invisble.
+        @param visible Whether this node is to be made visible or invisible
+        */
+		void setNodeVisible(bool visible);
+		/** Returns true if this node is marked visible, false otherwise. */
+		bool isNodeVisible(void);
+
+		/** Frame id when this octree was last rendered. 
+		@return last rendered frame id
+		*/	
+		int lastRendered(void);
+		/** Sets frame id when this octree was last rendered. 
+		@param last rendered frame id
+		*/
+		void setLastRendered(int frameid);
+
+	protected:
+		int mLastVisited;
+		bool mVisible;
+		int mLastRendered;
+
+#endif //GTP_VISIBILITY_MODIFIED_OGRE
+
+    };
+
+
+}// namespace
+
+#endif
Index: /tags/DummyModules/VUT/work/ogre_changes/OgreMain/include/OgreFrustum.h
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/OgreMain/include/OgreFrustum.h	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/OgreMain/include/OgreFrustum.h	(revision 61)
@@ -0,0 +1,474 @@
+/*
+-----------------------------------------------------------------------------
+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.
+-----------------------------------------------------------------------------
+*/
+#ifndef __Frustum_H__
+#define __Frustum_H__
+
+#include "OgrePrerequisites.h"
+#include "OgreMovableObject.h"
+#include "OgreRenderable.h"
+#include "OgreAxisAlignedBox.h"
+#include "OgreVertexIndexData.h"
+#include "OgreMovablePlane.h"
+
+namespace Ogre
+{
+    /** Specifies perspective (realistic) or orthographic (architectural) projection.
+    */
+    enum ProjectionType
+    {
+        PT_ORTHOGRAPHIC,
+        PT_PERSPECTIVE
+    };
+
+    /** Worldspace clipping planes.
+    */
+    enum FrustumPlane
+    {
+        FRUSTUM_PLANE_NEAR   = 0,
+        FRUSTUM_PLANE_FAR    = 1,
+        FRUSTUM_PLANE_LEFT   = 2,
+        FRUSTUM_PLANE_RIGHT  = 3,
+        FRUSTUM_PLANE_TOP    = 4,
+        FRUSTUM_PLANE_BOTTOM = 5
+    };
+
+    /** A frustum represents a pyramid, capped at the near and far end which is
+        used to represent either a visible area or a projection area. Can be used
+        for a number of applications.
+    */
+    class _OgreExport Frustum : public MovableObject, public Renderable
+    {
+    protected:
+        /// Orthographic or perspective?
+        ProjectionType mProjType;
+
+        /// y-direction field-of-view (default 45)
+        Radian mFOVy;
+        /// Far clip distance - default 10000
+        Real mFarDist;
+        /// Near clip distance - default 100
+        Real mNearDist;
+        /// x/y viewport ratio - default 1.3333
+        Real mAspect;
+
+        /// The 6 main clipping planes
+        mutable Plane mFrustumPlanes[6];
+
+        /// Stored versions of parent orientation / position
+        mutable Quaternion mLastParentOrientation;
+        mutable Vector3 mLastParentPosition;
+
+        /// Pre-calced projection matrix
+        mutable Matrix4 mProjMatrix;
+        /// Pre-calced standard projection matrix
+        mutable Matrix4 mStandardProjMatrix;
+        /// Pre-calced view matrix
+        mutable Matrix4 mViewMatrix;
+        /// Something's changed in the frustrum shape?
+        mutable bool mRecalcFrustum;
+        /// Something re the view pos has changed
+        mutable bool mRecalcView;
+
+
+        /** Temp coefficient values calculated from a frustum change,
+            used when establishing the frustum planes when the view changes
+        */
+        mutable Real mCoeffL[2], mCoeffR[2], mCoeffB[2], mCoeffT[2];
+
+
+
+		
+        // Internal functions for calcs
+        virtual void updateFrustum(void) const;
+        virtual void updateView(void) const;
+        virtual bool isViewOutOfDate(void) const;
+        virtual bool isFrustumOutOfDate(void) const;
+        /// Signal to update frustum information.
+        virtual void invalidateFrustum(void) const;
+        /// Signal to update view information.
+        virtual void invalidateView(void) const;
+
+        /// Shared class-level name for Movable type
+        static String msMovableType;
+
+        mutable AxisAlignedBox mBoundingBox;
+        mutable VertexData mVertexData;
+
+        MaterialPtr mMaterial;
+        mutable Vector3 mWorldSpaceCorners[8];
+
+        /// Is this frustum to act as a reflection of itself?
+        bool mReflect;
+		/// Derived reflection matrix
+        mutable Matrix4 mReflectMatrix;
+        /// Fixed reflection plane
+		mutable Plane mReflectPlane;
+		/// Pointer to a reflection plane (automatically updated)
+		const MovablePlane* mLinkedReflectPlane;
+		/// Record of the last world-space reflection plane info used
+		mutable Plane mLastLinkedReflectionPlane;
+		
+        /// Is this frustum using an oblique depth projection?
+		bool mObliqueDepthProjection;
+		/// Fixed oblique projection plane
+		mutable Plane mObliqueProjPlane;
+		/// Pointer to oblique projection plane (automatically updated)
+		const MovablePlane* mLinkedObliqueProjPlane;
+		/// Record of the last world-space oblique depth projection plane info used
+		mutable Plane mLastLinkedObliqueProjPlane;
+
+		
+		/** Get the derived position of this frustum. */
+        virtual const Vector3& getPositionForViewUpdate(void) const;
+        /** Get the derived orientation of this frustum. */
+        virtual const Quaternion& getOrientationForViewUpdate(void) const;
+
+
+    public:
+
+        Frustum();
+        virtual ~Frustum();
+        /** Sets the Y-dimension Field Of View (FOV) of the frustum.
+            @remarks
+                Field Of View (FOV) is the angle made between the frustum's position, and the edges
+                of the 'screen' onto which the scene is projected. High values (90+ degrees) result in a wide-angle,
+                fish-eye kind of view, low values (30- degrees) in a stretched, telescopic kind of view. Typical values
+                are between 45 and 60 degrees.
+            @par
+                This value represents the VERTICAL field-of-view. The horizontal field of view is calculated from
+                this depending on the dimensions of the viewport (they will only be the same if the viewport is square).
+            @note
+                Setting the FOV overrides the value supplied for frustum::setNearClipPlane.
+         */
+        virtual void setFOVy(const Radian& fovy);
+#ifndef OGRE_FORCE_ANGLE_TYPES
+        inline void setFOVy(Real fovy) {
+            setFOVy ( Angle(fovy) );
+        }
+#endif//OGRE_FORCE_ANGLE_TYPES
+
+        /** Retrieves the frustums Y-dimension Field Of View (FOV).
+        */
+        virtual const Radian& getFOVy(void) const;
+
+        /** Sets the position of the near clipping plane.
+            @remarks
+                The position of the near clipping plane is the distance from the frustums position to the screen
+                on which the world is projected. The near plane distance, combined with the field-of-view and the
+                aspect ratio, determines the size of the viewport through which the world is viewed (in world
+                co-ordinates). Note that this world viewport is different to a screen viewport, which has it's
+                dimensions expressed in pixels. The frustums viewport should have the same aspect ratio as the
+                screen viewport it renders into to avoid distortion.
+            @param
+                near The distance to the near clipping plane from the frustum in world coordinates.
+         */
+        virtual void setNearClipDistance(Real nearDist);
+
+        /** Sets the position of the near clipping plane.
+        */
+        virtual Real getNearClipDistance(void) const;
+
+        /** Sets the distance to the far clipping plane.
+            @remarks
+                The view frustrum is a pyramid created from the frustum position and the edges of the viewport.
+                This method sets the distance for the far end of that pyramid. 
+                Different applications need different values: e.g. a flight sim
+                needs a much further far clipping plane than a first-person 
+                shooter. An important point here is that the larger the ratio 
+                between near and far clipping planes, the lower the accuracy of
+                the Z-buffer used to depth-cue pixels. This is because the
+                Z-range is limited to the size of the Z buffer (16 or 32-bit) 
+                and the max values must be spread over the gap between near and
+                far clip planes. As it happens, you can affect the accuracy far 
+                more by altering the near distance rather than the far distance, 
+                but keep this in mind.
+            @param
+                far The distance to the far clipping plane from the frustum in 
+                world coordinates.If you specify 0, this means an infinite view
+                distance which is useful especially when projecting shadows; but
+                be careful not to use a near distance too close.
+        */
+        virtual void setFarClipDistance(Real farDist);
+
+        /** Retrieves the distance from the frustum to the far clipping plane.
+        */
+        virtual Real getFarClipDistance(void) const;
+
+        /** Sets the aspect ratio for the frustum viewport.
+            @remarks
+                The ratio between the x and y dimensions of the rectangular area visible through the frustum
+                is known as aspect ratio: aspect = width / height .
+            @par
+                The default for most fullscreen windows is 1.3333 - this is also assumed by Ogre unless you
+                use this method to state otherwise.
+        */
+        virtual void setAspectRatio(Real ratio);
+
+        /** Retreives the current aspect ratio.
+        */
+        virtual Real getAspectRatio(void) const;
+
+        /** Gets the projection matrix for this frustum. Mainly for use by OGRE internally.
+        @remarks
+            This method retrieves the rendering-API dependent version of the projection
+            matrix. If you want a 'typical' projection matrix then use 
+            getStandardProjectionMatrix.
+
+        */
+        virtual const Matrix4& getProjectionMatrix(void) const;
+        /** Gets the 'standard' projection matrix for this frustum, ie the 
+        projection matrix which conforms to standard right-handed rules.
+        @remarks
+            This differs from the rendering-API dependent getProjectionMatrix
+            in that it always returns a right-handed projection matrix result 
+            no matter what rendering API is being used - this is required for
+            vertex and fragment programs for example. However, the resulting depth
+            range may still vary between render systems since D3D uses [0,1] and 
+            GL uses [-1,1], and the range must be kept the same between programmable
+            and fixed-function pipelines.
+        */
+        virtual const Matrix4& getStandardProjectionMatrix(void) const;
+
+        /** Gets the view matrix for this frustum. Mainly for use by OGRE internally.
+        */
+        virtual const Matrix4& getViewMatrix(void) const;
+
+        /** Retrieves a specified plane of the frustum.
+            @remarks
+                Gets a reference to one of the planes which make up the frustum frustum, e.g. for clipping purposes.
+        */
+        virtual const Plane& getFrustumPlane( unsigned short plane ) const;
+
+        /** Tests whether the given container is visible in the Frustum.
+            @param
+                bound Bounding box to be checked
+            @param
+                culledBy Optional pointer to an int which will be filled by the plane number which culled
+                the box if the result was false;
+            @returns
+                If the box was visible, true is returned.
+            @par
+                Otherwise, false is returned.
+        */
+        virtual bool isVisible(const AxisAlignedBox& bound, FrustumPlane* culledBy = 0) const;
+
+        /** Tests whether the given container is visible in the Frustum.
+            @param
+                bound Bounding sphere to be checked
+            @param
+                culledBy Optional pointer to an int which will be filled by the plane number which culled
+                the box if the result was false;
+            @returns
+                If the sphere was visible, true is returned.
+            @par
+                Otherwise, false is returned.
+        */
+        virtual bool isVisible(const Sphere& bound, FrustumPlane* culledBy = 0) const;
+
+        /** Tests whether the given vertex is visible in the Frustum.
+            @param
+                vert Vertex to be checked
+            @param
+                culledBy Optional pointer to an int which will be filled by the plane number which culled
+                the box if the result was false;
+            @returns
+                If the box was visible, true is returned.
+            @par
+                Otherwise, false is returned.
+        */
+        virtual bool isVisible(const Vector3& vert, FrustumPlane* culledBy = 0) const;
+
+
+        /** Overridden from MovableObject */
+        const AxisAlignedBox& getBoundingBox(void) const;
+
+        /** Overridden from MovableObject */
+		Real getBoundingRadius(void) const;
+
+		/** Overridden from MovableObject */
+        void _updateRenderQueue(RenderQueue* queue);
+
+        /** Overridden from MovableObject */
+        const String& getMovableType(void) const;
+
+        /** Overridden from MovableObject */
+        const String& getName(void) const;
+
+        /** Overridden from MovableObject */
+        void _notifyCurrentCamera(Camera* cam);
+
+        /** Overridden from Renderable */
+        const MaterialPtr& getMaterial(void) const;
+
+        /** Overridden from Renderable */
+        void getRenderOperation(RenderOperation& op);
+
+        /** Overridden from Renderable */
+        void getWorldTransforms(Matrix4* xform) const;
+
+        /** Overridden from Renderable */
+        const Quaternion& getWorldOrientation(void) const;
+
+        /** Overridden from Renderable */
+        const Vector3& getWorldPosition(void) const;
+
+        /** Overridden from Renderable */
+        Real getSquaredViewDepth(const Camera* cam) const;
+
+        /** Overridden from Renderable */
+        const LightList& getLights(void) const;
+
+        /** Gets the world space corners of the frustum.
+        @remarks
+            The corners are ordered as follows: top-right near, 
+            top-left near, bottom-left near, bottom-right near, 
+            top-right far, top-left far, bottom-left far, bottom-right far.
+        */
+        virtual const Vector3* getWorldSpaceCorners(void) const;
+
+        /** Sets the type of projection to use (orthographic or perspective). Default is perspective.
+        */
+        virtual void setProjectionType(ProjectionType pt);
+
+        /** Retrieves info on the type of projection used (orthographic or perspective).
+        */
+        virtual ProjectionType getProjectionType(void) const;
+
+        /** Modifies this frustum so it always renders from the reflection of itself through the
+        plane specified.
+        @remarks
+        This is obviously useful for performing planar reflections. 
+        */
+        virtual void enableReflection(const Plane& p);
+        /** Modifies this frustum so it always renders from the reflection of itself through the
+        plane specified. Note that this version of the method links to a plane
+		so that changes to it are picked up automatically. It is important that
+		this plane continues to exist whilst this object does; do not destroy
+		the plane before the frustum.
+        @remarks
+        This is obviously useful for performing planar reflections. 
+        */
+        virtual void enableReflection(const MovablePlane* p);
+
+        /** Disables reflection modification previously turned on with enableReflection */
+        virtual void disableReflection(void);
+
+        /// Returns whether this frustum is being reflected
+        virtual bool isReflected(void) const { return mReflect; }
+        /// Returns the reflection matrix of the frustum if appropriate
+        virtual const Matrix4& getReflectionMatrix(void) const { return mReflectMatrix; }
+        /// Returns the reflection plane of the frustum if appropriate
+        virtual const Plane& getReflectionPlane(void) const { return mReflectPlane; }
+
+        /** Project a sphere onto the near plane and get the bounding rectangle. 
+        @param sphere The world-space sphere to project
+        @param radius Radius of the sphere
+        @param left, top, right, bottom Pointers to destination values, these
+            will be completed with the normalised device coordinates (in the 
+            range {-1,1})
+        @returns true if the sphere was projected to a subset of the near plane,
+            false if the entire near plane was contained
+        */
+        virtual bool projectSphere(const Sphere& sphere, 
+            Real* left, Real* top, Real* right, Real* bottom) const;
+
+
+		/** Links the frustum to a custom near clip plane, which can be used
+			to clip geometry in a custom manner without using user clip planes.
+		@remarks
+			There are several applications for clipping a scene arbitrarily by
+			a single plane; the most common is when rendering a reflection to 
+			a texture, and you only want to render geometry that is above the 
+			water plane (to do otherwise results in artefacts). Whilst it is
+			possible to use user clip planes, they are not supported on all
+			cards, and sometimes are not hardware accelerated when they are
+			available. Instead, where a single clip plane is involved, this
+			technique uses a 'fudging' of the near clip plane, which is 
+			available and fast on all hardware, to perform as the arbitrary
+			clip plane. This does change the shape of the frustum, leading 
+			to some depth buffer loss of precision, but for many of the uses of
+			this technique that is not an issue.
+		@par 
+			This version of the method links to a plane, rather than requiring
+			a by-value plane definition, and therefore you can 
+			make changes to the plane (e.g. by moving / rotating the node it is
+			attached to) and they will automatically affect this object.
+		@note This technique only works for perspective projection.
+		@param plane The plane to link to to perform the clipping. This plane
+			must continue to exist while the camera is linked to it; do not
+			destroy it before the frustum. 
+		*/
+		virtual void enableCustomNearClipPlane(const MovablePlane* plane);
+		/** Links the frustum to a custom near clip plane, which can be used
+			to clip geometry in a custom manner without using user clip planes.
+		@remarks
+			There are several applications for clipping a scene arbitrarily by
+			a single plane; the most common is when rendering a reflection to  
+			a texture, and you only want to render geometry that is above the 
+			water plane (to do otherwise results in artefacts). Whilst it is
+			possible to use user clip planes, they are not supported on all
+			cards, and sometimes are not hardware accelerated when they are
+			available. Instead, where a single clip plane is involved, this
+			technique uses a 'fudging' of the near clip plane, which is 
+			available and fast on all hardware, to perform as the arbitrary
+			clip plane. This does change the shape of the frustum, leading 
+			to some depth buffer loss of precision, but for many of the uses of
+			this technique that is not an issue.
+		@note This technique only works for perspective projection.
+		@param plane The plane to link to to perform the clipping. This plane
+			must continue to exist while the camera is linked to it; do not
+			destroy it before the frustum. 
+		*/
+		virtual void enableCustomNearClipPlane(const Plane& plane);
+		/** Disables any custom near clip plane. */
+		virtual void disableCustomNearClipPlane(void);
+		
+
+        /// Small constant used to reduce far plane projection to avoid inaccuracies
+        static const Real INFINITE_FAR_PLANE_ADJUST;
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+		//added by matt: 050405
+		/** Tests whether the given container is visible in the Frustum.
+            @param
+                bound Bounding box to be checked
+            @param
+                culledBy Optional pointer to an int which will be filled by the plane number which culled
+                the box if the result was false;
+			@param
+				intersects returns the information if the box intersects the near plane.
+            @returns
+                If the box was visible, true is returned.
+            @par
+                Otherwise, false is returned.
+        */
+        virtual bool isVisible(const AxisAlignedBox& bound, bool &intersects, FrustumPlane* culledBy = 0) const;
+#endif // GTP_VISIBILITY_MODIFIED_OGRE
+    };
+
+
+}
+
+#endif 
Index: /tags/DummyModules/VUT/work/ogre_changes/OgreMain/include/OgreSceneManager.h
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/OgreMain/include/OgreSceneManager.h	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/OgreMain/include/OgreSceneManager.h	(revision 61)
@@ -0,0 +1,1882 @@
+/*-------------------------------------------------------------------------
+This source file is a 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 library is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License (LGPL) as 
+published by the Free Software Foundation; either version 2.1 of the 
+License, or (at your option) any later version.
+
+This library 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 library; 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
+-------------------------------------------------------------------------*/
+#ifndef __SceneManager_H__
+#define __SceneManager_H__
+
+// Precompiler options
+#include "OgrePrerequisites.h"
+
+#include "OgreString.h"
+#include "OgreSceneNode.h"
+#include "OgrePlane.h"
+#include "OgreQuaternion.h"
+#include "OgreColourValue.h"
+#include "OgreCommon.h"
+#include "OgreRenderQueue.h"
+#include "OgreAnimationState.h"
+#include "OgreSceneQuery.h"
+#include "OgreAutoParamDataSource.h"
+#include "OgreAnimationState.h"
+#include "OgreRenderQueue.h"
+#include "OgreRenderQueueSortingGrouping.h"
+#include "OgreRectangle2D.h"
+
+namespace Ogre {
+
+    /** Structure for holding a position & orientation pair. */
+    struct ViewPoint
+    {
+        Vector3 position;
+        Quaternion orientation;
+    };
+
+	// Forward declarations
+	class DefaultIntersectionSceneQuery;
+	class DefaultRaySceneQuery;
+	class DefaultSphereSceneQuery;
+	class DefaultAxisAlignedBoxSceneQuery;
+
+    /** Manages the rendering of a 'scene' i.e. a collection of primitives.
+        @remarks
+            This class defines the basic behaviour of the 'Scene Manager' family. These classes will
+            organise the objects in the scene and send them to the rendering system, a subclass of
+            RenderSystem. This basic superclass does no sorting, culling or organising of any sort.
+        @par
+            Subclasses may use various techniques to organise the scene depending on how they are
+            designed (e.g. BSPs, octrees etc). As with other classes, methods preceded with '_' are
+            designed to be called by other classes in the Ogre system, not by user applications,
+            although this is not forbidden.
+        @author
+            Steve Streeting
+        @version
+            1.0
+     */
+    class _OgreExport SceneManager
+    {
+		friend class DefaultIntersectionSceneQuery; 
+	    friend class DefaultRaySceneQuery;
+	    friend class DefaultSphereSceneQuery;
+	    friend class DefaultAxisAlignedBoxSceneQuery;
+        friend class DefaultPlaneBoundedVolumeListSceneQuery;
+    public:
+        /// Query mask which will be used for world geometry @see SceneQuery
+        static unsigned long WORLD_GEOMETRY_QUERY_MASK;
+        /** Comparator for material map, for sorting materials into render order (e.g. transparent last).
+        */
+        struct materialLess
+        {
+            _OgreExport bool operator()(const Material* x, const Material* y) const;
+        };
+        /// Comparator for sorting lights relative to a point
+        struct lightLess
+        {
+            _OgreExport bool operator()(const Light* a, const Light* b) const;
+        };
+
+        /// Describes the stage of rendering when performing complex illumination
+        enum IlluminationRenderStage
+        {
+            /// No special illumination stage
+            IRS_NONE,
+            /// Ambient stage, when background light is added
+            IRS_AMBIENT,
+            /// Diffuse / specular stage, when individual light contributions are added
+            IRS_PER_LIGHT,
+            /// Decal stage, when texture detail is added to the lit base
+            IRS_DECAL,
+            /// Render to texture stage, used for texture based shadows
+            IRS_RENDER_TO_TEXTURE,
+            /// Modulative render from shadow texture stage
+            IRS_RENDER_MODULATIVE_PASS
+        };
+
+		/** Enumeration of the possible modes allowed for processing the special case
+		render queue list.
+		@see SceneManager::setSpecialCaseRenderQueueMode
+		*/
+		enum SpecialCaseRenderQueueMode
+		{
+			/// Render only the queues in the special case list
+			SCRQM_INCLUDE,
+			/// Render all except the queues in the special case list
+			SCRQM_EXCLUDE
+		};
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+		/** added by matt: Render content of current scene node.
+			@param node scene node to be rendered
+			@param cam current camera
+		*/
+		void _renderSceneNode( Camera *cam, SceneNode *node );
+		
+		/** deletes all queues which we were currently processing
+			@remark clears renderqueue after rendering scene node
+		*/
+		void _deleteRenderedQueueGroups();
+	
+		
+		void myrenderSingleObject(Renderable* rend, Pass* pass, bool doLightIteration, 
+            const LightList* manualLightList = 0)
+		{
+			setPass(pass);
+			renderSingleObject(rend, pass, doLightIteration, manualLightList);}
+
+#endif // GTP_VISIBILITY_MODIFIED_OGRE
+		/** Internal method used by _renderVisibleObjects to deal with renderables
+            which override the camera's own view / projection materices. made
+			public by matt */
+        void useRenderableViewProjMode(Renderable* pRend);
+		
+    protected:
+
+        /// Queue of objects for rendering
+        RenderQueue* mRenderQueue;
+
+        /// Current ambient light, cached for RenderSystem
+        ColourValue mAmbientLight;
+
+        /// The rendering system to send the scene to
+        RenderSystem *mDestRenderSystem;
+
+        typedef std::map<String, Camera* > CameraList;
+
+        /** Central list of cameras - for easy memory management and lookup.
+        */
+        CameraList mCameras;
+
+        typedef std::map<String, Light* > SceneLightList;
+
+        /** Central list of lights - for easy memory management and lookup.
+        */
+        SceneLightList mLights;
+
+
+        typedef std::map<String, Entity* > EntityList;
+
+        /** Central list of entities - for easy memory management and lookup.
+        */
+        EntityList mEntities;
+
+        typedef std::map<String, BillboardSet* > BillboardSetList;
+
+        /** Central list of billboard sets - for easy memory management and lookup.
+        */
+        BillboardSetList mBillboardSets;
+
+		typedef std::map<String, StaticGeometry* > StaticGeometryList;
+		StaticGeometryList mStaticGeometryList;
+
+        typedef std::map<String, SceneNode*> SceneNodeList;
+
+        /** Central list of SceneNodes - for easy memory management.
+            @note
+                Note that this list is used only for memory management; the structure of the scene
+                is held using the hierarchy of SceneNodes starting with the root node. However you
+                can look up nodes this way.
+        */
+        SceneNodeList mSceneNodes;
+
+        /// Camera in progress
+        Camera* mCameraInProgress;
+        /// Current Viewport
+        Viewport* mCurrentViewport;
+
+        /// Root scene node
+        SceneNode* mSceneRoot;
+
+        /// Autotracking scene nodes
+        typedef std::set<SceneNode*> AutoTrackingSceneNodes;
+        AutoTrackingSceneNodes mAutoTrackingSceneNodes;
+
+        // Sky params
+        // Sky plane
+        Entity* mSkyPlaneEntity;
+        Entity* mSkyDomeEntity[5];
+        Entity* mSkyBoxEntity[6];
+
+        SceneNode* mSkyPlaneNode;
+        SceneNode* mSkyDomeNode;
+        SceneNode* mSkyBoxNode;
+
+        bool mSkyPlaneEnabled;
+        bool mSkyPlaneDrawFirst;
+        Plane mSkyPlane;
+        // Sky box
+        bool mSkyBoxEnabled;
+        bool mSkyBoxDrawFirst;
+        Quaternion mSkyBoxOrientation;
+        // Sky dome
+        bool mSkyDomeEnabled;
+        bool mSkyDomeDrawFirst;
+        Quaternion mSkyDomeOrientation;
+        // Fog
+        FogMode mFogMode;
+        ColourValue mFogColour;
+        Real mFogStart;
+        Real mFogEnd;
+        Real mFogDensity;
+
+		typedef std::set<RenderQueueGroupID> SpecialCaseRenderQueueList;
+		SpecialCaseRenderQueueList mSpecialCaseQueueList;
+		SpecialCaseRenderQueueMode mSpecialCaseQueueMode;
+		RenderQueueGroupID mWorldGeometryRenderQueue;
+
+        /** Internal method for initialising the render queue.
+        @remarks
+            Subclasses can use this to install their own RenderQueue implementation.
+        */
+        virtual void initRenderQueue(void);
+        /** Retrieves the internal render queue. */
+        virtual RenderQueue* getRenderQueue(void);
+        /** Internal method for setting up the renderstate for a rendering pass.
+            @param
+                pass The Pass details to set.
+            @returns
+                A Pass object that was used instead of the one passed in, can
+                happen when rendering shadow passes
+        */
+        virtual Pass* setPass(Pass* pass);
+        /// A pass designed to let us render shadow colour on white for texture shadows
+        Pass* mShadowCasterPlainBlackPass;
+        /// A pass designed to let us render shadow receivers for texture shadows
+        Pass* mShadowReceiverPass;
+        /** Internal method for turning a regular pass into a shadow caster pass.
+        @remarks
+            This is only used for texture shadows, basically we're trying to
+            ensure that objects are rendered solid black.
+            This method will usually return the standard solid black pass for
+            all fixed function passes, but will merge in a vertex program
+            and fudge the AutpoParamDataSource to set black lighting for
+            passes with vertex programs. 
+        */
+        Pass* deriveShadowCasterPass(Pass* pass);
+        /** Internal method for turning a regular pass into a shadow receiver pass.
+        @remarks
+        This is only used for texture shadows, basically we're trying to
+        ensure that objects are rendered with a projective texture.
+        This method will usually return a standard single-texture pass for
+        all fixed function passes, but will merge in a vertex program
+        for passes with vertex programs. 
+        */
+        Pass* deriveShadowReceiverPass(Pass* pass);
+    
+        /** Internal method to validate whether a Pass should be allowed to render.
+        @remarks
+            Called just before a pass is about to be used for rendering a group to
+            allow the SceneManager to omit it if required. A return value of false
+            skips this pass. 
+        */
+        bool validatePassForRendering(Pass* pass);
+
+        /** Internal method to validate whether a Renderable should be allowed to render.
+        @remarks
+        Called just before a pass is about to be used for rendering a Renderable to
+        allow the SceneManager to omit it if required. A return value of false
+        skips it. 
+        */
+        bool validateRenderableForRendering(Pass* pass, Renderable* rend);
+
+        enum BoxPlane
+        {
+            BP_FRONT = 0,
+            BP_BACK = 1,
+            BP_LEFT = 2,
+            BP_RIGHT = 3,
+            BP_UP = 4,
+            BP_DOWN = 5
+        };
+
+        /* Internal utility method for creating the planes of a skybox.
+        */
+        MeshPtr createSkyboxPlane(
+            BoxPlane bp,
+            Real distance,
+            const Quaternion& orientation,
+            const String& groupName);
+
+        /* Internal utility method for creating the planes of a skydome.
+        */
+        MeshPtr createSkydomePlane(
+            BoxPlane bp,
+            Real curvature, Real tiling, Real distance,
+            const Quaternion& orientation,
+            int xsegments, int ysegments, int ySegmentsToKeep, 
+            const String& groupName);
+
+        // Flag indicating whether SceneNodes will be rendered as a set of 3 axes
+        bool mDisplayNodes;
+
+        /// Storage of animations, lookup by name
+        typedef std::map<String, Animation*> AnimationList;
+        AnimationList mAnimationsList;
+        AnimationStateSet mAnimationStates;
+
+        /// Controller flag for determining if we need to set view/proj matrices
+        bool mCamChanged;
+
+        typedef std::vector<RenderQueueListener*> RenderQueueListenerList;
+        RenderQueueListenerList mRenderQueueListeners;
+
+        /// Internal method for firing the queue start event, returns true if queue is to be skipped
+        bool fireRenderQueueStarted(RenderQueueGroupID id);
+        /// Internal method for firing the queue end event, returns true if queue is to be repeated
+        bool fireRenderQueueEnded(RenderQueueGroupID id);
+
+        /** Internal method for setting the destination viewport for the next render. */
+        virtual void setViewport(Viewport *vp);
+
+		/** Flag that indicates if all of the scene node's bounding boxes should be shown as a wireframe. */
+		bool mShowBoundingBoxes;       
+
+        /** Internal utility method for rendering a single object. 
+        @remarks
+            Assumes that the pass has already been set up.
+        @param rend The renderable to issue to the pipeline
+        @param pass The pass which is being used
+        @param doLightIteration If true, this method will issue the renderable to
+            the pipeline possibly multiple times, if the pass indicates it should be
+            done once per light
+        @param manualLightList Only applicable if doLightIteration is false, this
+            method allows you to pass in a previously determined set of lights
+            which will be used for a single render of this object.
+        */
+        virtual void renderSingleObject(Renderable* rend, Pass* pass, bool doLightIteration, 
+            const LightList* manualLightList = 0);
+
+        /// Utility class for calculating automatic parameters for gpu programs
+        AutoParamDataSource mAutoParamDataSource;
+
+        ShadowTechnique mShadowTechnique;
+        bool mDebugShadows;
+        ColourValue mShadowColour;
+        Pass* mShadowDebugPass;
+        Pass* mShadowStencilPass;
+        Pass* mShadowModulativePass;
+		bool mShadowMaterialInitDone;
+        LightList mLightsAffectingFrustum;
+        HardwareIndexBufferSharedPtr mShadowIndexBuffer;
+		size_t mShadowIndexBufferSize;
+        Rectangle2D* mFullScreenQuad;
+        Real mShadowDirLightExtrudeDist;
+        IlluminationRenderStage mIlluminationStage;
+        unsigned short mShadowTextureSize;
+        unsigned short mShadowTextureCount;
+		PixelFormat mShadowTextureFormat;
+        typedef std::vector<RenderTexture*> ShadowTextureList;
+        ShadowTextureList mShadowTextures;
+        RenderTexture* mCurrentShadowTexture;
+		bool mShadowUseInfiniteFarPlane;
+        /** Internal method for locating a list of lights which could be affecting the frustum. 
+        @remarks
+            Custom scene managers are encouraged to override this method to make use of their
+            scene partitioning scheme to more efficiently locate lights, and to eliminate lights
+            which may be occluded by word geometry.
+        */
+        virtual void findLightsAffectingFrustum(const Camera* camera);
+        /// Internal method for setting up materials for shadows
+        virtual void initShadowVolumeMaterials(void);
+        /// Internal method for creating shadow textures (texture-based shadows)
+        virtual void createShadowTextures(unsigned short size, unsigned short count, 
+			PixelFormat fmt);
+        /// Internal method for preparing shadow textures ready for use in a regular render
+        virtual void prepareShadowTextures(Camera* cam, Viewport* vp);
+
+        /** Internal method for rendering all the objects for a given light into the 
+            stencil buffer.
+        @param light The light source
+        @param cam The camera being viewed from
+        */
+        virtual void renderShadowVolumesToStencil(const Light* light, const Camera* cam);
+        /** Internal utility method for setting stencil state for rendering shadow volumes. 
+        @param secondpass Is this the second pass?
+        @param zfail Should we be using the zfail method?
+        @param twosided Should we use a 2-sided stencil?
+        */
+        virtual void setShadowVolumeStencilState(bool secondpass, bool zfail, bool twosided);
+        /** Render a set of shadow renderables. */
+        void renderShadowVolumeObjects(ShadowCaster::ShadowRenderableListIterator iShadowRenderables,
+            Pass* pass, const LightList *manualLightList, unsigned long flags,
+            bool secondpass, bool zfail, bool twosided);
+        typedef std::vector<ShadowCaster*> ShadowCasterList;
+        ShadowCasterList mShadowCasterList;
+        SphereSceneQuery* mShadowCasterSphereQuery;
+        AxisAlignedBoxSceneQuery* mShadowCasterAABBQuery;
+        Real mShadowFarDist;
+        Real mShadowFarDistSquared;
+        Real mShadowTextureOffset; // proportion of texture offset in view direction e.g. 0.4
+        Real mShadowTextureFadeStart; // as a proportion e.g. 0.6
+        Real mShadowTextureFadeEnd; // as a proportion e.g. 0.9
+		bool mShadowTextureSelfShadow;
+		Pass* mShadowTextureCustomCasterPass;
+		Pass* mShadowTextureCustomReceiverPass;
+		String mShadowTextureCustomCasterVertexProgram;
+		String mShadowTextureCustomReceiverVertexProgram;
+		GpuProgramParametersSharedPtr mShadowTextureCustomCasterVPParams;
+		GpuProgramParametersSharedPtr mShadowTextureCustomReceiverVPParams;
+		bool mShadowTextureCasterVPDirty;
+		bool mShadowTextureReceiverVPDirty;
+
+
+        GpuProgramParametersSharedPtr mInfiniteExtrusionParams;
+        GpuProgramParametersSharedPtr mFiniteExtrusionParams;
+
+        /// Inner class to use as callback for shadow caster scene query
+        class _OgreExport ShadowCasterSceneQueryListener : public SceneQueryListener
+        {
+        protected:
+			SceneManager* mSceneMgr;
+            ShadowCasterList* mCasterList;
+            bool mIsLightInFrustum;
+            const PlaneBoundedVolumeList* mLightClipVolumeList;
+            const Camera* mCamera;
+            const Light* mLight;
+            Real mFarDistSquared;
+        public:
+            ShadowCasterSceneQueryListener(SceneManager* sm) : mSceneMgr(sm),
+				mCasterList(0), mIsLightInFrustum(false), mLightClipVolumeList(0), 
+                mCamera(0) {}
+            // Prepare the listener for use with a set of parameters  
+            void prepare(bool lightInFrustum, 
+                const PlaneBoundedVolumeList* lightClipVolumes, 
+                const Light* light, const Camera* cam, ShadowCasterList* casterList, 
+                Real farDistSquared) 
+            {
+                mCasterList = casterList;
+                mIsLightInFrustum = lightInFrustum;
+                mLightClipVolumeList = lightClipVolumes;
+                mCamera = cam;
+                mLight = light;
+                mFarDistSquared = farDistSquared;
+            }
+            bool queryResult(MovableObject* object);
+            bool queryResult(SceneQuery::WorldFragment* fragment);
+        };
+
+        ShadowCasterSceneQueryListener* mShadowCasterQueryListener;
+
+        /** Internal method for locating a list of shadow casters which 
+            could be affecting the frustum for a given light. 
+        @remarks
+            Custom scene managers are encouraged to override this method to add optimisations, 
+            and to add their own custom shadow casters (perhaps for world geometry)
+        */
+        virtual const ShadowCasterList& findShadowCastersForLight(const Light* light, 
+            const Camera* camera);
+		/** Render the objects in a given queue group 
+		*/
+		virtual void renderQueueGroupObjects(RenderQueueGroup* group);
+        /** Render a group in the ordinary way */
+        virtual void renderBasicQueueGroupObjects(RenderQueueGroup* pGroup);
+		/** Render a group with the added complexity of additive stencil shadows. */
+		virtual void renderAdditiveStencilShadowedQueueGroupObjects(RenderQueueGroup* group);
+		/** Render a group with the added complexity of additive stencil shadows. */
+		virtual void renderModulativeStencilShadowedQueueGroupObjects(RenderQueueGroup* group);
+        /** Render a group rendering only shadow casters. */
+        virtual void renderTextureShadowCasterQueueGroupObjects(RenderQueueGroup* group);
+        /** Render a group rendering only shadow receivers. */
+        virtual void renderTextureShadowReceiverQueueGroupObjects(RenderQueueGroup* group);
+        /** Render a group with the added complexity of additive stencil shadows. */
+        virtual void renderModulativeTextureShadowedQueueGroupObjects(RenderQueueGroup* group);
+		/** Render a set of objects, see renderSingleObject for param definitions */
+		virtual void renderObjects(const RenderPriorityGroup::SolidRenderablePassMap& objs, 
+            bool doLightIteration, const LightList* manualLightList = 0);
+        /** Render a set of objects, see renderSingleObject for param definitions */
+		virtual void renderObjects(const RenderPriorityGroup::TransparentRenderablePassList& objs, 
+            bool doLightIteration, const LightList* manualLightList = 0);
+		/** Render those objects in the transparent pass list which have shadow casting forced on
+		@remarks
+			This function is intended to be used to render the shadows of transparent objects which have
+			transparency_casts_shadows set to 'on' in their material
+		*/
+		virtual void renderTransparentShadowCasterObjects(const RenderPriorityGroup::TransparentRenderablePassList& objs, 
+			bool doLightIteration, const LightList* manualLightList = 0);
+
+    public:
+        /** Default constructor.
+        */
+        SceneManager();
+
+        /** Default destructor.
+        */
+        virtual ~SceneManager();
+
+        /** Creates a camera to be managed by this scene manager.
+            @remarks
+                This camera must be added to the scene at a later time using
+                the attachObject method of the SceneNode class.
+            @param
+                name Name to give the new camera.
+        */
+        virtual Camera* createCamera(const String& name);
+
+        /** Retrieves a pointer to the named camera.
+        */
+        virtual Camera* getCamera(const String& name);
+
+        /** Removes a camera from the scene.
+            @remarks
+                This method removes a previously added camera from the scene.
+                The camera is deleted so the caller must ensure no references
+                to it's previous instance (e.g. in a SceneNode) are used.
+            @param
+                cam Pointer to the camera to remove
+        */
+        virtual void removeCamera(Camera *cam);
+
+        /** Removes a camera from the scene.
+            @remarks
+                This method removes an camera from the scene based on the
+                camera's name rather than a pointer.
+        */
+        virtual void removeCamera(const String& name);
+
+        /** Removes (and destroys) all cameras from the scene.
+        */
+        virtual void removeAllCameras(void);
+
+        /** Creates a light for use in the scene.
+            @remarks
+                Lights can either be in a fixed position and independent of the
+                scene graph, or they can be attached to SceneNodes so they derive
+                their position from the parent node. Either way, they are created
+                using this method so that the SceneManager manages their
+                existence.
+            @param
+                name The name of the new light, to identify it later.
+        */
+        virtual Light* createLight(const String& name);
+
+        /** Returns a pointer to the named Light which has previously been added to the scene.
+        */
+        virtual Light* getLight(const String& name);
+
+        /** Removes the named light from the scene and destroys it.
+            @remarks
+                Any pointers held to this light after calling this method will be invalid.
+        */
+        virtual void removeLight(const String& name);
+
+        /** Removes the light from the scene and destroys it based on a pointer.
+            @remarks
+                Any pointers held to this light after calling this method will be invalid.
+        */
+        virtual void removeLight(Light* light);
+        /** Removes and destroys all lights in the scene.
+        */
+        virtual void removeAllLights(void);
+
+        /** Populate a light list with an ordered set of the lights which are closest
+        to the position specified.
+        @remarks
+            Note that since directional lights have no position, they are always considered
+            closer than any point lights and as such will always take precedence. 
+        @par
+            Subclasses of the default SceneManager may wish to take into account other issues
+            such as possible visibility of the light if that information is included in their
+            data structures. This basic scenemanager simply orders by distance, eliminating 
+            those lights which are out of range.
+        @par
+            The number of items in the list max exceed the maximum number of lights supported
+            by the renderer, but the extraneous ones will never be used. In fact the limit will
+            be imposed by Pass::getMaxSimultaneousLights.
+        @param position The position at which to evaluate the list of lights
+        @param radius The bounding radius to test
+        @param destList List to be populated with ordered set of lights; will be cleared by 
+            this method before population.
+        */
+        virtual void _populateLightList(const Vector3& position, Real radius, LightList& destList);
+
+
+        /** Creates an instance of a SceneNode.
+            @remarks
+                Note that this does not add the SceneNode to the scene hierarchy.
+                This method is for convenience, since it allows an instance to
+                be created for which the SceneManager is responsible for
+                allocating and releasing memory, which is convenient in complex
+                scenes.
+            @par
+                To include the returned SceneNode in the scene, use the addChild
+                method of the SceneNode which is to be it's parent.
+            @par
+                Note that this method takes no parameters, and the node created is unnamed (it is
+                actually given a generated name, which you can retrieve if you want).
+                If you wish to create a node with a specific name, call the alternative method
+                which takes a name parameter.
+        */
+        virtual SceneNode* createSceneNode(void);
+
+        /** Creates an instance of a SceneNode with a given name.
+            @remarks
+                Note that this does not add the SceneNode to the scene hierarchy.
+                This method is for convenience, since it allows an instance to
+                be created for which the SceneManager is responsible for
+                allocating and releasing memory, which is convenient in complex
+                scenes.
+            @par
+                To include the returned SceneNode in the scene, use the addChild
+                method of the SceneNode which is to be it's parent.
+            @par
+                Note that this method takes a name parameter, which makes the node easier to
+                retrieve directly again later.
+        */
+        virtual SceneNode* createSceneNode(const String& name);
+
+        /** Destroys a SceneNode with a given name.
+        @remarks
+            This allows you to physically delete an individual SceneNode if you want to.
+            Note that this is not normally recommended, it's better to allow SceneManager
+            to delete the nodes when the scene is cleared.
+        */
+        virtual void destroySceneNode(const String& name);
+
+        /** Gets the SceneNode at the root of the scene hierarchy.
+            @remarks
+                The entire scene is held as a hierarchy of nodes, which
+                allows things like relative transforms, general changes in
+                rendering state etc (See the SceneNode class for more info).
+                In this basic SceneManager class, the application using
+                Ogre is free to structure this hierarchy however it likes,
+                since it has no real significance apart from making transforms
+                relative to each node (more specialised subclasses will
+                provide utility methods for building specific node structures
+                e.g. loading a BSP tree).
+            @par
+                However, in all cases there is only ever one root node of
+                the hierarchy, and this method returns a pointer to it.
+        */
+        virtual SceneNode* getRootSceneNode(void) const;
+
+        /** Retrieves a named SceneNode from the scene graph.
+        @remarks
+            If you chose to name a SceneNode as you created it, or if you
+            happened to make a note of the generated name, you can look it
+            up wherever it is in the scene graph using this method.
+        */
+        virtual SceneNode* getSceneNode(const String& name) const;
+
+        /** Create an Entity (instance of a discrete mesh).
+            @param
+                entityName The name to be given to the entity (must be unique).
+            @param
+                meshName The name of the Mesh it is to be based on (e.g. 'knot.oof'). The
+                mesh will be loaded if it is not already.
+        */
+        virtual Entity* createEntity(const String& entityName, const String& meshName);
+
+        /** Prefab shapes available without loading a model.
+            @note
+                Minimal implementation at present.
+            @todo
+                Add more prefabs (teapots, teapots!!!)
+        */
+        enum PrefabType {
+            PT_PLANE
+        };
+
+        /** Create an Entity (instance of a discrete mesh) from a range of prefab shapes.
+            @param
+                entityName The name to be given to the entity (must be unique).
+            @param
+                ptype The prefab type.
+        */
+        virtual Entity* createEntity(const String& entityName, PrefabType ptype);
+        /** Retrieves a pointer to the named Entity. */
+        virtual Entity* getEntity(const String& name);
+
+        /** Removes & destroys an Entity from the SceneManager.
+            @warning
+                Must only be done if the Entity is not attached
+                to a SceneNode. It may be safer to wait to clear the whole
+                scene if you are unsure use clearScene.
+            @see
+                SceneManager::clearScene
+        */
+        virtual void removeEntity(Entity* ent);
+
+        /** Removes & destroys an Entity from the SceneManager by name.
+            @warning
+                Must only be done if the Entity is not attached
+                to a SceneNode. It may be safer to wait to clear the whole
+                scene if you are unsure use clearScene.
+            @see
+                SceneManager::clearScene
+        */
+        virtual void removeEntity(const String& name);
+
+        /** Removes & destroys all Entities.
+            @warning
+                Again, use caution since no Entity must be referred to
+                elsewhere e.g. attached to a SceneNode otherwise a crash
+                is likely. Use clearScene if you are unsure (it clears SceneNode
+                entries too.)
+            @see
+                SceneManager::clearScene
+        */
+        virtual void removeAllEntities(void);
+
+        /** Empties the entire scene, inluding all SceneNodes, Entities, Lights, 
+            BillboardSets etc. Cameras are not deleted at this stage since
+            they are still referenced by viewports, which are not destroyed during
+            this process.
+        */
+        virtual void clearScene(void);
+
+        /** Sets the ambient light level to be used for the scene.
+            @remarks
+                This sets the colour and intensity of the ambient light in the scene, i.e. the
+                light which is 'sourceless' and illuminates all objects equally.
+                The colour of an object is affected by a combination of the light in the scene,
+                and the amount of light that object reflects (in this case based on the Material::ambient
+                property).
+            @remarks
+                By default the ambient light in the scene is ColourValue::Black, i.e. no ambient light. This
+                means that any objects rendered with a Material which has lighting enabled (see Material::setLightingEnabled)
+                will not be visible unless you have some dynamic lights in your scene.
+        */
+        void setAmbientLight(const ColourValue& colour);
+
+        /** Returns the ambient light level to be used for the scene.
+        */
+        const ColourValue& getAmbientLight(void) const;
+
+        /** Sets the source of the 'world' geometry, i.e. the large, mainly static geometry
+            making up the world e.g. rooms, landscape etc.
+            @remarks
+                Depending on the type of SceneManager (subclasses will be specialised
+                for particular world geometry types) you have requested via the Root or
+                SceneManagerEnumerator classes, you can pass a filename to this method and it
+                will attempt to load the world-level geometry for use. If you try to load
+                an inappropriate type of world data an exception will be thrown. The default
+                SceneManager cannot handle any sort of world geometry and so will always
+                throw an exception. However subclasses like BspSceneManager can load
+                particular types of world geometry e.g. "q3dm1.bsp".
+            @par
+                World geometry will be loaded via the 'common' resource paths and archives set in the
+                ResourceManager class.
+        */
+        virtual void setWorldGeometry(const String& filename);
+
+        /** Estimate the number of loading stages required to load the named
+            world geometry. 
+        @remarks
+            This method should be overridden by SceneManagers that provide
+            custom world geometry that can take some time to load. They should
+            return from this method a count of the number of stages of progress
+            they can report on whilst loading. During real loading (setWorldGeomtry),
+            they should call ResourceGroupManager::_notifyWorldGeometryProgress exactly
+            that number of times when loading the geometry for real.
+        @note 
+            The default is to return 0, ie to not report progress. 
+        */
+        virtual size_t estimateWorldGeometry(const String& filename) { return 0; }
+
+        /** Asks the SceneManager to provide a suggested viewpoint from which the scene should be viewed.
+            @remarks
+                Typically this method returns the origin unless a) world geometry has been loaded using
+                SceneManager::setWorldGeometry and b) that world geometry has suggested 'start' points.
+                If there is more than one viewpoint which the scene manager can suggest, it will always suggest
+                the first one unless the random parameter is true.
+            @param
+                random If true, and there is more than one possible suggestion, a random one will be used. If false
+                the same one will always be suggested.
+            @return
+                On success, true is returned.
+            @par
+                On failiure, false is returned.
+        */
+        virtual ViewPoint getSuggestedViewpoint(bool random = false);
+
+        /** Method for setting a specific option of the Scene Manager. These options are usually
+            specific for a certain implemntation of the Scene Manager class, and may (and probably
+            will) not exist across different implementations.
+            @param
+                strKey The name of the option to set
+            @param
+                pValue A pointer to the value - the size should be calculated by the scene manager
+                based on the key
+            @return
+                On success, true is returned.
+            @par
+                On failiure, false is returned.
+        */
+        virtual bool setOption( const String& strKey, const void* pValue ) { return false; }
+
+        /** Method for getting the value of an implementation-specific Scene Manager option.
+            @param
+                strKey The name of the option
+            @param
+                pDestValue A pointer to a memory location where the value will
+                be copied. Currently, the memory will be allocated by the
+                scene manager, but this may change
+            @return
+                On success, true is returned and pDestValue points to the value of the given
+                option.
+            @par
+                On failiure, false is returned and pDestValue is set to NULL.
+        */
+        virtual bool getOption( const String& strKey, void* pDestValue ) { return false; }
+
+        /** Method for verifying wether the scene manager has an implementation-specific
+            option.
+            @param
+                strKey The name of the option to check for.
+            @return
+                If the scene manager contains the given option, true is returned.
+            @remarks
+                If it does not, false is returned.
+        */
+        virtual bool hasOption( const String& strKey ) const { return false; }
+        /** Method for getting all possible values for a specific option. When this list is too large
+            (i.e. the option expects, for example, a float), the return value will be true, but the
+            list will contain just one element whose size will be set to 0.
+            Otherwise, the list will be filled with all the possible values the option can
+            accept.
+            @param
+                strKey The name of the option to get the values for.
+            @param
+                refValueList A reference to a list that will be filled with the available values.
+            @return
+                On success (the option exists), true is returned.
+            @par
+                On failure, false is returned.
+        */
+        virtual bool getOptionValues( const String& strKey, StringVector& refValueList ) { return false; }
+
+        /** Method for getting all the implementation-specific options of the scene manager.
+            @param
+                refKeys A reference to a list that will be filled with all the available options.
+            @return
+                On success, true is returned. On failiure, false is returned.
+        */
+        virtual bool getOptionKeys( StringVector& refKeys ) { return false; }
+
+        /** Internal method for updating the scene graph ie the tree of SceneNode instances managed by this class.
+            @remarks
+                This must be done before issuing objects to the rendering pipeline, since derived transformations from
+                parent nodes are not updated until required. This SceneManager is a basic implementation which simply
+                updates all nodes from the root. This ensures the scene is up to date but requires all the nodes
+                to be updated even if they are not visible. Subclasses could trim this such that only potentially visible
+                nodes are updated.
+        */
+        virtual void _updateSceneGraph(Camera* cam);
+
+        /** Internal method which parses the scene to find visible objects to render.
+            @remarks
+                If you're implementing a custom scene manager, this is the most important method to
+                override since it's here you can apply your custom world partitioning scheme. Once you
+                have added the appropriate objects to the render queue, you can let the default
+                SceneManager objects _renderVisibleObjects handle the actual rendering of the objects
+                you pick.
+            @par
+                Any visible objects will be added to a rendering queue, which is indexed by material in order
+                to ensure objects with the same material are rendered together to minimise render state changes.
+        */
+        virtual void _findVisibleObjects(Camera* cam, bool onlyShadowCasters);
+
+        /** Internal method for applying animations to scene nodes.
+        @remarks
+            Uses the internally stored AnimationState objects to apply animation to SceneNodes.
+        */
+        virtual void _applySceneAnimations(void);
+
+        /** Sends visible objects found in _findVisibleObjects to the rendering engine.
+        */
+        virtual void _renderVisibleObjects(void);
+
+        /** Prompts the class to send its contents to the renderer.
+            @remarks
+                This method prompts the scene manager to send the
+                contents of the scene it manages to the rendering
+                pipeline, possibly preceded by some sorting, culling
+                or other scene management tasks. Note that this method is not normally called
+                directly by the user application; it is called automatically
+                by the Ogre rendering loop.
+            @param camera Pointer to a camera from whose viewpoint the scene is to
+                be rendered.
+            @param vp The target viewport
+            @param includeOverlays Whether or not overlay objects should be rendered
+        */
+        virtual void _renderScene(Camera* camera, Viewport* vp, bool includeOverlays);
+
+        /** Internal method for queueing the sky objects with the params as 
+            previously set through setSkyBox, setSkyPlane and setSkyDome.
+        */
+        virtual void _queueSkiesForRendering(Camera* cam);
+
+
+
+        /** Notifies the scene manager of its destination render system
+            @remarks
+                Called automatically by RenderSystem::addSceneManager
+                this method simply notifies the manager of the render
+                system to which its output must be directed.
+            @param
+                sys Pointer to the RenderSystem subclass to be used as a render target.
+        */
+        virtual void _setDestinationRenderSystem(RenderSystem* sys);
+
+        /** Enables / disables a 'sky plane' i.e. a plane at constant
+            distance from the camera representing the sky.
+            @remarks
+                You can create sky planes yourself using the standard mesh and
+                entity methods, but this creates a plane which the camera can
+                never get closer or further away from - it moves with the camera.
+                (NB you could create this effect by creating a world plane which
+                was attached to the same SceneNode as the Camera too, but this
+                would only apply to a single camera whereas this plane applies to
+                any camera using this scene manager).
+            @note
+                To apply scaling, scrolls etc to the sky texture(s) you
+                should use the TextureUnitState class methods.
+            @param
+                enable True to enable the plane, false to disable it
+            @param
+                plane Details of the plane, i.e. it's normal and it's
+                distance from the camera.
+            @param
+                materialName The name of the material the plane will use
+            @param
+                scale The scaling applied to the sky plane - higher values
+                mean a bigger sky plane - you may want to tweak this
+                depending on the size of plane.d and the other
+                characteristics of your scene
+            @param
+                tiling How many times to tile the texture across the sky.
+                Applies to all texture layers. If you need finer control use
+                the TextureUnitState texture coordinate transformation methods.
+            @param
+                drawFirst If true, the plane is drawn before all other
+                geometry in the scene, without updating the depth buffer.
+                This is the safest rendering method since all other objects
+                will always appear in front of the sky. However this is not
+                the most efficient way if most of the sky is often occluded
+                by other objects. If this is the case, you can set this
+                parameter to false meaning it draws <em>after</em> all other
+                geometry which can be an optimisation - however you must
+                ensure that the plane.d value is large enough that no objects
+                will 'poke through' the sky plane when it is rendered.
+			@param
+				bow If zero, the plane will be completely flat (like previous
+				versions.  If above zero, the plane will be curved, allowing
+				the sky to appear below camera level.  Curved sky planes are 
+				simular to skydomes, but are more compatable with fog.
+            @param xsegments, ysegments
+                Determines the number of segments the plane will have to it. This
+                is most important when you are bowing the plane, but may also be useful
+                if you need tesselation on the plane to perform per-vertex effects.
+            @param groupName
+                The name of the resource group to which to assign the plane mesh.
+        */
+        virtual void setSkyPlane(
+            bool enable,
+            const Plane& plane, const String& materialName, Real scale = 1000,
+            Real tiling = 10, bool drawFirst = true, Real bow = 0, 
+            int xsegments = 1, int ysegments = 1, 
+            const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+
+        /** Enables / disables a 'sky box' i.e. a 6-sided box at constant
+            distance from the camera representing the sky.
+            @remarks
+                You could create a sky box yourself using the standard mesh and
+                entity methods, but this creates a plane which the camera can
+                never get closer or further away from - it moves with the camera.
+                (NB you could create this effect by creating a world box which
+                was attached to the same SceneNode as the Camera too, but this
+                would only apply to a single camera whereas this skybox applies
+                to any camera using this scene manager).
+            @par
+                The material you use for the skybox can either contain layers
+                which are single textures, or they can be cubic textures, i.e.
+                made up of 6 images, one for each plane of the cube. See the
+                TextureUnitState class for more information.
+            @param
+                enable True to enable the skybox, false to disable it
+            @param
+                materialName The name of the material the box will use
+            @param
+                distance Distance in world coorinates from the camera to
+                each plane of the box. The default is normally OK.
+            @param
+                drawFirst If true, the box is drawn before all other
+                geometry in the scene, without updating the depth buffer.
+                This is the safest rendering method since all other objects
+                will always appear in front of the sky. However this is not
+                the most efficient way if most of the sky is often occluded
+                by other objects. If this is the case, you can set this
+                parameter to false meaning it draws <em>after</em> all other
+                geometry which can be an optimisation - however you must
+                ensure that the distance value is large enough that no
+                objects will 'poke through' the sky box when it is rendered.
+            @param
+                orientation Optional parameter to specify the orientation
+                of the box. By default the 'top' of the box is deemed to be
+                in the +y direction, and the 'front' at the -z direction.
+                You can use this parameter to rotate the sky if you want.
+            @param groupName
+                The name of the resource group to which to assign the plane mesh.
+        */
+        virtual void setSkyBox(
+            bool enable, const String& materialName, Real distance = 5000,
+            bool drawFirst = true, const Quaternion& orientation = Quaternion::IDENTITY,
+            const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+
+        /** Enables / disables a 'sky dome' i.e. an illusion of a curved sky.
+            @remarks
+                A sky dome is actually formed by 5 sides of a cube, but with
+                texture coordinates generated such that the surface appears
+                curved like a dome. Sky domes are appropriate where you need a
+                realistic looking sky where the scene is not going to be
+                'fogged', and there is always a 'floor' of some sort to prevent
+                the viewer looking below the horizon (the distortion effect below
+                the horizon can be pretty horrible, and there is never anyhting
+                directly below the viewer). If you need a complete wrap-around
+                background, use the setSkyBox method instead. You can actually
+                combine a sky box and a sky dome if you want, to give a positional
+                backdrop with an overlayed curved cloud layer.
+            @par
+                Sky domes work well with 2D repeating textures like clouds. You
+                can change the apparant 'curvature' of the sky depending on how
+                your scene is viewed - lower curvatures are better for 'open'
+                scenes like landscapes, whilst higher curvatures are better for
+                say FPS levels where you don't see a lot of the sky at once and
+                the exaggerated curve looks good.
+            @param
+                enable True to enable the skydome, false to disable it
+            @param
+                materialName The name of the material the dome will use
+            @param
+                curvature The curvature of the dome. Good values are
+                between 2 and 65. Higher values are more curved leading to
+                a smoother effect, lower values are less curved meaning
+                more distortion at the horizons but a better distance effect.
+            @param
+                tiling How many times to tile the texture(s) across the
+                dome.
+            @param
+                distance Distance in world coorinates from the camera to
+                each plane of the box the dome is rendered on. The default
+                is normally OK.
+            @param
+                drawFirst If true, the dome is drawn before all other
+                geometry in the scene, without updating the depth buffer.
+                This is the safest rendering method since all other objects
+                will always appear in front of the sky. However this is not
+                the most efficient way if most of the sky is often occluded
+                by other objects. If this is the case, you can set this
+                parameter to false meaning it draws <em>after</em> all other
+                geometry which can be an optimisation - however you must
+                ensure that the distance value is large enough that no
+                objects will 'poke through' the sky when it is rendered.
+            @param
+                orientation Optional parameter to specify the orientation
+                of the dome. By default the 'top' of the dome is deemed to
+                be in the +y direction, and the 'front' at the -z direction.
+                You can use this parameter to rotate the sky if you want.
+            @param groupName
+                The name of the resource group to which to assign the plane mesh.
+        */
+        virtual void setSkyDome(
+            bool enable, const String& materialName, Real curvature = 10,
+            Real tiling = 8, Real distance = 4000, bool drawFirst = true,
+            const Quaternion& orientation = Quaternion::IDENTITY,
+            int xsegments = 16, int ysegments = 16, int ysegments_keep = -1,
+            const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+
+        /** Sets the fogging mode applied to the scene.
+            @remarks
+                This method sets up the scene-wide fogging effect. These settings
+                apply to all geometry rendered, UNLESS the material with which it
+                is rendered has it's own fog settings (see Material::setFog).
+            @param
+                mode Set up the mode of fog as described in the FogMode
+                enum, or set to FOG_NONE to turn off.
+            @param
+                colour The colour of the fog. Either set this to the same
+                as your viewport background colour, or to blend in with a
+                skydome or skybox.
+            @param
+                expDensity The density of the fog in FOG_EXP or FOG_EXP2
+                mode, as a value between 0 and 1. The default is 0.001. 
+            @param
+                linearStart Distance in world units at which linear fog starts to
+                encroach. Only applicable if mode is
+                FOG_LINEAR.
+            @param
+                linearEnd Distance in world units at which linear fog becomes completely
+                opaque. Only applicable if mode is
+                FOG_LINEAR.
+        */
+        void setFog(
+            FogMode mode = FOG_NONE, const ColourValue& colour = ColourValue::White,
+            Real expDensity = 0.001, Real linearStart = 0.0, Real linearEnd = 1.0);
+
+        /** Returns the fog mode for the scene.
+        */
+        virtual FogMode getFogMode(void) const;
+
+        /** Returns the fog colour for the scene.
+        */
+        virtual const ColourValue& getFogColour(void) const;
+
+        /** Returns the fog start distance for the scene.
+        */
+        virtual Real getFogStart(void) const;
+
+        /** Returns the fog end distance for the scene.
+        */
+        virtual Real getFogEnd(void) const;
+
+        /** Returns the fog density for the scene.
+        */
+        virtual Real getFogDensity(void) const;
+
+
+        /** Creates a new BillboardSet for use with this scene manager.
+            @remarks
+                This method creates a new BillboardSet which is registered with
+                the SceneManager. The SceneManager will destroy this object when
+                it shuts down or when the SceneManager::clearScene method is
+                called, so the caller does not have to worry about destroying
+                this object (in fact, it definitely should not do this).
+            @par
+                See the BillboardSet documentations for full details of the
+                returned class.
+            @param
+                name The name to give to this billboard set. Must be unique.
+            @param
+                poolSize The initial size of the pool of billboards (see BillboardSet for more information)
+            @see
+                BillboardSet
+        */
+        virtual BillboardSet* createBillboardSet(const String& name, unsigned int poolSize = 20);
+
+        /** Retrieves a pointer to the named BillboardSet.
+        */
+        virtual BillboardSet* getBillboardSet(const String& name);
+
+        /** Removes & destroys an BillboardSet from the SceneManager.
+            @warning
+                Must only be done if the BillboardSet is not attached
+                to a SceneNode. It may be safer to wait to clear the whole
+                scene. If you are unsure, use clearScene.
+        */
+        virtual void removeBillboardSet(BillboardSet* set);
+
+        /** Removes & destroys an BillboardSet from the SceneManager by name.
+            @warning
+                Must only be done if the BillboardSet is not attached
+                to a SceneNode. It may be safer to wait to clear the whole
+                scene. If you are unsure, use clearScene.
+        */
+        virtual void removeBillboardSet(const String& name);
+
+        /** Removes & destroys all BillboardSets.
+        @warning
+        Again, use caution since no BillboardSet must be referred to
+        elsewhere e.g. attached to a SceneNode otherwise a crash
+        is likely. Use clearScene if you are unsure (it clears SceneNode
+        entries too.)
+        @see
+        SceneManager::clearScene
+        */
+        virtual void removeAllBillboardSets(void);
+
+        /** Tells the SceneManager whether it should render the SceneNodes which 
+            make up the scene as well as the objects in the scene.
+        @remarks
+            This method is mainly for debugging purposes. If you set this to 'true',
+            each node will be rendered as a set of 3 axes to allow you to easily see
+            the orientation of the nodes.
+        */
+        virtual void setDisplaySceneNodes(bool display);
+
+        /** Creates an animation which can be used to animate scene nodes.
+        @remarks
+            An animation is a collection of 'tracks' which over time change the position / orientation
+            of Node objects. In this case, the animation will likely have tracks to modify the position
+            / orientation of SceneNode objects, e.g. to make objects move along a path.
+        @par
+            You don't need to use an Animation object to move objects around - you can do it yourself
+            using the methods of the Node in your FrameListener class. However, when you need relatively
+            complex scripted animation, this is the class to use since it will interpolate between
+            keyframes for you and generally make the whole process easier to manage.
+        @par
+            A single animation can affect multiple Node objects (each AnimationTrack affects a single Node).
+            In addition, through animation blending a single Node can be affected by multiple animations,
+            athough this is more useful when performing skeletal animation (see Skeleton::createAnimation).
+        @par
+            Note that whilst it uses the same classes, the animations created here are kept separate from the
+            skeletal animations of meshes (each Skeleton owns those animations).
+        @param name The name of the animation, must be unique within this SceneManager.
+        @param length The total length of the animation.
+        */
+        virtual Animation* createAnimation(const String& name, Real length);
+
+        /** Looks up an Animation object previously created with createAnimation. */
+        virtual Animation* getAnimation(const String& name) const;
+
+        /** Destroys an Animation. 
+        @remarks
+            You should ensure that none of your code is referencing this animation objects since the 
+            memory will be freed.
+        */
+        virtual void destroyAnimation(const String& name);
+
+        /** Removes all animations created using this SceneManager. */
+        virtual void destroyAllAnimations(void);
+
+        /** Create an AnimationState object for managing application of animations.
+        @remarks
+            You can create Animation objects for animating SceneNode obejcts using the
+            createAnimation method. However, in order to actually apply those animations
+            you have to call methods on Node and Animation in a particular order (namely
+            Node::resetToInitialState and Animation::apply). To make this easier and to
+            help track the current time position of animations, the AnimationState object
+            is provided. </p>
+            So if you don't want to control animation application manually, call this method,
+            update the returned object as you like every frame and let SceneManager apply 
+            the animation state for you.
+        @par
+            Remember, AnimationState objects are disabled by default at creation time. 
+            Turn them on when you want them using their setEnabled method.
+        @par
+            Note that any SceneNode affected by this automatic animation will have it's state
+            reset to it's initial position before application of the animation. Unless specifically
+            modified using Node::setInitialState the Node assumes it's initial state is at the
+            origin. If you want the base state of the SceneNode to be elsewhere, make your changes
+            to the node using the standard transform methods, then call setInitialState to 
+            'bake' this reference position into the node.
+        @param animName The name of an animation created already with createAnimation.
+        */
+        virtual AnimationState* createAnimationState(const String& animName);
+
+        /** Retrieves animation state as previously created using createAnimationState */
+        virtual AnimationState* getAnimationState(const String& animName);
+
+        /** Destroys an AnimationState. 
+        @remarks
+            You should ensure that none of your code is referencing this animation 
+            state object since the memory will be freed.
+        */
+        virtual void destroyAnimationState(const String& name);
+
+        /** Removes all animation states created using this SceneManager. */
+        virtual void destroyAllAnimationStates(void);
+
+        /** Manual rendering method, for advanced users only.
+        @remarks
+            This method allows you to send rendering commands through the pipeline on
+            demand, bypassing OGRE's normal world processing. You should only use this if you
+            really know what you're doing; OGRE does lots of things for you that you really should
+            let it do. However, there are times where it may be useful to have this manual interface,
+            for example overlaying something on top of the scene rendered by OGRE.
+        @par
+            Because this is an instant rendering method, timing is important. The best 
+            time to call it is from a RenderTargetListener event handler.
+        @par
+            Don't call this method a lot, it's designed for rare (1 or 2 times per frame) use. 
+            Calling it regularly per frame will cause frame rate drops!
+        @param rend A RenderOperation object describing the rendering op
+        @param pass The Pass to use for this render
+        @param vp Pointer to the viewport to render to
+        @param worldMatrix The transform to apply from object to world space
+        @param viewMatrix The transform to apply from world to view space
+        @param projMatrix The transform to apply from view to screen space
+        @param doBeginEndFrame If true, beginFrame() and endFrame() are called, 
+            otherwise not. You should leave this as false if you are calling
+            this within the main render loop.
+        */
+        virtual void manualRender(RenderOperation* rend, Pass* pass, Viewport* vp, 
+            const Matrix4& worldMatrix, const Matrix4& viewMatrix, const Matrix4& projMatrix, 
+            bool doBeginEndFrame = false) ;
+
+        /** Registers a new RenderQueueListener which will be notified when render queues
+            are processed.
+        */
+        virtual void addRenderQueueListener(RenderQueueListener* newListener);
+
+        /** Removes a listener previously added with addRenderQueueListener. */
+        virtual void removeRenderQueueListener(RenderQueueListener* delListener);
+
+		/** Adds an item to the 'special case' render queue list.
+		@remarks
+			Normally all render queues are rendered, in their usual sequence, 
+			only varying if a RenderQueueListener nominates for the queue to be 
+			repeated or skipped. This method allows you to add a render queue to 
+			a 'special case' list, which varies the behaviour. The effect of this
+			list depends on the 'mode' in which this list is in, which might be
+			to exclude these render queues, or to include them alone (excluding
+			all other queues). This allows you to perform broad selective
+			rendering without requiring a RenderQueueListener.
+		@param qid The identifier of the queue which should be added to the
+			special case list. Nothing happens if the queue is already in the list.
+		*/
+		virtual void addSpecialCaseRenderQueue(RenderQueueGroupID qid);
+		/** Removes an item to the 'special case' render queue list.
+		@see SceneManager::addSpecialCaseRenderQueue
+		@param qid The identifier of the queue which should be removed from the
+			special case list. Nothing happens if the queue is not in the list.
+		*/
+		virtual void removeSpecialCaseRenderQueue(RenderQueueGroupID qid);
+		/** Clears the 'special case' render queue list.
+		@see SceneManager::addSpecialCaseRenderQueue
+		*/
+		virtual void clearSpecialCaseRenderQueues(void);
+		/** Sets the way the special case render queue list is processed.
+		@see SceneManager::addSpecialCaseRenderQueue
+		@param mode The mode of processing
+		*/
+		virtual void setSpecialCaseRenderQueueMode(SpecialCaseRenderQueueMode mode);
+		/** Gets the way the special case render queue list is processed. */
+		virtual SpecialCaseRenderQueueMode getSpecialCaseRenderQueueMode(void);
+		/** Returns whether or not the named queue will be rendered based on the
+			current 'special case' render queue list and mode.
+		@see SceneManager::addSpecialCaseRenderQueue
+		@param qid The identifier of the queue which should be tested
+		@returns true if the queue will be rendered, false otherwise
+		*/
+		virtual bool isRenderQueueToBeProcessed(RenderQueueGroupID qid);
+
+		/** Sets the render queue that the world geometry (if any) this SceneManager
+			renders will be associated with.
+		@remarks
+			SceneManagers which provide 'world geometry' should place it in a 
+			specialised render queue in order to make it possible to enable / 
+			disable it easily using the addSpecialCaseRenderQueue method. Even 
+			if the SceneManager does not use the render queues to render the 
+			world geometry, it should still pick a queue to represent it's manual
+			rendering, and check isRenderQueueToBeProcessed before rendering.
+		@note
+			Setting this may not affect the actual ordering of rendering the
+			world geometry, if the world geometry is being rendered manually
+			by the SceneManager. If the SceneManager feeds world geometry into
+			the queues, however, the ordering will be affected. 
+		*/
+		virtual void setWorldGeometryRenderQueue(RenderQueueGroupID qid);
+		/** Gets the render queue that the world geometry (if any) this SceneManager
+			renders will be associated with.
+		@remarks
+			SceneManagers which provide 'world geometry' should place it in a 
+			specialised render queue in order to make it possible to enable / 
+			disable it easily using the addSpecialCaseRenderQueue method. Even 
+			if the SceneManager does not use the render queues to render the 
+			world geometry, it should still pick a queue to represent it's manual
+			rendering, and check isRenderQueueToBeProcessed before rendering.
+		*/
+		virtual RenderQueueGroupID getWorldGeometryRenderQueue(void);
+
+		/** Allows all bounding boxes of scene nodes to be displayed. */
+		virtual void showBoundingBoxes(bool bShow);
+
+		/** Returns if all bounding boxes of scene nodes are to be displayed */
+		virtual bool getShowBoundingBoxes() const;
+
+        /** Internal method for notifying the manager that a SceneNode is autotracking. */
+        virtual void _notifyAutotrackingSceneNode(SceneNode* node, bool autoTrack);
+
+        
+        /** Creates an AxisAlignedBoxSceneQuery for this scene manager. 
+        @remarks
+            This method creates a new instance of a query object for this scene manager, 
+            for an axis aligned box region. See SceneQuery and AxisAlignedBoxSceneQuery 
+            for full details.
+        @par
+            The instance returned from this method must be destroyed by calling
+            SceneManager::destroyQuery when it is no longer required.
+        @param box Details of the box which describes the region for this query.
+        @param mask The query mask to apply to this query; can be used to filter out
+            certain objects; see SceneQuery for details.
+        */
+        virtual AxisAlignedBoxSceneQuery* 
+            createAABBQuery(const AxisAlignedBox& box, unsigned long mask = 0xFFFFFFFF);
+        /** Creates a SphereSceneQuery for this scene manager. 
+        @remarks
+            This method creates a new instance of a query object for this scene manager, 
+            for a spherical region. See SceneQuery and SphereSceneQuery 
+            for full details.
+        @par
+            The instance returned from this method must be destroyed by calling
+            SceneManager::destroyQuery when it is no longer required.
+        @param sphere Details of the sphere which describes the region for this query.
+        @param mask The query mask to apply to this query; can be used to filter out
+            certain objects; see SceneQuery for details.
+        */
+        virtual SphereSceneQuery* 
+            createSphereQuery(const Sphere& sphere, unsigned long mask = 0xFFFFFFFF);
+        /** Creates a PlaneBoundedVolumeListSceneQuery for this scene manager. 
+        @remarks
+        This method creates a new instance of a query object for this scene manager, 
+        for a region enclosed by a set of planes (normals pointing inwards). 
+        See SceneQuery and PlaneBoundedVolumeListSceneQuery for full details.
+        @par
+        The instance returned from this method must be destroyed by calling
+        SceneManager::destroyQuery when it is no longer required.
+        @param volumes Details of the volumes which describe the region for this query.
+        @param mask The query mask to apply to this query; can be used to filter out
+        certain objects; see SceneQuery for details.
+        */
+        virtual PlaneBoundedVolumeListSceneQuery* 
+            createPlaneBoundedVolumeQuery(const PlaneBoundedVolumeList& volumes, unsigned long mask = 0xFFFFFFFF);
+
+
+        /** Creates a RaySceneQuery for this scene manager. 
+        @remarks
+            This method creates a new instance of a query object for this scene manager, 
+            looking for objects which fall along a ray. See SceneQuery and RaySceneQuery 
+            for full details.
+        @par
+            The instance returned from this method must be destroyed by calling
+            SceneManager::destroyQuery when it is no longer required.
+        @param ray Details of the ray which describes the region for this query.
+        @param mask The query mask to apply to this query; can be used to filter out
+            certain objects; see SceneQuery for details.
+        */
+        virtual RaySceneQuery* 
+            createRayQuery(const Ray& ray, unsigned long mask = 0xFFFFFFFF);
+        //PyramidSceneQuery* createPyramidQuery(const Pyramid& p, unsigned long mask = 0xFFFFFFFF);
+        /** Creates an IntersectionSceneQuery for this scene manager. 
+        @remarks
+            This method creates a new instance of a query object for locating
+            intersecting objects. See SceneQuery and IntersectionSceneQuery
+            for full details.
+        @par
+            The instance returned from this method must be destroyed by calling
+            SceneManager::destroyQuery when it is no longer required.
+        @param mask The query mask to apply to this query; can be used to filter out
+            certain objects; see SceneQuery for details.
+        */
+        virtual IntersectionSceneQuery* 
+            createIntersectionQuery(unsigned long mask = 0xFFFFFFFF);
+
+        /** Destroys a scene query of any type. */
+        virtual void destroyQuery(SceneQuery* query);
+
+        typedef MapIterator<SceneLightList> LightIterator;
+        typedef MapIterator<EntityList> EntityIterator;
+        typedef MapIterator<CameraList> CameraIterator;
+        typedef MapIterator<BillboardSetList> BillboardSetIterator;
+        typedef MapIterator<AnimationList> AnimationIterator;
+
+        /** Returns a specialised MapIterator over all lights in the scene. */
+        LightIterator getLightIterator(void) {
+            return LightIterator(mLights.begin(), mLights.end());
+        }
+        /** Returns a specialised MapIterator over all entities in the scene. */
+        EntityIterator getEntityIterator(void) {
+            return EntityIterator(mEntities.begin(), mEntities.end());
+        }
+        /** Returns a specialised MapIterator over all cameras in the scene. */
+        CameraIterator getCameraIterator(void) {
+            return CameraIterator(mCameras.begin(), mCameras.end());
+        }
+        /** Returns a specialised MapIterator over all BillboardSets in the scene. */
+        BillboardSetIterator getBillboardSetIterator(void) {
+            return BillboardSetIterator(mBillboardSets.begin(), mBillboardSets.end());
+        }
+        /** Returns a specialised MapIterator over all animations in the scene. */
+        AnimationIterator getAnimationIterator(void) {
+            return AnimationIterator(mAnimationsList.begin(), mAnimationsList.end());
+        }
+        /** Returns a specialised MapIterator over all animation states in the scene. */
+        AnimationStateIterator getAnimationStateIterator(void) {
+            return AnimationStateIterator(mAnimationStates.begin(), mAnimationStates.end());
+        }
+
+        /** Sets the general shadow technique to be used in this scene.
+        @remarks   
+            There are multiple ways to generate shadows in a scene, and each has 
+            strengths and weaknesses. 
+            <ul><li>Stencil-based approaches can be used to 
+            draw very long, extreme shadows without loss of precision and the 'additive'
+            version can correctly show the shadowing of complex effects like bump mapping
+            because they physically exclude the light from those areas. However, the edges
+            are very sharp and stencils cannot handle transparency, and they involve a 
+            fair amount of CPU work in order to calculate the shadow volumes, especially
+            when animated objects are involved.</li>
+            <li>Texture-based approaches are good for handling transparency (they can, for
+            example, correctly shadow a mesh which uses alpha to represent holes), and they
+            require little CPU overhead, and can happily shadow geometry which is deformed
+            by a vertex program, unlike stencil shadows. However, they have a fixed precision 
+            which can introduce 'jaggies' at long range and have fillrate issues of their own.</li>
+            </ul>
+        @par
+            We support 2 kinds of stencil shadows, and 2 kinds of texture-based shadows, and one
+            simple decal approach. The 2 stencil approaches differ in the amount of multipass work 
+            that is required - the modulative approach simply 'darkens' areas in shadow after the 
+            main render, which is the least expensive, whilst the additive approach has to perform 
+            a render per light and adds the cumulative effect, whcih is more expensive but more 
+            accurate. The texture based shadows both work in roughly the same way, the only difference is
+            that the shadowmap approach is slightly more accurate, but requires a more recent
+            graphics card.
+        @par
+            Note that because mixing many shadow techniques can cause problems, only one technique
+            is supported at once. Also, you should call this method at the start of the 
+            scene setup. 
+        @param technique The shadowing technique to use for the scene.
+        */
+        virtual void setShadowTechnique(ShadowTechnique technique);
+        
+        /** Gets the current shadow technique. */
+        virtual ShadowTechnique getShadowTechnique(void) const { return mShadowTechnique; }
+
+        /** Enables / disables the rendering of debug information for shadows. */
+        virtual void setShowDebugShadows(bool debug) { mDebugShadows = debug; }
+        /** Are debug shadows shown? */
+        virtual bool getShowDebugShadows(void ) const { return mDebugShadows; }
+
+        /** Set the colour used to modulate areas in shadow. 
+        @remarks This is only applicable for shadow techniques which involve 
+            darkening the area in shadow, as opposed to masking out the light. 
+            This colour provided is used as a modulative value to darken the
+            areas.
+        */
+        virtual void setShadowColour(const ColourValue& colour);
+        /** Get the colour used to modulate areas in shadow. 
+        @remarks This is only applicable for shadow techniques which involve 
+        darkening the area in shadow, as opposed to masking out the light. 
+        This colour provided is used as a modulative value to darken the
+        areas.
+        */
+        virtual const ColourValue& getShadowColour(void) const;
+        /** Sets the distance a shadow volume is extruded for a directional light.
+        @remarks
+            Although directional lights are essentially infinite, there are many
+            reasons to limit the shadow extrusion distance to a finite number, 
+            not least of which is compatibility with older cards (which do not
+            support infinite positions), and shadow caster elimination.
+        @par
+            The default value is 10,000 world units. This does not apply to
+            point lights or spotlights, since they extrude up to their 
+            attenuation range.
+        */
+        virtual void setShadowDirectionalLightExtrusionDistance(Real dist); 
+        /** Gets the distance a shadow volume is extruded for a directional light.
+        */
+        virtual Real getShadowDirectionalLightExtrusionDistance(void) const;
+        /** Sets the maximum distance away from the camera that shadows
+        will be visible.
+        @remarks
+        Shadow techniques can be expensive, therefore it is a good idea
+        to limit them to being rendered close to the camera if possible,
+        and to skip the expense of rendering shadows for distance objects.
+        This method allows you to set the distance at which shadows will no
+        longer be rendered.
+        @note
+        Each shadow technique can interpret this subtely differently.
+        For example, one technique may use this to eliminate casters,
+        another might use it to attenuate the shadows themselves.
+        You should tweak this value to suit your chosen shadow technique
+        and scene setup.
+        */
+        virtual void setShadowFarDistance(Real distance);
+        /** Gets the maximum distance away from the camera that shadows
+        will be visible.
+        */
+        virtual Real getShadowFarDistance(void) const
+        { return mShadowFarDist; }
+
+		/** Sets the maximum size of the index buffer used to render shadow
+		 	primitives.
+		@remarks
+			This method allows you to tweak the size of the index buffer used
+			to render shadow primitives (including stencil shadow volumes). The
+			default size is 51,200 entries, which is 100k of GPU memory, or
+			enough to render approximately 17,000 triangles. You can reduce this
+			as long as you do not have any models / world geometry chunks which 
+			could require more than the amount you set.
+		@par
+			The maximum number of triangles required to render a single shadow 
+			volume (including light and dark caps when needed) will be 3x the 
+			number of edges on the light silhouette, plus the number of 
+			light-facing triangles.	On average, half the 
+			triangles will be facing toward the light, but the number of 
+			triangles in the silhouette entirely depends on the mesh - 
+			angular meshes will have a higher silhouette tris/mesh tris
+			ratio than a smooth mesh. You can estimate the requirements for
+			your particular mesh by rendering it alone in a scene with shadows
+			enabled and a single light - rotate it or the light and make a note
+			of how high the triangle count goes (remembering to subtract the 
+			mesh triangle count)
+		@param size The number of indexes; divide this by 3 to determine the
+			number of triangles.
+		*/
+		virtual void setShadowIndexBufferSize(size_t size);
+        /// Get the size of the shadow index buffer
+		virtual size_t getShadowIndexBufferSize(void) const
+		{ return mShadowIndexBufferSize; }
+        /** Set the size of the texture used for texture-based shadows.
+        @remarks
+            The larger the shadow texture, the better the detail on 
+            texture based shadows, but obviously this takes more memory.
+            The default size is 512. Sizes must be a power of 2.
+        */
+        virtual void setShadowTextureSize(unsigned short size);
+        /// Get the size of the texture used for texture based shadows
+        unsigned short getShadowTextureSize(void) const {return mShadowTextureSize; }
+        /** Set the pixel format of the textures used for texture-based shadows.
+        @remarks
+			By default, a colour texture is used (PF_X8R8G8B8) for texture shadows,
+			but if you want to use more advanced texture shadow types you can 
+			alter this. If you do, you will have to also call
+			setShadowTextureCasterMaterial and setShadowTextureReceiverMaterial
+			to provide shader-based materials to use these customised shadow
+			texture formats.
+        */
+        virtual void setShadowTexturePixelFormat(PixelFormat fmt);
+        /// Get the format of the textures used for texture based shadows
+        PixelFormat getShadowTexturePixelFormat(void) const {return mShadowTextureFormat; }
+        /** Set the number of textures allocated for texture-based shadows.
+        @remarks
+            The default number of textures assigned to deal with texture based
+            shadows is 1; however this means you can only have one light casting
+            shadows at the same time. You can increase this number in order to 
+            make this more flexible, but be aware of the texture memory it will use.
+        */
+        virtual void setShadowTextureCount(unsigned short count);
+        /// Get the number of the textures allocated for texture based shadows
+        unsigned short getShadowTextureCount(void) const {return mShadowTextureCount; }
+        /** Sets the size and count of textures used in texture-based shadows. 
+        @remarks
+            @see setShadowTextureSize and setShadowTextureCount for details, this
+            method just allows you to change both at once, which can save on 
+            reallocation if the textures have already been created.
+        */
+        virtual void setShadowTextureSettings(unsigned short size, unsigned short count, 
+			PixelFormat fmt = PF_X8R8G8B8);
+        /** Sets the proportional distance which a texture shadow which is generated from a
+            directional light will be offset into the camera view to make best use of texture space.
+        @remarks
+            When generating a shadow texture from a directional light, an approximation is used
+            since it is not possible to render the entire scene to one texture. 
+            The texture is projected onto an area centred on the camera, and is
+            the shadow far distance * 2 in length (it is square). This wastes
+            a lot of texture space outside the frustum though, so this offset allows
+            you to move the texture in front of the camera more. However, be aware
+            that this can cause a little shadow 'jittering' during rotation, and
+            that if you move it too far then you'll start to get artefacts close 
+            to the camera. The value is represented as a proportion of the shadow
+            far distance, and the default is 0.6.
+        */
+        virtual void setShadowDirLightTextureOffset(Real offset) { mShadowTextureOffset = offset;}
+        /** Sets the proportional distance at which texture shadows begin to fade out.
+        @remarks
+            To hide the edges where texture shadows end (in directional lights)
+            Ogre will fade out the shadow in the distance. This value is a proportional
+            distance of the entire shadow visibility distance at which the shadow
+            begins to fade out. The default is 0.7
+        */
+        virtual void setShadowTextureFadeStart(Real fadeStart) 
+        { mShadowTextureFadeStart = fadeStart; }
+        /** Sets the proportional distance at which texture shadows finish to fading out.
+        @remarks
+        To hide the edges where texture shadows end (in directional lights)
+        Ogre will fade out the shadow in the distance. This value is a proportional
+        distance of the entire shadow visibility distance at which the shadow
+        is completely invisible. The default is 0.9.
+        */
+        virtual void setShadowTextureFadeEnd(Real fadeEnd) 
+        { mShadowTextureFadeEnd = fadeEnd; }
+
+		/** Sets whether or not texture shadows should attempt to self-shadow.
+		@remarks
+			The default implementation of texture shadows uses a fixed-function 
+			colour texture projection approach for maximum compatibility, and 
+			as such cannot support self-shadowing. However, if you decide to 
+			implement a more complex shadowing technique using the 
+			setShadowTextureCasterMaterial and setShadowTextureReceiverMaterial 
+			there is a possibility you may be able to support 
+			self-shadowing (e.g by implementing a shader-based shadow map). In 
+			this case you might want to enable this option.
+		@param selfShadow Whether to attempt self-shadowing with texture shadows
+		*/
+		virtual void setShadowTextureSelfShadow(bool selfShadow) 
+		{ mShadowTextureSelfShadow = selfShadow; }
+		/// Gets whether or not texture shadows attempt to self-shadow.
+		virtual bool getShadowTextureSelfShadow(void) const 
+		{ return mShadowTextureSelfShadow; }
+		/** Sets the default material to use for rendering shadow casters.
+		@remarks
+			By default shadow casters are rendered into the shadow texture using
+			an automatically generated fixed-function pass. This allows basic
+			projective texture shadows, but it's possible to use more advanced
+			shadow techniques by overriding the caster and receiver materials, for
+			example providing vertex and fragment programs to implement shadow
+			maps.
+		@par
+			You can rely on the ambient light in the scene being set to the 
+			requested texture shadow colour, if that's useful. 
+		@note
+			Individual objects may also override the vertex program in
+			your default material if their materials include 
+			shadow_caster_vertex_program_ref shadow_receiver_vertex_program_ref
+			entries, so if you use both make sure they are compatible.
+		@note
+			Only a single pass is allowed in your material, although multiple
+			techniques may be used for hardware fallback.
+		*/
+		virtual void setShadowTextureCasterMaterial(const String& name);
+		/** Sets the default material to use for rendering shadow receivers.
+		@remarks
+			By default shadow receivers are rendered as a post-pass using basic
+			modulation. This allows basic projective texture shadows, but it's 
+			possible to use more advanced shadow techniques by overriding the 
+			caster and receiver materials, for example providing vertex and 
+			fragment programs to implement shadow maps.
+		@par
+			You can rely on texture unit 0 containing the shadow texture, and 
+			for the unit to be set to use projective texturing from the light 
+			(only useful if you're using fixed-function, which is unlikely; 
+			otherwise you should rely on the texture_viewproj_matrix auto binding)
+		@note
+			Individual objects may also override the vertex program in
+			your default material if their materials include 
+			shadow_caster_vertex_program_ref shadow_receiver_vertex_program_ref
+			entries, so if you use both make sure they are compatible.
+		@note
+			Only a single pass is allowed in your material, although multiple
+			techniques may be used for hardware fallback.
+		*/
+		virtual void setShadowTextureReceiverMaterial(const String& name);
+
+		/** Sets whether we should use an inifinite camera far plane
+			when rendering stencil shadows.
+		@remarks
+			Stencil shadow coherency is very reliant on the shadow volume
+			not being clipped by the far plane. If this clipping happens, you
+			get a kind of 'negative' shadow effect. The best way to achieve
+			coherency is to move the far plane of the camera out to infinity,
+			thus preventing the far plane from clipping the shadow volumes.
+			When combined with vertex program extrusion of the volume to 
+			infinity, which	Ogre does when available, this results in very
+			robust shadow volumes. For this reason, when you enable stencil 
+			shadows, Ogre automatically changes your camera settings to 
+			project to infinity if the card supports it. You can disable this
+			behaviour if you like by calling this method; although you can 
+			never enable infinite projection if the card does not support it.
+		@par	
+			If you disable infinite projection, or it is not available, 
+			you need to be far more careful with your light attenuation /
+			directional light extrusion distances to avoid clipping artefacts
+			at the far plane.
+		@note
+			Recent cards will generally support infinite far plane projection.
+			However, we have found some cases where they do not, especially
+			on Direct3D. There is no standard capability we can check to 
+			validate this, so we use some heuristics based on experience:
+			<UL>
+			<LI>OpenGL always seems to support it no matter what the card</LI>
+			<LI>Direct3D on non-vertex program capable systems (including 
+			vertex program capable cards on Direct3D7) does not
+			support it</LI>
+			<LI>Direct3D on GeForce3 and GeForce4 Ti does not seem to support
+			infinite projection<LI>
+			</UL>
+			Therefore in the RenderSystem implementation, we may veto the use
+			of an infinite far plane based on these heuristics. 
+		*/
+        virtual void setShadowUseInfiniteFarPlane(bool enable) {
+            mShadowUseInfiniteFarPlane = enable; }
+
+		/** Creates a StaticGeometry instance suitable for use with this
+			SceneManager.
+		@remarks
+			StaticGeometry is a way of batching up geometry into a more 
+			efficient form at the expense of being able to move it. Please 
+			read the StaticGeometry class documentation for full information.
+		@param name The name to give the new object
+		@returns The new StaticGeometry instance
+		*/
+		virtual StaticGeometry* createStaticGeometry(const String& name);
+		/** Retrieve a previously created StaticGeometry instance. */
+		virtual StaticGeometry* getStaticGeometry(const String& name) const;
+		/** Remove & destroy a StaticGeometry instance. */
+		virtual void removeStaticGeometry(StaticGeometry* geom);
+		/** Remove & destroy a StaticGeometry instance. */
+		virtual void removeStaticGeometry(const String& name);
+		/** Remove & destroy all StaticGeometry instances. */
+		virtual void removeAllStaticGeometry(void);
+
+		
+    };
+
+    /** Default implementation of IntersectionSceneQuery. */
+    class _OgreExport DefaultIntersectionSceneQuery : 
+        public IntersectionSceneQuery
+    {
+    public:
+        DefaultIntersectionSceneQuery(SceneManager* creator);
+        ~DefaultIntersectionSceneQuery();
+
+        /** See IntersectionSceneQuery. */
+        void execute(IntersectionSceneQueryListener* listener);
+    };
+
+    /** Default implementation of RaySceneQuery. */
+	class _OgreExport DefaultRaySceneQuery : public RaySceneQuery
+    {
+    public:
+        DefaultRaySceneQuery(SceneManager* creator);
+        ~DefaultRaySceneQuery();
+
+        /** See RayScenQuery. */
+        void execute(RaySceneQueryListener* listener);
+    };
+    /** Default implementation of SphereSceneQuery. */
+	class _OgreExport DefaultSphereSceneQuery : public SphereSceneQuery
+    {
+    public:
+        DefaultSphereSceneQuery(SceneManager* creator);
+        ~DefaultSphereSceneQuery();
+
+        /** See SceneQuery. */
+        void execute(SceneQueryListener* listener);
+    };
+    /** Default implementation of PlaneBoundedVolumeListSceneQuery. */
+    class _OgreExport DefaultPlaneBoundedVolumeListSceneQuery : public PlaneBoundedVolumeListSceneQuery
+    {
+    public:
+        DefaultPlaneBoundedVolumeListSceneQuery(SceneManager* creator);
+        ~DefaultPlaneBoundedVolumeListSceneQuery();
+
+        /** See SceneQuery. */
+        void execute(SceneQueryListener* listener);
+    };
+    /** Default implementation of AxisAlignedBoxSceneQuery. */
+	class _OgreExport DefaultAxisAlignedBoxSceneQuery : public AxisAlignedBoxSceneQuery
+    {
+    public:
+        DefaultAxisAlignedBoxSceneQuery(SceneManager* creator);
+        ~DefaultAxisAlignedBoxSceneQuery();
+
+        /** See RayScenQuery. */
+        void execute(SceneQueryListener* listener);
+    };
+    
+
+
+} // Namespace
+
+
+
+#endif
Index: /tags/DummyModules/VUT/work/ogre_changes/OgreMain/src/OgreSceneNode.cpp
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/OgreMain/src/OgreSceneNode.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/OgreMain/src/OgreSceneNode.cpp	(revision 61)
@@ -0,0 +1,644 @@
+/*
+-----------------------------------------------------------------------------
+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.
+-----------------------------------------------------------------------------
+*/
+#include "OgreStableHeaders.h"
+#include "OgreSceneNode.h"
+
+#include "OgreException.h"
+#include "OgreEntity.h"
+#include "OgreCamera.h"
+#include "OgreLight.h"
+#include "OgreMath.h"
+#include "OgreSceneManager.h"
+#include "OgreMovableObject.h"
+#include "OgreWireBoundingBox.h"
+
+namespace Ogre {
+    //-----------------------------------------------------------------------
+    SceneNode::SceneNode(SceneManager* creator) 
+    : Node(), mLightListDirty(true), mWireBoundingBox(0), 
+	mShowBoundingBox(false), mCreator(creator), 
+	mYawFixed(false), mAutoTrackTarget(0), mIsInSceneGraph(false)
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	, mLastVisited(0), mVisible(false), mLastRendered(-1)
+#endif //GTP_VISIBILITY_MODIFIED_OGRE
+    {
+        needUpdate();
+    }
+    //-----------------------------------------------------------------------
+    SceneNode::SceneNode(SceneManager* creator, const String& name) 
+    : Node(name), mLightListDirty(true), mWireBoundingBox(0), 
+	mShowBoundingBox(false), mCreator(creator), mYawFixed(false), 
+	mAutoTrackTarget(0), mIsInSceneGraph(false)
+	#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	, mLastVisited(0), mVisible(false)
+	#endif //GTP_VISIBILITY_MODIFIED_OGRE
+    {
+        needUpdate();
+    }
+    //-----------------------------------------------------------------------
+    SceneNode::~SceneNode()
+    {
+        // Detach all objects, do this manually to avoid needUpdate() call 
+        // which can fail because of deleted items
+		ObjectMap::iterator itr;
+		MovableObject* ret;
+		for ( itr = mObjectsByName.begin(); itr != mObjectsByName.end(); itr++ )
+		{
+		  ret = itr->second;
+		  ret->_notifyAttached((SceneNode*)0);
+		}
+        mObjectsByName.clear();
+
+        if (mWireBoundingBox) {
+			delete mWireBoundingBox;
+		}
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::_update(bool updateChildren, bool parentHasChanged)
+    {
+        Node::_update(updateChildren, parentHasChanged);
+        _updateBounds();
+        mLightListDirty = true;
+
+    }
+    //-----------------------------------------------------------------------
+	void SceneNode::setParent(Node* parent)
+	{
+		Node::setParent(parent);
+
+		if (parent)
+		{
+			SceneNode* sceneParent = static_cast<SceneNode*>(parent);
+			setInSceneGraph(sceneParent->isInSceneGraph());
+		}
+		else
+		{
+			setInSceneGraph(false);
+		}
+	}
+    //-----------------------------------------------------------------------
+	void SceneNode::setInSceneGraph(bool inGraph)
+	{
+		if (inGraph != mIsInSceneGraph)
+		{
+			mIsInSceneGraph = inGraph;
+			// Tell children
+	        ChildNodeMap::iterator child;
+    	    for (child = mChildren.begin(); child != mChildren.end(); ++child)
+        	{
+            	SceneNode* sceneChild = static_cast<SceneNode*>(child->second);
+				sceneChild->setInSceneGraph(inGraph);
+			}
+		}
+	}
+    //-----------------------------------------------------------------------
+    void SceneNode::attachObject(MovableObject* obj)
+    {
+        obj->_notifyAttached(this);
+
+        // Also add to name index
+        std::pair<ObjectMap::iterator, bool> insresult = 
+            mObjectsByName.insert(ObjectMap::value_type(obj->getName(), obj));
+        assert(insresult.second && "Object was not attached because an object of the "
+            "same name was already attached to this node.");
+
+        // Make sure bounds get updated (must go right to the top)
+        needUpdate();
+    }
+    //-----------------------------------------------------------------------
+    unsigned short SceneNode::numAttachedObjects(void) const
+    {
+        return static_cast< unsigned short >( mObjectsByName.size() );
+    }
+    //-----------------------------------------------------------------------
+    MovableObject* SceneNode::getAttachedObject(unsigned short index)
+    {
+        if (index < mObjectsByName.size())
+        {
+            ObjectMap::iterator i = mObjectsByName.begin();
+            // Increment (must do this one at a time)            
+            while (index--)++i;
+
+            return i->second;
+        }
+        else
+        {
+            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Object index out of bounds.", "SceneNode::getAttachedObject");
+        }
+        return 0;
+    }
+    //-----------------------------------------------------------------------
+    MovableObject* SceneNode::getAttachedObject(const String& name)
+    {
+        // Look up 
+        ObjectMap::iterator i = mObjectsByName.find(name);
+
+        if (i == mObjectsByName.end())
+        {
+            OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "Attached object " + 
+                name + " not found.", "SceneNode::getAttachedObject");
+        }
+
+        return i->second;
+
+    }
+    //-----------------------------------------------------------------------
+    MovableObject* SceneNode::detachObject(unsigned short index)
+    {
+        MovableObject* ret;
+        if (index < mObjectsByName.size())
+        {
+
+            ObjectMap::iterator i = mObjectsByName.begin();
+            // Increment (must do this one at a time)            
+            while (index--)++i;
+
+            ret = i->second;
+            mObjectsByName.erase(i);
+            ret->_notifyAttached((SceneNode*)0);
+
+            // Make sure bounds get updated (must go right to the top)
+            needUpdate();
+
+            return ret;
+
+        }
+        else
+        {
+            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Object index out of bounds.", "SceneNode::getAttchedEntity");
+        }
+        return 0;
+
+    }
+    //-----------------------------------------------------------------------
+    MovableObject* SceneNode::detachObject(const String& name)
+    {
+        ObjectMap::iterator it = mObjectsByName.find(name);
+        if (it == mObjectsByName.end())
+        {
+            OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "Object " + name + " is not attached "
+                "to this node.", "SceneNode::detachObject");
+        }
+        MovableObject* ret = it->second;
+        mObjectsByName.erase(it);
+        ret->_notifyAttached((SceneNode*)0);
+        // Make sure bounds get updated (must go right to the top)
+        needUpdate();
+        
+        return ret;
+
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::detachObject(MovableObject* obj)
+    {
+        ObjectMap::iterator i, iend;
+        iend = mObjectsByName.end();
+        for (i = mObjectsByName.begin(); i != iend; ++i)
+        {
+            if (i->second == obj)
+            {
+                mObjectsByName.erase(i);
+                break;
+            }
+        }
+        obj->_notifyAttached((SceneNode*)0);
+
+        // Make sure bounds get updated (must go right to the top)
+        needUpdate();
+
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::detachAllObjects(void)
+    {
+		ObjectMap::iterator itr;
+		MovableObject* ret;
+		for ( itr = mObjectsByName.begin(); itr != mObjectsByName.end(); itr++ )
+		{
+		  ret = itr->second;
+		  ret->_notifyAttached((SceneNode*)0);
+		}
+        mObjectsByName.clear();
+        // Make sure bounds get updated (must go right to the top)
+        needUpdate();
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::_updateBounds(void)
+    {
+        // Reset bounds first
+        mWorldAABB.setNull();
+
+        // Update bounds from own attached objects
+        ObjectMap::iterator i;
+        for (i = mObjectsByName.begin(); i != mObjectsByName.end(); ++i)
+        {
+            // Merge world bounds of each object
+            mWorldAABB.merge(i->second->getWorldBoundingBox(true));
+        }
+
+        // Merge with children
+        ChildNodeMap::iterator child;
+        for (child = mChildren.begin(); child != mChildren.end(); ++child)
+        {
+            SceneNode* sceneChild = static_cast<SceneNode*>(child->second);
+            mWorldAABB.merge(sceneChild->mWorldAABB);
+        }
+
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::_findVisibleObjects(Camera* cam, RenderQueue* queue, 
+        bool includeChildren, bool displayNodes, bool onlyShadowCasters)
+    {
+        // Check self visible
+        if (!cam->isVisible(mWorldAABB))
+            return;
+
+        // Add all entities
+        ObjectMap::iterator iobj;
+        ObjectMap::iterator iobjend = mObjectsByName.end();
+        for (iobj = mObjectsByName.begin(); iobj != iobjend; ++iobj)
+        {
+            // Tell attached objects about camera position (incase any extra processing they want to do)
+            iobj->second->_notifyCurrentCamera(cam);
+            if (iobj->second->isVisible() && 
+                (!onlyShadowCasters || iobj->second->getCastShadows()))
+            {
+                iobj->second->_updateRenderQueue(queue);
+            }
+        }
+
+        if (includeChildren)
+        {
+            ChildNodeMap::iterator child, childend;
+            childend = mChildren.end();
+            for (child = mChildren.begin(); child != childend; ++child)
+            {
+                SceneNode* sceneChild = static_cast<SceneNode*>(child->second);
+                sceneChild->_findVisibleObjects(cam, queue, includeChildren, displayNodes);
+            }
+        }
+
+        if (displayNodes)
+        {
+            // Include self in the render queue
+            queue->addRenderable(this);
+        }
+
+		// Check if the bounding box should be shown.
+		// See if our flag is set or if the scene manager flag is set.
+		if (mShowBoundingBox || (mCreator && mCreator->getShowBoundingBoxes())) 
+		{ 
+			_addBoundingBoxToQueue(queue);
+		}
+
+
+    }
+
+
+	void SceneNode::_addBoundingBoxToQueue(RenderQueue* queue) {
+		// Create a WireBoundingBox if needed.
+		if (mWireBoundingBox == NULL) {
+			mWireBoundingBox = new WireBoundingBox();
+		}
+		mWireBoundingBox->setupBoundingBox(mWorldAABB);
+		queue->addRenderable(mWireBoundingBox);
+	}
+
+	void SceneNode::showBoundingBox(bool bShow) {
+		mShowBoundingBox = bShow;
+	}
+
+	bool SceneNode::getShowBoundingBox() const {
+		return mShowBoundingBox;
+	}
+
+
+    //-----------------------------------------------------------------------
+    Node* SceneNode::createChildImpl(void)
+    {
+        assert(mCreator);
+        return mCreator->createSceneNode();
+    }
+    //-----------------------------------------------------------------------
+    Node* SceneNode::createChildImpl(const String& name)
+    {
+        assert(mCreator);
+        return mCreator->createSceneNode(name);
+    }
+    //-----------------------------------------------------------------------
+    AxisAlignedBox SceneNode::_getWorldAABB(void) const
+    {
+        return mWorldAABB;
+    }
+    //-----------------------------------------------------------------------
+    SceneNode::ObjectIterator SceneNode::getAttachedObjectIterator(void)
+    {
+        return ObjectIterator(mObjectsByName.begin(), mObjectsByName.end());
+    }
+	//-----------------------------------------------------------------------
+	SceneNode::ConstObjectIterator SceneNode::getAttachedObjectIterator(void) const
+	{
+		return ConstObjectIterator(mObjectsByName.begin(), mObjectsByName.end());
+	}
+    //-----------------------------------------------------------------------
+    SceneManager* SceneNode::getCreator(void) const
+    {
+        return mCreator;
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::removeAndDestroyChild(const String& name)
+    {
+        SceneNode* pChild = static_cast<SceneNode*>(getChild(name));
+        pChild->removeAndDestroyAllChildren();
+
+        removeChild(name);
+        pChild->getCreator()->destroySceneNode(name);
+
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::removeAndDestroyChild(unsigned short index)
+    {
+        SceneNode* pChild = static_cast<SceneNode*>(getChild(index));
+        pChild->removeAndDestroyAllChildren();
+
+        removeChild(index);
+        pChild->getCreator()->destroySceneNode(pChild->getName());
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::removeAndDestroyAllChildren(void)
+    {
+        ChildNodeMap::iterator i, iend;
+        iend = mChildren.end();
+        for (i = mChildren.begin(); i != iend; ++i)
+        {
+            SceneNode* sn = static_cast<SceneNode*>(i->second);
+            sn->removeAndDestroyAllChildren();
+            sn->getCreator()->destroySceneNode(sn->getName());
+        }
+	    mChildren.clear();
+        needUpdate();
+    }
+    //-----------------------------------------------------------------------
+	SceneNode* SceneNode::createChildSceneNode(const Vector3& translate, 
+        const Quaternion& rotate)
+	{
+		return static_cast<SceneNode*>(this->createChild(translate, rotate));
+	}
+    //-----------------------------------------------------------------------
+    SceneNode* SceneNode::createChildSceneNode(const String& name, const Vector3& translate, 
+		const Quaternion& rotate)
+	{
+		return static_cast<SceneNode*>(this->createChild(name, translate, rotate));
+	}
+    //-----------------------------------------------------------------------
+    const LightList& SceneNode::findLights(Real radius) const
+    {
+        // TEMP FIX
+        // If a scene node is static and lights have moved, light list won't change
+        // can't use a simple global boolean flag since this is only called for
+        // visible nodes, so temporarily visible nodes will not be updated
+        // Since this is only called for visible nodes, skip the check for now
+        //if (mLightListDirty)
+        if (mCreator)
+        {
+            // Use SceneManager to calculate
+            mCreator->_populateLightList(this->_getDerivedPosition(), radius, mLightList);
+            mLightListDirty = false;
+        }
+        return mLightList;
+
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::setAutoTracking(bool enabled, SceneNode* target, 
+        const Vector3& localDirectionVector,
+        const Vector3& offset)
+    {
+        if (enabled)
+        {
+            mAutoTrackTarget = target;
+            mAutoTrackOffset = offset;
+            mAutoTrackLocalDirection = localDirectionVector;
+        }
+        else
+        {
+            mAutoTrackTarget = 0;
+        }
+        if (mCreator)
+            mCreator->_notifyAutotrackingSceneNode(this, enabled);
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::setFixedYawAxis(bool useFixed, const Vector3& fixedAxis)
+    {
+        mYawFixed = useFixed;
+        mYawFixedAxis = fixedAxis;
+    }
+
+	//-----------------------------------------------------------------------
+	void SceneNode::yaw(const Radian& angle, TransformSpace relativeTo)
+	{
+		if (mYawFixed)
+		{
+			rotate(mYawFixedAxis, angle, relativeTo);
+		}
+		else
+		{
+			rotate(Vector3::UNIT_Y, angle, relativeTo);
+		}
+
+	}
+    //-----------------------------------------------------------------------
+    void SceneNode::setDirection(Real x, Real y, Real z, TransformSpace relativeTo, 
+        const Vector3& localDirectionVector)
+    {
+        setDirection(Vector3(x,y,z), relativeTo, localDirectionVector);
+    }
+
+    //-----------------------------------------------------------------------
+    void SceneNode::setDirection(const Vector3& vec, TransformSpace relativeTo, 
+        const Vector3& localDirectionVector)
+    {
+        // Do nothing if given a zero vector
+        if (vec == Vector3::ZERO) return;
+
+        // Adjust vector so that it is relative to local Z
+        Vector3 zAdjustVec;
+        if (localDirectionVector == Vector3::NEGATIVE_UNIT_Z)
+        {
+            zAdjustVec = -vec;
+        }
+        else
+        {
+            Quaternion localToUnitZ = localDirectionVector.getRotationTo(Vector3::UNIT_Z);
+            zAdjustVec = localToUnitZ * vec;
+        }
+        zAdjustVec.normalise();
+
+        Quaternion targetOrientation;
+        if( mYawFixed )
+        {
+            Vector3 xVec = mYawFixedAxis.crossProduct( zAdjustVec );
+            xVec.normalise();
+
+            Vector3 yVec = zAdjustVec.crossProduct( xVec );
+            yVec.normalise();
+            
+            targetOrientation.FromAxes( xVec, yVec, zAdjustVec );
+        }
+        else
+        {
+
+            // Get axes from current quaternion
+            Vector3 axes[3];
+            _getDerivedOrientation().ToAxes(axes);
+            Quaternion rotQuat;
+            if ( (axes[2]+zAdjustVec).squaredLength() <  0.00005f)
+            {
+                // Oops, a 180 degree turn (infinite possible rotation axes)
+                // Default to yaw i.e. use current UP
+                rotQuat.FromAngleAxis(Radian(Math::PI), axes[1]);
+            }
+            else
+            {
+                // Derive shortest arc to new direction
+                rotQuat = axes[2].getRotationTo(zAdjustVec);
+
+            }
+            targetOrientation = rotQuat * mOrientation;
+        }
+
+        if (relativeTo == TS_LOCAL || !mParent)
+        {
+            setOrientation(targetOrientation);
+        }
+        else
+        {
+            if (relativeTo == TS_PARENT)
+            {
+                setOrientation(targetOrientation * mParent->getOrientation().Inverse());
+            }
+            else if (relativeTo == TS_WORLD)
+            {
+                setOrientation(targetOrientation * mParent->_getDerivedOrientation().Inverse());
+            }
+        }
+
+
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::lookAt( const Vector3& targetPoint, TransformSpace relativeTo, 
+        const Vector3& localDirectionVector)
+    {
+        this->setDirection(targetPoint - _getDerivedPosition(), relativeTo, 
+            localDirectionVector);
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::_autoTrack(void)
+    {
+        // NB assumes that all scene nodes have been updated
+        if (mAutoTrackTarget)
+        {
+            lookAt(mAutoTrackTarget->_getDerivedPosition() + mAutoTrackOffset, 
+                TS_WORLD, mAutoTrackLocalDirection);
+            // update self & children
+            _update(true, true);
+        }
+    }
+    //-----------------------------------------------------------------------
+    SceneNode* SceneNode::getParentSceneNode(void) const
+    {
+        return static_cast<SceneNode*>(getParent());
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::setVisible(bool visible, bool cascade)
+    {
+        ObjectMap::iterator oi, oiend;
+        oiend = mObjectsByName.end();
+        for (oi = mObjectsByName.begin(); oi != oiend; ++oi)
+        {
+            oi->second->setVisible(visible);
+        }
+
+        if (cascade)
+        {
+            ChildNodeMap::iterator i, iend;
+            iend = mChildren.end();
+            for (i = mChildren.begin(); i != iend; ++i)
+            {
+                static_cast<SceneNode*>(i->second)->setVisible(visible, cascade);
+            }
+        }
+    }
+    //-----------------------------------------------------------------------
+    void SceneNode::flipVisibility(bool cascade)
+    {
+        ObjectMap::iterator oi, oiend;
+        oiend = mObjectsByName.end();
+        for (oi = mObjectsByName.begin(); oi != oiend; ++oi)
+        {
+            oi->second->setVisible(!oi->second->isVisible());
+        }
+
+        if (cascade)
+        {
+            ChildNodeMap::iterator i, iend;
+            iend = mChildren.end();
+            for (i = mChildren.begin(); i != iend; ++i)
+            {
+                static_cast<SceneNode*>(i->second)->flipVisibility(cascade);
+            }
+        }
+    }
+	#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	//-----------------------------------------------------------------------	
+	int SceneNode::lastVisited(void)
+	{
+		return mLastVisited;
+	}
+	//-----------------------------------------------------------------------
+	void SceneNode::setLastVisited(int frameid)
+	{
+		mLastVisited = frameid;
+	}
+	//-----------------------------------------------------------------------	
+	void SceneNode::setNodeVisible(bool visible)
+	{
+		mVisible = visible;
+	}
+	//-----------------------------------------------------------------------	
+	bool SceneNode::isNodeVisible(void)
+	{
+		return mVisible;
+	}
+	//-----------------------------------------------------------------------	
+	int SceneNode::lastRendered(void)
+	{
+		return mLastRendered;
+	}
+	//-----------------------------------------------------------------------
+	void SceneNode::setLastRendered(int frameid)
+	{
+		mLastRendered = frameid;
+	}
+	#endif //GTP_VISIBILITY_MODIFIED_OGRE
+}
Index: /tags/DummyModules/VUT/work/ogre_changes/OgreMain/src/OgreFrustum.cpp
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/OgreMain/src/OgreFrustum.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/OgreMain/src/OgreFrustum.cpp	(revision 61)
@@ -0,0 +1,847 @@
+/*
+-----------------------------------------------------------------------------
+This source file is part of OGRE
+    (Object-oriented Graphics Rendering Engine)
+For the latest info, see http://ogre.sourceforge.net/
+
+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.
+-----------------------------------------------------------------------------
+*/
+#include "OgreStableHeaders.h"
+#include "OgreFrustum.h"
+
+#include "OgreMath.h"
+#include "OgreMatrix3.h"
+#include "OgreSceneNode.h"
+#include "OgreSphere.h"
+#include "OgreLogManager.h"
+#include "OgreException.h"
+#include "OgreRoot.h"
+#include "OgreCamera.h"
+#include "OgreHardwareBufferManager.h"
+#include "OgreHardwareVertexBuffer.h"
+#include "OgreHardwareIndexBuffer.h"
+#include "OgreMaterialManager.h"
+#include "OgreRenderSystem.h"
+
+namespace Ogre {
+
+    String Frustum::msMovableType = "Frustum";
+    const Real Frustum::INFINITE_FAR_PLANE_ADJUST = 0.00001;
+    //-----------------------------------------------------------------------
+    Frustum::Frustum() : 
+        mProjType(PT_PERSPECTIVE), 
+        mFOVy(Radian(Math::PI/4.0)), 
+        mFarDist(100000.0f), 
+        mNearDist(100.0f), 
+        mAspect(1.33333333333333f), 
+        mProjMatrix(Matrix4::ZERO), 
+        mViewMatrix(Matrix4::ZERO), 
+        mRecalcFrustum(true), 
+        mRecalcView(true), 
+        mReflect(false), 
+        mReflectMatrix(Matrix4::ZERO), 
+        mLinkedReflectPlane(0),
+        mObliqueDepthProjection(false), 
+        mLinkedObliqueProjPlane(0)
+    {
+        // Initialise vertex & index data
+        mVertexData.vertexDeclaration->addElement(0, 0, VET_FLOAT3, VES_POSITION);
+        mVertexData.vertexCount = 32;
+        mVertexData.vertexStart = 0;
+        mVertexData.vertexBufferBinding->setBinding( 0,
+            HardwareBufferManager::getSingleton().createVertexBuffer(
+                sizeof(float)*3, 32, HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY) );
+
+        // Initialise material
+        mMaterial = MaterialManager::getSingleton().getByName("BaseWhiteNoLighting");
+        
+        // Alter superclass members
+        mVisible = false;
+        mParentNode = 0;
+
+        mLastLinkedReflectionPlane.normal = Vector3::ZERO;
+        mLastLinkedObliqueProjPlane.normal = Vector3::ZERO;
+
+
+        updateView();
+    }
+
+    //-----------------------------------------------------------------------
+    Frustum::~Frustum()
+    {
+        // Do nothing
+    }
+
+    //-----------------------------------------------------------------------
+    void Frustum::setFOVy(const Radian& fov)
+    {
+        mFOVy = fov;
+        invalidateFrustum();
+    }
+
+    //-----------------------------------------------------------------------
+    const Radian& Frustum::getFOVy(void) const
+    {
+        return mFOVy;
+    }
+
+
+    //-----------------------------------------------------------------------
+    void Frustum::setFarClipDistance(Real farPlane)
+    {
+        mFarDist = farPlane;
+        invalidateFrustum();
+    }
+
+    //-----------------------------------------------------------------------
+    Real Frustum::getFarClipDistance(void) const
+    {
+        return mFarDist;
+    }
+
+    //-----------------------------------------------------------------------
+    void Frustum::setNearClipDistance(Real nearPlane)
+    {
+        if (nearPlane <= 0)
+            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Near clip distance must be greater than zero.",
+                "Frustum::setNearClipDistance");
+        mNearDist = nearPlane;
+        invalidateFrustum();
+    }
+
+    //-----------------------------------------------------------------------
+    Real Frustum::getNearClipDistance(void) const
+    {
+        return mNearDist;
+    }
+
+    //-----------------------------------------------------------------------
+    const Matrix4& Frustum::getProjectionMatrix(void) const
+    {
+
+        updateFrustum();
+
+        return mProjMatrix;
+    }
+    //-----------------------------------------------------------------------
+    const Matrix4& Frustum::getStandardProjectionMatrix(void) const
+    {
+
+        updateFrustum();
+
+        return mStandardProjMatrix;
+    }
+    //-----------------------------------------------------------------------
+    const Matrix4& Frustum::getViewMatrix(void) const
+    {
+        updateView();
+
+        return mViewMatrix;
+
+    }
+
+    //-----------------------------------------------------------------------
+    const Plane& Frustum::getFrustumPlane(unsigned short plane) const
+    {
+        // Make any pending updates to the calculated frustum
+        updateView();
+
+        return mFrustumPlanes[plane];
+
+    }
+
+    //-----------------------------------------------------------------------
+    bool Frustum::isVisible(const AxisAlignedBox& bound, FrustumPlane* culledBy) const
+    {
+        // Null boxes always invisible
+        if (bound.isNull()) return false;
+
+        // Make any pending updates to the calculated frustum
+        updateView();
+
+        // Get corners of the box
+        const Vector3* pCorners = bound.getAllCorners();
+
+
+        // For each plane, see if all points are on the negative side
+        // If so, object is not visible
+        for (int plane = 0; plane < 6; ++plane)
+        {
+            // Skip far plane if infinite view frustum
+            if (mFarDist == 0 && plane == FRUSTUM_PLANE_FAR)
+                continue;
+
+            if (mFrustumPlanes[plane].getSide(pCorners[0]) == Plane::NEGATIVE_SIDE &&
+                mFrustumPlanes[plane].getSide(pCorners[1]) == Plane::NEGATIVE_SIDE &&
+                mFrustumPlanes[plane].getSide(pCorners[2]) == Plane::NEGATIVE_SIDE &&
+                mFrustumPlanes[plane].getSide(pCorners[3]) == Plane::NEGATIVE_SIDE &&
+                mFrustumPlanes[plane].getSide(pCorners[4]) == Plane::NEGATIVE_SIDE &&
+                mFrustumPlanes[plane].getSide(pCorners[5]) == Plane::NEGATIVE_SIDE &&
+                mFrustumPlanes[plane].getSide(pCorners[6]) == Plane::NEGATIVE_SIDE &&
+                mFrustumPlanes[plane].getSide(pCorners[7]) == Plane::NEGATIVE_SIDE)
+            {
+                // ALL corners on negative side therefore out of view
+                if (culledBy)
+                    *culledBy = (FrustumPlane)plane;
+                return false;
+            }
+
+        }
+
+        return true;
+    }
+
+    //-----------------------------------------------------------------------
+    bool Frustum::isVisible(const Vector3& vert, FrustumPlane* culledBy) const
+    {
+        // Make any pending updates to the calculated frustum
+        updateView();
+
+        // For each plane, see if all points are on the negative side
+        // If so, object is not visible
+        for (int plane = 0; plane < 6; ++plane)
+        {
+            // Skip far plane if infinite view frustum
+            if (mFarDist == 0 && plane == FRUSTUM_PLANE_FAR)
+                continue;
+
+            if (mFrustumPlanes[plane].getSide(vert) == Plane::NEGATIVE_SIDE)
+            {
+                // ALL corners on negative side therefore out of view
+                if (culledBy)
+                    *culledBy = (FrustumPlane)plane;
+                return false;
+            }
+
+        }
+
+        return true;
+    }
+
+    //-----------------------------------------------------------------------
+    bool Frustum::isVisible(const Sphere& sphere, FrustumPlane* culledBy) const
+    {
+        // Make any pending updates to the calculated frustum
+        updateView();
+
+        // For each plane, see if sphere is on negative side
+        // If so, object is not visible
+        for (int plane = 0; plane < 6; ++plane)
+        {
+            // Skip far plane if infinite view frustum
+            if (mFarDist == 0 && plane == FRUSTUM_PLANE_FAR)
+                continue;
+
+            // If the distance from sphere center to plane is negative, and 'more negative' 
+            // than the radius of the sphere, sphere is outside frustum
+            if (mFrustumPlanes[plane].getDistance(sphere.getCenter()) < -sphere.getRadius())
+            {
+                // ALL corners on negative side therefore out of view
+                if (culledBy)
+                    *culledBy = (FrustumPlane)plane;
+                return false;
+            }
+
+        }
+
+        return true;
+    }
+    //-----------------------------------------------------------------------
+    void Frustum::updateFrustum(void) const
+    {
+        if (isFrustumOutOfDate())
+        {
+            // Common calcs
+            Radian thetaY (mFOVy * 0.5f);
+            Real tanThetaY = Math::Tan(thetaY);
+            Real tanThetaX = tanThetaY * mAspect;
+            Real vpTop = tanThetaY * mNearDist;
+            Real vpRight = tanThetaX * mNearDist;
+            Real vpBottom = -vpTop;
+            Real vpLeft = -vpRight;
+
+            RenderSystem* renderSystem = Root::getSingleton().getRenderSystem();
+            // Recalc if frustum params changed
+            if (mProjType == PT_PERSPECTIVE)
+            {
+
+                // PERSPECTIVE transform, API specific
+                renderSystem->_makeProjectionMatrix(mFOVy, 
+                    mAspect, mNearDist, mFarDist, mProjMatrix);
+
+                // PERSPECTIVE transform, API specific for Gpu Programs
+                renderSystem->_makeProjectionMatrix(mFOVy, 
+                    mAspect, mNearDist, mFarDist, mStandardProjMatrix, true);
+
+                if (mObliqueDepthProjection)
+                {
+                    // Translate the plane into view space
+                    Plane viewSpaceNear = mViewMatrix * mObliqueProjPlane;
+                    renderSystem->_applyObliqueDepthProjection(
+                        mProjMatrix, viewSpaceNear, false);
+                    renderSystem->_applyObliqueDepthProjection(
+                        mStandardProjMatrix, viewSpaceNear, true);
+                }
+            }
+            else if (mProjType == PT_ORTHOGRAPHIC)
+            {
+                // ORTHOGRAPHIC projection, API specific 
+                Root::getSingleton().getRenderSystem()->_makeOrthoMatrix(mFOVy, 
+                    mAspect, mNearDist, mFarDist, mProjMatrix);
+
+                // ORTHOGRAPHIC projection, non-API specific 
+                Root::getSingleton().getRenderSystem()->_makeOrthoMatrix(mFOVy, 
+                    mAspect, mNearDist, mFarDist, mStandardProjMatrix, true);
+
+
+            }
+
+            
+            // Calculate bounding box (local)
+            // Box is from 0, down -Z, max dimensions as determined from far plane
+            // If infinite view frustum just pick a far value
+            Real farDist = (mFarDist == 0) ? 100000 : mFarDist;
+            Real farTop = tanThetaY * (mProjType == PT_ORTHOGRAPHIC? mNearDist : farDist);
+            Real farRight = tanThetaX * (mProjType == PT_ORTHOGRAPHIC? mNearDist : farDist);
+            Real farBottom = -farTop;
+            Real farLeft = -farRight;
+            Vector3 min(-farRight, -farTop, 0);
+            Vector3 max(farRight, farTop, -farDist);
+            mBoundingBox.setExtents(min, max);
+
+            // Calculate vertex positions (local)
+            // 0 is the origin
+            // 1, 2, 3, 4 are the points on the near plane, top left first, clockwise
+            // 5, 6, 7, 8 are the points on the far plane, top left first, clockwise
+            HardwareVertexBufferSharedPtr vbuf = mVertexData.vertexBufferBinding->getBuffer(0);
+            float* pFloat = static_cast<float*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
+
+            // near plane (remember frustum is going in -Z direction)
+            *pFloat++ = vpLeft;  *pFloat++ = vpTop;    *pFloat++ = -mNearDist;
+            *pFloat++ = vpRight; *pFloat++ = vpTop;    *pFloat++ = -mNearDist;
+
+            *pFloat++ = vpRight; *pFloat++ = vpTop;    *pFloat++ = -mNearDist;
+            *pFloat++ = vpRight; *pFloat++ = vpBottom; *pFloat++ = -mNearDist;
+
+            *pFloat++ = vpRight; *pFloat++ = vpBottom; *pFloat++ = -mNearDist;
+            *pFloat++ = vpLeft;  *pFloat++ = vpBottom; *pFloat++ = -mNearDist;
+
+            *pFloat++ = vpLeft;  *pFloat++ = vpBottom; *pFloat++ = -mNearDist;
+            *pFloat++ = vpLeft;  *pFloat++ = vpTop;    *pFloat++ = -mNearDist;
+
+            // far plane (remember frustum is going in -Z direction)
+            *pFloat++ = farLeft;  *pFloat++ = farTop;    *pFloat++ = -farDist;
+            *pFloat++ = farRight; *pFloat++ = farTop;    *pFloat++ = -farDist;
+
+            *pFloat++ = farRight; *pFloat++ = farTop;    *pFloat++ = -farDist;
+            *pFloat++ = farRight; *pFloat++ = farBottom; *pFloat++ = -farDist;
+
+            *pFloat++ = farRight; *pFloat++ = farBottom; *pFloat++ = -farDist;
+            *pFloat++ = farLeft;  *pFloat++ = farBottom; *pFloat++ = -farDist;
+
+            *pFloat++ = farLeft;  *pFloat++ = farBottom; *pFloat++ = -farDist;
+            *pFloat++ = farLeft;  *pFloat++ = farTop;    *pFloat++ = -farDist;
+
+            // Sides of the pyramid
+            *pFloat++ = 0.0f;    *pFloat++ = 0.0f;   *pFloat++ = 0.0f;
+            *pFloat++ = vpLeft;  *pFloat++ = vpTop;  *pFloat++ = -mNearDist;
+
+            *pFloat++ = 0.0f;    *pFloat++ = 0.0f;   *pFloat++ = 0.0f;
+            *pFloat++ = vpRight; *pFloat++ = vpTop;    *pFloat++ = -mNearDist;
+
+            *pFloat++ = 0.0f;    *pFloat++ = 0.0f;   *pFloat++ = 0.0f;
+            *pFloat++ = vpRight; *pFloat++ = vpBottom; *pFloat++ = -mNearDist;
+
+            *pFloat++ = 0.0f;    *pFloat++ = 0.0f;   *pFloat++ = 0.0f;
+            *pFloat++ = vpLeft;  *pFloat++ = vpBottom; *pFloat++ = -mNearDist;
+
+            // Sides of the box
+
+            *pFloat++ = vpLeft;  *pFloat++ = vpTop;  *pFloat++ = -mNearDist;
+            *pFloat++ = farLeft;  *pFloat++ = farTop;  *pFloat++ = -farDist;
+
+            *pFloat++ = vpRight; *pFloat++ = vpTop;    *pFloat++ = -mNearDist;
+            *pFloat++ = farRight; *pFloat++ = farTop;    *pFloat++ = -farDist;
+
+            *pFloat++ = vpRight; *pFloat++ = vpBottom; *pFloat++ = -mNearDist;
+            *pFloat++ = farRight; *pFloat++ = farBottom; *pFloat++ = -farDist;
+
+            *pFloat++ = vpLeft;  *pFloat++ = vpBottom; *pFloat++ = -mNearDist;
+            *pFloat++ = farLeft;  *pFloat++ = farBottom; *pFloat++ = -farDist;
+
+
+            vbuf->unlock();
+
+            mRecalcFrustum = false;
+        }
+    }
+
+    //-----------------------------------------------------------------------
+    bool Frustum::isViewOutOfDate(void) const
+    {
+        bool returnVal = false;
+        // Attached to node?
+        if (mParentNode)
+        {
+            if (!mRecalcView && mParentNode->_getDerivedOrientation() == mLastParentOrientation &&
+                mParentNode->_getDerivedPosition() == mLastParentPosition)
+            {
+                returnVal = false;
+            }
+            else
+            {
+                // Ok, we're out of date with SceneNode we're attached to
+                mLastParentOrientation = mParentNode->_getDerivedOrientation();
+                mLastParentPosition = mParentNode->_getDerivedPosition();
+                returnVal = true;
+            }
+        }
+        // Deriving reflection from linked plane?
+        if (mReflect && mLinkedReflectPlane && 
+            !(mLastLinkedReflectionPlane == mLinkedReflectPlane->_getDerivedPlane()))
+        {
+            mReflectPlane = mLinkedReflectPlane->_getDerivedPlane();
+            mReflectMatrix = Math::buildReflectionMatrix(mReflectPlane);
+            mLastLinkedReflectionPlane = mLinkedReflectPlane->_getDerivedPlane();
+            returnVal = true;
+        }
+
+        return mRecalcView || returnVal;
+    }
+
+    //-----------------------------------------------------------------------
+    bool Frustum::isFrustumOutOfDate(void) const
+    {
+        // Deriving custom near plane from linked plane?
+        bool returnVal = false;
+        if (mObliqueDepthProjection)
+        {
+            // Always out of date since plane needs to be in view space
+            returnVal = true;
+            // Update derived plane
+            if (mLinkedObliqueProjPlane && 
+                !(mLastLinkedObliqueProjPlane == mLinkedObliqueProjPlane->_getDerivedPlane()))
+            {
+                mObliqueProjPlane = mLinkedObliqueProjPlane->_getDerivedPlane();
+                mLastLinkedObliqueProjPlane = mObliqueProjPlane;
+            }
+        }
+
+        return mRecalcFrustum || returnVal;
+    }
+
+    //-----------------------------------------------------------------------
+    void Frustum::updateView(void) const
+    {
+        if (isViewOutOfDate())
+        {
+            // ----------------------
+            // Update the view matrix
+            // ----------------------
+
+            // View matrix is:
+            //
+            //  [ Lx  Uy  Dz  Tx  ]
+            //  [ Lx  Uy  Dz  Ty  ]
+            //  [ Lx  Uy  Dz  Tz  ]
+            //  [ 0   0   0   1   ]
+            //
+            // Where T = -(Transposed(Rot) * Pos)
+
+            // This is most efficiently done using 3x3 Matrices
+
+            // Get orientation from quaternion
+
+			Matrix3 rot;
+            const Quaternion& orientation = getOrientationForViewUpdate();
+            const Vector3& position = getPositionForViewUpdate();
+			orientation.ToRotationMatrix(rot);
+
+            // Make the translation relative to new axes
+            Matrix3 rotT = rot.Transpose();
+            Vector3 trans = -rotT * position;
+
+            // Make final matrix
+            mViewMatrix = Matrix4::IDENTITY;
+            mViewMatrix = rotT; // fills upper 3x3
+            mViewMatrix[0][3] = trans.x;
+            mViewMatrix[1][3] = trans.y;
+            mViewMatrix[2][3] = trans.z;
+
+            // Deal with reflections
+            if (mReflect)
+            {
+                mViewMatrix = mViewMatrix * mReflectMatrix;
+            }
+
+            // -------------------------
+            // Update the frustum planes
+            // -------------------------
+            updateFrustum();
+
+            Matrix4 combo = mStandardProjMatrix * mViewMatrix;
+            mFrustumPlanes[FRUSTUM_PLANE_LEFT].normal.x = combo[3][0] + combo[0][0];
+            mFrustumPlanes[FRUSTUM_PLANE_LEFT].normal.y = combo[3][1] + combo[0][1];
+            mFrustumPlanes[FRUSTUM_PLANE_LEFT].normal.z = combo[3][2] + combo[0][2];
+            mFrustumPlanes[FRUSTUM_PLANE_LEFT].d = combo[3][3] + combo[0][3];
+
+            mFrustumPlanes[FRUSTUM_PLANE_RIGHT].normal.x = combo[3][0] - combo[0][0];
+            mFrustumPlanes[FRUSTUM_PLANE_RIGHT].normal.y = combo[3][1] - combo[0][1];
+            mFrustumPlanes[FRUSTUM_PLANE_RIGHT].normal.z = combo[3][2] - combo[0][2];
+            mFrustumPlanes[FRUSTUM_PLANE_RIGHT].d = combo[3][3] - combo[0][3];
+
+            mFrustumPlanes[FRUSTUM_PLANE_TOP].normal.x = combo[3][0] - combo[1][0];
+            mFrustumPlanes[FRUSTUM_PLANE_TOP].normal.y = combo[3][1] - combo[1][1];
+            mFrustumPlanes[FRUSTUM_PLANE_TOP].normal.z = combo[3][2] - combo[1][2];
+            mFrustumPlanes[FRUSTUM_PLANE_TOP].d = combo[3][3] - combo[1][3];
+
+            mFrustumPlanes[FRUSTUM_PLANE_BOTTOM].normal.x = combo[3][0] + combo[1][0];
+            mFrustumPlanes[FRUSTUM_PLANE_BOTTOM].normal.y = combo[3][1] + combo[1][1];
+            mFrustumPlanes[FRUSTUM_PLANE_BOTTOM].normal.z = combo[3][2] + combo[1][2];
+            mFrustumPlanes[FRUSTUM_PLANE_BOTTOM].d = combo[3][3] + combo[1][3];
+
+            mFrustumPlanes[FRUSTUM_PLANE_NEAR].normal.x = combo[3][0] + combo[2][0];
+            mFrustumPlanes[FRUSTUM_PLANE_NEAR].normal.y = combo[3][1] + combo[2][1];
+            mFrustumPlanes[FRUSTUM_PLANE_NEAR].normal.z = combo[3][2] + combo[2][2];
+            mFrustumPlanes[FRUSTUM_PLANE_NEAR].d = combo[3][3] + combo[2][3];
+
+            mFrustumPlanes[FRUSTUM_PLANE_FAR].normal.x = combo[3][0] - combo[2][0];
+            mFrustumPlanes[FRUSTUM_PLANE_FAR].normal.y = combo[3][1] - combo[2][1];
+            mFrustumPlanes[FRUSTUM_PLANE_FAR].normal.z = combo[3][2] - combo[2][2];
+            mFrustumPlanes[FRUSTUM_PLANE_FAR].d = combo[3][3] - combo[2][3];
+
+            // Renormalise any normals which were not unit length
+            for(int i=0; i<6; i++ ) 
+            {
+                float length = mFrustumPlanes[i].normal.normalise();
+                mFrustumPlanes[i].d /= length;
+            }
+
+            // Update worldspace corners
+            Matrix4 eyeToWorld = mViewMatrix.inverse();
+            // Get worldspace frustum corners
+            // Treat infinite fardist as some arbitrary far value
+            Real farDist = (mFarDist == 0)? 100000 : mFarDist;
+            Real y = Math::Tan(mFOVy * 0.5);
+            Real x = mAspect * y;
+            Real neary = y * mNearDist;
+            Real fary = y * (mProjType == PT_ORTHOGRAPHIC? mNearDist : farDist);
+            Real nearx = x * mNearDist;
+            Real farx = x * (mProjType == PT_ORTHOGRAPHIC? mNearDist : farDist);
+            // near
+            mWorldSpaceCorners[0] = eyeToWorld * Vector3( nearx,  neary, -mNearDist);
+            mWorldSpaceCorners[1] = eyeToWorld * Vector3(-nearx,  neary, -mNearDist);
+            mWorldSpaceCorners[2] = eyeToWorld * Vector3(-nearx, -neary, -mNearDist);
+            mWorldSpaceCorners[3] = eyeToWorld * Vector3( nearx, -neary, -mNearDist);
+            // far
+            mWorldSpaceCorners[4] = eyeToWorld * Vector3( farx,  fary, -farDist);
+            mWorldSpaceCorners[5] = eyeToWorld * Vector3(-farx,  fary, -farDist);
+            mWorldSpaceCorners[6] = eyeToWorld * Vector3(-farx, -fary, -farDist);
+            mWorldSpaceCorners[7] = eyeToWorld * Vector3( farx, -fary, -farDist);
+
+
+            mRecalcView = false;
+
+        }
+
+    }
+
+    //-----------------------------------------------------------------------
+    Real Frustum::getAspectRatio(void) const
+    {
+        return mAspect;
+    }
+
+    //-----------------------------------------------------------------------
+    void Frustum::setAspectRatio(Real r)
+    {
+        mAspect = r;
+        invalidateFrustum();
+    }
+
+    //-----------------------------------------------------------------------
+    const AxisAlignedBox& Frustum::getBoundingBox(void) const
+    {
+        return mBoundingBox;
+    }
+    //-----------------------------------------------------------------------
+    void Frustum::_updateRenderQueue(RenderQueue* queue)
+    {
+        // Add self 
+        queue->addRenderable(this);
+    }
+    //-----------------------------------------------------------------------
+    const String& Frustum::getMovableType(void) const
+    {
+        return msMovableType;
+    }
+    //-----------------------------------------------------------------------
+	Real Frustum::getBoundingRadius(void) const
+	{
+        return (mFarDist == 0)? 100000 : mFarDist;
+	}
+    //-----------------------------------------------------------------------
+    const MaterialPtr& Frustum::getMaterial(void) const
+    {
+        return mMaterial;
+    }
+    //-----------------------------------------------------------------------
+    void Frustum::getRenderOperation(RenderOperation& op) 
+    {
+        updateView();
+        updateFrustum();
+        op.operationType = RenderOperation::OT_LINE_LIST;
+        op.useIndexes = false;
+        op.vertexData = &mVertexData;
+    }
+    //-----------------------------------------------------------------------
+    void Frustum::getWorldTransforms(Matrix4* xform) const 
+    {
+        if (mParentNode)
+            mParentNode->getWorldTransforms(xform);
+    }
+    //-----------------------------------------------------------------------
+    const Quaternion& Frustum::getWorldOrientation(void) const 
+    {
+        if (mParentNode)
+            return mParentNode->_getDerivedOrientation();
+        else
+            return Quaternion::IDENTITY;
+    }
+    //-----------------------------------------------------------------------
+    const Vector3& Frustum::getWorldPosition(void) const 
+    {
+        if (mParentNode)
+            return mParentNode->_getDerivedPosition();
+        else
+            return Vector3::ZERO;
+    }
+    //-----------------------------------------------------------------------
+    Real Frustum::getSquaredViewDepth(const Camera* cam) const 
+    {
+        // Calc from centre
+        if (mParentNode)
+            return (cam->getDerivedPosition() 
+                - mParentNode->_getDerivedPosition()).squaredLength();
+        else
+            return 0;
+    }
+    //-----------------------------------------------------------------------
+    const LightList& Frustum::getLights(void) const 
+    {
+        // N/A
+        static LightList ll;
+        return ll;
+    }
+    //-----------------------------------------------------------------------
+    const String& Frustum::getName(void) const
+    {
+        // NA
+        return msMovableType;
+    }
+    //-----------------------------------------------------------------------
+    void Frustum::_notifyCurrentCamera(Camera* cam)
+    {
+        // NA
+    }
+
+    // -------------------------------------------------------------------
+    void Frustum::invalidateFrustum() const
+    {
+        mRecalcFrustum = true;
+    }
+    // -------------------------------------------------------------------
+    void Frustum::invalidateView() const
+    {
+        mRecalcView = true;
+    }
+    // -------------------------------------------------------------------
+    const Vector3* Frustum::getWorldSpaceCorners(void) const
+    {
+        updateView();
+
+        return mWorldSpaceCorners;
+    }
+    //-----------------------------------------------------------------------
+    void Frustum::setProjectionType(ProjectionType pt)
+    {
+        mProjType = pt;
+        invalidateFrustum();
+    }
+
+    //-----------------------------------------------------------------------
+    ProjectionType Frustum::getProjectionType(void) const
+    {
+        return mProjType;
+    }
+    //-----------------------------------------------------------------------
+    const Vector3& Frustum::getPositionForViewUpdate(void) const
+    {
+        return mLastParentPosition;
+    }
+    //-----------------------------------------------------------------------
+    const Quaternion& Frustum::getOrientationForViewUpdate(void) const
+    {
+        return mLastParentOrientation;
+    }
+    //-----------------------------------------------------------------------
+    void Frustum::enableReflection(const Plane& p)
+    {
+        mReflect = true;
+        mReflectPlane = p;
+        mLinkedReflectPlane = 0;
+        mReflectMatrix = Math::buildReflectionMatrix(p);
+        invalidateView();
+
+    }
+    //-----------------------------------------------------------------------
+    void Frustum::enableReflection(const MovablePlane* p)
+    {
+        mReflect = true;
+        mLinkedReflectPlane = p;
+        mReflectPlane = mLinkedReflectPlane->_getDerivedPlane();
+        mReflectMatrix = Math::buildReflectionMatrix(mReflectPlane);
+        mLastLinkedReflectionPlane = mLinkedReflectPlane->_getDerivedPlane();
+        invalidateView();
+    }
+    //-----------------------------------------------------------------------
+    void Frustum::disableReflection(void)
+    {
+        mReflect = false;
+        mLastLinkedReflectionPlane.normal = Vector3::ZERO;
+        invalidateView();
+    }
+    //---------------------------------------------------------------------
+    bool Frustum::projectSphere(const Sphere& sphere, 
+        Real* left, Real* top, Real* right, Real* bottom) const
+    {
+        // initialise
+        *left = *bottom = -1.0f;
+        *right = *top = 1.0f;
+
+        // Transform light position into camera space
+        Vector3 eyeSpacePos = getViewMatrix() * sphere.getCenter();
+
+        if (eyeSpacePos.z < 0)
+        {
+            Real r = sphere.getRadius();
+            // early-exit
+            if (eyeSpacePos.squaredLength() <= r * r)
+                return false;
+
+            Vector3 screenSpacePos = getStandardProjectionMatrix() * eyeSpacePos;
+
+
+            // perspective attenuate
+            Vector3 spheresize(r, r, eyeSpacePos.z);
+            spheresize = getStandardProjectionMatrix() * spheresize;
+
+            Real possLeft = screenSpacePos.x - spheresize.x;
+            Real possRight = screenSpacePos.x + spheresize.x;
+            Real possTop = screenSpacePos.y + spheresize.y;
+            Real possBottom = screenSpacePos.y - spheresize.y;
+
+            *left = std::max(static_cast<Real>(-1.0), possLeft);
+            *right = std::min(static_cast<Real>(1.0), possRight);
+            *top = std::min(static_cast<Real>(1.0), possTop);
+            *bottom = std::max(static_cast<Real>(-1.0), possBottom);
+
+        }
+
+        return (*left != -1.0f) || (*top != 1.0f) || (*right != 1.0f) || (*bottom != -1.0f);
+
+    }
+    //---------------------------------------------------------------------
+    void Frustum::enableCustomNearClipPlane(const MovablePlane* plane)
+    {
+        mObliqueDepthProjection = true;
+        mLinkedObliqueProjPlane = plane;
+        mObliqueProjPlane = plane->_getDerivedPlane();
+        invalidateFrustum();
+    }
+    //---------------------------------------------------------------------
+    void Frustum::enableCustomNearClipPlane(const Plane& plane)
+    {
+        mObliqueDepthProjection = true;
+        mLinkedObliqueProjPlane = 0;
+        mObliqueProjPlane = plane;
+        invalidateFrustum();
+    }
+    //---------------------------------------------------------------------
+    void Frustum::disableCustomNearClipPlane(void)
+    {
+        mObliqueDepthProjection = false;
+        mLinkedObliqueProjPlane = 0;
+        invalidateFrustum();
+    }
+    //---------------------------------------------------------------------
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+    //-----------------------------------------------------------------------
+	//added by matt: 050405
+    bool Frustum::isVisible(const AxisAlignedBox& bound, bool &intersects, FrustumPlane* culledBy) const
+	{
+		intersects = false;
+
+		// Null boxes always invisible
+        if (bound.isNull()) return false;
+
+        // Make any pending updates to the calculated frustum
+        updateView();
+
+        // Get corners of the box
+        const Vector3* pCorners = bound.getAllCorners();
+
+        // For each plane, see if all points are on the negative side
+        // If so, object is not visible
+        for (int plane = 0; plane < 6; ++plane)
+        {
+            // Skip far plane if infinite view frustum
+            if (mFarDist == 0 && plane == FRUSTUM_PLANE_FAR)
+                continue;
+			
+			int corner = 0;
+			bool visible = false;
+
+			while((corner < 8) && (!visible || ((plane == FRUSTUM_PLANE_NEAR) && !intersects)))
+			{
+				if(mFrustumPlanes[plane].getSide(pCorners[corner++]) == Plane::NEGATIVE_SIDE)
+				{
+					if(plane == FRUSTUM_PLANE_NEAR)
+						intersects = true;
+				}
+				else
+				{
+					visible = true;
+				}
+			}
+            
+			if(!visible)
+			{
+				// ALL corners on negative side therefore out of view
+				if (culledBy)
+					*culledBy = (FrustumPlane)plane;
+				return false;
+            }
+		}
+
+        return true;
+    }
+#endif // GTP_VISIBILITY_MODIFIED_OGRE
+} // namespace Ogre
Index: /tags/DummyModules/VUT/work/ogre_changes/OgreMain/src/OgreSceneManager.cpp
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/OgreMain/src/OgreSceneManager.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/OgreMain/src/OgreSceneManager.cpp	(revision 61)
@@ -0,0 +1,4209 @@
+/*
+-----------------------------------------------------------------------------
+This source file is part of OGRE
+(Object-oriented Graphics Rendering Engine)
+For the latest info, see http://ogre.sourceforge.net/
+
+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.
+-----------------------------------------------------------------------------
+*/
+#include "OgreStableHeaders.h"
+
+#include "OgreSceneManager.h"
+
+#include "OgreCamera.h"
+#include "OgreRenderSystem.h"
+#include "OgreMeshManager.h"
+#include "OgreMesh.h"
+#include "OgreSubMesh.h"
+#include "OgreEntity.h"
+#include "OgreSubEntity.h"
+#include "OgreLight.h"
+#include "OgreMath.h"
+#include "OgreControllerManager.h"
+#include "OgreMaterialManager.h"
+#include "OgreAnimation.h"
+#include "OgreAnimationTrack.h"
+#include "OgreRenderQueueSortingGrouping.h"
+#include "OgreOverlay.h"
+#include "OgreOverlayManager.h"
+#include "OgreStringConverter.h"
+#include "OgreRenderQueueListener.h"
+#include "OgreBillboardSet.h"
+#include "OgrePass.h"
+#include "OgreTechnique.h"
+#include "OgreTextureUnitState.h"
+#include "OgreException.h"
+#include "OgreLogManager.h"
+#include "OgreHardwareBufferManager.h"
+#include "OgreRoot.h"
+#include "OgreSpotShadowFadePng.h"
+#include "OgreGpuProgramManager.h"
+#include "OgreGpuProgram.h"
+#include "OgreShadowVolumeExtrudeProgram.h"
+#include "OgreDataStream.h"
+#include "OgreStaticGeometry.h"
+#include <windows.h> //matt: remove later
+// This class implements the most basic scene manager
+
+#include <cstdio>
+
+namespace Ogre {
+
+//-----------------------------------------------------------------------
+unsigned long SceneManager::WORLD_GEOMETRY_QUERY_MASK = 0x80000000;
+//-----------------------------------------------------------------------
+SceneManager::SceneManager() :
+mRenderQueue(0),
+mSkyPlaneEntity(0),
+mSkyPlaneNode(0),
+mSkyDomeNode(0),
+mSkyBoxNode(0),
+mSkyPlaneEnabled(false),
+mSkyBoxEnabled(false),
+mSkyDomeEnabled(false),
+mFogMode(FOG_NONE),
+mSpecialCaseQueueMode(SCRQM_EXCLUDE),
+mWorldGeometryRenderQueue(RENDER_QUEUE_WORLD_GEOMETRY_1),
+mShadowCasterPlainBlackPass(0),
+mShadowReceiverPass(0),
+mDisplayNodes(false),
+mShowBoundingBoxes(false),
+mShadowTechnique(SHADOWTYPE_NONE),
+mDebugShadows(false),
+mShadowColour(ColourValue(0.25, 0.25, 0.25)),
+mShadowDebugPass(0),
+mShadowStencilPass(0),
+mShadowModulativePass(0),
+mShadowMaterialInitDone(false),
+mShadowIndexBufferSize(51200),
+mFullScreenQuad(0),
+mShadowDirLightExtrudeDist(10000),
+mIlluminationStage(IRS_NONE),
+mShadowTextureSize(512),
+mShadowTextureCount(1),
+mShadowTextureFormat(PF_X8R8G8B8),
+mShadowUseInfiniteFarPlane(true),
+mShadowCasterSphereQuery(0),
+mShadowCasterAABBQuery(0),
+mShadowFarDist(0),
+mShadowFarDistSquared(0),
+mShadowTextureOffset(0.6), 
+mShadowTextureFadeStart(0.7), 
+mShadowTextureFadeEnd(0.9),
+mShadowTextureSelfShadow(false),
+mShadowTextureCustomCasterPass(0),
+mShadowTextureCustomReceiverPass(0),
+mShadowTextureCasterVPDirty(false),
+mShadowTextureReceiverVPDirty(false)
+{
+    // Root scene node
+    mSceneRoot = new SceneNode(this, "root node");
+	mSceneRoot->_notifyRootNode();
+
+    // init sky
+    size_t i;
+    for (i = 0; i < 6; ++i)
+    {
+        mSkyBoxEntity[i] = 0;
+    }
+    for (i = 0; i < 5; ++i)
+    {
+        mSkyDomeEntity[i] = 0;
+    }
+
+	mShadowCasterQueryListener = new ShadowCasterSceneQueryListener(this);
+
+
+}
+//-----------------------------------------------------------------------
+SceneManager::~SceneManager()
+{
+    clearScene();
+    removeAllCameras();
+	delete mShadowCasterQueryListener;
+    delete mSceneRoot;
+    delete mFullScreenQuad;
+    delete mShadowCasterSphereQuery;
+    delete mShadowCasterAABBQuery;
+    delete mRenderQueue;
+}
+//-----------------------------------------------------------------------
+RenderQueue* SceneManager::getRenderQueue(void)
+{
+    if (!mRenderQueue)
+    {
+        initRenderQueue();
+    }
+    return mRenderQueue;
+}
+//-----------------------------------------------------------------------
+void SceneManager::initRenderQueue(void)
+{
+    mRenderQueue = new RenderQueue();
+    // init render queues that do not need shadows
+    mRenderQueue->getQueueGroup(RENDER_QUEUE_BACKGROUND)->setShadowsEnabled(false);
+    mRenderQueue->getQueueGroup(RENDER_QUEUE_OVERLAY)->setShadowsEnabled(false);
+    mRenderQueue->getQueueGroup(RENDER_QUEUE_SKIES_EARLY)->setShadowsEnabled(false);
+    mRenderQueue->getQueueGroup(RENDER_QUEUE_SKIES_LATE)->setShadowsEnabled(false);
+}
+//-----------------------------------------------------------------------
+void SceneManager::addSpecialCaseRenderQueue(RenderQueueGroupID qid)
+{
+	mSpecialCaseQueueList.insert(qid);
+}
+//-----------------------------------------------------------------------
+void SceneManager::removeSpecialCaseRenderQueue(RenderQueueGroupID qid)
+{
+	mSpecialCaseQueueList.erase(qid);
+}
+//-----------------------------------------------------------------------
+void SceneManager::clearSpecialCaseRenderQueues(void)
+{
+	mSpecialCaseQueueList.clear();
+}
+//-----------------------------------------------------------------------
+void SceneManager::setSpecialCaseRenderQueueMode(SceneManager::SpecialCaseRenderQueueMode mode)
+{
+	mSpecialCaseQueueMode = mode;
+}
+//-----------------------------------------------------------------------
+SceneManager::SpecialCaseRenderQueueMode SceneManager::getSpecialCaseRenderQueueMode(void)
+{
+	return mSpecialCaseQueueMode;
+}
+//-----------------------------------------------------------------------
+bool SceneManager::isRenderQueueToBeProcessed(RenderQueueGroupID qid)
+{
+	bool inList = mSpecialCaseQueueList.find(qid) != mSpecialCaseQueueList.end();
+	return (inList && mSpecialCaseQueueMode == SCRQM_INCLUDE)
+		|| (!inList && mSpecialCaseQueueMode == SCRQM_EXCLUDE);
+}
+//-----------------------------------------------------------------------
+void SceneManager::setWorldGeometryRenderQueue(RenderQueueGroupID qid)
+{
+	mWorldGeometryRenderQueue = qid;
+}
+//-----------------------------------------------------------------------
+RenderQueueGroupID SceneManager::getWorldGeometryRenderQueue(void)
+{
+	return mWorldGeometryRenderQueue;
+}
+//-----------------------------------------------------------------------
+Camera* SceneManager::createCamera(const String& name)
+{
+    // Check name not used
+    if (mCameras.find(name) != mCameras.end())
+    {
+        OGRE_EXCEPT(
+            Exception::ERR_DUPLICATE_ITEM,
+            "A camera with the name " + name + " already exists",
+            "SceneManager::createCamera" );
+    }
+
+    Camera *c = new Camera(name, this);
+    mCameras.insert(CameraList::value_type(name, c));
+
+
+    return c;
+}
+
+//-----------------------------------------------------------------------
+Camera* SceneManager::getCamera(const String& name)
+{
+    CameraList::iterator i = mCameras.find(name);
+    if (i == mCameras.end())
+    {
+        OGRE_EXCEPT( Exception::ERR_ITEM_NOT_FOUND, 
+            "Cannot find Camera with name " + name,
+            "SceneManager::getCamera");
+    }
+    else
+    {
+        return i->second;
+    }
+}
+
+//-----------------------------------------------------------------------
+void SceneManager::removeCamera(Camera *cam)
+{
+    // Find in list
+    CameraList::iterator i = mCameras.begin();
+    for (; i != mCameras.end(); ++i)
+    {
+        if (i->second == cam)
+        {
+            mCameras.erase(i);
+            // notify render targets
+            mDestRenderSystem->_notifyCameraRemoved(cam);
+            delete cam;
+            break;
+        }
+    }
+
+}
+
+//-----------------------------------------------------------------------
+void SceneManager::removeCamera(const String& name)
+{
+    // Find in list
+    CameraList::iterator i = mCameras.find(name);
+    if (i != mCameras.end())
+    {
+        // Notify render system
+        mDestRenderSystem->_notifyCameraRemoved(i->second);
+        delete i->second;
+        mCameras.erase(i);
+    }
+
+}
+
+//-----------------------------------------------------------------------
+void SceneManager::removeAllCameras(void)
+{
+
+    CameraList::iterator i = mCameras.begin();
+    for (; i != mCameras.end(); ++i)
+    {
+        // Notify render system
+        mDestRenderSystem->_notifyCameraRemoved(i->second);
+        delete i->second;
+    }
+    mCameras.clear();
+}
+
+//-----------------------------------------------------------------------
+Light* SceneManager::createLight(const String& name)
+{
+    // Check name not used
+    if (mLights.find(name) != mLights.end())
+    {
+        OGRE_EXCEPT(
+            Exception::ERR_DUPLICATE_ITEM,
+            "A light with the name " + name + " already exists",
+            "SceneManager::createLight" );
+    }
+
+    Light *l = new Light(name);
+    mLights.insert(SceneLightList::value_type(name, l));
+    return l;
+}
+
+//-----------------------------------------------------------------------
+Light* SceneManager::getLight(const String& name)
+{
+    SceneLightList::iterator i = mLights.find(name);
+    if (i == mLights.end())
+    {
+        OGRE_EXCEPT( Exception::ERR_ITEM_NOT_FOUND, 
+            "Cannot find Light with name " + name,
+            "SceneManager::getLight");
+    }
+    else
+    {
+        return i->second;
+    }
+}
+
+//-----------------------------------------------------------------------
+void SceneManager::removeLight(Light *l)
+{
+    // Find in list
+    SceneLightList::iterator i = mLights.begin();
+    for (; i != mLights.end(); ++i)
+    {
+        if (i->second == l)
+        {
+            mLights.erase(i);
+            delete l;
+            break;
+        }
+    }
+
+}
+
+//-----------------------------------------------------------------------
+void SceneManager::removeLight(const String& name)
+{
+    // Find in list
+    SceneLightList::iterator i = mLights.find(name);
+    if (i != mLights.end())
+    {
+        delete i->second;
+        mLights.erase(i);
+    }
+
+}
+
+//-----------------------------------------------------------------------
+void SceneManager::removeAllLights(void)
+{
+
+    SceneLightList::iterator i = mLights.begin();
+    for (; i != mLights.end(); ++i)
+    {
+        delete i->second;
+    }
+    mLights.clear();
+}
+//-----------------------------------------------------------------------
+bool SceneManager::lightLess::operator()(const Light* a, const Light* b) const
+{
+    return a->tempSquareDist < b->tempSquareDist;
+}
+//-----------------------------------------------------------------------
+void SceneManager::_populateLightList(const Vector3& position, Real radius, LightList& destList)
+{
+    // Really basic trawl of the lights, then sort
+    // Subclasses could do something smarter
+    destList.clear();
+    Real squaredRadius = radius * radius;
+
+    SceneLightList::iterator i, iend;
+    iend = mLights.end();
+    for (i = mLights.begin(); i != iend; ++i)
+    {
+        Light* lt = i->second;
+        if (lt->isVisible())
+        {
+            if (lt->getType() == Light::LT_DIRECTIONAL)
+            {
+                // No distance
+                lt->tempSquareDist = 0.0f;
+                destList.push_back(lt);
+            }
+            else
+            {
+                // Calc squared distance
+                lt->tempSquareDist = (lt->getDerivedPosition() - position).squaredLength();
+                lt->tempSquareDist -= squaredRadius;
+                // only add in-range lights
+                Real range = lt->getAttenuationRange();
+                if (lt->tempSquareDist <= (range * range))
+                {
+                    destList.push_back(lt);
+                }
+            }
+        }
+    }
+
+    // Sort
+    std::sort(destList.begin(), destList.end(), lightLess());
+
+
+}
+//-----------------------------------------------------------------------
+Entity* SceneManager::createEntity(const String& entityName, PrefabType ptype)
+{
+    switch (ptype)
+    {
+    case PT_PLANE:
+        return createEntity(entityName, "Prefab_Plane");
+
+        break;
+    }
+
+    OGRE_EXCEPT( Exception::ERR_ITEM_NOT_FOUND, 
+        "Unknown prefab type for entity " + entityName,
+        "SceneManager::createEntity");
+}
+
+//-----------------------------------------------------------------------
+Entity* SceneManager::createEntity(
+                                   const String& entityName,
+                                   const String& meshName )
+{
+    // Check name not used
+    EntityList::iterator it = mEntities.find( entityName );
+    if( it != mEntities.end() )
+    {
+        OGRE_EXCEPT(
+            Exception::ERR_DUPLICATE_ITEM,
+            "An entity with the name " + entityName + " already exists",
+            "SceneManager::createEntity" );
+    }
+
+    // Get mesh (load if required)
+    MeshPtr pMesh = MeshManager::getSingleton().load( 
+        meshName, 
+        // note that you can change the group by pre-loading the mesh 
+        ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
+
+    // Create entity
+    Entity* e = new Entity( entityName, pMesh, this );
+
+    // Add to internal list
+    mEntities[entityName] = e; //.insert(EntityList::value_type(entityName, e));
+
+    return e;
+}
+
+//-----------------------------------------------------------------------
+Entity* SceneManager::getEntity(const String& name)
+{
+    EntityList::iterator i = mEntities.find(name);
+    if (i == mEntities.end())
+    {
+        OGRE_EXCEPT( Exception::ERR_ITEM_NOT_FOUND, 
+            "Cannot find Entity with name " + name,
+            "SceneManager::getEntity");
+    }
+    else
+    {
+        return i->second;
+    }
+}
+
+//-----------------------------------------------------------------------
+void SceneManager::removeEntity(Entity *cam)
+{
+    // Find in list
+    EntityList::iterator i = mEntities.begin();
+    for (; i != mEntities.end(); ++i)
+    {
+        if (i->second == cam)
+        {
+            mEntities.erase(i);
+            delete cam;
+            break;
+        }
+    }
+
+}
+
+//-----------------------------------------------------------------------
+void SceneManager::removeEntity(const String& name)
+{
+    // Find in list
+    EntityList::iterator i = mEntities.find(name);
+    if (i != mEntities.end())
+    {
+        delete i->second;
+        mEntities.erase(i);
+    }
+
+}
+
+//-----------------------------------------------------------------------
+void SceneManager::removeAllEntities(void)
+{
+
+    EntityList::iterator i = mEntities.begin();
+    for (; i != mEntities.end(); ++i)
+    {
+        delete i->second;
+    }
+    mEntities.clear();
+}
+
+//-----------------------------------------------------------------------
+void SceneManager::removeAllBillboardSets(void)
+{
+    // Delete all BillboardSets
+    for (BillboardSetList::iterator bi = mBillboardSets.begin();
+        bi != mBillboardSets.end(); ++bi)
+    {
+        delete bi->second;
+    }
+    mBillboardSets.clear();
+}
+//-----------------------------------------------------------------------
+void SceneManager::clearScene(void)
+{
+	removeAllStaticGeometry();
+    // Delete all SceneNodes, except root that is
+    for (SceneNodeList::iterator i = mSceneNodes.begin();
+        i != mSceneNodes.end(); ++i)
+    {
+        delete i->second;
+    }
+    mSceneNodes.clear();
+    mAutoTrackingSceneNodes.clear();
+
+    // Clear root node of all children
+    mSceneRoot->removeAllChildren();
+    mSceneRoot->detachAllObjects();
+
+    removeAllEntities();
+    removeAllBillboardSets();
+    removeAllLights();
+
+    // Clear animations
+    destroyAllAnimations();
+
+    // Remove sky nodes since they've been deleted
+    mSkyBoxNode = mSkyPlaneNode = mSkyDomeNode = 0;
+    mSkyBoxEnabled = mSkyPlaneEnabled = mSkyDomeEnabled = false; 
+
+}
+//-----------------------------------------------------------------------
+SceneNode* SceneManager::createSceneNode(void)
+{
+    SceneNode* sn = new SceneNode(this);
+    assert(mSceneNodes.find(sn->getName()) == mSceneNodes.end());
+    mSceneNodes[sn->getName()] = sn;
+    return sn;
+}
+//-----------------------------------------------------------------------
+SceneNode* SceneManager::createSceneNode(const String& name)
+{
+    // Check name not used
+    if (mSceneNodes.find(name) != mSceneNodes.end())
+    {
+        OGRE_EXCEPT(
+            Exception::ERR_DUPLICATE_ITEM,
+            "A scene node with the name " + name + " already exists",
+            "SceneManager::createSceneNode" );
+    }
+
+    SceneNode* sn = new SceneNode(this, name);
+    mSceneNodes[sn->getName()] = sn;
+    return sn;
+}
+//-----------------------------------------------------------------------
+void SceneManager::destroySceneNode(const String& name)
+{
+    SceneNodeList::iterator i = mSceneNodes.find(name);
+
+    if (i == mSceneNodes.end())
+    {
+        OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "SceneNode '" + name + "' not found.",
+            "SceneManager::destroySceneNode");
+    }
+
+    // Find any scene nodes which are tracking this node, and turn them off
+    AutoTrackingSceneNodes::iterator ai, aiend;
+    aiend = mAutoTrackingSceneNodes.end();
+    for (ai = mAutoTrackingSceneNodes.begin(); ai != aiend; ++ai)
+    {
+        SceneNode* n = *ai;
+        // Tracking this node
+        if (n->getAutoTrackTarget() == i->second)
+        {
+            // turn off, this will notify SceneManager to remove
+            n->setAutoTracking(false);
+            // no need to reset iterator since set erase does not invalidate
+        }
+        // node is itself a tracker
+        else if (n == i->second)
+        {
+            mAutoTrackingSceneNodes.erase(ai);
+        }
+    }
+
+    delete i->second;
+    mSceneNodes.erase(i);
+}
+//-----------------------------------------------------------------------
+SceneNode* SceneManager::getRootSceneNode(void) const
+{
+    return mSceneRoot;
+}
+//-----------------------------------------------------------------------
+SceneNode* SceneManager::getSceneNode(const String& name) const
+{
+    SceneNodeList::const_iterator i = mSceneNodes.find(name);
+
+    if (i == mSceneNodes.end())
+    {
+        OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "SceneNode '" + name + "' not found.",
+            "SceneManager::getSceneNode");
+    }
+
+    return i->second;
+
+}
+//-----------------------------------------------------------------------
+Pass* SceneManager::setPass(Pass* pass)
+{
+    static bool lastUsedVertexProgram = false;
+    static bool lastUsedFragmentProgram = false;
+
+    if (mIlluminationStage == IRS_RENDER_TO_TEXTURE)
+    {
+        // Derive a special shadow caster pass from this one
+        pass = deriveShadowCasterPass(pass);
+    }
+    else if (mIlluminationStage == IRS_RENDER_MODULATIVE_PASS)
+    {
+        pass = deriveShadowReceiverPass(pass);
+    }
+
+    // TEST
+    /*
+    LogManager::getSingleton().logMessage("BEGIN PASS " + StringConverter::toString(pass->getIndex()) + 
+    " of " + pass->getParent()->getParent()->getName());
+    */
+    bool passSurfaceAndLightParams = true;
+
+    if (pass->hasVertexProgram())
+    {
+        mDestRenderSystem->bindGpuProgram(pass->getVertexProgram()->_getBindingDelegate());
+        // bind parameters later since they can be per-object
+        lastUsedVertexProgram = true;
+        // does the vertex program want surface and light params passed to rendersystem?
+        passSurfaceAndLightParams = pass->getVertexProgram()->getPassSurfaceAndLightStates();
+    }
+    else
+    {
+        // Unbind program?
+        if (lastUsedVertexProgram)
+        {
+			//matt: remove later
+			//OutputDebugString("unbinding vertex program\n");
+
+            mDestRenderSystem->unbindGpuProgram(GPT_VERTEX_PROGRAM);
+            lastUsedVertexProgram = false;
+        }
+        // Set fixed-function vertex parameters
+    }
+
+    if (passSurfaceAndLightParams)
+    {
+        // Set surface reflectance properties, only valid if lighting is enabled
+        if (pass->getLightingEnabled())
+        {
+            mDestRenderSystem->_setSurfaceParams( 
+                pass->getAmbient(), 
+                pass->getDiffuse(), 
+                pass->getSpecular(), 
+                pass->getSelfIllumination(), 
+                pass->getShininess(),
+		pass->getVertexColourTracking() );
+        }
+
+        // Dynamic lighting enabled?
+        mDestRenderSystem->setLightingEnabled(pass->getLightingEnabled());
+    }
+
+    // Using a fragment program?
+    if (pass->hasFragmentProgram())
+    {
+        mDestRenderSystem->bindGpuProgram(
+            pass->getFragmentProgram()->_getBindingDelegate());
+        // bind parameters later since they can be per-object
+        lastUsedFragmentProgram = true;
+    }
+    else
+    {
+        // Unbind program?
+        if (lastUsedFragmentProgram)
+        {
+            mDestRenderSystem->unbindGpuProgram(GPT_FRAGMENT_PROGRAM);
+            lastUsedFragmentProgram = false;
+        }
+
+        // Set fixed-function fragment settings
+
+        // Fog (assumes we want pixel fog which is the usual)
+        // New fog params can either be from scene or from material
+        FogMode newFogMode;
+        ColourValue newFogColour;
+        Real newFogStart, newFogEnd, newFogDensity;
+        if (pass->getFogOverride())
+        {
+            // New fog params from material
+            newFogMode = pass->getFogMode();
+            newFogColour = pass->getFogColour();
+            newFogStart = pass->getFogStart();
+            newFogEnd = pass->getFogEnd();
+            newFogDensity = pass->getFogDensity();
+        }
+        else
+        {
+            // New fog params from scene
+            newFogMode = mFogMode;
+            newFogColour = mFogColour;
+            newFogStart = mFogStart;
+            newFogEnd = mFogEnd;
+            newFogDensity = mFogDensity;
+        }
+        mDestRenderSystem->_setFog(
+            newFogMode, newFogColour, newFogDensity, newFogStart, newFogEnd);
+
+    }
+
+    // The rest of the settings are the same no matter whether we use programs or not
+
+    // Set scene blending
+    mDestRenderSystem->_setSceneBlending(
+        pass->getSourceBlendFactor(), pass->getDestBlendFactor());
+
+
+    // Texture unit settings
+
+    Pass::TextureUnitStateIterator texIter =  pass->getTextureUnitStateIterator();
+    size_t unit = 0;
+    while(texIter.hasMoreElements())
+    {
+        TextureUnitState* pTex = texIter.getNext();
+        mDestRenderSystem->_setTextureUnitSettings(unit, *pTex);
+        ++unit;
+    }
+    // Disable remaining texture units
+    mDestRenderSystem->_disableTextureUnitsFrom(pass->getNumTextureUnitStates());
+
+    // Set up non-texture related material settings
+    // Depth buffer settings
+    mDestRenderSystem->_setDepthBufferFunction(pass->getDepthFunction());
+    mDestRenderSystem->_setDepthBufferCheckEnabled(pass->getDepthCheckEnabled());
+    mDestRenderSystem->_setDepthBufferWriteEnabled(pass->getDepthWriteEnabled());
+    mDestRenderSystem->_setDepthBias(pass->getDepthBias());
+	// Alpha-reject settings
+	mDestRenderSystem->_setAlphaRejectSettings(
+		pass->getAlphaRejectFunction(), pass->getAlphaRejectValue());
+    // Set colour write mode
+    // Right now we only use on/off, not per-channel
+    bool colWrite = pass->getColourWriteEnabled();
+    mDestRenderSystem->_setColourBufferWriteEnabled(colWrite, colWrite, colWrite, colWrite);
+    // Culling mode
+    mDestRenderSystem->_setCullingMode(pass->getCullingMode());
+    // Shading
+    mDestRenderSystem->setShadingType(pass->getShadingMode());
+
+    return pass;
+}
+//-----------------------------------------------------------------------
+void SceneManager::_renderScene(Camera* camera, Viewport* vp, bool includeOverlays)
+{
+    Root::getSingleton()._setCurrentSceneManager(this);
+    // Prep Pass for use in debug shadows
+    initShadowVolumeMaterials();
+    // Perform a quick pre-check to see whether we should override far distance
+    // When using stencil volumes we have to use infinite far distance
+    // to prevent dark caps getting clipped
+    if ((mShadowTechnique == SHADOWTYPE_STENCIL_ADDITIVE ||
+        mShadowTechnique == SHADOWTYPE_STENCIL_MODULATIVE) && 
+        camera->getFarClipDistance() != 0 && 
+        mDestRenderSystem->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE) && 
+        mShadowUseInfiniteFarPlane)
+    {
+        // infinite far distance
+        camera->setFarClipDistance(0);
+    }
+
+    mCameraInProgress = camera;
+    mCamChanged = true;
+
+
+    // Update the scene, only do this once per frame
+    static unsigned long lastFrameNumber = 0;
+    unsigned long thisFrameNumber = Root::getSingleton().getCurrentFrameNumber();
+    if (thisFrameNumber != lastFrameNumber)
+    {
+        // Update animations
+        _applySceneAnimations();
+        // Update controllers 
+        ControllerManager::getSingleton().updateAllControllers();
+        lastFrameNumber = thisFrameNumber;
+    }
+
+    // Update scene graph for this camera (can happen multiple times per frame)
+    _updateSceneGraph(camera);
+
+    // Auto-track nodes
+    AutoTrackingSceneNodes::iterator atsni, atsniend;
+    atsniend = mAutoTrackingSceneNodes.end();
+    for (atsni = mAutoTrackingSceneNodes.begin(); atsni != atsniend; ++atsni)
+    {
+        (*atsni)->_autoTrack();
+    }
+    // Auto-track camera if required
+    camera->_autoTrack();
+
+
+    // Are we using any shadows at all?
+    if (mShadowTechnique != SHADOWTYPE_NONE && 
+        mIlluminationStage != IRS_RENDER_TO_TEXTURE)
+    {
+        // Locate any lights which could be affecting the frustum
+        findLightsAffectingFrustum(camera);
+        if (mShadowTechnique == SHADOWTYPE_TEXTURE_MODULATIVE)
+        {
+            // *******
+            // WARNING
+            // *******
+            // This call will result in re-entrant calls to this method
+            // therefore anything which comes before this is NOT 
+            // guaranteed persistent. Make sure that anything which 
+            // MUST be specific to this camera / target is done 
+            // AFTER THIS POINT
+            prepareShadowTextures(camera, vp);
+            // reset the cameras because of the re-entrant call
+            mCameraInProgress = camera;
+            mCamChanged = true;
+        }
+    }
+
+    // Invert vertex winding?
+    if (camera->isReflected())
+    {
+        mDestRenderSystem->setInvertVertexWinding(true);
+    }
+    else
+    {
+        mDestRenderSystem->setInvertVertexWinding(false);
+    }
+
+    // Set the viewport
+    setViewport(vp);
+
+    // Tell params about camera
+    mAutoParamDataSource.setCurrentCamera(camera);
+    // Set autoparams for finite dir light extrusion
+    mAutoParamDataSource.setShadowDirLightExtrusionDistance(mShadowDirLightExtrudeDist);
+
+    // Tell params about current ambient light
+    mAutoParamDataSource.setAmbientLightColour(mAmbientLight);
+
+    // Tell params about render target
+    mAutoParamDataSource.setCurrentRenderTarget(vp->getTarget());
+
+
+    // Set camera window clipping planes (if any)
+    if (mDestRenderSystem->getCapabilities()->hasCapability(RSC_USER_CLIP_PLANES))
+    {
+        if (camera->isWindowSet())  
+        {
+            const std::vector<Plane>& planeList = 
+                camera->getWindowPlanes();
+            for (ushort i = 0; i < 4; ++i)
+            {
+                mDestRenderSystem->enableClipPlane(i, true);
+                mDestRenderSystem->setClipPlane(i, planeList[i]);
+            }
+        }
+        else
+        {
+            for (ushort i = 0; i < 4; ++i)
+            {
+                mDestRenderSystem->enableClipPlane(i, false);
+            }
+        }
+    }
+
+    // Clear the render queue
+    getRenderQueue()->clear();
+
+    // Parse the scene and tag visibles
+    _findVisibleObjects(camera, 
+        mIlluminationStage == IRS_RENDER_TO_TEXTURE? true : false);
+    // Add overlays, if viewport deems it
+    if (vp->getOverlaysEnabled())
+    {
+        OverlayManager::getSingleton()._queueOverlaysForRendering(camera, getRenderQueue(), vp);
+    }
+    // Queue skies
+    _queueSkiesForRendering(camera);
+
+
+    // Don't do view / proj here anymore
+    // Checked per renderable now, although only changed when required
+    //mDestRenderSystem->_setViewMatrix(camera->getViewMatrix());
+    //mDestRenderSystem->_setProjectionMatrix(camera->getProjectionMatrix());
+
+    mDestRenderSystem->_beginGeometryCount();
+    // Begin the frame
+    mDestRenderSystem->_beginFrame();
+
+    // Set rasterisation mode
+    mDestRenderSystem->_setRasterisationMode(camera->getDetailLevel());
+
+    // Render scene content 
+    _renderVisibleObjects();
+
+    // End frame
+    mDestRenderSystem->_endFrame();
+
+    // Notify camera or vis faces
+    camera->_notifyRenderedFaces(mDestRenderSystem->_getFaceCount());
+
+
+
+}
+
+
+//-----------------------------------------------------------------------
+void SceneManager::_setDestinationRenderSystem(RenderSystem* sys)
+{
+    mDestRenderSystem = sys;
+
+}
+
+
+//-----------------------------------------------------------------------
+void SceneManager::setWorldGeometry(const String& filename)
+{
+    // This default implementation cannot handle world geometry
+    OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
+        "World geometry is not supported by the generic SceneManager.",
+        "SceneManager::setWorldGeometry");
+}
+
+//-----------------------------------------------------------------------
+bool SceneManager::materialLess::operator() (const Material* x, const Material* y) const
+{
+    // If x transparent and y not, x > y (since x has to overlap y)
+    if (x->isTransparent() && !y->isTransparent())
+    {
+        return false;
+    }
+    // If y is transparent and x not, x < y
+    else if (!x->isTransparent() && y->isTransparent())
+    {
+        return true;
+    }
+    else
+    {
+        // Otherwise don't care (both transparent or both solid)
+        // Just arbitrarily use pointer
+        return x < y;
+    }
+
+}
+
+//-----------------------------------------------------------------------
+void SceneManager::setSkyPlane(
+                               bool enable,
+                               const Plane& plane,
+                               const String& materialName,
+                               Real gscale,
+                               Real tiling,
+                               bool drawFirst,
+                               Real bow, 
+                               int xsegments, int ysegments, 
+                               const String& groupName)
+{
+    mSkyPlaneEnabled = enable;
+    if (enable)
+    {
+        String meshName = "SkyPlane";
+        mSkyPlane = plane;
+
+        MaterialPtr m = MaterialManager::getSingleton().getByName(materialName);
+        if (m.isNull())
+        {
+            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, 
+                "Sky plane material '" + materialName + "' not found.",
+                "SceneManager::setSkyPlane");
+        }
+        // Make sure the material doesn't update the depth buffer
+        m->setDepthWriteEnabled(false);
+        // Ensure loaded
+        m->load();
+
+        mSkyPlaneDrawFirst = drawFirst;
+
+        // Set up the plane
+        MeshPtr planeMesh = MeshManager::getSingleton().getByName(meshName);
+        if (!planeMesh.isNull())
+        {
+            // Destroy the old one
+            MeshManager::getSingleton().remove(planeMesh->getHandle());
+        }
+
+        // Create up vector
+        Vector3 up = plane.normal.crossProduct(Vector3::UNIT_X);
+        if (up == Vector3::ZERO)
+            up = plane.normal.crossProduct(-Vector3::UNIT_Z);
+
+        // Create skyplane
+        if( bow > 0 )
+        {
+            // Build a curved skyplane
+            planeMesh = MeshManager::getSingleton().createCurvedPlane(
+                meshName, groupName, plane, gscale * 100, gscale * 100, gscale * bow * 100, 
+                xsegments, ysegments, false, 1, tiling, tiling, up);
+        }
+        else
+        {
+            planeMesh = MeshManager::getSingleton().createPlane(
+                meshName, groupName, plane, gscale * 100, gscale * 100, xsegments, ysegments, false, 
+                1, tiling, tiling, up);
+        }
+
+        // Create entity 
+        if (mSkyPlaneEntity)
+        {
+            // destroy old one, do it by name for speed
+            removeEntity(meshName);
+        }
+        // Create, use the same name for mesh and entity
+        mSkyPlaneEntity = createEntity(meshName, meshName);
+        mSkyPlaneEntity->setMaterialName(materialName);
+        mSkyPlaneEntity->setCastShadows(false);
+
+        // Create node and attach
+        if (!mSkyPlaneNode)
+        {
+            mSkyPlaneNode = createSceneNode(meshName + "Node");
+        }
+        else
+        {
+            mSkyPlaneNode->detachAllObjects();
+        }
+        mSkyPlaneNode->attachObject(mSkyPlaneEntity);
+
+    }
+}
+//-----------------------------------------------------------------------
+void SceneManager::setSkyBox(
+                             bool enable,
+                             const String& materialName,
+                             Real distance,
+                             bool drawFirst,
+                             const Quaternion& orientation,
+                             const String& groupName)
+{
+    mSkyBoxEnabled = enable;
+    if (enable)
+    {
+        MaterialPtr m = MaterialManager::getSingleton().getByName(materialName);
+        if (m.isNull())
+        {
+            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, 
+                "Sky box material '" + materialName + "' not found.",
+                "SceneManager::setSkyBox");
+        }
+        // Make sure the material doesn't update the depth buffer
+        m->setDepthWriteEnabled(false);
+        // Ensure loaded
+        m->load();
+        // Also clamp texture, don't wrap (otherwise edges can get filtered)
+        m->getBestTechnique()->getPass(0)->getTextureUnitState(0)->setTextureAddressingMode(TextureUnitState::TAM_CLAMP);
+
+
+        mSkyBoxDrawFirst = drawFirst;
+
+        // Create node 
+        if (!mSkyBoxNode)
+        {
+            mSkyBoxNode = createSceneNode("SkyBoxNode");
+        }
+        else
+        {
+            mSkyBoxNode->detachAllObjects();
+        }
+
+        MaterialManager& matMgr = MaterialManager::getSingleton();
+        // Set up the box (6 planes)
+        for (int i = 0; i < 6; ++i)
+        {
+            MeshPtr planeMesh = createSkyboxPlane((BoxPlane)i, distance, orientation, groupName);
+            String entName = "SkyBoxPlane" + StringConverter::toString(i);
+
+            // Create entity 
+            if (mSkyBoxEntity[i])
+            {
+                // destroy old one, do it by name for speed
+                removeEntity(entName);
+            }
+            mSkyBoxEntity[i] = createEntity(entName, planeMesh->getName());
+            mSkyBoxEntity[i]->setCastShadows(false);
+            // Have to create 6 materials, one for each frame
+            // Used to use combined material but now we're using queue we can't split to change frame
+            // This doesn't use much memory because textures aren't duplicated
+            MaterialPtr boxMat = matMgr.getByName(entName);
+            if (boxMat.isNull())
+            {
+                // Create new by clone
+                boxMat = m->clone(entName);
+                boxMat->load();
+            }
+            else
+            {
+                // Copy over existing
+                m->copyDetailsTo(boxMat);
+                boxMat->load();
+            }
+            // Set active frame
+            boxMat->getBestTechnique()->getPass(0)->getTextureUnitState(0)
+                ->setCurrentFrame(i);
+
+            mSkyBoxEntity[i]->setMaterialName(boxMat->getName());
+
+            // Attach to node
+            mSkyBoxNode->attachObject(mSkyBoxEntity[i]);
+        } // for each plane
+
+    }
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::setSkyDome(
+                              bool enable,
+                              const String& materialName,
+                              Real curvature,
+                              Real tiling,
+                              Real distance,
+                              bool drawFirst,
+                              const Quaternion& orientation,
+                              int xsegments, int ysegments, int ySegmentsToKeep,
+                              const String& groupName)
+{
+    mSkyDomeEnabled = enable;
+    if (enable)
+    {
+        MaterialPtr m = MaterialManager::getSingleton().getByName(materialName);
+        if (m.isNull())
+        {
+            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, 
+                "Sky dome material '" + materialName + " not found.",
+                "SceneManager::setSkyDome");
+        }
+        // Make sure the material doesn't update the depth buffer
+        m->setDepthWriteEnabled(false);
+        // Ensure loaded
+        m->load();
+
+        mSkyDomeDrawFirst = drawFirst;
+
+        // Create node 
+        if (!mSkyDomeNode)
+        {
+            mSkyDomeNode = createSceneNode("SkyDomeNode");
+        }
+        else
+        {
+            mSkyDomeNode->detachAllObjects();
+        }
+
+        // Set up the dome (5 planes)
+        for (int i = 0; i < 5; ++i)
+        {
+            MeshPtr planeMesh = createSkydomePlane((BoxPlane)i, curvature, 
+                tiling, distance, orientation, xsegments, ysegments, 
+                i!=BP_UP ? ySegmentsToKeep : -1, groupName);
+
+            String entName = "SkyDomePlane" + StringConverter::toString(i);
+
+            // Create entity 
+            if (mSkyDomeEntity[i])
+            {
+                // destroy old one, do it by name for speed
+                removeEntity(entName);
+            }
+            mSkyDomeEntity[i] = createEntity(entName, planeMesh->getName());
+            mSkyDomeEntity[i]->setMaterialName(m->getName());
+            mSkyDomeEntity[i]->setCastShadows(false);
+
+            // Attach to node
+            mSkyDomeNode->attachObject(mSkyDomeEntity[i]);
+        } // for each plane
+
+    }
+}
+//-----------------------------------------------------------------------
+MeshPtr SceneManager::createSkyboxPlane(
+                                      BoxPlane bp,
+                                      Real distance,
+                                      const Quaternion& orientation,
+                                      const String& groupName)
+{
+    Plane plane;
+    String meshName;
+    Vector3 up;
+
+    meshName = "SkyBoxPlane_";
+    // Set up plane equation
+    plane.d = distance;
+    switch(bp)
+    {
+    case BP_FRONT:
+        plane.normal = Vector3::UNIT_Z;
+        up = Vector3::UNIT_Y;
+        meshName += "Front";
+        break;
+    case BP_BACK:
+        plane.normal = -Vector3::UNIT_Z;
+        up = Vector3::UNIT_Y;
+        meshName += "Back";
+        break;
+    case BP_LEFT:
+        plane.normal = Vector3::UNIT_X;
+        up = Vector3::UNIT_Y;
+        meshName += "Left";
+        break;
+    case BP_RIGHT:
+        plane.normal = -Vector3::UNIT_X;
+        up = Vector3::UNIT_Y;
+        meshName += "Right";
+        break;
+    case BP_UP:
+        plane.normal = -Vector3::UNIT_Y;
+        up = Vector3::UNIT_Z;
+        meshName += "Up";
+        break;
+    case BP_DOWN:
+        plane.normal = Vector3::UNIT_Y;
+        up = -Vector3::UNIT_Z;
+        meshName += "Down";
+        break;
+    }
+    // Modify by orientation
+    plane.normal = orientation * plane.normal;
+    up = orientation * up;
+
+
+    // Check to see if existing plane
+    MeshManager& mm = MeshManager::getSingleton();
+    MeshPtr planeMesh = mm.getByName(meshName);
+    if(!planeMesh.isNull())
+    {
+        // destroy existing
+        mm.remove(planeMesh->getHandle());
+    }
+    // Create new
+    Real planeSize = distance * 2;
+    const int BOX_SEGMENTS = 1;
+    planeMesh = mm.createPlane(meshName, groupName, plane, planeSize, planeSize, 
+        BOX_SEGMENTS, BOX_SEGMENTS, false, 1, 1, 1, up);
+
+    //planeMesh->_dumpContents(meshName);
+
+    return planeMesh;
+
+}
+//-----------------------------------------------------------------------
+MeshPtr SceneManager::createSkydomePlane(
+                                       BoxPlane bp,
+                                       Real curvature,
+                                       Real tiling,
+                                       Real distance,
+                                       const Quaternion& orientation,
+                                       int xsegments, int ysegments, int ysegments_keep, 
+                                       const String& groupName)
+{
+
+    Plane plane;
+    String meshName;
+    Vector3 up;
+
+    meshName = "SkyDomePlane_";
+    // Set up plane equation
+    plane.d = distance;
+    switch(bp)
+    {
+    case BP_FRONT:
+        plane.normal = Vector3::UNIT_Z;
+        up = Vector3::UNIT_Y;
+        meshName += "Front";
+        break;
+    case BP_BACK:
+        plane.normal = -Vector3::UNIT_Z;
+        up = Vector3::UNIT_Y;
+        meshName += "Back";
+        break;
+    case BP_LEFT:
+        plane.normal = Vector3::UNIT_X;
+        up = Vector3::UNIT_Y;
+        meshName += "Left";
+        break;
+    case BP_RIGHT:
+        plane.normal = -Vector3::UNIT_X;
+        up = Vector3::UNIT_Y;
+        meshName += "Right";
+        break;
+    case BP_UP:
+        plane.normal = -Vector3::UNIT_Y;
+        up = Vector3::UNIT_Z;
+        meshName += "Up";
+        break;
+    case BP_DOWN:
+        // no down
+        return MeshPtr();
+    }
+    // Modify by orientation
+    plane.normal = orientation * plane.normal;
+    up = orientation * up;
+
+    // Check to see if existing plane
+    MeshManager& mm = MeshManager::getSingleton();
+    MeshPtr planeMesh = mm.getByName(meshName);
+    if(!planeMesh.isNull())
+    {
+        // destroy existing
+        mm.remove(planeMesh->getHandle());
+    }
+    // Create new
+    Real planeSize = distance * 2;
+    planeMesh = mm.createCurvedIllusionPlane(meshName, groupName, plane, 
+        planeSize, planeSize, curvature, 
+        xsegments, ysegments, false, 1, tiling, tiling, up, 
+        orientation, HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY, HardwareBuffer::HBU_STATIC_WRITE_ONLY, 
+        false, false, ysegments_keep);
+
+    //planeMesh->_dumpContents(meshName);
+
+    return planeMesh;
+
+}
+
+
+//-----------------------------------------------------------------------
+void SceneManager::_updateSceneGraph(Camera* cam)
+{
+    // Cascade down the graph updating transforms & world bounds
+    // In this implementation, just update from the root
+    // Smarter SceneManager subclasses may choose to update only
+    //   certain scene graph branches
+    mSceneRoot->_update(true, false);
+
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters)
+{
+    // Tell nodes to find, cascade down all nodes
+    mSceneRoot->_findVisibleObjects(cam, getRenderQueue(), true, 
+        mDisplayNodes, onlyShadowCasters);
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::_renderVisibleObjects(void)
+{
+    // Render each separate queue
+    RenderQueue::QueueGroupIterator queueIt = getRenderQueue()->_getQueueGroupIterator();
+
+    // NB only queues which have been created are rendered, no time is wasted
+    //   parsing through non-existent queues (even though there are 10 available)
+
+    while (queueIt.hasMoreElements())
+    {
+        // Get queue group id
+        RenderQueueGroupID qId = queueIt.peekNextKey();
+		RenderQueueGroup* pGroup = queueIt.getNext();
+		// Skip this one if not to be processed
+		if (!isRenderQueueToBeProcessed(qId))
+			continue;
+
+
+        bool repeatQueue = false;
+        do // for repeating queues
+        {
+            // Fire queue started event
+            if (fireRenderQueueStarted(qId))
+            {
+                // Someone requested we skip this queue
+                continue;
+            }
+
+            renderQueueGroupObjects(pGroup);
+
+            // Fire queue ended event
+            if (fireRenderQueueEnded(qId))
+            {
+                // Someone requested we repeat this queue
+                repeatQueue = true;
+            }
+            else
+            {
+                repeatQueue = false;
+            }
+        } while (repeatQueue);
+
+    } // for each queue group
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::renderAdditiveStencilShadowedQueueGroupObjects(RenderQueueGroup* pGroup)
+{
+    RenderQueueGroup::PriorityMapIterator groupIt = pGroup->getIterator();
+    LightList lightList;
+
+    while (groupIt.hasMoreElements())
+    {
+        RenderPriorityGroup* pPriorityGrp = groupIt.getNext();
+
+        // Sort the queue first
+        pPriorityGrp->sort(mCameraInProgress);
+
+        // Clear light list
+        lightList.clear();
+
+        // Render all the ambient passes first, no light iteration, no lights
+        mIlluminationStage = IRS_AMBIENT;
+        renderObjects(pPriorityGrp->_getSolidPasses(), false, &lightList);
+        // Also render any objects which have receive shadows disabled
+        renderObjects(pPriorityGrp->_getSolidPassesNoShadow(), true);
+
+
+        // Now iterate per light
+        mIlluminationStage = IRS_PER_LIGHT;
+
+        // Iterate over lights, render all volumes to stencil
+        LightList::const_iterator li, liend;
+        liend = mLightsAffectingFrustum.end();
+
+        for (li = mLightsAffectingFrustum.begin(); li != liend; ++li)
+        {
+            Light* l = *li;
+            // Set light state
+
+            if (l->getCastShadows())
+            {
+                // Clear stencil
+                mDestRenderSystem->clearFrameBuffer(FBT_STENCIL);
+                renderShadowVolumesToStencil(l, mCameraInProgress);
+                // turn stencil check on
+                mDestRenderSystem->setStencilCheckEnabled(true);
+                // NB we render where the stencil is equal to zero to render lit areas
+                mDestRenderSystem->setStencilBufferParams(CMPF_EQUAL, 0);
+            }
+
+            // render lighting passes for this light
+            if (lightList.empty())
+                lightList.push_back(l);
+            else
+                lightList[0] = l;
+            renderObjects(pPriorityGrp->_getSolidPassesDiffuseSpecular(), false, &lightList);
+
+            // Reset stencil params
+            mDestRenderSystem->setStencilBufferParams();
+            mDestRenderSystem->setStencilCheckEnabled(false);
+            mDestRenderSystem->_setDepthBufferParams();
+
+        }// for each light
+
+
+        // Now render decal passes, no need to set lights as lighting will be disabled
+        mIlluminationStage = IRS_DECAL;
+        renderObjects(pPriorityGrp->_getSolidPassesDecal(), false);
+
+
+    }// for each priority
+
+    // reset lighting stage
+    mIlluminationStage = IRS_NONE;
+
+    // Iterate again - variable name changed to appease gcc.
+    RenderQueueGroup::PriorityMapIterator groupIt2 = pGroup->getIterator();
+    while (groupIt2.hasMoreElements())
+    {
+        RenderPriorityGroup* pPriorityGrp = groupIt2.getNext();
+
+        // Do transparents
+        renderObjects(pPriorityGrp->_getTransparentPasses(), true);
+
+    }// for each priority
+
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::renderModulativeStencilShadowedQueueGroupObjects(RenderQueueGroup* pGroup)
+{
+    /* For each light, we need to render all the solids from each group, 
+    then do the modulative shadows, then render the transparents from
+    each group.
+    Now, this means we are going to reorder things more, but that it required
+    if the shadows are to look correct. The overall order is preserved anyway,
+    it's just that all the transparents are at the end instead of them being
+    interleaved as in the normal rendering loop. 
+    */
+    // Iterate through priorities
+    RenderQueueGroup::PriorityMapIterator groupIt = pGroup->getIterator();
+
+    while (groupIt.hasMoreElements())
+    {
+        RenderPriorityGroup* pPriorityGrp = groupIt.getNext();
+
+        // Sort the queue first
+        pPriorityGrp->sort(mCameraInProgress);
+
+        // Do (shadowable) solids
+        renderObjects(pPriorityGrp->_getSolidPasses(), true);
+    }
+
+
+    // Iterate over lights, render all volumes to stencil
+    LightList::const_iterator li, liend;
+    liend = mLightsAffectingFrustum.end();
+
+    for (li = mLightsAffectingFrustum.begin(); li != liend; ++li)
+    {
+        Light* l = *li;
+        if (l->getCastShadows())
+        {
+            // Clear stencil
+            mDestRenderSystem->clearFrameBuffer(FBT_STENCIL);
+            renderShadowVolumesToStencil(l, mCameraInProgress);
+            // render full-screen shadow modulator for all lights
+            setPass(mShadowModulativePass);
+            // turn stencil check on
+            mDestRenderSystem->setStencilCheckEnabled(true);
+            // NB we render where the stencil is not equal to zero to render shadows, not lit areas
+            mDestRenderSystem->setStencilBufferParams(CMPF_NOT_EQUAL, 0);
+            renderSingleObject(mFullScreenQuad, mShadowModulativePass, false);
+            // Reset stencil params
+            mDestRenderSystem->setStencilBufferParams();
+            mDestRenderSystem->setStencilCheckEnabled(false);
+            mDestRenderSystem->_setDepthBufferParams();
+        }
+
+    }// for each light
+
+    // Iterate again - variable name changed to appease gcc.
+    RenderQueueGroup::PriorityMapIterator groupIt2 = pGroup->getIterator();
+    while (groupIt2.hasMoreElements())
+    {
+        RenderPriorityGroup* pPriorityGrp = groupIt2.getNext();
+
+        // Do non-shadowable solids
+        renderObjects(pPriorityGrp->_getSolidPassesNoShadow(), true);
+
+    }// for each priority
+
+
+    // Iterate again - variable name changed to appease gcc.
+    RenderQueueGroup::PriorityMapIterator groupIt3 = pGroup->getIterator();
+    while (groupIt3.hasMoreElements())
+    {
+        RenderPriorityGroup* pPriorityGrp = groupIt3.getNext();
+
+        // Do transparents
+        renderObjects(pPriorityGrp->_getTransparentPasses(), true);
+
+    }// for each priority
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::renderTextureShadowCasterQueueGroupObjects(RenderQueueGroup* pGroup)
+{
+    static LightList nullLightList;
+    // This is like the basic group render, except we skip all transparents
+    // and we also render any non-shadowed objects
+    // Note that non-shadow casters will have already been eliminated during
+    // _findVisibleObjects
+
+    // Iterate through priorities
+    RenderQueueGroup::PriorityMapIterator groupIt = pGroup->getIterator();
+
+    // Override auto param ambient to force vertex programs and fixed function to 
+    // use shadow colour
+    mAutoParamDataSource.setAmbientLightColour(mShadowColour);
+    mDestRenderSystem->setAmbientLight(mShadowColour.r, mShadowColour.g, mShadowColour.b);
+
+    while (groupIt.hasMoreElements())
+    {
+        RenderPriorityGroup* pPriorityGrp = groupIt.getNext();
+
+        // Sort the queue first
+        pPriorityGrp->sort(mCameraInProgress);
+
+        // Do solids, override light list incase any vertex programs use them
+        renderObjects(pPriorityGrp->_getSolidPasses(), false, &nullLightList);
+        renderObjects(pPriorityGrp->_getSolidPassesNoShadow(), false, &nullLightList);
+		// Do transparents that cast shadows
+		renderTransparentShadowCasterObjects(
+				pPriorityGrp->_getTransparentPasses(), false, &nullLightList);
+
+
+    }// for each priority
+
+    // reset ambient light
+    mAutoParamDataSource.setAmbientLightColour(mAmbientLight);
+    mDestRenderSystem->setAmbientLight(mAmbientLight.r, mAmbientLight.g, mAmbientLight.b);
+}
+//-----------------------------------------------------------------------
+void SceneManager::renderModulativeTextureShadowedQueueGroupObjects(RenderQueueGroup* pGroup)
+{
+    /* For each light, we need to render all the solids from each group, 
+    then do the modulative shadows, then render the transparents from
+    each group.
+    Now, this means we are going to reorder things more, but that it required
+    if the shadows are to look correct. The overall order is preserved anyway,
+    it's just that all the transparents are at the end instead of them being
+    interleaved as in the normal rendering loop. 
+    */
+    // Iterate through priorities
+    RenderQueueGroup::PriorityMapIterator groupIt = pGroup->getIterator();
+
+    while (groupIt.hasMoreElements())
+    {
+        RenderPriorityGroup* pPriorityGrp = groupIt.getNext();
+
+        // Sort the queue first
+        pPriorityGrp->sort(mCameraInProgress);
+
+        // Do solids
+        renderObjects(pPriorityGrp->_getSolidPasses(), true);
+        renderObjects(pPriorityGrp->_getSolidPassesNoShadow(), true);
+    }
+
+
+    // Iterate over lights, render received shadows
+    // only perform this if we're in the 'normal' render stage, to avoid
+    // doing it during the render to texture
+    if (mIlluminationStage == IRS_NONE)
+    {
+        mIlluminationStage = IRS_RENDER_MODULATIVE_PASS;
+
+        LightList::iterator i, iend;
+        ShadowTextureList::iterator si, siend;
+        iend = mLightsAffectingFrustum.end();
+        siend = mShadowTextures.end();
+        for (i = mLightsAffectingFrustum.begin(), si = mShadowTextures.begin();
+            i != iend && si != siend; ++i)
+        {
+            Light* l = *i;
+
+            if (!l->getCastShadows())
+                continue;
+
+            mCurrentShadowTexture = *si;
+            // Hook up receiver texture
+            mShadowReceiverPass->getTextureUnitState(0)->setTextureName(
+                mCurrentShadowTexture->getName());
+            // Hook up projection frustum
+            mShadowReceiverPass->getTextureUnitState(0)->setProjectiveTexturing(
+                true, mCurrentShadowTexture->getViewport(0)->getCamera());
+            mAutoParamDataSource.setTextureProjector(
+                mCurrentShadowTexture->getViewport(0)->getCamera());
+            // if this light is a spotlight, we need to add the spot fader layer
+            if (l->getType() == Light::LT_SPOTLIGHT)
+            {
+                // Add spot fader if not present already
+                if (mShadowReceiverPass->getNumTextureUnitStates() == 1)
+                {
+                    TextureUnitState* t = 
+                        mShadowReceiverPass->createTextureUnitState("spot_shadow_fade.png");
+                    t->setProjectiveTexturing(
+                        true, mCurrentShadowTexture->getViewport(0)->getCamera());
+                    t->setColourOperation(LBO_ADD);
+                    t->setTextureAddressingMode(TextureUnitState::TAM_CLAMP);
+                }
+                else
+                {
+                    // Just set projector
+                    TextureUnitState* t = 
+                        mShadowReceiverPass->getTextureUnitState(1);
+                    t->setProjectiveTexturing(
+                        true, mCurrentShadowTexture->getViewport(0)->getCamera());
+                }
+            }
+            else if (mShadowReceiverPass->getNumTextureUnitStates() > 1)
+            {
+                // remove spot fader layer
+                mShadowReceiverPass->removeTextureUnitState(1);
+
+            }
+            mShadowReceiverPass->_load();
+
+            if (l->getCastShadows() && pGroup->getShadowsEnabled())
+            {
+                renderTextureShadowReceiverQueueGroupObjects(pGroup);
+            }
+
+            ++si;
+
+        }// for each light
+
+        mIlluminationStage = IRS_NONE;
+
+    }
+
+    // Iterate again - variable name changed to appease gcc.
+    RenderQueueGroup::PriorityMapIterator groupIt3 = pGroup->getIterator();
+    while (groupIt3.hasMoreElements())
+    {
+        RenderPriorityGroup* pPriorityGrp = groupIt3.getNext();
+
+        // Do transparents
+        renderObjects(pPriorityGrp->_getTransparentPasses(), true);
+
+    }// for each priority
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::renderTextureShadowReceiverQueueGroupObjects(RenderQueueGroup* pGroup)
+{
+    static LightList nullLightList;
+
+    // Iterate through priorities
+    RenderQueueGroup::PriorityMapIterator groupIt = pGroup->getIterator();
+
+    // Override auto param ambient to force vertex programs to go full-bright
+    mAutoParamDataSource.setAmbientLightColour(ColourValue::White);
+    mDestRenderSystem->setAmbientLight(1, 1, 1);
+
+    while (groupIt.hasMoreElements())
+    {
+        RenderPriorityGroup* pPriorityGrp = groupIt.getNext();
+
+        // Do solids, override light list incase any vertex programs use them
+        renderObjects(pPriorityGrp->_getSolidPasses(), false, &nullLightList);
+
+        // Don't render transparents or passes which have shadow receipt disabled
+
+    }// for each priority
+
+    // reset ambient
+    mAutoParamDataSource.setAmbientLightColour(mAmbientLight);
+    mDestRenderSystem->setAmbientLight(mAmbientLight.r, mAmbientLight.g, mAmbientLight.b);
+
+}
+//-----------------------------------------------------------------------
+bool SceneManager::validatePassForRendering(Pass* pass)
+{
+    // Bypass if we're doing a texture shadow render and 
+    // this pass is after the first (only 1 pass needed for shadow texture)
+    if ((mIlluminationStage == IRS_RENDER_TO_TEXTURE ||
+        mIlluminationStage == IRS_RENDER_MODULATIVE_PASS) && 
+        pass->getIndex() > 0)
+    {
+        return false;
+    }
+
+    return true;
+}
+//-----------------------------------------------------------------------
+bool SceneManager::validateRenderableForRendering(Pass* pass, Renderable* rend)
+{
+    // Skip this renderable if we're doing texture shadows, it casts shadows
+    // and we're doing the render receivers pass and we're not self-shadowing
+    if (mShadowTechnique == SHADOWTYPE_TEXTURE_MODULATIVE && 
+        mIlluminationStage == IRS_RENDER_MODULATIVE_PASS && 
+        rend->getCastsShadows() && !mShadowTextureSelfShadow)
+    {
+        return false;
+    }
+
+    return true;
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::renderObjects(
+                                 const RenderPriorityGroup::SolidRenderablePassMap& objs, bool doLightIteration, 
+                                 const LightList* manualLightList)
+{
+    // ----- SOLIDS LOOP -----
+    RenderPriorityGroup::SolidRenderablePassMap::const_iterator ipass, ipassend;
+    ipassend = objs.end();
+    for (ipass = objs.begin(); ipass != ipassend; ++ipass)
+    {
+        // Fast bypass if this group is now empty
+        if (ipass->second->empty()) continue;
+
+        // Give SM a chance to eliminate this pass
+        if (!validatePassForRendering(ipass->first))
+            continue;
+
+        // For solids, we try to do each pass in turn
+        Pass* usedPass = setPass(ipass->first);
+        RenderPriorityGroup::RenderableList* rendList = ipass->second;
+        RenderPriorityGroup::RenderableList::const_iterator irend, irendend;
+        irendend = rendList->end();
+        for (irend = rendList->begin(); irend != irendend; ++irend)
+        {
+            // Give SM a chance to eliminate
+            if (!validateRenderableForRendering(ipass->first, *irend))
+                continue;
+            // Render a single object, this will set up auto params if required
+            renderSingleObject(*irend, usedPass, doLightIteration, manualLightList);
+        }
+    } 
+}
+//-----------------------------------------------------------------------
+void SceneManager::renderObjects(
+                                 const RenderPriorityGroup::TransparentRenderablePassList& objs, bool doLightIteration,
+                                 const LightList* manualLightList)
+{
+    // ----- TRANSPARENT LOOP -----
+    // This time we render by Z, not by pass
+    // The mTransparentObjects set needs to be ordered first
+    // Render each non-transparent entity in turn, grouped by material
+    RenderPriorityGroup::TransparentRenderablePassList::const_iterator itrans, itransend;
+
+    itransend = objs.end();
+    for (itrans = objs.begin(); 
+        itrans != itransend; ++itrans)
+    {
+        // For transparents, we have to accept that we can't sort entirely by pass
+        setPass(itrans->pass);
+        renderSingleObject(itrans->renderable, itrans->pass, doLightIteration, 
+            manualLightList);
+    }
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::renderQueueGroupObjects(RenderQueueGroup* pGroup)
+{
+    if (pGroup->getShadowsEnabled() && 
+        mShadowTechnique == SHADOWTYPE_STENCIL_ADDITIVE)
+    {
+        // Additive stencil shadows in use
+        renderAdditiveStencilShadowedQueueGroupObjects(pGroup);
+    }
+    else if (pGroup->getShadowsEnabled() && 
+        mShadowTechnique == SHADOWTYPE_STENCIL_MODULATIVE)
+    {
+        // Modulative stencil shadows in use
+        renderModulativeStencilShadowedQueueGroupObjects(pGroup);
+    }
+    else if (mShadowTechnique == SHADOWTYPE_TEXTURE_MODULATIVE)
+    {
+        // Modulative texture shadows in use
+        if (mIlluminationStage == IRS_RENDER_TO_TEXTURE)
+        {
+            // Shadow caster pass
+            if (pGroup->getShadowsEnabled())
+                renderTextureShadowCasterQueueGroupObjects(pGroup);
+        }
+        else
+        {
+            // Ordinary pass
+            renderModulativeTextureShadowedQueueGroupObjects(pGroup);
+        }
+    }
+    else
+    {
+        // No shadows, ordinary pass
+        renderBasicQueueGroupObjects(pGroup);
+    }
+
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::renderBasicQueueGroupObjects(RenderQueueGroup* pGroup)
+{
+    // Basic render loop
+    // Iterate through priorities
+    RenderQueueGroup::PriorityMapIterator groupIt = pGroup->getIterator();
+
+    while (groupIt.hasMoreElements())
+    {
+        RenderPriorityGroup* pPriorityGrp = groupIt.getNext();
+
+        // Sort the queue first
+        pPriorityGrp->sort(mCameraInProgress);
+
+        // Do solids
+        renderObjects(pPriorityGrp->_getSolidPasses(), true);
+        // Do transparents
+        renderObjects(pPriorityGrp->_getTransparentPasses(), true);
+
+
+    }// for each priority
+}
+//-----------------------------------------------------------------------
+void SceneManager::renderTransparentShadowCasterObjects(
+	const RenderPriorityGroup::TransparentRenderablePassList& objs, bool doLightIteration,
+	const LightList* manualLightList)
+{
+	// ----- TRANSPARENT LOOP as in renderObjects above, but changed a bit -----
+	RenderPriorityGroup::TransparentRenderablePassList::const_iterator itrans, itransend;
+
+	itransend = objs.end();
+	for (itrans = objs.begin(); 
+		itrans != itransend; ++itrans)
+	{
+		Renderable *r = itrans->renderable;
+		Pass *p = itrans->pass;
+
+		// only render this pass if it's being forced to cast shadows
+		if (p->getParent()->getParent()->getTransparencyCastsShadows())
+		{
+			setPass(p);
+			renderSingleObject(itrans->renderable, p, doLightIteration, manualLightList);
+		}
+	}
+}
+//-----------------------------------------------------------------------
+void SceneManager::renderSingleObject(Renderable* rend, Pass* pass, 
+                                      bool doLightIteration, const LightList* manualLightList)
+{
+    static Matrix4 xform[256];
+    unsigned short numMatrices;
+    static bool normalisedNormals = false;
+    static SceneDetailLevel camDetailLevel = mCameraInProgress->getDetailLevel();
+    static SceneDetailLevel lastDetailLevel = camDetailLevel;
+    static RenderOperation ro;
+    static LightList localLightList;
+
+    if (pass->isProgrammable())
+    {
+        // Tell auto params object about the renderable change
+        mAutoParamDataSource.setCurrentRenderable(rend);
+        pass->_updateAutoParamsNoLights(mAutoParamDataSource);
+    }
+
+    // Set world transformation
+    rend->getWorldTransforms(xform);
+    numMatrices = rend->getNumWorldTransforms();
+    if (numMatrices > 1)
+    {
+        mDestRenderSystem->_setWorldMatrices(xform, numMatrices);
+    }
+    else
+    {
+        mDestRenderSystem->_setWorldMatrix(*xform);
+    }
+
+    // Issue view / projection changes if any
+    useRenderableViewProjMode(rend);
+
+    // Reissue any texture gen settings which are dependent on view matrix
+    Pass::TextureUnitStateIterator texIter =  pass->getTextureUnitStateIterator();
+    size_t unit = 0;
+    while(texIter.hasMoreElements())
+    {
+        TextureUnitState* pTex = texIter.getNext();
+        if (pTex->hasViewRelativeTextureCoordinateGeneration())
+        {
+            mDestRenderSystem->_setTextureUnitSettings(unit, *pTex);
+        }
+        ++unit;
+    }
+
+
+    // Sort out normalisation
+    bool thisNormalise = rend->getNormaliseNormals();
+    if (thisNormalise != normalisedNormals)
+    {
+        mDestRenderSystem->setNormaliseNormals(thisNormalise);
+        normalisedNormals = thisNormalise;
+    }
+
+    // Set up the solid / wireframe override
+    SceneDetailLevel reqDetail = rend->getRenderDetail();
+    if (reqDetail != lastDetailLevel || reqDetail != camDetailLevel)
+    {
+        if (reqDetail > camDetailLevel)
+        {
+            // only downgrade detail; if cam says wireframe we don't go up to solid
+            reqDetail = camDetailLevel;
+        }
+        mDestRenderSystem->_setRasterisationMode(reqDetail);
+        lastDetailLevel = reqDetail;
+
+    }
+
+    mDestRenderSystem->setClipPlanes(rend->getClipPlanes());
+
+    // Set up rendering operation
+    rend->getRenderOperation(ro);
+    ro.srcRenderable = rend;
+
+    if (doLightIteration)
+    {
+        // Here's where we issue the rendering operation to the render system
+        // Note that we may do this once per light, therefore it's in a loop
+        // and the light parameters are updated once per traversal through the
+        // loop
+        const LightList& rendLightList = rend->getLights();
+        bool iteratePerLight = pass->getRunOncePerLight();
+        size_t numIterations = iteratePerLight ? rendLightList.size() : 1;
+        const LightList* pLightListToUse;
+        for (size_t i = 0; i < numIterations; ++i)
+        {
+            // Determine light list to use
+            if (iteratePerLight)
+            {
+                // Change the only element of local light list to be
+                // the light at index i
+                localLightList.clear();
+                // Check whether we need to filter this one out
+                if (pass->getRunOnlyForOneLightType() && 
+                    pass->getOnlyLightType() != rendLightList[i]->getType())
+                {
+                    // Skip
+                    continue;
+                }
+
+                localLightList.push_back(rendLightList[i]);
+                pLightListToUse = &localLightList;
+            }
+            else
+            {
+                // Use complete light list
+                pLightListToUse = &rendLightList;
+            }
+
+            // Do we need to update GPU program parameters?
+            if (pass->isProgrammable())
+            {
+                // Update any automatic gpu params for lights
+                // Other bits of information will have to be looked up
+                mAutoParamDataSource.setCurrentLightList(pLightListToUse);
+                pass->_updateAutoParamsLightsOnly(mAutoParamDataSource);
+                // NOTE: We MUST bind parameters AFTER updating the autos
+                // TEST
+                if (pass->hasVertexProgram())
+                {
+                    mDestRenderSystem->bindGpuProgramParameters(GPT_VERTEX_PROGRAM, 
+                        pass->getVertexProgramParameters());
+                }
+                if (pass->hasFragmentProgram())
+                {
+                    mDestRenderSystem->bindGpuProgramParameters(GPT_FRAGMENT_PROGRAM, 
+                        pass->getFragmentProgramParameters());
+                }
+            }
+            // Do we need to update light states? 
+            // Only do this if fixed-function vertex lighting applies
+            if (pass->getLightingEnabled() &&
+                (!pass->hasVertexProgram() || pass->getVertexProgram()->getPassSurfaceAndLightStates()))
+            {
+                mDestRenderSystem->_useLights(*pLightListToUse, pass->getMaxSimultaneousLights());
+            }
+            // issue the render op		
+            mDestRenderSystem->_render(ro);
+        } // possibly iterate per light
+    }
+    else // no automatic light processing
+    {
+        // Do we need to update GPU program parameters?
+        if (pass->isProgrammable())
+        {
+            // Do we have a manual light list?
+            if (manualLightList)
+            {
+                // Update any automatic gpu params for lights
+                mAutoParamDataSource.setCurrentLightList(manualLightList);
+                pass->_updateAutoParamsLightsOnly(mAutoParamDataSource);
+            }
+
+            if (pass->hasVertexProgram())
+            {
+                mDestRenderSystem->bindGpuProgramParameters(GPT_VERTEX_PROGRAM, 
+                    pass->getVertexProgramParameters());
+            }
+            if (pass->hasFragmentProgram())
+            {
+                mDestRenderSystem->bindGpuProgramParameters(GPT_FRAGMENT_PROGRAM, 
+                    pass->getFragmentProgramParameters());
+            }
+        }
+
+        // Use manual lights if present, and fixed-function vertex lighting applies
+        if (manualLightList && 
+            pass->getLightingEnabled() &&
+            (!pass->hasVertexProgram() || pass->getVertexProgram()->getPassSurfaceAndLightStates()))
+        {
+            mDestRenderSystem->_useLights(*manualLightList, pass->getMaxSimultaneousLights());
+        }
+        // issue the render op		
+        mDestRenderSystem->_render(ro);
+    }
+}
+//-----------------------------------------------------------------------
+void SceneManager::setAmbientLight(const ColourValue& colour)
+{
+    mAmbientLight = colour;
+    mDestRenderSystem->setAmbientLight(colour.r, colour.g, colour.b);
+}
+//-----------------------------------------------------------------------
+const ColourValue& SceneManager::getAmbientLight(void) const
+{
+    return mAmbientLight;
+}
+//-----------------------------------------------------------------------
+ViewPoint SceneManager::getSuggestedViewpoint(bool random)
+{
+    // By default return the origin
+    ViewPoint vp;
+    vp.position = Vector3::ZERO;
+    vp.orientation = Quaternion::IDENTITY;
+    return vp;
+}
+//-----------------------------------------------------------------------
+void SceneManager::setFog(FogMode mode, const ColourValue& colour, Real density, Real start, Real end)
+{
+    mFogMode = mode;
+    mFogColour = colour;
+    mFogStart = start;
+    mFogEnd = end;
+    mFogDensity = density;
+}
+//-----------------------------------------------------------------------
+FogMode SceneManager::getFogMode(void) const
+{
+    return mFogMode;
+}
+//-----------------------------------------------------------------------
+const ColourValue& SceneManager::getFogColour(void) const
+{
+    return mFogColour;
+}
+//-----------------------------------------------------------------------
+Real SceneManager::getFogStart(void) const
+{
+    return mFogStart;
+}
+//-----------------------------------------------------------------------
+Real SceneManager::getFogEnd(void) const
+{
+    return mFogEnd;
+}
+//-----------------------------------------------------------------------
+Real SceneManager::getFogDensity(void) const
+{
+    return mFogDensity;
+}
+//-----------------------------------------------------------------------
+BillboardSet* SceneManager::createBillboardSet(const String& name, unsigned int poolSize)
+{
+    // Check name not used
+    if (mBillboardSets.find(name) != mBillboardSets.end())
+    {
+        OGRE_EXCEPT(
+            Exception::ERR_DUPLICATE_ITEM,
+            "A billboard set with the name " + name + " already exists",
+            "SceneManager::createBillboardSet" );
+    }
+
+    BillboardSet* set = new BillboardSet( name, poolSize );
+    mBillboardSets[name] = set;//.insert(BillboardSetList::value_type(name, set));
+
+    return set;
+}
+//-----------------------------------------------------------------------
+BillboardSet* SceneManager::getBillboardSet(const String& name)
+{
+    BillboardSetList::iterator i = mBillboardSets.find(name);
+    if (i == mBillboardSets.end())
+    {
+        OGRE_EXCEPT( Exception::ERR_ITEM_NOT_FOUND, 
+            "Cannot find BillboardSet with name " + name,
+            "SceneManager::getBillboardSet");
+    }
+    else
+    {
+        return i->second;
+    }
+}
+//-----------------------------------------------------------------------
+void SceneManager::removeBillboardSet(BillboardSet* set)
+{
+    // Find in list
+    BillboardSetList::iterator i = mBillboardSets.begin();
+    for (; i != mBillboardSets.end(); ++i)
+    {
+        if (i->second == set)
+        {
+            mBillboardSets.erase(i);
+            delete set;
+            break;
+        }
+    }
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::removeBillboardSet(const String& name)
+{
+    // Find in list
+    BillboardSetList::iterator i = mBillboardSets.find(name);
+    if (i != mBillboardSets.end())
+    {
+        delete i->second;
+        mBillboardSets.erase(i);
+    }
+}
+//-----------------------------------------------------------------------
+void SceneManager::setDisplaySceneNodes(bool display)
+{
+    mDisplayNodes = display;
+}
+//-----------------------------------------------------------------------
+Animation* SceneManager::createAnimation(const String& name, Real length)
+{
+    // Check name not used
+    if (mAnimationsList.find(name) != mAnimationsList.end())
+    {
+        OGRE_EXCEPT(
+            Exception::ERR_DUPLICATE_ITEM,
+            "An animation with the name " + name + " already exists",
+            "SceneManager::createAnimation" );
+    }
+
+    Animation* pAnim = new Animation(name, length);
+    mAnimationsList[name] = pAnim;
+    return pAnim;
+}
+//-----------------------------------------------------------------------
+Animation* SceneManager::getAnimation(const String& name) const
+{
+    AnimationList::const_iterator i = mAnimationsList.find(name);
+    if (i == mAnimationsList.end())
+    {
+        OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, 
+            "Cannot find animation with name " + name, 
+            "SceneManager::getAnimation");
+    }
+    return i->second;
+}
+//-----------------------------------------------------------------------
+void SceneManager::destroyAnimation(const String& name)
+{
+    // Also destroy any animation states referencing this animation
+    AnimationStateSet::iterator si, siend;
+    siend = mAnimationStates.end();
+    for (si = mAnimationStates.begin(); si != siend; )
+    {
+        if (si->second.getAnimationName() == name)
+        {
+            // erase, post increment to avoid the invalidated iterator
+            mAnimationStates.erase(si++);
+        }
+        else
+        {
+            ++si;
+        }
+    }
+
+    AnimationList::iterator i = mAnimationsList.find(name);
+    if (i == mAnimationsList.end())
+    {
+        OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, 
+            "Cannot find animation with name " + name, 
+            "SceneManager::getAnimation");
+    }
+
+    // Free memory
+    delete i->second;
+
+    mAnimationsList.erase(i);
+
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::destroyAllAnimations(void)
+{
+    // Destroy all states too, since they cannot reference destroyed animations
+    destroyAllAnimationStates();
+
+    AnimationList::iterator i;
+    for (i = mAnimationsList.begin(); i != mAnimationsList.end(); ++i)
+    {
+        // destroy
+        delete i->second;
+    }
+    mAnimationsList.clear();
+}
+//-----------------------------------------------------------------------
+AnimationState* SceneManager::createAnimationState(const String& animName)
+{
+    if (mAnimationStates.find(animName) != mAnimationStates.end())
+    {
+        OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, 
+            "Cannot create, AnimationState already exists: "+animName, 
+            "SceneManager::createAnimationState");
+    }
+
+    // Get animation, this will throw an exception if not found
+    Animation* anim = getAnimation(animName);
+
+    // Create new state
+    AnimationState newState(animName, 0, anim->getLength());
+
+    // Record it
+    std::pair<AnimationStateSet::iterator, bool> retPair = 
+        mAnimationStates.insert(AnimationStateSet::value_type(animName, newState));
+
+    // Check boolean return
+    if (retPair.second)
+    {
+        // insert was OK
+        // Get pointer from iterator in pair
+        return &(retPair.first->second);
+    }
+    else
+    {
+        // Problem
+        // Not because of duplicate item, that's checked for above
+        OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Unexpected error creating new animation state.",
+            "SceneManager::createAnimationState");
+    }
+
+
+}
+//-----------------------------------------------------------------------
+AnimationState* SceneManager::getAnimationState(const String& animName) 
+{
+    AnimationStateSet::iterator i = mAnimationStates.find(animName);
+
+    if (i == mAnimationStates.end())
+    {
+        OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, 
+            "Cannot locate animation state for animation " + animName,
+            "SceneManager::getAnimationState");
+    }
+
+    return &(i->second);
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::destroyAnimationState(const String& name)
+{
+    AnimationStateSet::iterator i = mAnimationStates.find(name);
+
+    if (i == mAnimationStates.end())
+    {
+        OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, 
+            "Cannot locate animation state for animation " + name,
+            "SceneManager::destroyAnimationState");
+    }
+
+    mAnimationStates.erase(i);
+
+
+}
+//-----------------------------------------------------------------------
+void SceneManager::destroyAllAnimationStates(void)
+{
+    mAnimationStates.clear();
+}
+//-----------------------------------------------------------------------
+void SceneManager::_applySceneAnimations(void)
+{
+    AnimationStateSet::const_iterator i, iend;
+
+    i = mAnimationStates.begin();
+    iend = mAnimationStates.end();
+
+    for (;i != iend; ++i)
+    {
+        if (i->second.getEnabled())
+        {
+            Animation* anim = getAnimation(i->second.getAnimationName());
+
+            // Reset any nodes involved
+            // NB this excludes blended animations
+            const Animation::TrackList& trackList = anim->_getTrackList();
+            Animation::TrackList::const_iterator ti, tend;
+            ti = trackList.begin();
+            tend = trackList.end();
+            for (;ti != tend; ++ti)
+            {
+                Node* nd = ti->second->getAssociatedNode();
+                nd->resetToInitialState();
+            }
+
+
+            // Apply the animation
+            anim->apply(i->second.getTimePosition(), i->second.getWeight());
+        }
+    }
+
+
+}
+//---------------------------------------------------------------------
+void SceneManager::manualRender(RenderOperation* rend, 
+                                Pass* pass, Viewport* vp, const Matrix4& worldMatrix, 
+                                const Matrix4& viewMatrix, const Matrix4& projMatrix, 
+                                bool doBeginEndFrame) 
+{
+    mDestRenderSystem->_setViewport(vp);
+    mDestRenderSystem->_setWorldMatrix(worldMatrix);
+    mDestRenderSystem->_setViewMatrix(viewMatrix);
+    mDestRenderSystem->_setProjectionMatrix(projMatrix);
+
+    if (doBeginEndFrame)
+        mDestRenderSystem->_beginFrame();
+
+    setPass(pass);
+    mDestRenderSystem->_render(*rend);
+
+    if (doBeginEndFrame)
+        mDestRenderSystem->_endFrame();
+
+}
+//---------------------------------------------------------------------
+void SceneManager::useRenderableViewProjMode(Renderable* pRend)
+{
+    // Check view matrix
+    static bool lastViewWasIdentity = false;
+    bool useIdentityView = pRend->useIdentityView();
+    if (useIdentityView && (mCamChanged || !lastViewWasIdentity))
+    {
+        // Using identity view now, change it
+        mDestRenderSystem->_setViewMatrix(Matrix4::IDENTITY);
+        lastViewWasIdentity = true;
+    }
+    else if (!useIdentityView && (mCamChanged || lastViewWasIdentity))
+    {
+        // Coming back to normal from identity view
+        mDestRenderSystem->_setViewMatrix(mCameraInProgress->getViewMatrix());
+        lastViewWasIdentity = false;
+    }
+
+    static bool lastProjWasIdentity = false;
+    bool useIdentityProj = pRend->useIdentityProjection();
+
+    if (useIdentityProj && (mCamChanged || !lastProjWasIdentity))
+    {
+        mDestRenderSystem->_setProjectionMatrix(Matrix4::IDENTITY);
+
+        lastProjWasIdentity = true;
+    }
+    else if (!useIdentityProj && (mCamChanged || lastProjWasIdentity))
+    {
+        // Coming back from flat projection
+        mDestRenderSystem->_setProjectionMatrix(mCameraInProgress->getProjectionMatrix());
+        lastProjWasIdentity = false;
+    }
+
+    mCamChanged = false;
+
+}
+
+//---------------------------------------------------------------------
+void SceneManager::_queueSkiesForRendering(Camera* cam)
+{
+    // Update nodes
+    // Translate the box by the camera position (constant distance)
+    if (mSkyPlaneNode)
+    {
+        // The plane position relative to the camera has already been set up
+        mSkyPlaneNode->setPosition(cam->getDerivedPosition());
+    }
+
+    if (mSkyBoxNode)
+    {
+        mSkyBoxNode->setPosition(cam->getDerivedPosition());
+    }
+
+    if (mSkyDomeNode)
+    {
+        mSkyDomeNode->setPosition(cam->getDerivedPosition());
+    }
+
+    RenderQueueGroupID qid;
+    if (mSkyPlaneEnabled)
+    {
+        qid = mSkyPlaneDrawFirst? 
+RENDER_QUEUE_SKIES_EARLY : RENDER_QUEUE_SKIES_LATE;
+        getRenderQueue()->addRenderable(mSkyPlaneEntity->getSubEntity(0), qid, OGRE_RENDERABLE_DEFAULT_PRIORITY);
+    }
+
+    uint plane;
+    if (mSkyBoxEnabled)
+    {
+        qid = mSkyBoxDrawFirst? 
+RENDER_QUEUE_SKIES_EARLY : RENDER_QUEUE_SKIES_LATE;
+
+        for (plane = 0; plane < 6; ++plane)
+        {
+            getRenderQueue()->addRenderable(
+                mSkyBoxEntity[plane]->getSubEntity(0), qid, OGRE_RENDERABLE_DEFAULT_PRIORITY);
+        }
+    }
+
+    if (mSkyDomeEnabled)
+    {
+        qid = mSkyDomeDrawFirst? 
+RENDER_QUEUE_SKIES_EARLY : RENDER_QUEUE_SKIES_LATE;
+
+        for (plane = 0; plane < 5; ++plane)
+        {
+            getRenderQueue()->addRenderable(
+                mSkyDomeEntity[plane]->getSubEntity(0), qid, OGRE_RENDERABLE_DEFAULT_PRIORITY);
+        }
+    }
+}
+//---------------------------------------------------------------------
+void SceneManager::addRenderQueueListener(RenderQueueListener* newListener)
+{
+    mRenderQueueListeners.push_back(newListener);
+}
+//---------------------------------------------------------------------
+void SceneManager::removeRenderQueueListener(RenderQueueListener* delListener)
+{
+    RenderQueueListenerList::iterator i, iend;
+    iend = mRenderQueueListeners.end();
+    for (i = mRenderQueueListeners.begin(); i != iend; ++i)
+    {
+        if (*i == delListener)
+        {
+            mRenderQueueListeners.erase(i);
+            break;
+        }
+    }
+
+}
+//---------------------------------------------------------------------
+bool SceneManager::fireRenderQueueStarted(RenderQueueGroupID id)
+{
+    RenderQueueListenerList::iterator i, iend;
+    bool skip = false;
+
+    iend = mRenderQueueListeners.end();
+    for (i = mRenderQueueListeners.begin(); i != iend; ++i)
+    {
+        (*i)->renderQueueStarted(id, skip);
+    }
+    return skip;
+}
+//---------------------------------------------------------------------
+bool SceneManager::fireRenderQueueEnded(RenderQueueGroupID id)
+{
+    RenderQueueListenerList::iterator i, iend;
+    bool repeat = false;
+
+    iend = mRenderQueueListeners.end();
+    for (i = mRenderQueueListeners.begin(); i != iend; ++i)
+    {
+        (*i)->renderQueueEnded(id, repeat);
+    }
+    return repeat;
+}
+//---------------------------------------------------------------------
+void SceneManager::setViewport(Viewport* vp)
+{
+    mCurrentViewport = vp;
+    // Set viewport in render system
+    mDestRenderSystem->_setViewport(vp);
+}
+//---------------------------------------------------------------------
+void SceneManager::showBoundingBoxes(bool bShow) 
+{
+    mShowBoundingBoxes = bShow;
+}
+//---------------------------------------------------------------------
+bool SceneManager::getShowBoundingBoxes() const
+{
+    return mShowBoundingBoxes;
+}
+//---------------------------------------------------------------------
+void SceneManager::_notifyAutotrackingSceneNode(SceneNode* node, bool autoTrack)
+{
+    if (autoTrack)
+    {
+        mAutoTrackingSceneNodes.insert(node);
+    }
+    else
+    {
+        mAutoTrackingSceneNodes.erase(node);
+    }
+}
+//---------------------------------------------------------------------
+void SceneManager::setShadowTechnique(ShadowTechnique technique)
+{
+    mShadowTechnique = technique;
+    if (technique == SHADOWTYPE_STENCIL_ADDITIVE || 
+        technique == SHADOWTYPE_STENCIL_MODULATIVE)
+    {
+        // Firstly check that we  have a stencil
+        // Otherwise forget it
+        if (!mDestRenderSystem->getCapabilities()->hasCapability(RSC_HWSTENCIL))
+        {
+            LogManager::getSingleton().logMessage(
+                "WARNING: Stencil shadows were requested, but this device does not "
+                "have a hardware stencil. Shadows disabled.");
+            mShadowTechnique = SHADOWTYPE_NONE;
+        }
+        else if (mShadowIndexBuffer.isNull())
+        {
+            // Create an estimated sized shadow index buffer
+            mShadowIndexBuffer = HardwareBufferManager::getSingleton().
+                createIndexBuffer(HardwareIndexBuffer::IT_16BIT, 
+                mShadowIndexBufferSize, 
+                HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE, 
+                false);
+            // tell all meshes to prepare shadow volumes
+            MeshManager::getSingleton().setPrepareAllMeshesForShadowVolumes(true);
+        }
+    }
+
+    if (mShadowTechnique == SHADOWTYPE_STENCIL_ADDITIVE)
+    {
+        // Additive stencil, we need to split everything by illumination stage
+        getRenderQueue()->setSplitPassesByLightingType(true);
+    }
+    else
+    {
+        getRenderQueue()->setSplitPassesByLightingType(false);
+    }
+
+    if (mShadowTechnique != SHADOWTYPE_NONE)
+    {
+        // Tell render queue to split off non-shadowable materials
+        getRenderQueue()->setSplitNoShadowPasses(true);
+    }
+    else
+    {
+        getRenderQueue()->setSplitNoShadowPasses(false);
+    }
+
+    if (mShadowTechnique == SHADOWTYPE_TEXTURE_MODULATIVE)
+    {
+        createShadowTextures(mShadowTextureSize, mShadowTextureCount, mShadowTextureFormat);
+    }
+
+}
+//---------------------------------------------------------------------
+void SceneManager::findLightsAffectingFrustum(const Camera* camera)
+{
+    // Basic iteration for this SM
+    mLightsAffectingFrustum.clear();
+    SceneLightList::iterator i, iend;
+    iend = mLights.end();
+    Sphere sphere;
+    for (i = mLights.begin(); i != iend; ++i)
+    {
+        Light* l = i->second;
+        if (l->getType() == Light::LT_DIRECTIONAL)
+        {
+            // Always visible
+            mLightsAffectingFrustum.push_back(l);
+        }
+        else
+        {
+            // NB treating spotlight as point for simplicity
+            // Just see if the lights attenuation range is within the frustum
+            sphere.setCenter(l->getDerivedPosition());
+            sphere.setRadius(l->getAttenuationRange());
+            if (camera->isVisible(sphere))
+            {
+                mLightsAffectingFrustum.push_back(l);
+            }
+
+        }
+    }
+
+}
+//---------------------------------------------------------------------
+bool SceneManager::ShadowCasterSceneQueryListener::queryResult(
+    MovableObject* object)
+{
+    if (object->getCastShadows() && object->isVisible() && 
+		mSceneMgr->isRenderQueueToBeProcessed(object->getRenderQueueGroup()))
+    {
+        if (mFarDistSquared)
+        {
+            // Check object is within the shadow far distance
+            Vector3 toObj = object->getParentNode()->_getDerivedPosition() 
+                - mCamera->getDerivedPosition();
+            Real radius = object->getWorldBoundingSphere().getRadius();
+            Real dist =  toObj.squaredLength();               
+            if (dist - (radius * radius) > mFarDistSquared)
+            {
+                // skip, beyond max range
+                return true;
+            }
+        }
+
+        // If the object is in the frustum, we can always see the shadow
+        if (mCamera->isVisible(object->getWorldBoundingBox()))
+        {
+            mCasterList->push_back(object);
+            return true;
+        }
+
+        // Otherwise, object can only be casting a shadow into our view if
+        // the light is outside the frustum (or it's a directional light, 
+        // which are always outside), and the object is intersecting
+        // on of the volumes formed between the edges of the frustum and the
+        // light
+        if (!mIsLightInFrustum || mLight->getType() == Light::LT_DIRECTIONAL)
+        {
+            // Iterate over volumes
+            PlaneBoundedVolumeList::const_iterator i, iend;
+            iend = mLightClipVolumeList->end();
+            for (i = mLightClipVolumeList->begin(); i != iend; ++i)
+            {
+                if (i->intersects(object->getWorldBoundingBox()))
+                {
+                    mCasterList->push_back(object);
+                    return true;
+                }
+
+            }
+
+        }
+    }
+    return true;
+}
+//---------------------------------------------------------------------
+bool SceneManager::ShadowCasterSceneQueryListener::queryResult(
+    SceneQuery::WorldFragment* fragment)
+{
+    // don't deal with world geometry
+    return true;
+}
+//---------------------------------------------------------------------
+const SceneManager::ShadowCasterList& SceneManager::findShadowCastersForLight(
+    const Light* light, const Camera* camera)
+{
+    mShadowCasterList.clear();
+
+    if (light->getType() == Light::LT_DIRECTIONAL)
+    {
+        // Basic AABB query encompassing the frustum and the extrusion of it
+        AxisAlignedBox aabb;
+        const Vector3* corners = camera->getWorldSpaceCorners();
+        Vector3 min, max;
+        Vector3 extrude = light->getDirection() * -mShadowDirLightExtrudeDist;
+        // do first corner
+        min = max = corners[0];
+        min.makeFloor(corners[0] + extrude);
+        max.makeCeil(corners[0] + extrude);
+        for (size_t c = 1; c < 8; ++c)
+        {
+            min.makeFloor(corners[c]);
+            max.makeCeil(corners[c]);
+            min.makeFloor(corners[c] + extrude);
+            max.makeCeil(corners[c] + extrude);
+        }
+        aabb.setExtents(min, max);
+
+        if (!mShadowCasterAABBQuery)
+            mShadowCasterAABBQuery = createAABBQuery(aabb);
+        else
+            mShadowCasterAABBQuery->setBox(aabb);
+        // Execute, use callback
+        mShadowCasterQueryListener->prepare(false, 
+            &(light->_getFrustumClipVolumes(camera)), 
+            light, camera, &mShadowCasterList, mShadowFarDistSquared);
+        mShadowCasterAABBQuery->execute(mShadowCasterQueryListener);
+
+
+    }
+    else
+    {
+        Sphere s(light->getPosition(), light->getAttenuationRange());
+        // eliminate early if camera cannot see light sphere
+        if (camera->isVisible(s))
+        {
+            if (!mShadowCasterSphereQuery)
+                mShadowCasterSphereQuery = createSphereQuery(s);
+            else
+                mShadowCasterSphereQuery->setSphere(s);
+
+            // Determine if light is inside or outside the frustum
+            bool lightInFrustum = camera->isVisible(light->getDerivedPosition());
+            const PlaneBoundedVolumeList* volList = 0;
+            if (!lightInFrustum)
+            {
+                // Only worth building an external volume list if
+                // light is outside the frustum
+                volList = &(light->_getFrustumClipVolumes(camera));
+            }
+
+            // Execute, use callback
+            mShadowCasterQueryListener->prepare(lightInFrustum, 
+                volList, light, camera, &mShadowCasterList, mShadowFarDistSquared);
+            mShadowCasterSphereQuery->execute(mShadowCasterQueryListener);
+
+        }
+
+    }
+
+
+    return mShadowCasterList;
+}
+//---------------------------------------------------------------------
+void SceneManager::initShadowVolumeMaterials(void)
+{
+
+    if (mShadowMaterialInitDone)
+        return;
+
+    if (!mShadowDebugPass)
+    {
+        MaterialPtr matDebug = 
+            MaterialManager::getSingleton().getByName("Ogre/Debug/ShadowVolumes");
+        if (matDebug.isNull())
+        {
+            // Create
+            matDebug = MaterialManager::getSingleton().create(
+                "Ogre/Debug/ShadowVolumes", 
+                ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+            mShadowDebugPass = matDebug->getTechnique(0)->getPass(0);
+            mShadowDebugPass->setSceneBlending(SBT_ADD); 
+            mShadowDebugPass->setLightingEnabled(false);
+            mShadowDebugPass->setDepthWriteEnabled(false);
+            TextureUnitState* t = mShadowDebugPass->createTextureUnitState();
+            t->setColourOperationEx(LBX_MODULATE, LBS_MANUAL, LBS_CURRENT, 
+                ColourValue(0.7, 0.0, 0.2));
+            mShadowDebugPass->setCullingMode(CULL_NONE);
+
+            if (mDestRenderSystem->getCapabilities()->hasCapability(
+                RSC_VERTEX_PROGRAM))
+            {
+                ShadowVolumeExtrudeProgram::initialise();
+
+                // Enable the (infinite) point light extruder for now, just to get some params
+                mShadowDebugPass->setVertexProgram(
+                    ShadowVolumeExtrudeProgram::programNames[ShadowVolumeExtrudeProgram::POINT_LIGHT]);
+                mInfiniteExtrusionParams = 
+                    mShadowDebugPass->getVertexProgramParameters();
+                mInfiniteExtrusionParams->setAutoConstant(0, 
+                    GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
+                mInfiniteExtrusionParams->setAutoConstant(4, 
+                    GpuProgramParameters::ACT_LIGHT_POSITION_OBJECT_SPACE);
+            }	
+            matDebug->compile();
+
+        }
+        else
+        {
+            mShadowDebugPass = matDebug->getTechnique(0)->getPass(0);
+        }
+    }
+
+    if (!mShadowStencilPass)
+    {
+
+        MaterialPtr matStencil = MaterialManager::getSingleton().getByName(
+            "Ogre/StencilShadowVolumes");
+        if (matStencil.isNull())
+        {
+            // Init
+            matStencil = MaterialManager::getSingleton().create(
+                "Ogre/StencilShadowVolumes",
+                ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+            mShadowStencilPass = matStencil->getTechnique(0)->getPass(0);
+
+            if (mDestRenderSystem->getCapabilities()->hasCapability(
+                RSC_VERTEX_PROGRAM))
+            {
+
+                // Enable the finite point light extruder for now, just to get some params
+                mShadowStencilPass->setVertexProgram(
+                    ShadowVolumeExtrudeProgram::programNames[ShadowVolumeExtrudeProgram::POINT_LIGHT_FINITE]);
+                mFiniteExtrusionParams = 
+                    mShadowStencilPass->getVertexProgramParameters();
+                mFiniteExtrusionParams->setAutoConstant(0, 
+                    GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
+                mFiniteExtrusionParams->setAutoConstant(4, 
+                    GpuProgramParameters::ACT_LIGHT_POSITION_OBJECT_SPACE);
+                // Note extra parameter
+                mFiniteExtrusionParams->setAutoConstant(5, 
+                    GpuProgramParameters::ACT_SHADOW_EXTRUSION_DISTANCE);
+            }
+            matStencil->compile();
+            // Nothing else, we don't use this like a 'real' pass anyway,
+            // it's more of a placeholder
+        }
+        else
+        {
+            mShadowStencilPass = matStencil->getTechnique(0)->getPass(0);
+        }
+    }
+
+
+
+
+    if (!mShadowModulativePass)
+    {
+
+        MaterialPtr matModStencil = MaterialManager::getSingleton().getByName(
+            "Ogre/StencilShadowModulationPass");
+        if (matModStencil.isNull())
+        {
+            // Init
+            matModStencil = MaterialManager::getSingleton().create(
+                "Ogre/StencilShadowModulationPass",
+                ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+            mShadowModulativePass = matModStencil->getTechnique(0)->getPass(0);
+            mShadowModulativePass->setSceneBlending(SBF_DEST_COLOUR, SBF_ZERO); 
+            mShadowModulativePass->setLightingEnabled(false);
+            mShadowModulativePass->setDepthWriteEnabled(false);
+            mShadowModulativePass->setDepthCheckEnabled(false);
+            TextureUnitState* t = mShadowModulativePass->createTextureUnitState();
+            t->setColourOperationEx(LBX_MODULATE, LBS_MANUAL, LBS_CURRENT, 
+                mShadowColour);
+            mShadowModulativePass->setCullingMode(CULL_NONE);
+        }
+        else
+        {
+            mShadowModulativePass = matModStencil->getTechnique(0)->getPass(0);
+        }
+    }
+
+    // Also init full screen quad while we're at it
+    if (!mFullScreenQuad)
+    {
+        mFullScreenQuad = new Rectangle2D();
+        mFullScreenQuad->setCorners(-1,1,1,-1);
+    }
+
+    // Also init shadow caster material for texture shadows
+    if (!mShadowCasterPlainBlackPass)
+    {
+        MaterialPtr matPlainBlack = MaterialManager::getSingleton().getByName(
+            "Ogre/TextureShadowCaster");
+        if (matPlainBlack.isNull())
+        {
+            matPlainBlack = MaterialManager::getSingleton().create(
+                "Ogre/TextureShadowCaster",
+                ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+            mShadowCasterPlainBlackPass = matPlainBlack->getTechnique(0)->getPass(0);
+            // Lighting has to be on, because we need shadow coloured objects
+            // Note that because we can't predict vertex programs, we'll have to
+            // bind light values to those, and so we bind White to ambient
+            // reflectance, and we'll set the ambient colour to the shadow colour
+            mShadowCasterPlainBlackPass->setAmbient(ColourValue::White);
+            mShadowCasterPlainBlackPass->setDiffuse(ColourValue::Black);
+            mShadowCasterPlainBlackPass->setSelfIllumination(ColourValue::Black);
+            mShadowCasterPlainBlackPass->setSpecular(ColourValue::Black);
+			// Override fog
+			mShadowCasterPlainBlackPass->setFog(true, FOG_NONE);
+            // no textures or anything else, we will bind vertex programs
+            // every so often though
+        }
+        else
+        {
+            mShadowCasterPlainBlackPass = matPlainBlack->getTechnique(0)->getPass(0);
+        }
+    }
+
+    if (!mShadowReceiverPass)
+    {
+        MaterialPtr matShadRec = MaterialManager::getSingleton().getByName(
+            "Ogre/TextureShadowReceiver");
+        if (matShadRec.isNull())			
+        {
+            matShadRec = MaterialManager::getSingleton().create(
+                "Ogre/TextureShadowReceiver",
+                ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+            mShadowReceiverPass = matShadRec->getTechnique(0)->getPass(0);
+            mShadowReceiverPass->setSceneBlending(SBF_DEST_COLOUR, SBF_ZERO);
+            // No lighting, one texture unit 
+            // everything else will be bound as needed during the receiver pass
+            mShadowReceiverPass->setLightingEnabled(false);
+            TextureUnitState* t = mShadowReceiverPass->createTextureUnitState();
+            t->setTextureAddressingMode(TextureUnitState::TAM_CLAMP);
+        }
+        else
+        {
+            mShadowReceiverPass = matShadRec->getTechnique(0)->getPass(0);
+        }
+    }
+
+    // Set up spot shadow fade texture (loaded from code data block)
+    TexturePtr spotShadowFadeTex = 
+        TextureManager::getSingleton().getByName("spot_shadow_fade.png");
+    if (spotShadowFadeTex.isNull())
+    {
+        // Load the manual buffer into an image (don't destroy memory!
+        DataStreamPtr stream(
+			new MemoryDataStream(SPOT_SHADOW_FADE_PNG, SPOT_SHADOW_FADE_PNG_SIZE, false));
+        Image img;
+        img.load(stream, "png");
+        spotShadowFadeTex = 
+            TextureManager::getSingleton().loadImage(
+			"spot_shadow_fade.png", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, 
+			img, TEX_TYPE_2D);
+    }
+
+    mShadowMaterialInitDone = true;
+}
+//---------------------------------------------------------------------
+Pass* SceneManager::deriveShadowCasterPass(Pass* pass)
+{
+    switch (mShadowTechnique)
+    {
+    case SHADOWTYPE_TEXTURE_MODULATIVE:
+		if (mShadowTextureCustomCasterPass)
+		{
+			// Caster pass has been customised
+
+			if (!pass->getShadowCasterVertexProgramName().empty())
+			{
+				// Have to merge the shadow caster vertex program in
+				mShadowTextureCustomCasterPass->setVertexProgram(
+					pass->getShadowCasterVertexProgramName());
+				const GpuProgramPtr& prg = mShadowTextureCustomCasterPass->getVertexProgram();
+				// Load this program if not done already
+				if (!prg->isLoaded())
+					prg->load();
+				// Copy params
+				mShadowTextureCustomCasterPass->setVertexProgramParameters(
+					pass->getShadowCasterVertexProgramParameters());
+				// mark that we've overridden the standard
+				mShadowTextureCasterVPDirty = true;
+				// Also have to hack the light autoparams, that is done later
+			}
+			else if (mShadowTextureCasterVPDirty)
+			{
+				// reset
+				mShadowTextureCustomCasterPass->setVertexProgram(
+					mShadowTextureCustomCasterVertexProgram);
+				if(mShadowTextureCustomCasterPass->hasVertexProgram())
+				{
+					mShadowTextureCustomCasterPass->setVertexProgramParameters(
+						mShadowTextureCustomCasterVPParams);
+
+				}
+				mShadowTextureCasterVPDirty = false;
+			}
+			return mShadowTextureCustomCasterPass;
+		}
+		else
+		{
+			// Standard pass
+			if (pass->hasVertexProgram())
+			{
+				// Have to merge the shadow caster vertex program in
+				// This may in fact be blank, in which case it falls back on 
+				// fixed function
+				mShadowCasterPlainBlackPass->setVertexProgram(
+					pass->getShadowCasterVertexProgramName());
+				// Did this result in a new vertex program?
+				if (mShadowCasterPlainBlackPass->hasVertexProgram())
+				{
+					const GpuProgramPtr& prg = mShadowCasterPlainBlackPass->getVertexProgram();
+					// Load this program if not done already
+					if (!prg->isLoaded())
+						prg->load();
+					// Copy params
+					mShadowCasterPlainBlackPass->setVertexProgramParameters(
+						pass->getShadowCasterVertexProgramParameters());
+				}
+				// Also have to hack the light autoparams, that is done later
+			}
+			else if (mShadowCasterPlainBlackPass->hasVertexProgram())
+			{
+				// reset
+				mShadowCasterPlainBlackPass->setVertexProgram("");
+			}
+			return mShadowCasterPlainBlackPass;
+		}
+    default:
+        return pass;
+    };
+
+}
+//---------------------------------------------------------------------
+Pass* SceneManager::deriveShadowReceiverPass(Pass* pass)
+{
+
+    switch (mShadowTechnique)
+    {
+    case SHADOWTYPE_TEXTURE_MODULATIVE:
+		if (mShadowTextureCustomReceiverPass)
+		{
+			// Receiver pass has been customised
+
+			if (!pass->getShadowReceiverVertexProgramName().empty())
+			{
+				// Have to merge the shadow Receiver vertex program in
+				mShadowTextureCustomReceiverPass->setVertexProgram(
+					pass->getShadowReceiverVertexProgramName());
+				const GpuProgramPtr& prg = mShadowTextureCustomReceiverPass->getVertexProgram();
+				// Load this program if not done already
+				if (!prg->isLoaded())
+					prg->load();
+				// Copy params
+				mShadowTextureCustomReceiverPass->setVertexProgramParameters(
+					pass->getShadowReceiverVertexProgramParameters());
+				// mark that we've overridden the standard
+				mShadowTextureReceiverVPDirty = true;
+				// Also have to hack the light autoparams, that is done later
+			}
+			else if (mShadowTextureReceiverVPDirty)
+			{
+				// reset
+				mShadowTextureCustomReceiverPass->setVertexProgram(
+					mShadowTextureCustomReceiverVertexProgram);
+				if(mShadowTextureCustomReceiverPass->hasVertexProgram())
+				{
+					mShadowTextureCustomReceiverPass->setVertexProgramParameters(
+						mShadowTextureCustomReceiverVPParams);
+
+				}
+				mShadowTextureReceiverVPDirty = false;
+			}
+			return mShadowTextureCustomReceiverPass;
+		}
+		else
+		{
+			if (pass->hasVertexProgram())
+			{
+				// Have to merge the receiver vertex program in
+				// This may return "" which means fixed function will be used
+				mShadowReceiverPass->setVertexProgram(
+					pass->getShadowReceiverVertexProgramName());
+				// Did this result in a new vertex program?
+				if (mShadowReceiverPass->hasVertexProgram())
+				{
+					const GpuProgramPtr& prg = mShadowReceiverPass->getVertexProgram();
+					// Load this program if required
+					if (!prg->isLoaded())
+						prg->load();
+					// Copy params
+					mShadowReceiverPass->setVertexProgramParameters(
+						pass->getShadowReceiverVertexProgramParameters());
+				}
+				// Also have to hack the light autoparams, that is done later
+			}
+			else if (mShadowReceiverPass->hasVertexProgram())
+			{
+				// reset
+				mShadowReceiverPass->setVertexProgram("");
+
+			}
+		}
+
+        return mShadowReceiverPass;
+    default:
+        return pass;
+    };
+
+}
+//---------------------------------------------------------------------
+void SceneManager::renderShadowVolumesToStencil(const Light* light, const Camera* camera)
+{
+    // Get the shadow caster list
+    const ShadowCasterList& casters = findShadowCastersForLight(light, camera);
+    // Check there are some shadow casters to render
+    if (casters.empty())
+    {
+        // No casters, just do nothing
+        return;
+    }
+
+    // Set up scissor test (point & spot lights only)
+    bool scissored = false;
+    if (light->getType() != Light::LT_DIRECTIONAL && 
+        mDestRenderSystem->getCapabilities()->hasCapability(RSC_SCISSOR_TEST))
+    {
+        // Project the sphere onto the camera
+        Real left, right, top, bottom;
+        Sphere sphere(light->getDerivedPosition(), light->getAttenuationRange());
+        if (camera->projectSphere(sphere, &left, &top, &right, &bottom))
+        {
+            scissored = true;
+            // Turn normalised device coordinates into pixels
+            int iLeft, iTop, iWidth, iHeight;
+            mCurrentViewport->getActualDimensions(iLeft, iTop, iWidth, iHeight);
+            size_t szLeft, szRight, szTop, szBottom;
+
+            szLeft = (size_t)(iLeft + ((left + 1) * 0.5 * iWidth));
+            szRight = (size_t)(iLeft + ((right + 1) * 0.5 * iWidth));
+            szTop = (size_t)(iTop + ((-top + 1) * 0.5 * iHeight));
+            szBottom = (size_t)(iTop + ((-bottom + 1) * 0.5 * iHeight));
+
+            mDestRenderSystem->setScissorTest(true, szLeft, szTop, szRight, szBottom);
+        }
+    }
+
+    mDestRenderSystem->unbindGpuProgram(GPT_FRAGMENT_PROGRAM);
+
+    // Can we do a 2-sided stencil?
+    bool stencil2sided = false;
+    if (mDestRenderSystem->getCapabilities()->hasCapability(RSC_TWO_SIDED_STENCIL) && 
+        mDestRenderSystem->getCapabilities()->hasCapability(RSC_STENCIL_WRAP))
+    {
+        // enable
+        stencil2sided = true;
+    }
+
+    // Do we have access to vertex programs?
+    bool extrudeInSoftware = true;
+    bool finiteExtrude = !mShadowUseInfiniteFarPlane || 
+        !mDestRenderSystem->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE);
+    if (mDestRenderSystem->getCapabilities()->hasCapability(RSC_VERTEX_PROGRAM))
+    {
+        extrudeInSoftware = false;
+        // attach the appropriate extrusion vertex program
+        // Note we never unset it because support for vertex programs is constant
+        mShadowStencilPass->setVertexProgram(
+            ShadowVolumeExtrudeProgram::getProgramName(light->getType(), finiteExtrude, false)
+            , false);
+        // Set params
+        if (finiteExtrude)
+        {
+            mShadowStencilPass->setVertexProgramParameters(mFiniteExtrusionParams);
+        }
+        else
+        {
+            mShadowStencilPass->setVertexProgramParameters(mInfiniteExtrusionParams);
+        }
+        if (mDebugShadows)
+        {
+            mShadowDebugPass->setVertexProgram(
+                ShadowVolumeExtrudeProgram::getProgramName(light->getType(), finiteExtrude, true)
+                , false);
+            // Set params
+            if (finiteExtrude)
+            {
+                mShadowDebugPass->setVertexProgramParameters(mFiniteExtrusionParams);
+            }
+            else
+            {
+                mShadowDebugPass->setVertexProgramParameters(mInfiniteExtrusionParams);
+            }
+        }
+
+        mDestRenderSystem->bindGpuProgram(mShadowStencilPass->getVertexProgram()->_getBindingDelegate());
+
+    }
+    else
+    {
+        mDestRenderSystem->unbindGpuProgram(GPT_VERTEX_PROGRAM);
+    }
+
+    // Add light to internal list for use in render call
+    LightList lightList;
+    // const_cast is forgiveable here since we pass this const
+    lightList.push_back(const_cast<Light*>(light));
+
+    // Turn off colour writing and depth writing
+    mDestRenderSystem->_setColourBufferWriteEnabled(false, false, false, false);
+	mDestRenderSystem->_disableTextureUnitsFrom(0);
+    mDestRenderSystem->_setDepthBufferParams(true, false, CMPF_LESS);
+    mDestRenderSystem->setStencilCheckEnabled(true);
+
+    // Calculate extrusion distance
+    // Use direction light extrusion distance now, just form optimize code
+    // generate a little, point/spot light will up to date later
+    Real extrudeDist = mShadowDirLightExtrudeDist;
+
+    // Figure out the near clip volume
+    const PlaneBoundedVolume& nearClipVol = 
+        light->_getNearClipVolume(camera);
+
+    // Now iterate over the casters and render
+    ShadowCasterList::const_iterator si, siend;
+    siend = casters.end();
+
+
+	// Now iterate over the casters and render
+	for (si = casters.begin(); si != siend; ++si)
+	{
+        ShadowCaster* caster = *si;
+		bool zfailAlgo = false;
+		unsigned long flags = 0;
+
+        if (light->getType() != Light::LT_DIRECTIONAL)
+        {
+            extrudeDist = caster->getPointExtrusionDistance(light); 
+        }
+
+        if (!extrudeInSoftware && !finiteExtrude)
+        {
+            // hardware extrusion, to infinity (and beyond!)
+            flags |= SRF_EXTRUDE_TO_INFINITY;
+        }
+
+		// Determine whether zfail is required
+        if (nearClipVol.intersects(caster->getWorldBoundingBox()))
+        {
+            // We use zfail for this object only because zfail
+	        // compatible with zpass algorithm
+			zfailAlgo = true;
+            // We need to include the light and / or dark cap
+            // But only if they will be visible
+            if(camera->isVisible(caster->getLightCapBounds()))
+            {
+                flags |= SRF_INCLUDE_LIGHT_CAP;
+            }
+			// zfail needs dark cap 
+			// UNLESS directional lights using hardware extrusion to infinity
+			// since that extrudes to a single point
+			if(!((flags & SRF_EXTRUDE_TO_INFINITY) && 
+				light->getType() == Light::LT_DIRECTIONAL) &&
+				camera->isVisible(caster->getDarkCapBounds(*light, extrudeDist)))
+			{
+				flags |= SRF_INCLUDE_DARK_CAP;
+			}
+        }
+		else
+		{
+			// In zpass we need a dark cap if
+			// 1: infinite extrusion on point/spotlight sources in modulative shadows
+			//    mode, since otherwise in areas where there is no depth (skybox)
+			//    the infinitely projected volume will leave a dark band
+			// 2: finite extrusion on any light source since glancing angles
+			//    can peek through the end and shadow objects behind incorrectly
+			if ((flags & SRF_EXTRUDE_TO_INFINITY) && 
+				light->getType() != Light::LT_DIRECTIONAL && 
+				mShadowTechnique == SHADOWTYPE_STENCIL_MODULATIVE && 
+				camera->isVisible(caster->getDarkCapBounds(*light, extrudeDist)))
+			{
+				flags |= SRF_INCLUDE_DARK_CAP;
+			}
+			else if (!(flags & SRF_EXTRUDE_TO_INFINITY) && 
+				camera->isVisible(caster->getDarkCapBounds(*light, extrudeDist)))
+			{
+				flags |= SRF_INCLUDE_DARK_CAP;
+			}
+
+		}
+
+        // Get shadow renderables			
+        ShadowCaster::ShadowRenderableListIterator iShadowRenderables =
+            caster->getShadowVolumeRenderableIterator(mShadowTechnique,
+            light, &mShadowIndexBuffer, extrudeInSoftware, 
+            extrudeDist, flags);
+
+        // Render a shadow volume here
+        //  - if we have 2-sided stencil, one render with no culling
+        //  - otherwise, 2 renders, one with each culling method and invert the ops
+        setShadowVolumeStencilState(false, zfailAlgo, stencil2sided);
+        renderShadowVolumeObjects(iShadowRenderables, mShadowStencilPass, &lightList, flags,
+            false, zfailAlgo, stencil2sided);
+        if (!stencil2sided)
+        {
+            // Second pass
+            setShadowVolumeStencilState(true, zfailAlgo, false);
+            renderShadowVolumeObjects(iShadowRenderables, mShadowStencilPass, &lightList, flags,
+                true, zfailAlgo, false);
+        }
+
+        // Do we need to render a debug shadow marker?
+        if (mDebugShadows)
+        {
+            // reset stencil & colour ops
+            mDestRenderSystem->setStencilBufferParams();
+            mShadowDebugPass->getTextureUnitState(0)->
+                setColourOperationEx(LBX_MODULATE, LBS_MANUAL, LBS_CURRENT,
+                zfailAlgo ? ColourValue(0.7, 0.0, 0.2) : ColourValue(0.0, 0.7, 0.2));
+            setPass(mShadowDebugPass);
+            renderShadowVolumeObjects(iShadowRenderables, mShadowDebugPass, &lightList, flags,
+                true, false, false);
+            mDestRenderSystem->_setColourBufferWriteEnabled(false, false, false, false);
+            mDestRenderSystem->_setDepthBufferFunction(CMPF_LESS);
+        }
+    }
+
+    // revert colour write state
+    mDestRenderSystem->_setColourBufferWriteEnabled(true, true, true, true);
+    // revert depth state
+    mDestRenderSystem->_setDepthBufferParams();
+
+    mDestRenderSystem->setStencilCheckEnabled(false);
+
+    mDestRenderSystem->unbindGpuProgram(GPT_VERTEX_PROGRAM);
+
+    if (scissored)
+    {
+        // disable scissor test
+        mDestRenderSystem->setScissorTest(false);
+    }
+
+}
+//---------------------------------------------------------------------
+void SceneManager::renderShadowVolumeObjects(ShadowCaster::ShadowRenderableListIterator iShadowRenderables,
+                                             Pass* pass,
+                                             const LightList *manualLightList,
+                                             unsigned long flags,
+                                             bool secondpass, bool zfail, bool twosided)
+{
+    // ----- SHADOW VOLUME LOOP -----
+    // Render all shadow renderables with same stencil operations
+    while (iShadowRenderables.hasMoreElements())
+    {
+        ShadowRenderable* sr = iShadowRenderables.getNext();
+
+        // omit hidden renderables
+        if (sr->isVisible())
+        {
+            // render volume, including dark and (maybe) light caps
+            renderSingleObject(sr, pass, false, manualLightList);
+
+            // optionally render separate light cap
+            if (sr->isLightCapSeparate() && (flags & SRF_INCLUDE_LIGHT_CAP))
+            {
+                ShadowRenderable* lightCap = sr->getLightCapRenderable();
+                assert(lightCap && "Shadow renderable is missing a separate light cap renderable!");
+
+                // We must take care with light caps when we could 'see' the back facing
+                // triangles directly:
+                //   1. The front facing light caps must render as always fail depth
+                //      check to avoid 'depth fighting'.
+                //   2. The back facing light caps must use normal depth function to
+                //      avoid break the standard depth check
+                //
+                // TODO:
+                //   1. Separate light caps rendering doesn't need for the 'closed'
+                //      mesh that never touch the near plane, because in this instance,
+                //      we couldn't 'see' any back facing triangles directly. The
+                //      'closed' mesh must determinate by edge list builder.
+                //   2. There still exists 'depth fighting' bug with coplane triangles
+                //      that has opposite facing. This usually occur when use two side
+                //      material in the modeling tools and the model exporting tools
+                //      exporting double triangles to represent this model. This bug
+                //      can't fixed in GPU only, there must has extra work on edge list
+                //      builder and shadow volume generater to fix it.
+                //
+                if (twosided)
+                {
+                    // select back facing light caps to render
+                    mDestRenderSystem->_setCullingMode(CULL_ANTICLOCKWISE);
+                    // use normal depth function for back facing light caps
+                    renderSingleObject(lightCap, pass, false, manualLightList);
+
+                    // select front facing light caps to render
+                    mDestRenderSystem->_setCullingMode(CULL_CLOCKWISE);
+                    // must always fail depth check for front facing light caps
+                    mDestRenderSystem->_setDepthBufferFunction(CMPF_ALWAYS_FAIL);
+                    renderSingleObject(lightCap, pass, false, manualLightList);
+
+                    // reset depth function
+                    mDestRenderSystem->_setDepthBufferFunction(CMPF_LESS);
+                    // reset culling mode
+                    mDestRenderSystem->_setCullingMode(CULL_NONE);
+                }
+                else if ((secondpass || zfail) && !(secondpass && zfail))
+                {
+                    // use normal depth function for back facing light caps
+                    renderSingleObject(lightCap, pass, false, manualLightList);
+                }
+                else
+                {
+                    // must always fail depth check for front facing light caps
+                    mDestRenderSystem->_setDepthBufferFunction(CMPF_ALWAYS_FAIL);
+                    renderSingleObject(lightCap, pass, false, manualLightList);
+
+                    // reset depth function
+                    mDestRenderSystem->_setDepthBufferFunction(CMPF_LESS);
+                }
+            }
+        }
+    }
+}
+//---------------------------------------------------------------------
+void SceneManager::setShadowVolumeStencilState(bool secondpass, bool zfail, bool twosided)
+{
+    // Determinate the best stencil operation
+    StencilOperation incrOp, decrOp;
+    if (mDestRenderSystem->getCapabilities()->hasCapability(RSC_STENCIL_WRAP))
+    {
+        incrOp = SOP_INCREMENT_WRAP;
+        decrOp = SOP_DECREMENT_WRAP;
+    }
+    else
+    {
+        incrOp = SOP_INCREMENT;
+        decrOp = SOP_DECREMENT;
+    }
+
+    // First pass, do front faces if zpass
+    // Second pass, do back faces if zpass
+    // Invert if zfail
+    // this is to ensure we always increment before decrement
+    // When two-sided stencil, always pass front face stencil
+    // operation parameters and the inverse of them will happen
+    // for back faces
+    if ( !twosided && ((secondpass || zfail) && !(secondpass && zfail)) )
+    {
+        mDestRenderSystem->_setCullingMode(
+            twosided? CULL_NONE : CULL_ANTICLOCKWISE);
+        mDestRenderSystem->setStencilBufferParams(
+            CMPF_ALWAYS_PASS, // always pass stencil check
+            0, // no ref value (no compare)
+            0xFFFFFFFF, // no mask
+            SOP_KEEP, // stencil test will never fail
+            zfail ? incrOp : SOP_KEEP, // back face depth fail
+            zfail ? SOP_KEEP : decrOp, // back face pass
+            twosided
+            );
+    }
+    else
+    {
+        mDestRenderSystem->_setCullingMode(
+            twosided? CULL_NONE : CULL_CLOCKWISE);
+        mDestRenderSystem->setStencilBufferParams(
+            CMPF_ALWAYS_PASS, // always pass stencil check
+            0, // no ref value (no compare)
+            0xFFFFFFFF, // no mask
+            SOP_KEEP, // stencil test will never fail
+            zfail ? decrOp : SOP_KEEP, // front face depth fail
+            zfail ? SOP_KEEP : incrOp, // front face pass
+            twosided
+            );
+    }
+}
+//---------------------------------------------------------------------
+void SceneManager::setShadowColour(const ColourValue& colour)
+{
+    mShadowColour = colour;
+
+    // Prep materials first
+    initShadowVolumeMaterials();
+
+    mShadowModulativePass->getTextureUnitState(0)->setColourOperationEx(
+        LBX_MODULATE, LBS_MANUAL, LBS_CURRENT, colour);
+}
+//---------------------------------------------------------------------
+const ColourValue& SceneManager::getShadowColour(void) const
+{
+    return mShadowColour;
+}
+//---------------------------------------------------------------------
+void SceneManager::setShadowFarDistance(Real distance)
+{
+    mShadowFarDist = distance;
+    mShadowFarDistSquared = distance * distance;
+}
+//---------------------------------------------------------------------
+void SceneManager::setShadowDirectionalLightExtrusionDistance(Real dist)
+{
+    mShadowDirLightExtrudeDist = dist;
+}
+//---------------------------------------------------------------------
+Real SceneManager::getShadowDirectionalLightExtrusionDistance(void) const
+{
+    return mShadowDirLightExtrudeDist;
+}
+//---------------------------------------------------------------------
+void SceneManager::setShadowIndexBufferSize(size_t size)
+{
+    if (!mShadowIndexBuffer.isNull() && size != mShadowIndexBufferSize)
+    {
+        // re-create shadow buffer with new size
+        mShadowIndexBuffer = HardwareBufferManager::getSingleton().
+            createIndexBuffer(HardwareIndexBuffer::IT_16BIT, 
+            mShadowIndexBufferSize, 
+            HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE, 
+            false);
+    }
+    mShadowIndexBufferSize = size;
+}
+//---------------------------------------------------------------------
+void SceneManager::setShadowTextureSize(unsigned short size)
+{
+    // possibly recreate
+    createShadowTextures(size, mShadowTextureCount, mShadowTextureFormat);
+    mShadowTextureSize = size;
+}
+//---------------------------------------------------------------------
+void SceneManager::setShadowTextureCount(unsigned short count)
+{
+    // possibly recreate
+    createShadowTextures(mShadowTextureSize, count, mShadowTextureFormat);
+    mShadowTextureCount = count;
+}
+//---------------------------------------------------------------------
+void SceneManager::setShadowTexturePixelFormat(PixelFormat fmt)
+{
+	// possibly recreate
+	createShadowTextures(mShadowTextureSize, mShadowTextureCount, fmt);
+	mShadowTextureFormat = fmt;
+}
+//---------------------------------------------------------------------
+void SceneManager::setShadowTextureSettings(unsigned short size, 
+	unsigned short count, PixelFormat fmt)
+{
+    if (!mShadowTextures.empty() && 
+        (count != mShadowTextureCount ||
+        size != mShadowTextureSize ||
+		fmt != mShadowTextureFormat))
+    {
+        // recreate
+        createShadowTextures(size, count, fmt);
+    }
+    mShadowTextureCount = count;
+    mShadowTextureSize = size;
+	mShadowTextureFormat = fmt;
+}
+//---------------------------------------------------------------------
+void SceneManager::setShadowTextureCasterMaterial(const String& name)
+{
+	if (name.empty())
+	{
+		mShadowTextureCustomCasterPass = 0;
+	}
+	else
+	{
+		MaterialPtr mat = MaterialManager::getSingleton().getByName(name);
+		if (mat.isNull())
+		{
+			OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND,
+				"Cannot locate material called '" + name + "'", 
+				"SceneManager::setShadowTextureCasterMaterial");
+		}
+		mat->load();
+		mShadowTextureCustomCasterPass = mat->getBestTechnique()->getPass(0);
+		if (mShadowTextureCustomCasterPass->hasVertexProgram())
+		{
+			// Save vertex program and params in case we have to swap them out
+			mShadowTextureCustomCasterVertexProgram = 
+				mShadowTextureCustomCasterPass->getVertexProgramName();
+			mShadowTextureCustomCasterVPParams = 
+				mShadowTextureCustomCasterPass->getVertexProgramParameters();
+			mShadowTextureCasterVPDirty = false;
+
+		}
+	}
+}
+//---------------------------------------------------------------------
+void SceneManager::setShadowTextureReceiverMaterial(const String& name)
+{
+	if (name.empty())
+	{
+		mShadowTextureCustomReceiverPass = 0;
+	}
+	else
+	{
+		MaterialPtr mat = MaterialManager::getSingleton().getByName(name);
+		if (mat.isNull())
+		{
+			OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND,
+				"Cannot locate material called '" + name + "'", 
+				"SceneManager::setShadowTextureReceiverMaterial");
+		}
+		mat->load();
+		mShadowTextureCustomReceiverPass = mat->getBestTechnique()->getPass(0);
+		if (mShadowTextureCustomReceiverPass->hasVertexProgram())
+		{
+			// Save vertex program and params in case we have to swap them out
+			mShadowTextureCustomReceiverVertexProgram = 
+				mShadowTextureCustomReceiverPass->getVertexProgramName();
+			mShadowTextureCustomReceiverVPParams = 
+				mShadowTextureCustomReceiverPass->getVertexProgramParameters();
+			mShadowTextureReceiverVPDirty = false;
+
+		}
+	}
+}
+//---------------------------------------------------------------------
+void SceneManager::createShadowTextures(unsigned short size,
+	unsigned short count, PixelFormat fmt)
+{
+    static const String baseName = "Ogre/ShadowTexture";
+
+    if (mShadowTechnique != SHADOWTYPE_TEXTURE_MODULATIVE ||
+        !mShadowTextures.empty() && 
+        count == mShadowTextureCount &&
+        size == mShadowTextureSize && 
+		fmt == mShadowTextureFormat)
+    {
+        // no change
+        return;
+    }
+
+
+    // destroy existing
+    ShadowTextureList::iterator i, iend;
+    iend = mShadowTextures.end();
+    for (i = mShadowTextures.begin(); i != iend; ++i)
+    {
+        RenderTexture* r = *i;
+        // remove camera and destroy texture
+        removeCamera(r->getViewport(0)->getCamera());
+        mDestRenderSystem->destroyRenderTexture(r->getName());
+    }
+    mShadowTextures.clear();
+
+    // Recreate shadow textures
+    for (unsigned short t = 0; t < count; ++t)
+    {
+        String targName = baseName + StringConverter::toString(t);
+        String matName = baseName + "Mat" + StringConverter::toString(t);
+        String camName = baseName + "Cam" + StringConverter::toString(t);
+
+        RenderTexture* shadowTex;
+        if (mShadowTechnique == SHADOWTYPE_TEXTURE_MODULATIVE)
+        {
+            shadowTex = mDestRenderSystem->createRenderTexture( 
+                targName, size, size, TEX_TYPE_2D, mShadowTextureFormat);
+        }
+
+        // Create a camera to go with this texture
+        Camera* cam = createCamera(camName);
+        cam->setAspectRatio(1.0f);
+        // Create a viewport
+        Viewport *v = shadowTex->addViewport(cam);
+        v->setClearEveryFrame(true);
+        // remove overlays
+        v->setOverlaysEnabled(false);
+        // Don't update automatically - we'll do it when required
+        shadowTex->setAutoUpdated(false);
+        mShadowTextures.push_back(shadowTex);
+
+        // Also create corresponding Material used for rendering this shadow
+        MaterialPtr mat = MaterialManager::getSingleton().getByName(matName);
+        if (mat.isNull())
+        {
+            mat = MaterialManager::getSingleton().create(
+                matName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+        }
+        else
+        {
+            mat->getTechnique(0)->getPass(0)->removeAllTextureUnitStates();
+        }
+        // create texture unit referring to render target texture
+        TextureUnitState* texUnit = 
+            mat->getTechnique(0)->getPass(0)->createTextureUnitState(targName);
+        // set projective based on camera
+        texUnit->setProjectiveTexturing(true, cam);
+        texUnit->setTextureAddressingMode(TextureUnitState::TAM_CLAMP);
+        mat->touch();
+
+    }
+}
+//---------------------------------------------------------------------
+void SceneManager::prepareShadowTextures(Camera* cam, Viewport* vp)
+{
+    // Set the illumination stage, prevents recursive calls
+    IlluminationRenderStage savedStage = mIlluminationStage;
+    mIlluminationStage = IRS_RENDER_TO_TEXTURE;
+
+    // Determine far shadow distance
+    Real shadowDist = mShadowFarDist;
+    if (!shadowDist)
+    {
+        // need a shadow distance, make one up
+        shadowDist = cam->getNearClipDistance() * 300;
+    }
+    // set fogging to hide the shadow edge
+    Real shadowOffset = shadowDist * mShadowTextureOffset;
+    Real shadowEnd = shadowDist + shadowOffset;
+    mShadowReceiverPass->setFog(true, FOG_LINEAR, ColourValue::White, 
+        0, shadowEnd * mShadowTextureFadeStart, shadowEnd * mShadowTextureFadeEnd);
+
+    // Iterate over the lights we've found, max out at the limit of light textures
+
+    LightList::iterator i, iend;
+    ShadowTextureList::iterator si, siend;
+    iend = mLightsAffectingFrustum.end();
+    siend = mShadowTextures.end();
+    for (i = mLightsAffectingFrustum.begin(), si = mShadowTextures.begin();
+        i != iend && si != siend; ++i)
+    {
+        Light* light = *i;
+        RenderTexture* shadowTex = *si;
+        // Skip non-shadowing lights
+        if (!light->getCastShadows())
+            continue;
+
+        // Directional lights 
+        if (light->getType() == Light::LT_DIRECTIONAL)
+        {
+
+            // set up the shadow texture
+            Camera* texCam = shadowTex->getViewport(0)->getCamera();
+            // Set ortho projection
+            texCam->setProjectionType(PT_ORTHOGRAPHIC);
+            // set easy FOV and near dist so that texture covers far dist
+            texCam->setFOVy(Degree(90));
+            texCam->setNearClipDistance(shadowDist);
+
+            // Set size of projection
+
+            // Calculate look at position
+            // We want to look at a spot shadowOffset away from near plane
+            // 0.5 is a litle too close for angles
+            Vector3 target = cam->getDerivedPosition() + 
+                (cam->getDerivedDirection() * shadowOffset);
+
+            // Calculate position
+            // We want to be in the -ve direction of the light direction
+            // far enough to project for the dir light extrusion distance
+            Vector3 pos = target + 
+                (light->getDerivedDirection() * -mShadowDirLightExtrudeDist);
+
+            // Calculate orientation
+            Vector3 dir = (pos - target); // backwards since point down -z
+            dir.normalise();
+            /*
+            // Next section (camera oriented shadow map) abandoned
+            // Always point in the same direction, if we don't do this then
+            // we get 'shadow swimming' as camera rotates
+            // As it is, we get swimming on moving but this is less noticeable
+
+            // calculate up vector, we want it aligned with cam direction
+            Vector3 up = cam->getDerivedDirection();
+            // Check it's not coincident with dir
+            if (up.dotProduct(dir) >= 1.0f)
+            {
+            // Use camera up
+            up = cam->getUp();
+            }
+            */
+            Vector3 up = Vector3::UNIT_Y;
+            // Check it's not coincident with dir
+            if (up.dotProduct(dir) >= 1.0f)
+            {
+                // Use camera up
+                up = Vector3::UNIT_Z;
+            }
+            // cross twice to rederive, only direction is unaltered
+            Vector3 left = dir.crossProduct(up);
+            left.normalise();
+            up = dir.crossProduct(left);
+            up.normalise();
+            // Derive quaternion from axes
+            Quaternion q;
+            q.FromAxes(left, up, dir);
+            texCam->setOrientation(q);
+
+            // Round local x/y position based on a world-space texel; this helps to reduce
+            // jittering caused by the projection moving with the camera
+            // Viewport is 2 * near clip distance across (90 degree fov)
+            Real worldTexelSize = (texCam->getNearClipDistance() * 20) / mShadowTextureSize;
+            pos.x -= fmod(pos.x, worldTexelSize);
+            pos.y -= fmod(pos.y, worldTexelSize);
+            pos.z -= fmod(pos.z, worldTexelSize);
+            // Finally set position
+            texCam->setPosition(pos);
+
+            if (mShadowTechnique == SHADOWTYPE_TEXTURE_MODULATIVE)
+                shadowTex->getViewport(0)->setBackgroundColour(ColourValue::White);
+
+            // Update target
+            shadowTex->update();
+
+            ++si;
+        }
+        // Spotlight
+        else if (light->getType() == Light::LT_SPOTLIGHT)
+        {
+
+            // set up the shadow texture
+            Camera* texCam = shadowTex->getViewport(0)->getCamera();
+            // Set perspective projection
+            texCam->setProjectionType(PT_PERSPECTIVE);
+            // set FOV slightly larger than the spotlight range to ensure coverage
+            texCam->setFOVy(light->getSpotlightOuterAngle()*1.2);
+            texCam->setPosition(light->getDerivedPosition());
+            texCam->setDirection(light->getDerivedDirection());
+            // set near clip the same as main camera, since they are likely
+            // to both reflect the nature of the scene
+            texCam->setNearClipDistance(cam->getNearClipDistance());
+
+            if (mShadowTechnique == SHADOWTYPE_TEXTURE_MODULATIVE)
+                shadowTex->getViewport(0)->setBackgroundColour(ColourValue::White);
+
+            // Update target
+            shadowTex->update();
+
+            ++si;
+        }
+    }
+    // Set the illumination stage, prevents recursive calls
+    mIlluminationStage = savedStage;
+}
+//---------------------------------------------------------------------
+StaticGeometry* SceneManager::createStaticGeometry(const String& name)
+{
+	// Check not existing
+	if (mStaticGeometryList.find(name) != mStaticGeometryList.end())
+	{
+		OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, 
+			"StaticGeometry with name '" + name + "' already exists!", 
+			"SceneManager::createStaticGeometry");
+	}
+	StaticGeometry* ret = new StaticGeometry(this, name);
+	mStaticGeometryList[name] = ret;
+	return ret;
+}
+//---------------------------------------------------------------------
+StaticGeometry* SceneManager::getStaticGeometry(const String& name) const
+{
+	StaticGeometryList::const_iterator i = mStaticGeometryList.find(name);
+	if (i == mStaticGeometryList.end())
+	{
+		OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, 
+			"StaticGeometry with name '" + name + "' not found", 
+			"SceneManager::createStaticGeometry");
+	}
+	return i->second;
+}
+//---------------------------------------------------------------------
+void SceneManager::removeStaticGeometry(StaticGeometry* geom)
+{
+	removeStaticGeometry(geom->getName());
+}
+//---------------------------------------------------------------------
+void SceneManager::removeStaticGeometry(const String& name)
+{
+	StaticGeometryList::iterator i = mStaticGeometryList.find(name);
+	if (i != mStaticGeometryList.end())
+	{
+		delete i->second;
+		mStaticGeometryList.erase(i);
+	}
+
+}
+//---------------------------------------------------------------------
+void SceneManager::removeAllStaticGeometry(void)
+{
+	StaticGeometryList::iterator i, iend;
+	iend = mStaticGeometryList.end();
+	for (i = mStaticGeometryList.begin(); i != iend; ++i)
+	{
+		delete i->second;
+	}
+	mStaticGeometryList.clear();
+}
+//---------------------------------------------------------------------
+AxisAlignedBoxSceneQuery* 
+SceneManager::createAABBQuery(const AxisAlignedBox& box, unsigned long mask)
+{
+    DefaultAxisAlignedBoxSceneQuery* q = new DefaultAxisAlignedBoxSceneQuery(this);
+    q->setBox(box);
+    q->setQueryMask(mask);
+    return q;
+}
+//---------------------------------------------------------------------
+SphereSceneQuery* 
+SceneManager::createSphereQuery(const Sphere& sphere, unsigned long mask)
+{
+    DefaultSphereSceneQuery* q = new DefaultSphereSceneQuery(this);
+    q->setSphere(sphere);
+    q->setQueryMask(mask);
+    return q;
+}
+//---------------------------------------------------------------------
+PlaneBoundedVolumeListSceneQuery* 
+SceneManager::createPlaneBoundedVolumeQuery(const PlaneBoundedVolumeList& volumes, 
+                                            unsigned long mask)
+{
+    DefaultPlaneBoundedVolumeListSceneQuery* q = new DefaultPlaneBoundedVolumeListSceneQuery(this);
+    q->setVolumes(volumes);
+    q->setQueryMask(mask);
+    return q;
+}
+
+//---------------------------------------------------------------------
+RaySceneQuery* 
+SceneManager::createRayQuery(const Ray& ray, unsigned long mask)
+{
+    DefaultRaySceneQuery* q = new DefaultRaySceneQuery(this);
+    q->setRay(ray);
+    q->setQueryMask(mask);
+    return q;
+}
+//---------------------------------------------------------------------
+IntersectionSceneQuery* 
+SceneManager::createIntersectionQuery(unsigned long mask)
+{
+
+    DefaultIntersectionSceneQuery* q = new DefaultIntersectionSceneQuery(this);
+    q->setQueryMask(mask);
+    return q;
+}
+//---------------------------------------------------------------------
+void SceneManager::destroyQuery(SceneQuery* query)
+{
+    delete query;
+}
+//---------------------------------------------------------------------
+DefaultIntersectionSceneQuery::DefaultIntersectionSceneQuery(SceneManager* creator)
+: IntersectionSceneQuery(creator)
+{
+    // No world geometry results supported
+    mSupportedWorldFragments.insert(SceneQuery::WFT_NONE);
+}
+//---------------------------------------------------------------------
+DefaultIntersectionSceneQuery::~DefaultIntersectionSceneQuery()
+{
+}
+//---------------------------------------------------------------------
+void DefaultIntersectionSceneQuery::execute(IntersectionSceneQueryListener* listener)
+{
+    // Entities only for now
+    SceneManager::EntityList::const_iterator a, b, theEnd;
+    theEnd = mParentSceneMgr->mEntities.end();
+    int numEntities;
+    // Loop a from first to last-1
+    a = mParentSceneMgr->mEntities.begin();
+    numEntities = (uint)mParentSceneMgr->mEntities.size();
+    for (int i = 0; i < (numEntities - 1); ++i, ++a)
+    {
+        // Skip if a does not pass the mask
+        if (!(a->second->getQueryFlags() & mQueryMask) ||
+			!a->second->isInScene())
+            continue;
+
+        // Loop b from a+1 to last
+        b = a;
+        for (++b; b != theEnd; ++b)
+        {
+            // Apply mask to b (both must pass)
+            if ((b->second->getQueryFlags() & mQueryMask) && b->second->isInScene())
+            {
+                const AxisAlignedBox& box1 = a->second->getWorldBoundingBox();
+                const AxisAlignedBox& box2 = b->second->getWorldBoundingBox();
+
+                if (box1.intersects(box2))
+                {
+                    if (!listener->queryResult(a->second, b->second)) return;
+                }
+            }
+
+        }
+    }
+}
+//---------------------------------------------------------------------
+DefaultAxisAlignedBoxSceneQuery::
+DefaultAxisAlignedBoxSceneQuery(SceneManager* creator)
+: AxisAlignedBoxSceneQuery(creator)
+{
+    // No world geometry results supported
+    mSupportedWorldFragments.insert(SceneQuery::WFT_NONE);
+}
+//---------------------------------------------------------------------
+DefaultAxisAlignedBoxSceneQuery::~DefaultAxisAlignedBoxSceneQuery()
+{
+}
+//---------------------------------------------------------------------
+void DefaultAxisAlignedBoxSceneQuery::execute(SceneQueryListener* listener)
+{
+    // Entities only for now
+    SceneManager::EntityList::const_iterator i, iEnd;
+    iEnd = mParentSceneMgr->mEntities.end();
+    for (i = mParentSceneMgr->mEntities.begin(); i != iEnd; ++i)
+    {
+        if ((i->second->getQueryFlags() & mQueryMask) && 
+			i->second->isInScene() &&
+			mAABB.intersects(i->second->getWorldBoundingBox()))
+        {
+            if (!listener->queryResult(i->second)) return;
+        }
+    }
+}
+//---------------------------------------------------------------------
+DefaultRaySceneQuery::
+DefaultRaySceneQuery(SceneManager* creator) : RaySceneQuery(creator)
+{
+    // No world geometry results supported
+    mSupportedWorldFragments.insert(SceneQuery::WFT_NONE);
+}
+//---------------------------------------------------------------------
+DefaultRaySceneQuery::~DefaultRaySceneQuery()
+{
+}
+//---------------------------------------------------------------------
+void DefaultRaySceneQuery::execute(RaySceneQueryListener* listener)
+{
+    // Note that becuase we have no scene partitioning, we actually
+    // perform a complete scene search even if restricted results are
+    // requested; smarter scene manager queries can utilise the paritioning 
+    // of the scene in order to reduce the number of intersection tests 
+    // required to fulfil the query
+
+    // TODO: BillboardSets? Will need per-billboard collision most likely
+    // Entities only for now
+    SceneManager::EntityList::const_iterator i, iEnd;
+    iEnd = mParentSceneMgr->mEntities.end();
+    for (i = mParentSceneMgr->mEntities.begin(); i != iEnd; ++i)
+    {
+        if( (i->second->getQueryFlags() & mQueryMask) &&
+			i->second->isInScene())
+        {
+            // Do ray / box test
+            std::pair<bool, Real> result =
+                mRay.intersects(i->second->getWorldBoundingBox());
+
+            if (result.first)
+            {
+                if (!listener->queryResult(i->second, result.second)) return;
+            }
+        }
+    }
+
+}
+//---------------------------------------------------------------------
+DefaultSphereSceneQuery::
+DefaultSphereSceneQuery(SceneManager* creator) : SphereSceneQuery(creator)
+{
+    // No world geometry results supported
+    mSupportedWorldFragments.insert(SceneQuery::WFT_NONE);
+}
+//---------------------------------------------------------------------
+DefaultSphereSceneQuery::~DefaultSphereSceneQuery()
+{
+}
+//---------------------------------------------------------------------
+void DefaultSphereSceneQuery::execute(SceneQueryListener* listener)
+{
+    // TODO: BillboardSets? Will need per-billboard collision most likely
+    // Entities only for now
+    SceneManager::EntityList::const_iterator i, iEnd;
+    iEnd = mParentSceneMgr->mEntities.end();
+    Sphere testSphere;
+    for (i = mParentSceneMgr->mEntities.begin(); i != iEnd; ++i)
+    {
+        // Skip unattached
+        if (!i->second->isInScene() || 
+			!(i->second->getQueryFlags() & mQueryMask))
+            continue;
+
+        // Do sphere / sphere test
+        testSphere.setCenter(i->second->getParentNode()->_getDerivedPosition());
+        testSphere.setRadius(i->second->getBoundingRadius());
+        if (mSphere.intersects(testSphere))
+        {
+            if (!listener->queryResult(i->second)) return;
+        }
+    }
+}
+//---------------------------------------------------------------------
+DefaultPlaneBoundedVolumeListSceneQuery::
+DefaultPlaneBoundedVolumeListSceneQuery(SceneManager* creator) 
+: PlaneBoundedVolumeListSceneQuery(creator)
+{
+    // No world geometry results supported
+    mSupportedWorldFragments.insert(SceneQuery::WFT_NONE);
+}
+//---------------------------------------------------------------------
+DefaultPlaneBoundedVolumeListSceneQuery::~DefaultPlaneBoundedVolumeListSceneQuery()
+{
+}
+//---------------------------------------------------------------------
+void DefaultPlaneBoundedVolumeListSceneQuery::execute(SceneQueryListener* listener)
+{
+    // Entities only for now
+    SceneManager::EntityList::const_iterator i, iEnd;
+    iEnd = mParentSceneMgr->mEntities.end();
+    Sphere testSphere;
+    for (i = mParentSceneMgr->mEntities.begin(); i != iEnd; ++i)
+    {
+        PlaneBoundedVolumeList::iterator pi, piend;
+        piend = mVolumes.end();
+        for (pi = mVolumes.begin(); pi != piend; ++pi)
+        {
+            PlaneBoundedVolume& vol = *pi;
+            // Do AABB / plane volume test
+            if ((i->second->getQueryFlags() & mQueryMask) && 
+				i->second->isInScene() && 
+				vol.intersects(i->second->getWorldBoundingBox()))
+            {
+                if (!listener->queryResult(i->second)) return;
+                break;
+            }
+        }
+    }
+}
+#ifdef OGRE_COHERENT_OCCLUSION_CULLING
+//-----------------------------------------------------------------------
+void SceneManager::_renderSceneNode( Camera *cam, SceneNode *node )
+{
+	node->_findVisibleObjects(cam, getRenderQueue(), false, mDisplayNodes, false);
+	SceneManager::_renderVisibleObjects();
+	
+	// delete all rendered objects from renderqueue
+	_deleteRenderedQueueGroups();
+}
+//-----------------------------------------------------------------------
+void SceneManager::_deleteRenderedQueueGroups()
+{
+	RenderQueue::QueueGroupIterator queueIt = getRenderQueue()->_getQueueGroupIterator();
+
+	while (queueIt.hasMoreElements())
+	{
+		RenderQueueGroupID qId = queueIt.peekNextKey();
+		RenderQueueGroup* pGroup = queueIt.getNext();
+
+		// delete this queue group if already processed
+		if (isRenderQueueToBeProcessed(qId))
+			pGroup->clear();
+	}
+	
+	// Now trigger the pending pass updates
+	// Pass::processPendingPassUpdates();
+}
+#endif //OGRE_COHERENT_OCCLUSION_CULLING
+}
Index: /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctree.h
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctree.h	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctree.h	(revision 61)
@@ -0,0 +1,203 @@
+/*
+-----------------------------------------------------------------------------
+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.
+-----------------------------------------------------------------------------
+*/
+/***************************************************************************
+octree.h  -  description
+-------------------
+begin                : Mon Sep 30 2002
+copyright            : (C) 2002 by Jon Anderson
+email                : janders@users.sf.net
+
+Enhancements 2003 - 2004 (C) The OGRE Team
+***************************************************************************/
+
+#ifndef OCTREE_H
+#define OCTREE_H
+
+#include "OgreTerrainPrerequisites.h"
+#include <OgreAxisAlignedBox.h>
+#include <OgreWireBoundingBox.h>
+
+#include <list>
+
+namespace Ogre
+{
+
+class OctreeNode;
+
+typedef std::list < OctreeNode * > NodeList;
+
+
+/** Octree datastructure for managing scene nodes.
+@remarks
+This is a loose octree implementation, meaning that each
+octant child of the octree actually overlaps it's siblings by a factor
+of .5.  This guarantees that any thing that is half the size of the parent will
+fit completely into a child, with no splitting necessary.
+*/
+
+class _OgreTerrainExport Octree
+{
+public:
+    Octree( Octree * p );
+    ~Octree();
+
+    /** Adds an Octree scene node to this octree level.
+    @remarks
+    This is called by the OctreeSceneManager after
+    it has determined the correct Octree to insert the node into.
+    */
+    void _addNode( OctreeNode * );
+
+    /** Removes an Octree scene node to this octree level.
+    */
+    void _removeNode( OctreeNode * );
+
+    /** Returns the number of scene nodes attached to this octree
+    */
+    int numNodes()
+    {
+        return mNumNodes;
+    };
+
+    /** The bounding box of the octree
+    @remarks
+    This is used for octant index determination and rendering, but not culling
+    */
+    AxisAlignedBox mBox;
+    WireBoundingBox* mWireBoundingBox;
+    
+    /** Creats the wire frame bounding box for this octant
+    */
+    WireBoundingBox* getWireBoundingBox();
+
+    /** Vector containing the dimensions of this octree / 2
+    */
+    Vector3 mHalfSize;
+
+    /** 3D array of children of this octree.
+    @remarks
+    Children are dynamically created as needed when nodes are inserted in the Octree.
+    If, later, the all the nodes are removed from the child, it is still kept arround.
+    */
+    Octree * mChildren[ 2 ][ 2 ][ 2 ];
+
+    /** Determines if this octree is twice as big as the given box.
+    @remarks
+    This method is used by the OctreeSceneManager to determine if the given
+    box will fit into a child of this octree.
+    */
+    bool _isTwiceSize( AxisAlignedBox &box );
+
+    /**  Returns the appropriate indexes for the child of this octree into which the box will fit.
+    @remarks
+    This is used by the OCtreeSceneManager to determine which child to traverse next when
+    finding the appropriate octree to insert the box.  Since it is a loose octree, only the
+    center of the box is checked to determine the octant.
+    */
+    void _getChildIndexes( AxisAlignedBox &, int *x, int *y, int *z );
+
+    /** Creates the AxisAlignedBox used for culling this octree.
+    @remarks
+    Since it's a loose octree, the culling bounds can be different than the actual bounds of the octree.
+    */
+    void _getCullBounds( AxisAlignedBox * );
+
+
+    /** Public list of SceneNodes attached to this particular octree
+    */
+    NodeList mNodes;
+
+protected:
+
+    /** Increments the overall node count of this octree and all it's parents
+    */
+    inline void _ref()
+    {
+        mNumNodes++;
+
+        if ( mParent != 0 ) mParent -> _ref();
+    };
+
+    /** Decrements the overall node count of this octree and all it's parents
+    */
+    inline void _unref()
+    {
+        mNumNodes--;
+
+        if ( mParent != 0 ) mParent -> _unref();
+    };
+
+    ///number of SceneNodes in this octree and all it's children.
+    int mNumNodes;
+
+    ///parent octree
+    Octree * mParent;
+
+#ifdef OGRE_COHERENT_OCCLUSION_CULLING
+	public:
+		/** Returns last visited frame id. */
+		int lastVisited(void);
+		/** Set to current frame id.
+        @param current frame id.
+        */
+		void setLastVisited(int frameid);
+		/** Makes this octree become visible / invisble.
+        @param visible Whether this node is to be made visible or invisible
+        */
+		void setOctreeVisible(bool visible);
+		/** Returns true if this node is marked visible, false otherwise. 
+		*/
+		bool isOctreeVisible(void);
+		/** Gets this node's parent (NULL if this is the root).
+		*/
+		Octree *getParent();
+		/** Frame id when this octree was last rendered. 
+		@return last rendered frame id
+		*/	
+		int lastRendered(void);
+		/** Sets frame id when this octree was last rendered. 
+		@param last rendered frame id
+		*/
+		void setLastRendered(int frameid);
+		/** Returns current depth of octree 
+		@return current depth
+		*/
+		int getDepth();
+
+	protected:
+
+		int mLastRendered;
+		int mLastVisited;
+		bool mVisible;
+		int mDepth;
+
+#endif //OGRE_COHERENT_OCCLUSION_CULLING
+};
+
+}
+
+#endif
+
+
Index: /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctreeCamera.h
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctreeCamera.h	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctreeCamera.h	(revision 61)
@@ -0,0 +1,90 @@
+/*
+-----------------------------------------------------------------------------
+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.
+-----------------------------------------------------------------------------
+*/
+/***************************************************************************
+octreecamera.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 OCTREECAMERA_H
+#define OCTREECAMERA_H
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+#include "OgreTerrainPrerequisites.h"
+#endif // GTP_VISIBILITY_MODIFIED_OGRE
+#include <OgreCamera.h>
+#include <OgreHardwareBufferManager.h>
+#include <OgreSimpleRenderable.h>
+
+/**
+*@author Jon Anderson
+*/
+
+namespace Ogre
+{
+
+class Octree;
+
+
+/** Specialized viewpoint from which an Octree can be rendered.
+@remarks
+This class contains several speciliazations of the Ogre::Camera class. It
+implements the getRenderOperation method inorder to return displayable geometry
+for debuggin purposes. It also implements a visibility function that is more granular
+than the default.
+*/
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+class _OgreTerrainExport OctreeCamera : public Camera
+#else
+class OctreeCamera : public Camera
+#endif
+{
+public:
+
+    /** Visibility types */
+    enum Visibility
+    {
+        NONE,
+        PARTIAL,
+        FULL
+    };
+
+    /* Standard Constructor */
+    OctreeCamera( const String& name, SceneManager* sm );
+    /* Standard destructor */
+    ~OctreeCamera();
+
+    /** Returns the visiblity of the box
+    */
+    OctreeCamera::Visibility getVisibility( const AxisAlignedBox &bound );
+
+};
+
+}
+
+#endif
Index: /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctreeSceneManager.h
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctreeSceneManager.h	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctreeSceneManager.h	(revision 61)
@@ -0,0 +1,260 @@
+/***************************************************************************
+octreescenemanager.h  -  description
+-------------------
+begin                : Fri Sep 27 2002
+copyright            : (C) 2002 by Jon Anderson
+email                : janders@users.sf.net
+***************************************************************************/
+
+/*
+-----------------------------------------------------------------------------
+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.
+-----------------------------------------------------------------------------
+*/
+
+#ifndef OCTREESCENEMANAGER_H
+#define OCTREESCENEMANAGER_H
+
+#include "OgreTerrainPrerequisites.h"
+#include "OgreSceneManager.h"
+#include "OgreRenderOperation.h"
+#include "OgreSphere.h"
+
+#include <list>
+#include <algorithm>
+
+#include <OgreOctree.h>
+
+
+namespace Ogre
+{
+
+class OctreeNode;
+
+class OctreeCamera;
+class OctreeIntersectionSceneQuery;
+class OctreeRaySceneQuery;
+class OctreeSphereSceneQuery;
+class OctreeAxisAlignedBoxSceneQuery;
+class OctreePlaneBoundedVolumeListSceneQuery;
+
+
+typedef std::list < WireBoundingBox * > BoxList;
+typedef std::list < unsigned long > ColorList;
+//typedef std::list < SceneNode * > SceneNodeList;
+
+
+/** Specialized SceneManager that divides the geometry into an octree in order to faciliate spatial queries.
+@remarks
+For debugging purposes, a special "CullCamera" can be defined.  To use it, call setUseCallCamera( true ),
+and create a camera named "CullCamera".  All culling will be performed using that camera, instead of the viewport
+camera, allowing you to fly around and examine culling.
+*/
+
+class _OgreTerrainExport OctreeSceneManager : public SceneManager
+{
+    friend class OctreeIntersectionSceneQuery;
+    friend class OctreeRaySceneQuery;
+    friend class OctreeSphereSceneQuery;
+    friend class OctreeAxisAlignedBoxSceneQuery;
+    friend class OctreePlaneBoundedVolumeListSceneQuery;
+
+public:
+    static int intersect_call;
+    /** Standard Constructor.  Initializes the octree to -500,-500,-500 to 500,500,500 with unlimited depth. */
+    OctreeSceneManager( );
+    /** Standard Constructor */
+    OctreeSceneManager( AxisAlignedBox &box, int max_depth );
+    /** Standard desctructor */
+    ~OctreeSceneManager();
+
+    /** Initializeds the manager to the given box and depth.
+    */
+    void init( AxisAlignedBox &box, int d );
+
+    /** Creates a specialized OctreeNode */
+    virtual	SceneNode * createSceneNode ( void );
+    /** Creates a specialized OctreeNode */
+    virtual SceneNode * createSceneNode ( const String &name );
+    /** Creates a specialized OctreeCamera */
+    virtual Camera * createCamera( const String &name );
+
+    /** Deletes a scene node */
+    virtual void destroySceneNode( const String &name );
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	/** Renders one octant of an octree, i.e., renders current octant
+		node and does not traverse deeper into the tree.
+		@remark Note that OctreeNode instances are NOT part of the octree 
+		hierarchy, instead one octant of an Octree contains many OctreeNode instances.
+		@param octree the octree to be rendered
+		@param cam current camera
+	*/
+	void _renderOctant(Camera* cam, Octree *octree);
+#endif // GTP_VISIBILITY_MODIFIED_OGRE
+
+
+    /** Does nothing more */
+    virtual void _updateSceneGraph( Camera * cam );
+    /** Recurses through the octree determining which nodes are visible. */
+    virtual void _findVisibleObjects ( Camera * cam, bool onlyShadowCasters );
+
+    /** Alerts each unculled object, notifying it that it will be drawn.
+     * Useful for doing calculations only on nodes that will be drawn, prior
+     * to drawing them...
+     */
+    virtual void _alertVisibleObjects( void );
+
+    /** Walks through the octree, adding any visible objects to the render queue.
+    @remarks
+    If any octant in the octree if completely within the the view frustum,
+    all subchildren are automatically added with no visibility tests.
+    */
+    void walkOctree( OctreeCamera *, RenderQueue *, Octree *, bool foundvisible,
+                     bool onlyShadowCasters);
+
+    /** Checks the given OctreeNode, and determines if it needs to be moved
+    * to a different octant.
+    */
+    void _updateOctreeNode( OctreeNode * );
+    /** Removes the given octree node */
+    void _removeOctreeNode( OctreeNode * );
+    /** Adds the Octree Node, starting at the given octree, and recursing at max to the specified depth.
+    */
+    void _addOctreeNode( OctreeNode *, Octree *octree, int depth = 0 );
+
+    /** Recurses the octree, adding any nodes intersecting with the box into the given list.
+    It ignores the exclude scene node.
+    */
+    void findNodesIn( const AxisAlignedBox &box, std::list < SceneNode * > &list, SceneNode *exclude = 0 );
+
+    /** Recurses the octree, adding any nodes intersecting with the sphere into the given list.
+    It ignores the exclude scene node.
+    */
+    void findNodesIn( const Sphere &sphere, std::list < SceneNode * > &list, SceneNode *exclude = 0 );
+
+    /** Recurses the octree, adding any nodes intersecting with the volume into the given list.
+      It ignores the exclude scene node.
+      */
+    void findNodesIn( const PlaneBoundedVolume &volume, std::list < SceneNode * > &list, SceneNode *exclude=0 );
+
+    /** Recurses the octree, adding any nodes intersecting with the ray into the given list.
+      It ignores the exclude scene node.
+      */
+    void findNodesIn( const Ray &ray, std::list < SceneNode * > &list, SceneNode *exclude=0 );
+
+    /** Sets the box visibility flag */
+    void setShowBoxes( bool b )
+    {
+        mShowBoxes = b;
+    };
+
+    /** Sets the cull camera flag */
+    void setUseCullCamera( bool b )
+    {
+        mCullCamera = b;
+    };
+
+    void setLooseOctree( bool b )
+    {
+        mLoose = b;
+    };
+
+
+    /** Resizes the octree to the given size */
+    void resize( const AxisAlignedBox &box );
+
+    /** Sets the given option for the SceneManager
+               @remarks
+        Options are:
+        "Size", AxisAlignedBox *;
+        "CullCamera", bool *;
+        "Depth", int *;
+        "ShowOctree", bool *;
+    */
+
+    virtual bool setOption( const String &, const void * );
+    /** Gets the given option for the Scene Manager.
+        @remarks
+        See setOption
+    */
+    virtual bool getOption( const String &, void * );
+
+    bool getOptionValues( const String & key, StringVector &refValueList );
+    bool getOptionKeys( StringVector &refKeys );
+    /** Overridden from SceneManager */
+    void clearScene(void);
+
+    AxisAlignedBoxSceneQuery* OctreeSceneManager::createAABBQuery(const AxisAlignedBox& box, unsigned long mask);
+    SphereSceneQuery* OctreeSceneManager::createSphereQuery(const Sphere& sphere, unsigned long mask);
+    PlaneBoundedVolumeListSceneQuery* createPlaneBoundedVolumeQuery(const PlaneBoundedVolumeList& volumes, unsigned long mask);
+    RaySceneQuery* createRayQuery(const Ray& ray, unsigned long mask);
+    IntersectionSceneQuery* createIntersectionQuery(unsigned long mask);
+
+protected:
+
+
+    NodeList mVisible;
+
+    /// The root octree
+    Octree *mOctree;
+
+    /// list of boxes to be rendered
+    BoxList mBoxes;
+
+    /// number of rendered objs
+    int mNumObjects;
+
+    /// max depth for the tree.
+    int mMaxDepth;
+    /// Size of the octree
+    AxisAlignedBox mBox;
+
+    /// box visibility flag
+    bool mShowBoxes;
+
+    /// cull camera flag
+    bool mCullCamera;
+
+
+    bool mLoose;
+
+    Real mCorners[ 24 ];
+    static unsigned long mColors[ 8 ];
+    static unsigned short mIndexes[ 24 ];
+
+    Matrix4 mScaleFactor;
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	/* the number of nodes in the octree. do not confuse this with the OctreeNode
+	class with is derived from SceneNode.
+	*/
+	int mNumOctreeNodes;
+#endif // GTP_VISIBILITY_MODIFIED_OGRE
+
+};
+
+
+}
+
+#endif
+
Index: /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/src/OgreOctree.cpp
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/src/OgreOctree.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/src/OgreOctree.cpp	(revision 61)
@@ -0,0 +1,223 @@
+/*
+-----------------------------------------------------------------------------
+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.
+-----------------------------------------------------------------------------
+*/
+/***************************************************************************
+octree.cpp  -  description
+-------------------
+begin                : Mon Sep 30 2002
+copyright            : (C) 2002 by Jon Anderson
+email                : janders@users.sf.net
+
+Enhancements 2003 - 2004 (C) The OGRE Team
+
+***************************************************************************/
+
+#include <OgreOctree.h>
+#include <OgreOctreeNode.h>
+
+namespace Ogre
+{
+
+/** Returns true is the box will fit in a child.
+*/
+bool Octree::_isTwiceSize( AxisAlignedBox &box )
+{
+    const Vector3 * pts1 = mBox.getAllCorners();
+    const Vector3 * pts2 = box.getAllCorners();
+
+    return ( ( pts2[ 4 ].x -pts2[ 0 ].x ) <= ( pts1[ 4 ].x - pts1[ 0 ].x ) / 2 ) &&
+           ( ( pts2[ 4 ].y - pts2[ 0 ].y ) <= ( pts1[ 4 ].y - pts1[ 0 ].y ) / 2 ) &&
+           ( ( pts2[ 4 ].z - pts2[ 0 ].z ) <= ( pts1[ 4 ].z - pts1[ 0 ].z ) / 2 ) ;
+
+}
+
+/** It's assumed the the given box has already been proven to fit into
+* a child.  Since it's a loose octree, only the centers need to be
+* compared to find the appropriate node.
+*/
+void Octree::_getChildIndexes( AxisAlignedBox &box, int *x, int *y, int *z )
+{
+    Vector3 max = mBox.getMaximum();
+    Vector3 min = box.getMinimum();
+
+    Vector3 center = mBox.getMaximum().midPoint( mBox.getMinimum() );
+
+    Vector3 ncenter = box.getMaximum().midPoint( box.getMinimum() );
+
+    if ( ncenter.x > center.x )
+        * x = 1;
+    else
+        *x = 0;
+
+    if ( ncenter.y > center.y )
+        * y = 1;
+    else
+        *y = 0;
+
+    if ( ncenter.z > center.z )
+        * z = 1;
+    else
+        *z = 0;
+
+}
+
+Octree::Octree( Octree * parent ) 
+    : mWireBoundingBox(0),
+      mHalfSize( 0, 0, 0 )
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	, mLastVisited(0), mVisible(false), mLastRendered(-1)
+#endif //GTP_VISIBILITY_MODIFIED_OGRE
+{
+    //initialize all children to null.
+    for ( int i = 0; i < 2; i++ )
+    {
+        for ( int j = 0; j < 2; j++ )
+        {
+            for ( int k = 0; k < 2; k++ )
+            {
+                mChildren[ i ][ j ][ k ] = 0;
+            }
+        }
+    }
+
+    mParent = parent;
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	if (mParent) 
+		mDepth = parent->getDepth() + 1;
+	else
+		mDepth = 0;
+
+	//matt: remove later
+	//char msg[100];
+	//sprintf(msg, "creating new octant in depth %d", mDepth);
+	//OutputDebugString(msg);
+
+#endif //GTP_VISIBILITY_MODIFIED_OGRE
+    mNumNodes = 0;
+}
+
+Octree::~Octree()
+{
+    //initialize all children to null.
+    for ( int i = 0; i < 2; i++ )
+    {
+        for ( int j = 0; j < 2; j++ )
+        {
+            for ( int k = 0; k < 2; k++ )
+            {
+                if ( mChildren[ i ][ j ][ k ] != 0 )
+                    delete mChildren[ i ][ j ][ k ];
+            }
+        }
+    }
+
+    if(mWireBoundingBox)
+        delete mWireBoundingBox;
+
+    mParent = 0;
+}
+
+void Octree::_addNode( OctreeNode * n )
+{
+    mNodes.push_back( n );
+    n -> setOctant( this );
+
+    //update total counts.
+    _ref();
+
+}
+
+void Octree::_removeNode( OctreeNode * n )
+{
+    mNodes.erase( std::find( mNodes.begin(), mNodes.end(), n ) );
+    n -> setOctant( 0 );
+
+    //update total counts.
+    _unref();
+}
+
+void Octree::_getCullBounds( AxisAlignedBox *b )
+{
+    const Vector3 * corners = mBox.getAllCorners();
+    b -> setExtents( corners[ 0 ] - mHalfSize, corners[ 4 ] + mHalfSize );
+}
+
+WireBoundingBox* Octree::getWireBoundingBox()
+{
+	// Create a WireBoundingBox if needed
+    if(mWireBoundingBox == 0)
+        mWireBoundingBox = new WireBoundingBox();
+
+	mWireBoundingBox->setupBoundingBox(mBox);
+
+	// matt: change this back
+	//AxisAlignedBox box; _getCullBounds(&box); 
+	//mWireBoundingBox->setupBoundingBox(box);
+
+    return mWireBoundingBox;
+}
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+//-----------------------------------------------------------------------	
+int Octree::lastVisited(void)
+{
+	return mLastVisited;
+}
+//-----------------------------------------------------------------------
+void Octree::setLastVisited(int frameid)
+{
+	mLastVisited = frameid;
+}
+//-----------------------------------------------------------------------	
+int Octree::lastRendered(void)
+{
+	return mLastRendered;
+}
+//-----------------------------------------------------------------------
+void Octree::setLastRendered(int frameid)
+{
+	mLastRendered = frameid;
+}
+//-----------------------------------------------------------------------	
+void Octree::setOctreeVisible(bool visible)
+{
+	mVisible = visible;
+}
+//-----------------------------------------------------------------------	
+bool Octree::isOctreeVisible(void)
+{
+	return mVisible;
+}
+//-----------------------------------------------------------------------	
+Octree *Octree::getParent()
+{
+	return mParent;
+}
+//-----------------------------------------------------------------------	
+int Octree::getDepth()
+{
+	return mDepth;
+}
+#endif //GTP_VISIBILITY_MODIFIED_OGRE
+}
Index: /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/src/OgreOctreeCamera.cpp
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/src/OgreOctreeCamera.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/src/OgreOctreeCamera.cpp	(revision 61)
@@ -0,0 +1,114 @@
+/*
+-----------------------------------------------------------------------------
+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.
+-----------------------------------------------------------------------------
+*/
+/***************************************************************************
+octreecamera.cpp  -  description
+-------------------
+begin                : Fri Sep 27 2002
+copyright            : (C) 2002 by Jon Anderson
+email                : janders@users.sf.net
+
+Enhancements 2003 - 2004 (C) The OGRE Team
+
+***************************************************************************/
+#include <OgreMath.h>
+#include <OgreAxisAlignedBox.h>
+#include <OgreRoot.h>
+
+#include <OgreOctreeCamera.h>
+
+namespace Ogre
+{
+OctreeCamera::OctreeCamera( const String& name, SceneManager* sm ) : Camera( name, sm )
+{
+                                                                      
+}
+
+OctreeCamera::~OctreeCamera()
+{
+}
+
+OctreeCamera::Visibility OctreeCamera::getVisibility( const AxisAlignedBox &bound )
+{
+
+    // Null boxes always invisible
+    if ( bound.isNull() )
+        return NONE;
+
+    // Make any pending updates to the calculated frustum
+    updateView();
+
+    // Get corners of the box
+    const Vector3* pCorners = bound.getAllCorners();
+
+    // For each plane, see if all points are on the negative side
+    // If so, object is not visible.
+    // If one or more are, it's partial.
+    // If all aren't, full
+
+    int corners[ 8 ] = {0, 4, 3, 5, 2, 6, 1, 7};
+
+    int planes[ 6 ] = {FRUSTUM_PLANE_TOP, FRUSTUM_PLANE_BOTTOM,
+                       FRUSTUM_PLANE_LEFT, FRUSTUM_PLANE_RIGHT,
+                       FRUSTUM_PLANE_FAR, FRUSTUM_PLANE_NEAR };
+
+    bool all_inside = true;
+
+    for ( int plane = 0; plane < 6; ++plane )
+    {
+
+        // Skip far plane if infinite view frustum
+        if (mFarDist == 0 && planes[ plane ] == FRUSTUM_PLANE_FAR)
+            continue;
+
+        bool all_outside = true;
+
+        float distance = 0;
+
+        for ( int corner = 0; corner < 8; ++corner )
+        {
+            distance = mFrustumPlanes[ planes[ plane ] ].getDistance( pCorners[ corners[ corner ] ] );
+            all_outside = all_outside && ( distance < 0 );
+            all_inside = all_inside && ( distance >= 0 );
+
+            if ( !all_outside && !all_inside )
+                break;
+        }
+
+        if ( all_outside )
+            return NONE;
+    }
+
+    if ( all_inside )
+        return FULL;
+    else
+        return PARTIAL;
+
+}
+
+}
+
+
+
+
Index: /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/src/OgreOctreeSceneManager.cpp
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/src/OgreOctreeSceneManager.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/Plugins/OctreeSceneManager/src/OgreOctreeSceneManager.cpp	(revision 61)
@@ -0,0 +1,1207 @@
+/*
+-----------------------------------------------------------------------------
+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.
+-----------------------------------------------------------------------------
+*/
+/***************************************************************************
+octreescenemanager.cpp  -  description
+-------------------
+begin                : Fri Sep 27 2002
+copyright            : (C) 2002 by Jon Anderson
+email                : janders@users.sf.net
+ 
+Enhancements 2003 - 2004 (C) The OGRE Team
+ 
+***************************************************************************/
+
+#include <OgreOctreeSceneManager.h>
+#include <OgreOctreeSceneQuery.h>
+#include <OgreOctreeNode.h>
+#include <OgreOctreeCamera.h>
+#include <OgreRenderSystem.h>
+#include <windows.h>
+
+extern "C"
+{
+    void findNodesInBox( Ogre::SceneManager *sm,
+                         const Ogre::AxisAlignedBox &box,
+                         std::list < Ogre::SceneNode * > &list,
+                         Ogre::SceneNode *exclude )
+    {
+        static_cast<Ogre::OctreeSceneManager*>( sm ) -> findNodesIn( box, list, exclude );
+    }
+    void findNodesInSphere( Ogre::SceneManager *sm,
+                            const Ogre::Sphere &sphere,
+                            std::list < Ogre::SceneNode * > &list,
+                            Ogre::SceneNode *exclude )
+    {
+        static_cast<Ogre::OctreeSceneManager*>( sm ) -> findNodesIn( sphere, list, exclude );
+    }
+}
+
+namespace Ogre
+{
+enum Intersection
+{
+    OUTSIDE=0,
+    INSIDE=1,
+    INTERSECT=2
+};
+int OctreeSceneManager::intersect_call = 0;
+
+Intersection intersect( const Ray &one, const AxisAlignedBox &two )
+{
+    OctreeSceneManager::intersect_call++;
+    // Null box?
+    if (two.isNull()) return OUTSIDE;
+
+    bool inside = true;
+    const Vector3* pCorners = two.getAllCorners();
+    Vector3 origin = one.getOrigin();
+    Vector3 dir = one.getDirection();
+
+    Vector3 maxT(-1, -1, -1);
+
+    int i = 0;
+    for(i=0; i<3; i++ )
+    {
+        if( origin[i] < pCorners[0][i] )
+        {
+            inside = false;
+            if( dir[i] > 0 )
+            {
+                maxT[i] = (pCorners[0][i] - origin[i])/ dir[i];
+            }
+        }
+        else if( origin[i] > pCorners[4][i] )
+        {
+            inside = false;
+            if( dir[i] < 0 )
+            {
+                maxT[i] = (pCorners[4][i] - origin[i]) / dir[i];
+            }
+        }
+    }
+
+    if( inside )
+    {
+        return INTERSECT;
+    }
+    int whichPlane = 0;
+    if( maxT[1] > maxT[whichPlane])
+        whichPlane = 1;
+    if( maxT[2] > maxT[whichPlane])
+        whichPlane = 2;
+
+    if( ((int)maxT[whichPlane]) & 0x80000000 )
+    {
+        return OUTSIDE;
+    }
+    for(i=0; i<3; i++ )
+    {
+        if( i!= whichPlane )
+        {
+            float f = origin[i] + maxT[whichPlane] * dir[i];
+            if ( f < (pCorners[0][i] - 0.00001f) ||
+                    f > (pCorners[4][i] +0.00001f ) )
+            {
+                return OUTSIDE;
+            }
+        }
+    }
+
+    return INTERSECT;
+
+}
+
+
+/** Checks how the second box intersects with the first.
+*/
+Intersection intersect( const PlaneBoundedVolume &one, const AxisAlignedBox &two )
+{
+    OctreeSceneManager::intersect_call++;
+    // Null box?
+    if (two.isNull()) return OUTSIDE;
+
+    // Get corners of the box
+    const Vector3* pCorners = two.getAllCorners();
+
+    // For each plane, see if all points are on the negative side
+    // If so, object is not visible.
+    // If one or more are, it's partial.
+    // If all aren't, full
+    int corners[ 8 ] = {0, 4, 3, 5, 2, 6, 1, 7};
+    bool all_inside = true;
+    PlaneList::const_iterator i, iend;
+    iend = one.planes.end();
+    for (i = one.planes.begin(); i != iend; ++i)
+    {
+        const Plane& plane = *i;
+        bool all_outside = true;
+
+        float distance = 0;
+
+        for ( int corner = 0; corner < 8; ++corner )
+        {
+            distance = plane.getDistance( pCorners[ corners[ corner ] ] );
+            all_outside = all_outside && ( distance < 0 );
+            all_inside = all_inside && ( distance >= 0 );
+
+            if ( !all_outside && !all_inside )
+                break;
+        }
+
+        if ( all_outside )
+            return OUTSIDE;
+    }
+
+    if ( all_inside )
+        return INSIDE;
+    else
+        return INTERSECT;
+
+}
+
+
+/** Checks how the second box intersects with the first.
+*/
+Intersection intersect( const AxisAlignedBox &one, const AxisAlignedBox &two )
+{
+    OctreeSceneManager::intersect_call++;
+    // Null box?
+    if (one.isNull() || two.isNull()) return OUTSIDE;
+
+    const Vector3 * outside = one.getAllCorners();
+    const Vector3 *inside = two.getAllCorners();
+
+    if ( inside[ 4 ].x < outside[ 0 ].x ||
+            inside[ 4 ].y < outside[ 0 ].y ||
+            inside[ 4 ].z < outside[ 0 ].z ||
+            inside[ 0 ].x > outside[ 4 ].x ||
+            inside[ 0 ].y > outside[ 4 ].y ||
+            inside[ 0 ].z > outside[ 4 ].z )
+    {
+        return OUTSIDE;
+    }
+
+    bool full = ( inside[ 0 ].x > outside[ 0 ].x &&
+                  inside[ 0 ].y > outside[ 0 ].y &&
+                  inside[ 0 ].z > outside[ 0 ].z &&
+                  inside[ 4 ].x < outside[ 4 ].x &&
+                  inside[ 4 ].y < outside[ 4 ].y &&
+                  inside[ 4 ].z < outside[ 4 ].z );
+
+    if ( full )
+        return INSIDE;
+    else
+        return INTERSECT;
+
+}
+
+/** Checks how the box intersects with the sphere.
+*/
+Intersection intersect( const Sphere &one, const AxisAlignedBox &two )
+{
+    OctreeSceneManager::intersect_call++;
+    // Null box?
+    if (two.isNull()) return OUTSIDE;
+
+    float sradius = one.getRadius();
+
+    sradius *= sradius;
+
+    Vector3 scenter = one.getCenter();
+
+    const Vector3 *corners = two.getAllCorners();
+
+    float s, d = 0;
+
+    Vector3 mndistance = ( corners[ 0 ] - scenter );
+    Vector3 mxdistance = ( corners[ 4 ] - scenter );
+
+    if ( mndistance.squaredLength() < sradius &&
+            mxdistance.squaredLength() < sradius )
+    {
+        return INSIDE;
+    }
+
+    //find the square of the distance
+    //from the sphere to the box
+    for ( int i = 0 ; i < 3 ; i++ )
+    {
+        if ( scenter[ i ] < corners[ 0 ][ i ] )
+        {
+            s = scenter[ i ] - corners[ 0 ][ i ];
+            d += s * s;
+        }
+
+        else if ( scenter[ i ] > corners[ 4 ][ i ] )
+        {
+            s = scenter[ i ] - corners[ 4 ][ i ];
+            d += s * s;
+        }
+
+    }
+
+    bool partial = ( d <= sradius );
+
+    if ( !partial )
+    {
+        return OUTSIDE;
+    }
+
+    else
+    {
+        return INTERSECT;
+    }
+
+
+}
+
+unsigned long white = 0xFFFFFFFF;
+
+unsigned short OctreeSceneManager::mIndexes[ 24 ] = {0, 1, 1, 2, 2, 3, 3, 0,       //back
+        0, 6, 6, 5, 5, 1,             //left
+        3, 7, 7, 4, 4, 2,             //right
+        6, 7, 5, 4 };          //front
+unsigned long OctreeSceneManager::mColors[ 8 ] = {white, white, white, white, white, white, white, white };
+
+
+OctreeSceneManager::OctreeSceneManager( ) : SceneManager()
+{
+    AxisAlignedBox b( -10000, -10000, -10000, 10000, 10000, 10000 );
+    int depth = 8; 
+    mOctree = 0;
+    init( b, depth );
+}
+
+OctreeSceneManager::OctreeSceneManager( AxisAlignedBox &box, int max_depth ) : SceneManager()
+{
+    mOctree = 0;
+    init( box, max_depth );
+}
+
+void OctreeSceneManager::init( AxisAlignedBox &box, int depth )
+{
+    delete mSceneRoot; //get rid of old root.
+
+    // -- Changes by Steve
+    // Don't do it this way, it will add it to the mSceneNodes which we don't want
+    //mSceneRoot = createSceneNode( "SceneRoot" );
+    mSceneRoot = new OctreeNode( this, "SceneRoot" );
+	mSceneRoot->_notifyRootNode();
+    // -- End changes by Steve
+
+    if ( mOctree != 0 )
+        delete mOctree;
+
+    mOctree = new Octree( 0 );
+#ifdef OGRE_COHERENT_OCCLUSION_CULLING
+	mNumOctreeNodes = 1;
+#endif // OGRE_COHERENT_OCCLUSION_CULLING
+    mMaxDepth = depth;
+    mBox = box;
+
+    mOctree -> mBox = box;
+
+    Vector3 min = box.getMinimum();
+
+    Vector3 max = box.getMaximum();
+
+    mOctree -> mHalfSize = ( max - min ) / 2;
+
+
+    mShowBoxes = false;
+
+    mCullCamera = false;
+
+    mNumObjects = 0;
+
+    Vector3 v( 1.5, 1.5, 1.5 );
+
+    mScaleFactor.setScale( v );
+
+
+
+    // setDisplaySceneNodes( true );
+    // setShowBoxes( true );
+
+    //
+    //setUseCullCamera( true );
+    //mSceneRoot isn't put into the octree since it has no volume.
+
+}
+
+OctreeSceneManager::~OctreeSceneManager()
+{
+    // -- Changed by Steve
+    // Don't do this here, SceneManager will do it
+    /*
+    if( mSceneRoot )
+    delete mSceneRoot;
+    */ 
+    // --End Changes by Steve
+
+    if ( mOctree )
+        delete mOctree;
+}
+
+Camera * OctreeSceneManager::createCamera( const String &name )
+{
+    Camera * c = new OctreeCamera( name, this );
+    mCameras.insert( CameraList::value_type( name, c ) );
+    return c;
+}
+
+void OctreeSceneManager::destroySceneNode( const String &name )
+{
+    OctreeNode * on = static_cast < OctreeNode* > ( getSceneNode( name ) );
+
+    if ( on != 0 )
+        _removeOctreeNode( on );
+
+    SceneManager::destroySceneNode( name );
+}
+
+bool OctreeSceneManager::getOptionValues( const String & key, StringVector  &refValueList )
+{
+    return SceneManager::getOptionValues( key, refValueList );
+}
+
+bool OctreeSceneManager::getOptionKeys( StringVector & refKeys )
+{
+    SceneManager::getOptionKeys( refKeys );
+    refKeys.push_back( "CullCamera" );
+    refKeys.push_back( "Size" );
+    refKeys.push_back( "ShowOctree" );
+    refKeys.push_back( "Depth" );
+
+    return true;
+}
+
+
+void OctreeSceneManager::_updateOctreeNode( OctreeNode * onode )
+{
+    AxisAlignedBox box = onode -> _getWorldAABB();
+
+    if ( box.isNull() )
+        return ;
+
+
+    if ( onode -> getOctant() == 0 )
+    {
+        //if outside the octree, force into the root node.
+        if ( ! onode -> _isIn( mOctree -> mBox ) )
+            mOctree->_addNode( onode );
+        else
+            _addOctreeNode( onode, mOctree );
+        return ;
+    }
+
+    if ( ! onode -> _isIn( onode -> getOctant() -> mBox ) )
+    {
+        _removeOctreeNode( onode );
+
+        //if outside the octree, force into the root node.
+        if ( ! onode -> _isIn( mOctree -> mBox ) )
+            mOctree->_addNode( onode );
+        else
+            _addOctreeNode( onode, mOctree );
+    }
+}
+
+/** Only removes the node from the octree.  It leaves the octree, even if it's empty.
+*/
+void OctreeSceneManager::_removeOctreeNode( OctreeNode * n )
+{
+    Octree * oct = n -> getOctant();
+
+    if ( oct )
+    {
+        oct -> _removeNode( n );
+    }
+
+    n->setOctant(0);
+}
+
+
+void OctreeSceneManager::_addOctreeNode( OctreeNode * n, Octree *octant, int depth )
+{
+
+    AxisAlignedBox bx = n -> _getWorldAABB();
+
+
+    //if the octree is twice as big as the scene node,
+    //we will add it to a child.
+    if ( ( depth < mMaxDepth ) && octant -> _isTwiceSize( bx ) )
+    {
+        int x, y, z;
+        octant -> _getChildIndexes( bx, &x, &y, &z );
+
+        if ( octant -> mChildren[ x ][ y ][ z ] == 0 )
+        {
+            octant -> mChildren[ x ][ y ][ z ] = new Octree( octant );
+#ifdef OGRE_COHERENT_OCCLUSION_CULLING
+	mNumOctreeNodes ++;
+#endif // OGRE_COHERENT_OCCLUSION_CULLING
+
+            const Vector3 *corners = octant -> mBox.getAllCorners();
+            Vector3 min, max;
+
+            if ( x == 0 )
+            {
+                min.x = corners[ 0 ].x;
+                max.x = ( corners[ 0 ].x + corners[ 4 ].x ) / 2;
+            }
+
+            else
+            {
+                min.x = ( corners[ 0 ].x + corners[ 4 ].x ) / 2;
+                max.x = corners[ 4 ].x;
+            }
+
+            if ( y == 0 )
+            {
+                min.y = corners[ 0 ].y;
+                max.y = ( corners[ 0 ].y + corners[ 4 ].y ) / 2;
+            }
+
+            else
+            {
+                min.y = ( corners[ 0 ].y + corners[ 4 ].y ) / 2;
+                max.y = corners[ 4 ].y;
+            }
+
+            if ( z == 0 )
+            {
+                min.z = corners[ 0 ].z;
+                max.z = ( corners[ 0 ].z + corners[ 4 ].z ) / 2;
+            }
+
+            else
+            {
+                min.z = ( corners[ 0 ].z + corners[ 4 ].z ) / 2;
+                max.z = corners[ 4 ].z;
+            }
+
+            octant -> mChildren[ x ][ y ][ z ] -> mBox.setExtents( min, max );
+            octant -> mChildren[ x ][ y ][ z ] -> mHalfSize = ( max - min ) / 2;
+        }
+
+		//matt: remove later
+		//OutputDebugString("adding octree node\n");
+		
+
+        _addOctreeNode( n, octant -> mChildren[ x ][ y ][ z ], ++depth );
+
+    }
+
+    else
+    {
+        octant -> _addNode( n );
+    }
+}
+
+
+SceneNode * OctreeSceneManager::createSceneNode( void )
+{
+    OctreeNode * on = new OctreeNode( this );
+    mSceneNodes[ on->getName() ] = on;
+    return on;
+}
+
+SceneNode * OctreeSceneManager::createSceneNode( const String &name )
+{
+    OctreeNode * on = new OctreeNode( this, name );
+    mSceneNodes[ on->getName() ] = on;
+    return on;
+}
+
+void OctreeSceneManager::_updateSceneGraph( Camera * cam )
+{
+    SceneManager::_updateSceneGraph( cam );
+}
+
+void OctreeSceneManager::_alertVisibleObjects( void )
+{
+    NodeList::iterator it = mVisible.begin();
+
+    while ( it != mVisible.end() )
+    {
+        OctreeNode * node = *it;
+
+        ++it;
+    }
+}
+
+void OctreeSceneManager::_findVisibleObjects( Camera * cam, bool onlyShadowCasters )
+{
+
+    getRenderQueue()->clear();
+    mBoxes.clear();
+    mVisible.clear();
+
+    if ( mCullCamera )
+    {
+        Camera * c = getCamera( "CullCamera" );
+
+        if ( c != 0 )
+            cam = getCamera( "CullCamera" );
+    }
+
+    mNumObjects = 0;
+
+    //walk the octree, adding all visible Octreenodes nodes to the render queue.
+    walkOctree( static_cast < OctreeCamera * > ( cam ), getRenderQueue(), mOctree, false, onlyShadowCasters );
+
+
+    // Show the octree boxes & cull camera if required
+    if ( mShowBoxes || mCullCamera )
+    {
+
+
+
+        if ( mShowBoxes )
+        {
+            for ( BoxList::iterator it = mBoxes.begin(); it != mBoxes.end(); ++it )
+            {
+                getRenderQueue()->addRenderable(*it);
+            }
+        }
+
+        if ( mCullCamera )
+        {
+            OctreeCamera * c = static_cast<OctreeCamera*>(getCamera( "CullCamera" ));
+
+            if ( c != 0 )
+            {
+                getRenderQueue()->addRenderable(c);
+            }
+        }
+
+    }
+
+
+
+}
+
+void OctreeSceneManager::walkOctree( OctreeCamera *camera, RenderQueue *queue,
+                                     Octree *octant, bool foundvisible, bool onlyShadowCasters )
+{
+
+    //return immediately if nothing is in the node.
+    if ( octant -> numNodes() == 0 )
+        return ;
+
+    OctreeCamera::Visibility v = OctreeCamera::NONE;
+
+    if ( foundvisible )
+    {
+        v = OctreeCamera::FULL;
+    }
+
+    else if ( octant == mOctree )
+    {
+        v = OctreeCamera::PARTIAL;
+    }
+
+    else
+    {
+        AxisAlignedBox box;
+        octant -> _getCullBounds( &box );
+        v = camera -> getVisibility( box );
+    }
+
+
+    // if the octant is visible, or if it's the root node...
+    if ( v != OctreeCamera::NONE )
+    {
+
+        //Add stuff to be rendered;
+        NodeList::iterator it = octant -> mNodes.begin();
+
+        if ( mShowBoxes )
+        {
+            mBoxes.push_back( octant->getWireBoundingBox() );
+        }
+
+        bool vis = true;
+
+        while ( it != octant -> mNodes.end() )
+        {
+            OctreeNode * sn = *it;
+
+            // if this octree is partially visible, manually cull all
+            // scene nodes attached directly to this level.
+
+            if ( v == OctreeCamera::PARTIAL )
+                vis = camera -> isVisible( sn -> _getWorldAABB() );
+
+            if ( vis )
+            {
+
+                mNumObjects++;
+                sn -> _addToRenderQueue(camera, queue, onlyShadowCasters );
+
+                mVisible.push_back( sn );
+
+                if ( mDisplayNodes )
+                    queue -> addRenderable( sn );
+
+                // check if the scene manager or this node wants the bounding box shown.
+                if (sn->getShowBoundingBox() || mShowBoundingBoxes)
+                    sn->_addBoundingBoxToQueue(queue);
+            }
+
+            ++it;
+        }
+
+        if ( octant -> mChildren[ 0 ][ 0 ][ 0 ] != 0 )
+            walkOctree( camera, queue, octant -> mChildren[ 0 ][ 0 ][ 0 ], ( v == OctreeCamera::FULL ), onlyShadowCasters );
+
+        if ( octant -> mChildren[ 1 ][ 0 ][ 0 ] != 0 )
+            walkOctree( camera, queue, octant -> mChildren[ 1 ][ 0 ][ 0 ], ( v == OctreeCamera::FULL ), onlyShadowCasters );
+
+        if ( octant -> mChildren[ 0 ][ 1 ][ 0 ] != 0 )
+            walkOctree( camera, queue, octant -> mChildren[ 0 ][ 1 ][ 0 ], ( v == OctreeCamera::FULL ), onlyShadowCasters );
+
+        if ( octant -> mChildren[ 1 ][ 1 ][ 0 ] != 0 )
+            walkOctree( camera, queue, octant -> mChildren[ 1 ][ 1 ][ 0 ], ( v == OctreeCamera::FULL ), onlyShadowCasters );
+
+        if ( octant -> mChildren[ 0 ][ 0 ][ 1 ] != 0 )
+            walkOctree( camera, queue, octant -> mChildren[ 0 ][ 0 ][ 1 ], ( v == OctreeCamera::FULL ), onlyShadowCasters );
+
+        if ( octant -> mChildren[ 1 ][ 0 ][ 1 ] != 0 )
+            walkOctree( camera, queue, octant -> mChildren[ 1 ][ 0 ][ 1 ], ( v == OctreeCamera::FULL ), onlyShadowCasters );
+
+        if ( octant -> mChildren[ 0 ][ 1 ][ 1 ] != 0 )
+            walkOctree( camera, queue, octant -> mChildren[ 0 ][ 1 ][ 1 ], ( v == OctreeCamera::FULL ), onlyShadowCasters );
+
+        if ( octant -> mChildren[ 1 ][ 1 ][ 1 ] != 0 )
+            walkOctree( camera, queue, octant -> mChildren[ 1 ][ 1 ][ 1 ], ( v == OctreeCamera::FULL ), onlyShadowCasters );
+
+    }
+
+}
+
+// --- non template versions
+void _findNodes( const AxisAlignedBox &t, std::list < SceneNode * > &list, SceneNode *exclude, bool full, Octree *octant )
+{
+
+	if ( !full )
+	{
+		AxisAlignedBox obox;
+		octant -> _getCullBounds( &obox );
+
+		Intersection isect = intersect( t, obox );
+
+		if ( isect == OUTSIDE )
+			return ;
+
+		full = ( isect == INSIDE );
+	}
+
+
+	NodeList::iterator it = octant -> mNodes.begin();
+
+	while ( it != octant -> mNodes.end() )
+	{
+		OctreeNode * on = ( *it );
+
+		if ( on != exclude )
+		{
+			if ( full )
+			{
+				list.push_back( on );
+			}
+
+			else
+			{
+				Intersection nsect = intersect( t, on -> _getWorldAABB() );
+
+				if ( nsect != OUTSIDE )
+				{
+					list.push_back( on );
+				}
+			}
+
+		}
+
+		++it;
+	}
+
+
+
+	if ( octant -> mChildren[ 0 ][ 0 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 0 ] );
+
+	if ( octant -> mChildren[ 1 ][ 0 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 0 ] );
+
+	if ( octant -> mChildren[ 0 ][ 1 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 0 ] );
+
+	if ( octant -> mChildren[ 1 ][ 1 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 0 ] );
+
+	if ( octant -> mChildren[ 0 ][ 0 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 1 ] );
+
+	if ( octant -> mChildren[ 1 ][ 0 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 1 ] );
+
+	if ( octant -> mChildren[ 0 ][ 1 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 1 ] );
+
+	if ( octant -> mChildren[ 1 ][ 1 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 1 ] );
+
+}
+
+void _findNodes( const Sphere &t, std::list < SceneNode * > &list, SceneNode *exclude, bool full, Octree *octant )
+{
+
+	if ( !full )
+	{
+		AxisAlignedBox obox;
+		octant -> _getCullBounds( &obox );
+
+		Intersection isect = intersect( t, obox );
+
+		if ( isect == OUTSIDE )
+			return ;
+
+		full = ( isect == INSIDE );
+	}
+
+
+	NodeList::iterator it = octant -> mNodes.begin();
+
+	while ( it != octant -> mNodes.end() )
+	{
+		OctreeNode * on = ( *it );
+
+		if ( on != exclude )
+		{
+			if ( full )
+			{
+				list.push_back( on );
+			}
+
+			else
+			{
+				Intersection nsect = intersect( t, on -> _getWorldAABB() );
+
+				if ( nsect != OUTSIDE )
+				{
+					list.push_back( on );
+				}
+			}
+
+		}
+
+		++it;
+	}
+
+
+
+	if ( octant -> mChildren[ 0 ][ 0 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 0 ] );
+
+	if ( octant -> mChildren[ 1 ][ 0 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 0 ] );
+
+	if ( octant -> mChildren[ 0 ][ 1 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 0 ] );
+
+	if ( octant -> mChildren[ 1 ][ 1 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 0 ] );
+
+	if ( octant -> mChildren[ 0 ][ 0 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 1 ] );
+
+	if ( octant -> mChildren[ 1 ][ 0 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 1 ] );
+
+	if ( octant -> mChildren[ 0 ][ 1 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 1 ] );
+
+	if ( octant -> mChildren[ 1 ][ 1 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 1 ] );
+
+}
+
+
+void _findNodes( const PlaneBoundedVolume &t, std::list < SceneNode * > &list, SceneNode *exclude, bool full, Octree *octant )
+{
+
+	if ( !full )
+	{
+		AxisAlignedBox obox;
+		octant -> _getCullBounds( &obox );
+
+		Intersection isect = intersect( t, obox );
+
+		if ( isect == OUTSIDE )
+			return ;
+
+		full = ( isect == INSIDE );
+	}
+
+
+	NodeList::iterator it = octant -> mNodes.begin();
+
+	while ( it != octant -> mNodes.end() )
+	{
+		OctreeNode * on = ( *it );
+
+		if ( on != exclude )
+		{
+			if ( full )
+			{
+				list.push_back( on );
+			}
+
+			else
+			{
+				Intersection nsect = intersect( t, on -> _getWorldAABB() );
+
+				if ( nsect != OUTSIDE )
+				{
+					list.push_back( on );
+				}
+			}
+
+		}
+
+		++it;
+	}
+
+
+
+	if ( octant -> mChildren[ 0 ][ 0 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 0 ] );
+
+	if ( octant -> mChildren[ 1 ][ 0 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 0 ] );
+
+	if ( octant -> mChildren[ 0 ][ 1 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 0 ] );
+
+	if ( octant -> mChildren[ 1 ][ 1 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 0 ] );
+
+	if ( octant -> mChildren[ 0 ][ 0 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 1 ] );
+
+	if ( octant -> mChildren[ 1 ][ 0 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 1 ] );
+
+	if ( octant -> mChildren[ 0 ][ 1 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 1 ] );
+
+	if ( octant -> mChildren[ 1 ][ 1 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 1 ] );
+
+}
+
+void _findNodes( const Ray &t, std::list < SceneNode * > &list, SceneNode *exclude, bool full, Octree *octant )
+{
+
+	if ( !full )
+	{
+		AxisAlignedBox obox;
+		octant -> _getCullBounds( &obox );
+
+		Intersection isect = intersect( t, obox );
+
+		if ( isect == OUTSIDE )
+			return ;
+
+		full = ( isect == INSIDE );
+	}
+
+
+	NodeList::iterator it = octant -> mNodes.begin();
+
+	while ( it != octant -> mNodes.end() )
+	{
+		OctreeNode * on = ( *it );
+
+		if ( on != exclude )
+		{
+			if ( full )
+			{
+				list.push_back( on );
+			}
+
+			else
+			{
+				Intersection nsect = intersect( t, on -> _getWorldAABB() );
+
+				if ( nsect != OUTSIDE )
+				{
+					list.push_back( on );
+				}
+			}
+
+		}
+
+		++it;
+	}
+
+
+
+	if ( octant -> mChildren[ 0 ][ 0 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 0 ] );
+
+	if ( octant -> mChildren[ 1 ][ 0 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 0 ] );
+
+	if ( octant -> mChildren[ 0 ][ 1 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 0 ] );
+
+	if ( octant -> mChildren[ 1 ][ 1 ][ 0 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 0 ] );
+
+	if ( octant -> mChildren[ 0 ][ 0 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 1 ] );
+
+	if ( octant -> mChildren[ 1 ][ 0 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 1 ] );
+
+	if ( octant -> mChildren[ 0 ][ 1 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 1 ] );
+
+	if ( octant -> mChildren[ 1 ][ 1 ][ 1 ] != 0 )
+		_findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 1 ] );
+
+}
+
+void OctreeSceneManager::findNodesIn( const AxisAlignedBox &box, std::list < SceneNode * > &list, SceneNode *exclude )
+{
+    _findNodes( box, list, exclude, false, mOctree );
+}
+
+void OctreeSceneManager::findNodesIn( const Sphere &sphere, std::list < SceneNode * > &list, SceneNode *exclude )
+{
+    _findNodes( sphere, list, exclude, false, mOctree );
+}
+
+void OctreeSceneManager::findNodesIn( const PlaneBoundedVolume &volume, std::list < SceneNode * > &list, SceneNode *exclude )
+{
+    _findNodes( volume, list, exclude, false, mOctree );
+}
+
+void OctreeSceneManager::findNodesIn( const Ray &r, std::list < SceneNode * > &list, SceneNode *exclude )
+{
+    _findNodes( r, list, exclude, false, mOctree );
+}
+
+void OctreeSceneManager::resize( const AxisAlignedBox &box )
+{
+    std::list < SceneNode * > nodes;
+    std::list < SceneNode * > ::iterator it;
+
+    _findNodes( mOctree->mBox, nodes, 0, true, mOctree );
+
+    delete mOctree;
+
+    mOctree = new Octree( 0 );
+#ifdef OGRE_COHERENT_OCCLUSION_CULLING
+	mNumOctreeNodes = 1;
+#endif // OGRE_COHERENT_OCCLUSION_CULLING
+    mOctree->mBox = box;
+
+    it = nodes.begin();
+
+    while ( it != nodes.end() )
+    {
+        OctreeNode * on = static_cast < OctreeNode * > ( *it );
+        on -> setOctant( 0 );
+        _updateOctreeNode( on );
+        ++it;
+    }
+
+}
+
+bool OctreeSceneManager::setOption( const String & key, const void * val )
+{
+    if ( key == "Size" )
+    {
+        resize( * static_cast < const AxisAlignedBox * > ( val ) );
+        return true;
+    }
+
+    else if ( key == "Depth" )
+    {
+        mMaxDepth = * static_cast < const int * > ( val );
+        resize( mOctree->mBox );
+        return true;
+    }
+
+    else if ( key == "ShowOctree" )
+    {
+        mShowBoxes = * static_cast < const bool * > ( val );
+        return true;
+    }
+
+    else if ( key == "CullCamera" )
+    {
+        mCullCamera = * static_cast < const bool * > ( val );
+        return true;
+    }
+
+    return SceneManager::setOption( key, val );
+
+
+}
+
+bool OctreeSceneManager::getOption( const String & key, void *val )
+{
+    if ( key == "Size" )
+    {
+        AxisAlignedBox * b = static_cast < AxisAlignedBox * > ( val );
+        b -> setExtents( mOctree->mBox.getMinimum(), mOctree->mBox.getMaximum() );
+        return true;
+    }
+
+    else if ( key == "Depth" )
+    {
+        * static_cast < int * > ( val ) = mMaxDepth;
+        return true;
+    }
+
+    else if ( key == "ShowOctree" )
+    {
+
+        * static_cast < bool * > ( val ) = mShowBoxes;
+        return true;
+    }
+
+    else if ( key == "CullCamera" )
+    {
+        * static_cast < bool * > ( val ) = mCullCamera;
+        return true;
+    }
+
+    return SceneManager::getOption( key, val );
+
+}
+
+void OctreeSceneManager::clearScene(void)
+{
+    SceneManager::clearScene();
+    init(mBox, mMaxDepth);
+
+}
+
+//---------------------------------------------------------------------
+AxisAlignedBoxSceneQuery*
+OctreeSceneManager::createAABBQuery(const AxisAlignedBox& box, unsigned long mask)
+{
+    OctreeAxisAlignedBoxSceneQuery* q = new OctreeAxisAlignedBoxSceneQuery(this);
+    q->setBox(box);
+    q->setQueryMask(mask);
+    return q;
+}
+//---------------------------------------------------------------------
+SphereSceneQuery*
+OctreeSceneManager::createSphereQuery(const Sphere& sphere, unsigned long mask)
+{
+    OctreeSphereSceneQuery* q = new OctreeSphereSceneQuery(this);
+    q->setSphere(sphere);
+    q->setQueryMask(mask);
+    return q;
+}
+//---------------------------------------------------------------------
+PlaneBoundedVolumeListSceneQuery*
+OctreeSceneManager::createPlaneBoundedVolumeQuery(const PlaneBoundedVolumeList& volumes,
+        unsigned long mask)
+{
+    OctreePlaneBoundedVolumeListSceneQuery* q = new OctreePlaneBoundedVolumeListSceneQuery(this);
+    q->setVolumes(volumes);
+    q->setQueryMask(mask);
+    return q;
+}
+
+//---------------------------------------------------------------------
+RaySceneQuery*
+OctreeSceneManager::createRayQuery(const Ray& ray, unsigned long mask)
+{
+    OctreeRaySceneQuery* q = new OctreeRaySceneQuery(this);
+    q->setRay(ray);
+    q->setQueryMask(mask);
+    return q;
+}
+//---------------------------------------------------------------------
+IntersectionSceneQuery*
+OctreeSceneManager::createIntersectionQuery(unsigned long mask)
+{
+
+    // Octree implementation performs WORSE for < 500 objects
+    // TODO: optimise it so it's better in all cases
+    //OctreeIntersectionSceneQuery* q = new OctreeIntersectionSceneQuery(this);
+    DefaultIntersectionSceneQuery* q = new DefaultIntersectionSceneQuery(this);
+    q->setQueryMask(mask);
+    return q;
+}
+#ifdef OGRE_COHERENT_OCCLUSION_CULLING
+//-----------------------------------------------------------------------
+void OctreeSceneManager::_renderOctant(Camera *cam, Octree *octant)
+{
+	//Add stuff to be rendered;
+    NodeList::iterator it = octant->mNodes.begin();
+         
+    while(it != octant->mNodes.end())
+    {
+		OctreeNode *sn = *it;
+
+        mNumObjects++;
+
+		// check bounding box visibility of scene nodes
+		if (cam->isVisible(sn->_getWorldAABB()))
+		{
+			sn->_addToRenderQueue(cam, getRenderQueue(), false);
+			//node->_findVisibleObjects(cam, getRenderQueue(), false, mDisplayNodes, false);
+			mVisible.push_back(sn);
+
+			if (mDisplayNodes)
+				getRenderQueue()->addRenderable(sn);
+
+			// check if the scene manager or this node wants the bounding box shown.
+			if (sn->getShowBoundingBox() || mShowBoundingBoxes)
+				sn->_addBoundingBoxToQueue(getRenderQueue());
+
+			if (mShowBoxes)
+				getRenderQueue()->addRenderable(octant->getWireBoundingBox());
+		}
+        ++it;
+	}
+
+	SceneManager::_renderVisibleObjects();
+
+	// delete all rendered objects from renderqueue
+	_deleteRenderedQueueGroups();
+}
+#endif // OGRE_COHERENT_OCCLUSION_CULLING
+}
Index: /tags/DummyModules/VUT/work/ogre_changes/RenderSystem/GL/include/OgreGLHardwareOcclusionQuery.h
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/RenderSystem/GL/include/OgreGLHardwareOcclusionQuery.h	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/RenderSystem/GL/include/OgreGLHardwareOcclusionQuery.h	(revision 61)
@@ -0,0 +1,133 @@
+/*
+-----------------------------------------------------------------------------
+This source file is part of OGRE
+    (Object-oriented Graphics Rendering Engine)
+For the latest info, see http://ogre.sourceforge.net/
+
+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.
+-----------------------------------------------------------------------------
+*/
+
+/*
+The nVidia occlusion query extension is defined in glext.h so you don't 
+need anything else. You do need to look up the function, we provide a 
+GLSupport class to do this, which has platform implementations for 
+getProcAddress. Check the way that extensions like glActiveTextureARB are 
+initialised and used in glRenderSystem and copy what is done there.
+
+
+
+  To do: fix so dx7 and DX9 checks and flags if HW Occlusion is supported
+  See the openGl dito for ideas what to do.
+
+*/
+
+
+
+//GL_ActiveTextureARB_Func* glActiveTextureARB_ptr = (GL_ActiveTextureARB_Func)mGLSupport->getProcAddress("glActiveTextureARB");
+
+#ifndef __GLHARDWAREOCCLUSIONQUERY_H__
+#define __GLHARDWAREOCCLUSIONQUERY_H__
+
+#include "OgreGLPrerequisites.h"
+#include "OgreHardwareOcclusionQuery.h"
+
+
+namespace Ogre { 
+
+
+// If you use multiple rendering passes you can test only the first pass and all other passes don't have to be rendered 
+// if the first pass resultet has too few pixels visable.
+
+// Be sure to render all occlluder first and whats out so the RenderQue don't switch places on 
+// the occluding objects and the tested objects because it thinks it's more effective..
+
+
+/**
+  * This is a class that is the base class of the query class for 
+  * hardware occlusion.
+  *
+  * @author Lee Sandberg email: lee@abcmedia.se
+  */
+
+class GLHardwareOcclusionQuery : public HardwareOcclusionQuery
+{
+//----------------------------------------------------------------------
+// Public methods
+//--
+public:
+	/**
+	  * Default object constructor
+	  * 
+	  */
+	GLHardwareOcclusionQuery();
+	/**
+	  * Object destructor
+	  */
+	~GLHardwareOcclusionQuery();
+
+	//------------------------------------------------------------------
+	// Occlusion query functions (see base class documentation for this)
+	//--
+
+	void beginOcclusionQuery();
+	void endOcclusionQuery();
+	bool pullOcclusionQuery( unsigned int* NumOfFragments);
+	bool pullOcclusionQuery( unsigned int* NumOfFragments, const HW_OCCLUSIONQUERY flag  ); 
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	bool resultAvailable();
+#endif
+	unsigned int getLastQuerysPixelcount() { return m_uintPixelCount; }
+
+	// This functions are optional, it's a simple filter that simply skipps some hardware occlusion tests on visable objects only
+	// It's easy to use if you don't have to keep track on which objects are visable (can be skipped) and what objects arn't visable..
+	// (None visable objects and object you introduce for the first time have allways to be tested allthough the cheepest possible 
+	// LOD (Level Of Detail) mesh and material wize). 
+
+	/**
+	  *   
+	  * Remarks This function allows you to set how often the hardware occlusion really sent to the driver
+	  * if you set it to 0 every hw occlusion test is acctually made. If you set it to 2 only 50% of your queries are sent. 
+	  * for all visable objects. 3 will result in 33% of all queries to acctualy be sent and so on. 
+	  * New and none visable objects will be tested all the time.
+	  * This functionality is here because this class can keep track on visable and none visable objects for you.
+	  * Once you you set the SkipRate for any hardware occlusion instance it effects all others.
+	  */
+
+	void setSkipRate( int skip ) { m_Skip = skip; }		// Using 2 only 50 % of the tests are actully made and 3 results in only 33% of the tests. So on.
+	int	 getSkipRate() { return m_Skip; } 
+
+
+//----------------------------------------------------------------------
+// Protected members
+//--
+protected:
+
+	unsigned int	m_uintPixelCount;
+	unsigned int	m_uintQuery[1];
+	bool			m_bOcclusionQuery;
+	int				m_SkipCounter;		// m_SkipConter =  m_SkipConter % m_Skip; if ( m_SkipConter == 0 && m_uintPixelCount !=0 ) TestHWOcclusion else just return 
+	static int		m_Skip;				// This is shared by all instancies
+	bool			m_bHWOcclusionSupport;
+};
+
+
+}
+
+#endif 
+
Index: /tags/DummyModules/VUT/work/ogre_changes/RenderSystem/GL/src/OgreGLHardwareOcclusionQuery.cpp
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/RenderSystem/GL/src/OgreGLHardwareOcclusionQuery.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/RenderSystem/GL/src/OgreGLHardwareOcclusionQuery.cpp	(revision 61)
@@ -0,0 +1,169 @@
+/*
+-----------------------------------------------------------------------------
+This source file is part of OGRE
+    (Object-oriented Graphics Rendering Engine)
+For the latest info, see http://ogre.sourceforge.net/
+
+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.
+-----------------------------------------------------------------------------
+*/
+
+#include "OgreGLHardwareOcclusionQuery.h"
+#include "OgreException.h"
+
+namespace Ogre {
+
+int GLHardwareOcclusionQuery::m_Skip = 0;
+
+/**
+  * This is a class that is the base class of the query class for 
+  * hardware occlusion testing.
+  *
+  * @author Lee Sandberg email: lee@abcmedia.se
+  */
+
+/* Functions used;
+
+glGenOcclusionQueriesNV_ptr( 1, m_uintQuery );
+glDeleteOcclusionQueriesNV_ptr( 1, &m_uintQuery[0] );
+glBeginOcclusionQueryNV_ptr( m_uintQuery[0] );
+glEndOcclusionQueryNV_ptr();
+glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_NV, NumOfFragments );
+
+  TO DO: change this to the new ARB functions...
+
+*/
+
+
+/**
+  * Default object constructor
+  * 
+  */
+GLHardwareOcclusionQuery::GLHardwareOcclusionQuery() 
+{ 
+	m_uintPixelCount = 0; 
+	m_SkipCounter = 0;
+
+	// Check for hardware occlusion support
+    if( glDeleteOcclusionQueriesNV_ptr != 0 )	// This is a hack to see if hw occlusion is supported. pointer is 0 if it's not supported.
+    {
+		m_bHWOcclusionSupport = true;
+	}
+	else
+	{
+		m_bHWOcclusionSupport = false;
+	}
+
+	if( m_bHWOcclusionSupport )
+	{
+		glGenOcclusionQueriesNV_ptr( 1, m_uintQuery );	
+	}
+}
+
+
+/**
+  * Object destructor
+  */
+GLHardwareOcclusionQuery::~GLHardwareOcclusionQuery() 
+{ 
+	if( m_bHWOcclusionSupport )
+	{
+		glDeleteOcclusionQueriesNV_ptr( 1, &m_uintQuery[0] );  
+	}	
+}
+
+//------------------------------------------------------------------
+// Occlusion query functions (see base class documentation for this)
+//--
+void GLHardwareOcclusionQuery::beginOcclusionQuery() 
+{ 
+	if( m_bHWOcclusionSupport )	// Make it fail silently if hardware occlusion isn't supported
+	{
+		//if  ( m_SkipCounter ==  m_Skip ) { m_SkipCounter = 0; };		// Counter starts at 0 again at m_Skip 
+		//if ( m_SkipCounter == 0 && m_uintPixelCount != 0 ) // New or none visable objects must allways be tested but visable objects can be skiped
+		//{
+			glBeginOcclusionQueryNV_ptr( m_uintQuery[0] );
+		//}
+	}
+}
+	
+void GLHardwareOcclusionQuery::endOcclusionQuery() 
+{ 
+	if( m_bHWOcclusionSupport )	// Make it fail silently if hardware occlusion isn't supported
+	{
+		//if( m_SkipCounter == 0 && m_uintPixelCount != 0 ) // New or none visable objects must allways be tested but visable objects can be skiped
+		//{
+			glEndOcclusionQueryNV_ptr();
+		//}
+		//m_SkipCounter++;
+	}
+}
+
+bool GLHardwareOcclusionQuery::pullOcclusionQuery( unsigned int * NumOfFragments) 
+{
+	if( m_bHWOcclusionSupport )	// Make it fail silently if hardware occlusion isn't supported
+	{
+		glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_NV, NumOfFragments );
+	} 
+	else
+	{
+		*NumOfFragments = 100000;		// Fails quitlly -> every object tested is visable.
+	}
+
+	m_uintPixelCount = *NumOfFragments; 
+
+	return true;
+}
+
+//------------------------------------------------------------------
+// OpenGL dosn't use the flag, but to fulfil the abstract interface we need to include this function.
+// Using this function in OpenGL mode simple works the same way as calling the other function without the flag parameter,
+// but in DX9 it works differentlly, see notes in the DX9 implementation.
+//--
+bool GLHardwareOcclusionQuery::pullOcclusionQuery( unsigned int* NumOfFragments, const HW_OCCLUSIONQUERY flag  ) 
+{
+	if( m_bHWOcclusionSupport )	// Make it fail silently if hardware occlusion isn't supported
+	{
+		glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_NV, NumOfFragments );
+	}
+	else
+	{
+		*NumOfFragments = 100000;		// Fails quitlly -> every object tested is visable.
+	}
+
+	m_uintPixelCount = *NumOfFragments; 
+	
+	return true;
+}
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+bool GLHardwareOcclusionQuery::resultAvailable()
+{
+	unsigned int result = GL_TRUE;
+
+	if( m_bHWOcclusionSupport )	// Make it fail silently if hardware occlusion isn't supported
+	{
+		glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_NV, &result );
+	}
+
+	return result == GL_TRUE;
+}
+#endif
+}
+
+
Index: /tags/DummyModules/VUT/work/ogre_changes/RenderSystem/Direct3D9/include/OgreD3D9HardwareOcclusionQuery.h
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/RenderSystem/Direct3D9/include/OgreD3D9HardwareOcclusionQuery.h	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/RenderSystem/Direct3D9/include/OgreD3D9HardwareOcclusionQuery.h	(revision 61)
@@ -0,0 +1,116 @@
+/*
+-----------------------------------------------------------------------------
+This source file is part of OGRE
+    (Object-oriented Graphics Rendering Engine)
+For the latest info, see http://ogre.sourceforge.net/
+
+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.
+-----------------------------------------------------------------------------
+*/
+
+#ifndef _D3D9HARWAREOCCLUSIONQUERY_H__
+#define _D3D9HARWAREOCCLUSIONQUERY_H__
+
+#include "OgreD3D9Prerequisites.h"
+#include "OgreHardwareOcclusionQuery.h"
+
+
+namespace Ogre {
+
+
+
+// If you use multiple rendering passes you can test only the first pass and all other passes don't have to be rendered 
+// if the first pass resultet has too few pixels visable.
+
+// Be sure to render all occlluder first and whats out so the RenderQue don't switch places on 
+// the occluding objects and the tested objects because it thinks it's more effective..
+
+/**
+  * This is a class that is the DirectX9 implementation of 
+  * hardware occlusion testing.
+  *
+  * @author Lee Sandberg, email lee@abcmedia.se
+  */
+class D3D9HardwareOcclusionQuery : public HardwareOcclusionQuery
+{
+//----------------------------------------------------------------------
+// Public methods
+//--
+public:
+
+	/**
+	  * Default object constructor
+	  * 
+	  */
+	D3D9HardwareOcclusionQuery( IDirect3DDevice9* pD3DDevice );
+
+	/**
+	  * Object destructor
+	  */
+	~D3D9HardwareOcclusionQuery();
+
+	//------------------------------------------------------------------
+	// Occlusion query functions (see base class documentation for this)
+	//--
+
+	void beginOcclusionQuery();	
+	void endOcclusionQuery();
+	bool pullOcclusionQuery( unsigned int* NumOfFragments);
+	bool pullOcclusionQuery( unsigned int* NumOfFragments, const HW_OCCLUSIONQUERY flag  );
+	unsigned int getLastQuerysPixelcount() { return m_uintPixelCount; }
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	bool resultAvailable();
+#endif
+	// This functions are optional, it's a simple filter that simply skipps some hardware occlusion tests on visable objects only
+	// It's easy to use if you don't have to keep track on which objects are visable (can be skipped) and what objects arn't visable..
+	// (None visable objects and object you introduce for the first time have allways to be tested allthough the cheepest possible 
+	// LOD (Level Of Detail) mesh and material wize). 
+
+	/**
+	  *   
+	  * Remarks This function allows you to set how often the hardware occlusion really are sent to the driver
+	  * if you set it to 0 every hw occlusion test is acctually made. If you set it to 1 only the half of your queries are sent 
+	  * for all visable objects. 2 will result in 25% of all queries to acctualy be sent. 
+	  * New and none visable objects will be tested all the time.
+	  * This functionality is here because this class can keep track on visable and none visable objects for you.
+	  * Once you you set the SkipRate for any hardware occlusion instance it effects all others.
+	  */
+
+
+	void setSkipRate( int skip ) { m_Skip = skip; }			// Using 2 only 50 % of the tests are actully made and 3 results in only 33% of the tests. So on.
+	int	 getSkipRate() { return m_Skip; } 
+
+//----------------------------------------------------------------------
+// Protected members
+//--
+protected:
+
+	unsigned int		m_uintPixelCount;		
+	IDirect3DQuery9*	m_pD3DQuery;
+	IDirect3DDevice9*   m_pD3DDevice;       // d3d device
+	bool				m_bOcclusionQuery;
+	int					m_SkipCounter;		// m_SkipConter =  m_SkipConter % m_Skip; if ( m_SkipConter == 0 && m_uintPixelCount !=0 ) TestHWOcclusion else just return 
+	static int			m_Skip;				// This is shared by all instancies
+	bool				m_bHWOcclusionSupport;
+};
+
+
+}
+
+
+#endif
Index: /tags/DummyModules/VUT/work/ogre_changes/RenderSystem/Direct3D9/src/OgreD3D9HardwareOcclusionQuery.cpp
===================================================================
--- /tags/DummyModules/VUT/work/ogre_changes/RenderSystem/Direct3D9/src/OgreD3D9HardwareOcclusionQuery.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/ogre_changes/RenderSystem/Direct3D9/src/OgreD3D9HardwareOcclusionQuery.cpp	(revision 61)
@@ -0,0 +1,193 @@
+/*
+-----------------------------------------------------------------------------
+This source file is part of OGRE
+    (Object-oriented Graphics Rendering Engine)
+For the latest info, see http://ogre.sourceforge.net/
+
+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.
+-----------------------------------------------------------------------------
+*/
+#include "OgreD3D9HardwareOcclusionQuery.h"
+#include "OgreRenderSystemCapabilities.h"
+#include "OgreException.h"
+
+namespace Ogre {
+
+int D3D9HardwareOcclusionQuery::m_Skip = 0;
+
+/**
+  * This is a class that is the DirectX9 implementation of 
+  * hardware occlusion testing.
+  *
+  * @author Lee Sandberg
+  */
+
+/**
+  * Default object constructor
+  * 
+  */
+D3D9HardwareOcclusionQuery::D3D9HardwareOcclusionQuery( IDirect3DDevice9* pD3DDevice ) 
+{ 
+	m_pD3DDevice = pD3DDevice;
+	m_uintPixelCount = 0; 
+	m_SkipCounter = 0;
+	m_bHWOcclusionSupport = false;
+
+	HRESULT hr = m_pD3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, &m_pD3DQuery);
+	if ( hr != D3D_OK ) 
+	{
+		//OGRE_EXCEPT(hr, "D3D9HardwareOcclusionQuery couldn't create hardware occlusion query object.", 
+        //        "D3D9HardwareOcclusionQuery::D3D9HardwareOcclusionQuery");
+		m_bHWOcclusionSupport = false;
+	}
+	else 
+	{
+		m_bHWOcclusionSupport = true;
+	}
+}
+
+
+/**
+  * Object destructor
+  */
+D3D9HardwareOcclusionQuery::~D3D9HardwareOcclusionQuery() 
+{ 
+	SAFE_RELEASE( m_pD3DQuery ); 
+}
+
+//------------------------------------------------------------------
+// Occlusion query functions (see base class documentation for this)
+//--
+void D3D9HardwareOcclusionQuery::beginOcclusionQuery() 
+{ 
+	if( m_bHWOcclusionSupport )		// Make it fail silently if hardware occlusion isn't supported
+	{
+		if  ( m_SkipCounter ==  m_Skip ) { m_SkipCounter = 0; };		// Counter starts at 0 again at m_Skip 
+		
+		if ( m_SkipCounter == 0 && m_uintPixelCount != 0 )	// New or none visable objects must allways be tested but visable objects can be skiped
+		{
+			m_pD3DQuery->Issue(D3DISSUE_BEGIN); 
+		}
+	}
+}
+	
+void D3D9HardwareOcclusionQuery::endOcclusionQuery() 
+{ 
+	if( m_bHWOcclusionSupport )	// Make it fail silently if hardware occlusion isn't supported
+	{
+		if (m_SkipCounter == 0 && m_uintPixelCount != 0 ) // New or none visable objects must allways be tested but visable objects can be skiped
+		{
+			m_pD3DQuery->Issue(D3DISSUE_END); 
+		}
+		m_SkipCounter++;								 // The skip counter is increased 
+	}
+}
+
+//------------------------------------------------------------------
+// This version of pullOcclusionQuery cases the DX9 API/Driver to flush all commands to the 3D card
+// to allow a fast result from the query, but at the cost of poorer batching of API calls to the card.
+// Note: OpenGL dosn't use this flag at all so the application running OpenGL won't display any different behaviour.
+//--
+bool D3D9HardwareOcclusionQuery::pullOcclusionQuery( unsigned int* NumOfFragments) 
+{
+	HRESULT hr;
+	
+	if( m_bHWOcclusionSupport )	// Make it fail silently if hardware occlusion isn't supported
+	{
+		hr = m_pD3DQuery->GetData( NumOfFragments, sizeof( NumOfFragments ), D3DGETDATA_FLUSH );
+
+		if ( hr != S_OK ) 
+			{
+				return false; 
+			}
+			else 
+			{ 
+				m_uintPixelCount = *NumOfFragments; 
+				return true; 
+			}
+	}
+	else
+	{
+		m_uintPixelCount = 100000; // Fails quitlly if hardware occlusion is not supported - every object is visable
+		return true;
+	}
+}
+
+//------------------------------------------------------------------
+// This version of pullOcclusionQuery cases the DX9 API/Driver to not flush all commands to the 3D card
+// to allow a fast result from the query, but the batching of API calls to the card will be normal. 
+// But the query wont be processed until the card recives the query in the nexr batch.
+// Note: OpenGL dosn't use this flag at all so the application running OpenGL won't display any different behaviour.
+//--
+bool D3D9HardwareOcclusionQuery::pullOcclusionQuery( unsigned int* NumOfFragments, const HW_OCCLUSIONQUERY flag  ) 
+{
+	HRESULT hr;
+
+	// TO DO: USE lockOpts= D3D9Mappings::get(options); instead of RS_OCCLUSIONQUERY enum
+
+	if( m_bHWOcclusionSupport )	// Make it fail silently if hardware occlusion isn't supported
+	{
+	
+		switch( flag )
+		{
+			case HWOCCLUSIONQUERY_FLUSH : 	
+				hr = m_pD3DQuery->GetData( NumOfFragments, sizeof( NumOfFragments ), D3DGETDATA_FLUSH );
+			break;
+
+			case HWOCCLUSIONQUERY_NOFLUSH :	
+				hr = m_pD3DQuery->GetData( NumOfFragments, sizeof( NumOfFragments ), 0 );
+			break;
+		};
+
+
+
+		if ( hr != S_OK ) 
+			{
+				return false; 
+			}
+			else 
+			{ 
+				m_uintPixelCount = *NumOfFragments; 
+				return true; 
+			}
+	}
+	else 
+	{
+		m_uintPixelCount = 100000; // Fails quitlly if hardware occlusion is not supported - every object is visable
+		return true;
+	}
+}
+
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+
+bool D3D9HardwareOcclusionQuery::resultAvailable()
+{
+	bool result = true;
+
+	if( m_bHWOcclusionSupport )	// Make it fail silently if hardware occlusion isn't supported
+	{	//TODO: implement
+		//glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_NV, &result );
+	}
+
+	return result;
+}
+
+#endif // GTP_VISIBILITY_MODIFIED_OGRE
+
+}
Index: /tags/DummyModules/VUT/work/tinyxml/tinyxmlerror.cpp
===================================================================
--- /tags/DummyModules/VUT/work/tinyxml/tinyxmlerror.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/tinyxml/tinyxmlerror.cpp	(revision 61)
@@ -0,0 +1,50 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+
+This software is provided 'as-is', without any express or implied 
+warranty. In no event will the authors be held liable for any 
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any 
+purpose, including commercial applications, and to alter it and 
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+*/
+
+#include "tinyxml.h"
+
+// The goal of the seperate error file is to make the first
+// step towards localization. tinyxml (currently) only supports
+// latin-1, but at least the error messages could now be translated.
+//
+// It also cleans up the code a bit.
+//
+
+const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] =
+{
+	"No error",
+	"Error",
+	"Failed to open file",
+	"Memory allocation failed.",
+	"Error parsing Element.",
+	"Failed to read Element name",
+	"Error reading Element value.",
+	"Error reading Attributes.",
+	"Error: empty tag.",
+	"Error reading end tag.",
+	"Error parsing Unknown.",
+	"Error parsing Comment.",
+	"Error parsing Declaration.",
+	"Error document empty."
+};
Index: /tags/DummyModules/VUT/work/tinyxml/tinystr.h
===================================================================
--- /tags/DummyModules/VUT/work/tinyxml/tinystr.h	(revision 61)
+++ /tags/DummyModules/VUT/work/tinyxml/tinystr.h	(revision 61)
@@ -0,0 +1,228 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original file by Yves Berquin.
+
+This software is provided 'as-is', without any express or implied 
+warranty. In no event will the authors be held liable for any 
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any 
+purpose, including commercial applications, and to alter it and 
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must 
+not claim that you wrote the original software. If you use this 
+software in a product, an acknowledgment in the product documentation 
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source 
+distribution.
+*/
+
+#include "tinyxml.h"
+
+
+#ifndef TIXML_USE_STL
+
+#ifndef TIXML_STRING_INCLUDED
+#define TIXML_STRING_INCLUDED
+
+#pragma warning( disable : 4514 )
+
+#include <assert.h>
+
+/**
+   TiXmlString is an emulation of the std::string template.
+   Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.
+   Only the member functions relevant to the TinyXML project have been implemented.
+   The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase
+   a string and there's no more room, we allocate a buffer twice as big as we need.
+*/
+class TiXmlString
+{
+  public :
+    // TiXmlString constructor, based on a string
+    TiXmlString (const char * instring);
+
+    // TiXmlString empty constructor
+    TiXmlString ()
+    {
+        allocated = 0;
+        cstring = NULL;
+    }
+
+    // TiXmlString copy constructor
+    TiXmlString (const TiXmlString& copy);
+
+    // TiXmlString destructor
+    ~ TiXmlString ()
+    {
+        empty_it ();
+    }
+
+    // Convert a TiXmlString into a classical char *
+    const char * c_str () const
+    {
+        if (allocated)
+            return cstring;
+        return "";
+    }
+
+    // Return the length of a TiXmlString
+    unsigned length () const;
+
+    // TiXmlString = operator
+    void operator = (const char * content);
+
+    // = operator
+    void operator = (const TiXmlString & copy);
+
+    // += operator. Maps to append
+    TiXmlString& operator += (const char * suffix)
+    {
+        append (suffix);
+		return *this;
+    }
+
+    // += operator. Maps to append
+    TiXmlString& operator += (char single)
+    {
+        append (single);
+		return *this;
+    }
+
+    // += operator. Maps to append
+    TiXmlString& operator += (TiXmlString & suffix)
+    {
+        append (suffix);
+		return *this;
+    }
+    bool operator == (const TiXmlString & compare) const;
+    bool operator < (const TiXmlString & compare) const;
+    bool operator > (const TiXmlString & compare) const;
+
+    // Checks if a TiXmlString is empty
+    bool empty () const
+    {
+        return length () ? false : true;
+    }
+
+    // Checks if a TiXmlString contains only whitespace (same rules as isspace)
+	// Not actually used in tinyxml. Conflicts with a C macro, "isblank",
+	// which is a problem. Commenting out. -lee
+//    bool isblank () const;
+
+    // single char extraction
+    const char& at (unsigned index) const
+    {
+        assert( index < length ());
+        return cstring [index];
+    }
+
+    // find a char in a string. Return TiXmlString::notfound if not found
+    unsigned find (char lookup) const
+    {
+        return find (lookup, 0);
+    }
+
+    // find a char in a string from an offset. Return TiXmlString::notfound if not found
+    unsigned find (char tofind, unsigned offset) const;
+
+    /*	Function to reserve a big amount of data when we know we'll need it. Be aware that this
+		function clears the content of the TiXmlString if any exists.
+    */
+    void reserve (unsigned size)
+    {
+        empty_it ();
+        if (size)
+        {
+            allocated = size;
+            cstring = new char [size];
+            cstring [0] = 0;
+        }
+    }
+
+    // [] operator 
+    char& operator [] (unsigned index) const
+    {
+        assert( index < length ());
+        return cstring [index];
+    }
+
+    // Error value for find primitive 
+    enum {	notfound = 0xffffffff,
+            npos = notfound };
+
+    void append (const char *str, int len );
+
+  protected :
+
+    // The base string
+    char * cstring;
+    // Number of chars allocated
+    unsigned allocated;
+
+    // New size computation. It is simplistic right now : it returns twice the amount
+    // we need
+    unsigned assign_new_size (unsigned minimum_to_allocate)
+    {
+        return minimum_to_allocate * 2;
+    }
+
+    // Internal function that clears the content of a TiXmlString
+    void empty_it ()
+    {
+        if (cstring)
+            delete [] cstring;
+        cstring = NULL;
+        allocated = 0;
+    }
+
+    void append (const char *suffix );
+
+    // append function for another TiXmlString
+    void append (const TiXmlString & suffix)
+    {
+        append (suffix . c_str ());
+    }
+
+    // append for a single char. This could be improved a lot if needed
+    void append (char single)
+    {
+        char smallstr [2];
+        smallstr [0] = single;
+        smallstr [1] = 0;
+        append (smallstr);
+    }
+
+} ;
+
+/** 
+   TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.
+   Only the operators that we need for TinyXML have been developped.
+*/
+class TiXmlOutStream : public TiXmlString
+{
+public :
+    TiXmlOutStream () : TiXmlString () {}
+
+    // TiXmlOutStream << operator. Maps to TiXmlString::append
+    TiXmlOutStream & operator << (const char * in)
+    {
+        append (in);
+        return (* this);
+    }
+
+    // TiXmlOutStream << operator. Maps to TiXmlString::append
+    TiXmlOutStream & operator << (const TiXmlString & in)
+    {
+        append (in . c_str ());
+        return (* this);
+    }
+} ;
+
+#endif	// TIXML_STRING_INCLUDED
+#endif	// TIXML_USE_STL
Index: /tags/DummyModules/VUT/work/tinyxml/tinyxmlparser.cpp
===================================================================
--- /tags/DummyModules/VUT/work/tinyxml/tinyxmlparser.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/tinyxml/tinyxmlparser.cpp	(revision 61)
@@ -0,0 +1,939 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+
+This software is provided 'as-is', without any express or implied 
+warranty. In no event will the authors be held liable for any 
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any 
+purpose, including commercial applications, and to alter it and 
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must 
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and 
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source 
+distribution.
+*/
+
+#include "tinyxml.h"
+#include <ctype.h>
+
+//#define DEBUG_PARSER
+
+// Note tha "PutString" hardcodes the same list. This
+// is less flexible than it appears. Changing the entries
+// or order will break putstring.	
+TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = 
+{
+	{ "&amp;",  5, '&' },
+	{ "&lt;",   4, '<' },
+	{ "&gt;",   4, '>' },
+	{ "&quot;", 6, '\"' },
+	{ "&apos;", 6, '\'' }
+};
+
+
+const char* TiXmlBase::SkipWhiteSpace( const char* p )
+{
+	if ( !p || !*p )
+	{
+		return 0;
+	}
+	while ( p && *p )
+	{
+		if ( isspace( *p ) || *p == '\n' || *p =='\r' )		// Still using old rules for white space.
+			++p;
+		else
+			break;
+	}
+
+	return p;
+}
+
+#ifdef TIXML_USE_STL
+/*static*/ bool TiXmlBase::StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	for( ;; )
+	{
+		if ( !in->good() ) return false;
+
+		int c = in->peek();
+		if ( !IsWhiteSpace( c ) )
+			return true;
+		*tag += in->get();
+	}
+}
+
+/*static*/ bool TiXmlBase::StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->peek();
+		if ( c == character )
+			return true;
+
+		in->get();
+		*tag += c;
+	}
+	return false;
+}
+#endif
+
+const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name )
+{
+	*name = "";
+	assert( p );
+
+	// Names start with letters or underscores.
+	// After that, they can be letters, underscores, numbers,
+	// hyphens, or colons. (Colons are valid ony for namespaces,
+	// but tinyxml can't tell namespaces from names.)
+	if (    p && *p 
+		 && ( isalpha( (unsigned char) *p ) || *p == '_' ) )
+	{
+		while(		p && *p
+				&&	(		isalnum( (unsigned char ) *p ) 
+						 || *p == '_'
+						 || *p == '-'
+						 || *p == ':' ) )
+		{
+			(*name) += *p;
+			++p;
+		}
+		return p;
+	}
+	return 0;
+}
+
+const char* TiXmlBase::GetEntity( const char* p, char* value )
+{
+	// Presume an entity, and pull it out.
+    TIXML_STRING ent;
+	int i;
+
+	// Ignore the &#x entities.
+	if (    strncmp( "&#x", p, 3 ) == 0 
+	     && *(p+3) 
+		 && *(p+4) )
+	{
+		*value = 0;
+		
+		if ( isalpha( *(p+3) ) ) *value += ( tolower( *(p+3) ) - 'a' + 10 ) * 16;
+		else				     *value += ( *(p+3) - '0' ) * 16;
+
+		if ( isalpha( *(p+4) ) ) *value += ( tolower( *(p+4) ) - 'a' + 10 );
+		else				     *value += ( *(p+4) - '0' );
+
+		return p+6;
+	}
+
+	// Now try to match it.
+	for( i=0; i<NUM_ENTITY; ++i )
+	{
+		if ( strncmp( entity[i].str, p, entity[i].strLength ) == 0 )
+		{
+			assert( strlen( entity[i].str ) == entity[i].strLength );
+			*value = entity[i].chr;
+			return ( p + entity[i].strLength );
+		}
+	}
+
+	// So it wasn't an entity, its unrecognized, or something like that.
+	*value = *p;	// Don't put back the last one, since we return it!
+	return p+1;
+}
+
+
+bool TiXmlBase::StringEqual( const char* p,
+							 const char* tag,
+							 bool ignoreCase )
+{
+	assert( p );
+	if ( !p || !*p )
+	{
+		assert( 0 );
+		return false;
+	}
+
+    if ( tolower( *p ) == tolower( *tag ) )
+	{
+		const char* q = p;
+
+		if (ignoreCase)
+		{
+			while ( *q && *tag && *q == *tag )
+			{
+				++q;
+				++tag;
+			}
+
+			if ( *tag == 0 )		// Have we found the end of the tag, and everything equal?
+			{
+				return true;
+			}
+		}
+		else
+		{
+			while ( *q && *tag && tolower( *q ) == tolower( *tag ) )
+			{
+				++q;
+				++tag;
+			}
+
+			if ( *tag == 0 )
+			{
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
+const char* TiXmlBase::ReadText(	const char* p, 
+									TIXML_STRING * text, 
+									bool trimWhiteSpace, 
+									const char* endTag, 
+									bool caseInsensitive )
+{
+    *text = "";
+	if (    !trimWhiteSpace			// certain tags always keep whitespace
+		 || !condenseWhiteSpace )	// if true, whitespace is always kept
+	{
+		// Keep all the white space.
+		while (	   p && *p
+				&& !StringEqual( p, endTag, caseInsensitive )
+			  )
+		{
+			char c;
+			p = GetChar( p, &c );
+            (* text) += c;
+		}
+	}
+	else
+	{
+		bool whitespace = false;
+
+		// Remove leading white space:
+		p = SkipWhiteSpace( p );
+		while (	   p && *p
+				&& !StringEqual( p, endTag, caseInsensitive ) )
+		{
+			if ( *p == '\r' || *p == '\n' )
+			{
+				whitespace = true;
+				++p;
+			}
+			else if ( isspace( *p ) )
+			{
+				whitespace = true;
+				++p;
+			}
+			else
+			{
+				// If we've found whitespace, add it before the
+				// new character. Any whitespace just becomes a space.
+				if ( whitespace )
+				{
+               (* text) += ' ';
+					whitespace = false;
+				}
+				char c;
+				p = GetChar( p, &c );
+            (* text) += c;
+			}
+		}
+	}
+	return p + strlen( endTag );
+}
+
+#ifdef TIXML_USE_STL
+
+void TiXmlDocument::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	// The basic issue with a document is that we don't know what we're
+	// streaming. Read something presumed to be a tag (and hope), then
+	// identify it, and call the appropriate stream method on the tag.
+	//
+	// This "pre-streaming" will never read the closing ">" so the
+	// sub-tag can orient itself.
+
+	if ( !StreamTo( in, '<', tag ) ) 
+	{
+		SetError( TIXML_ERROR_PARSING_EMPTY );
+		return;
+	}
+
+	while ( in->good() )
+	{
+		size_t tagIndex = tag->length();
+		while ( in->good() && in->peek() != '>' )
+		{
+			int c = in->get();
+			(*tag) += (char) c;
+		}
+
+		if ( in->good() )
+		{
+			// We now have something we presume to be a node of 
+			// some sort. Identify it, and call the node to
+			// continue streaming.
+			TiXmlNode* node = Identify( tag->c_str() + tagIndex );
+
+			if ( node )
+			{
+				node->StreamIn( in, tag );
+				bool isElement = node->ToElement() != 0;
+				delete node;
+				node = 0;
+
+				// If this is the root element, we're done. Parsing will be
+				// done by the >> operator.
+				if ( isElement )
+				{
+					return;
+				}
+			}
+			else
+			{
+				SetError( TIXML_ERROR );
+				return;
+			}
+		}
+	}
+	// We should have returned sooner.
+	SetError( TIXML_ERROR );
+}
+
+#endif
+
+const char* TiXmlDocument::Parse( const char* p )
+{
+	// Parse away, at the document level. Since a document
+	// contains nothing but other tags, most of what happens
+	// here is skipping white space.
+	//
+	// In this variant (as opposed to stream and Parse) we
+	// read everything we can.
+
+
+	if ( !p || !*p )
+	{
+		SetError( TIXML_ERROR_DOCUMENT_EMPTY );
+		return false;
+	}
+
+    p = SkipWhiteSpace( p );
+	if ( !p )
+	{
+		SetError( TIXML_ERROR_DOCUMENT_EMPTY );
+		return false;
+	}
+
+	while ( p && *p )
+	{
+		TiXmlNode* node = Identify( p );
+		if ( node )
+		{
+			p = node->Parse( p );
+			LinkEndChild( node );
+		}
+		else
+		{
+			break;
+		}
+		p = SkipWhiteSpace( p );
+	}
+	// All is well.
+	return p;
+}
+
+
+TiXmlNode* TiXmlNode::Identify( const char* p )
+{
+	TiXmlNode* returnNode = 0;
+
+	p = SkipWhiteSpace( p );
+	if( !p || !*p || *p != '<' )
+	{
+		return 0;
+	}
+
+	TiXmlDocument* doc = GetDocument();
+	p = SkipWhiteSpace( p );
+
+	if ( !p || !*p )
+	{
+		return 0;
+	}
+
+	// What is this thing? 
+	// - Elements start with a letter or underscore, but xml is reserved.
+	// - Comments: <!--
+	// - Decleration: <?xml
+	// - Everthing else is unknown to tinyxml.
+	//
+
+	const char* xmlHeader = { "<?xml" };
+	const char* commentHeader = { "<!--" };
+
+	if ( StringEqual( p, xmlHeader, true ) )
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Declaration\n" );
+		#endif
+		returnNode = new TiXmlDeclaration();
+	}
+	else if (    isalpha( *(p+1) )
+			  || *(p+1) == '_' )
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Element\n" );
+		#endif
+		returnNode = new TiXmlElement( "" );
+	}
+	else if ( StringEqual( p, commentHeader, false ) )
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Comment\n" );
+		#endif
+		returnNode = new TiXmlComment();
+	}
+	else
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Unknown\n" );
+		#endif
+		returnNode = new TiXmlUnknown();
+	}
+
+	if ( returnNode )
+	{
+		// Set the parent, so it can report errors
+		returnNode->parent = this;
+		//p = returnNode->Parse( p );
+	}
+	else
+	{
+		if ( doc )
+			doc->SetError( TIXML_ERROR_OUT_OF_MEMORY );
+	}
+	return returnNode;
+}
+
+#ifdef TIXML_USE_STL
+
+void TiXmlElement::StreamIn (TIXML_ISTREAM * in, TIXML_STRING * tag)
+{
+	// We're called with some amount of pre-parsing. That is, some of "this"
+	// element is in "tag". Go ahead and stream to the closing ">"
+	while( in->good() )
+	{
+		int c = in->get();
+		(*tag) += (char) c ;
+		
+		if ( c == '>' )
+			break;
+	}
+
+	if ( tag->length() < 3 ) return;
+
+	// Okay...if we are a "/>" tag, then we're done. We've read a complete tag.
+	// If not, identify and stream.
+
+	if (    tag->at( tag->length() - 1 ) == '>' 
+		 && tag->at( tag->length() - 2 ) == '/' )
+	{
+		// All good!
+		return;
+	}
+	else if ( tag->at( tag->length() - 1 ) == '>' )
+	{
+		// There is more. Could be:
+		//		text
+		//		closing tag
+		//		another node.
+		for ( ;; )
+		{
+			StreamWhiteSpace( in, tag );
+
+			// Do we have text?
+			if ( in->peek() != '<' )
+			{
+				// Yep, text.
+				TiXmlText text( "" );
+				text.StreamIn( in, tag );
+
+				// What follows text is a closing tag or another node.
+				// Go around again and figure it out.
+				continue;
+			}
+
+			// We now have either a closing tag...or another node.
+			// We should be at a "<", regardless.
+			if ( !in->good() ) return;
+			assert( in->peek() == '<' );
+			size_t tagIndex = tag->length();
+
+			bool closingTag = false;
+			bool firstCharFound = false;
+
+			for( ;; )
+			{
+				if ( !in->good() )
+					return;
+
+				int c = in->peek();
+				
+				if ( c == '>' )
+					break;
+
+				*tag += c;
+				in->get();
+
+				if ( !firstCharFound && c != '<' && !IsWhiteSpace( c ) )
+				{
+					firstCharFound = true;
+					if ( c == '/' )
+						closingTag = true;
+				}
+			}
+			// If it was a closing tag, then read in the closing '>' to clean up the input stream.
+			// If it was not, the streaming will be done by the tag.
+			if ( closingTag )
+			{
+				int c = in->get();
+				assert( c == '>' );
+				*tag += c;
+
+				// We are done, once we've found our closing tag.
+				return;
+			}
+			else
+			{
+				// If not a closing tag, id it, and stream.
+				const char* tagloc = tag->c_str() + tagIndex;
+				TiXmlNode* node = Identify( tagloc );
+				if ( !node )
+					return;
+				node->StreamIn( in, tag );
+				delete node;
+				node = 0;
+
+				// No return: go around from the beginning: text, closing tag, or node.
+			}
+		}
+	}
+}
+#endif
+
+const char* TiXmlElement::Parse( const char* p )
+{
+	p = SkipWhiteSpace( p );
+	TiXmlDocument* document = GetDocument();
+
+	if ( !p || !*p || *p != '<' )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT );
+		return false;
+	}
+
+	p = SkipWhiteSpace( p+1 );
+
+	// Read the name.
+    p = ReadName( p, &value );
+	if ( !p || !*p )
+	{
+		if ( document )	document->SetError( TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME );
+		return false;
+	}
+
+    TIXML_STRING endTag ("</");
+	endTag += value;
+	endTag += ">";
+
+	// Check for and read attributes. Also look for an empty
+	// tag or an end tag.
+	while ( p && *p )
+	{
+		p = SkipWhiteSpace( p );
+		if ( !p || !*p )
+		{
+			if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES );
+			return 0;
+		}
+		if ( *p == '/' )
+		{
+			++p;
+			// Empty tag.
+			if ( *p  != '>' )
+			{
+				if ( document ) document->SetError( TIXML_ERROR_PARSING_EMPTY );		
+				return 0;
+			}
+			return (p+1);
+		}
+		else if ( *p == '>' )
+		{
+			// Done with attributes (if there were any.)
+			// Read the value -- which can include other
+			// elements -- read the end tag, and return.
+			++p;
+			p = ReadValue( p );		// Note this is an Element method, and will set the error if one happens.
+			if ( !p || !*p )
+				return 0;
+
+			// We should find the end tag now
+			if ( StringEqual( p, endTag.c_str(), false ) )
+			{
+				p += endTag.length();
+				return p;
+			}
+			else
+			{
+				if ( document ) document->SetError( TIXML_ERROR_READING_END_TAG );
+				return 0;
+			}
+		}
+		else
+		{
+			// Try to read an element:
+			TiXmlAttribute attrib;
+			attrib.SetDocument( document );
+			p = attrib.Parse( p );
+
+			if ( !p || !*p )
+			{
+				if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT );
+				return 0;
+			}
+			SetAttribute( attrib.Name(), attrib.Value() );
+		}
+	}
+	return p;
+}
+
+
+const char* TiXmlElement::ReadValue( const char* p )
+{
+	TiXmlDocument* document = GetDocument();
+
+	// Read in text and elements in any order.
+	p = SkipWhiteSpace( p );
+	while ( p && *p )
+	{
+		if ( *p != '<' )
+		{
+			// Take what we have, make a text element.
+			TiXmlText* textNode = new TiXmlText( "" );
+
+			if ( !textNode )
+			{
+				if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY );
+				    return 0;
+			}
+
+			p = textNode->Parse( p );
+
+			if ( !textNode->Blank() )
+				LinkEndChild( textNode );
+			else
+				delete textNode;
+		} 
+		else 
+		{
+			// We hit a '<'
+			// Have we hit a new element or an end tag?
+			if ( StringEqual( p, "</", false ) )
+			{
+				return p;
+			}
+			else
+			{
+				TiXmlNode* node = Identify( p );
+				if ( node )
+				{
+					p = node->Parse( p );
+					LinkEndChild( node );
+				}				
+				else
+				{
+					return 0;
+				}
+			}
+		}
+		p = SkipWhiteSpace( p );
+	}
+
+	if ( !p )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_READING_ELEMENT_VALUE );
+	}	
+	return p;
+}
+
+
+#ifdef TIXML_USE_STL
+void TiXmlUnknown::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->get();	
+		(*tag) += c;
+
+		if ( c == '>' )
+		{
+			// All is well.
+			return;		
+		}
+	}
+}
+#endif
+
+
+const char* TiXmlUnknown::Parse( const char* p )
+{
+	TiXmlDocument* document = GetDocument();
+	p = SkipWhiteSpace( p );
+	if ( !p || !*p || *p != '<' )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_PARSING_UNKNOWN );
+		return 0;
+	}
+	++p;
+    value = "";
+
+	while ( p && *p && *p != '>' )
+	{
+		value += *p;
+		++p;
+	}
+
+	if ( !p )
+	{
+		if ( document )	document->SetError( TIXML_ERROR_PARSING_UNKNOWN );
+	}
+	if ( *p == '>' )
+		return p+1;
+	return p;
+}
+
+#ifdef TIXML_USE_STL
+void TiXmlComment::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->get();	
+		(*tag) += c;
+
+		if ( c == '>' 
+			 && tag->at( tag->length() - 2 ) == '-'
+			 && tag->at( tag->length() - 3 ) == '-' )
+		{
+			// All is well.
+			return;		
+		}
+	}
+}
+#endif
+
+
+const char* TiXmlComment::Parse( const char* p )
+{
+	TiXmlDocument* document = GetDocument();
+	value = "";
+
+	p = SkipWhiteSpace( p );
+	const char* startTag = "<!--";
+	const char* endTag   = "-->";
+
+	if ( !StringEqual( p, startTag, false ) )
+	{
+		document->SetError( TIXML_ERROR_PARSING_COMMENT );
+		return 0;
+	}
+	p += strlen( startTag );
+	p = ReadText( p, &value, false, endTag, false );
+	return p;
+}
+
+
+const char* TiXmlAttribute::Parse( const char* p )
+{
+	p = SkipWhiteSpace( p );
+	if ( !p || !*p ) return 0;
+
+	// Read the name, the '=' and the value.
+	p = ReadName( p, &name );
+	if ( !p || !*p )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES );
+		return 0;
+	}
+	p = SkipWhiteSpace( p );
+	if ( !p || !*p || *p != '=' )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES );
+		return 0;
+	}
+
+	++p;	// skip '='
+	p = SkipWhiteSpace( p );
+	if ( !p || !*p )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES );
+		return 0;
+	}
+	
+	const char* end;
+
+	if ( *p == '\'' )
+	{
+		++p;
+		end = "\'";
+		p = ReadText( p, &value, false, end, false );
+	}
+	else if ( *p == '"' )
+	{
+		++p;
+		end = "\"";
+		p = ReadText( p, &value, false, end, false );
+	}
+	else
+	{
+		// All attribute values should be in single or double quotes.
+		// But this is such a common error that the parser will try
+		// its best, even without them.
+		value = "";
+		while (    p && *p										// existence
+				&& !isspace( *p ) && *p != '\n' && *p != '\r'	// whitespace
+				&& *p != '/' && *p != '>' )						// tag end
+		{
+			value += *p;
+			++p;
+		}
+	}
+	return p;
+}
+
+#ifdef TIXML_USE_STL
+void TiXmlText::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->peek();	
+		if ( c == '<' )
+			return;
+
+		(*tag) += c;
+		in->get();
+	}
+}
+#endif
+
+const char* TiXmlText::Parse( const char* p )
+{
+	value = "";
+
+	//TiXmlDocument* doc = GetDocument();
+	bool ignoreWhite = true;
+//	if ( doc && !doc->IgnoreWhiteSpace() ) ignoreWhite = false;
+
+	const char* end = "<";
+	p = ReadText( p, &value, ignoreWhite, end, false );
+	if ( p )
+		return p-1;	// don't truncate the '<'
+	return 0;
+}
+
+#ifdef TIXML_USE_STL
+void TiXmlDeclaration::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->get();
+		(*tag) += c;
+
+		if ( c == '>' )
+		{
+			// All is well.
+			return;
+		}
+	}
+}
+#endif
+
+const char* TiXmlDeclaration::Parse( const char* p )
+{
+	p = SkipWhiteSpace( p );
+	// Find the beginning, find the end, and look for
+	// the stuff in-between.
+	TiXmlDocument* document = GetDocument();
+	if ( !p || !*p || !StringEqual( p, "<?xml", true ) )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_PARSING_DECLARATION );
+		return 0;
+	}
+
+	p += 5;
+//	const char* start = p+5;
+//	const char* end  = strstr( start, "?>" );
+
+	version = "";
+	encoding = "";
+	standalone = "";
+
+	while ( p && *p )
+	{
+		if ( *p == '>' )
+		{
+			++p;
+			return p;
+		}
+
+		p = SkipWhiteSpace( p );
+		if ( StringEqual( p, "version", true ) )
+		{
+//			p += 7;
+			TiXmlAttribute attrib;
+			p = attrib.Parse( p );		
+			version = attrib.Value();
+		}
+		else if ( StringEqual( p, "encoding", true ) )
+		{
+//			p += 8;
+			TiXmlAttribute attrib;
+			p = attrib.Parse( p );		
+			encoding = attrib.Value();
+		}
+		else if ( StringEqual( p, "standalone", true ) )
+		{
+//			p += 10;
+			TiXmlAttribute attrib;
+			p = attrib.Parse( p );		
+			standalone = attrib.Value();
+		}
+		else
+		{
+			// Read over whatever it is.
+			while( p && *p && *p != '>' && !isspace( *p ) )
+				++p;
+		}
+	}
+	return 0;
+}
+
+bool TiXmlText::Blank() const
+{
+	for ( unsigned i=0; i<value.length(); i++ )
+		if ( !isspace( value[i] ) )
+			return false;
+	return true;
+}
+
Index: /tags/DummyModules/VUT/work/tinyxml/tinyxml.cpp
===================================================================
--- /tags/DummyModules/VUT/work/tinyxml/tinyxml.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/tinyxml/tinyxml.cpp	(revision 61)
@@ -0,0 +1,1108 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any
+purpose, including commercial applications, and to alter it and
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+*/
+
+#include <ctype.h>
+#include "tinyxml.h"
+
+bool TiXmlBase::condenseWhiteSpace = true;
+
+void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_OSTREAM* stream )
+{
+	TIXML_STRING buffer;
+	PutString( str, &buffer );
+	(*stream) << buffer;
+}
+
+void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_STRING* outString )
+{
+	int i=0;
+
+	while( i<(int)str.length() )
+	{
+		int c = str[i];
+
+		if (    c == '&' 
+		     && i < ( (int)str.length() - 2 )
+			 && str[i+1] == '#'
+			 && str[i+2] == 'x' )
+		{
+			// Hexadecimal character reference.
+			// Pass through unchanged.
+			// &#xA9;	-- copyright symbol, for example.
+			while ( i<(int)str.length() )
+			{
+				outString->append( str.c_str() + i, 1 );
+				++i;
+				if ( str[i] == ';' )
+					break;
+			}
+		}
+		else if ( c == '&' )
+		{
+			outString->append( entity[0].str, entity[0].strLength );
+			++i;
+		}
+		else if ( c == '<' )
+		{
+			outString->append( entity[1].str, entity[1].strLength );
+			++i;
+		}
+		else if ( c == '>' )
+		{
+			outString->append( entity[2].str, entity[2].strLength );
+			++i;
+		}
+		else if ( c == '\"' )
+		{
+			outString->append( entity[3].str, entity[3].strLength );
+			++i;
+		}
+		else if ( c == '\'' )
+		{
+			outString->append( entity[4].str, entity[4].strLength );
+			++i;
+		}
+		else if ( c < 32 || c > 126 )
+		{
+			// Easy pass at non-alpha/numeric/symbol
+			// 127 is the delete key. Below 32 is symbolic.
+			char buf[ 32 ];
+			sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) );
+			outString->append( buf, strlen( buf ) );
+			++i;
+		}
+		else
+		{
+			char realc = (char) c;
+			outString->append( &realc, 1 );
+			++i;
+		}
+	}
+}
+
+
+TiXmlNode::TiXmlNode( NodeType _type )
+{
+	parent = 0;
+	type = _type;
+	firstChild = 0;
+	lastChild = 0;
+	prev = 0;
+	next = 0;
+	userData = 0;
+}
+
+
+TiXmlNode::~TiXmlNode()
+{
+	TiXmlNode* node = firstChild;
+	TiXmlNode* temp = 0;
+
+	while ( node )
+	{
+		temp = node;
+		node = node->next;
+		delete temp;
+	}	
+}
+
+
+void TiXmlNode::Clear()
+{
+	TiXmlNode* node = firstChild;
+	TiXmlNode* temp = 0;
+
+	while ( node )
+	{
+		temp = node;
+		node = node->next;
+		delete temp;
+	}	
+
+	firstChild = 0;
+	lastChild = 0;
+}
+
+
+TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node )
+{
+	node->parent = this;
+
+	node->prev = lastChild;
+	node->next = 0;
+
+	if ( lastChild )
+		lastChild->next = node;
+	else
+		firstChild = node;			// it was an empty list.
+
+	lastChild = node;
+	return node;
+}
+
+
+TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis )
+{
+	TiXmlNode* node = addThis.Clone();
+	if ( !node )
+		return 0;
+
+	return LinkEndChild( node );
+}
+
+
+TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis )
+{	
+	if ( !beforeThis || beforeThis->parent != this )
+		return 0;
+
+	TiXmlNode* node = addThis.Clone();
+	if ( !node )
+		return 0;
+	node->parent = this;
+
+	node->next = beforeThis;
+	node->prev = beforeThis->prev;
+	if ( beforeThis->prev )
+	{
+		beforeThis->prev->next = node;
+	}
+	else
+	{
+		assert( firstChild == beforeThis );
+		firstChild = node;
+	}
+	beforeThis->prev = node;
+	return node;
+}
+
+
+TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis )
+{
+	if ( !afterThis || afterThis->parent != this )
+		return 0;
+
+	TiXmlNode* node = addThis.Clone();
+	if ( !node )
+		return 0;
+	node->parent = this;
+
+	node->prev = afterThis;
+	node->next = afterThis->next;
+	if ( afterThis->next )
+	{
+		afterThis->next->prev = node;
+	}
+	else
+	{
+		assert( lastChild == afterThis );
+		lastChild = node;
+	}
+	afterThis->next = node;
+	return node;
+}
+
+
+TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis )
+{
+	if ( replaceThis->parent != this )
+		return 0;
+
+	TiXmlNode* node = withThis.Clone();
+	if ( !node )
+		return 0;
+
+	node->next = replaceThis->next;
+	node->prev = replaceThis->prev;
+
+	if ( replaceThis->next )
+		replaceThis->next->prev = node;
+	else
+		lastChild = node;
+
+	if ( replaceThis->prev )
+		replaceThis->prev->next = node;
+	else
+		firstChild = node;
+
+	delete replaceThis;
+	node->parent = this;
+	return node;
+}
+
+
+bool TiXmlNode::RemoveChild( TiXmlNode* removeThis )
+{
+	if ( removeThis->parent != this )
+	{	
+		assert( 0 );
+		return false;
+	}
+
+	if ( removeThis->next )
+		removeThis->next->prev = removeThis->prev;
+	else
+		lastChild = removeThis->prev;
+
+	if ( removeThis->prev )
+		removeThis->prev->next = removeThis->next;
+	else
+		firstChild = removeThis->next;
+
+	delete removeThis;
+	return true;
+}
+
+TiXmlNode* TiXmlNode::FirstChild( const char * value ) const
+{
+	TiXmlNode* node;
+	for ( node = firstChild; node; node = node->next )
+	{
+		if ( node->SValue() == TIXML_STRING( value ))
+			return node;
+	}
+	return 0;
+}
+
+TiXmlNode* TiXmlNode::LastChild( const char * value ) const
+{
+	TiXmlNode* node;
+	for ( node = lastChild; node; node = node->prev )
+	{
+		if ( node->SValue() == TIXML_STRING (value))
+			return node;
+	}
+	return 0;
+}
+
+TiXmlNode* TiXmlNode::IterateChildren( TiXmlNode* previous ) const
+{
+	if ( !previous )
+	{
+		return FirstChild();
+	}
+	else
+	{
+		assert( previous->parent == this );
+		return previous->NextSibling();
+	}
+}
+
+TiXmlNode* TiXmlNode::IterateChildren( const char * val, TiXmlNode* previous ) const
+{
+	if ( !previous )
+	{
+		return FirstChild( val );
+	}
+	else
+	{
+		assert( previous->parent == this );
+		return previous->NextSibling( val );
+	}
+}
+
+TiXmlNode* TiXmlNode::NextSibling( const char * value ) const
+{
+	TiXmlNode* node;
+	for ( node = next; node; node = node->next )
+	{
+		if ( node->SValue() == TIXML_STRING (value))
+			return node;
+	}
+	return 0;
+}
+
+
+TiXmlNode* TiXmlNode::PreviousSibling( const char * value ) const
+{
+	TiXmlNode* node;
+	for ( node = prev; node; node = node->prev )
+	{
+		if ( node->SValue() == TIXML_STRING (value))
+			return node;
+	}
+	return 0;
+}
+
+void TiXmlElement::RemoveAttribute( const char * name )
+{
+	TiXmlAttribute* node = attributeSet.Find( name );
+	if ( node )
+	{
+		attributeSet.Remove( node );
+		delete node;
+	}
+}
+
+TiXmlElement* TiXmlNode::FirstChildElement() const
+{
+	TiXmlNode* node;
+
+	for (	node = FirstChild();
+	node;
+	node = node->NextSibling() )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+TiXmlElement* TiXmlNode::FirstChildElement( const char * value ) const
+{
+	TiXmlNode* node;
+
+	for (	node = FirstChild( value );
+	node;
+	node = node->NextSibling( value ) )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+
+TiXmlElement* TiXmlNode::NextSiblingElement() const
+{
+	TiXmlNode* node;
+
+	for (	node = NextSibling();
+	node;
+	node = node->NextSibling() )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+TiXmlElement* TiXmlNode::NextSiblingElement( const char * value ) const
+{
+	TiXmlNode* node;
+
+	for (	node = NextSibling( value );
+	node;
+	node = node->NextSibling( value ) )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+
+
+TiXmlDocument* TiXmlNode::GetDocument() const
+{
+	const TiXmlNode* node;
+
+	for( node = this; node; node = node->parent )
+	{
+		if ( node->ToDocument() )
+			return node->ToDocument();
+	}
+	return 0;
+}
+
+
+TiXmlElement::TiXmlElement (const char * _value)
+: TiXmlNode( TiXmlNode::ELEMENT )
+{
+	firstChild = lastChild = 0;
+	value = _value;
+}
+
+TiXmlElement::~TiXmlElement()
+{
+	while( attributeSet.First() )
+	{
+		TiXmlAttribute* node = attributeSet.First();
+		attributeSet.Remove( node );
+		delete node;
+	}
+}
+
+// BEGIN OGRE CHANGES
+// USE STL ALONE
+#ifndef TIXML_USE_STL
+const char * TiXmlElement::Attribute( const char * name ) const
+{
+	TiXmlAttribute* node = attributeSet.Find( name );
+
+	if ( node )
+		return node->Value();
+
+	return 0;
+}
+
+
+const char * TiXmlElement::Attribute( const char * name, int* i ) const
+{
+	const char * s = Attribute( name );
+	if ( i )
+	{
+		if ( s )
+			*i = atoi( s );
+		else
+			*i = 0;
+	}
+	return s;
+}
+
+
+void TiXmlElement::SetAttribute( const char * name, int val )
+{	
+	char buf[64];
+	sprintf( buf, "%d", val );
+	SetAttribute( name, buf );
+}
+
+
+void TiXmlElement::SetAttribute( const char * name, const char * value )
+{
+	TiXmlAttribute* node = attributeSet.Find( name );
+	if ( node )
+	{
+		node->SetValue( value );
+		return;
+	}
+
+	TiXmlAttribute* attrib = new TiXmlAttribute( name, value );
+	if ( attrib )
+	{
+		attributeSet.Add( attrib );
+	}
+	else
+	{
+		TiXmlDocument* document = GetDocument();
+		if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY );
+	}
+}
+
+#endif
+
+#ifdef TIXML_USE_STL
+
+const char * TiXmlElement::Attribute( const std::string& name ) const
+{
+	TiXmlAttribute* node = attributeSet.Find( name.c_str() );
+
+	if ( node )
+		return node->Value();
+
+	return 0;
+}
+
+
+const char * TiXmlElement::Attribute( const std::string& name, int* i ) const
+{
+	const char * s = Attribute( name );
+	if ( i )
+	{
+		if ( s )
+			*i = atoi( s );
+		else
+			*i = 0;
+	}
+	return s;
+}
+
+
+void TiXmlElement::SetAttribute( const std::string& name, int val )
+{	
+	char buf[64];
+	sprintf( buf, "%d", val );
+	SetAttribute( name, buf );
+}
+
+
+void TiXmlElement::SetAttribute( const std::string& name, const std::string& value )
+{
+	TiXmlAttribute* node = attributeSet.Find( name.c_str() );
+	if ( node )
+	{
+		node->SetValue( value );
+		return;
+	}
+
+	TiXmlAttribute* attrib = new TiXmlAttribute( name, value );
+	if ( attrib )
+	{
+		attributeSet.Add( attrib );
+	}
+	else
+	{
+		TiXmlDocument* document = GetDocument();
+		if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY );
+	}
+}
+
+#endif
+// END OGRE CHANGES
+void TiXmlElement::Print( FILE* cfile, int depth ) const
+{
+	int i;
+	for ( i=0; i<depth; i++ )
+	{
+		fprintf( cfile, "    " );
+	}
+
+	fprintf( cfile, "<%s", value.c_str() );
+
+	TiXmlAttribute* attrib;
+	for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() )
+	{
+		fprintf( cfile, " " );
+		attrib->Print( cfile, depth );
+	}
+
+	// There are 3 different formatting approaches:
+	// 1) An element without children is printed as a <foo /> node
+	// 2) An element with only a text child is printed as <foo> text </foo>
+	// 3) An element with children is printed on multiple lines.
+	TiXmlNode* node;
+	if ( !firstChild )
+	{
+		fprintf( cfile, " />" );
+	}
+	else if ( firstChild == lastChild && firstChild->ToText() )
+	{
+		fprintf( cfile, ">" );
+		firstChild->Print( cfile, depth + 1 );
+		fprintf( cfile, "</%s>", value.c_str() );
+	}
+	else
+	{
+		fprintf( cfile, ">" );
+
+		for ( node = firstChild; node; node=node->NextSibling() )
+		{
+			if ( !node->ToText() )
+			{
+				fprintf( cfile, "\n" );
+			}
+			node->Print( cfile, depth+1 );
+		}
+		fprintf( cfile, "\n" );
+		for( i=0; i<depth; ++i )
+		fprintf( cfile, "    " );
+		fprintf( cfile, "</%s>", value.c_str() );
+	}
+}
+
+void TiXmlElement::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	(*stream) << "<" << value;
+
+	TiXmlAttribute* attrib;
+	for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() )
+	{	
+		(*stream) << " ";
+		attrib->StreamOut( stream );
+	}
+
+	// If this node has children, give it a closing tag. Else
+	// make it an empty tag.
+	TiXmlNode* node;
+	if ( firstChild )
+	{ 		
+		(*stream) << ">";
+
+		for ( node = firstChild; node; node=node->NextSibling() )
+		{
+			node->StreamOut( stream );
+		}
+		(*stream) << "</" << value << ">";
+	}
+	else
+	{
+		(*stream) << " />";
+	}
+}
+
+TiXmlNode* TiXmlElement::Clone() const
+{
+	TiXmlElement* clone = new TiXmlElement( Value() );
+	if ( !clone )
+		return 0;
+
+	CopyToClone( clone );
+
+	// Clone the attributes, then clone the children.
+	TiXmlAttribute* attribute = 0;
+	for(	attribute = attributeSet.First();
+	attribute;
+	attribute = attribute->Next() )
+	{
+		clone->SetAttribute( attribute->Name(), attribute->Value() );
+	}
+
+	TiXmlNode* node = 0;
+	for ( node = firstChild; node; node = node->NextSibling() )
+	{
+		clone->LinkEndChild( node->Clone() );
+	}
+	return clone;
+}
+
+
+TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT )
+{
+	error = false;
+	//	ignoreWhiteSpace = true;
+}
+
+TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT )
+{
+	//	ignoreWhiteSpace = true;
+	value = documentName;
+	error = false;
+}
+
+bool TiXmlDocument::LoadFile()
+{
+	if ( LoadFile( value.c_str() ) )
+		return true;
+
+	return false;
+}
+
+
+bool TiXmlDocument::SaveFile() const
+{
+	if ( SaveFile( value.c_str() ) )
+		return true;
+
+	return false;
+}
+
+bool TiXmlDocument::LoadFile( const char* filename )
+{
+	// Delete the existing data:
+	Clear();
+
+	// There was a really terrifying little bug here. The code:
+	//		value = filename
+	// in the STL case, cause the assignment method of the std::string to
+	// be called. What is strange, is that the std::string had the same
+	// address as it's c_str() method, and so bad things happen. Looks
+	// like a bug in the Microsoft STL implementation.
+	// See STL_STRING_BUG above.
+	// Fixed with the StringToBuffer class.
+	value = filename;
+
+	FILE* file = fopen( value.c_str (), "r" );
+
+	if ( file )
+	{
+		// Get the file size, so we can pre-allocate the string. HUGE speed impact.
+		long length = 0;
+		fseek( file, 0, SEEK_END );
+		length = ftell( file );
+		fseek( file, 0, SEEK_SET );
+
+		// Strange case, but good to handle up front.
+		if ( length == 0 )
+		{
+			fclose( file );
+			return false;
+		}
+
+		// If we have a file, assume it is all one big XML file, and read it in.
+		// The document parser may decide the document ends sooner than the entire file, however.
+		TIXML_STRING data;
+		data.reserve( length );
+
+		const int BUF_SIZE = 2048;
+		char buf[BUF_SIZE];
+
+		while( fgets( buf, BUF_SIZE, file ) )
+		{
+			data += buf;
+		}
+		fclose( file );
+
+		Parse( data.c_str() );
+		if (  !Error() )
+		{
+			return true;
+		}
+	}
+	SetError( TIXML_ERROR_OPENING_FILE );
+	return false;
+}
+
+bool TiXmlDocument::SaveFile( const char * filename ) const
+{
+	// The old c stuff lives on...
+	FILE* fp = fopen( filename, "w" );
+	if ( fp )
+	{
+		Print( fp, 0 );
+		fclose( fp );
+		return true;
+	}
+	return false;
+}
+
+
+TiXmlNode* TiXmlDocument::Clone() const
+{
+	TiXmlDocument* clone = new TiXmlDocument();
+	if ( !clone )
+		return 0;
+
+	CopyToClone( clone );
+	clone->error = error;
+	clone->errorDesc = errorDesc.c_str ();
+
+	TiXmlNode* node = 0;
+	for ( node = firstChild; node; node = node->NextSibling() )
+	{
+		clone->LinkEndChild( node->Clone() );
+	}
+	return clone;
+}
+
+
+void TiXmlDocument::Print( FILE* cfile, int depth ) const
+{
+	TiXmlNode* node;
+	for ( node=FirstChild(); node; node=node->NextSibling() )
+	{
+		node->Print( cfile, depth );
+		fprintf( cfile, "\n" );
+	}
+}
+
+void TiXmlDocument::StreamOut( TIXML_OSTREAM * out ) const
+{
+	TiXmlNode* node;
+	for ( node=FirstChild(); node; node=node->NextSibling() )
+	{
+		node->StreamOut( out );
+
+		// Special rule for streams: stop after the root element.
+		// The stream in code will only read one element, so don't
+		// write more than one.
+		if ( node->ToElement() )
+			break;
+	}
+}
+
+TiXmlAttribute* TiXmlAttribute::Next() const
+{
+	// We are using knowledge of the sentinel. The sentinel
+	// have a value or name.
+	if ( next->value.empty() && next->name.empty() )
+		return 0;
+	return next;
+}
+
+
+TiXmlAttribute* TiXmlAttribute::Previous() const
+{
+	// We are using knowledge of the sentinel. The sentinel
+	// have a value or name.
+	if ( prev->value.empty() && prev->name.empty() )
+		return 0;
+	return prev;
+}
+
+
+void TiXmlAttribute::Print( FILE* cfile, int /*depth*/ ) const
+{
+	TIXML_STRING n, v;
+
+	PutString( Name(), &n );
+	PutString( Value(), &v );
+
+	if (value.find ('\"') == TIXML_STRING::npos)
+		fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() );
+	else
+		fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() );
+}
+
+
+void TiXmlAttribute::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	if (value.find( '\"' ) != TIXML_STRING::npos)
+	{
+		PutString( name, stream );
+		(*stream) << "=" << "'";
+		PutString( value, stream );
+		(*stream) << "'";
+	}
+	else
+	{
+		PutString( name, stream );
+		(*stream) << "=" << "\"";
+		PutString( value, stream );
+		(*stream) << "\"";
+	}
+}
+
+void TiXmlAttribute::SetIntValue( int value )
+{
+	char buf [64];
+	sprintf (buf, "%d", value);
+	SetValue (buf);
+}
+
+void TiXmlAttribute::SetDoubleValue( double value )
+{
+	char buf [64];
+	sprintf (buf, "%lf", value);
+	SetValue (buf);
+}
+
+const int TiXmlAttribute::IntValue() const
+{
+	return atoi (value.c_str ());
+}
+
+const double  TiXmlAttribute::DoubleValue() const
+{
+	return atof (value.c_str ());
+}
+
+void TiXmlComment::Print( FILE* cfile, int depth ) const
+{
+	for ( int i=0; i<depth; i++ )
+	{
+		fputs( "    ", cfile );
+	}
+	fprintf( cfile, "<!--%s-->", value.c_str() );
+}
+
+void TiXmlComment::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	(*stream) << "<!--";
+	PutString( value, stream );
+	(*stream) << "-->";
+}
+
+TiXmlNode* TiXmlComment::Clone() const
+{
+	TiXmlComment* clone = new TiXmlComment();
+
+	if ( !clone )
+		return 0;
+
+	CopyToClone( clone );
+	return clone;
+}
+
+
+void TiXmlText::Print( FILE* cfile, int /*depth*/ ) const
+{
+	TIXML_STRING buffer;
+	PutString( value, &buffer );
+	fprintf( cfile, "%s", buffer.c_str() );
+}
+
+
+void TiXmlText::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	PutString( value, stream );
+}
+
+
+TiXmlNode* TiXmlText::Clone() const
+{	
+	TiXmlText* clone = 0;
+	clone = new TiXmlText( "" );
+
+	if ( !clone )
+		return 0;
+
+	CopyToClone( clone );
+	return clone;
+}
+
+
+TiXmlDeclaration::TiXmlDeclaration( const char * _version,
+	const char * _encoding,
+	const char * _standalone )
+: TiXmlNode( TiXmlNode::DECLARATION )
+{
+	version = _version;
+	encoding = _encoding;
+	standalone = _standalone;
+}
+
+
+void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/ ) const
+{
+	fprintf (cfile, "<?xml ");
+
+	if ( !version.empty() )
+		fprintf (cfile, "version=\"%s\" ", version.c_str ());
+	if ( !encoding.empty() )
+		fprintf (cfile, "encoding=\"%s\" ", encoding.c_str ());
+	if ( !standalone.empty() )
+		fprintf (cfile, "standalone=\"%s\" ", standalone.c_str ());
+	fprintf (cfile, "?>");
+}
+
+void TiXmlDeclaration::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	(*stream) << "<?xml ";
+
+	if ( !version.empty() )
+	{
+		(*stream) << "version=\"";
+		PutString( version, stream );
+		(*stream) << "\" ";
+	}
+	if ( !encoding.empty() )
+	{
+		(*stream) << "encoding=\"";
+		PutString( encoding, stream );
+		(*stream ) << "\" ";
+	}
+	if ( !standalone.empty() )
+	{
+		(*stream) << "standalone=\"";
+		PutString( standalone, stream );
+		(*stream) << "\" ";
+	}
+	(*stream) << "?>";
+}
+
+TiXmlNode* TiXmlDeclaration::Clone() const
+{	
+	TiXmlDeclaration* clone = new TiXmlDeclaration();
+
+	if ( !clone )
+		return 0;
+
+	CopyToClone( clone );
+	clone->version = version;
+	clone->encoding = encoding;
+	clone->standalone = standalone;
+	return clone;
+}
+
+
+void TiXmlUnknown::Print( FILE* cfile, int depth ) const
+{
+	for ( int i=0; i<depth; i++ )
+		fprintf( cfile, "    " );
+	fprintf( cfile, "%s", value.c_str() );
+}
+
+void TiXmlUnknown::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	(*stream) << "<" << value << ">";		// Don't use entities hear! It is unknown.
+}
+
+TiXmlNode* TiXmlUnknown::Clone() const
+{
+	TiXmlUnknown* clone = new TiXmlUnknown();
+
+	if ( !clone )
+		return 0;
+
+	CopyToClone( clone );
+	return clone;
+}
+
+
+TiXmlAttributeSet::TiXmlAttributeSet()
+{
+	sentinel.next = &sentinel;
+	sentinel.prev = &sentinel;
+}
+
+
+TiXmlAttributeSet::~TiXmlAttributeSet()
+{
+	assert( sentinel.next == &sentinel );
+	assert( sentinel.prev == &sentinel );
+}
+
+
+void TiXmlAttributeSet::Add( TiXmlAttribute* addMe )
+{
+	assert( !Find( addMe->Name() ) );	// Shouldn't be multiply adding to the set.
+
+	addMe->next = &sentinel;
+	addMe->prev = sentinel.prev;
+
+	sentinel.prev->next = addMe;
+	sentinel.prev      = addMe;
+}
+
+void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe )
+{
+	TiXmlAttribute* node;
+
+	for( node = sentinel.next; node != &sentinel; node = node->next )
+	{
+		if ( node == removeMe )
+		{
+			node->prev->next = node->next;
+			node->next->prev = node->prev;
+			node->next = 0;
+			node->prev = 0;
+			return;
+		}
+	}
+	assert( 0 );		// we tried to remove a non-linked attribute.
+}
+
+TiXmlAttribute*	TiXmlAttributeSet::Find( const char * name ) const
+{
+	TiXmlAttribute* node;
+
+	for( node = sentinel.next; node != &sentinel; node = node->next )
+	{
+		if ( node->name == name )
+			return node;
+	}
+	return 0;
+}
+
+
+#ifdef TIXML_USE_STL	
+TIXML_ISTREAM & operator >> (TIXML_ISTREAM & in, TiXmlNode & base)
+{
+	TIXML_STRING tag;
+	tag.reserve( 8 * 1000 );
+	base.StreamIn( &in, &tag );
+
+	base.Parse( tag.c_str() );
+	return in;
+}
+#endif
+
+
+TIXML_OSTREAM & operator<< (TIXML_OSTREAM & out, const TiXmlNode & base)
+{
+	base.StreamOut (& out);
+	return out;
+}
+
Index: /tags/DummyModules/VUT/work/tinyxml/tinyxml.h
===================================================================
--- /tags/DummyModules/VUT/work/tinyxml/tinyxml.h	(revision 61)
+++ /tags/DummyModules/VUT/work/tinyxml/tinyxml.h	(revision 61)
@@ -0,0 +1,956 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any
+purpose, including commercial applications, and to alter it and
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+*/
+
+
+#ifndef TINYXML_INCLUDED
+#define TINYXML_INCLUDED
+
+#ifdef _MSC_VER
+#pragma warning( disable : 4530 )
+#pragma warning( disable : 4786 )
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+// Help out windows:
+#if defined( _DEBUG ) && !defined( DEBUG )
+#define DEBUG
+#endif
+
+#if defined( DEBUG ) && defined( _MSC_VER )
+#define NOMINMAX
+#include <windows.h>
+#define TIXML_LOG OutputDebugString
+#else
+#define TIXML_LOG printf
+#endif
+
+
+#ifdef TIXML_USE_STL
+	#include <string>
+    #include <iostream>
+	#define TIXML_STRING	std::string
+	#define TIXML_ISTREAM	std::istream
+	#define TIXML_OSTREAM	std::ostream
+#else
+	#include "tinystr.h"
+	#define TIXML_STRING	TiXmlString
+	#define TIXML_OSTREAM	TiXmlOutStream
+#endif
+
+class TiXmlDocument;
+class TiXmlElement;
+class TiXmlComment;
+class TiXmlUnknown;
+class TiXmlAttribute;
+class TiXmlText;
+class TiXmlDeclaration;
+
+
+/*  TiXmlBase is a base class for every class in TinyXml.
+	It does little except to establish that TinyXml classes
+	can be printed and provide some utility functions.
+
+	In XML, the document and elements can contain
+	other elements and other types of nodes.
+
+	@verbatim
+	A Document can contain:	Element	(container or leaf)
+							Comment (leaf)
+							Unknown (leaf)
+							Declaration( leaf )
+
+	An Element can contain:	Element (container or leaf)
+							Text	(leaf)
+							Attributes (not on tree)
+							Comment (leaf)
+							Unknown (leaf)
+
+	A Decleration contains: Attributes (not on tree)
+	@endverbatim
+*/
+class TiXmlBase
+{
+	friend class TiXmlNode;
+	friend class TiXmlElement;
+	friend class TiXmlDocument;
+
+public:
+	TiXmlBase()								{}
+	virtual ~TiXmlBase()					{}
+
+	/**	All TinyXml classes can print themselves to a filestream.
+		This is a formatted print, and will insert tabs and newlines.
+		
+		(For an unformatted stream, use the << operator.)
+	*/
+	virtual void Print( FILE* cfile, int depth ) const = 0;
+
+	/**	The world does not agree on whether white space should be kept or
+		not. In order to make everyone happy, these global, static functions
+		are provided to set whether or not TinyXml will condense all white space
+		into a single space or not. The default is to condense. Note changing these
+		values is not thread safe.
+	*/
+	static void SetCondenseWhiteSpace( bool condense )		{ condenseWhiteSpace = condense; }
+
+	/// Return the current white space setting.
+	static bool IsWhiteSpaceCondensed()						{ return condenseWhiteSpace; }
+
+protected:
+
+	static const char*	SkipWhiteSpace( const char* );
+	inline static bool	IsWhiteSpace( int c )		{ return ( isspace( c ) || c == '\n' || c == '\r' ); }
+
+	virtual void StreamOut (TIXML_OSTREAM *) const = 0;
+
+	#ifdef TIXML_USE_STL
+	    static bool	StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	    static bool StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag );
+	#endif
+
+	/*	Reads an XML name into the string provided. Returns
+		a pointer just past the last character of the name,
+		or 0 if the function has an error.
+	*/
+	static const char* ReadName( const char* p, TIXML_STRING* name );
+
+	/*	Reads text. Returns a pointer past the given end tag.
+		Wickedly complex options, but it keeps the (sensitive) code in one place.
+	*/
+	static const char* ReadText(	const char* in,				// where to start
+									TIXML_STRING* text,			// the string read
+									bool ignoreWhiteSpace,		// whether to keep the white space
+									const char* endTag,			// what ends this text
+									bool ignoreCase );			// whether to ignore case in the end tag
+	virtual const char* Parse( const char* p ) = 0;
+
+	// If an entity has been found, transform it into a character.
+	static const char* GetEntity( const char* in, char* value );
+
+	// Get a character, while interpreting entities.
+	inline static const char* GetChar( const char* p, char* value )
+	{
+		assert( p );
+		if ( *p == '&' )
+		{
+			return GetEntity( p, value );
+		}
+		else
+		{
+			*value = *p;
+			return p+1;
+		}
+	}
+
+	// Puts a string to a stream, expanding entities as it goes.
+	// Note this should not contian the '<', '>', etc, or they will be transformed into entities!
+	static void PutString( const TIXML_STRING& str, TIXML_OSTREAM* out );
+
+	static void PutString( const TIXML_STRING& str, TIXML_STRING* out );
+
+	// Return true if the next characters in the stream are any of the endTag sequences.
+	bool static StringEqual(	const char* p,
+								const char* endTag,
+								bool ignoreCase );
+
+
+	enum
+	{
+		TIXML_NO_ERROR = 0,
+		TIXML_ERROR,
+		TIXML_ERROR_OPENING_FILE,
+		TIXML_ERROR_OUT_OF_MEMORY,
+		TIXML_ERROR_PARSING_ELEMENT,
+		TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME,
+		TIXML_ERROR_READING_ELEMENT_VALUE,
+		TIXML_ERROR_READING_ATTRIBUTES,
+		TIXML_ERROR_PARSING_EMPTY,
+		TIXML_ERROR_READING_END_TAG,
+		TIXML_ERROR_PARSING_UNKNOWN,
+		TIXML_ERROR_PARSING_COMMENT,
+		TIXML_ERROR_PARSING_DECLARATION,
+		TIXML_ERROR_DOCUMENT_EMPTY,
+
+		TIXML_ERROR_STRING_COUNT
+	};
+	static const char* errorString[ TIXML_ERROR_STRING_COUNT ];
+
+private:
+	struct Entity
+	{
+		const char*     str;
+		unsigned int	strLength;
+		char		    chr;
+	};
+	enum
+	{
+		NUM_ENTITY = 5,
+		MAX_ENTITY_LENGTH = 6
+
+	};
+	static Entity entity[ NUM_ENTITY ];
+	static bool condenseWhiteSpace;
+};
+
+
+/*  The parent class for everything in the Document Object Model.
+	(Except for attributes, which are contained in elements.)
+	Nodes have siblings, a parent, and children. A node can be
+	in a document, or stand on its own. The type of a TiXmlNode
+	can be queried, and it can be cast to its more defined type.
+*/
+class TiXmlNode : public TiXmlBase
+{
+	friend class TiXmlDocument;
+	friend class TiXmlElement;
+
+public:
+	#ifdef TIXML_USE_STL	
+
+	    /** An input stream operator, for every class. Tolerant of newlines and
+		    formatting, but doesn't expect them.
+	    */
+	    friend std::istream& operator >> (std::istream& in, TiXmlNode& base);
+
+	    /** An output stream operator, for every class. Note that this outputs
+		    without any newlines or formatting, as opposed to Print(), which
+		    includes tabs and new lines.
+
+		    The operator<< and operator>> are not completely symmetric. Writing
+		    a node to a stream is very well defined. You'll get a nice stream
+		    of output, without any extra whitespace or newlines.
+		    
+		    But reading is not as well defined. (As it always is.) If you create
+		    a TiXmlElement (for example) and read that from an input stream,
+		    the text needs to define an element or junk will result. This is
+		    true of all input streams, but it's worth keeping in mind.
+
+		    A TiXmlDocument will read nodes until it reads a root element.
+	    */	
+	    friend std::ostream & operator<< (std::ostream& out, const TiXmlNode& base);
+
+	#else
+	    // Used internally, not part of the public API.
+	    friend TIXML_OSTREAM& operator<< (TIXML_OSTREAM& out, const TiXmlNode& base);
+	#endif
+
+	/** The types of XML nodes supported by TinyXml. (All the
+			unsupported types are picked up by UNKNOWN.)
+	*/
+	enum NodeType
+	{
+		DOCUMENT,
+		ELEMENT,
+		COMMENT,
+		UNKNOWN,
+		TEXT,
+		DECLARATION,
+		TYPECOUNT
+	};
+
+	virtual ~TiXmlNode();
+
+	/** The meaning of 'value' changes for the specific type of
+		TiXmlNode.
+		@verbatim
+		Document:	filename of the xml file
+		Element:	name of the element
+		Comment:	the comment text
+		Unknown:	the tag contents
+		Text:		the text string
+		@endverbatim
+
+		The subclasses will wrap this function.
+	*/
+	const char * Value () const { return value.c_str (); }
+
+	/** Changes the value of the node. Defined as:
+		@verbatim
+		Document:	filename of the xml file
+		Element:	name of the element
+		Comment:	the comment text
+		Unknown:	the tag contents
+		Text:		the text string
+		@endverbatim
+	*/
+	void SetValue (const char * _value) { value = _value;}
+
+    #ifdef TIXML_USE_STL
+	/// STL std::string form.
+	void SetValue( const std::string& value )    
+	{	  
+		SetValue( value.c_str() );    	
+	}	
+	#endif
+
+	/// Delete all the children of this node. Does not affect 'this'.
+	void Clear();
+
+	/// One step up the DOM.
+	TiXmlNode* Parent() const					{ return parent; }
+
+	TiXmlNode* FirstChild()	const	{ return firstChild; }		///< The first child of this node. Will be null if there are no children.
+	TiXmlNode* FirstChild( const char * value ) const;			///< The first child of this node with the matching 'value'. Will be null if none found.
+
+	TiXmlNode* LastChild() const	{ return lastChild; }		/// The last child of this node. Will be null if there are no children.
+	TiXmlNode* LastChild( const char * value ) const;			/// The last child of this node matching 'value'. Will be null if there are no children.
+
+    #ifdef TIXML_USE_STL
+	TiXmlNode* FirstChild( const std::string& value ) const	{	return FirstChild (value.c_str ());	}	///< STL std::string form.
+	TiXmlNode* LastChild( const std::string& value ) const	{	return LastChild (value.c_str ());	}	///< STL std::string form.
+	#endif
+
+	/** An alternate way to walk the children of a node.
+		One way to iterate over nodes is:
+		@verbatim
+			for( child = parent->FirstChild(); child; child = child->NextSibling() )
+		@endverbatim
+
+		IterateChildren does the same thing with the syntax:
+		@verbatim
+			child = 0;
+			while( child = parent->IterateChildren( child ) )
+		@endverbatim
+
+		IterateChildren takes the previous child as input and finds
+		the next one. If the previous child is null, it returns the
+		first. IterateChildren will return null when done.
+	*/
+	TiXmlNode* IterateChildren( TiXmlNode* previous ) const;
+
+	/// This flavor of IterateChildren searches for children with a particular 'value'
+	TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous ) const;
+
+    #ifdef TIXML_USE_STL
+	TiXmlNode* IterateChildren( const std::string& value, TiXmlNode* previous ) const	{	return IterateChildren (value.c_str (), previous);	}	///< STL std::string form.
+	#endif
+
+	/** Add a new node related to this. Adds a child past the LastChild.
+		Returns a pointer to the new object or NULL if an error occured.
+	*/
+	TiXmlNode* InsertEndChild( const TiXmlNode& addThis );
+
+	/** Add a new node related to this. Adds a child before the specified child.
+		Returns a pointer to the new object or NULL if an error occured.
+	*/
+	TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
+
+	/** Add a new node related to this. Adds a child after the specified child.
+		Returns a pointer to the new object or NULL if an error occured.
+	*/
+	TiXmlNode* InsertAfterChild(  TiXmlNode* afterThis, const TiXmlNode& addThis );
+
+	/** Replace a child of this node.
+		Returns a pointer to the new object or NULL if an error occured.
+	*/
+	TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
+
+	/// Delete a child of this node.
+	bool RemoveChild( TiXmlNode* removeThis );
+
+	/// Navigate to a sibling node.
+	TiXmlNode* PreviousSibling() const			{ return prev; }
+
+	/// Navigate to a sibling node.
+	TiXmlNode* PreviousSibling( const char * ) const;
+
+    #ifdef TIXML_USE_STL
+	TiXmlNode* PreviousSibling( const std::string& value ) const	{	return PreviousSibling (value.c_str ());	}	///< STL std::string form.
+	TiXmlNode* NextSibling( const std::string& value) const	{	return NextSibling (value.c_str ());	}	///< STL std::string form.
+	#endif
+
+	/// Navigate to a sibling node.
+	TiXmlNode* NextSibling() const				{ return next; }
+
+	/// Navigate to a sibling node with the given 'value'.
+	TiXmlNode* NextSibling( const char * ) const;
+
+	/** Convenience function to get through elements.
+		Calls NextSibling and ToElement. Will skip all non-Element
+		nodes. Returns 0 if there is not another element.
+	*/
+	TiXmlElement* NextSiblingElement() const;
+
+	/** Convenience function to get through elements.
+		Calls NextSibling and ToElement. Will skip all non-Element
+		nodes. Returns 0 if there is not another element.
+	*/
+	TiXmlElement* NextSiblingElement( const char * ) const;
+
+    #ifdef TIXML_USE_STL
+	TiXmlElement* NextSiblingElement( const std::string& value) const	{	return NextSiblingElement (value.c_str ());	}	///< STL std::string form.
+	#endif
+
+	/// Convenience function to get through elements.
+	TiXmlElement* FirstChildElement()	const;
+
+	/// Convenience function to get through elements.
+	TiXmlElement* FirstChildElement( const char * value ) const;
+
+    #ifdef TIXML_USE_STL
+	TiXmlElement* FirstChildElement( const std::string& value ) const	{	return FirstChildElement (value.c_str ());	}	///< STL std::string form.
+	#endif
+
+	/// Query the type (as an enumerated value, above) of this node.
+	virtual int Type() const	{ return type; }
+
+	/** Return a pointer to the Document this node lives in.
+		Returns null if not in a document.
+	*/
+	TiXmlDocument* GetDocument() const;
+
+	/// Returns true if this node has no children.
+	bool NoChildren() const						{ return !firstChild; }
+
+	TiXmlDocument* ToDocument()	const		{ return ( this && type == DOCUMENT ) ? (TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlElement*  ToElement() const		{ return ( this && type == ELEMENT  ) ? (TiXmlElement*)  this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlComment*  ToComment() const		{ return ( this && type == COMMENT  ) ? (TiXmlComment*)  this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlUnknown*  ToUnknown() const		{ return ( this && type == UNKNOWN  ) ? (TiXmlUnknown*)  this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlText*	   ToText()    const		{ return ( this && type == TEXT     ) ? (TiXmlText*)     this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlDeclaration* ToDeclaration() const	{ return ( this && type == DECLARATION ) ? (TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+
+	virtual TiXmlNode* Clone() const = 0;
+
+	void  SetUserData( void* user )			{ userData = user; }
+	void* GetUserData()						{ return userData; }
+
+protected:
+	TiXmlNode( NodeType type );
+
+	#ifdef TIXML_USE_STL
+	    // The real work of the input operator.
+	    virtual void StreamIn( TIXML_ISTREAM* in, TIXML_STRING* tag ) = 0;
+	#endif
+
+	// The node is passed in by ownership. This object will delete it.
+	TiXmlNode* LinkEndChild( TiXmlNode* addThis );
+
+	// Figure out what is at *p, and parse it. Returns null if it is not an xml node.
+	TiXmlNode* Identify( const char* start );
+	void CopyToClone( TiXmlNode* target ) const	{ target->SetValue (value.c_str() );
+												  target->userData = userData; }
+
+	// Internal Value function returning a TIXML_STRING
+	TIXML_STRING SValue() const	{ return value ; }
+
+	TiXmlNode*		parent;
+	NodeType		type;
+
+	TiXmlNode*		firstChild;
+	TiXmlNode*		lastChild;
+
+	TIXML_STRING	value;
+
+	TiXmlNode*		prev;
+	TiXmlNode*		next;
+	void*			userData;
+};
+
+
+/*  An attribute is a name-value pair. Elements have an arbitrary
+	number of attributes, each with a unique name.
+
+	@note The attributes are not TiXmlNodes, since they are not
+		  part of the tinyXML document object model. There are other
+		  suggested ways to look at this problem.
+
+	@note Attributes have a parent
+*/
+class TiXmlAttribute : public TiXmlBase
+{
+	friend class TiXmlAttributeSet;
+
+public:
+	/// Construct an empty attribute.
+	TiXmlAttribute() : prev( 0 ), next( 0 )	{}
+
+	#ifdef TIXML_USE_STL
+	/// std::string constructor.
+	TiXmlAttribute( const std::string& _name, const std::string& _value )
+	{
+		name = _name;
+		value = _value;
+	}
+	#endif
+
+	/// Construct an attribute with a name and value.
+	TiXmlAttribute( const char * _name, const char * _value ): name( _name ), value( _value ), prev( 0 ), next( 0 ) {}
+	const char*		Name()  const		{ return name.c_str (); }		///< Return the name of this attribute.
+	const char*		Value() const		{ return value.c_str (); }		///< Return the value of this attribute.
+	const int       IntValue() const;									///< Return the value of this attribute, converted to an integer.
+	const double	DoubleValue() const;								///< Return the value of this attribute, converted to a double.
+
+	void SetName( const char* _name )	{ name = _name; }				///< Set the name of this attribute.
+	void SetValue( const char* _value )	{ value = _value; }				///< Set the value.
+
+	void SetIntValue( int value );										///< Set the value from an integer.
+	void SetDoubleValue( double value );								///< Set the value from a double.
+
+    #ifdef TIXML_USE_STL
+	/// STL std::string form.
+	void SetName( const std::string& _name )	
+	{	
+		SetName(_name.c_str() );	
+	}
+	/// STL std::string form.	
+	void SetValue( const std::string& _value )	
+	{	
+		SetValue( value.c_str() );	
+	}
+	#endif
+
+	/// Get the next sibling attribute in the DOM. Returns null at end.
+	TiXmlAttribute* Next() const;
+	/// Get the previous sibling attribute in the DOM. Returns null at beginning.
+	TiXmlAttribute* Previous() const;
+
+	bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; }
+	bool operator<( const TiXmlAttribute& rhs )	 const { return name < rhs.name; }
+	bool operator>( const TiXmlAttribute& rhs )  const { return name > rhs.name; }
+
+	/*	[internal use]
+		Attribtue parsing starts: first letter of the name
+						 returns: the next char after the value end quote
+	*/
+	virtual const char* Parse( const char* p );
+
+	// [internal use]
+	virtual void Print( FILE* cfile, int depth ) const;
+
+	virtual void StreamOut( TIXML_OSTREAM * out ) const;
+	// [internal use]
+	// Set the document pointer so the attribute can report errors.
+	void SetDocument( TiXmlDocument* doc )	{ document = doc; }
+
+private:
+	TiXmlDocument*	document;	// A pointer back to a document, for error reporting.
+	TIXML_STRING name;
+	TIXML_STRING value;
+	TiXmlAttribute*	prev;
+	TiXmlAttribute*	next;
+};
+
+
+/*	A class used to manage a group of attributes.
+	It is only used internally, both by the ELEMENT and the DECLARATION.
+	
+	The set can be changed transparent to the Element and Declaration
+	classes that use it, but NOT transparent to the Attribute
+	which has to implement a next() and previous() method. Which makes
+	it a bit problematic and prevents the use of STL.
+
+	This version is implemented with circular lists because:
+		- I like circular lists
+		- it demonstrates some independence from the (typical) doubly linked list.
+*/
+class TiXmlAttributeSet
+{
+public:
+	TiXmlAttributeSet();
+	~TiXmlAttributeSet();
+
+	void Add( TiXmlAttribute* attribute );
+	void Remove( TiXmlAttribute* attribute );
+
+	TiXmlAttribute* First() const	{ return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
+	TiXmlAttribute* Last()  const	{ return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
+	TiXmlAttribute*	Find( const char * name ) const;
+
+private:
+	TiXmlAttribute sentinel;
+};
+
+
+/*  The element is a container class. It has a value, the element name,
+	and can contain other elements, text, comments, and unknowns.
+	Elements also contain an arbitrary number of attributes.
+*/
+class TiXmlElement : public TiXmlNode
+{
+public:
+	/// Construct an element.
+	TiXmlElement (const char * in_value);
+
+	#ifdef TIXML_USE_STL
+	/// std::string constructor.
+	TiXmlElement( const std::string& _value ) : 	TiXmlNode( TiXmlNode::ELEMENT )
+	{
+		firstChild = lastChild = 0;
+		value = _value;
+	}
+	#endif
+
+	virtual ~TiXmlElement();
+
+// OGRE CHANGE 
+// Resolve ambiguity of std::string / const char* conversion of Ogre::String
+#ifndef TIXML_USE_STL
+// OGRE CHANGE
+	/** Given an attribute name, attribute returns the value
+		for the attribute of that name, or null if none exists.
+	*/
+	const char* Attribute( const char* name ) const;
+
+	/** Given an attribute name, attribute returns the value
+		for the attribute of that name, or null if none exists.
+		If the attribute exists and can be converted to an integer,
+		the integer value will be put in the return 'i', if 'i'
+		is non-null.
+	*/
+	const char* Attribute( const char* name, int* i ) const;
+
+	/** Sets an attribute of name to a given value. The attribute
+		will be created if it does not exist, or changed if it does.
+	*/
+	void SetAttribute( const char* name, const char * value );
+// OGRE CHANGE
+#endif
+// OGRE CHANGE
+    #ifdef TIXML_USE_STL
+	const char* Attribute( const std::string& name ) const;
+	const char* Attribute( const std::string& name, int* i ) const;
+
+	/// STL std::string form.
+	void SetAttribute( const std::string& name, const std::string& value );
+	///< STL std::string form.
+	void SetAttribute( const std::string& name, int value );
+	#endif
+
+	/** Sets an attribute of name to a given value. The attribute
+		will be created if it does not exist, or changed if it does.
+	*/
+	void SetAttribute( const char * name, int value );
+
+	/** Deletes an attribute with the given name.
+	*/
+	void RemoveAttribute( const char * name );
+    #ifdef TIXML_USE_STL
+	void RemoveAttribute( const std::string& name )	{	RemoveAttribute (name.c_str ());	}	///< STL std::string form.
+	#endif
+
+	TiXmlAttribute* FirstAttribute() const	{ return attributeSet.First(); }		///< Access the first attribute in this element.
+	TiXmlAttribute* LastAttribute()	const 	{ return attributeSet.Last(); }		///< Access the last attribute in this element.
+
+	// [internal use] Creates a new Element and returs it.
+	virtual TiXmlNode* Clone() const;
+	// [internal use]
+
+	virtual void Print( FILE* cfile, int depth ) const;
+
+protected:
+
+	// Used to be public [internal use]
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+	virtual void StreamOut( TIXML_OSTREAM * out ) const;
+
+	/*	[internal use]
+		Attribtue parsing starts: next char past '<'
+						 returns: next char past '>'
+	*/
+	virtual const char* Parse( const char* p );
+
+	/*	[internal use]
+		Reads the "value" of the element -- another element, or text.
+		This should terminate with the current end tag.
+	*/
+	const char* ReadValue( const char* in );
+
+private:
+	TiXmlAttributeSet attributeSet;
+};
+
+
+/* 	An XML comment.
+*/
+class TiXmlComment : public TiXmlNode
+{
+public:
+	/// Constructs an empty comment.
+	TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {}
+	virtual ~TiXmlComment()	{}
+
+	// [internal use] Creates a new Element and returs it.
+	virtual TiXmlNode* Clone() const;
+	// [internal use]
+	virtual void Print( FILE* cfile, int depth ) const;
+protected:
+	// used to be public
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+	virtual void StreamOut( TIXML_OSTREAM * out ) const;
+	/*	[internal use]
+		Attribtue parsing starts: at the ! of the !--
+						 returns: next char past '>'
+	*/
+	virtual const char* Parse( const char* p );
+};
+
+
+/*  XML text. Contained in an element.
+*/
+class TiXmlText : public TiXmlNode
+{
+	friend class TiXmlElement;
+public:
+	/// Constructor.
+	TiXmlText (const char * initValue) : TiXmlNode (TiXmlNode::TEXT)
+	{
+		SetValue( initValue );
+	}
+	virtual ~TiXmlText() {}
+
+	#ifdef TIXML_USE_STL
+	/// Constructor.
+	TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT)
+	{
+		SetValue( initValue );
+	}
+	#endif
+
+protected :
+	// [internal use] Creates a new Element and returns it.
+	virtual TiXmlNode* Clone() const;
+	// [internal use]
+	virtual void Print( FILE* cfile, int depth ) const;
+	virtual void StreamOut ( TIXML_OSTREAM * out ) const;
+	// [internal use]
+	bool Blank() const;	// returns true if all white space and new lines
+	/*	[internal use]
+			Attribtue parsing starts: First char of the text
+							 returns: next char past '>'
+		*/
+	virtual const char* Parse( const char* p );
+	// [internal use]
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+};
+
+
+/*  In correct XML the declaration is the first entry in the file.
+	@verbatim
+		<?xml version="1.0" standalone="yes"?>
+	@endverbatim
+
+	TinyXml will happily read or write files without a declaration,
+	however. There are 3 possible attributes to the declaration:
+	version, encoding, and standalone.
+
+	Note: In this version of the code, the attributes are
+	handled as special cases, not generic attributes, simply
+	because there can only be at most 3 and they are always the same.
+*/
+class TiXmlDeclaration : public TiXmlNode
+{
+public:
+	/// Construct an empty declaration.
+	TiXmlDeclaration()   : TiXmlNode( TiXmlNode::DECLARATION ) {}
+
+#ifdef TIXML_USE_STL
+	/// Constructor.
+	TiXmlDeclaration(
+						const std::string& _version,
+						const std::string& _encoding,
+						const std::string& _standalone )
+					: TiXmlNode( TiXmlNode::DECLARATION )
+	{
+		version = _version;
+		encoding = _encoding;
+		standalone = _standalone;
+	}
+#endif
+
+	/// Construct.
+	TiXmlDeclaration::TiXmlDeclaration( const char * _version,
+										const char * _encoding,
+										const char * _standalone );
+
+	virtual ~TiXmlDeclaration()	{}
+
+	/// Version. Will return empty if none was found.
+	const char * Version() const		{ return version.c_str (); }
+	/// Encoding. Will return empty if none was found.
+	const char * Encoding() const		{ return encoding.c_str (); }
+	/// Is this a standalone document?
+	const char * Standalone() const		{ return standalone.c_str (); }
+
+	// [internal use] Creates a new Element and returs it.
+	virtual TiXmlNode* Clone() const;
+	// [internal use]
+	virtual void Print( FILE* cfile, int depth ) const;
+
+protected:
+	// used to be public
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+	virtual void StreamOut ( TIXML_OSTREAM * out) const;
+	//	[internal use]
+	//	Attribtue parsing starts: next char past '<'
+	//					 returns: next char past '>'
+
+	virtual const char* Parse( const char* p );
+
+private:
+	TIXML_STRING version;
+	TIXML_STRING encoding;
+	TIXML_STRING standalone;
+};
+
+
+/*  Any tag that tinyXml doesn't recognize is save as an
+	unknown. It is a tag of text, but should not be modified.
+	It will be written back to the XML, unchanged, when the file
+	is saved.
+*/
+class TiXmlUnknown : public TiXmlNode
+{
+public:
+	TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {}
+	virtual ~TiXmlUnknown() {}
+
+	// [internal use]
+	virtual TiXmlNode* Clone() const;
+	// [internal use]
+	virtual void Print( FILE* cfile, int depth ) const;
+protected:
+	// used to be public
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+	virtual void StreamOut ( TIXML_OSTREAM * out ) const;
+	/*	[internal use]
+		Attribute parsing starts: First char of the text
+						 returns: next char past '>'
+	*/
+	virtual const char* Parse( const char* p );
+};
+
+
+/*  Always the top level node. A document binds together all the
+	XML pieces. It can be saved, loaded, and printed to the screen.
+	The 'value' of a document node is the xml file name.
+*/
+class TiXmlDocument : public TiXmlNode
+{
+public:
+	/// Create an empty document, that has no name.
+	TiXmlDocument();
+	/// Create a document with a name. The name of the document is also the filename of the xml.
+	TiXmlDocument( const char * documentName );
+
+	#ifdef TIXML_USE_STL
+	/// Constructor.
+	TiXmlDocument( const std::string& documentName ) :
+	    TiXmlNode( TiXmlNode::DOCUMENT )
+	{
+        value = documentName;
+		error = false;
+	}
+	#endif
+
+	virtual ~TiXmlDocument() {}
+
+	/** Load a file using the current document value.
+		Returns true if successful. Will delete any existing
+		document data before loading.
+	*/
+	bool LoadFile();
+	/// Save a file using the current document value. Returns true if successful.
+	bool SaveFile() const;
+	/// Load a file using the given filename. Returns true if successful.
+	bool LoadFile( const char * filename );
+	/// Save a file using the given filename. Returns true if successful.
+	bool SaveFile( const char * filename ) const;
+
+	#ifdef TIXML_USE_STL
+	bool LoadFile( const std::string& filename )			///< STL std::string version.
+	{
+		return ( LoadFile( filename.c_str() ));
+	}
+	bool SaveFile( const std::string& filename ) const		///< STL std::string version.
+	{
+		//StringToBuffer f( filename );
+		return ( SaveFile( filename.c_str() ));
+	}
+	#endif
+
+	/// Parse the given null terminated block of xml data.
+	virtual const char* Parse( const char* p );
+
+	/** Get the root element -- the only top level element -- of the document.
+		In well formed XML, there should only be one. TinyXml is tolerant of
+		multiple elements at the document level.
+	*/
+	TiXmlElement* RootElement() const		{ return FirstChildElement(); }
+
+	/// If, during parsing, a error occurs, Error will be set to true.
+	bool Error() const						{ return error; }
+
+	/// Contains a textual (english) description of the error if one occurs.
+	const char * ErrorDesc() const	{ return errorDesc.c_str (); }
+
+	/** Generally, you probably want the error string ( ErrorDesc() ). But if you
+			prefer the ErrorId, this function will fetch it.
+		*/
+	const int ErrorId()	const				{ return errorId; }
+
+	/// If you have handled the error, it can be reset with this call.
+	void ClearError()						{ error = false; errorId = 0; errorDesc = ""; }
+
+	/** Dump the document to standard out. */
+	void Print() const						{ Print( stdout, 0 ); }
+
+	// [internal use]
+	virtual void Print( FILE* cfile, int depth = 0 ) const;
+	// [internal use]
+	void SetError( int err ) {		assert( err > 0 && err < TIXML_ERROR_STRING_COUNT );
+		error   = true;
+		errorId = err;
+	errorDesc = errorString[ errorId ]; }
+
+protected :
+	virtual void StreamOut ( TIXML_OSTREAM * out) const;
+	// [internal use]
+	virtual TiXmlNode* Clone() const;
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+
+private:
+	bool error;
+	int  errorId;
+	TIXML_STRING errorDesc;
+};
+
+#endif
+
Index: /tags/DummyModules/VUT/work/tinyxml/tinystr.cpp
===================================================================
--- /tags/DummyModules/VUT/work/tinyxml/tinystr.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/tinyxml/tinystr.cpp	(revision 61)
@@ -0,0 +1,265 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original file by Yves Berquin.
+
+This software is provided 'as-is', without any express or implied 
+warranty. In no event will the authors be held liable for any 
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any 
+purpose, including commercial applications, and to alter it and 
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must 
+not claim that you wrote the original software. If you use this 
+software in a product, an acknowledgment in the product documentation 
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source 
+distribution.
+*/
+
+#include "tinyxml.h"
+
+#ifndef TIXML_USE_STL
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "tinystr.h"
+
+// TiXmlString constructor, based on a C string
+TiXmlString::TiXmlString (const char* instring)
+{
+    unsigned newlen;
+    char * newstring;
+
+    if (!instring)
+    {
+        allocated = 0;
+        cstring = NULL;
+        return;
+    }
+    newlen = strlen (instring) + 1;
+    newstring = new char [newlen];
+    strcpy (newstring, instring);
+    allocated = newlen;
+    cstring = newstring;
+}
+
+// TiXmlString copy constructor
+TiXmlString::TiXmlString (const TiXmlString& copy)
+{
+    unsigned newlen;
+    char * newstring;
+
+	// Prevent copy to self!
+	if ( &copy == this )
+		return;
+
+    if (! copy . allocated)
+    {
+        allocated = 0;
+        cstring = NULL;
+        return;
+    }
+    newlen = strlen (copy . cstring) + 1;
+    newstring = new char [newlen];
+    strcpy (newstring, copy . cstring);
+    allocated = newlen;
+    cstring = newstring;
+}
+
+// TiXmlString = operator. Safe when assign own content
+void TiXmlString ::operator = (const char * content)
+{
+    unsigned newlen;
+    char * newstring;
+
+    if (! content)
+    {
+        empty_it ();
+        return;
+    }
+    newlen = strlen (content) + 1;
+    newstring = new char [newlen];
+    strcpy (newstring, content);
+    empty_it ();
+    allocated = newlen;
+    cstring = newstring;
+}
+
+// = operator. Safe when assign own content
+void TiXmlString ::operator = (const TiXmlString & copy)
+{
+    unsigned newlen;
+    char * newstring;
+
+    if (! copy . length ())
+    {
+        empty_it ();
+        return;
+    }
+    newlen = copy . length () + 1;
+    newstring = new char [newlen];
+    strcpy (newstring, copy . c_str ());
+    empty_it ();
+    allocated = newlen;
+    cstring = newstring;
+}
+
+
+//// Checks if a TiXmlString contains only whitespace (same rules as isspace)
+//bool TiXmlString::isblank () const
+//{
+//    char * lookup;
+//    for (lookup = cstring; * lookup; lookup++)
+//        if (! isspace (* lookup))
+//            return false;
+//    return true;
+//}
+
+// append a const char * to an existing TiXmlString
+void TiXmlString::append( const char* str, int len )
+{
+    char * new_string;
+    unsigned new_alloc, new_size;
+
+    new_size = length () + len + 1;
+    // check if we need to expand
+    if (new_size > allocated)
+    {
+        // compute new size
+        new_alloc = assign_new_size (new_size);
+
+        // allocate new buffer
+        new_string = new char [new_alloc];        
+        new_string [0] = 0;
+
+        // copy the previous allocated buffer into this one
+        if (allocated && cstring)
+            strcpy (new_string, cstring);
+
+        // append the suffix. It does exist, otherwize we wouldn't be expanding 
+        strncat (new_string, str, len);
+
+        // return previsously allocated buffer if any
+        if (allocated && cstring)
+            delete [] cstring;
+
+        // update member variables
+        cstring = new_string;
+        allocated = new_alloc;
+    }
+    else
+        // we know we can safely append the new string
+        strncat (cstring, str, len);
+}
+
+
+// append a const char * to an existing TiXmlString
+void TiXmlString::append( const char * suffix )
+{
+    char * new_string;
+    unsigned new_alloc, new_size;
+
+    new_size = length () + strlen (suffix) + 1;
+    // check if we need to expand
+    if (new_size > allocated)
+    {
+        // compute new size
+        new_alloc = assign_new_size (new_size);
+
+        // allocate new buffer
+        new_string = new char [new_alloc];        
+        new_string [0] = 0;
+
+        // copy the previous allocated buffer into this one
+        if (allocated && cstring)
+            strcpy (new_string, cstring);
+
+        // append the suffix. It does exist, otherwize we wouldn't be expanding 
+        strcat (new_string, suffix);
+
+        // return previsously allocated buffer if any
+        if (allocated && cstring)
+            delete [] cstring;
+
+        // update member variables
+        cstring = new_string;
+        allocated = new_alloc;
+    }
+    else
+        // we know we can safely append the new string
+        strcat (cstring, suffix);
+}
+
+// Check for TiXmlString equuivalence
+//bool TiXmlString::operator == (const TiXmlString & compare) const
+//{
+//    return (! strcmp (c_str (), compare . c_str ()));
+//}
+
+unsigned TiXmlString::length () const
+{
+    if (allocated)
+        return strlen (cstring);
+    return 0;
+}
+
+
+unsigned TiXmlString::find (char tofind, unsigned offset) const
+{
+    char * lookup;
+
+    if (offset >= length ())
+        return (unsigned) notfound;
+    for (lookup = cstring + offset; * lookup; lookup++)
+        if (* lookup == tofind)
+            return lookup - cstring;
+    return (unsigned) notfound;
+}
+
+
+bool TiXmlString::operator == (const TiXmlString & compare) const
+{
+	if ( allocated && compare.allocated )
+	{
+		assert( cstring );
+		assert( compare.cstring );
+		return ( strcmp( cstring, compare.cstring ) == 0 );
+ 	}
+	return false;
+}
+
+
+bool TiXmlString::operator < (const TiXmlString & compare) const
+{
+	if ( allocated && compare.allocated )
+	{
+		assert( cstring );
+		assert( compare.cstring );
+		return ( strcmp( cstring, compare.cstring ) > 0 );
+ 	}
+	return false;
+}
+
+
+bool TiXmlString::operator > (const TiXmlString & compare) const
+{
+	if ( allocated && compare.allocated )
+	{
+		assert( cstring );
+		assert( compare.cstring );
+		return ( strcmp( cstring, compare.cstring ) < 0 );
+ 	}
+	return false;
+}
+
+
+#endif	// TIXML_USE_STL
Index: /tags/DummyModules/VUT/work/TestCulling/TestCulling.vcproj
===================================================================
--- /tags/DummyModules/VUT/work/TestCulling/TestCulling.vcproj	(revision 64)
+++ /tags/DummyModules/VUT/work/TestCulling/TestCulling.vcproj	(revision 64)
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="TestCulling"
+	ProjectGUID="{248F19A6-2FE0-4F5D-8928-E0EA10609887}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory=".\bin\$(ConfigurationName)"
+			IntermediateDirectory=".\obj\$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(OGRE_PATH)\Dependencies\include&quot;;&quot;$(OGRE_PATH)\OgreMain\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include\CEGUI&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\include&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\include&quot;;../include"
+				PreprocessorDefinitions="_WINDOWS;_STLP_USE_DYNAMIC_LIB;OGRE_LIBRARY_IMPORTS;_DEBUG;WIN32;_STLP_DEBUG;PLUGIN_TERRAIN_IMPORTS"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="Plugin_OctreeSceneManager.lib OGREMain_d.LIB CEGUIBase_d.lib OgreGUIRenderer_d.lib Plugin_DotSceneManager.lib"
+				OutputFile="$(OGRE_PATH)/Samples/Common/bin/Debug/TestCulling.exe"
+				LinkIncremental="2"
+				AdditionalLibraryDirectories="&quot;$(OGRE_PATH)\Dependencies\Lib\Debug&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\bin\debug&quot;;&quot;$(OGRE_PATH)\OgreMain\Lib\Debug&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\bin\debug&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\lib&quot;"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/TestCulling.pdb"
+				SubSystem="2"
+				ImportLibrary=""
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\..\Samples\Common\Include, ..\..\..\OgreMain\include"
+				PreprocessorDefinitions="_WINDOWS,_STLP_USE_DYNAMIC_LIB,OGRE_LIBRARY_IMPORTS,_RELEASE,WIN32,_STLP_RELEASE"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="OGREMain.LIB"
+				OutputFile="..\..\..\Samples\Common\Bin\Release\TestCulling.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="..\..\..\OgreMain\Lib\Release"
+				GenerateDebugInformation="TRUE"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath=".\TestCullingApplication.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath=".\TestCullingApplication.h">
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: /tags/DummyModules/VUT/work/TestCulling/TestCullingApplication.cpp
===================================================================
--- /tags/DummyModules/VUT/work/TestCulling/TestCullingApplication.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCulling/TestCullingApplication.cpp	(revision 61)
@@ -0,0 +1,348 @@
+/**
+    \file 
+        TestCullingApplication.cpp
+    \brief
+        Tests the occlusion culling algorithm
+*/
+
+#include <OgreNoMemoryMacros.h>
+#include <CEGUI/CEGUI.h>
+#include <../CEGUIRenderer/include/OgreCEGUIRenderer.h>
+#include <../CEGUIRenderer/include/OgreCEGUIResourceProvider.h>
+#include <../CEGUIRenderer/include/OgreCEGUITexture.h>
+#include <OgreMemoryMacros.h>
+
+#include "Ogre.h"
+#include "TestCullingApplication.h"
+//#include "OgreVisibilitySceneTraverser.h"
+
+#define WIN32_LEAN_AND_MEAN
+#include "windows.h"
+
+
+/***********************************************/
+/* TestCullingApplication implementation       */
+/***********************************************/
+
+//-----------------------------------------------------------------------
+/*void TestCullingApplication::createCamera( void )
+{
+	// Create the camera
+	mCamera = mSceneMgr->createCamera("PlayerCam");
+
+	// Position it at 500 in Z direction
+	mCamera->setPosition(Vector3(128,25,128));
+
+	// Look back along -Z
+    mCamera->lookAt(Vector3(0,0,-300));
+    mCamera->setNearClipDistance( 1 );
+    mCamera->setFarClipDistance( 1000 );
+}*/
+//-----------------------------------------------------------------------
+void TestCullingApplication::createScene(void)
+{
+	// Set ambient light
+	mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
+	
+	// Create a light
+	Light* l = mSceneMgr->createLight("MainLight");
+	//l->setPosition(20,80,50);
+
+	mMinTranslation = Vector3(-70.0f, -70.0f, 0.0f);
+	mMaxTranslation = Vector3(70.0f, 70.0f, 600.0f);
+
+	mMinAngle = Vector3(0, 0, 0);
+	mMaxAngle = Vector3(360, 360, 360);
+
+	generateScene(330);
+
+	// Create a skybox
+    //mSceneMgr->setSkyBox(true, "Examples/CloudyNoonSkyBox", 1000, false);
+    ColourValue fadeColour(0.1, 0.1, 0.6);
+	mWindow->getViewport(0)->setBackgroundColour(fadeColour);
+
+	// CEGUI setup
+	setupGui();
+}
+//-----------------------------------------------------------------------
+void TestCullingApplication::setupGui( void )
+{
+	 mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, ST_EXTERIOR_CLOSE);
+     mGUISystem = new CEGUI::System(mGUIRenderer);
+
+	 // Mouse
+     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
+     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
+	 mGUISystem->setDefaultMouseCursor(
+                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
+
+	 CEGUI::MouseCursor::getSingleton().show( );
+}
+//-----------------------------------------------------------------------
+void TestCullingApplication::createFrameListener(void)
+{
+	mFrameListener= new MouseQueryListener(mWindow, mCamera, mSceneMgr, mGUIRenderer);
+	mFrameListener->showDebugOverlay(true);
+	mRoot->addFrameListener(mFrameListener);
+}
+//-----------------------------------------------------------------------
+void TestCullingApplication::chooseSceneManager(void)
+{
+    mSceneMgr = mRoot->getSceneManager(ST_GENERIC);
+}
+//-----------------------------------------------------------------------
+void TestCullingApplication::generateSceneObject(const Vector3 &translationRatio, 
+												 const Vector3 &rotationRatio, const int idx, const String& entName)
+{
+	Vector3 rotation = mMinAngle + rotationRatio * (mMaxAngle - mMinAngle);
+	Vector3 translation = mMinTranslation + translationRatio * (mMaxTranslation - mMinTranslation);
+
+	char name[16];
+    sprintf( name, "object%d", idx );
+
+    Entity *ent = mSceneMgr->createEntity( name, entName );
+	SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode( String(name) + "Node", translation);
+	node->attachObject(ent);
+	node->scale(0.1,0.1,0.1);
+
+	node->yaw(Degree(rotation.x));
+    node->pitch(Degree(rotation.y));
+	node->roll(Degree(rotation.z));
+}
+//-----------------------------------------------------------------------
+void TestCullingApplication::generateScene( int numObjects )
+{
+	srand (time (0));
+	
+	Vector3 rotationRatio;
+	Vector3 translationRatio;
+
+	for(int i=0; i < numObjects; i++)
+	{
+		rotationRatio.x = rand() / (float) RAND_MAX;
+		rotationRatio.y = rand() / (float) RAND_MAX;
+		rotationRatio.z = rand() / (float) RAND_MAX;
+
+		translationRatio.x = rand() / (float) RAND_MAX;
+		translationRatio.y = rand() / (float) RAND_MAX;
+		translationRatio.z = rand() / (float) RAND_MAX;
+
+		generateSceneObject(translationRatio, rotationRatio, i, "sphere.mesh");
+	}
+}
+/***********************************************/
+/* MouseQueryListener implementation           */
+/***********************************************/
+//-----------------------------------------------------------------------
+MouseQueryListener::MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer)
+        : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer), 
+		mShutdownRequested(false)
+{
+
+	// Setup default variables
+	//mOgreHead = NULL;
+	mLMouseDown = false;
+	mRMouseDown = false;
+	mSceneMgr = sceneManager;
+
+    // Reduce move speed
+	mMoveSpeed = 50;
+	mRotateSpeed *= 2;
+
+	mCurrentAlgorithm = 0;//VisibilitySceneTraverser::RENDER_COHERENT;
+	mThreshold = 0;
+    
+	// Register this so that we get mouse events.
+	mEventProcessor->addMouseListener(this);
+	mEventProcessor->addMouseMotionListener(this);
+	mEventProcessor->addKeyListener(this);
+
+	// show overlay
+	Overlay* pOver = OverlayManager::getSingleton().getByName("Example/VisibilityDemoOverlay"); 
+
+	mAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/AlgorithmInfo");
+	mThresholdInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/ThresholdInfo");
+	mFrustumCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/FrustumCulledNodesInfo");
+	mQueryCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/QueryCulledNodesInfo");
+    mTraversedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/TraversedNodesInfo");
+	mSceneNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/SceneNodesInfo");
+	mHierarchyNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/HierarchyNodesInfo");
+	mRenderedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/RenderedNodesInfo");
+
+	mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
+	mThresholdInfo->setCaption(": 0");
+	mFrustumCulledNodesInfo->setCaption(": 0");
+	mQueryCulledNodesInfo->setCaption(": 0");
+	mTraversedNodesInfo->setCaption(": 0");
+	mSceneNodesInfo->setCaption(": 0");
+	mHierarchyNodesInfo->setCaption(": 0");
+	mRenderedNodesInfo->setCaption(": 0");
+
+    pOver->show();
+} 
+//-----------------------------------------------------------------------
+MouseQueryListener::~MouseQueryListener( )
+{
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::mouseMoved (MouseEvent *e)
+{
+	// Update CEGUI with the mouse motion
+    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() * mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::mousePressed(MouseEvent* e)
+{
+     // Left mouse button down
+     if (e->getButtonID() & InputEvent::BUTTON0_MASK)
+     {
+		mLMouseDown = true; 
+     }
+     // Right mouse button down
+     else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
+     {
+         CEGUI::MouseCursor::getSingleton().hide( );
+         mRMouseDown = true;
+     } // else if
+} // mousePressed
+
+ //-----------------------------------------------------------------------
+void MouseQueryListener::mouseReleased(MouseEvent* e)
+{
+    // Left mouse button up
+    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
+    {
+		CEGUI::MouseCursor::getSingleton().show( );
+        mLMouseDown = false;
+    }
+    // Right mouse button up
+    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
+    {
+        CEGUI::MouseCursor::getSingleton().show( );
+        mRMouseDown = false;
+    }
+} 
+//-----------------------------------------------------------------------
+void MouseQueryListener::mouseDragged (MouseEvent *e)
+ {
+	 // If we are dragging the left mouse button.	 	 
+	 if ( mLMouseDown )
+     {
+		
+     }
+	 // If we are dragging the right mouse button.
+	 if ( mRMouseDown )
+	 {
+		 mCamera->yaw( -e->getRelX() * mRotateSpeed );
+		 mCamera->pitch( -e->getRelY() * mRotateSpeed );
+	 }
+}
+//-----------------------------------------------------------------------
+bool MouseQueryListener::frameStarted(const FrameEvent &evt)
+{	 
+	return ExampleFrameListener::frameStarted(evt);
+}
+//-----------------------------------------------------------------------
+bool MouseQueryListener::frameEnded(const FrameEvent& evt)
+{
+	if (mShutdownRequested)
+		return false;
+
+    if (timeDelay >= 0) 
+        timeDelay -= evt.timeSinceLastFrame;
+
+    KEY_PRESSED(KC_SPACE, 0.3, changeAlgorithm());
+
+	KEY_PRESSED(KC_SUBTRACT, 0, changeThreshold(-10));
+	KEY_PRESSED(KC_ADD, 0, changeThreshold(10));
+	//KEY_PRESSED(KC_T, 1, change);
+      
+	changeStats();
+
+    return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);        
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeThreshold(int incr)
+{
+	mThreshold += incr; if(mThreshold < 0) mThreshold = 0;
+	
+	char str[100]; sprintf(str,": %d", mThreshold);
+
+	mSceneMgr->setOption("Threshold", &mThreshold); 
+	mThresholdInfo->setCaption(str);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeAlgorithm()
+{
+    //mCurrentAlgorithm = ++mCurrentAlgorithm % VisibilitySceneTraverser::NUM_RENDERMODES;
+
+	mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
+	mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeStats()
+{
+	unsigned int opt = 0;
+	char str[100];
+	
+	mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt); 
+	mFrustumCulledNodesInfo->setCaption(str);
+	
+	mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt); 
+	mQueryCulledNodesInfo->setCaption(str);
+	
+	mSceneMgr->getOption("NumTraversedNodes", &opt); sprintf(str,": %d", opt); 
+	mTraversedNodesInfo->setCaption(str);
+
+	mSceneMgr->getOption("NumSceneNodes", &opt); sprintf(str,": %d", opt); 
+	mSceneNodesInfo->setCaption(str);
+
+	mSceneMgr->getOption("NumOctreeNodes", &opt); sprintf(str,": %d", opt); 
+	mHierarchyNodesInfo->setCaption(str);
+
+	mSceneMgr->getOption("NumRenderedNodes", &opt); sprintf(str,": %d", opt); 
+	mRenderedNodesInfo->setCaption(str);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyPressed(KeyEvent* e)
+{
+	if(e->getKey() == KC_ESCAPE)
+    {
+		mShutdownRequested = true;
+		e->consume();
+		return;
+	}
+
+	CEGUI::System::getSingleton().injectKeyDown(e->getKey());
+	CEGUI::System::getSingleton().injectChar(e->getKeyChar());
+	e->consume();
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyReleased(KeyEvent* e)
+{
+	CEGUI::System::getSingleton().injectKeyUp(e->getKey());
+	e->consume();
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyClicked(KeyEvent* e) 
+{
+	// Do nothing
+	e->consume();
+}
+//-----------------------------------------------------------------------
+INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
+{
+    // Create application object
+    TestCullingApplication app;
+
+	try 
+	{
+        app.go();
+    } 
+	catch( Ogre::Exception& e ) 
+	{
+        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
+    }	
+
+    return 0;
+}
Index: /tags/DummyModules/VUT/work/TestCulling/TestCullingApplication.dsp
===================================================================
--- /tags/DummyModules/VUT/work/TestCulling/TestCullingApplication.dsp	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCulling/TestCullingApplication.dsp	(revision 61)
@@ -0,0 +1,109 @@
+# Microsoft Developer Studio Project File - Name="Demo_TestCullingApplication" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=Demo_TestCullingApplication - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "TestCullingApplication.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "TestCullingApplication.mak" CFG="Demo_TestCullingApplication - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "Demo_TestCullingApplication - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "Demo_TestCullingApplication - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "Demo_TestCullingApplication - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "..\bin\Release"
+# PROP BASE Intermediate_Dir "..\obj\Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\bin\Release"
+# PROP Intermediate_Dir "..\obj\Release"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /Zi /Od /I "." /I "$(OGRE_PATH)\OgreMain\include" /I "$(OGRE_PATH)\Samples/Common/include" /D "NDEBUG" /D "_MBCS" /D "_WINDOWS" /D "WIN32" /YX /FD /Zm1000 /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OgreMain.lib /nologo /subsystem:windows /machine:I386 /out:"$(OGRE_PATH)\Samples\Common\Bin\Release\Demo_TestCullingApplication.exe" /libpath:"$(OGRE_PATH)\OgreMain\lib\release" 
+# SUBTRACT LINK32 /profile /debug
+
+!ELSEIF  "$(CFG)" == "Demo_TestCullingApplication - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "..\bin\Debug"
+# PROP BASE Intermediate_Dir "..\obj\Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "..\bin\Debug"
+# PROP Intermediate_Dir "..\obj\Debug"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "$(OGRE_PATH)\OgreMain\include" /I "$(OGRE_PATH)\Samples/Common/include" /D "_MBCS" /D "_WINDOWS" /D "_DEBUG" /D "WIN32" /FD /GZ /Zm1000 /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OgreMain_d.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"LIBCMT" /out:"$(OGRE_PATH)\Samples\Common\Bin\Debug\Demo_TestCullingApplication.exe" /pdbtype:sept /libpath:"$(OGRE_PATH)\OgreMain\lib\debug" 
+# SUBTRACT LINK32 /verbose
+
+!ENDIF 
+
+# Begin Target
+
+# Name "Demo_TestCullingApplication - Win32 Release"
+# Name "Demo_TestCullingApplication - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=TestCullingApplication.cpp
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
Index: /tags/DummyModules/VUT/work/TestCulling/TerrainContentGenerator.cpp
===================================================================
--- /tags/DummyModules/VUT/work/TestCulling/TerrainContentGenerator.cpp	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCulling/TerrainContentGenerator.cpp	(revision 61)
@@ -0,0 +1,14 @@
+/**
+    \file 
+        TerrainContentGenerator.cpp
+    \brief
+        Creates content for the terrain,
+*/
+
+#include "TerrainContentGenerator.h"
+
+//-----------------------------------------------------------------------
+TerrainContentGenerator::TerrainContentGenerator( void )
+{
+}
+
Index: /tags/DummyModules/VUT/work/TestCulling/TestCullingApplication.h
===================================================================
--- /tags/DummyModules/VUT/work/TestCulling/TestCullingApplication.h	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCulling/TestCullingApplication.h	(revision 61)
@@ -0,0 +1,121 @@
+/**
+    \file 
+        TestCullingApplication.h
+*/
+#include "CEGUIForwardRefs.h"
+#include "ExampleApplication.h"
+//#include "OgreVisibilitySceneTraverser.h"
+
+
+Real timeDelay = 0;
+#define KEY_PRESSED(_key,_timeDelay, _macro) \
+{ \
+    if (mInputDevice->isKeyDown(_key) && timeDelay <= 0) \
+{ \
+    timeDelay = _timeDelay; \
+    _macro ; \
+} \
+}
+
+String mCurrentAlgorithmCaptions[3] = 
+{
+    "Cull Frustum", 
+	"Stop and Wait", 
+	"Coherent Occlusion Culling"
+};
+
+class MouseQueryListener : public ExampleFrameListener, public MouseListener, public MouseMotionListener
+{
+public:
+
+    MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, 
+			CEGUI::Renderer *renderer);
+
+
+    ~MouseQueryListener( );
+
+	bool frameStarted(const FrameEvent& evt);
+	bool frameEnded(const FrameEvent& evt);
+
+    /* MouseListener callbacks. */
+    virtual void mouseClicked(MouseEvent* e) { }
+    virtual void mouseEntered(MouseEvent* e) { }
+    virtual void mouseExited(MouseEvent* e)  { }
+
+    // This is when the mouse button goes DOWN.
+    virtual void mousePressed(MouseEvent* e);
+
+    // This is when the mouse button is let UP.
+    virtual void mouseReleased(MouseEvent* e);
+
+    /* MouseMotionListener callbacks */
+    virtual void mouseMoved (MouseEvent *e);
+   
+    // This is when the mouse is clicked, held and dragged.
+    virtual void mouseDragged (MouseEvent *e);
+
+    void keyPressed(KeyEvent* e);
+
+	void keyReleased(KeyEvent* e);
+	void keyClicked(KeyEvent* e);
+
+	void changeAlgorithm();
+	void changeThreshold(int incr);
+	void changeStats();
+
+protected:
+    bool mLMouseDown, mRMouseDown;     // True if the mouse buttons are down
+    SceneManager *mSceneMgr;           // A pointer to the scene manager
+    
+	CEGUI::Renderer *mGUIRenderer;     // cegui renderer
+	
+	bool mShutdownRequested;
+	int mCurrentAlgorithm;
+	int mThreshold;
+
+	OverlayElement *mAlgorithmInfo;
+	OverlayElement *mThresholdInfo;
+	OverlayElement *mFrustumCulledNodesInfo;
+	OverlayElement *mQueryCulledNodesInfo;
+    OverlayElement *mTraversedNodesInfo;
+	OverlayElement *mHierarchyNodesInfo;
+	OverlayElement *mSceneNodesInfo;
+	OverlayElement *mRenderedNodesInfo;
+};
+
+
+class TestCullingApplication : public ExampleApplication
+{
+protected:
+	void createScene(void);
+	void createFrameListener(void);
+	void setupGui(void);
+	/** generates a the scene hierarchy with random values 
+	@param number of objects to generate
+	*/
+	void generateScene(int numObjects);
+
+	/** generates a new scene object 
+	@param tranlationRatio ratio between minimal and maximal possible translation
+	@param rotationRatio ratio between minimal and maximal possible rotation
+	@idx the index of the new object
+	@entName the name of the object entity
+	*/
+	void generateSceneObject(const Vector3 &translationRatio, const Vector3 &rotationRatio, 
+							 const int idx, const String &entName);
+
+	//virtual void createCamera(void);
+
+	CEGUI::OgreCEGUIRenderer *mGUIRenderer;
+	CEGUI::System *mGUISystem;
+
+	Vector3 mMinTranslation;
+	Vector3 mMaxTranslation;
+
+	Vector3 mMinAngle;
+	Vector3 mMaxAngle;
+
+private:
+	void chooseSceneManager(void);
+};
+
Index: /tags/DummyModules/VUT/work/TestCulling/TerrainContentGenerator.h
===================================================================
--- /tags/DummyModules/VUT/work/TestCulling/TerrainContentGenerator.h	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCulling/TerrainContentGenerator.h	(revision 61)
@@ -0,0 +1,14 @@
+/**
+    \file 
+        TerrainContentGenerator.h
+*/
+
+class TerrainContentGenerator
+{
+public:
+	TerrainContentGenerator();
+
+protected:
+
+};
+
Index: /tags/DummyModules/VUT/work/TestCulling/TestCullingApplication.dsw
===================================================================
--- /tags/DummyModules/VUT/work/TestCulling/TestCullingApplication.dsw	(revision 61)
+++ /tags/DummyModules/VUT/work/TestCulling/TestCullingApplication.dsw	(revision 61)
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "Demo_TestCulling"=.\TestCullingApplication.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
Index: /tags/DummyModules/VUT/doc/DummyModules/classes.fig
===================================================================
--- /tags/DummyModules/VUT/doc/DummyModules/classes.fig	(revision 67)
+++ /tags/DummyModules/VUT/doc/DummyModules/classes.fig	(revision 67)
@@ -0,0 +1,217 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter  
+50.00
+Single
+-2
+1200 2
+6 4500 600 7800 1200
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4500 600 7800 600 7800 1200 4500 1200 4500 600
+4 0 0 50 -1 0 20 0.0000 4 285 2325 5100 975 HierarchyInterface\001
+-6
+6 -4050 4800 -300 5400
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 -4050 4800 -300 4800 -300 5400 -4050 5400 -4050 4800
+4 0 0 50 -1 0 20 0.0000 4 285 3645 -4050 5175 StopAndWaitCullingManager\001
+-6
+6 18900 3600 22200 4200
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 18900 3600 22200 3600 22200 4200 18900 4200 18900 3600
+4 0 0 50 -1 0 20 0.0000 4 285 2730 19125 3975 External Preprocessor\001
+-6
+6 -5550 1425 1050 2025
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 -5550 1425 1050 1425 1050 2025 -5550 2025 -5550 1425
+4 0 0 50 -1 0 20 0.0000 4 285 5490 -5100 1800 CoherentHierarchicalCullingCullingManager\001
+-6
+6 4500 -1725 7800 -1125
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4500 -1725 7800 -1725 7800 -1125 4500 -1125 4500 -1725
+4 0 0 50 -1 0 20 0.0000 4 210 2160 5100 -1350 PlatformInterface\001
+-6
+6 600 -3600 3900 -3000
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 600 -3600 3900 -3600 3900 -3000 600 -3000 600 -3600
+4 0 0 50 -1 0 20 0.0000 4 285 3165 675 -3225 OctreeHierarchyInterface\001
+-6
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 600 3600 3900 3600 3900 4200 600 4200 600 3600
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 2
+	1 1 2.00 120.00 240.00
+	 2175 3525 5025 1350
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 4950 6375 2175 4275
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4500 3600 7800 3600 7800 4200 4500 4200 4500 3600
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 8400 3600 11700 3600 11700 4200 8400 4200 8400 3600
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 2
+	1 1 2.00 120.00 240.00
+	 6150 6375 6150 4350
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 2
+	1 1 2.00 120.00 240.00
+	 7425 6300 9900 4350
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 6150 3450 6150 1350
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 9975 3450 7200 1350
+2 1 2 2 0 7 50 -1 -1 6.000 0 0 -1 1 1 2
+	1 1 2.00 120.00 240.00
+	1 1 2.00 120.00 240.00
+	 12000 3900 18750 3900
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 2700 4275 5325 6300
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 6450 4275 6450 6375
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 9300 4350 6900 6300
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 -1800 4650 375 4200
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 -1800 2250 375 3450
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 2.00 120.00 240.00
+	 10800 2025 7125 3375
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 8700 1275 14625 1275 14625 1875 8700 1875 8700 1275
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4500 8025 7800 8025 7800 8625 4500 8625 4500 8025
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 2
+	1 1 2.00 120.00 240.00
+	 6150 7125 6150 7950
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4500 6450 7800 6450 7800 7050 4500 7050 4500 6450
+2 2 0 2 0 14 80 -1 36 0.000 0 0 7 0 0 5
+	 -6000 -150 23025 -150 23025 9075 -6000 9075 -6000 -150
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 18000 -150 18000 9075
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 -5400 3300 -1650 3300 -1650 3900 -5400 3900 -5400 3300
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 -1425 3600 375 3825
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4500 -3600 7800 -3600 7800 -3000 4500 -3000 4500 -3600
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 8400 -3600 12375 -3600 12375 -3000 8400 -3000 8400 -3600
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 2.00 120.00 240.00
+	 2175 -2925 5250 -1875
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 6150 -2925 6150 -1875
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 10425 -2925 7125 -1875
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 -3675 -9000 300 -9000 300 -8400 -3675 -8400 -3675 -9000
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 225 -8025 4200 -8025 4200 -7425 225 -7425 225 -8025
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4125 -9000 8100 -9000 8100 -8400 4125 -8400 4125 -9000
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 8400 -8025 12375 -8025 12375 -7425 8400 -7425 8400 -8025
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4125 -6600 8100 -6600 8100 -6000 4125 -6000 4125 -6600
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 225 -5625 4200 -5625 4200 -5025 225 -5025 225 -5625
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 -3675 -6600 300 -6600 300 -6000 -3675 -6000 -3675 -6600
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 8400 -5625 12975 -5625 12975 -5025 8400 -5025 8400 -5625
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 2.00 120.00 240.00
+	 -1800 -6675 -1800 -8250
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 2.00 120.00 240.00
+	 2175 -5700 2175 -7275
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 2.00 120.00 240.00
+	 6150 -6675 6150 -8250
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 2.00 120.00 240.00
+	 10500 -5775 10500 -7275
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 -1800 -5850 1125 -3750
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 2175 -4875 2175 -3750
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 6150 -5850 6150 -3675
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 10500 -4875 10500 -3675
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 13050 -6600 17625 -6600 17625 -6000 13050 -6000 13050 -6600
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 13350 -8925 17325 -8925 17325 -8325 13350 -8325 13350 -8925
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 2.00 120.00 240.00
+	 15300 -6750 15300 -8250
+2 1 1 2 0 7 50 -1 -1 6.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 15150 -5850 12075 -3750
+2 2 0 2 0 10 80 -1 36 0.000 0 0 -1 0 0 5
+	 -6000 -10350 18000 -10350 18000 -6825 -6000 -6825 -6000 -10350
+2 2 0 2 0 20 80 -1 36 0.000 0 0 7 0 0 5
+	 -6000 -6825 18000 -6825 18000 -150 -6000 -150 -6000 -6825
+2 1 0 2 0 7 50 -1 -1 0.000 0 0 7 1 0 2
+	1 1 2.00 120.00 240.00
+	 6150 -975 6150 450
+3 0 1 2 0 7 50 -1 -1 6.000 0 1 0 5
+	1 1 2.00 120.00 240.00
+	 -2700 -5850 -6525 -600 -5325 6675 -675 6975 4200 7050
+	 0.000 1.000 1.000 1.000 0.000
+3 0 1 2 0 7 50 -1 -1 6.000 0 1 0 5
+	1 1 2.00 120.00 240.00
+	 525 -4875 -225 750 -600 4200 900 6000 3900 6600
+	 0.000 1.000 1.000 1.000 0.000
+3 0 1 2 0 7 50 -1 -1 6.000 0 1 0 5
+	1 1 2.00 120.00 240.00
+	 7575 -5850 8325 -1575 8625 1875 8175 4125 6975 5925
+	 0.000 1.000 1.000 1.000 0.000
+3 0 1 2 0 7 50 -1 -1 6.000 0 1 0 6
+	1 1 2.00 120.00 240.00
+	 12300 -4875 14550 -975 15000 1425 14025 5400 10950 6300 8100 6675
+	 0.000 1.000 1.000 1.000 1.000 0.000
+3 0 1 2 0 7 50 -1 -1 6.000 0 1 0 5
+	1 1 2.00 120.00 240.00
+	 15675 -5775 15825 3525 14025 6225 10125 7200 8025 7125
+	 0.000 1.000 1.000 1.000 0.000
+4 0 0 50 -1 0 20 0.0000 4 285 1950 1350 3975 CullingManager\001
+4 0 0 50 -1 0 20 0.0000 4 285 1845 5175 3975 QueryManager\001
+4 0 0 50 -1 0 20 0.0000 4 285 2805 8700 3975 PreprocessingManager\001
+4 0 0 50 -1 0 20 0.0000 4 285 5385 9000 1650 CoherentHierarchicalCullingQueryManager\001
+4 0 0 50 -1 0 24 0.0000 4 255 2580 -5475 900 INDEPENDENT\001
+4 0 0 50 -1 0 20 0.0000 4 285 3000 -5100 3675 FrustumCullingManager\001
+4 0 0 50 -1 0 20 0.0000 4 285 2790 4725 -3225 BspHierarchyInterface\001
+4 0 0 50 -1 0 20 0.0000 4 285 3735 300 -5250 VisibilityOctreeSceneManager\001
+4 0 0 50 -1 0 20 0.0000 4 285 3840 -3600 -6225 VisibilityTerrainSceneManager\001
+4 0 0 50 -1 0 20 0.0000 4 285 2655 900 -7650 OctreeSceneManager\001
+4 0 0 50 -1 0 20 0.0000 4 285 2280 5100 -8625 BspSceneManager\001
+4 0 0 50 -1 0 20 0.0000 4 285 3360 4425 -6225 VisibilityBspSceneManager\001
+4 0 0 50 -1 0 24 0.0000 4 255 2190 -5850 -5550 DEPENDENT\001
+4 0 0 50 -1 0 24 0.0000 4 255 1005 -5850 -6075 OGRE\001
+4 0 0 50 -1 0 24 0.0000 4 255 1005 -5850 -9750 OGRE\001
+4 0 0 50 -1 0 20 0.0000 4 285 2760 -3000 -8625 TerrainSceneManager\001
+4 0 0 50 -1 0 20 0.0000 4 285 1815 9525 -7650 SceneManager\001
+4 0 0 50 -1 0 20 0.0000 4 285 2895 9150 -5250 VisibilitySceneManager\001
+4 0 0 50 -1 0 20 0.0000 4 285 3705 8550 -3225 SceneNodeHierarchyInterface\001
+4 0 0 50 -1 0 20 0.0000 4 285 2265 14400 -8550 DotSceneManager\001
+4 0 0 50 -1 0 20 0.0000 4 285 3345 13725 -6225 VisibilityDotSceneManager\001
+4 0 0 50 -1 0 24 0.0000 4 255 1005 -5475 375 OGRE\001
+4 0 0 50 -1 0 20 0.0000 4 285 2715 4800 8400 VisibilityEnvironment\001
+4 0 0 50 -1 0 20 0.0000 4 285 2160 5025 6825 VisibilityManager\001
Index: /tags/DummyModules/VUT/doc/DummyModules/classes.eps
===================================================================
--- /tags/DummyModules/VUT/doc/DummyModules/classes.eps	(revision 67)
+++ /tags/DummyModules/VUT/doc/DummyModules/classes.eps	(revision 67)
@@ -0,0 +1,883 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: classes.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Fri Apr 29 12:00:52 2005
+%%For: bittner@NOTES (Jiri Bittner,U-NOTES\bittner,S-1-5-21-1914904292-1436553889-1205156892-1000)
+%%BoundingBox: 0 0 873 585
+%%Magnification: 0.5000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+newpath 0 585 moveto 0 0 lineto 873 0 lineto 873 585 lineto closepath clip newpath
+180.7 272.9 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.03000 0.03000 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 80
+% Polyline
+15.000 slw
+n -6000 -150 m 23025 -150 l 23025 9075 l -6000 9075 l
+ cp gs col14 0.80 tnt ef gr gs col0 s gr 
+% Polyline
+n -6000 -10350 m 18000 -10350 l 18000 -6825 l -6000 -6825 l
+ cp gs col10 0.80 tnt ef gr gs col0 s gr 
+% Polyline
+n -6000 -6825 m 18000 -6825 l 18000 -150 l -6000 -150 l
+ cp gs col20 0.80 tnt ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 50
+/Times-Roman ff 300.00 scf sf
+-4050 5175 m
+gs 1 -1 sc (StopAndWaitCullingManager) col0 sh gr
+% Polyline
+7.500 slw
+n 18900 3600 m 22200 3600 l 22200 4200 l 18900 4200 l
+ cp gs col0 s gr 
+/Times-Roman ff 300.00 scf sf
+19125 3975 m
+gs 1 -1 sc (External Preprocessor) col0 sh gr
+% Polyline
+n -5550 1425 m 1050 1425 l 1050 2025 l -5550 2025 l
+ cp gs col0 s gr 
+/Times-Roman ff 300.00 scf sf
+-5100 1800 m
+gs 1 -1 sc (CoherentHierarchicalCullingCullingManager) col0 sh gr
+% Polyline
+n 4500 -1725 m 7800 -1725 l 7800 -1125 l 4500 -1125 l
+ cp gs col0 s gr 
+/Times-Roman ff 300.00 scf sf
+5100 -1350 m
+gs 1 -1 sc (PlatformInterface) col0 sh gr
+% Polyline
+n 600 -3600 m 3900 -3600 l 3900 -3000 l 600 -3000 l
+ cp gs col0 s gr 
+/Times-Roman ff 300.00 scf sf
+675 -3225 m
+gs 1 -1 sc (OctreeHierarchyInterface) col0 sh gr
+% Polyline
+n 600 3600 m 3900 3600 l 3900 4200 l 600 4200 l
+ cp gs col0 s gr 
+% Polyline
+15.000 slw
+ [90] 0 sd
+gs  clippath
+5073 1388 m 5000 1293 l 4771 1467 l 4999 1370 l 4844 1563 l cp
+eoclip
+n 2175 3525 m
+ 5025 1350 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 4844 1563 m 4999 1370 l 4771 1467 l 4844 1563 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [90] 0 sd
+gs  clippath
+2199 4218 m 2126 4313 l 2356 4487 l 2201 4295 l 2428 4391 l cp
+eoclip
+n 4950 6375 m
+ 2175 4275 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 2428 4391 m 2201 4295 l 2356 4487 l 2428 4391 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+n 4500 3600 m 7800 3600 l 7800 4200 l 4500 4200 l
+ cp gs col0 s gr 
+% Polyline
+n 8400 3600 m 11700 3600 l 11700 4200 l 8400 4200 l
+ cp gs col0 s gr 
+% Polyline
+15.000 slw
+ [90] 0 sd
+gs  clippath
+6210 4335 m 6090 4335 l 6090 4622 l 6150 4382 l 6210 4622 l cp
+eoclip
+n 6150 6375 m
+ 6150 4350 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 6210 4622 m 6150 4382 l 6090 4622 l 6210 4622 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [90] 0 sd
+gs  clippath
+9948 4387 m 9874 4293 l 9649 4471 l 9875 4370 l 9723 4565 l cp
+eoclip
+n 7425 6300 m
+ 9900 4350 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 9723 4565 m 9875 4370 l 9649 4471 l 9723 4565 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [90] 0 sd
+gs  clippath
+6210 1335 m 6090 1335 l 6090 1622 l 6150 1382 l 6210 1622 l cp
+eoclip
+n 6150 3450 m
+ 6150 1350 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 6210 1622 m 6150 1382 l 6090 1622 l 6210 1622 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [90] 0 sd
+gs  clippath
+7224 1293 m 7151 1388 l 7381 1562 l 7226 1370 l 7453 1466 l cp
+eoclip
+n 9975 3450 m
+ 7200 1350 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 7453 1466 m 7226 1370 l 7381 1562 l 7453 1466 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [15 90] 90 sd
+gs  clippath
+18765 3960 m 18765 3840 l 18478 3840 l 18718 3900 l 18478 3960 l cp
+11985 3840 m 11985 3960 l 12272 3960 l 12032 3900 l 12272 3840 l cp
+eoclip
+n 12000 3900 m
+ 18750 3900 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 12272 3840 m 12032 3900 l 12272 3960 l 12272 3840 l  cp gs 0.00 setgray ef gr  col0 s
+% arrowhead
+n 18478 3960 m 18718 3900 l 18478 3840 l 18478 3960 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [90] 0 sd
+gs  clippath
+5300 6356 m 5373 6261 l 5145 6085 l 5299 6280 l 5072 6180 l cp
+eoclip
+n 2700 4275 m
+ 5325 6300 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 5072 6180 m 5299 6280 l 5145 6085 l 5072 6180 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [90] 0 sd
+gs  clippath
+6390 6390 m 6510 6390 l 6510 6103 l 6450 6343 l 6390 6103 l cp
+eoclip
+n 6450 4275 m
+ 6450 6375 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 6390 6103 m 6450 6343 l 6510 6103 l 6390 6103 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [90] 0 sd
+gs  clippath
+6850 6262 m 6926 6356 l 7149 6175 l 6925 6280 l 7073 6082 l cp
+eoclip
+n 9300 4350 m
+ 6900 6300 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 7073 6082 m 6925 6280 l 7149 6175 l 7073 6082 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+401 4255 m 377 4138 l 95 4196 l 343 4207 l 120 4314 l cp
+eoclip
+n -1800 4650 m
+ 375 4200 l gs col0 s gr gr
+
+% arrowhead
+n 120 4314 m 343 4207 l 95 4196 l 120 4314 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+359 3509 m 417 3404 l 165 3265 l 347 3434 l 107 3370 l cp
+eoclip
+n -1800 2250 m
+ 375 3450 l gs col0 s gr gr
+
+% arrowhead
+n 107 3370 m 347 3434 l 165 3265 l 107 3370 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7090 3323 m 7131 3436 l 7400 3337 l 7155 3364 l 7359 3224 l cp
+eoclip
+n 10800 2025 m
+ 7125 3375 l gs col0 s gr gr
+
+% arrowhead
+n 7359 3224 m 7155 3364 l 7400 3337 l 7359 3224 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+n 8700 1275 m 14625 1275 l 14625 1875 l 8700 1875 l
+ cp gs col0 s gr 
+% Polyline
+n 4500 8025 m 7800 8025 l 7800 8625 l 4500 8625 l
+ cp gs col0 s gr 
+% Polyline
+15.000 slw
+ [90] 0 sd
+gs  clippath
+6090 7965 m 6210 7965 l 6210 7678 l 6150 7918 l 6090 7678 l cp
+eoclip
+n 6150 7125 m
+ 6150 7950 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 6090 7678 m 6150 7918 l 6210 7678 l 6090 7678 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+n 4500 6450 m 7800 6450 l 7800 7050 l 4500 7050 l
+ cp gs col0 s gr 
+% Polyline
+15.000 slw
+n 18000 -150 m
+ 18000 9075 l gs col0 s gr 
+% Polyline
+7.500 slw
+n -5400 3300 m -1650 3300 l -1650 3900 l -5400 3900 l
+ cp gs col0 s gr 
+% Polyline
+15.000 slw
+gs  clippath
+382 3886 m 397 3767 l 112 3731 l 343 3821 l 97 3850 l cp
+eoclip
+n -1425 3600 m
+ 375 3825 l gs col0 s gr gr
+
+% arrowhead
+n 97 3850 m 343 3821 l 112 3731 l 97 3850 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+n 4500 -3600 m 7800 -3600 l 7800 -3000 l 4500 -3000 l
+ cp gs col0 s gr 
+% Polyline
+n 8400 -3600 m 12375 -3600 l 12375 -3000 l 8400 -3000 l
+ cp gs col0 s gr 
+% Polyline
+15.000 slw
+gs  clippath
+5244 -1813 m 5283 -1926 l 5011 -2018 l 5219 -1884 l 4972 -1904 l cp
+eoclip
+n 2175 -2925 m
+ 5250 -1875 l gs col0 s gr gr
+
+% arrowhead
+n 4972 -1904 m 5219 -1884 l 5011 -2018 l 4972 -1904 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6090 -1860 m 6210 -1860 l 6210 -2146 l 6150 -1906 l 6090 -2146 l cp
+eoclip
+n 6150 -2925 m
+ 6150 -1875 l gs col0 s gr gr
+
+% arrowhead
+n 6090 -2146 m 6150 -1906 l 6210 -2146 l 6090 -2146 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7092 -1927 m 7128 -1813 l 7402 -1899 l 7156 -1884 l 7366 -2013 l cp
+eoclip
+n 10425 -2925 m
+ 7125 -1875 l gs col0 s gr gr
+
+% arrowhead
+n 7366 -2013 m 7156 -1884 l 7402 -1899 l 7366 -2013 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+n -3675 -9000 m 300 -9000 l 300 -8400 l -3675 -8400 l
+ cp gs col0 s gr 
+% Polyline
+n 225 -8025 m 4200 -8025 l 4200 -7425 l 225 -7425 l
+ cp gs col0 s gr 
+% Polyline
+n 4125 -9000 m 8100 -9000 l 8100 -8400 l 4125 -8400 l
+ cp gs col0 s gr 
+% Polyline
+n 8400 -8025 m 12375 -8025 l 12375 -7425 l 8400 -7425 l
+ cp gs col0 s gr 
+% Polyline
+n 4125 -6600 m 8100 -6600 l 8100 -6000 l 4125 -6000 l
+ cp gs col0 s gr 
+% Polyline
+n 225 -5625 m 4200 -5625 l 4200 -5025 l 225 -5025 l
+ cp gs col0 s gr 
+% Polyline
+n -3675 -6600 m 300 -6600 l 300 -6000 l -3675 -6000 l
+ cp gs col0 s gr 
+% Polyline
+n 8400 -5625 m 12975 -5625 l 12975 -5025 l 8400 -5025 l
+ cp gs col0 s gr 
+% Polyline
+15.000 slw
+gs  clippath
+-1740 -8265 m -1860 -8265 l -1859 -7977 l -1799 -8217 l -1739 -7977 l cp
+eoclip
+n -1800 -6675 m
+ -1800 -8250 l gs col0 s gr gr
+
+% arrowhead
+n -1739 -7977 m -1799 -8217 l -1859 -7977 l -1739 -7977 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2235 -7290 m 2115 -7290 l 2115 -7002 l 2175 -7242 l 2235 -7002 l cp
+eoclip
+n 2175 -5700 m
+ 2175 -7275 l gs col0 s gr gr
+
+% arrowhead
+n 2235 -7002 m 2175 -7242 l 2115 -7002 l 2235 -7002 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6210 -8265 m 6090 -8265 l 6090 -7977 l 6150 -8217 l 6210 -7977 l cp
+eoclip
+n 6150 -6675 m
+ 6150 -8250 l gs col0 s gr gr
+
+% arrowhead
+n 6210 -7977 m 6150 -8217 l 6090 -7977 l 6210 -7977 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+10560 -7290 m 10440 -7290 l 10440 -7002 l 10500 -7242 l 10560 -7002 l cp
+eoclip
+n 10500 -5775 m
+ 10500 -7275 l gs col0 s gr gr
+
+% arrowhead
+n 10560 -7002 m 10500 -7242 l 10440 -7002 l 10560 -7002 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [90] 0 sd
+gs  clippath
+1102 -3692 m 1172 -3789 l 939 -3956 l 1099 -3768 l 869 -3859 l cp
+eoclip
+n -1800 -5850 m
+ 1125 -3750 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 869 -3859 m 1099 -3768 l 939 -3956 l 869 -3859 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [90] 0 sd
+gs  clippath
+2115 -3735 m 2235 -3735 l 2235 -4021 l 2175 -3781 l 2115 -4021 l cp
+eoclip
+n 2175 -4875 m
+ 2175 -3750 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 2115 -4021 m 2175 -3781 l 2235 -4021 l 2115 -4021 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [90] 0 sd
+gs  clippath
+6090 -3660 m 6210 -3660 l 6210 -3946 l 6150 -3706 l 6090 -3946 l cp
+eoclip
+n 6150 -5850 m
+ 6150 -3675 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 6090 -3946 m 6150 -3706 l 6210 -3946 l 6090 -3946 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [90] 0 sd
+gs  clippath
+10440 -3660 m 10560 -3660 l 10560 -3946 l 10500 -3706 l 10440 -3946 l cp
+eoclip
+n 10500 -4875 m
+ 10500 -3675 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 10440 -3946 m 10500 -3706 l 10560 -3946 l 10440 -3946 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+n 13050 -6600 m 17625 -6600 l 17625 -6000 l 13050 -6000 l
+ cp gs col0 s gr 
+% Polyline
+n 13350 -8925 m 17325 -8925 l 17325 -8325 l 13350 -8325 l
+ cp gs col0 s gr 
+% Polyline
+15.000 slw
+gs  clippath
+15360 -8265 m 15240 -8265 l 15240 -7977 l 15300 -8217 l 15360 -7977 l cp
+eoclip
+n 15300 -6750 m
+ 15300 -8250 l gs col0 s gr gr
+
+% arrowhead
+n 15360 -7977 m 15300 -8217 l 15240 -7977 l 15360 -7977 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [90] 0 sd
+gs  clippath
+12028 -3791 m 12096 -3691 l 12334 -3852 l 12102 -3767 l 12266 -3951 l cp
+eoclip
+n 15150 -5850 m
+ 12075 -3750 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 12266 -3951 m 12102 -3767 l 12334 -3852 l 12266 -3951 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6090 465 m 6210 465 l 6210 178 l 6150 418 l 6090 178 l cp
+eoclip
+n 6150 -975 m
+ 6150 450 l gs col0 s gr gr
+
+% arrowhead
+n 6090 178 m 6150 418 l 6210 178 l 6090 178 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [90] 0 sd
+gs  clippath
+4215 7110 m 4215 6990 l 3928 6990 l 4168 7050 l 3928 7110 l cp
+eoclip
+n -2700 -5850 m -2701 -5849 l -2702 -5848 l -2704 -5844 l -2708 -5839 l -2713 -5831 l
+ -2720 -5821 l -2730 -5807 l -2741 -5790 l -2756 -5768 l -2773 -5743 l
+ -2793 -5714 l -2816 -5679 l -2843 -5641 l -2872 -5597 l -2905 -5549 l
+ -2940 -5496 l -2979 -5438 l -3021 -5376 l -3066 -5309 l -3113 -5237 l
+ -3163 -5162 l -3216 -5082 l -3271 -4999 l -3328 -4912 l -3387 -4822 l
+ -3448 -4729 l -3510 -4634 l -3573 -4536 l -3637 -4437 l -3702 -4335 l
+ -3767 -4233 l -3833 -4130 l -3899 -4026 l -3964 -3921 l -4030 -3817 l
+ -4095 -3712 l -4159 -3608 l -4223 -3504 l -4285 -3401 l -4347 -3298 l
+ -4408 -3197 l -4467 -3097 l -4525 -2997 l -4582 -2900 l -4637 -2803 l
+ -4691 -2708 l -4744 -2614 l -4795 -2521 l -4844 -2430 l -4892 -2341 l
+ -4939 -2253 l -4984 -2166 l -5027 -2080 l -5069 -1996 l -5110 -1913 l
+ -5149 -1831 l -5186 -1751 l -5223 -1671 l -5257 -1593 l -5291 -1515 l
+ -5323 -1438 l -5354 -1362 l -5384 -1287 l -5412 -1212 l -5440 -1138 l
+ -5466 -1064 l -5491 -991 l -5515 -918 l -5538 -845 l -5560 -773 l
+ -5580 -700 l -5600 -628 l -5620 -555 l -5638 -482 l -5655 -409 l
+ -5672 -336 l -5688 -263 l -5703 -187 l -5718 -111 l -5732 -34 l
+ -5745 43 l -5757 120 l -5769 198 l -5780 276 l -5790 355 l
+ -5799 435 l -5808 515 l -5816 595 l -5823 677 l -5830 758 l
+ -5835 841 l -5840 924 l -5844 1007 l -5847 1091 l -5850 1176 l
+ -5852 1261 l -5853 1347 l -5853 1433 l -5852 1519 l -5850 1606 l
+ -5848 1693 l -5845 1781 l -5841 1868 l -5836 1956 l -5830 2044 l
+ -5824 2133 l -5817 2221 l -5809 2309 l -5800 2398 l -5790 2486 l
+ -5779 2574 l -5768 2662 l -5756 2749 l -5743 2836 l -5729 2923 l
+ -5715 3010 l -5699 3095 l -5683 3181 l -5667 3265 l -5649 3349 l
+ -5631 3433 l -5612 3515 l -5593 3597 l -5572 3677 l -5551 3757 l
+ -5530 3836 l -5508 3914 l -5485 3991 l -5461 4066 l -5437 4141 l
+ -5413 4214 l -5388 4286 l -5362 4357 l -5336 4427 l -5309 4496 l
+ -5282 4563 l -5254 4629 l -5226 4694 l -5198 4757 l -5169 4819 l
+ -5139 4880 l -5109 4939 l -5079 4998 l -5048 5055 l -5017 5110 l
+ -4985 5165 l -4953 5218 l -4920 5270 l -4887 5321 l -4854 5370 l
+ -4820 5419 l -4785 5466 l -4750 5513 l -4708 5566 l -4665 5618 l
+ -4621 5669 l -4576 5718 l -4530 5766 l -4484 5813 l -4436 5859 l
+ -4387 5903 l -4338 5947 l -4287 5989 l -4235 6030 l -4182 6070 l
+ -4128 6109 l -4073 6147 l -4017 6184 l -3960 6220 l -3902 6255 l
+ -3842 6289 l -3782 6322 l -3720 6353 l -3658 6384 l -3595 6414 l
+ -3530 6443 l -3465 6471 l -3399 6498 l -3332 6524 l -3264 6549 l
+ -3196 6573 l -3126 6595 l -3056 6618 l -2986 6639 l -2915 6659 l
+ -2844 6678 l -2772 6696 l -2700 6714 l -2627 6730 l -2554 6746 l
+ -2481 6761 l -2408 6774 l -2335 6788 l -2262 6800 l -2189 6812 l
+ -2116 6823 l -2043 6833 l -1970 6842 l -1897 6851 l -1825 6860 l
+ -1753 6867 l -1681 6874 l -1609 6881 l -1538 6887 l -1467 6893 l
+ -1396 6898 l -1326 6903 l -1256 6908 l -1187 6912 l -1117 6916 l
+ -1048 6919 l -979 6923 l -911 6926 l -842 6929 l -774 6932 l
+ -706 6935 l -638 6938 l -573 6940 l -509 6942 l -444 6945 l
+ -380 6947 l -315 6950 l -249 6952 l -184 6954 l -117 6956 l
+ -50 6959 l 18 6961 l 86 6963 l 156 6965 l 227 6967 l
+ 299 6969 l 372 6971 l 446 6973 l 522 6975 l 599 6978 l
+ 679 6980 l 759 6982 l 842 6984 l 926 6986 l 1012 6988 l
+ 1100 6990 l 1190 6992 l 1282 6994 l 1376 6996 l 1472 6998 l
+ 1570 7000 l 1669 7002 l 1770 7004 l 1873 7007 l 1977 7009 l
+ 2082 7011 l 2188 7013 l 2295 7015 l 2402 7017 l 2510 7019 l
+ 2617 7021 l 2724 7023 l 2829 7025 l 2934 7027 l 3036 7029 l
+ 3136 7031 l 3234 7033 l 3328 7035 l 3419 7036 l 3505 7038 l
+ 3588 7039 l 3665 7041 l 3738 7042 l 3805 7043 l 3866 7044 l
+ 3923 7045 l 3973 7046 l 4018 7047 l 4057 7048 l 4090 7048 l
+ 4118 7049 l 4142 7049 l 4160 7049 l 4174 7050 l 4185 7050 l
+
+ 4200 7050 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 3928 7110 m 4168 7050 l 3928 6990 l 3928 7110 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [90] 0 sd
+gs  clippath
+3902 6661 m 3926 6544 l 3644 6488 l 3868 6594 l 3620 6605 l cp
+eoclip
+n 525 -4875 m 525 -4874 l 525 -4872 l 524 -4867 l 523 -4860 l 522 -4850 l
+ 520 -4836 l 517 -4818 l 514 -4796 l 511 -4768 l 506 -4736 l
+ 501 -4698 l 496 -4654 l 489 -4604 l 482 -4549 l 474 -4488 l
+ 465 -4422 l 455 -4349 l 445 -4272 l 434 -4189 l 422 -4102 l
+ 410 -4010 l 398 -3914 l 384 -3815 l 371 -3712 l 357 -3607 l
+ 343 -3499 l 328 -3389 l 313 -3277 l 298 -3165 l 283 -3051 l
+ 268 -2938 l 253 -2824 l 239 -2711 l 224 -2598 l 209 -2486 l
+ 194 -2375 l 180 -2266 l 166 -2158 l 152 -2052 l 138 -1948 l
+ 125 -1846 l 112 -1746 l 99 -1647 l 86 -1551 l 74 -1457 l
+ 62 -1366 l 50 -1276 l 39 -1189 l 28 -1103 l 17 -1020 l
+ 6 -939 l -4 -859 l -14 -782 l -24 -706 l -33 -632 l
+ -43 -560 l -52 -489 l -61 -420 l -69 -352 l -78 -285 l
+ -86 -219 l -94 -155 l -102 -92 l -110 -29 l -118 32 l
+ -126 93 l -133 153 l -141 212 l -148 271 l -155 330 l
+ -163 388 l -171 459 l -180 530 l -189 600 l -197 671 l
+ -206 741 l -214 811 l -222 880 l -231 950 l -239 1019 l
+ -247 1089 l -254 1158 l -262 1227 l -270 1297 l -277 1366 l
+ -284 1435 l -291 1505 l -298 1574 l -305 1643 l -311 1712 l
+ -317 1781 l -323 1849 l -329 1918 l -334 1986 l -339 2054 l
+ -344 2121 l -349 2188 l -353 2255 l -357 2321 l -361 2387 l
+ -364 2452 l -367 2516 l -369 2580 l -371 2642 l -373 2705 l
+ -374 2766 l -375 2826 l -375 2886 l -376 2945 l -375 3002 l
+ -374 3059 l -373 3115 l -372 3170 l -370 3224 l -367 3277 l
+ -364 3328 l -361 3379 l -357 3429 l -353 3478 l -349 3527 l
+ -344 3574 l -338 3620 l -332 3666 l -326 3711 l -319 3755 l
+ -312 3798 l -304 3841 l -296 3883 l -288 3925 l -276 3975 l
+ -265 4024 l -252 4073 l -238 4121 l -224 4170 l -209 4217 l
+ -193 4265 l -176 4312 l -158 4359 l -139 4406 l -119 4453 l
+ -98 4500 l -76 4546 l -54 4592 l -30 4638 l -5 4684 l
+ 21 4729 l 48 4774 l 76 4819 l 104 4863 l 134 4906 l
+ 164 4950 l 196 4992 l 228 5034 l 261 5075 l 295 5116 l
+ 329 5156 l 364 5195 l 399 5233 l 436 5271 l 472 5308 l
+ 509 5343 l 547 5378 l 585 5412 l 623 5445 l 662 5477 l
+ 701 5509 l 740 5539 l 780 5569 l 820 5597 l 860 5625 l
+ 900 5652 l 941 5678 l 982 5704 l 1023 5729 l 1065 5753 l
+ 1107 5777 l 1150 5800 l 1190 5821 l 1230 5842 l 1272 5862 l
+ 1313 5882 l 1356 5901 l 1400 5920 l 1445 5939 l 1491 5958 l
+ 1538 5977 l 1587 5995 l 1638 6014 l 1690 6032 l 1744 6051 l
+ 1800 6069 l 1857 6088 l 1917 6107 l 1979 6126 l 2044 6145 l
+ 2110 6164 l 2179 6183 l 2250 6203 l 2323 6223 l 2399 6243 l
+ 2476 6263 l 2555 6284 l 2636 6304 l 2717 6325 l 2800 6345 l
+ 2883 6365 l 2966 6385 l 3049 6405 l 3130 6425 l 3210 6443 l
+ 3288 6462 l 3362 6479 l 3434 6495 l 3501 6511 l 3563 6525 l
+ 3621 6538 l 3673 6550 l 3720 6560 l 3761 6569 l 3795 6577 l
+ 3825 6583 l 3848 6589 l 3867 6593 l 3880 6596 l
+ 3900 6600 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 3620 6605 m 3868 6594 l 3644 6488 l 3620 6605 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [90] 0 sd
+gs  clippath
+6916 5904 m 7017 5970 l 7173 5729 l 6993 5898 l 7073 5663 l cp
+eoclip
+n 7575 -5850 m 7575 -5849 l 7576 -5846 l 7576 -5842 l 7578 -5834 l 7580 -5823 l
+ 7582 -5809 l 7585 -5789 l 7590 -5765 l 7595 -5736 l 7601 -5702 l
+ 7607 -5662 l 7615 -5617 l 7624 -5566 l 7634 -5509 l 7644 -5447 l
+ 7656 -5380 l 7668 -5308 l 7681 -5231 l 7695 -5150 l 7710 -5065 l
+ 7725 -4977 l 7740 -4886 l 7756 -4793 l 7773 -4697 l 7789 -4601 l
+ 7806 -4503 l 7823 -4404 l 7839 -4305 l 7856 -4206 l 7873 -4108 l
+ 7889 -4011 l 7905 -3914 l 7921 -3819 l 7937 -3725 l 7952 -3633 l
+ 7967 -3542 l 7982 -3454 l 7996 -3367 l 8010 -3282 l 8024 -3200 l
+ 8037 -3119 l 8050 -3040 l 8062 -2963 l 8074 -2888 l 8086 -2815 l
+ 8097 -2744 l 8108 -2674 l 8119 -2606 l 8129 -2539 l 8139 -2474 l
+ 8149 -2410 l 8159 -2348 l 8168 -2286 l 8177 -2226 l 8186 -2167 l
+ 8194 -2108 l 8203 -2050 l 8211 -1993 l 8219 -1936 l 8227 -1880 l
+ 8235 -1824 l 8242 -1768 l 8250 -1713 l 8258 -1652 l 8266 -1591 l
+ 8274 -1530 l 8282 -1469 l 8290 -1408 l 8298 -1347 l 8306 -1286 l
+ 8313 -1225 l 8321 -1164 l 8328 -1102 l 8335 -1040 l 8343 -978 l
+ 8350 -915 l 8357 -853 l 8364 -790 l 8371 -726 l 8377 -663 l
+ 8384 -599 l 8390 -536 l 8397 -472 l 8403 -408 l 8409 -343 l
+ 8415 -279 l 8421 -215 l 8426 -151 l 8432 -87 l 8437 -24 l
+ 8442 40 l 8447 103 l 8452 166 l 8457 229 l 8461 291 l
+ 8465 353 l 8469 414 l 8473 474 l 8476 534 l 8480 594 l
+ 8483 653 l 8486 711 l 8488 768 l 8491 825 l 8493 881 l
+ 8495 936 l 8497 990 l 8498 1043 l 8500 1096 l 8501 1148 l
+ 8502 1199 l 8503 1250 l 8503 1299 l 8503 1348 l 8504 1397 l
+ 8503 1445 l 8503 1492 l 8503 1538 l 8502 1584 l 8501 1630 l
+ 8500 1675 l 8498 1729 l 8497 1783 l 8494 1837 l 8492 1890 l
+ 8489 1943 l 8486 1997 l 8482 2050 l 8479 2103 l 8474 2157 l
+ 8470 2210 l 8465 2264 l 8459 2318 l 8454 2371 l 8448 2425 l
+ 8441 2479 l 8434 2533 l 8427 2587 l 8419 2641 l 8411 2695 l
+ 8403 2749 l 8394 2803 l 8385 2856 l 8375 2909 l 8365 2962 l
+ 8355 3014 l 8345 3066 l 8334 3118 l 8322 3169 l 8311 3219 l
+ 8299 3269 l 8287 3318 l 8275 3367 l 8262 3414 l 8249 3461 l
+ 8236 3508 l 8223 3553 l 8210 3598 l 8196 3642 l 8183 3686 l
+ 8169 3728 l 8154 3770 l 8140 3812 l 8126 3853 l 8111 3893 l
+ 8096 3933 l 8081 3972 l 8066 4011 l 8050 4050 l 8033 4090 l
+ 8016 4130 l 7999 4170 l 7981 4211 l 7963 4251 l 7944 4291 l
+ 7924 4332 l 7904 4374 l 7883 4416 l 7861 4459 l 7838 4503 l
+ 7814 4548 l 7789 4594 l 7763 4641 l 7735 4689 l 7707 4739 l
+ 7677 4791 l 7646 4844 l 7615 4898 l 7581 4954 l 7547 5011 l
+ 7512 5069 l 7476 5128 l 7440 5187 l 7403 5247 l 7366 5307 l
+ 7329 5367 l 7292 5426 l 7256 5484 l 7221 5539 l 7187 5592 l
+ 7156 5642 l 7126 5689 l 7099 5732 l 7074 5771 l 7052 5805 l
+ 7033 5835 l 7017 5860 l 7004 5880 l 6994 5896 l 6986 5908 l
+
+ 6975 5925 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 7073 5663 m 6993 5898 l 7173 5729 l 7073 5663 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [90] 0 sd
+gs  clippath
+8078 6617 m 8092 6736 l 8377 6702 l 8132 6671 l 8363 6583 l cp
+eoclip
+n 12300 -4875 m 12301 -4874 l 12302 -4872 l 12304 -4868 l 12308 -4861 l 12314 -4851 l
+ 12321 -4837 l 12331 -4820 l 12344 -4798 l 12358 -4772 l 12376 -4741 l
+ 12396 -4705 l 12420 -4664 l 12446 -4618 l 12475 -4567 l 12506 -4511 l
+ 12541 -4450 l 12577 -4385 l 12616 -4316 l 12657 -4243 l 12700 -4166 l
+ 12745 -4087 l 12791 -4005 l 12838 -3921 l 12886 -3835 l 12935 -3748 l
+ 12984 -3660 l 13033 -3571 l 13083 -3482 l 13132 -3394 l 13181 -3306 l
+ 13229 -3218 l 13276 -3132 l 13323 -3047 l 13369 -2963 l 13414 -2881 l
+ 13458 -2801 l 13501 -2722 l 13542 -2645 l 13583 -2570 l 13622 -2497 l
+ 13660 -2426 l 13697 -2356 l 13733 -2289 l 13767 -2223 l 13801 -2159 l
+ 13833 -2097 l 13864 -2036 l 13894 -1977 l 13924 -1920 l 13952 -1864 l
+ 13979 -1809 l 14005 -1756 l 14031 -1703 l 14056 -1652 l 14080 -1602 l
+ 14103 -1552 l 14126 -1504 l 14148 -1456 l 14169 -1409 l 14190 -1362 l
+ 14211 -1316 l 14230 -1270 l 14250 -1225 l 14273 -1172 l 14295 -1119 l
+ 14316 -1066 l 14338 -1014 l 14358 -961 l 14379 -909 l 14398 -857 l
+ 14418 -804 l 14437 -752 l 14455 -699 l 14474 -647 l 14491 -594 l
+ 14509 -540 l 14526 -487 l 14542 -433 l 14558 -379 l 14574 -325 l
+ 14589 -271 l 14603 -216 l 14617 -161 l 14631 -106 l 14644 -51 l
+ 14656 4 l 14668 60 l 14679 115 l 14690 171 l 14701 227 l
+ 14710 282 l 14719 338 l 14728 394 l 14736 449 l 14743 505 l
+ 14749 560 l 14755 615 l 14761 670 l 14766 725 l 14770 780 l
+ 14774 834 l 14777 889 l 14780 943 l 14782 996 l 14783 1050 l
+ 14784 1103 l 14785 1157 l 14784 1210 l 14784 1263 l 14783 1315 l
+ 14781 1368 l 14779 1421 l 14777 1474 l 14774 1527 l 14771 1580 l
+ 14767 1634 l 14763 1688 l 14758 1738 l 14753 1789 l 14748 1841 l
+ 14743 1893 l 14737 1946 l 14730 1999 l 14723 2053 l 14716 2108 l
+ 14708 2163 l 14700 2219 l 14691 2276 l 14681 2333 l 14671 2391 l
+ 14661 2450 l 14650 2509 l 14638 2569 l 14625 2629 l 14613 2690 l
+ 14599 2751 l 14585 2813 l 14570 2875 l 14555 2938 l 14539 3000 l
+ 14522 3063 l 14505 3126 l 14488 3189 l 14469 3252 l 14451 3315 l
+ 14431 3378 l 14411 3440 l 14391 3503 l 14370 3564 l 14348 3626 l
+ 14326 3687 l 14303 3747 l 14280 3807 l 14257 3866 l 14233 3924 l
+ 14209 3981 l 14184 4038 l 14159 4093 l 14133 4148 l 14107 4202 l
+ 14081 4255 l 14054 4307 l 14028 4357 l 14000 4407 l 13973 4456 l
+ 13945 4504 l 13916 4550 l 13887 4596 l 13858 4640 l 13829 4684 l
+ 13799 4726 l 13769 4768 l 13738 4809 l 13707 4849 l 13675 4887 l
+ 13675 4888 l 13640 4928 l 13605 4968 l 13569 5008 l 13532 5046 l
+ 13494 5084 l 13456 5121 l 13416 5158 l 13376 5193 l 13334 5229 l
+ 13292 5263 l 13249 5298 l 13205 5331 l 13160 5364 l 13114 5397 l
+ 13067 5429 l 13019 5460 l 12971 5491 l 12921 5521 l 12871 5551 l
+ 12820 5580 l 12768 5609 l 12715 5636 l 12662 5664 l 12608 5691 l
+ 12554 5717 l 12499 5742 l 12444 5767 l 12389 5791 l 12333 5814 l
+ 12277 5837 l 12221 5860 l 12165 5881 l 12109 5902 l 12052 5922 l
+ 11996 5942 l 11940 5961 l 11884 5979 l 11829 5997 l 11774 6014 l
+ 11719 6030 l 11664 6046 l 11610 6061 l 11556 6076 l 11503 6091 l
+ 11449 6104 l 11397 6118 l 11345 6131 l 11293 6143 l 11241 6156 l
+ 11190 6168 l 11139 6179 l 11088 6190 l 11038 6202 l 10988 6213 l
+ 10937 6223 l 10887 6234 l 10837 6244 l 10786 6255 l 10735 6265 l
+ 10684 6275 l 10633 6285 l 10581 6295 l 10528 6305 l 10474 6315 l
+ 10420 6325 l 10364 6334 l 10307 6344 l 10249 6354 l 10189 6365 l
+ 10128 6375 l 10066 6385 l 10001 6396 l 9935 6406 l 9868 6417 l
+ 9798 6428 l 9727 6439 l 9654 6450 l 9580 6462 l 9504 6473 l
+ 9427 6485 l 9349 6496 l 9269 6508 l 9190 6520 l 9110 6532 l
+ 9030 6543 l 8951 6555 l 8873 6566 l 8796 6577 l 8722 6588 l
+ 8650 6598 l 8581 6608 l 8516 6617 l 8455 6626 l 8398 6633 l
+ 8347 6641 l 8300 6647 l 8258 6653 l 8222 6658 l 8192 6662 l
+ 8166 6666 l 8145 6669 l 8129 6671 l 8117 6673 l
+ 8100 6675 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 8363 6583 m 8132 6671 l 8377 6702 l 8363 6583 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [90] 0 sd
+gs  clippath
+8010 7065 m 8010 7185 l 8297 7185 l 8057 7125 l 8297 7065 l cp
+eoclip
+n 15675 -5775 m 15675 -5774 l 15675 -5772 l 15675 -5769 l 15675 -5763 l 15675 -5754 l
+ 15675 -5742 l 15675 -5726 l 15676 -5707 l 15676 -5683 l 15676 -5654 l
+ 15676 -5620 l 15677 -5580 l 15677 -5536 l 15677 -5485 l 15678 -5429 l
+ 15678 -5367 l 15679 -5298 l 15679 -5224 l 15680 -5144 l 15680 -5058 l
+ 15681 -4966 l 15681 -4869 l 15682 -4766 l 15683 -4658 l 15683 -4545 l
+ 15684 -4428 l 15684 -4306 l 15685 -4180 l 15685 -4051 l 15686 -3918 l
+ 15686 -3783 l 15686 -3644 l 15687 -3504 l 15687 -3362 l 15687 -3218 l
+ 15687 -3073 l 15687 -2928 l 15687 -2781 l 15687 -2635 l 15686 -2489 l
+ 15686 -2343 l 15686 -2198 l 15685 -2054 l 15684 -1911 l 15684 -1770 l
+ 15683 -1630 l 15682 -1492 l 15681 -1355 l 15679 -1221 l 15678 -1088 l
+ 15676 -958 l 15675 -830 l 15673 -705 l 15671 -581 l 15669 -461 l
+ 15667 -342 l 15665 -226 l 15662 -113 l 15660 -2 l 15657 107 l
+ 15654 213 l 15651 317 l 15648 419 l 15644 518 l 15641 615 l
+ 15637 710 l 15633 802 l 15629 893 l 15625 981 l 15621 1068 l
+ 15616 1153 l 15612 1235 l 15607 1316 l 15602 1396 l 15596 1473 l
+ 15591 1549 l 15585 1624 l 15579 1697 l 15573 1769 l 15567 1839 l
+ 15560 1909 l 15553 1977 l 15546 2043 l 15539 2109 l 15532 2174 l
+ 15524 2238 l 15516 2301 l 15508 2364 l 15500 2425 l 15488 2510 l
+ 15475 2594 l 15463 2677 l 15449 2758 l 15435 2839 l 15421 2918 l
+ 15406 2997 l 15390 3074 l 15374 3151 l 15358 3226 l 15340 3301 l
+ 15322 3375 l 15304 3449 l 15285 3521 l 15265 3593 l 15245 3664 l
+ 15224 3734 l 15202 3804 l 15180 3872 l 15157 3940 l 15133 4007 l
+ 15109 4073 l 15084 4138 l 15058 4202 l 15032 4266 l 15005 4328 l
+ 14978 4390 l 14949 4451 l 14921 4510 l 14892 4569 l 14862 4626 l
+ 14831 4683 l 14801 4738 l 14769 4792 l 14737 4846 l 14705 4898 l
+ 14672 4949 l 14639 4999 l 14606 5047 l 14572 5095 l 14537 5141 l
+ 14503 5187 l 14468 5231 l 14433 5274 l 14397 5316 l 14361 5357 l
+ 14325 5397 l 14289 5435 l 14252 5473 l 14215 5510 l 14178 5545 l
+ 14141 5580 l 14104 5614 l 14066 5647 l 14028 5679 l 13990 5711 l
+ 13952 5741 l 13913 5771 l 13874 5800 l 13835 5829 l 13796 5857 l
+ 13756 5884 l 13716 5911 l 13675 5938 l 13630 5966 l 13584 5995 l
+ 13537 6023 l 13490 6050 l 13442 6078 l 13393 6105 l 13343 6131 l
+ 13293 6158 l 13242 6184 l 13190 6210 l 13137 6236 l 13083 6261 l
+ 13029 6286 l 12973 6311 l 12917 6336 l 12860 6360 l 12803 6384 l
+ 12744 6408 l 12685 6432 l 12626 6455 l 12565 6478 l 12504 6501 l
+ 12443 6523 l 12381 6545 l 12319 6566 l 12257 6587 l 12194 6608 l
+ 12131 6628 l 12068 6648 l 12005 6668 l 11942 6687 l 11879 6706 l
+ 11816 6724 l 11754 6741 l 11691 6758 l 11629 6775 l 11568 6791 l
+ 11507 6807 l 11446 6822 l 11386 6837 l 11327 6851 l 11268 6865 l
+ 11210 6878 l 11152 6891 l 11096 6903 l 11040 6915 l 10985 6926 l
+ 10930 6937 l 10876 6948 l 10823 6958 l 10771 6967 l 10720 6977 l
+ 10669 6986 l 10619 6994 l 10570 7002 l 10521 7010 l 10473 7018 l
+ 10425 7025 l 10368 7033 l 10312 7041 l 10256 7049 l 10201 7056 l
+ 10146 7063 l 10091 7069 l 10036 7075 l 9982 7081 l 9927 7086 l
+ 9871 7091 l 9815 7095 l 9759 7099 l 9701 7103 l 9643 7107 l
+ 9583 7110 l 9522 7113 l 9460 7116 l 9397 7118 l 9332 7120 l
+ 9267 7122 l 9199 7124 l 9131 7125 l 9062 7127 l 8992 7128 l
+ 8921 7128 l 8851 7129 l 8780 7129 l 8710 7130 l 8641 7130 l
+ 8574 7130 l 8508 7130 l 8446 7129 l 8386 7129 l 8331 7129 l
+ 8279 7128 l 8232 7128 l 8190 7127 l 8153 7127 l 8121 7126 l
+ 8094 7126 l 8073 7126 l 8056 7126 l 8043 7125 l
+ 8025 7125 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 8297 7065 m 8057 7125 l 8297 7185 l 8297 7065 l  cp gs 0.00 setgray ef gr  col0 s
+/Times-Roman ff 300.00 scf sf
+1350 3975 m
+gs 1 -1 sc (CullingManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+5175 3975 m
+gs 1 -1 sc (QueryManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+8700 3975 m
+gs 1 -1 sc (PreprocessingManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+9000 1650 m
+gs 1 -1 sc (CoherentHierarchicalCullingQueryManager) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+-5475 900 m
+gs 1 -1 sc (INDEPENDENT) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+-5100 3675 m
+gs 1 -1 sc (FrustumCullingManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+4725 -3225 m
+gs 1 -1 sc (BspHierarchyInterface) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+300 -5250 m
+gs 1 -1 sc (VisibilityOctreeSceneManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+-3600 -6225 m
+gs 1 -1 sc (VisibilityTerrainSceneManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+900 -7650 m
+gs 1 -1 sc (OctreeSceneManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+5100 -8625 m
+gs 1 -1 sc (BspSceneManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+4425 -6225 m
+gs 1 -1 sc (VisibilityBspSceneManager) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+-5850 -5550 m
+gs 1 -1 sc (DEPENDENT) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+-5850 -6075 m
+gs 1 -1 sc (OGRE) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+-5850 -9750 m
+gs 1 -1 sc (OGRE) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+-3000 -8625 m
+gs 1 -1 sc (TerrainSceneManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+9525 -7650 m
+gs 1 -1 sc (SceneManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+9150 -5250 m
+gs 1 -1 sc (VisibilitySceneManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+8550 -3225 m
+gs 1 -1 sc (SceneNodeHierarchyInterface) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+14400 -8550 m
+gs 1 -1 sc (DotSceneManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+13725 -6225 m
+gs 1 -1 sc (VisibilityDotSceneManager) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+-5475 375 m
+gs 1 -1 sc (OGRE) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+4800 8400 m
+gs 1 -1 sc (VisibilityEnvironment) col0 sh gr
+% Polyline
+7.500 slw
+n 4500 600 m 7800 600 l 7800 1200 l 4500 1200 l
+ cp gs col0 s gr 
+/Times-Roman ff 300.00 scf sf
+5025 6825 m
+gs 1 -1 sc (VisibilityManager) col0 sh gr
+/Times-Roman ff 300.00 scf sf
+5100 975 m
+gs 1 -1 sc (HierarchyInterface) col0 sh gr
+% Polyline
+n -4050 4800 m -300 4800 l -300 5400 l -4050 5400 l
+ cp gs col0 s gr 
+% here ends figure;
+$F2psEnd
+rs
+showpage
Index: /tags/DummyModules/VUT/doc/DummyModules/overview.tex
===================================================================
--- /tags/DummyModules/VUT/doc/DummyModules/overview.tex	(revision 71)
+++ /tags/DummyModules/VUT/doc/DummyModules/overview.tex	(revision 71)
@@ -0,0 +1,87 @@
+\newcommand{\tab}{\hspace{2mm}}
+\chapter{Overview}
+
+
+ The visibility workpackage aims to develop methods for making use of
+restricted visibility in large scenes. The major goal of these methods
+is to avoid wasting computational power on currently invisible parts
+of the scene. To address this goal, we develop new methods for online
+visibility culling and offline visibility preprocessing. The online
+visibility culling is either used to render only visible part of the
+scene or to provide queries which determine visible parts of the scene
+in runtime. Visibility preprocessing provides partitioning of the view
+space into view cells, and for each view cell it calculates a
+potentially visible set.
+
+
+\section{Module Class Hierarchy}
+
+ The visibility workpackage consists of a module which is integrated
+into the game engine and an external module which deals with
+preprocessing. One of the goals of the design of the module class
+hierarchy has been easy portability of the developed methods to other
+game engines. The resulting class structure clearly separates the
+actual engine-dependent parts from the game engine independent
+algorithmic parts.  We have used name spaces to separate the engine
+dependent parts (name space Ogre) from the engine independent parts
+(name space GtpVisibility). The external visibility preprocessing
+module defines its own name space (GtpVisibilityPreprocessor).
+
+ An overview of the important classes of the visibility work package and
+their integration into the Ogre engine is depicted in
+Figure~\ref{fig:classes}.
+
+\begin{figure}[htb]
+  \centerline{
+    \includegraphics[angle=270,width=1.0\textwidth]{../classes}
+    }
+  \caption{Overview of the visibility work packages classes and their integration
+    into the Ogre game engine.}
+  \label{fig:classes}
+\end{figure}
+
+The diagram shows that the module integrated into the engine consists
+of three main parts (CullingManager, QueryManager,
+PreprocessingManager), which are encapsulated in a helper class
+(Visibility Manager). The helper class then deals with the
+initialization of the contained parts and allows easy communication
+between them.
+
+\section{Visibility Culling}
+
+Visibility culling seamlessly integrates into the rendering loop and
+eliminates most invisible objects from being sent to the pipeline.
+Visibility culling is implemented by instances of the CullingManager
+class. We will provide several implementations which can be easily
+switched at runtime and so the best technique for the particular scene
+and scene representation can be selected. Note that the Ogre
+integration design allows to exploit all already existing methods for
+scene management, such as octree, BSP tree, or plain scene graph.
+
+
+\section{Visibility Queries}
+
+Visibility queries determine the visible geometry for a given view
+point in the scene. Additionally they can also report the visible
+scene hierarchy nodes. Visibility queries are implemented by
+instances of the QueryManager class. Note that some of these instances
+will make use of the preprocessed visibility data through the use of
+PreprocessingManager.
+
+\section{Visibility Preprocessing}
+
+Visibility preprocessing precalculates visibility for all viewpoints
+corresponding to cells of a view space partitioning. The visibility
+preprocessor is implemented as a standalone module which imports files
+generated by the PreprocessingManager. The results of the visibility
+computation will be exported to the file which can then be loaded by
+the PreprocessingManager and used inside the engine.
+
+ Apart from the scene definition file, the preprocessor will be able
+to import the view cell definition. In this case it will assume the
+view cells have to be described as meshes satisfying a set of
+requirements. Alternatively, the module can generate view cells by
+automatic view space partitioning.
+
+
+%{\textbullet}\tab\textbf{Construction module for tree multiresolution models.}
Index: /tags/DummyModules/VUT/doc/DummyModules/refman_edited.tex
===================================================================
--- /tags/DummyModules/VUT/doc/DummyModules/refman_edited.tex	(revision 73)
+++ /tags/DummyModules/VUT/doc/DummyModules/refman_edited.tex	(revision 73)
@@ -0,0 +1,177 @@
+\documentclass[a4paper]{book}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{pdfpages}
+\ifx\pdfoutput\undefined
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\usepackage{pspicture}
+\else
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\fi
+\usepackage{doxygen}
+\makeindex
+\setcounter{tocdepth}{1}
+\renewcommand{\footrulewidth}{0.4pt}
+\begin{document}
+%\begin{titlepage}
+%\vspace*{7cm}
+%\begin{center}
+%{\Large Game\-Tools Geometry Modules Reference Manual\\[1ex]\large 0.1 }\\
+%\vspace*{1cm}
+%{\large Generated by Doxygen 1.4.0}\\
+%\vspace*{0.5cm}
+%{\small Tue Apr 19 12:57:03 2005}\\
+%\end{center}
+%\end{titlepage}
+\includepdf[pages=1-2]{../cover.pdf}
+\clearemptydoublepage
+\pagenumbering{roman}
+\tableofcontents
+\clearemptydoublepage
+\pagenumbering{arabic}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\input{../overview}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Game\-Tools Visibility Modules Hierarchical Index}
+\input{hierarchy}
+\chapter{Game\-Tools Visibility Modules Class Documentation}
+\input{class_ogre_1_1_bsp_hierarchy_interface}
+\include{class_ogre_1_1_octree_hierarchy_interface}
+\include{class_ogre_1_1_platform_hierarchy_interface}
+\include{class_ogre_1_1_platform_occlusion_query}
+\include{class_ogre_1_1_scene_node_hierarchy_interface}
+\include{class_ogre_1_1_solid_half_bounding_box}
+\include{class_ogre_1_1_visibility_bsp_scene_manager}
+\include{class_ogre_1_1_visibility_dot_scene_manager}
+\include{class_ogre_1_1_visibility_octree_scene_manager}
+\include{class_ogre_1_1_visibility_scene_manager}
+\include{class_ogre_1_1_visibility_terrain_scene_manager}
+\include{class_gtp_visibility_1_1_coherent_hierarchical_culling_manager}
+\include{class_gtp_visibility_1_1_culling_manager}
+\include{class_gtp_visibility_1_1_dummy_preprocessing_manager}
+\include{class_gtp_visibility_1_1_dummy_query_manager}
+\include{class_gtp_visibility_1_1_frustum_culling_manager}
+\include{class_gtp_visibility_1_1_greater_distance}
+\include{class_gtp_visibility_1_1_hierarchy_interface}
+\include{class_gtp_visibility_1_1_mesh_info}
+\include{class_gtp_visibility_1_1_node_info}
+\include{class_gtp_visibility_1_1_occlusion_query}
+\include{class_gtp_visibility_1_1_preprocessing_manager}
+\include{class_gtp_visibility_1_1_query_manager}
+\include{class_gtp_visibility_1_1_stop_and_wait_culling_manager}
+\include{class_gtp_visibility_1_1_visibility_environment}
+\include{class_gtp_visibility_1_1_visibility_manager}
+\include{class_gtp_visibility_preprocessor_1_1_axis_aligned_box3}
+\include{class_gtp_visibility_preprocessor_1_1_b_s_p_interior}
+\include{class_gtp_visibility_preprocessor_1_1_b_s_p_leaf}
+\include{class_gtp_visibility_preprocessor_1_1_b_s_p_node}
+\include{class_gtp_visibility_preprocessor_1_1_b_s_p_tree}
+\include{class_gtp_visibility_preprocessor_1_1_exact_preprocessor}
+\include{class_gtp_visibility_preprocessor_1_1_kd_interior}
+\include{class_gtp_visibility_preprocessor_1_1_kd_leaf}
+\include{class_gtp_visibility_preprocessor_1_1_kd_node}
+\include{class_gtp_visibility_preprocessor_1_1_kd_tree}
+\include{class_gtp_visibility_preprocessor_1_1_mesh}
+\include{class_gtp_visibility_preprocessor_1_1_patch}
+\include{class_gtp_visibility_preprocessor_1_1_plane3}
+\include{class_gtp_visibility_preprocessor_1_1_preprocessor}
+\include{class_gtp_visibility_preprocessor_1_1_sampling_preprocessor}
+\include{class_gtp_visibility_preprocessor_1_1_scene_graph}
+\include{class_gtp_visibility_preprocessor_1_1_scene_graph_node}
+\include{class_gtp_visibility_preprocessor_1_1_vector3}
+\chapter{Game\-Tools Visibility Modules Namespace Documentation}
+\input{namespace_gtp_visibility}
+\include{namespace_gtp_visibility_preprocessor}
+\include{namespace_ogre}
+\chapter{Game\-Tools Visibility Modules File Documentation}
+\input{_axis_aligned_box3_8h}
+\include{_coherent_hierarchical_culling_manager_8cpp}
+\include{_coherent_hierarchical_culling_manager_8h}
+\include{_containers_8h}
+\include{_culling_manager_8cpp}
+\include{_culling_manager_8h}
+\include{_distance_queue_8h}
+\include{_dummy_preprocessing_manager_8cpp}
+\include{_dummy_preprocessing_manager_8h}
+\include{_dummy_query_manager_8cpp}
+\include{_dummy_query_manager_8h}
+\include{_exact_preprocessor_8cpp}
+\include{_exact_preprocessor_8h}
+\include{_frustum_culling_manager_8cpp}
+\include{_frustum_culling_manager_8h}
+\include{_hierarchy_interface_8cpp}
+\include{_hierarchy_interface_8h}
+\include{_kd_tree_8cpp}
+\include{_kd_tree_8h}
+\include{_mesh_8h}
+\include{_occlusion_query_8h}
+\include{_ogre_bsp_hierarchy_interface_8cpp}
+\include{_ogre_bsp_hierarchy_interface_8h}
+\include{_ogre_octree_hierarchy_interface_8cpp}
+\include{_ogre_octree_hierarchy_interface_8h}
+\include{_ogre_platform_hierarchy_interface_8cpp}
+\include{_ogre_platform_hierarchy_interface_8h}
+\include{_ogre_platform_occlusion_query_8cpp}
+\include{_ogre_platform_occlusion_query_8h}
+\include{_ogre_scene_node_hierarchy_interface_8cpp}
+\include{_ogre_scene_node_hierarchy_interface_8h}
+\include{_ogre_solid_half_bounding_box_8cpp}
+\include{_ogre_solid_half_bounding_box_8h}
+\include{_ogre_visibility_bsp_scene_manager_8cpp}
+\include{_ogre_visibility_bsp_scene_manager_8h}
+\include{_ogre_visibility_dot_scene_manager_8cpp}
+\include{_ogre_visibility_dot_scene_manager_8h}
+\include{_ogre_visibility_octree_scene_manager_8cpp}
+\include{_ogre_visibility_octree_scene_manager_8h}
+\include{_ogre_visibility_scene_manager_8cpp}
+\include{_ogre_visibility_scene_manager_8h}
+\include{_ogre_visibility_scene_manager_dll_8cpp}
+\include{_ogre_visibility_terrain_scene_manager_8cpp}
+\include{_ogre_visibility_terrain_scene_manager_8h}
+\include{_plane3_8h}
+\include{_preprocessing_manager_8cpp}
+\include{_preprocessing_manager_8h}
+\include{_preprocessor_8cpp}
+\include{_preprocessor_8h}
+\include{_query_manager_8cpp}
+\include{_query_manager_8h}
+\include{_sampling_preprocessor_8cpp}
+\include{_sampling_preprocessor_8h}
+\include{_scene_graph_8h}
+\include{_stop_and_wait_culling_manager_8cpp}
+\include{_stop_and_wait_culling_manager_8h}
+\include{_vector3_8h}
+\include{_view_cell_b_s_p_8h}
+\include{_visibility_axis_aligned_box_8h}
+\include{_visibility_camera_8h}
+\include{_visibility_environment_8cpp}
+\include{_visibility_environment_8h}
+\include{_visibility_info_8h}
+\include{_visibility_manager_8cpp}
+\include{_visibility_manager_8h}
+\include{_visibility_mesh_8h}
+\include{_visibility_ray_8h}
+\include{_visibility_vector3_8h}
+\chapter{Game\-Tools Visibility Modules Class Index}
+\input{annotated}
+\chapter{Game\-Tools Visibility Modules Namespace Index}
+\input{namespaces}
+\chapter{Game\-Tools Visibility Modules File Index}
+\input{files}
+\printindex
+\end{document}
Index: /tags/DummyModules/VUT/doc/DummyModules/header.tex
===================================================================
--- /tags/DummyModules/VUT/doc/DummyModules/header.tex	(revision 67)
+++ /tags/DummyModules/VUT/doc/DummyModules/header.tex	(revision 67)
@@ -0,0 +1,49 @@
+\documentclass[a4paper]{book}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{pdfpages}
+\ifx\pdfoutput\undefined
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\usepackage{pspicture}
+\else
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
+\fi
+\usepackage{doxygen}
+\makeindex
+\setcounter{tocdepth}{1}
+\renewcommand{\footrulewidth}{0.4pt}
+\begin{document}
+%\begin{titlepage}
+%\vspace*{7cm}
+%\begin{center}
+%{\Large Game\-Tools Geometry Modules Reference Manual\\[1ex]\large 0.1 }\\
+%\vspace*{1cm}
+%{\large Generated by Doxygen 1.4.0}\\
+%\vspace*{0.5cm}
+%{\small Tue Apr 19 12:57:03 2005}\\
+%\end{center}
+%\end{titlepage}
+\includepdf[pages=1-2]{../cover.pdf}
+\clearemptydoublepage
+\pagenumbering{roman}
+\tableofcontents
+\clearemptydoublepage
+\pagenumbering{arabic}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\input{../overview}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Index: /tags/DummyModules/VUT/doc/DummyModules/doxyfile_gtp_dummy
===================================================================
--- /tags/DummyModules/VUT/doc/DummyModules/doxyfile_gtp_dummy	(revision 73)
+++ /tags/DummyModules/VUT/doc/DummyModules/doxyfile_gtp_dummy	(revision 73)
@@ -0,0 +1,262 @@
+#Doxyfile 1.4.2
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = "GameTools Visibility Modules"
+PROJECT_NUMBER         = 0.1
+OUTPUT_DIRECTORY       = ./
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+USE_WINDOWS_ENCODING   = YES
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+#STRIP_FROM_PATH        = "d:/gametools/trunk/VUT/"
+STRIP_FROM_INC_PATH    = "d:\gametools\svn\trunk\VUT"
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = NO
+INHERIT_DOCS           = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SEPARATE_MEMBER_PAGES  = YES
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+SUBGROUPING            = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = YES
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = NO
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+#SORT_BY_SCOPE_NAME     = YES
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = YES
+SHOW_DIRECTORIES       = NO
+FILE_VERSION_FILTER    = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../../GtpVisibility/src/ \
+	 		 ../../GtpVisibility/include/ \
+			 ../../Ogre/src/ \
+	 		 ../../Ogre/include/ \
+			 ../../GtpVisibilityPreprocessor/src/ \
+	 		 ../../GtpVisibilityPreprocessor/include/ 
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.d \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.idl \
+                         *.odl \
+                         *.cs \
+                         *.php \
+                         *.php3 \
+                         *.inc \
+                         *.m \
+                         *.mm \
+                         *.dox
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = */Test/*
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = *
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = NO
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = YES
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = header.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = YES
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = YES
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1024
+MAX_DOT_GRAPH_DEPTH    = 1000
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
Index: /tags/DummyModules/VUT/doc/DummyModules/doxyfile_gtp_dummy_2
===================================================================
--- /tags/DummyModules/VUT/doc/DummyModules/doxyfile_gtp_dummy_2	(revision 71)
+++ /tags/DummyModules/VUT/doc/DummyModules/doxyfile_gtp_dummy_2	(revision 71)
@@ -0,0 +1,261 @@
+# Doxyfile 1.4.2
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = "GameTools Visibility"
+PROJECT_NUMBER         = 0.1
+OUTPUT_DIRECTORY       = ./
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+USE_WINDOWS_ENCODING   = YES
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = YES
+STRIP_FROM_PATH        = D:\gametools\trunk\VUT\
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = NO
+INHERIT_DOCS           = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SEPARATE_MEMBER_PAGES  = YES
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+SUBGROUPING            = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = YES
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = NO
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = YES
+SORT_BY_SCOPE_NAME     = YES
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = YES
+SHOW_DIRECTORIES       = YES
+FILE_VERSION_FILTER    = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../../GtpVisibility/src/ \
+                         ../../GtpVisibility/include/ \
+                         ../../Ogre/src/ \
+                         ../../Ogre/include/ \
+                         ../../GtpVisibilityPreprocessor/src/ \
+                         ../../GtpVisibilityPreprocessor/include/
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.d \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.idl \
+                         *.odl \
+                         *.cs \
+                         *.php \
+                         *.php3 \
+                         *.inc \
+                         *.m \
+                         *.mm \
+                         *.dox
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = */Test/*
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = *
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = NO
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = YES
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = header.tex
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = YES
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = YES
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1024
+MAX_DOT_GRAPH_DEPTH    = 1000
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
Index: /tags/DummyModules/VUT/scripts/Doxyfile_insti.doxy
===================================================================
--- /tags/DummyModules/VUT/scripts/Doxyfile_insti.doxy	(revision 63)
+++ /tags/DummyModules/VUT/scripts/Doxyfile_insti.doxy	(revision 63)
@@ -0,0 +1,259 @@
+# Doxyfile 1.4.2
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = OcclusionCullingModule
+PROJECT_NUMBER         = 
+OUTPUT_DIRECTORY       = D:/gametools/trunk/VUT/VisibilityModule/docs
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+USE_WINDOWS_ENCODING   = YES
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = YES
+STRIP_FROM_PATH        = "C:/Dokumente und Einstellungen/matt/"
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = NO
+INHERIT_DOCS           = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+SUBGROUPING            = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = NO
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = YES
+SHOW_DIRECTORIES       = YES
+FILE_VERSION_FILTER    = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = D:/gametools/trunk/VUT/VisibilityModule/src/ \
+                         D:\gametools/trunk/VUT/VisibilityModule/include \
+                         D:/gametools/trunk/VUT/VisibilityModule/src/GtpVisibility \
+                         D:/gametools/trunk/VUT/VisibilityModule/include/GtpVisibility
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.d \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.idl \
+                         *.odl \
+                         *.cs \
+                         *.php \
+                         *.php3 \
+                         *.inc \
+                         *.m \
+                         *.mm \
+                         *.dox
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = */Test/*
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = *
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = NO
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1024
+MAX_DOT_GRAPH_DEPTH    = 1000
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
Index: /tags/DummyModules/VUT/scripts/GtpVisibility.sln
===================================================================
--- /tags/DummyModules/VUT/scripts/GtpVisibility.sln	(revision 71)
+++ /tags/DummyModules/VUT/scripts/GtpVisibility.sln	(revision 71)
@@ -0,0 +1,68 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_VisibilitySceneManager", "..\Ogre\scripts\Plugin_VisibilitySceneManager.vcproj", "{80DECC17-BDDD-4412-8CF8-F7C1C17A7436}"
+	ProjectSection(ProjectDependencies) = postProject
+		{101A7691-74F3-48B4-96A3-CF35578F5900} = {101A7691-74F3-48B4-96A3-CF35578F5900}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestCulling", "..\work\TestCulling\TestCulling.vcproj", "{248F19A6-2FE0-4F5D-8928-E0EA10609887}"
+	ProjectSection(ProjectDependencies) = postProject
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436} = {80DECC17-BDDD-4412-8CF8-F7C1C17A7436}
+		{101A7691-74F3-48B4-96A3-CF35578F5900} = {101A7691-74F3-48B4-96A3-CF35578F5900}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestCullingDotScene", "..\work\TestCullingDotScene\TestCullingDotScene.vcproj", "{BE13944C-D05E-467F-B0AC-8A65A3B5FE60}"
+	ProjectSection(ProjectDependencies) = postProject
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436} = {80DECC17-BDDD-4412-8CF8-F7C1C17A7436}
+		{101A7691-74F3-48B4-96A3-CF35578F5900} = {101A7691-74F3-48B4-96A3-CF35578F5900}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestCullingTerrain", "..\work\TestCullingTerrain\TestCullingTerrain.vcproj", "{248F19A6-2FE0-4F5D-8928-E0EA10609887}"
+	ProjectSection(ProjectDependencies) = postProject
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436} = {80DECC17-BDDD-4412-8CF8-F7C1C17A7436}
+		{101A7691-74F3-48B4-96A3-CF35578F5900} = {101A7691-74F3-48B4-96A3-CF35578F5900}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GtpVisibility", "..\GtpVisibility\scripts\GtpVisibility.vcproj", "{101A7691-74F3-48B4-96A3-CF35578F5900}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Preprocessor", "..\GtpVisibilityPreprocessor\scripts\Preprocessor.vcproj", "{101A7691-74F3-48B4-96A3-CF35578F5900}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		Debug = Debug
+		Release = Release
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436}.Debug.ActiveCfg = Debug|Win32
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436}.Debug.Build.0 = Debug|Win32
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436}.Release.ActiveCfg = Release|Win32
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436}.Release.Build.0 = Release|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Debug.ActiveCfg = Debug|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Debug.Build.0 = Debug|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Release.ActiveCfg = Release|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Release.Build.0 = Release|Win32
+		{BE13944C-D05E-467F-B0AC-8A65A3B5FE60}.Debug.ActiveCfg = Debug|Win32
+		{BE13944C-D05E-467F-B0AC-8A65A3B5FE60}.Debug.Build.0 = Debug|Win32
+		{BE13944C-D05E-467F-B0AC-8A65A3B5FE60}.Release.ActiveCfg = Release|Win32
+		{BE13944C-D05E-467F-B0AC-8A65A3B5FE60}.Release.Build.0 = Release|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Debug.ActiveCfg = Debug|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Debug.Build.0 = Debug|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Release.ActiveCfg = Release|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Release.Build.0 = Release|Win32
+		{101A7691-74F3-48B4-96A3-CF35578F5900}.Debug.ActiveCfg = Debug|Win32
+		{101A7691-74F3-48B4-96A3-CF35578F5900}.Debug.Build.0 = Debug|Win32
+		{101A7691-74F3-48B4-96A3-CF35578F5900}.Release.ActiveCfg = Release|Win32
+		{101A7691-74F3-48B4-96A3-CF35578F5900}.Release.Build.0 = Release|Win32
+		{101A7691-74F3-48B4-96A3-CF35578F5900}.Debug.ActiveCfg = Debug|Win32
+		{101A7691-74F3-48B4-96A3-CF35578F5900}.Debug.Build.0 = Debug|Win32
+		{101A7691-74F3-48B4-96A3-CF35578F5900}.Release.ActiveCfg = Release|Win32
+		{101A7691-74F3-48B4-96A3-CF35578F5900}.Release.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/ExactPreprocessor.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/ExactPreprocessor.h	(revision 68)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/ExactPreprocessor.h	(revision 68)
@@ -0,0 +1,17 @@
+#ifndef _ExactPreprocessor_H__
+#define _ExactPreprocessor_H__
+
+#include "Preprocessor.h"
+
+namespace GtpVisibilityPreprocessor {
+  /** Exact visibility preprocessing. The implementation is based on 6D BSP and
+      Plucker coordinates */
+  class ExactPreprocessor : public Preprocessor {
+  public:
+    virtual bool ComputeVisibility();
+  };
+  
+};
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Mesh.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Mesh.h	(revision 68)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Mesh.h	(revision 68)
@@ -0,0 +1,49 @@
+#ifndef _Mesh_H__
+#define _Mesh_H__
+
+#include <vector>
+#include "Plane3.h"
+
+namespace GtpVisibilityPreprocessor {
+
+  /** Patch used as an element of the mesh */
+  class Patch {
+  public:
+    Patch():mVertices() {}
+  protected:
+    /// list of vertex pointers
+    vector<Vector3 *> mVertices;
+  };
+
+  /** Mesh containing polygonal patches */
+  class Mesh {
+  public:
+    /// default vertex container for Mesh
+    typedef std::vector<Vector3> VertexContainer;
+    /// default patch container for Mesh
+    typedef std::vector<Patch *> PatchContainer;
+
+    /// Default constructor
+    Mesh():mVertices(), mPatches() {}
+
+    /// Constructor with container preallocation
+    Mesh(const int vertices,
+	 const int patches):mVertices(),
+			    mPatches()
+    {
+      mVertices.reserve(vertices);
+      mPatches.reserve(patches);
+    }
+    
+  protected:
+    /** Vertices forming the mesh */
+    VertexContainer mVertices;
+    /** Patches forming the mesh */
+    PatchContainer mPatches;
+  };
+  
+};
+
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/KdTree.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/KdTree.h	(revision 68)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/KdTree.h	(revision 68)
@@ -0,0 +1,119 @@
+#ifndef _KdTree_H__
+#define _KdTree_H__
+
+#include "Containers.h"
+#include "AxisAlignedBox3.h"
+
+namespace GtpVisibilityPreprocessor {
+  
+  class KdNode;
+  /** KdTree for indexing scene entities - occluders/occludees/viewcells */
+  class KdTree {
+  public:
+
+    /** Insert occluder into the tree */
+    virtual void InsertOccluder(Mesh *occluder) {
+      //      mRoot->mOccluders.push_back(occluder);
+    }
+
+    /** Insert occludee into the tree */
+    virtual void InsertOccludee(Mesh *occludee) {
+      //      mRoot->mOccludees.push_back(occludee);
+    }
+    
+    /** Insert view cell into the tree */
+    virtual void InsertViewCell(ViewCell *viewCell) {
+      //      mRoot->mViewcells.push_back(viewCell);
+    }
+    
+    /** Check whether subdivision criteria are met for the given subtree.
+	If not subdivide the leafs of the subtree. The criteria are specified in
+	the environment as well as the subdivision method. By default surface area
+	heuristics is used.
+	
+	@param subtree root of the subtree
+
+	@return true if subdivision was performed, false if subdivision criteria
+	were already met
+    */
+    virtual bool Subdivide(KdNode *subtree);
+
+    /** Get the root of the tree */
+    KdNode *GetRoot() const {
+      return mRoot;
+    }
+
+  protected:
+    /// root of the tree
+    KdNode *mRoot;
+    /// bounding box of the tree root
+    AxisAlignedBox3 mBox;
+  };
+  
+  
+  class KdInterior;
+  /** Abstract class for kd-tree node */
+  class KdNode {
+
+    /** Determines whether this node is a leaf or interior node
+	@return true if leaf
+    */
+    virtual bool IsLeaf() const = 0;
+
+    /** Determines whether this node is the root of the tree
+	@return true if root
+    */
+    virtual bool IsRoot() const {
+      return mParent == NULL;
+    }
+
+  protected:
+    /** Parent of the node - the parent is a little overhead for maintanance of the tree,
+	but allows various optimizations of tree traversal algorithms */
+    KdInterior *mParent;
+  };
+
+  /** Implementation of the kd-tree interior node */
+  class KdInterior : public KdNode {
+
+  public:
+    /** \sa KdNode::IsLeaf() */
+    virtual bool IsLeaf() const { return false; }
+
+  protected:
+    /** splitting axis */
+    int axis;
+    /** splitting position, absolute position within the bounding box of this node */
+    float mPosition;
+
+    /** back node */
+    KdNode *mBack;
+    /** front node */
+    KdNode *mFront;
+
+  };
+  
+  
+  /** Implementation of the kd-tree leaf node */
+  class KdLeaf : public KdNode {
+  public:
+    /** \sa KdNode::IsLeaf() */
+    virtual bool IsLeaf() const { return true; }
+
+  protected:
+    /** pointers to occluders contained in this node */
+    MeshContainer mOccluders;
+    /** pointers to occludees contained in this node */
+    MeshContainer mOccludees;
+    /** pointers to viewcells contained in this node */
+    ViewCellContainer mViewCells;
+  };
+  
+  
+  
+};
+
+
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/SceneGraph.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/SceneGraph.h	(revision 68)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/SceneGraph.h	(revision 68)
@@ -0,0 +1,33 @@
+#ifndef _SceneGraph_H__
+#define _SceneGraph_H__
+
+#include "Containers.h"
+#include "AxisAlignedBox3.h"
+
+namespace GtpVisibilityPreprocessor {
+  
+  /** Basic scene graph node, we are interested only in bounding boxes and topology
+      of the scene graph */
+  class SceneGraphNode {
+  public:
+    
+    
+  protected:
+    MeshContainer mGeometry;
+    NodeContainer mChildren;
+    AxisAlignedBox3 mBox;
+  };
+  
+
+  /** Scene graph class */
+  class SceneGraph {
+    
+  protected:
+    SceneGraphNode *mRoot;
+  };
+  
+
+};
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/ViewCellBSP.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/ViewCellBSP.h	(revision 68)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/ViewCellBSP.h	(revision 68)
@@ -0,0 +1,81 @@
+#ifndef _ViewCellBsp_H__
+#define _ViewCellBsp_H__
+
+namespace GtpVisibilityPreprocessor {
+  
+  
+  class BSPInterior;
+
+  /**
+     BSPNode abstract class serving for interior and leaf node implementation
+  */
+  class BSPNode {
+  public:
+    /** Determines whether this node is a leaf or not
+	@return true if leaf
+    */
+    virtual bool IsLeaf() const = 0;
+    
+    /** Determines whether this node is a root
+	@return true if root
+    */
+    virtual bool IsRoot() const {
+      return parent == NULL;
+    }
+  protected:
+    /// parent of this node
+    BSPInterior *parent;
+  };
+
+  /** BSP interior node implementation */
+  class BSPInterior : public BSPNode {
+    
+    /** @return false since it is an interior node */
+    virtual bool IsLeaf() const { return false; }
+
+  protected:
+    /// Splitting plane corresponding to this node
+    Plane3 mPlane;
+    /// back node
+    BSPNode *mBack;
+    /// front node
+    BSPNode *mFront;
+  };
+  
+  
+  /** BSP leaf node implementation */
+  class BSPLeaf : public BSPNode {
+  public:
+    BSPLeaf(ViewCell *viewCell = NULL):mViewCell(viewCell) {}
+    /** @return true since it is an interior node */
+    virtual bool IsLeaf() const { return true; }
+
+  protected:
+    /// polygonal representation of this viewcell
+    /// if NULL this note does not correspond to feasible viewcell
+    ViewCell *mViewCell;
+  };
+  
+  /** Implementation of the ViewCell BSP tree */
+  class BSPTree {
+  public:
+    /** Constructor takes a pointer to the cell corresponding to the whole
+	viewspace */
+    BSPTree(ViewCell *cell) {
+      mRootCell = cell;
+      mRoot = new BSPLeaf(mRootCell);
+    }
+    
+    
+  protected:
+    /// Pointer to the root of the tree
+    BSPNode *mRoot;
+    /// Pointer to the root cell of the viewspace */
+    ViewCell *mRootCell;
+  };
+  
+};
+
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/SamplingPreprocessor.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/SamplingPreprocessor.h	(revision 68)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/SamplingPreprocessor.h	(revision 68)
@@ -0,0 +1,18 @@
+#ifndef _SamplingPreprocessor_H__
+#define _SamplingPreprocessor_H__
+
+#include "Preprocessor.h"
+
+namespace GtpVisibilityPreprocessor {
+
+  /** Sampling based visibility preprocessing. The implementation is based on heuristical
+      sampling of view space */
+  class SamplingPreprocessor : public Preprocessor {
+  public:
+    virtual bool ComputeVisibility();
+  };
+  
+};
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Plane3.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Plane3.h	(revision 68)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Plane3.h	(revision 68)
@@ -0,0 +1,20 @@
+#ifndef _Plane3_H__
+#define _Plane3_H__
+
+#include "vector3.h"
+
+namespace GtpVisibilityPreprocessor {
+  
+  /** 3D Plane */
+  class Plane3 {
+  public:
+    Vector3 mNormal;
+    float mD;
+  };
+  
+  
+};
+
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/AxisAlignedBox3.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/AxisAlignedBox3.h	(revision 68)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/AxisAlignedBox3.h	(revision 68)
@@ -0,0 +1,19 @@
+#ifndef _AxisAlignedBox3_H__
+#define _AxisAlignedBox3_H__
+
+#include "vector3.h"
+
+
+namespace GtpVisibilityPreprocessor {
+  
+  /** Axis aligned box */
+  class AxisAlignedBox3 {
+  protected:
+    Vector3 min, max;
+  };
+  
+
+};
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Containers.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Containers.h	(revision 68)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Containers.h	(revision 68)
@@ -0,0 +1,24 @@
+#ifndef _Container_H__
+#define _Container_H__
+
+#include <vector>
+using namespace std;
+
+namespace GtpVisibilityPreprocessor {
+  class Mesh;
+  class ViewCell;
+  class HierarchyNode;
+  /** Container for Mesh pointers primarily for the use within the kDTree and
+      BSP hierarchies */
+  typedef vector<Mesh *> MeshContainer;
+  /** Container for ViewCell pointers primarily for the use within the kDTree and
+      BSP hierarchies */
+  typedef vector<ViewCell *> ViewCellContainer;
+  /** Container for HierarchyNodes pointers primarily for the use within the kDTree and
+      BSP hierarchies */
+  typedef vector<HierarchyNode *> NodeContainer;
+};
+
+
+#endif // _Container_H__
+
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Vector3.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Vector3.h	(revision 68)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Vector3.h	(revision 68)
@@ -0,0 +1,17 @@
+#ifndef _Vector3_H__
+#define _Vector3_H__
+
+
+namespace GtpVisibilityPreprocessor {
+  /** 3D vector */
+  class Vector3 {
+  public:
+    float x, y, z;
+  };
+  
+  
+};
+
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Preprocessor.h
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Preprocessor.h	(revision 68)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/include/Preprocessor.h	(revision 68)
@@ -0,0 +1,87 @@
+#ifndef _Preprocessor_H__
+#define _Preprocessor_H__
+
+#include "Containers.h"
+#include "Mesh.h"
+#include "KdTree.h"
+#include "ViewCellBsp.h"
+#include "SceneGraph.h"
+
+/** Namespace for the external visibility preprocessor
+
+    This namespace includes all classes which are created by the VUT (Vienna University
+    of Technology) for the External Visibility Preprocessor of the GTP (GameTools Project)
+    (www.gametools.org).
+ */
+namespace GtpVisibilityPreprocessor {
+  /** Main class of the visibility preprocessor. Responsible for loading and
+      saving of the input and output files. Initiates construction of the kD-tree,
+      viewcell loading/generation and the visibility computation itself.
+  */
+  class Preprocessor {
+  public:
+    /** Load the input scene. 
+	@param filename file to load
+	@return true on success
+    */
+    virtual bool LoadScene(const string filename);
+
+    /** Load the input viewcells. The input viewcells should be given as a collection
+	of meshes. Each mesh is assume to form a bounded polyhedron defining the interior of
+	the viewcell. The method then builds a BSP tree of these view cells.
+	@param filename file to load
+	@return true on success
+    */
+    virtual bool LoadViewcells(const string filename);
+
+    /** Generate the viewCells automatically. The particular algorithm to be used depends
+	on the environment setting. Initially the generated viewcells will cover the whole
+	bounding volume of the scene. They can be pruned later depending on the results
+	of visibility computations.
+	@return true on successful viewcell generation.
+    */
+    virtual bool GenerateViewcells();
+    
+    /** Export all preprocessed data in a XML format understandable by the
+	PreprocessingInterface of the GtpVisibilityPreprocessor Module. The file can be compressed depending
+	on the environement settings.
+	@return true on successful export
+    */
+    virtual bool ExportPreprocessedData(const string filename);
+
+    /** Build the KdTree of currently loaded occluders/occludees/viewcells. The construction
+	is driven by the environment settings, which also sais which of the three types of
+	entities should be used to drive the heuristical construction (only occluders by default)
+    */
+    virtual bool BuildKdTree();
+
+    /** Compute visibility method. This method has to be reimplemented by the actual
+	Preprocessor implementation (e.g. SamplingPreprocessor, ExactPreprocessor,
+	GlobalSamplingpreprocessor)
+    */
+    virtual bool ComputeVisibility() = 0;
+
+
+  protected:
+    /// scene graph loaded from file
+    SceneGraph *mSceneGraph;
+    /// BSP tree representing the viewcells
+    BSPTree *mViewCellBSPTree;
+    /// kD-tree organizing the scene graph (occluders + occludees) + viewcells
+    KdTree *mKdTree;
+
+    /// list of all loaded occluders
+    MeshContainer mOccluders;
+    /// list of all loaded occludees
+    MeshContainer mOccludees;
+    /// list of all loaded/generated viewcells
+    ViewCellContainer mViewcells;
+
+  };
+  
+};
+
+
+
+
+#endif
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/scripts/preprocessor.pro
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/scripts/preprocessor.pro	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/scripts/preprocessor.pro	(revision 65)
@@ -0,0 +1,21 @@
+
+TEMPLATE = app
+
+TARGET = preprocessor
+
+INCLUDEPATH += ../include
+
+# debuc config
+CONFIG		+= console warn_on debug thread
+
+# RELEASE CONFIG
+#CONFIG		+= windows warn_on thread
+
+# DEPENDPATH	= ../../include
+
+# Input
+HEADERS += 
+
+	
+SOURCES += Preprocessor.cpp SamplingPreprocessor.cpp ExactPreprocessor.cpp KdTree.cpp
+
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/scripts/Preprocessor.vcproj
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/scripts/Preprocessor.vcproj	(revision 71)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/scripts/Preprocessor.vcproj	(revision 71)
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="Preprocessor"
+	ProjectGUID="{101A7691-74F3-48B4-96A3-CF35578F5900}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\lib\$(ConfigurationName)"
+			IntermediateDirectory="..\obj\$(ConfigurationName)"
+			ConfigurationType="4"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/GtpVisibility.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="..\bin\$(ConfigurationName)"
+			IntermediateDirectory="..\obj\$(ConfigurationName)"
+			ConfigurationType="4"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/GtpVisibility.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\ExactPreprocessor.cpp">
+			</File>
+			<File
+				RelativePath="..\src\KdTree.cpp">
+			</File>
+			<File
+				RelativePath="..\src\Preprocessor.cpp">
+			</File>
+			<File
+				RelativePath="..\src\SamplingPreprocessor.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath="..\include\AxisAlignedBox3.h">
+			</File>
+			<File
+				RelativePath="..\include\Containers.h">
+			</File>
+			<File
+				RelativePath="..\include\ExactPreprocessor.h">
+			</File>
+			<File
+				RelativePath="..\include\KdTree.h">
+			</File>
+			<File
+				RelativePath="..\include\Mesh.h">
+			</File>
+			<File
+				RelativePath="..\include\Plane3.h">
+			</File>
+			<File
+				RelativePath="..\include\Preprocessor.h">
+			</File>
+			<File
+				RelativePath="..\include\SamplingPreprocessor.h">
+			</File>
+			<File
+				RelativePath="..\include\SceneGraph.h">
+			</File>
+			<File
+				RelativePath="..\include\Vector3.h">
+			</File>
+			<File
+				RelativePath="..\include\ViewCellBSP.h">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/src/KdTree.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/src/KdTree.cpp	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/src/KdTree.cpp	(revision 65)
@@ -0,0 +1,11 @@
+#include "KdTree.h"
+
+namespace GtpVisibilityPreprocessor {
+  
+  bool
+  KdTree::Subdivide(KdNode *subtree)
+  {
+    return true;
+  }
+
+}
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/src/SamplingPreprocessor.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/src/SamplingPreprocessor.cpp	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/src/SamplingPreprocessor.cpp	(revision 65)
@@ -0,0 +1,14 @@
+#include "SamplingPreprocessor.h"
+
+namespace GtpVisibilityPreprocessor {
+  
+  bool
+  SamplingPreprocessor::ComputeVisibility()
+  {
+
+    return true;
+  };
+  
+};
+
+
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/src/Preprocessor.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/src/Preprocessor.cpp	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/src/Preprocessor.cpp	(revision 65)
@@ -0,0 +1,54 @@
+#include "Preprocessor.h"
+#include "SamplingPreprocessor.h"
+#include "ExactPreprocessor.h"
+
+namespace GtpVisibilityPreprocessor {
+
+  bool
+  Preprocessor::LoadViewcells(const string filename)
+  {
+
+    return true;
+  }
+
+  bool
+  Preprocessor::GenerateViewcells()
+  {
+    
+    return true;
+  }
+    
+  bool
+  Preprocessor::LoadScene(const string filename)
+  {
+    // use leaf nodes of the original spatial hiearrchy as occludees
+    
+    return true;
+  }
+
+  bool
+  Preprocessor::ExportPreprocessedData(const string filename)
+  {
+    return false;
+  }
+  
+  bool
+  Preprocessor::BuildKdTree()
+  {
+    mKdTree = new KdTree;
+    mKdTree->Subdivide(mKdTree->GetRoot());
+    return true;
+  }
+  
+};
+
+int
+main(int argc, char **argv)
+{
+  GtpVisibilityPreprocessor::Preprocessor *p = new GtpVisibilityPreprocessor::SamplingPreprocessor();
+  p->LoadScene("scene.wrl");
+  p->LoadViewcells("viewcells.wrl");
+  p->ComputeVisibility();
+  p->ExportPreprocessedData("scene.vis");
+  return 0;
+}
Index: /tags/DummyModules/VUT/GtpVisibilityPreprocessor/src/ExactPreprocessor.cpp
===================================================================
--- /tags/DummyModules/VUT/GtpVisibilityPreprocessor/src/ExactPreprocessor.cpp	(revision 65)
+++ /tags/DummyModules/VUT/GtpVisibilityPreprocessor/src/ExactPreprocessor.cpp	(revision 65)
@@ -0,0 +1,14 @@
+#include "ExactPreprocessor.h"
+
+namespace GtpVisibilityPreprocessor {
+  
+  bool
+  ExactPreprocessor::ComputeVisibility()
+  {
+
+    return true;
+  };
+  
+};
+
+
Index: /tags/DummyModules/VUT/Ogre/include/OgreVisibilitySceneManager.h
===================================================================
--- /tags/DummyModules/VUT/Ogre/include/OgreVisibilitySceneManager.h	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/include/OgreVisibilitySceneManager.h	(revision 59)
@@ -0,0 +1,60 @@
+#ifndef _VisibilitySceneManager_H__
+#define _VisibilitySceneManager_H__
+
+#include "OgreSceneNodeHierarchyInterface.h"
+#include "VisibilityManager.h"
+
+#include <OgreSceneNode.h>
+#include <OgreSceneManager.h>
+#include <OgrePrerequisites.h>
+
+namespace Ogre {
+
+/**
+	This class implements the default scene manager, using occlusion queries for 
+	visibility culling.
+*/
+class VisibilitySceneManager : public SceneManager
+{
+public:
+	VisibilitySceneManager(GtpVisibility::VisibilityManager *visManager);
+	~VisibilitySceneManager();
+
+	/** Overriden from SceneManager. Renders the scene using occlusion culling.
+	@remark the type of algorithm is specified by the occlusion culling manager type
+	using by the visibility manager.
+	*/
+	void _renderVisibleObjects();
+	void _findVisibleObjects(Camera* cam, bool onlyShadowCasters);
+	void _updateSceneGraph(Camera* cam);
+
+	/** Sets the given option for the SceneManager
+			    @remarks
+		Options are:
+		"Algorithm", int *;			
+	*/
+	virtual bool setOption(const String &, const void *);
+	/** Gets the given option for the Scene VisibilityManager.
+	    @remarks
+		See setOption
+	*/
+	virtual bool getOption(const String &, void *);
+
+	bool getOptionValues(const String & key, StringVector &refValueList);
+	bool getOptionKeys( StringVector &refKeys );
+
+	/** Sets the visibility manager.
+		@param visManager the visibility manager
+	*/
+	void setVisibilityManager(GtpVisibility::VisibilityManager *visManager);
+	/** See set.
+	*/
+	GtpVisibility::VisibilityManager *getVisibilityManager();
+
+protected:
+	
+	SceneNodeHierarchyInterface *mHierarchyInterface;
+	GtpVisibility::VisibilityManager *mVisibilityManager;
+};
+} // namespace Ogre
+#endif // VisibilitySceneManager_H
Index: /tags/DummyModules/VUT/Ogre/include/OgreOctreeHierarchyInterface.h
===================================================================
--- /tags/DummyModules/VUT/Ogre/include/OgreOctreeHierarchyInterface.h	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/include/OgreOctreeHierarchyInterface.h	(revision 59)
@@ -0,0 +1,61 @@
+#ifndef _OctreeHierarchyInterface_H__
+#define _OctreeHierarchyInterface_H__
+
+#include <OgreOctree.h>
+#include "OgrePlatformHierarchyInterface.h"
+
+namespace Ogre {
+/**
+	This class implements the hierarchy interface for the Ogre octree hierarchy.
+*/
+class OctreeHierarchyInterface : public PlatformHierarchyInterface
+{
+public:
+	OctreeHierarchyInterface(SceneManager *sm, RenderSystem *rsys);
+	
+	/** Sets the number of nodes in this octree 
+		@remark do not confuse this with the OctreeNode class which is derived from SceneNode
+		@param num number of nodes in the octree
+	*/
+	void SetNumOctreeNodes(unsigned int num);
+
+	/** Gets the given option for the scene traverser.
+	    @remarks
+		See setOption
+	*/
+	//bool getOption( const String &, void * );
+	//bool getOptionKeys( StringVector &refKeys );
+	void PullUpVisibility(GtpVisibility::HierarchyNode *node);
+	/** Traverses given node.
+		@param node current node
+		@remark pushes children on distance queue
+	*/
+	void TraverseNode(GtpVisibility::HierarchyNode *node);
+	void RenderNode(GtpVisibility::HierarchyNode *node);
+	bool IsLeaf(GtpVisibility::HierarchyNode *node);
+	bool HasGeometry(GtpVisibility::HierarchyNode *node);
+	bool HasGreaterDistance(GtpVisibility::HierarchyNode *node1, 
+						    GtpVisibility::HierarchyNode *node2);
+	
+	void SetNodeVisible(GtpVisibility::HierarchyNode *node, const bool visible);
+	void SetLastVisited(GtpVisibility::HierarchyNode *node, const int frameId);
+
+	bool IsNodeVisible(GtpVisibility::HierarchyNode *node);
+	int LastVisited(GtpVisibility::HierarchyNode *node);
+
+protected:
+	/** Returns pointer to the bounding box of the node.
+		@param node current hierarchy node
+		@returns bounding box of current node
+	*/
+	AxisAlignedBox *GetBoundingBox(GtpVisibility::HierarchyNode *node);
+	/** Returns squared distance of center of box with respect to the camera .
+		@param cam current camera
+		@param box axis aligned box
+	*/
+	Real GetSquaredViewDepth(const Camera* cam, const AxisAlignedBox* box) const;
+	unsigned int mNumOctreeNodes;
+};
+} // namespace Ogre
+
+#endif // OctreeHierarchyInterface_H
Index: /tags/DummyModules/VUT/Ogre/include/OgreVisibilityOctreeSceneManager.h
===================================================================
--- /tags/DummyModules/VUT/Ogre/include/OgreVisibilityOctreeSceneManager.h	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/include/OgreVisibilityOctreeSceneManager.h	(revision 59)
@@ -0,0 +1,61 @@
+#ifndef _VisibilityOctreeSceneManager_H__
+#define _VisibilityOctreeSceneManager_H__
+
+#include <OgreSceneNode.h>
+#include <OgreOctreeSceneManager.h>
+#include <OgreOctreeNode.h>
+#include <OgreOctreeCamera.h>
+#include <OgrePrerequisites.h>
+
+#include "OgreOctreeHierarchyInterface.h"
+#include "VisibilityManager.h"
+
+namespace Ogre {
+
+/**
+	This class extends the octree scene manager, using 
+	occlusion queries for visibility culling.
+*/
+class VisibilityOctreeSceneManager: public OctreeSceneManager
+{
+public:
+	VisibilityOctreeSceneManager(GtpVisibility::VisibilityManager *visManager);
+	~VisibilityOctreeSceneManager();
+
+	void _renderVisibleObjects();
+	void _findVisibleObjects(Camera* cam, bool onlyShadowCasters);
+	void _updateSceneGraph(Camera* cam );
+
+	/** Sets the given option for the SceneManager
+			    @remarks
+		Options are:
+		"Algorithm", int *;			
+	*/
+	
+	virtual bool setOption(const String &, const void *);
+	/** Gets the given option for the Scene VisibilityManager.
+	    @remarks
+		See setOption
+	*/
+	virtual bool getOption(const String &, void *);
+
+	bool getOptionValues(const String & key, StringVector &refValueList);
+	bool getOptionKeys(StringVector &refKeys);
+
+	/** Sets the visibility manager.
+		@param visManager the visibility manager
+	*/
+	void setVisibilityManager(GtpVisibility::VisibilityManager *visManager);
+	/** See set.
+	*/
+	GtpVisibility::VisibilityManager *getVisibilityManager( void );
+
+protected:
+	
+	OctreeHierarchyInterface *mHierarchyInterface;
+	GtpVisibility::VisibilityManager *mVisibilityManager;
+};
+
+} // namespace Ogre
+
+#endif // VisibilityOctreeSceneManager_H
Index: /tags/DummyModules/VUT/Ogre/include/OgreSceneNodeHierarchyInterface.h
===================================================================
--- /tags/DummyModules/VUT/Ogre/include/OgreSceneNodeHierarchyInterface.h	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/include/OgreSceneNodeHierarchyInterface.h	(revision 59)
@@ -0,0 +1,44 @@
+#ifndef _SceneNodeHierarchyInterface_H__
+#define _SceneNodeHierarchyInterface_H__
+
+#include "OgrePlatformHierarchyInterface.h"
+
+namespace Ogre {
+
+/**
+	This class implements the hierarchy interface for the Ogre scene node hierarchy.
+*/
+class SceneNodeHierarchyInterface: public PlatformHierarchyInterface
+{
+public:
+	/** Construction taking the current scene manager and the current 
+		rendersystem as argument
+		@param sm current scene manager
+		@param rsys current render system 
+	*/
+	SceneNodeHierarchyInterface(SceneManager *sm, RenderSystem *rsys);
+	
+	bool IsLeaf(GtpVisibility::HierarchyNode *node);
+	
+	void TraverseNode(GtpVisibility::HierarchyNode *node);
+	void RenderNode(GtpVisibility::HierarchyNode *node);
+	void PullUpVisibility(GtpVisibility::HierarchyNode *node);
+	bool HasGeometry(GtpVisibility::HierarchyNode *node);
+	bool HasGreaterDistance(GtpVisibility::HierarchyNode *node1, 
+						    GtpVisibility::HierarchyNode *node2);
+
+	void SetNodeVisible(GtpVisibility::HierarchyNode *node, const bool visible);
+	void SetLastVisited(GtpVisibility::HierarchyNode *node, const int frameId);
+
+	bool IsNodeVisible(GtpVisibility::HierarchyNode *node);
+	int LastVisited(GtpVisibility::HierarchyNode *node);
+
+	AxisAlignedBox *GetBoundingBox(GtpVisibility::HierarchyNode *node);
+
+protected:
+	
+	
+};
+
+} // namespace Ogre
+#endif // SceneNodeHierarchyInterface_H
Index: /tags/DummyModules/VUT/Ogre/include/OgreBspHierarchyInterface.h
===================================================================
--- /tags/DummyModules/VUT/Ogre/include/OgreBspHierarchyInterface.h	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/include/OgreBspHierarchyInterface.h	(revision 59)
@@ -0,0 +1,54 @@
+#ifndef _BspHierarchyInterface_H__
+#define _BspHierarchyInterface_H__
+
+#include "OgrePlatformHierarchyInterface.h"
+
+namespace Ogre {
+/**
+	This class implements the hierarchy interface for the Ogre bsp hierarchy.
+*/
+class BspHierarchyInterface : public PlatformHierarchyInterface
+{
+public:
+	BspHierarchyInterface(SceneManager *sm, RenderSystem *rsys);
+
+	/** Gets the given option for the scene traverser.
+	    @remarks
+		See setOption
+	*/
+	//bool getOption( const String &, void * );
+	//bool getOptionKeys( StringVector &refKeys );
+	void PullUpVisibility(GtpVisibility::HierarchyNode *node);
+	/** Traverses given node.
+		@param node current node
+		@remark pushes children on distance queue
+	*/
+	void TraverseNode(GtpVisibility::HierarchyNode *node);
+	void RenderNode(GtpVisibility::HierarchyNode *node);
+	bool IsLeaf(GtpVisibility::HierarchyNode *node);
+	bool HasGeometry(GtpVisibility::HierarchyNode *node);
+	bool HasGreaterDistance(GtpVisibility::HierarchyNode *node1, 
+						    GtpVisibility::HierarchyNode *node2);
+	
+	void SetNodeVisible(GtpVisibility::HierarchyNode *node, const bool visible);
+	void SetLastVisited(GtpVisibility::HierarchyNode *node, const int frameId);
+
+	bool IsNodeVisible(GtpVisibility::HierarchyNode *node);
+	int LastVisited(GtpVisibility::HierarchyNode *node);
+
+protected:
+	/** Returns pointer to the bounding box of the node.
+		@param node current hierarchy node
+		@returns bounding box of current node
+	*/
+	AxisAlignedBox *GetBoundingBox(GtpVisibility::HierarchyNode *node);
+	/** Returns squared distance of center of box with respect to the camera .
+		@param cam current camera
+		@param box axis aligned box
+	*/
+	Real GetSquaredViewDepth(const Camera* cam, const AxisAlignedBox* box) const;
+	unsigned int mNumOctreeNodes;
+};
+} // namespace Ogre
+
+#endif // BspHierarchyInterface_H
Index: /tags/DummyModules/VUT/Ogre/include/OgrePlatformHierarchyInterface.h
===================================================================
--- /tags/DummyModules/VUT/Ogre/include/OgrePlatformHierarchyInterface.h	(revision 71)
+++ /tags/DummyModules/VUT/Ogre/include/OgrePlatformHierarchyInterface.h	(revision 71)
@@ -0,0 +1,99 @@
+#ifndef _PlatformHierarchyInterface_H__
+#define _PlatformHierarchyInterface_H__
+
+#include <OgreSceneManager.h>
+#include <OgrePrerequisites.h>
+#include <OgreCamera.h>
+#include <OgreRenderSystem.h>
+
+#include "OgreSolidHalfBoundingBox.h"
+#include "HierarchyInterface.h"
+#include "OgrePlatformOcclusionQuery.h"
+
+/** This namespace contains the Ogre dependent classes.
+*/
+namespace Ogre {
+
+/**	Class which implements a hierarchy interface for a specific type of hierarchy.
+	@remark also provides methods for using occlusion queries on the hierarchy nodes
+*/
+class PlatformHierarchyInterface: public GtpVisibility::HierarchyInterface
+{
+public:
+	/** Construction taking the current scene manager and the current rendersystem as argument
+		@param sm current scene manager
+		@param rsys current render system 
+	*/
+	PlatformHierarchyInterface(SceneManager *sm, RenderSystem *rsys);
+	~PlatformHierarchyInterface();
+		
+	/** Returns next available occlusion query or creates new one.
+		@return the next occlusion query
+	*/
+	GtpVisibility::OcclusionQuery *GetNextOcclusionQuery();
+		
+	/** Sets the current camera.
+		@param cam the current camera
+	*/
+	void SetCamera(Camera *cam);
+		
+	/** Initialises this scene traverser for the current frame.
+	@param root root of the hierarchy
+		@param cam current camera
+		@remark convenience method wich calls VisibilitySceneTraverser::initFrame,
+		sets the current camera, and initialises the distance queue.
+	*/
+	void InitFrame(GtpVisibility::HierarchyNode *root, Ogre::Camera *cam);
+	/** Checks if the node is visible from the current view frustum.
+		@param node the current node
+		@param intersects returns true if the current node intersects the near plane
+	*/
+	bool CheckFrustumVisible(GtpVisibility::HierarchyNode *node, bool &intersects);
+	/** Sets pointer to the current scene manager.
+		@param sm the scene manager 
+	*/
+	void SetSceneManager(SceneManager *sm);
+	/** Sets pointer to the current render system 
+		@param rsys the rendersystem 
+	*/
+	void SetRenderSystem(RenderSystem *rsys);
+	/** Returns pointer to bounding box of node.
+		@param node current hierarchy node
+		@returns bounding box of current node
+	*/
+	virtual AxisAlignedBox *GetBoundingBox(GtpVisibility::HierarchyNode *node) = 0;
+	/** Issue a occlusion query for this node. 
+		@param node the current hierarchy node
+		@returns occlusion query for this node
+	*/
+	GtpVisibility::OcclusionQuery *IssueOcclusionQuery(GtpVisibility::HierarchyNode *node);
+
+protected:
+	/** Deletes all occlusion queries.
+	*/
+	void DeleteQueries();
+	/** Renders bounding box of specified node.
+		@param box the bounding box of the scene node to be rendered 
+	*/
+	void RenderBoundingBox(AxisAlignedBox *box);
+	/** Returns one half of the bounding box.
+		@param half the half index of the bouding box (0 or 1)
+	*/
+	SolidHalfBoundingBox *GetSolidHalfBoundingBox(int half);
+
+	/** two halfes of an aabb. 
+	*/
+	SolidHalfBoundingBox *mHalfBoundingBox[2];	
+
+	SceneManager *mSceneManager;
+	RenderSystem *mRenderSystem;
+
+	Camera *mCamera;
+	AxisAlignedBox mBox;
+
+	std::vector<PlatformOcclusionQuery *> mOcclusionQueries;
+};
+
+} // namespace Ogre
+
+#endif // PlatformHierarchyInterface_H
Index: /tags/DummyModules/VUT/Ogre/include/OgreSolidHalfBoundingBox.h
===================================================================
--- /tags/DummyModules/VUT/Ogre/include/OgreSolidHalfBoundingBox.h	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/include/OgreSolidHalfBoundingBox.h	(revision 59)
@@ -0,0 +1,45 @@
+#ifndef _SolidHalfBoundingBox_H__
+#define _SolidHalfBoundingBox_H__
+
+#include "OgreWireBoundingBox.h"
+
+namespace Ogre {
+
+/** Allows the rendering of one half of a solid bounding box.
+    @remarks
+        This class builds a wireframe renderable from a given aabb. A pointer to this class can be
+		added to a render queue to display the bounding box of an object.
+*/
+class SolidHalfBoundingBox : public WireBoundingBox
+{
+public:
+
+	SolidHalfBoundingBox(bool isFirstHalf);
+	void setupBoundingBox(const AxisAlignedBox& aabb);
+	/** Override this method to prevent parent transforms (rotation,translation,scale)
+		and to make it public.
+    */
+	void getWorldTransforms(Matrix4* xform) const;
+
+protected:
+    
+    /** Builds the wireframe line list.
+		@param aab the axis aligned bounding box for setting up the list.
+    */
+	void setupBoundingBoxVertices(const AxisAlignedBox& aab);
+	/** 
+		Sets the material used for occlusion queries. 
+		@remark the material is called "OcclusionQuery" and
+		uses no lighting, no depth write, and no colours
+	*/
+	void setOcclusionQueryMaterial();
+	/** Whether this half box is the first or the second half of the bounding box. 
+	*/
+	bool mIsFirstHalf;	
+};
+
+}// namespace Ogre
+
+#endif // SolidHalfBoundingBox
+
+
Index: /tags/DummyModules/VUT/Ogre/include/OgreVisibilityBspSceneManager.h
===================================================================
--- /tags/DummyModules/VUT/Ogre/include/OgreVisibilityBspSceneManager.h	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/include/OgreVisibilityBspSceneManager.h	(revision 59)
@@ -0,0 +1,61 @@
+#ifndef _VisibilityBspSceneManager_H__
+#define _VisibilityBspSceneManager_H__
+
+#include <OgreSceneNode.h>
+#include <OgreBspSceneManager.h>
+#include <OgreOctreeNode.h>
+#include <OgreOctreeCamera.h>
+#include <OgrePrerequisites.h>
+
+#include "OgreBspHierarchyInterface.h"
+#include "GtpVisibility/Manager.h"
+
+namespace Ogre {
+
+/**
+	This class extends the octree scene manager, using 
+	occlusion queries for visibility culling.
+*/
+class VisibilityBspSceneManager: public BspSceneManager
+{
+public:
+	VisibilityBspSceneManager(GtpVisibility::Manager *visManager);
+	~VisibilityBspSceneManager();
+
+	void _renderVisibleObjects();
+	void _findVisibleObjects(Camera* cam, bool onlyShadowCasters);
+	void _updateSceneGraph(Camera* cam );
+
+	/** Sets the given option for the SceneManager
+			    @remarks
+		Options are:
+		"Algorithm", int *;			
+	*/
+	
+	virtual bool setOption(const String &, const void *);
+	/** Gets the given option for the Scene Manager.
+	    @remarks
+		See setOption
+	*/
+	virtual bool getOption(const String &, void *);
+
+	bool getOptionValues(const String & key, StringVector &refValueList);
+	bool getOptionKeys(StringVector &refKeys);
+
+	/** Sets the visibility manager.
+		@param visManager the visibility manager
+	*/
+	void setVisibilityManager(GtpVisibility::Manager *visManager);
+	/** See set.
+	*/
+	GtpVisibility::Manager *getVisibilityManager( void );
+
+protected:
+	
+	BspHierarchyInterface *mHierarchyInterface;
+	GtpVisibility::Manager *mVisibilityManager;
+};
+
+} // namespace Ogre
+
+#endif // VisibilityBspSceneManager_H
Index: /tags/DummyModules/VUT/Ogre/include/OgreVisibilityTerrainSceneManager.h
===================================================================
--- /tags/DummyModules/VUT/Ogre/include/OgreVisibilityTerrainSceneManager.h	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/include/OgreVisibilityTerrainSceneManager.h	(revision 59)
@@ -0,0 +1,64 @@
+#ifndef _VisibilityTerrainSceneManager_H__
+#define _VisibilityTerrainSceneManager_H__
+
+#include <OgreSceneNode.h>
+#include <OgreOctreeSceneManager.h>
+#include <OgreTerrainSceneManager.h>
+#include <OgreOctreeSceneQuery.h>
+#include <OgreOctreeNode.h>
+#include <OgreOctreeCamera.h>
+#include <OgrePrerequisites.h>
+
+#include "OgreOctreeHierarchyInterface.h"
+#include "VisibilityManager.h"
+
+namespace Ogre {
+
+/**
+	This class extends the terrain scene manager,
+	using occlusion queries for visibility culling.
+*/
+class VisibilityTerrainSceneManager: public TerrainSceneManager
+{
+public:
+	VisibilityTerrainSceneManager(GtpVisibility::VisibilityManager *visManager);
+	~VisibilityTerrainSceneManager();
+
+	void _renderVisibleObjects(void);
+	void _findVisibleObjects(Camera* cam, bool onlyShadowCasters);
+	void _updateSceneGraph(Camera* cam);
+
+	/** Sets the given option for the SceneManager
+			    @remarks
+		Options are:
+		"Algorithm", int *;			
+	*/
+	
+	virtual bool setOption( const String &, const void * );
+	/** Gets the given option for the Scene VisibilityManager.
+	    @remarks
+		See setOption
+	*/
+	virtual bool getOption( const String &, void * );
+
+	bool getOptionValues( const String & key, StringVector &refValueList );
+	bool getOptionKeys( StringVector &refKeys );
+
+	/** Sets the visibility manager.
+		@param visManager the visibility manager
+	*/
+	void setVisibilityManager(GtpVisibility::VisibilityManager *visManager);
+	/** See set.
+	*/
+	GtpVisibility::VisibilityManager *getVisibilityManager();
+	
+protected:
+
+	OctreeHierarchyInterface *mHierarchyInterface;
+	GtpVisibility::VisibilityManager *mVisibilityManager;
+};
+
+//}  // namespace GtpVisibility
+} // namespace Ogre
+
+#endif // CullingTerrainSceneManager_H
Index: /tags/DummyModules/VUT/Ogre/include/OgreVisibilityDotSceneManager.h
===================================================================
--- /tags/DummyModules/VUT/Ogre/include/OgreVisibilityDotSceneManager.h	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/include/OgreVisibilityDotSceneManager.h	(revision 59)
@@ -0,0 +1,58 @@
+#ifndef _VisibilityDotSceneManager_H__
+#define _VisibilityDotSceneManager_H__
+
+#include <OgreSceneNode.h>
+#include <DotSceneManager.h>
+#include <OgrePrerequisites.h>
+#include "VisibilityManager.h"
+#include "OgreSceneNodeHierarchyInterface.h"
+
+namespace Ogre {
+
+/**
+	This class extends the dot scene manager, using occlusion queries for 
+	visibility culling. 
+	@remark the scene manager can operate on Ogre scene descriptions in 
+	XML defined by the ".scene" format
+*/
+class VisibilityDotSceneManager: public DotSceneManager
+{
+public:
+	VisibilityDotSceneManager(GtpVisibility::VisibilityManager *visManager);
+	~VisibilityDotSceneManager();
+
+	void _renderVisibleObjects();
+	void _findVisibleObjects(Camera* cam, bool onlyShadowCasters);
+	void _updateSceneGraph(Camera* cam);
+
+	/** Sets the given option for the SceneManager
+		@remarks
+		Options are:
+		"Algorithm", int *;			
+	*/
+	virtual bool setOption(const String &, const void *);
+	/** Gets the given option for the Scene VisibilityManager.
+	    @remarks
+		See setOption
+	*/
+	virtual bool getOption(const String &, void *);
+
+	bool getOptionValues(const String & key, StringVector &refValueList);
+	bool getOptionKeys(StringVector &refKeys);
+
+	/** Sets the visibility manager.
+		@param visManager the visibility manager
+	*/
+	void setVisibilityManager(GtpVisibility::VisibilityManager *visManager);
+	/** See set.
+	*/
+	GtpVisibility::VisibilityManager *getVisibilityManager();
+
+protected:
+
+	Ogre::SceneNodeHierarchyInterface *mHierarchyInterface;
+	GtpVisibility::VisibilityManager *mVisibilityManager;
+};
+} // namespace Ogre
+
+#endif // VisibilityDotSceneManager_H
Index: /tags/DummyModules/VUT/Ogre/include/OgrePlatformOcclusionQuery.h
===================================================================
--- /tags/DummyModules/VUT/Ogre/include/OgrePlatformOcclusionQuery.h	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/include/OgrePlatformOcclusionQuery.h	(revision 59)
@@ -0,0 +1,32 @@
+#ifndef _PlatformOcclusionQuery_H__
+#define _PlatformOcclusionQuery_H__
+
+#include <OgreHardwareOcclusionQuery.h>
+#include <OgreRenderSystem.h>
+
+#include "OcclusionQuery.h"
+
+namespace Ogre {
+
+/** This class is an implementation for occlusion queries using Ogre.
+	@remark the class encapsulates Ogre occlusion query calls.
+*/
+class PlatformOcclusionQuery: public GtpVisibility::OcclusionQuery
+{
+public:
+	
+	PlatformOcclusionQuery(RenderSystem *rsys);
+
+	virtual ~PlatformOcclusionQuery();
+
+	virtual unsigned int GetQueryResult() const;
+	virtual bool ResultAvailable() const;
+	virtual void BeginQuery() const;
+	virtual void EndQuery() const;
+
+protected:
+	HardwareOcclusionQuery *mHardwareOcclusionQuery;
+};
+
+} // namespace Ogre
+#endif // PlatformOcclusionQuery_H
Index: /tags/DummyModules/VUT/Ogre/scripts/Plugin_VisibilitySceneManager.vcproj
===================================================================
--- /tags/DummyModules/VUT/Ogre/scripts/Plugin_VisibilitySceneManager.vcproj	(revision 64)
+++ /tags/DummyModules/VUT/Ogre/scripts/Plugin_VisibilitySceneManager.vcproj	(revision 64)
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="windows-1250"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="Plugin_VisibilitySceneManager"
+	ProjectGUID="{80DECC17-BDDD-4412-8CF8-F7C1C17A7436}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\bin\$(ConfigurationName)"
+			IntermediateDirectory="..\obj\$(ConfigurationName)"
+			ConfigurationType="2"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\include&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include\CEGUI&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\include&quot;;&quot;$(OGRE_PATH)\OgreMain\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include&quot;;..\include;..\..\GtpVisibility\include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS;GTP_VISIBILITY_MODIFIED_OGRE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				EnableFunctionLevelLinking="TRUE"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				IgnoreImportLibrary="TRUE"
+				AdditionalDependencies="OgreMain_d.lib CEGUIBase_d.lib OgreGUIRenderer_d.lib Plugin_OctreeSceneManager.lib Plugin_DotSceneManager.lib GtpVisibility.lib"
+				OutputFile="$(OutDir)/Plugin_VisibilitySceneManager.dll"
+				Version="0.99"
+				LinkIncremental="2"
+				SuppressStartupBanner="TRUE"
+				AdditionalLibraryDirectories="&quot;$(OGRE_PATH)\OgreMain\lib\$(ConfigurationName)&quot;;&quot;$(OGRE_PATH)\Dependencies\lib\$(ConfigurationName)&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\bin\$(ConfigurationName)&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\lib&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\bin\debug&quot;;..\lib\debug;..\..\lib\debug;..\..\GtpVisibility\lib\debug"
+				ModuleDefinitionFile="..\misc\OgreVisibilitySceneManager.def"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/Plugin_VisibilitySceneManager.pdb"
+				SubSystem="2"
+				ImportLibrary="$(OutDir)/Plugin_VisibilitySceneManager.lib"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"
+				CommandLine="copy $(OutDir)\$(TargetFileName) $(OGRE_PATH)\Samples\Common\bin\$(ConfigurationName)"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="..\bin\$(ConfigurationName)"
+			IntermediateDirectory="..\obj\$(ConfigurationName)"
+			ConfigurationType="2"
+			CharacterSet="2"
+			WholeProgramOptimization="TRUE">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="3"
+				GlobalOptimizations="TRUE"
+				InlineFunctionExpansion="2"
+				EnableIntrinsicFunctions="TRUE"
+				ImproveFloatingPointConsistency="TRUE"
+				FavorSizeOrSpeed="1"
+				OmitFramePointers="TRUE"
+				EnableFiberSafeOptimizations="TRUE"
+				OptimizeForProcessor="2"
+				AdditionalIncludeDirectories="..\include;$(OGRE_PATH)\OgreMain\include"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS"
+				StringPooling="TRUE"
+				RuntimeLibrary="2"
+				BufferSecurityCheck="FALSE"
+				EnableFunctionLevelLinking="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				IgnoreImportLibrary="TRUE"
+				AdditionalDependencies="OgreMain.lib"
+				OutputFile="$(OutDir)/Plugin_VisibilitySceneManager.dll"
+				Version="0.99"
+				LinkIncremental="1"
+				SuppressStartupBanner="TRUE"
+				AdditionalLibraryDirectories="&quot;$(OGRE_PATH)\OgreMain\lib\$(ConfigurationName)&quot;;&quot;..\..\..\Dependencies\lib\$(ConfigurationName)&quot;"
+				ModuleDefinitionFile="..\misc\OgreVisibilitySceneManager.def"
+				GenerateDebugInformation="TRUE"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				ImportLibrary="$(OutDir)/Plugin_VisibilitySceneManager.lib"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"
+				CommandLine="copy $(OutDir)\$(TargetFileName) $(OGRE_PATH)\Samples\Common\bin\$(ConfigurationName)"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="SceneManager_Plugins"
+			Filter="">
+			<Filter
+				Name="Header Files"
+				Filter="">
+				<File
+					RelativePath="..\include\OgreBspHierarchyInterface.h">
+				</File>
+				<File
+					RelativePath="..\include\OgreOctreeHierarchyInterface.h">
+				</File>
+				<File
+					RelativePath="..\include\OgreVisibilityDotSceneManager.h">
+				</File>
+				<File
+					RelativePath="..\include\OgreVisibilityOctreeSceneManager.h">
+				</File>
+				<File
+					RelativePath="..\include\OgreVisibilityTerrainSceneManager.h">
+				</File>
+			</Filter>
+			<Filter
+				Name="Source Files"
+				Filter="">
+				<File
+					RelativePath="..\src\OgreBspHierarchyInterface.cpp">
+				</File>
+				<File
+					RelativePath="..\src\OgreOctreeHierarchyInterface.cpp">
+				</File>
+				<File
+					RelativePath="..\src\OgreVisibilityDotSceneManager.cpp">
+				</File>
+				<File
+					RelativePath="..\src\OgreVisibilityOctreeSceneManager.cpp">
+				</File>
+				<File
+					RelativePath="..\src\OgreVisibilityTerrainSceneManager.cpp">
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="VisibilitySceneManager"
+			Filter="">
+			<Filter
+				Name="Header Files"
+				Filter="h;hpp;hxx;hm;inl;inc">
+				<File
+					RelativePath="..\include\OgrePlatformHierarchyInterface.h">
+				</File>
+				<File
+					RelativePath="..\include\OgrePlatformOcclusionQuery.h">
+				</File>
+				<File
+					RelativePath="..\include\OgreSceneNodeHierarchyInterface.h">
+				</File>
+				<File
+					RelativePath="..\include\OgreSolidHalfBoundingBox.h">
+				</File>
+				<File
+					RelativePath="..\include\OgreVisibilitySceneManager.h">
+				</File>
+			</Filter>
+			<Filter
+				Name="Source Files"
+				Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
+				<File
+					RelativePath="..\src\OgrePlatformHierarchyInterface.cpp">
+				</File>
+				<File
+					RelativePath="..\src\OgrePlatformOcclusionQuery.cpp">
+				</File>
+				<File
+					RelativePath="..\src\OgreSceneNodeHierarchyInterface.cpp">
+				</File>
+				<File
+					RelativePath="..\src\OgreSolidHalfBoundingBox.cpp">
+				</File>
+				<File
+					RelativePath="..\src\OgreVisibilitySceneManager.cpp">
+				</File>
+			</Filter>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: /tags/DummyModules/VUT/Ogre/scripts/Plugin_VisibilitySceneManager.dsp
===================================================================
--- /tags/DummyModules/VUT/Ogre/scripts/Plugin_VisibilitySceneManager.dsp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/scripts/Plugin_VisibilitySceneManager.dsp	(revision 59)
@@ -0,0 +1,137 @@
+# Microsoft Developer Studio Project File - Name="Plugin_OcclusionCullingSceneManager" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=Plugin_OcclusionCullingSceneManager - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "Plugin_OcclusionCullingSceneManager.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "Plugin_OcclusionCullingSceneManager.mak" CFG="Plugin_OcclusionCullingSceneManager - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "Plugin_OcclusionCullingSceneManager - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "Plugin_OcclusionCullingSceneManager - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "Plugin_OcclusionCullingSceneManager - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\bin\Release"
+# PROP Intermediate_Dir "..\obj\Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\include" /I "$(OGRE_PATH)\OgreMain\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x418 /d "NDEBUG"
+# ADD RSC /l 0x418 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OgreMain.lib /nologo /dll /machine:I386 /libpath:"$(OGRE_PATH)\OgreMain\lib\Release"
+# SUBTRACT LINK32 /pdb:none
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy ..\bin\Release\*.dll $(OGRE_PATH)\Samples\Common\bin\Release
+# End Special Build Tool
+
+!ELSEIF  "$(CFG)" == "Plugin_OcclusionCullingSceneManager - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "..\bin\Debug"
+# PROP Intermediate_Dir "..\obj\Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\include" /I "$(OGRE_PATH)\OgreMain\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS" /YX /FD /GZ /Zm200 /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x418 /d "_DEBUG"
+# ADD RSC /l 0x418 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OgreMain_d.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"$(OGRE_PATH)\OgreMain\lib\Debug"
+# SUBTRACT LINK32 /pdb:none
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy ..\bin\Debug\*.dll $(OGRE_PATH)\Samples\Common\bin\Debug
+# End Special Build Tool
+
+!ENDIF 
+
+# Begin Target
+
+# Name "Plugin_OcclusionCullingSceneManager - Win32 Release"
+# Name "Plugin_OcclusionCullingSceneManager - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\src\OgreOcclusionCullingResourceManager.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\OgreOcclusionCullingSceneManager.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\misc\OgreOcclusionCullingSceneManager.def
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\OgreOcclusionCullingSceneManagerDll.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\include\OgreOcclusionCullingResourceManager.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\OgreOcclusionCullingSceneManager.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
Index: /tags/DummyModules/VUT/Ogre/src/OgreOctreeHierarchyInterface.cpp
===================================================================
--- /tags/DummyModules/VUT/Ogre/src/OgreOctreeHierarchyInterface.cpp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/src/OgreOctreeHierarchyInterface.cpp	(revision 59)
@@ -0,0 +1,145 @@
+#include "OgreOctreeHierarchyInterface.h"
+#include "OgreVisibilityOctreeSceneManager.h"
+#include <OgreOctree.h>
+//#include <windows.h>
+
+namespace Ogre {
+//namespace GtpVisibility {
+//-----------------------------------------------------------------------
+OctreeHierarchyInterface::OctreeHierarchyInterface(SceneManager *sm, RenderSystem *rsys): 
+PlatformHierarchyInterface(sm, rsys)
+{
+}
+//-----------------------------------------------------------------------
+void OctreeHierarchyInterface::TraverseNode(GtpVisibility::HierarchyNode *node)
+{
+	mNumTraversedNodes ++;
+
+	// if we come across some renderable geometry => render it
+	RenderNode(node);
+	
+	for(int i=0; i<8; i++)
+	{
+		Octree *nextChild = 
+			static_cast<Octree *>(node)->mChildren[(i & 4) >> 2][(i & 2) >> 1][i & 1];
+
+		if(nextChild)
+		{
+			mDistanceQueue->push(nextChild);
+		}
+	}
+}
+//-----------------------------------------------------------------------
+bool OctreeHierarchyInterface::IsLeaf(GtpVisibility::HierarchyNode *node)
+{
+	Octree *octant = static_cast<Octree *>(node);
+
+	for(int i=0; i<8; i++)
+	{
+		if(octant->mChildren[(i & 4) >> 2][(i & 2) >> 1][i & 1])
+			return false;
+	}
+
+	return true;
+}
+//-----------------------------------------------------------------------
+bool OctreeHierarchyInterface::HasGeometry(GtpVisibility::HierarchyNode *node)
+{
+	return static_cast<Octree *>(node)->numNodes() > 0;
+}
+//-----------------------------------------------------------------------
+void OctreeHierarchyInterface::SetNumOctreeNodes(unsigned int num)
+{
+	mNumOctreeNodes = num;
+}
+//-----------------------------------------------------------------------
+bool OctreeHierarchyInterface::HasGreaterDistance(GtpVisibility::HierarchyNode *node1, 
+												  GtpVisibility::HierarchyNode *node2)
+{
+	// matt: change this (inefficient)
+	AxisAlignedBox box1, box2;
+
+	static_cast<Octree *>(node1)->_getCullBounds(&box1);
+	static_cast<Octree *>(node2)->_getCullBounds(&box2);
+
+	return GetSquaredViewDepth(mCamera, &box1) > GetSquaredViewDepth(mCamera, &box2);
+}
+//-----------------------------------------------------------------------
+Real OctreeHierarchyInterface::GetSquaredViewDepth(const Camera* cam, const AxisAlignedBox* box) const
+{
+	Vector3 mid  = ((box->getMinimum() - box->getMaximum()) * 0.5) + box->getMinimum();
+	return (cam->getDerivedPosition() - mid).squaredLength();                                                                   
+}
+//-----------------------------------------------------------------------
+void OctreeHierarchyInterface::SetNodeVisible(GtpVisibility::HierarchyNode *node, const bool visible)
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	static_cast<Octree *>(node)->setOctreeVisible(visible);
+#endif
+}
+//-----------------------------------------------------------------------
+void OctreeHierarchyInterface::SetLastVisited(GtpVisibility::HierarchyNode *node, const int frameId)
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	static_cast<Octree *>(node)->setLastVisited(frameId);
+#endif
+}
+//-----------------------------------------------------------------------
+void OctreeHierarchyInterface::PullUpVisibility(GtpVisibility::HierarchyNode *node)
+{		
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	Octree *octant = static_cast<Octree *>(node);
+
+	while(octant && !octant->isOctreeVisible())
+	{
+		octant->setOctreeVisible(true);
+		octant = octant->getParent();
+	}
+#endif
+}
+//-----------------------------------------------------------------------
+void OctreeHierarchyInterface::RenderNode(GtpVisibility::HierarchyNode *node)
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	Octree *octant = static_cast<Octree *>(node);
+
+	if (octant->lastRendered() != mFrameId)
+	{
+		octant->setLastRendered(mFrameId);
+
+		if (!HasGeometry(octant)) return;
+
+		static_cast<OctreeSceneManager *>(mSceneManager)->_renderOctant(mCamera, octant);
+
+		mNumRenderedNodes ++;
+	}
+#endif
+}
+//-----------------------------------------------------------------------
+bool OctreeHierarchyInterface::IsNodeVisible(GtpVisibility::HierarchyNode *node)
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	return static_cast<Octree *>(node)->isOctreeVisible();
+#else
+	return true;
+#endif
+}
+//-----------------------------------------------------------------------
+int OctreeHierarchyInterface::LastVisited(GtpVisibility::HierarchyNode *node)
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	return static_cast<Octree *>(node)->lastVisited();
+#else
+	return 0;
+#endif
+}
+//-----------------------------------------------------------------------
+AxisAlignedBox *OctreeHierarchyInterface::GetBoundingBox(GtpVisibility::HierarchyNode *node)
+{
+	static_cast<Octree *>(node)->_getCullBounds(&mBox);
+
+	return &mBox;
+}
+
+//} // namespace GtpVisibility
+} // namespace Ogre
Index: /tags/DummyModules/VUT/Ogre/src/OgreVisibilityOctreeSceneManager.cpp
===================================================================
--- /tags/DummyModules/VUT/Ogre/src/OgreVisibilityOctreeSceneManager.cpp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/src/OgreVisibilityOctreeSceneManager.cpp	(revision 59)
@@ -0,0 +1,108 @@
+#include "OgreVisibilityOctreeSceneManager.h"
+#include <OgreMath.h>
+#include <OgreIteratorWrappers.h>
+#include <OgreRenderSystem.h>
+#include <OgreCamera.h>
+
+#include <windows.h>
+
+namespace Ogre {
+
+//-----------------------------------------------------------------------
+VisibilityOctreeSceneManager::VisibilityOctreeSceneManager(
+	GtpVisibility::VisibilityManager *visManager): mVisibilityManager(visManager)
+{
+	mHierarchyInterface = 
+		new OctreeHierarchyInterface(this, mDestRenderSystem);
+
+	//mDisplayNodes = true;
+	//mShowBoundingBoxes = true;
+	//mShowBoxes = true;
+	//mMaxDepth = 20;
+}
+//-----------------------------------------------------------------------
+VisibilityOctreeSceneManager::~VisibilityOctreeSceneManager()
+{
+	delete mHierarchyInterface;
+}
+//-----------------------------------------------------------------------
+void VisibilityOctreeSceneManager::_renderVisibleObjects()
+{
+	//-- render background
+	clearSpecialCaseRenderQueues();
+	addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND);
+	addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY);
+
+	setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE);
+	SceneManager::_renderVisibleObjects( );
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	_deleteRenderedQueueGroups();
+#endif
+
+	//-- render visible objects (i.e., all but overlay)
+	clearSpecialCaseRenderQueues();
+	addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY);
+	setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE);
+
+	mHierarchyInterface->InitFrame(mSceneRoot, mCameraInProgress);
+	mVisibilityManager->ApplyVisibilityCulling();
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	_deleteRenderedQueueGroups();
+#endif
+
+	//-- render rest, e.g., overlay
+	clearSpecialCaseRenderQueues();
+	SceneManager::_renderVisibleObjects();
+	//_deleteRenderedQueueGroups();
+}
+//-----------------------------------------------------------------------
+void VisibilityOctreeSceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters)
+{
+	// must be empty because objects are found and rendered in an interleaved fashion
+	// in _renderVisibibleObjects 
+}
+//-----------------------------------------------------------------------
+void VisibilityOctreeSceneManager::_updateSceneGraph(Camera* cam)
+{
+	//mOcclusionOctreeHierarchyInterface->setNumSceneNodes((int)mSceneNodes.size());
+	mVisibilityManager->GetCullingManager()->SetHierarchyInterface(mHierarchyInterface);
+	mHierarchyInterface->SetRenderSystem(mDestRenderSystem);
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+    mHierarchyInterface->SetNumOctreeNodes(mNumOctreeNodes);
+#endif
+	OctreeSceneManager::_updateSceneGraph(cam);
+}
+//-----------------------------------------------------------------------
+bool VisibilityOctreeSceneManager::setOption(const String & key, const void * val)
+{
+	return /*mVisibilitySceneTraverser->setOption( key, val) || */OctreeSceneManager::setOption( key, val );
+}
+//-----------------------------------------------------------------------
+bool VisibilityOctreeSceneManager::getOption(const String & key, void *val)
+{
+	return /*mVisibilitySceneTraverser->getOption( key, val) || */OctreeSceneManager::getOption(key, val);
+}
+//-----------------------------------------------------------------------
+bool VisibilityOctreeSceneManager::getOptionValues(const String & key, StringVector  &refValueList)
+{
+	return OctreeSceneManager::getOptionValues( key, refValueList );
+}
+//-----------------------------------------------------------------------
+bool VisibilityOctreeSceneManager::getOptionKeys(StringVector & refKeys)
+{
+	return /*mVisibilitySceneTraverser->getOptionKeys ( refKeys ) || */OctreeSceneManager::getOptionKeys(refKeys);
+}
+//-----------------------------------------------------------------------
+void VisibilityOctreeSceneManager::setVisibilityManager(GtpVisibility::VisibilityManager *visManager)
+{
+    mVisibilityManager = visManager;
+}
+//-----------------------------------------------------------------------
+GtpVisibility::VisibilityManager *VisibilityOctreeSceneManager::getVisibilityManager()
+{
+	return mVisibilityManager;
+}
+
+}   // namespace Ogre
Index: /tags/DummyModules/VUT/Ogre/src/OgreSceneNodeHierarchyInterface.cpp
===================================================================
--- /tags/DummyModules/VUT/Ogre/src/OgreSceneNodeHierarchyInterface.cpp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/src/OgreSceneNodeHierarchyInterface.cpp	(revision 59)
@@ -0,0 +1,127 @@
+#include "OgreSceneNodeHierarchyInterface.h"
+#include <OgreIteratorWrappers.h>
+#include <OgreCamera.h>
+#include <OgreSceneNode.h>
+
+//#include <windows.h>
+
+namespace Ogre {
+
+//-----------------------------------------------------------------------
+SceneNodeHierarchyInterface::SceneNodeHierarchyInterface(SceneManager *sm, RenderSystem *rsys): 
+PlatformHierarchyInterface(sm, rsys)
+{		
+}
+//-----------------------------------------------------------------------
+void SceneNodeHierarchyInterface::TraverseNode(GtpVisibility::HierarchyNode *node)
+{
+	mNumTraversedNodes ++;
+	
+	SceneNode *sceneNode = static_cast<SceneNode *>(node);
+
+	if (HasGeometry(node))
+	{
+		RenderNode(node);
+	}
+
+	// internal node: add children to priority queue for further processing
+	Node::ChildNodeIterator it = sceneNode->getChildIterator();
+				
+	while (it.hasMoreElements())			
+	{ 
+		mDistanceQueue->push(it.getNext());
+	}
+}
+//-----------------------------------------------------------------------
+void SceneNodeHierarchyInterface::RenderNode(GtpVisibility::HierarchyNode *node)
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	SceneNode *sceneNode = static_cast<SceneNode *>(node);
+
+	if (sceneNode->lastRendered() != sceneNode->lastVisited())
+	{
+		sceneNode->setLastRendered(sceneNode->lastVisited());
+		mNumRenderedNodes ++;
+
+		mSceneManager->_renderSceneNode(mCamera, sceneNode);
+	}
+#endif
+}
+//-----------------------------------------------------------------------
+bool SceneNodeHierarchyInterface::IsLeaf(GtpVisibility::HierarchyNode *node)
+{
+	return (static_cast<SceneNode *>(node)->numChildren() == 0);
+}
+//-----------------------------------------------------------------------
+bool SceneNodeHierarchyInterface::HasGeometry(GtpVisibility::HierarchyNode *node)
+{
+	SceneNode *sceneNode = static_cast<SceneNode *>(node);
+	
+	return sceneNode->numAttachedObjects() > 0;
+}
+//-----------------------------------------------------------------------
+void SceneNodeHierarchyInterface::PullUpVisibility(GtpVisibility::HierarchyNode *node)
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	SceneNode *sceneNode = static_cast<SceneNode *>(node);
+
+	while(sceneNode && !sceneNode->isNodeVisible())
+	{
+		sceneNode->setNodeVisible(true);
+		sceneNode = sceneNode->getParentSceneNode();
+	}
+#endif
+}
+//-----------------------------------------------------------------------
+bool SceneNodeHierarchyInterface::HasGreaterDistance(GtpVisibility::HierarchyNode *node1, 
+													 GtpVisibility::HierarchyNode *node2)
+{
+	SceneNode *sceneNode1 = static_cast<SceneNode *>(node1);
+	SceneNode *sceneNode2 = static_cast<SceneNode *>(node2);
+
+	return sceneNode1->getSquaredViewDepth(mCamera) > sceneNode2->getSquaredViewDepth(mCamera);
+}
+//-----------------------------------------------------------------------
+void SceneNodeHierarchyInterface::SetNodeVisible(GtpVisibility::HierarchyNode *node, 
+												 const bool visible)
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	SceneNode *sceneNode = static_cast<SceneNode *>(node);
+	sceneNode->setNodeVisible(visible);
+#endif
+}
+//-----------------------------------------------------------------------
+void SceneNodeHierarchyInterface::SetLastVisited(GtpVisibility::HierarchyNode *node, const int frameId)
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	SceneNode *sceneNode = static_cast<SceneNode *>(node);
+	sceneNode->setLastVisited(frameId);
+#endif
+}
+//-----------------------------------------------------------------------
+bool SceneNodeHierarchyInterface::IsNodeVisible(GtpVisibility::HierarchyNode *node)
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	SceneNode *sceneNode = static_cast<SceneNode *>(node);
+	return sceneNode->isNodeVisible();
+#else
+	return true;
+#endif
+}
+//-----------------------------------------------------------------------
+int SceneNodeHierarchyInterface::LastVisited(GtpVisibility::HierarchyNode *node)
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	SceneNode *sceneNode = static_cast<SceneNode *>(node);
+	return sceneNode->lastVisited();
+#else
+	return 0;
+#endif
+}
+//-----------------------------------------------------------------------
+AxisAlignedBox *SceneNodeHierarchyInterface::GetBoundingBox(GtpVisibility::HierarchyNode *node)
+{
+	SceneNode *sceneNode = static_cast<SceneNode *>(node);
+	return &mBox;
+}
+} // namespace Ogre	
Index: /tags/DummyModules/VUT/Ogre/src/OgreBspHierarchyInterface.cpp
===================================================================
--- /tags/DummyModules/VUT/Ogre/src/OgreBspHierarchyInterface.cpp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/src/OgreBspHierarchyInterface.cpp	(revision 59)
@@ -0,0 +1,70 @@
+#include "OgreBspHierarchyInterface.h"
+#include "OgreVisibilityOctreeSceneManager.h"
+
+//#include <windows.h>
+
+namespace Ogre {
+
+//-----------------------------------------------------------------------
+BspHierarchyInterface::BspHierarchyInterface(SceneManager *sm, RenderSystem *rsys): 
+PlatformHierarchyInterface(sm, rsys)
+{
+}
+//-----------------------------------------------------------------------
+void BspHierarchyInterface::TraverseNode(GtpVisibility::HierarchyNode *node)
+{
+}
+//-----------------------------------------------------------------------
+bool BspHierarchyInterface::IsLeaf(GtpVisibility::HierarchyNode *node)
+{
+	return true;
+}
+//-----------------------------------------------------------------------
+bool BspHierarchyInterface::HasGeometry(GtpVisibility::HierarchyNode *node)
+{
+	return true;
+}
+//-----------------------------------------------------------------------
+bool BspHierarchyInterface::HasGreaterDistance(GtpVisibility::HierarchyNode *node1, 
+											   GtpVisibility::HierarchyNode *node2)
+{
+	return true;
+}
+//-----------------------------------------------------------------------
+Real BspHierarchyInterface::GetSquaredViewDepth(const Camera* cam, const AxisAlignedBox* box) const
+{                                                            
+	return 0.0f;
+}
+//-----------------------------------------------------------------------
+void BspHierarchyInterface::SetNodeVisible(GtpVisibility::HierarchyNode *node, const bool visible)
+{
+}
+//-----------------------------------------------------------------------
+void BspHierarchyInterface::SetLastVisited(GtpVisibility::HierarchyNode *node, const int frameId)
+{
+}
+//-----------------------------------------------------------------------
+void BspHierarchyInterface::PullUpVisibility(GtpVisibility::HierarchyNode *node)
+{		
+}
+//-----------------------------------------------------------------------
+void BspHierarchyInterface::RenderNode(GtpVisibility::HierarchyNode *node)
+{
+}
+//-----------------------------------------------------------------------
+bool BspHierarchyInterface::IsNodeVisible(GtpVisibility::HierarchyNode *node)
+{
+	return true;
+}
+//-----------------------------------------------------------------------
+int BspHierarchyInterface::LastVisited(GtpVisibility::HierarchyNode *node)
+{
+	return 0;
+}
+//-----------------------------------------------------------------------
+AxisAlignedBox *BspHierarchyInterface::GetBoundingBox(GtpVisibility::HierarchyNode *node)
+{
+	return NULL;
+}
+
+} // namespace Ogre
Index: /tags/DummyModules/VUT/Ogre/src/OgrePlatformHierarchyInterface.cpp
===================================================================
--- /tags/DummyModules/VUT/Ogre/src/OgrePlatformHierarchyInterface.cpp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/src/OgrePlatformHierarchyInterface.cpp	(revision 59)
@@ -0,0 +1,129 @@
+//#include <OgreMath.h>
+//#include <OgreIteratorWrappers.h>
+#include <OgreCamera.h>
+
+#include "OgreSolidHalfBoundingBox.h"
+#include "OgrePlatformHierarchyInterface.h"
+#include "OgrePlatformOcclusionQuery.h"
+
+namespace Ogre {
+
+//-----------------------------------------------------------------------
+PlatformHierarchyInterface::PlatformHierarchyInterface(SceneManager *sm, RenderSystem *rsys)
+{		
+	mHalfBoundingBox[0] = mHalfBoundingBox[1] = NULL;
+}
+//-----------------------------------------------------------------------
+PlatformHierarchyInterface::~PlatformHierarchyInterface()
+{
+	DeleteQueries();
+	
+	if (mHalfBoundingBox[0]) 
+		delete mHalfBoundingBox[0];
+
+	if (mHalfBoundingBox[1]) 
+		delete mHalfBoundingBox[1];
+}
+//-----------------------------------------------------------------------
+void PlatformHierarchyInterface::DeleteQueries()
+{
+	for(unsigned int i=0; i < (unsigned int)mOcclusionQueries.size(); ++i)
+		delete mOcclusionQueries[i];
+
+	mOcclusionQueries.clear();
+}
+//-----------------------------------------------------------------------
+void PlatformHierarchyInterface::RenderBoundingBox(AxisAlignedBox *box)
+{
+	// Render two halfes of the bounding box (using triangle fans)
+	for(int half = 0; half < 2; half ++)
+	{
+		static Matrix4 xform[256];
+		//TODO: this should be full bounding box
+		SolidHalfBoundingBox *halfbox = GetSolidHalfBoundingBox(half);
+		halfbox->setupBoundingBox(*box);
+		
+		mRenderSystem->_setWorldMatrix(Ogre::Matrix4::IDENTITY);
+
+		static RenderOperation ro;
+
+		mSceneManager->useRenderableViewProjMode(halfbox);
+		halfbox->getRenderOperation(ro);
+		ro.srcRenderable = halfbox; 
+		mRenderSystem->_render(ro);
+		
+		// matt: change this
+//		mSceneManager->myrenderSingleObject(getSolidHalfBoundingBox(half), 
+//			getSolidHalfBoundingBox(half)->getTechnique()->getPass(0), true);
+	}
+}
+//-----------------------------------------------------------------------
+SolidHalfBoundingBox *PlatformHierarchyInterface::GetSolidHalfBoundingBox(int half)
+{
+	if(!mHalfBoundingBox[half])
+		mHalfBoundingBox[half] = new Ogre::SolidHalfBoundingBox(half == 1);
+
+	return mHalfBoundingBox[half];	
+}
+//-----------------------------------------------------------------------
+/*void OcclusionHierarchyInterface::setNumHierarchyNodes(int num)
+{
+	mNumSceneNodes = num;
+}*/
+//-----------------------------------------------------------------------
+void PlatformHierarchyInterface::SetCamera(Ogre::Camera *cam)
+{
+	mCamera = cam;
+}
+//-----------------------------------------------------------------------
+GtpVisibility::OcclusionQuery *PlatformHierarchyInterface::GetNextOcclusionQuery()
+{
+	if(mCurrentTestIdx == mOcclusionQueries.size())
+	{
+		mOcclusionQueries.push_back(new PlatformOcclusionQuery(mRenderSystem));
+	}
+	
+	return mOcclusionQueries[mCurrentTestIdx ++];
+}
+//-----------------------------------------------------------------------
+void PlatformHierarchyInterface::InitFrame(GtpVisibility::HierarchyNode *root, Camera *cam)
+{
+	GtpVisibility::HierarchyInterface::InitFrame(root);
+	SetCamera(cam);
+}
+//-----------------------------------------------------------------------
+void PlatformHierarchyInterface::SetSceneManager(SceneManager *sm)
+{
+	mSceneManager = sm;
+}
+//-----------------------------------------------------------------------
+void PlatformHierarchyInterface::SetRenderSystem(RenderSystem *rsys)
+{
+	mRenderSystem = rsys;
+}
+//-----------------------------------------------------------------------
+bool PlatformHierarchyInterface::CheckFrustumVisible(GtpVisibility::HierarchyNode *node, bool &intersects)
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	return mCamera->isVisible(*GetBoundingBox(node), intersects);
+#else
+	return true;
+#endif
+}
+//-----------------------------------------------------------------------
+GtpVisibility::OcclusionQuery *PlatformHierarchyInterface::IssueOcclusionQuery(GtpVisibility::HierarchyNode *node) 
+{
+	// get next available test id
+	GtpVisibility::OcclusionQuery *query = GetNextOcclusionQuery();
+
+	//-- the actual query test
+	query->BeginQuery();
+			
+	RenderBoundingBox(GetBoundingBox(node));
+
+	query->EndQuery();
+	
+	return query;
+}
+
+} // namespace Ogre
Index: /tags/DummyModules/VUT/Ogre/src/OgreSolidHalfBoundingBox.cpp
===================================================================
--- /tags/DummyModules/VUT/Ogre/src/OgreSolidHalfBoundingBox.cpp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/src/OgreSolidHalfBoundingBox.cpp	(revision 59)
@@ -0,0 +1,120 @@
+#include "OgreStableHeaders.h"
+#include "OgreSolidHalfBoundingBox.h"
+
+#include "OgreSimpleRenderable.h"
+#include "OgreHardwareBufferManager.h"
+#include "OgreCamera.h"
+#include "OgreMaterialManager.h"
+//#include <windows.h>
+
+namespace Ogre {
+
+#define POSITION_BINDING 0
+//-----------------------------------------------------------------------
+SolidHalfBoundingBox::SolidHalfBoundingBox(bool isFirstHalf)
+	:WireBoundingBox(), mIsFirstHalf(isFirstHalf)
+{
+	setOcclusionQueryMaterial();
+	
+	mRenderOp.vertexData->vertexCount = 8;
+    mRenderOp.operationType = RenderOperation::OT_TRIANGLE_FAN; 
+}
+//-----------------------------------------------------------------------
+void SolidHalfBoundingBox::setupBoundingBoxVertices(const AxisAlignedBox& aab) {
+
+	Vector3 vmax = aab.getMaximum();
+	Vector3 vmin = aab.getMinimum();
+	
+	
+	Real sqLen = std::max(vmax.squaredLength(), vmin.squaredLength());
+    mRadius = Math::Sqrt(sqLen);
+	
+	Real maxx = vmax.x;
+	Real maxy = vmax.y;
+	Real maxz = vmax.z;
+	
+	Real minx = vmin.x;
+	Real miny = vmin.y;
+	Real minz = vmin.z;
+	
+	// fill in the Vertex buffer: 12 lines with 2 endpoints each make up a box
+    HardwareVertexBufferSharedPtr vbuf =
+        mRenderOp.vertexData->vertexBufferBinding->getBuffer(POSITION_BINDING);     
+
+    float* pPos = static_cast<float*>(
+        vbuf->lock(HardwareBuffer::HBL_DISCARD));
+
+	//     5+------+7
+	//     /|     /|
+	//    / |    / |
+	//   / 1+---/--+3
+	// 2+------+6 /    y   z
+	//  | /    | /     |  /
+	//  |/     |/      |/
+	// 0+------+4      *---x
+
+	// fan 1
+	if(mIsFirstHalf)
+	{
+		*pPos++ = minx; *pPos++ = maxy; *pPos++ = maxz; //011
+		*pPos++ = minx; *pPos++ = miny; *pPos++ = maxz; //001
+		*pPos++ = maxx; *pPos++ = miny; *pPos++ = maxz; //101
+		*pPos++ = maxx; *pPos++ = maxy; *pPos++ = maxz; //111
+		
+		*pPos++ = maxx; *pPos++ = maxy; *pPos++ = minz; //110
+		*pPos++ = minx; *pPos++ = maxy; *pPos++ = minz; //010
+		*pPos++ = minx; *pPos++ = miny; *pPos++ = minz; //000
+		*pPos++ = minx; *pPos++ = miny; *pPos++ = maxz; //001
+
+	}
+	else
+	// fan 2
+	{
+		*pPos++ = maxx; *pPos++ = miny; *pPos++ = minz; //100
+		*pPos++ = minx; *pPos++ = miny; *pPos++ = minz; //000 					
+		*pPos++ = minx; *pPos++ = maxy; *pPos++ = minz; //010
+		*pPos++ = maxx; *pPos++ = maxy; *pPos++ = minz; //110
+
+		*pPos++ = maxx; *pPos++ = maxy; *pPos++ = maxz; //111
+		*pPos++ = maxx; *pPos++ = miny; *pPos++ = maxz; //101
+		*pPos++ = minx; *pPos++ = miny; *pPos++ = maxz; //001
+		*pPos++ = minx; *pPos++ = miny; *pPos++ = minz; //000
+	}
+
+    vbuf->unlock();
+}
+
+void SolidHalfBoundingBox::setupBoundingBox(const AxisAlignedBox& aabb) 
+{
+	// init the vertices to the aabb
+	SolidHalfBoundingBox::setupBoundingBoxVertices(aabb);
+
+    // setup the bounding box of this SimpleRenderable
+	setBoundingBox(aabb);
+}
+// Override this method to prevent parent transforms (rotation,translation,scale)
+void SolidHalfBoundingBox::getWorldTransforms( Matrix4* xform ) const
+{
+	// return identity matrix to prevent parent transforms
+    *xform = Matrix4::IDENTITY;
+}
+
+void SolidHalfBoundingBox::setOcclusionQueryMaterial( void )
+{
+	m_pMaterial = MaterialManager::getSingleton().getByName("OcclusionQuery");
+
+	if(m_pMaterial.isNull())
+	{
+		m_pMaterial = MaterialManager::getSingleton().
+			create("OcclusionQuery", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+	}
+
+	m_pMaterial->setColourWriteEnabled(false);
+	m_pMaterial->setDepthWriteEnabled(false);
+	m_pMaterial->setLightingEnabled(false);
+
+	setMaterial("OcclusionQuery");
+}
+
+} // namespace Ogre
+
Index: /tags/DummyModules/VUT/Ogre/src/OgreVisibilityBspSceneManager.cpp
===================================================================
--- /tags/DummyModules/VUT/Ogre/src/OgreVisibilityBspSceneManager.cpp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/src/OgreVisibilityBspSceneManager.cpp	(revision 59)
@@ -0,0 +1,108 @@
+#include "OgreVisibilityBspSceneManager.h"
+#include <OgreMath.h>
+#include <OgreIteratorWrappers.h>
+#include <OgreRenderSystem.h>
+#include <OgreCamera.h>
+
+#include <windows.h>
+
+namespace Ogre {
+
+//-----------------------------------------------------------------------
+VisibilityBspSceneManager::VisibilityBspSceneManager(
+	GtpVisibility::Manager *visManager): mVisibilityManager(visManager)
+{
+	mHierarchyInterface = 
+		new BspHierarchyInterface(this, mDestRenderSystem);
+
+	//mDisplayNodes = true;
+	//mShowBoundingBoxes = true;
+	//mShowBoxes = true;
+	//mMaxDepth = 20;
+}
+//-----------------------------------------------------------------------
+VisibilityBspSceneManager::~VisibilityBspSceneManager()
+{
+	delete mHierarchyInterface;
+}
+//-----------------------------------------------------------------------
+void VisibilityBspSceneManager::_renderVisibleObjects()
+{
+	//-- render background
+	clearSpecialCaseRenderQueues();
+	addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND);
+	addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY);
+
+	setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE);
+	SceneManager::_renderVisibleObjects( );
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	_deleteRenderedQueueGroups();
+#endif
+
+	//-- render visible objects (i.e., all but overlay)
+	clearSpecialCaseRenderQueues();
+	addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY);
+	setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE);
+
+	mHierarchyInterface->InitFrame(mSceneRoot, mCameraInProgress);
+	mVisibilityManager->ApplyVisibilityCulling();
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	_deleteRenderedQueueGroups();
+#endif
+
+	//-- render rest, e.g., overlay
+	clearSpecialCaseRenderQueues();
+	SceneManager::_renderVisibleObjects();
+	//_deleteRenderedQueueGroups();
+}
+//-----------------------------------------------------------------------
+void VisibilityBspSceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters)
+{
+	// must be empty because objects are found and rendered in an interleaved fashion
+	// in _renderVisibibleObjects 
+}
+//-----------------------------------------------------------------------
+void VisibilityBspSceneManager::_updateSceneGraph(Camera* cam)
+{
+	//mOcclusionBspHierarchyInterface->setNumSceneNodes((int)mSceneNodes.size());
+	mVisibilityManager->GetCullingManager()->SetHierarchyInterface(mHierarchyInterface);
+	mHierarchyInterface->SetRenderSystem(mDestRenderSystem);
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+    mHierarchyInterface->SetNumOctreeNodes(mNumOctreeNodes);
+#endif
+	BspSceneManager::_updateSceneGraph(cam);
+}
+//-----------------------------------------------------------------------
+bool VisibilityBspSceneManager::setOption(const String & key, const void * val)
+{
+	return /*mVisibilitySceneTraverser->setOption( key, val) || */BspSceneManager::setOption( key, val );
+}
+//-----------------------------------------------------------------------
+bool VisibilityBspSceneManager::getOption(const String & key, void *val)
+{
+	return /*mVisibilitySceneTraverser->getOption( key, val) || */BspSceneManager::getOption(key, val);
+}
+//-----------------------------------------------------------------------
+bool VisibilityBspSceneManager::getOptionValues(const String & key, StringVector  &refValueList)
+{
+	return BspSceneManager::getOptionValues( key, refValueList );
+}
+//-----------------------------------------------------------------------
+bool VisibilityBspSceneManager::getOptionKeys(StringVector & refKeys)
+{
+	return /*mVisibilitySceneTraverser->getOptionKeys ( refKeys ) || */BspSceneManager::getOptionKeys(refKeys);
+}
+//-----------------------------------------------------------------------
+void VisibilityBspSceneManager::setVisibilityManager(GtpVisibility::Manager *visManager)
+{
+    mVisibilityManager = visManager;
+}
+//-----------------------------------------------------------------------
+GtpVisibility::Manager *VisibilityBspSceneManager::getVisibilityManager()
+{
+	return mVisibilityManager;
+}
+
+}   // namespace Ogre
Index: /tags/DummyModules/VUT/Ogre/src/OgreVisibilityTerrainSceneManager.cpp
===================================================================
--- /tags/DummyModules/VUT/Ogre/src/OgreVisibilityTerrainSceneManager.cpp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/src/OgreVisibilityTerrainSceneManager.cpp	(revision 59)
@@ -0,0 +1,108 @@
+#include "OgreVisibilityTerrainSceneManager.h"
+#include "OgreOctreeHierarchyInterface.h"
+#include <OgreMath.h>
+#include <OgreIteratorWrappers.h>
+#include <OgreRenderSystem.h>
+#include <OgreCamera.h>
+
+//#include <windows.h>
+
+namespace Ogre {
+//namespace GtpVisibility {
+//-----------------------------------------------------------------------
+VisibilityTerrainSceneManager::VisibilityTerrainSceneManager(GtpVisibility::VisibilityManager *visManager)
+:mVisibilityManager(visManager)
+{
+	mHierarchyInterface = 
+		new OctreeHierarchyInterface(this, mDestRenderSystem);
+
+	setVisibilityManager(visManager);
+	//mShowBoxes = true;
+	//mDisplayNodes = true;
+	//mShowBoundingBoxes = true;
+	mMaxDepth = 20;
+}
+//-----------------------------------------------------------------------
+VisibilityTerrainSceneManager::~VisibilityTerrainSceneManager()
+{
+	delete mHierarchyInterface;
+}
+//-----------------------------------------------------------------------
+void VisibilityTerrainSceneManager::_renderVisibleObjects()
+{
+	//-- render background
+	clearSpecialCaseRenderQueues();
+	addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND);
+	addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY);
+
+	setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE);
+	SceneManager::_renderVisibleObjects();
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	_deleteRenderedQueueGroups();
+#endif
+
+	//-- render visible objects (i.e., all but overlay)
+	clearSpecialCaseRenderQueues();
+	addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY);
+	setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE);
+
+	mHierarchyInterface->InitFrame(mSceneRoot, mCameraInProgress);
+
+	mVisibilityManager->ApplyVisibilityCulling();
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	_deleteRenderedQueueGroups();
+#endif
+
+	//-- render overlay
+	clearSpecialCaseRenderQueues();
+	SceneManager::_renderVisibleObjects( );
+}
+//-----------------------------------------------------------------------
+void VisibilityTerrainSceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters)
+{
+	// must be empty because objects are found and rendered in an interleaved fashion
+	// in _renderVisibibleObjects 
+}
+//-----------------------------------------------------------------------
+void VisibilityTerrainSceneManager::_updateSceneGraph(Camera* cam)
+{
+	//mHierarchyInterface->setNumSceneNodes((int)mSceneNodes.size());
+	mVisibilityManager->GetCullingManager()->SetHierarchyInterface(mHierarchyInterface);
+	mHierarchyInterface->SetRenderSystem(mDestRenderSystem);
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+    mHierarchyInterface->SetNumOctreeNodes(mNumOctreeNodes);
+#endif
+	TerrainSceneManager::_updateSceneGraph(cam);
+}
+//-----------------------------------------------------------------------
+bool VisibilityTerrainSceneManager::setOption(const String & key, const void * val)
+{
+	return /*mOcclusionOctreeHierarchyInterface->setOption( key, val) || */TerrainSceneManager::setOption( key, val );
+}
+//-----------------------------------------------------------------------
+bool VisibilityTerrainSceneManager::getOption(const String & key, void *val)
+{
+	return /*mOcclusionOctreeHierarchyInterface->getOption( key, val) || */TerrainSceneManager::getOption( key, val ) ;
+}
+//-----------------------------------------------------------------------
+bool VisibilityTerrainSceneManager::getOptionValues(const String & key, StringVector  &refValueList)
+{
+	return TerrainSceneManager::getOptionValues( key, refValueList );
+}
+//-----------------------------------------------------------------------
+bool VisibilityTerrainSceneManager::getOptionKeys(StringVector & refKeys)
+{
+	return /*mOcclusionOctreeHierarchyInterface->getOptionKeys ( refKeys ) ||*/ TerrainSceneManager::getOptionKeys( refKeys );
+}
+//-----------------------------------------------------------------------
+void VisibilityTerrainSceneManager::setVisibilityManager(GtpVisibility::VisibilityManager *visManager)
+{
+	mVisibilityManager = visManager;
+}
+//-----------------------------------------------------------------------
+GtpVisibility::VisibilityManager *VisibilityTerrainSceneManager::getVisibilityManager( void )
+{
+	return mVisibilityManager;
+}
+//} // namespace GtpVisibility
+} // namespace Ogre
Index: /tags/DummyModules/VUT/Ogre/src/OgreVisibilityDotSceneManager.cpp
===================================================================
--- /tags/DummyModules/VUT/Ogre/src/OgreVisibilityDotSceneManager.cpp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/src/OgreVisibilityDotSceneManager.cpp	(revision 59)
@@ -0,0 +1,107 @@
+#include <OgreVisibilityDotSceneManager.h>
+#include <OgreMath.h>
+#include <OgreIteratorWrappers.h>
+#include <OgreRenderSystem.h>
+#include <OgreCamera.h>
+
+//#include <windows.h>
+
+namespace Ogre {
+
+//-----------------------------------------------------------------------
+VisibilityDotSceneManager::VisibilityDotSceneManager(GtpVisibility::VisibilityManager *visManager)
+:mVisibilityManager(visManager)
+{
+	mHierarchyInterface = 
+		new SceneNodeHierarchyInterface(this, mDestRenderSystem);
+	
+	mShowBoundingBoxes = true;
+	
+	//mDisplayNodes = true;
+	//mShowBoxes = true;
+}
+//-----------------------------------------------------------------------
+VisibilityDotSceneManager::~VisibilityDotSceneManager()
+{
+	delete mHierarchyInterface;
+}
+//-----------------------------------------------------------------------
+void VisibilityDotSceneManager::_renderVisibleObjects(void)
+{
+	//-- render background
+	clearSpecialCaseRenderQueues();
+	addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND);
+	addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY);
+
+	setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE);
+	DotSceneManager::_renderVisibleObjects();
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	_deleteRenderedQueueGroups();
+#endif
+	//-- render visible objects (i.e., all but overlay)
+	clearSpecialCaseRenderQueues();
+	addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY);
+	setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE);
+
+	mHierarchyInterface->InitFrame(mSceneRoot, mCameraInProgress);
+
+	mVisibilityManager->ApplyVisibilityCulling();
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	_deleteRenderedQueueGroups();
+#endif
+
+	//-- render overlay
+	clearSpecialCaseRenderQueues();
+	DotSceneManager::_renderVisibleObjects( );
+
+	clearSpecialCaseRenderQueues();
+}
+//-----------------------------------------------------------------------
+void VisibilityDotSceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters)
+{
+	// must be empty because objects are found and rendered in an interleaved fashion
+	// in _renderVisibibleObjects 
+}
+//-----------------------------------------------------------------------
+void VisibilityDotSceneManager::_updateSceneGraph(Camera* cam)
+{
+	//mVisibilitySceneTraverser->setNumSceneNodes((int)mSceneNodes.size());
+	mVisibilityManager->GetCullingManager()->SetHierarchyInterface(mHierarchyInterface);
+	mHierarchyInterface->SetRenderSystem(mDestRenderSystem);
+		        	
+	DotSceneManager::_updateSceneGraph(cam);
+}
+//-----------------------------------------------------------------------
+bool VisibilityDotSceneManager::setOption(const String & key, const void * val)
+{
+	return /*mVisibilitySceneTraverser->setOption( key, val) || */DotSceneManager::setOption(key, val);
+}
+//-----------------------------------------------------------------------
+bool VisibilityDotSceneManager::getOption(const String & key, void *val)
+{
+	return /*mVisibilitySceneTraverser->getOption( key, val) || */DotSceneManager::getOption(key, val);
+}
+//-----------------------------------------------------------------------
+bool VisibilityDotSceneManager::getOptionValues(const String & key, StringVector  &refValueList)
+{
+	return DotSceneManager::getOptionValues(key, refValueList);
+}
+//-----------------------------------------------------------------------
+bool VisibilityDotSceneManager::getOptionKeys(StringVector & refKeys)
+{
+	return /*mVisibilitySceneTraverser->getOptionKeys ( refKeys ) || */DotSceneManager::getOptionKeys( refKeys );
+}
+//-----------------------------------------------------------------------
+void VisibilityDotSceneManager::setVisibilityManager(GtpVisibility::VisibilityManager *visManager)
+{
+	mVisibilityManager = visManager;
+}
+//-----------------------------------------------------------------------
+GtpVisibility::VisibilityManager *VisibilityDotSceneManager::getVisibilityManager()
+{
+	return mVisibilityManager;
+}
+
+//} // namespace GtpVisibility
+} // namespace Ogre
Index: /tags/DummyModules/VUT/Ogre/src/OgrePlatformOcclusionQuery.cpp
===================================================================
--- /tags/DummyModules/VUT/Ogre/src/OgrePlatformOcclusionQuery.cpp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/src/OgrePlatformOcclusionQuery.cpp	(revision 59)
@@ -0,0 +1,44 @@
+#include "OgrePlatformOcclusionQuery.h"
+
+namespace Ogre {
+
+//-----------------------------------------------------------------------
+PlatformOcclusionQuery::PlatformOcclusionQuery(RenderSystem *rsys)
+{
+	mHardwareOcclusionQuery = rsys->createHardwareOcclusionQuery();
+}
+//-----------------------------------------------------------------------
+PlatformOcclusionQuery::~PlatformOcclusionQuery()
+{
+	delete mHardwareOcclusionQuery;
+}
+//-----------------------------------------------------------------------
+void PlatformOcclusionQuery::BeginQuery() const
+{
+	mHardwareOcclusionQuery->beginOcclusionQuery();
+}
+//-----------------------------------------------------------------------
+void PlatformOcclusionQuery::EndQuery() const
+{
+	mHardwareOcclusionQuery->endOcclusionQuery();
+}
+//-----------------------------------------------------------------------
+unsigned int PlatformOcclusionQuery::GetQueryResult() const
+{
+	unsigned int visiblePixels = 0;
+	// wait if result not available
+	mHardwareOcclusionQuery->pullOcclusionQuery(&visiblePixels);
+
+	return visiblePixels;
+}
+//-----------------------------------------------------------------------
+bool PlatformOcclusionQuery::ResultAvailable() const
+{
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	return mHardwareOcclusionQuery->resultAvailable();
+#else
+	return true;
+#endif
+}
+
+} // namespace Ogre
Index: /tags/DummyModules/VUT/Ogre/src/OgreVisibilitySceneManagerDll.cpp
===================================================================
--- /tags/DummyModules/VUT/Ogre/src/OgreVisibilitySceneManagerDll.cpp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/src/OgreVisibilitySceneManagerDll.cpp	(revision 59)
@@ -0,0 +1,74 @@
+/*
+-----------------------------------------------------------------------------
+This source file is part of OGRE
+    (Object-oriented Graphics Rendering Engine)
+For the latest info, see http://www.ogre3d.org/
+
+Copyright © 2000-2002 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.
+-----------------------------------------------------------------------------
+*/
+
+#include <OgreOcclusionCullingTerrainSceneManager.h>
+#include <OgreOcclusionCullingOctreeSceneManager.h>
+//#include <OgreOcclusionCullingDotSceneManager.h>
+#include <OgreHeightmapTerrainPageSource.h>
+#include "GtpVisibilityManager.h"
+#include "GtpVisibilityStopAndWaitManager.h"
+#include "GtpVisibilityEnvironment.h"
+
+#include <OgreRoot.h>
+
+//#include <windows.h>
+GtpVisibility::Environment *visEnv;
+GtpVisibility::Manager *visManager;
+
+namespace Ogre {
+
+// OcclusionCullingDotSceneManager *occlusionDotPlugin;
+OcclusionCullingOctreeSceneManager *cullingOctreePlugin;
+OcclusionCullingTerrainSceneManager *cullingTerrainPlugin;
+
+HeightmapTerrainPageSource *heightmapTerrainPageSource;
+
+//-----------------------------------------------------------------------
+extern "C" void dllStartPlugin(void)
+{
+	visManager = new GtpVisibility::Manager(visEnv);
+	// Create new scene manager
+	//occlusionDotPlugin = new OcclusionCullingDotSceneManager();
+	cullingOctreePlugin = new OcclusionCullingOctreeSceneManager(visManager);
+	cullingTerrainPlugin = new OcclusionCullingTerrainSceneManager(visManager);
+	heightmapTerrainPageSource = new HeightmapTerrainPageSource();
+
+	cullingTerrainPlugin->registerPageSource("Heightmap", heightmapTerrainPageSource);
+
+	// Register
+	//Root::getSingleton().setSceneManager( ST_GENERIC, occlusionDotPlugin );
+	Root::getSingleton().setSceneManager( ST_GENERIC, cullingOctreePlugin );
+	Root::getSingleton().setSceneManager( ST_EXTERIOR_CLOSE, cullingTerrainPlugin );
+}
+extern "C" void dllStopPlugin(void)
+{
+	delete heightmapTerrainPageSource;
+    //delete occlusionDotPlugin;
+	delete cullingOctreePlugin;
+	delete cullingTerrainPlugin;
+	delete visManager;
+}
+
+} //namespace Ogre
Index: /tags/DummyModules/VUT/Ogre/src/OgreVisibilitySceneManager.cpp
===================================================================
--- /tags/DummyModules/VUT/Ogre/src/OgreVisibilitySceneManager.cpp	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/src/OgreVisibilitySceneManager.cpp	(revision 59)
@@ -0,0 +1,109 @@
+#include <OgreMath.h>
+#include <OgreIteratorWrappers.h>
+#include <OgreRenderSystem.h>
+#include <OgreCamera.h>
+#include "OgreVisibilitySceneManager.h"
+#include "OgreSceneNodeHierarchyInterface.h"
+
+//#include <windows.h>
+
+namespace Ogre {
+//namespace GtpVisibility {
+//-----------------------------------------------------------------------
+VisibilitySceneManager::VisibilitySceneManager(GtpVisibility::VisibilityManager *visManager)
+:mVisibilityManager(visManager)
+{
+	mHierarchyInterface = new SceneNodeHierarchyInterface(this, mDestRenderSystem);
+}
+//-----------------------------------------------------------------------
+VisibilitySceneManager::~VisibilitySceneManager()
+{
+	delete mHierarchyInterface;
+}
+//-----------------------------------------------------------------------
+void VisibilitySceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters)
+{
+	// empty because we have to find objects in _renderVisibleObjects
+}
+//-----------------------------------------------------------------------
+void VisibilitySceneManager::_renderVisibleObjects()
+{
+		//-- render background
+	clearSpecialCaseRenderQueues();
+	addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND);
+	addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY);
+
+	setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE);
+	SceneManager::_renderVisibleObjects( );
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	_deleteRenderedQueueGroups();
+#endif
+	//-- render visible objects (i.e., all but overlay)
+	clearSpecialCaseRenderQueues();
+	addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY);
+	setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE);
+
+	mHierarchyInterface->InitFrame(mSceneRoot, mCameraInProgress);
+
+	mVisibilityManager->ApplyVisibilityCulling();
+
+#ifdef GTP_VISIBILITY_MODIFIED_OGRE
+	_deleteRenderedQueueGroups();
+#endif
+
+	//-- render overlay
+	clearSpecialCaseRenderQueues();
+	SceneManager::_renderVisibleObjects( );
+
+	clearSpecialCaseRenderQueues();
+}
+//-----------------------------------------------------------------------
+void VisibilitySceneManager::_updateSceneGraph(Camera* cam)
+{
+	//mVisibilitySceneTraverser->setNumSceneNodes((int)mSceneNodes.size());
+	mVisibilityManager->GetCullingManager()->SetHierarchyInterface(mHierarchyInterface);
+	mHierarchyInterface->SetRenderSystem(mDestRenderSystem);
+	
+	//mVisibilitySceneTraverser->setNumQueries((int)mSceneNodes.size());
+   	
+	SceneManager::_updateSceneGraph(cam);
+}
+//-----------------------------------------------------------------------
+bool VisibilitySceneManager::setOption(const String & key, const void * val)
+{
+	//mVisibilitySceneTraverser->setOption(key, val);	
+	return SceneManager::setOption(key, val);
+}
+//-----------------------------------------------------------------------
+bool VisibilitySceneManager::getOption(const String & key, void *val)
+{
+	//mVisibilitySceneTraverser->getOption(key, val);
+	
+	return SceneManager::getOption(key, val);
+}
+//-----------------------------------------------------------------------
+bool VisibilitySceneManager::getOptionValues(const String & key, StringVector  &refValueList)
+{
+	return SceneManager::getOptionValues(key, refValueList);
+}
+//-----------------------------------------------------------------------
+bool VisibilitySceneManager::getOptionKeys(StringVector & refKeys)
+{
+	SceneManager::getOptionKeys(refKeys);
+	//mVisibilitySceneTraverser->getOptionKeys( refKeys );
+
+	return true;
+}
+//-----------------------------------------------------------------------
+void VisibilitySceneManager::setVisibilityManager(GtpVisibility::VisibilityManager *visManager)
+{
+	mVisibilityManager = visManager;
+}
+//-----------------------------------------------------------------------
+GtpVisibility::VisibilityManager *VisibilitySceneManager::getVisibilityManager( void )
+{
+	return mVisibilityManager;
+}
+
+//} // namespace GtpVisibility
+} // namespace Ogre
Index: /tags/DummyModules/VUT/Ogre/resources/OcclusionCullingDemo.overlay
===================================================================
--- /tags/DummyModules/VUT/Ogre/resources/OcclusionCullingDemo.overlay	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/resources/OcclusionCullingDemo.overlay	(revision 59)
@@ -0,0 +1,261 @@
+Example/OcclusionCullingDemoOverlay
+{
+	zorder 500
+	// Stats block
+	container BorderPanel(Example/Occlusion/OcclusionPanel)
+	{
+		metrics_mode pixels
+		vert_align top
+		left 5 
+		top 5
+		width 450
+		height 55
+		material Core/StatsBlockCenter
+        	border_size 1 1 1 1
+        	border_material Core/StatsBlockBorder
+        	border_topleft_uv     0.0000 1.0000 0.0039 0.9961
+	    	border_top_uv         0.0039 1.0000 0.9961 0.9961
+	    	border_topright_uv    0.9961 1.0000 1.0000 0.9961
+	    	border_left_uv        0.0000 0.9961 0.0039 0.0039
+	    	border_right_uv       0.9961 0.9961 1.0000 0.0039
+	    	border_bottomleft_uv  0.0000 0.0039 0.0039 0.0000
+        	border_bottom_uv      0.0039 0.0039 0.9961 0.0000
+	    	border_bottomright_uv 0.9961 0.0039 1.0000 0.0000
+
+
+		element TextArea(Example/Occlusion/Algorithm)
+		{
+			metrics_mode pixels
+			left 5
+			top 5
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption [A] Algorithm
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/AlgorithmInfo)
+		{
+			metrics_mode pixels
+			left 155
+			top 5
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+
+		element TextArea(Example/Occlusion/Threshold)
+		{
+			metrics_mode pixels
+			left 5
+			top 20
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption [-][+] Threshold
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/ThresholdInfo)
+		{
+			metrics_mode pixels
+			left 155
+			top 20
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+	}
+
+	container BorderPanel(Example/Occlusion/OcclusionStatsPanel)
+	{
+		metrics_mode pixels
+		vert_align top
+		horz_align right
+		left -355 
+		top 5
+		width 450
+		height 105
+		material Core/StatsBlockCenter
+        	border_size 1 1 1 1
+        	border_material Core/StatsBlockBorder
+        	border_topleft_uv     0.0000 1.0000 0.0039 0.9961
+	    	border_top_uv         0.0039 1.0000 0.9961 0.9961
+	    	border_topright_uv    0.9961 1.0000 1.0000 0.9961
+	    	border_left_uv        0.0000 0.9961 0.0039 0.0039
+	    	border_right_uv       0.9961 0.9961 1.0000 0.0039
+	    	border_bottomleft_uv  0.0000 0.0039 0.0039 0.0000
+        	border_bottom_uv      0.0039 0.0039 0.9961 0.0000
+	    	border_bottomright_uv 0.9961 0.0039 1.0000 0.0000
+
+		element TextArea(Example/Occlusion/FrustumCulledNodes)
+		{
+			metrics_mode pixels
+			left 5
+			top 5
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption Frustum Culled Nodes
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/FrustumCulledNodesInfo)
+		{
+			metrics_mode pixels
+			left 180
+			top 5
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/QueryCulledNodes)
+		{
+			metrics_mode pixels
+			left 5
+			top 20
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption Query Culled Nodes
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}	
+		element TextArea(Example/Occlusion/QueryCulledNodesInfo)
+		{
+			metrics_mode pixels
+			left 180
+			top 20
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/TraversedNodes)
+		{
+			metrics_mode pixels
+			left 5
+			top 35
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption Traversed Nodes
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}	
+		element TextArea(Example/Occlusion/TraversedNodesInfo)
+		{
+			metrics_mode pixels
+			left 180
+			top 35
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/SceneNodes)
+		{
+			metrics_mode pixels
+			left 5
+			top 50
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption Scene Nodes
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}	
+		element TextArea(Example/Occlusion/SceneNodesInfo)
+		{
+			metrics_mode pixels
+			left 180
+			top 50
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/HierarchyNodes)
+		{
+			metrics_mode pixels
+			left 5
+			top 65
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption Hierarchy Nodes
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}	
+		element TextArea(Example/Occlusion/HierarchyNodesInfo)
+		{
+			metrics_mode pixels
+			left 180
+			top 65
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/RenderedNodes)
+		{
+			metrics_mode pixels
+			left 5
+			top 80
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption Rendered Nodes
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}	
+		element TextArea(Example/Occlusion/RenderedNodesInfo)
+		{
+			metrics_mode pixels
+			left 180
+			top 80
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+
+
+	}
+}
Index: /tags/DummyModules/VUT/Ogre/misc/OgreVisibilitySceneManager.def
===================================================================
--- /tags/DummyModules/VUT/Ogre/misc/OgreVisibilitySceneManager.def	(revision 59)
+++ /tags/DummyModules/VUT/Ogre/misc/OgreVisibilitySceneManager.def	(revision 59)
@@ -0,0 +1,4 @@
+LIBRARY Plugin_OcclusionCullingSceneManager
+EXPORTS	
+	dllStartPlugin
+	dllStopPlugin
Index: /tags/DummyModules/VUT/obsolete/overview_old.tex
===================================================================
--- /tags/DummyModules/VUT/obsolete/overview_old.tex	(revision 71)
+++ /tags/DummyModules/VUT/obsolete/overview_old.tex	(revision 71)
@@ -0,0 +1,88 @@
+\newcommand{\tab}{\hspace{2mm}}
+\chapter{Overview}
+
+
+ The visibility work package aims to develop methods for making use of
+restricted visibility in large scenes. The major goal of these methods
+is to avoid wasting of the computational power on currently invisible
+parts of the scene. To address this goal we develop new methods for
+online visibility culling and offline visibility preprocessing. The
+online visibility culling is either used to render only visible part
+of the scene or to provide queries which determine visible part of the
+scene in runtime. Visibility preprocessing provides partitioning of the
+view space into view cells and for each view cell it calculates a
+potentially visible set.
+
+
+\section{Module Class Hierarchy}
+
+ The visibility work package consist of a module which is integrated
+into the game engine and an external module which deals with
+preprocessing. One of the goals of the design of the module class
+hierarchy has been easy portability of the developed methods to other
+game engines. The resulting class structure clearly separates the
+actual engine dependent parts from the game engine independent
+algorithmic parts.  We have used name spaces to separate the engine
+dependent parts (name space Ogre) from the engine independent parts
+(name space GtpVisibility). The external visibility preprocessing module
+defines its own name space (GtpVisibilityPreprocessor).
+
+ An overview of the important classes of the visibility work package and
+their integration into the Ogre engine is depicted in
+Figure~\ref{fig:classes}.
+
+\begin{figure}[htb]
+  \centerline{
+    \includegraphics[angle=270,width=1.0\textwidth]{../classes}
+    }
+  \caption{Overview of the visibility work packages classes and their integration
+    into the Ogre game engine.}
+  \label{fig:classes}
+\end{figure}
+
+The diagram shows that the module integrated into the engine consists
+of three main parts (CullingManager, QueryManager,
+PreprocessingManager) which are encapsulated in a helper class
+(Visibility Manager). The helper class then deals with the
+initialization of the contained parts and allows an easy communication
+between them.
+
+\section{Visibility Culling}
+
+Visibility culling seamlessly integrates into the rendering
+loop and eliminates most invisible objects from being send to the
+pipeline. Visibility culling is implemented by instances of the CullingManager
+class. We will provide several implementations which can be easily
+switched at runtime and so the best technique for the particular scene
+and scene representation can be selected. Note that the Ogre
+integration design allows to exploit all already existing methods for
+scene management, such as octree, BSP tree, or plain scene graph.
+
+
+\section{Visibility Queries}
+
+Visibility queries determine the visible geometry for a given view
+point in the scene. Additionally they can also report the visible
+scene hierarchy nodes. Visibility queries are implemented by
+instances of the QueryManager class. Note that some of these instances
+will make use of the preprocessed visibility data through the use of
+PreprocessingManager.
+
+\section{Visibility Preprocessing}
+
+Visibility preprocessing precalculates visibility for all viewpoints
+corresponding to cells of a view space partitioning. The visibility
+preprocessor is implemented as a standalone module which imports files
+generated by the PreprocessingManager. The results of the visibility
+computation will be exported to the file which can then be loaded by
+the PreprocessingManager and used inside the engine.
+
+ Apart from the scene definition file the preprocessor will be able
+to import the view cell definition. In this case it will assume the
+view cells have to be described as meshes satisfying set of
+requirements. Alternatively the module can generate view cells by
+automatic view space partitioning.
+
+
+%{\textbullet}\tab\textbf{Construction module for tree multiresolution models.}
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/Makefile.in
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/Makefile.in	(revision 12)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/Makefile.in	(revision 12)
@@ -0,0 +1,460 @@
+# Makefile.in generated by automake 1.7.5 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_triplet = @host@
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON = @BISON@
+BOOST_CFLAGS = @BOOST_CFLAGS@
+BOOST_LIBS = @BOOST_LIBS@
+BUILD_PYTHON_INTERFACE_FALSE = @BUILD_PYTHON_INTERFACE_FALSE@
+BUILD_PYTHON_INTERFACE_TRUE = @BUILD_PYTHON_INTERFACE_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFGTK_DEPS_CFLAGS = @CFGTK_DEPS_CFLAGS@
+CFGTK_DEPS_LIBS = @CFGTK_DEPS_LIBS@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GLSUPPORT_CFLAGS = @GLSUPPORT_CFLAGS@
+GLSUPPORT_LIBS = @GLSUPPORT_LIBS@
+GL_LIBS = @GL_LIBS@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+OGREMAIN_VERSION_INFO = @OGREMAIN_VERSION_INFO@
+OGRE_CFGTK = @OGRE_CFGTK@
+OGRE_CFLAGS = @OGRE_CFLAGS@
+OGRE_GLSUPPORT = @OGRE_GLSUPPORT@
+OGRE_PLATFORM = @OGRE_PLATFORM@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLATFORM_CFLAGS = @PLATFORM_CFLAGS@
+PLATFORM_LIBS = @PLATFORM_LIBS@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_LIBS = @PYTHON_LIBS@
+RANLIB = @RANLIB@
+SDL_CFLAGS = @SDL_CFLAGS@
+SDL_CONFIG = @SDL_CONFIG@
+SDL_LIBS = @SDL_LIBS@
+SET_MAKE = @SET_MAKE@
+SHARED_FLAGS = @SHARED_FLAGS@
+SHELL = @SHELL@
+STLPORT_CFLAGS = @STLPORT_CFLAGS@
+STLPORT_LIBS = @STLPORT_LIBS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+SUBDIRS = src include
+subdir = PlugIns/BSPSceneManager
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/OgreMain/include/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+
+RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \
+	ps-recursive install-info-recursive uninstall-info-recursive \
+	all-recursive install-data-recursive install-exec-recursive \
+	installdirs-recursive install-recursive uninstall-recursive \
+	check-recursive installcheck-recursive
+DIST_COMMON = Makefile.am Makefile.in
+DIST_SUBDIRS = $(SUBDIRS)
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  PlugIns/BSPSceneManager/Makefile
+Makefile:  $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@set fnord $$MAKEFLAGS; amf=$$2; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@set fnord $$MAKEFLAGS; amf=$$2; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ETAGS = etags
+ETAGSFLAGS =
+
+CTAGS = ctags
+CTAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if (etags --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	else \
+	  include_option=--include; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -f $$subdir/TAGS && \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$tags$$unique" \
+	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	     $$tags $$unique
+
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkinstalldirs) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d $(distdir)/$$subdir \
+	    || mkdir $(distdir)/$$subdir \
+	    || exit 1; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$(top_distdir)" \
+	        distdir=../$(distdir)/$$subdir \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+
+distclean-am: clean-am distclean-generic distclean-libtool \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \
+	clean-generic clean-libtool clean-recursive ctags \
+	ctags-recursive distclean distclean-generic distclean-libtool \
+	distclean-recursive distclean-tags distdir dvi dvi-am \
+	dvi-recursive info info-am info-recursive install install-am \
+	install-data install-data-am install-data-recursive \
+	install-exec install-exec-am install-exec-recursive \
+	install-info install-info-am install-info-recursive install-man \
+	install-recursive install-strip installcheck installcheck-am \
+	installdirs installdirs-am installdirs-recursive \
+	maintainer-clean maintainer-clean-generic \
+	maintainer-clean-recursive mostlyclean mostlyclean-generic \
+	mostlyclean-libtool mostlyclean-recursive pdf pdf-am \
+	pdf-recursive ps ps-am ps-recursive tags tags-recursive \
+	uninstall uninstall-am uninstall-info-am \
+	uninstall-info-recursive uninstall-recursive
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingDotScene/TestCullingDotScene.vcproj
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingDotScene/TestCullingDotScene.vcproj	(revision 48)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingDotScene/TestCullingDotScene.vcproj	(revision 48)
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="TestCullingDotScene"
+	ProjectGUID="{BE13944C-D05E-467F-B0AC-8A65A3B5FE60}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\bin\$(ConfigurationName)"
+			IntermediateDirectory="..\obj\$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(OGRE_PATH)\Dependencies\include&quot;;&quot;$(OGRE_PATH)\OgreMain\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include\CEGUI&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\include&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\include&quot;;../include"
+				PreprocessorDefinitions="_WINDOWS;_STLP_USE_DYNAMIC_LIB;OGRE_LIBRARY_IMPORTS;_DEBUG;WIN32;_STLP_DEBUG"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="Plugin_OctreeSceneManager.lib OGREMain_d.LIB CEGUIBase_d.lib OgreGUIRenderer_d.lib Plugin_DotSceneManager.lib"
+				OutputFile="$(OGRE_PATH)/Samples/Common/bin/Debug/TestCullingDotScene.exe"
+				LinkIncremental="2"
+				AdditionalLibraryDirectories="&quot;$(OGRE_PATH)\Dependencies\Lib\Debug&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\bin\debug&quot;;&quot;$(OGRE_PATH)\OgreMain\Lib\Debug&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\bin\debug&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\lib&quot;"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/TestCullingDotScene.pdb"
+				SubSystem="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/TestCullingDotScene.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath=".\TestCullingDotSceneApplication.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath=".\TestCullingDotSceneApplication.h">
+			</File>
+		</Filter>
+		<Filter
+			Name="tinyxml"
+			Filter="">
+			<File
+				RelativePath="..\tinyxml\tinystr.cpp">
+			</File>
+			<File
+				RelativePath="..\tinyxml\tinystr.h">
+			</File>
+			<File
+				RelativePath="..\tinyxml\tinyxml.cpp">
+			</File>
+			<File
+				RelativePath="..\tinyxml\tinyxml.h">
+			</File>
+			<File
+				RelativePath="..\tinyxml\tinyxmlerror.cpp">
+			</File>
+			<File
+				RelativePath="..\tinyxml\tinyxmlparser.cpp">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingDotScene/TestCullingDotSceneApplication.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingDotScene/TestCullingDotSceneApplication.cpp	(revision 42)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingDotScene/TestCullingDotSceneApplication.cpp	(revision 42)
@@ -0,0 +1,594 @@
+/**
+    \file 
+        TestCullingApplication.cpp
+    \brief
+        Tests the occlusion culling algorithm
+*/
+
+#include <OgreNoMemoryMacros.h>
+#include <CEGUI/CEGUI.h>
+#include <../CEGUIRenderer/include/OgreCEGUIRenderer.h>
+#include <../CEGUIRenderer/include/OgreCEGUIResourceProvider.h>
+#include <../CEGUIRenderer/include/OgreCEGUITexture.h>
+#include <OgreMemoryMacros.h>
+
+#include "Ogre.h"
+#include "OgreLight.h"
+#include "tinyxml.h"
+#include "TestCullingDotSceneApplication.h"
+#include "OgreOcclusionCullingSceneTraverser.h"
+
+#define WIN32_LEAN_AND_MEAN
+#include "windows.h"
+
+/***********************************************/
+/* TestCullingDotSceneApplication implementation       */
+/***********************************************/
+void TestCullingDotSceneApplication::ParseDotScene( const String &SceneName, const String& groupName )
+{
+	TiXmlDocument	*XMLDoc;
+	TiXmlElement	*XMLRoot, *XMLNodes, *XMLPathFind;
+	try
+	{
+		DataStreamPtr pStream = ResourceGroupManager::getSingleton().openResource( SceneName, groupName );
+
+		String data = pStream->getAsString();
+
+		// Open the .scene File
+		XMLDoc = new TiXmlDocument();
+		XMLDoc->Parse( data.c_str() );
+		pStream->close();
+		pStream.setNull();
+
+		if( XMLDoc->Error() )
+		{
+			//We'll just log, and continue on gracefully
+			LogManager::getSingleton().logMessage("Error in dotscene demo app!!!!!");
+			delete XMLDoc;
+			return;
+		}
+	}
+	catch(...)
+	{
+		//We'll just log, and continue on gracefully
+		LogManager::getSingleton().logMessage("Error in dotscene demo app!!!!!");
+		delete XMLDoc;
+		return;
+	}
+
+	// Validate the File
+	XMLRoot = XMLDoc->RootElement();
+	if( String( XMLRoot->Value()) != "scene"  ) {
+		LogManager::getSingleton().logMessage( "Error: Invalid .scene File. Missing <scene>" );
+		delete XMLDoc;		
+		return;
+	}
+		
+	XMLNodes = XMLRoot->FirstChildElement( "nodes" );
+	
+	// Read in the scene nodes
+	if( XMLNodes )
+	{
+		TiXmlElement *XMLNode, *XMLPosition, *XMLRotation, *XMLScale,  *XMLEntity, *XMLBillboardSet,  *XMLLight;
+
+		XMLNode = XMLNodes->FirstChildElement( "node" );
+		
+		while( XMLNode )
+		{
+			// Process the current node
+			// Grab the name of the node
+			String NodeName = XMLNode->Attribute("name");
+			// First create the new scene node
+			SceneNode* NewNode = static_cast<SceneNode*>( mSceneMgr->getRootSceneNode()->createChild( NodeName ) );
+
+			Vector3 TempVec;
+			String TempValue;
+				
+			// Now position it...
+			XMLPosition = XMLNode->FirstChildElement("position");
+			
+			if( XMLPosition )
+			{
+				TempValue = XMLPosition->Attribute("x");
+				TempVec.x = StringConverter::parseReal(TempValue);
+				TempValue = XMLPosition->Attribute("y");
+				TempVec.y = StringConverter::parseReal(TempValue);
+				TempValue = XMLPosition->Attribute("z");
+				TempVec.z = StringConverter::parseReal(TempValue);
+				NewNode->setPosition( TempVec );
+			}
+
+			// Rotate it...
+			XMLRotation = XMLNode->FirstChildElement("rotation");
+			if( XMLRotation )
+			{
+				Quaternion TempQuat;
+				TempValue = XMLRotation->Attribute("qx");
+				TempQuat.x = StringConverter::parseReal(TempValue);
+				TempValue = XMLRotation->Attribute("qy");
+				TempQuat.y = StringConverter::parseReal(TempValue);
+				TempValue = XMLRotation->Attribute("qz");
+				TempQuat.z = StringConverter::parseReal(TempValue);
+				TempValue = XMLRotation->Attribute("qw");
+				TempQuat.w = StringConverter::parseReal(TempValue);
+				NewNode->setOrientation( TempQuat );
+			}
+
+			// Scale it.
+			XMLScale = XMLNode->FirstChildElement("scale");
+			
+			if( XMLScale )
+			{
+				TempValue = XMLScale->Attribute("x");
+				TempVec.x = StringConverter::parseReal(TempValue);
+				TempValue = XMLScale->Attribute("y");
+				TempVec.y = StringConverter::parseReal(TempValue);
+				TempValue = XMLScale->Attribute("z");
+				TempVec.z = StringConverter::parseReal(TempValue);
+				NewNode->setScale( TempVec );
+			}
+
+			XMLLight = XMLNode->FirstChildElement( "light" );
+			
+			if( XMLLight )
+				NewNode->attachObject( LoadLight( XMLLight ) );
+
+			// Check for an Entity
+			XMLEntity = XMLNode->FirstChildElement("entity");
+			
+			if( XMLEntity )
+			{
+				if( XMLEntity->Attribute("static") )
+				{
+					if( strcmp( XMLEntity->Attribute("static"), "false" )==0 ){
+						String EntityName, EntityMeshFilename;
+						EntityName = XMLEntity->Attribute( "name" );
+						EntityMeshFilename = XMLEntity->Attribute( "meshFile" );
+
+						// Create entity
+						Entity* NewEntity = mSceneMgr->createEntity(EntityName, EntityMeshFilename);
+						NewNode->attachObject( NewEntity );
+					}
+				}
+			}
+
+			XMLBillboardSet = XMLNode->FirstChildElement( "billboardSet" );
+			if( XMLBillboardSet )
+			{
+				String TempValue;
+
+				BillboardSet* bSet = mSceneMgr->createBillboardSet( NewNode->getName() );
+
+				BillboardType Type;
+				TempValue = XMLBillboardSet->Attribute( "type" );
+				if( TempValue == "orientedCommon" ) 
+					Type = BBT_ORIENTED_COMMON;
+				else if( TempValue == "orientedSelf" )
+					Type = BBT_ORIENTED_SELF;
+				else Type = BBT_POINT;
+
+				BillboardOrigin Origin;
+				TempValue = XMLBillboardSet->Attribute( "type" );
+				if( TempValue == "bottom_left" )
+					Origin = BBO_BOTTOM_LEFT;
+				else if( TempValue == "bottom_center" )
+					Origin = BBO_BOTTOM_CENTER;
+				else if( TempValue == "bottomRight"  )
+					Origin = BBO_BOTTOM_RIGHT;
+				else if( TempValue == "left" )
+					Origin = BBO_CENTER_LEFT;
+				else if( TempValue == "right" )
+					Origin = BBO_CENTER_RIGHT;
+				else if( TempValue == "topLeft" )
+					Origin = BBO_TOP_LEFT;
+				else if( TempValue == "topCenter" )
+					Origin = BBO_TOP_CENTER;
+				else if( TempValue == "topRight" )
+					Origin = BBO_TOP_RIGHT;
+				else 
+					Origin = BBO_CENTER;
+
+				bSet->setBillboardType( Type );
+				bSet->setBillboardOrigin( Origin );
+
+				TempValue = XMLBillboardSet->Attribute( "name" );
+				bSet->setMaterialName( TempValue );
+
+				int width, height;
+				width = StringConverter::parseReal( XMLBillboardSet->Attribute( "width" ) );
+				height = StringConverter::parseReal( XMLBillboardSet->Attribute( "height" ) );
+				bSet->setDefaultDimensions( width, height );
+				bSet->setVisible( true );
+				NewNode->attachObject( bSet );
+
+				TiXmlElement *XMLBillboard;
+
+				XMLBillboard = XMLBillboardSet->FirstChildElement( "billboard" );
+
+				while( XMLBillboard )
+				{
+					Billboard *b;
+					TempValue;
+					TempVec = Vector3( 0, 0, 0 );
+					ColourValue TempColour(1,1,1,1);
+
+					XMLPosition = XMLBillboard->FirstChildElement( "position" );
+					if( XMLPosition ){
+						TempValue = XMLPosition->Attribute("x");
+						TempVec.x = StringConverter::parseReal(TempValue);
+						TempValue = XMLPosition->Attribute("y");
+						TempVec.y = StringConverter::parseReal(TempValue);
+						TempValue = XMLPosition->Attribute("z");
+						TempVec.z = StringConverter::parseReal(TempValue);
+					}
+
+					TiXmlElement* XMLColour = XMLBillboard->FirstChildElement( "colourDiffuse" );
+					if( XMLColour )
+					{
+						TempValue = XMLColour->Attribute("r");
+						TempColour.r = StringConverter::parseReal(TempValue);
+						TempValue = XMLColour->Attribute("g");
+						TempColour.g = StringConverter::parseReal(TempValue);
+						TempValue = XMLColour->Attribute("b");
+						TempColour.b = StringConverter::parseReal(TempValue);
+					}
+
+					b = bSet->createBillboard( TempVec, TempColour);
+
+					XMLBillboard = XMLBillboard->NextSiblingElement( "billboard" );
+				}
+			}
+
+			// Move to the next node
+			XMLNode = XMLNode->NextSiblingElement( "node" );
+		}
+	}
+
+	// Close the XML File
+	delete XMLDoc;
+}
+
+Light* TestCullingDotSceneApplication::LoadLight( TiXmlElement *XMLLight )
+{
+	TiXmlElement *XMLDiffuse, *XMLSpecular, *XMLAttentuation, *XMLPosition;
+
+	// Create a light (point | directional | spot | radPoint)
+	Light* light = mSceneMgr->createLight( XMLLight->Attribute("name") );
+	if( !XMLLight->Attribute("type") || String(XMLLight->Attribute("type")) == "point" )
+		light->setType( Light::LT_POINT );
+	else if( String(XMLLight->Attribute("type")) == "directional")
+		light->setType( Light::LT_DIRECTIONAL );
+	else if( String(XMLLight->Attribute("type")) == "spot")
+		light->setType( Light::LT_SPOTLIGHT );
+	else if( String(XMLLight->Attribute("type")) == "radPoint")
+		light->setType( Light::LT_POINT );
+
+	XMLDiffuse = XMLLight->FirstChildElement("colourDiffuse");
+	if( XMLDiffuse )
+	{
+		ColourValue Diffuse;
+		Diffuse.r = Ogre::StringConverter::parseReal( XMLDiffuse->Attribute("r") );
+		Diffuse.g = Ogre::StringConverter::parseReal( XMLDiffuse->Attribute("g") );
+		Diffuse.b = Ogre::StringConverter::parseReal( XMLDiffuse->Attribute("b") );
+		Diffuse.a = 1;
+		light->setDiffuseColour(Diffuse);
+	}
+	
+	XMLSpecular = XMLLight->FirstChildElement("colourSpecular");
+	
+	if( XMLSpecular )
+	{
+		ColourValue Specular;
+		Specular.r = Ogre::StringConverter::parseReal( XMLSpecular->Attribute("r") );
+		Specular.g = Ogre::StringConverter::parseReal( XMLSpecular->Attribute("g") );
+		Specular.b = Ogre::StringConverter::parseReal( XMLSpecular->Attribute("b") );
+		Specular.a = 1;
+		light->setSpecularColour(Specular);
+	}
+
+	XMLAttentuation = XMLLight->FirstChildElement("lightAttenuation");
+	if( XMLAttentuation )
+	{
+		//get defaults incase not all values specified
+		Real range, constant, linear, quadratic;
+		range = light->getAttenuationRange();
+		constant = light->getAttenuationConstant();
+		linear = light->getAttenuationLinear();
+		quadratic = light->getAttenuationQuadric();
+			
+		if( XMLAttentuation->Attribute("range") )
+			range = StringConverter::parseReal( XMLAttentuation->Attribute("range") );
+		if( XMLAttentuation->Attribute("constant") )
+			constant = StringConverter::parseReal( XMLAttentuation->Attribute("constant") );
+		if( XMLAttentuation->Attribute("linear") )
+			linear = StringConverter::parseReal( XMLAttentuation->Attribute("linear") );
+		if( XMLAttentuation->Attribute("quadratic") )
+			quadratic = StringConverter::parseReal( XMLAttentuation->Attribute("quadratic") );
+			light->setAttenuation( range, constant, linear, quadratic );
+	}
+
+	XMLPosition = XMLLight->FirstChildElement("position");
+	if( XMLPosition ) 
+	{
+		Vector3 p = Vector3(0,0,0);
+		if( XMLPosition->Attribute("x") )
+			p.x = StringConverter::parseReal( XMLPosition->Attribute("x") );
+		if( XMLPosition->Attribute("y") )
+			p.y = StringConverter::parseReal( XMLPosition->Attribute("y") );
+		if( XMLPosition->Attribute("z") )
+			p.z = StringConverter::parseReal( XMLPosition->Attribute("z") );
+            
+		light->setPosition( p );
+	}
+
+	//castShadows		(true | false) "true"
+	light->setCastShadows( true );
+	if( XMLLight->Attribute("visible") )
+		if( String(XMLLight->Attribute("visible")) == "false" )
+				light->setCastShadows( false );
+			
+	//visible			(true | false) "true"		
+	light->setVisible( true );
+	if( XMLLight->Attribute("visible") )
+		if( String(XMLLight->Attribute("visible")) == "false" )
+			light->setVisible( false );
+
+	return light;
+}
+//-----------------------------------------------------------------------
+void TestCullingDotSceneApplication::createScene(void)
+{
+	mSceneMgr->setAmbientLight(ColourValue(0.09f, 0.09f, 0.09f));
+	mSceneMgr->setSkyBox(true, "Examples/MorningSkyBox" );
+		
+	//This is default, though, set it anyway :)
+	ResourceGroupManager::getSingleton().setWorldResourceGroupName("General");
+	mSceneMgr->setWorldGeometry( "MyScene.scene" );
+	//mSceneMgr->SetOctreeVisible( 1 );
+		
+	ParseDotScene( "MyScene.scene", "General" );
+	// CEGUI setup
+	setupGui();
+}
+//-----------------------------------------------------------------------
+void TestCullingDotSceneApplication::setupGui( void )
+{
+	 mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, ST_GENERIC);
+     mGUISystem = new CEGUI::System(mGUIRenderer);
+
+	 // Mouse
+     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
+     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
+	 mGUISystem->setDefaultMouseCursor(
+                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
+
+	 CEGUI::MouseCursor::getSingleton().show( );
+     
+	/* CEGUI::Window* sheet = 
+            CEGUI::WindowManager::getSingleton().loadWindowLayout(
+                (CEGUI::utf8*)"ogregui.layout"); 
+
+     mGUISystem->setGUISheet(sheet);*/
+}
+//-----------------------------------------------------------------------
+void TestCullingDotSceneApplication::createFrameListener(void)
+{
+	mFrameListener= new MouseQueryListener(mWindow, mCamera, mSceneMgr, mGUIRenderer);
+	mFrameListener->showDebugOverlay(true);
+	mRoot->addFrameListener(mFrameListener);
+}
+//-----------------------------------------------------------------------
+void TestCullingDotSceneApplication::chooseSceneManager(void)
+{
+	mSceneMgr = mRoot->getSceneManager(ST_GENERIC);
+
+}
+//-----------------------------------------------------------------------
+void TestCullingDotSceneApplication::createViewports(void)
+{
+	// Create one viewport, entire window
+	Viewport* vp = mWindow->addViewport(mCamera);
+	// Look back along -Z
+    mCamera->lookAt(Vector3(0, 0, -300));
+	mCamera->setPosition(0 , 100, 600);
+}
+
+/***********************************************/
+/* MouseQueryListener implementation           */
+/***********************************************/
+
+//-----------------------------------------------------------------------
+MouseQueryListener::MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer)
+        : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer), 
+		mShutdownRequested(false)
+{
+
+	// Setup default variables
+//	mCurrentObject = NULL;
+	mLMouseDown = false;
+	mRMouseDown = false;
+	mSceneMgr = sceneManager;
+
+    // Reduce move speed
+	mMoveSpeed = 50;
+	mRotateSpeed *= 2;
+
+	mCurrentAlgorithm = OcclusionCullingSceneTraverser::RENDER_COHERENT;
+	mThreshold = 0;
+    
+	// Register this so that we get mouse events.
+	mEventProcessor->addMouseListener(this);
+	mEventProcessor->addMouseMotionListener(this);
+	mEventProcessor->addKeyListener(this);
+
+	// show overlay
+	Overlay* pOver = OverlayManager::getSingleton().getByName("Example/OcclusionCullingDemoOverlay"); 
+
+	mAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/AlgorithmInfo");
+	mThresholdInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/ThresholdInfo");
+	mFrustumCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/FrustumCulledNodesInfo");
+	mQueryCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/QueryCulledNodesInfo");
+    mTraversedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/TraversedNodesInfo");
+
+	mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
+	mThresholdInfo->setCaption(": 0");
+	mFrustumCulledNodesInfo->setCaption(": 0");
+	mQueryCulledNodesInfo->setCaption(": 0");
+	mTraversedNodesInfo->setCaption(": 0");
+
+    pOver->show();
+} // MouseQueryListener
+//-----------------------------------------------------------------------
+void MouseQueryListener::mouseMoved (MouseEvent *e)
+{
+	// Update CEGUI with the mouse motion
+    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() * mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::mousePressed(MouseEvent* e)
+{
+     // Left mouse button down
+     if (e->getButtonID() & InputEvent::BUTTON0_MASK)
+     {
+		 CEGUI::MouseCursor::getSingleton().hide( );
+		 mLMouseDown = true;
+     } // if
+     // Right mouse button down
+     else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
+     {
+         CEGUI::MouseCursor::getSingleton().hide( );
+         mRMouseDown = true;
+     } // else if
+} // mousePressed
+
+ //-----------------------------------------------------------------------
+void MouseQueryListener::mouseReleased(MouseEvent* e)
+{
+    // Left mouse button up
+    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
+    {
+		CEGUI::MouseCursor::getSingleton().show( );
+        mLMouseDown = false;
+    }
+    // Right mouse button up
+    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
+    {
+        CEGUI::MouseCursor::getSingleton().show( );
+        mRMouseDown = false;
+    }
+} 
+//-----------------------------------------------------------------------
+void MouseQueryListener::mouseDragged (MouseEvent *e)
+ {
+	 // If we are dragging the left mouse button.	 
+	 if ( mLMouseDown )
+	 {
+		mCamera->yaw( -e->getRelX() * mRotateSpeed );
+		mCamera->pitch( -e->getRelY() * mRotateSpeed );
+     }
+	 	 
+	 // If we are dragging the right mouse button.
+	 if ( mRMouseDown )
+	 {
+		 Vector3 translation;
+		 translation.x += -e->getRelX() * 0.13;
+		 translation.y -= -e->getRelY() * 0.13;
+
+		 mCamera->moveRelative(translation);		
+	 }
+}
+//-----------------------------------------------------------------------
+bool MouseQueryListener::frameEnded(const FrameEvent& evt)
+{
+	if (mShutdownRequested)
+		return false;
+
+    if (timeDelay >= 0) 
+        timeDelay -= evt.timeSinceLastFrame;
+
+    KEY_PRESSED(KC_SPACE, 0.3, changeAlgorithm());
+
+	KEY_PRESSED(KC_SUBTRACT, 0.0, changeThreshold(-10));
+	KEY_PRESSED(KC_ADD, 0, changeThreshold(10));
+	//KEY_PRESSED(KC_T, 1, change);
+      
+	changeStats();
+
+    return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);        
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeThreshold(int incr)
+{
+	mThreshold += incr; if(mThreshold < 0) mThreshold = 0;
+	
+	char str[100]; sprintf(str,": %d", mThreshold);
+
+	mSceneMgr->setOption("Threshold", &mThreshold); 
+	mThresholdInfo->setCaption(str);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeAlgorithm()
+{
+    mCurrentAlgorithm = ++mCurrentAlgorithm % OcclusionCullingSceneTraverser::NUM_RENDERMODES;
+
+	mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
+	mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeStats()
+{
+	unsigned int opt = 0;
+	char str[100];
+	
+	mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt); 
+	mFrustumCulledNodesInfo->setCaption(str);
+	
+	mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt); 
+	mQueryCulledNodesInfo->setCaption(str);
+	
+	mSceneMgr->getOption("NumTraversedNodes", &opt); sprintf(str,": %d", opt); 
+	mTraversedNodesInfo->setCaption(str);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyPressed(KeyEvent* e)
+{
+	if(e->getKey() == KC_ESCAPE)
+    {
+		mShutdownRequested = true;
+		e->consume();
+		return;
+	}
+
+	CEGUI::System::getSingleton().injectKeyDown(e->getKey());
+	CEGUI::System::getSingleton().injectChar(e->getKeyChar());
+	e->consume();
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyReleased(KeyEvent* e)
+{
+	CEGUI::System::getSingleton().injectKeyUp(e->getKey());
+	e->consume();
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyClicked(KeyEvent* e) 
+{
+	// Do nothing
+	e->consume();
+}
+//-----------------------------------------------------------------------
+INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
+{
+    // Create application object
+    TestCullingDotSceneApplication app;
+
+	try 
+	{
+        app.go();
+    } 
+	catch( Ogre::Exception& e ) 
+	{
+        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
+    }	
+
+    return 0;
+}
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingDotScene/TestCullingDotSceneApplication.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingDotScene/TestCullingDotSceneApplication.h	(revision 42)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingDotScene/TestCullingDotSceneApplication.h	(revision 42)
@@ -0,0 +1,110 @@
+/**
+    \file 
+        TestCullingApplication.h
+*/
+#include "CEGUIForwardRefs.h"
+#include "ExampleApplication.h"
+#include "OgreLight.h"
+#include "OgreOcclusionCullingSceneTraverser.h"
+
+Real timeDelay = 0;
+#define KEY_PRESSED(_key,_timeDelay, _macro) \
+{ \
+    if (mInputDevice->isKeyDown(_key) && timeDelay <= 0) \
+{ \
+    timeDelay = _timeDelay; \
+    _macro ; \
+} \
+}
+
+String mCurrentAlgorithmCaptions[OcclusionCullingSceneTraverser::NUM_RENDERMODES] = 
+{
+    "Cull Frustum", 
+	"Stop and Wait", 
+	"Coherent Occlusion Culling"
+};
+
+class MouseQueryListener : public ExampleFrameListener, public MouseListener, public MouseMotionListener
+{
+public:
+
+    MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer);
+
+
+    ~MouseQueryListener( )
+    {
+    }
+
+//	bool frameStarted(const FrameEvent& evt);
+	bool frameEnded(const FrameEvent& evt);
+
+    /* MouseListener callbacks. */
+    virtual void mouseClicked(MouseEvent* e) { }
+    virtual void mouseEntered(MouseEvent* e) { }
+    virtual void mouseExited(MouseEvent* e)  { }
+
+    // This is when the mouse button goes DOWN.
+    virtual void mousePressed(MouseEvent* e);
+
+    // This is when the mouse button is let UP.
+    virtual void mouseReleased(MouseEvent* e);
+
+    /* MouseMotionListener callbacks */
+    virtual void mouseMoved (MouseEvent *e);
+   
+    // This is when the mouse is clicked, held and dragged.
+    virtual void mouseDragged (MouseEvent *e);
+
+    void keyPressed(KeyEvent* e);
+
+	void keyReleased(KeyEvent* e);
+	void keyClicked(KeyEvent* e);
+
+	void changeAlgorithm();
+	void changeThreshold(int incr);
+	void changeStats();
+
+protected:
+    bool mLMouseDown, mRMouseDown;     // True if the mouse buttons are down
+    SceneManager *mSceneMgr;           // A pointer to the scene manager
+    
+	CEGUI::Renderer *mGUIRenderer;     // cegui renderer
+	
+	bool mShutdownRequested;
+	int mCurrentAlgorithm;
+	int mThreshold;
+
+	OverlayElement *mAlgorithmInfo;
+	OverlayElement *mThresholdInfo;
+	OverlayElement *mFrustumCulledNodesInfo;
+	OverlayElement *mQueryCulledNodesInfo;
+    OverlayElement *mTraversedNodesInfo;
+	OverlayElement *mSceneNodesInfo;
+};
+
+
+class TestCullingDotSceneApplication : public ExampleApplication
+{
+public:
+	//~TestCullingDotSceneApplication();
+
+protected:
+	void createScene(void);
+	void createFrameListener(void);
+	void setupGui(void);
+	void ParseDotScene( const String &SceneName, const String& groupName );
+	Light* LoadLight( TiXmlElement *XMLLight );
+
+	virtual void createViewports(void);
+
+	CEGUI::OgreCEGUIRenderer *mGUIRenderer;
+	CEGUI::System *mGUISystem;
+
+private:
+	void chooseSceneManager(void);
+
+	//SceneManager* mSceneMgr;
+	//Entity* mShip;
+	//SceneNode* mShipNode;
+};
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.dsw
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.dsw	(revision 47)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.dsw	(revision 47)
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "Demo_TestCullingTerrain"=.\TestCullingTerrainApplication.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrain.vcproj
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrain.vcproj	(revision 48)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrain.vcproj	(revision 48)
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="TestCullingTerrain"
+	ProjectGUID="{248F19A6-2FE0-4F5D-8928-E0EA10609887}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\bin\$(ConfigurationName)"
+			IntermediateDirectory="..\obj\$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(OGRE_PATH)\Dependencies\include&quot;;&quot;$(OGRE_PATH)\OgreMain\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include\CEGUI&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\include&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\include&quot;;../include"
+				PreprocessorDefinitions="_WINDOWS;_STLP_USE_DYNAMIC_LIB;OGRE_LIBRARY_IMPORTS;_DEBUG;WIN32;_STLP_DEBUG;PLUGIN_TERRAIN_IMPORTS"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="Plugin_OctreeSceneManager.lib OGREMain_d.LIB CEGUIBase_d.lib OgreGUIRenderer_d.lib Plugin_DotSceneManager.lib"
+				OutputFile="$(OGRE_PATH)/Samples/Common/bin/Debug/TestCullingTerrain.exe"
+				LinkIncremental="2"
+				AdditionalLibraryDirectories="&quot;$(OGRE_PATH)\Dependencies\Lib\Debug&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\bin\debug&quot;;&quot;$(OGRE_PATH)\OgreMain\Lib\Debug&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\bin\debug&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\lib&quot;"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/TestCullingTerrain.pdb"
+				SubSystem="2"
+				ImportLibrary=""
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\..\Samples\Common\Include, ..\..\..\OgreMain\include"
+				PreprocessorDefinitions="_WINDOWS,_STLP_USE_DYNAMIC_LIB,OGRE_LIBRARY_IMPORTS,_RELEASE,WIN32,_STLP_RELEASE"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="OGREMain.LIB"
+				OutputFile="..\..\..\Samples\Common\Bin\Release\TestCullingTerrain.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="..\..\..\OgreMain\Lib\Release"
+				GenerateDebugInformation="TRUE"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath=".\TerrainContentGenerator.cpp">
+			</File>
+			<File
+				RelativePath=".\TestCullingTerrainApplication.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath=".\TerrainContentGenerator.h">
+			</File>
+			<File
+				RelativePath=".\TestCullingTerrainApplication.h">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TerrainContentGenerator.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TerrainContentGenerator.cpp	(revision 55)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TerrainContentGenerator.cpp	(revision 55)
@@ -0,0 +1,96 @@
+/**
+    \file 
+        TerrainContentGenerator.cpp
+    \brief
+        Creates content for the terrain,
+*/
+#include "TerrainContentGenerator.h"
+
+//-----------------------------------------------------------------------
+TerrainContentGenerator::TerrainContentGenerator( SceneManager *sm, RayQueryExecutor *rayQueryEx )
+{
+	mSceneMgr = sm;
+	mRayQueryExecutor = rayQueryEx;
+
+	mMinTranslation = Vector3(-70.0f, -70.0f, 0.0f);
+	mMaxTranslation = Vector3(70.0f, 70.0f, 600.0f);
+
+	mMinAngle = 0;
+	mMaxAngle = 360;
+
+	mCount = 0;
+}
+//-----------------------------------------------------------------------
+void TerrainContentGenerator::generateScene( int numObjects )
+{
+	srand (time (0));
+	
+	Vector3 rotationRatio;
+	Vector3 translationRatio;
+
+	for(int i=0; i < numObjects; i++)
+	{
+		rotationRatio.x = rand() / (float) RAND_MAX;
+		rotationRatio.y = rand() / (float) RAND_MAX;
+		rotationRatio.z = rand() / (float) RAND_MAX;
+
+		translationRatio.x = rand() / (float) RAND_MAX;
+		translationRatio.y = rand() / (float) RAND_MAX;
+		translationRatio.z = rand() / (float) RAND_MAX;
+
+		generateSceneObject(translationRatio, rotationRatio, i, "sphere.mesh");
+	}
+}
+//-----------------------------------------------------------------------
+void TerrainContentGenerator::generateSceneObject(const Vector3 &translationRatio, 
+					 const Vector3 &rotationRatio, const int idx, const String& entName)
+{
+	// Setup the ray scene query
+	Real rotation = mMinAngle + rotationRatio.x * (mMaxAngle - mMinAngle);
+	Vector3 translation = mMinTranslation + translationRatio * (mMaxTranslation - mMinTranslation);
+
+	translation.y = 5000;
+    
+	Vector3 queryResult;
+
+	if(mRayQueryExecutor->executeRayQuery(&queryResult, translation, Vector3::NEGATIVE_UNIT_Y))
+	{
+		char name[16];
+		sprintf( name, "%s%d", entName.c_str(), mCount++);
+
+		Entity *ent = mSceneMgr->createEntity(name, entName);
+		SceneNode *currentObject = mSceneMgr->getRootSceneNode( )->createChildSceneNode( String(name) + "Node", queryResult);
+		currentObject->attachObject(ent);
+		currentObject->setScale(0.1f, 0.1f, 0.1f);
+	}
+}
+//-----------------------------------------------------------------------
+RayQueryExecutor::RayQueryExecutor( SceneManager *sm )
+{
+	mRaySceneQuery = sm->createRayQuery(Ray());
+}
+//-----------------------------------------------------------------------
+RayQueryExecutor::~RayQueryExecutor()
+{
+	delete mRaySceneQuery;
+}
+//-----------------------------------------------------------------------
+bool RayQueryExecutor::executeRayQuery( Vector3 *result, const Vector3 &pos, const Vector3 &dir )
+{
+	Ray ray(pos, dir);
+    mRaySceneQuery->setRay(ray);
+
+    // Perform the scene query
+    RaySceneQueryResult &queryResult = mRaySceneQuery->execute();
+    RaySceneQueryResult::iterator it = queryResult.begin( );
+
+	if (it != queryResult.end() && it->worldFragment)
+	{
+		SceneQuery::WorldFragment* wf = it->worldFragment;
+
+		*result = wf->singleIntersection; 
+		return true;
+	}
+
+	return false;
+}
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.cpp	(revision 55)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.cpp	(revision 55)
@@ -0,0 +1,421 @@
+/**
+    \file 
+        TestCullingTerrainApplication.cpp
+    \brief
+        Tests the occlusion culling algorithm
+*/
+
+#include <OgreNoMemoryMacros.h>
+#include <CEGUI/CEGUI.h>
+#include <../CEGUIRenderer/include/OgreCEGUIRenderer.h>
+#include <../CEGUIRenderer/include/OgreCEGUIResourceProvider.h>
+#include <../CEGUIRenderer/include/OgreCEGUITexture.h>
+#include <OgreMemoryMacros.h>
+
+#include "Ogre.h"
+#include "TestCullingTerrainApplication.h"
+#include "OgreOcclusionCullingSceneTraverser.h"
+
+#define WIN32_LEAN_AND_MEAN
+#include "windows.h"
+
+
+/************************************************/
+/* TestCullingTerrainApplication implementation */
+/************************************************/
+TestCullingTerrainApplication::~TestCullingTerrainApplication()
+{
+	delete mRayQueryExecutor;
+	delete mTerrainContentGenerator;
+}
+
+//-----------------------------------------------------------------------
+void TestCullingTerrainApplication::createCamera( void )
+{
+	// Create the camera
+	mCamera = mSceneMgr->createCamera("PlayerCam");
+
+	// Position it at 500 in Z direction
+	mCamera->setPosition(Vector3(128,25,128));
+
+	// Look back along -Z
+    mCamera->lookAt(Vector3(0,0,-300));
+    mCamera->setNearClipDistance(1);
+    mCamera->setFarClipDistance(1000);
+}
+//-----------------------------------------------------------------------
+void TestCullingTerrainApplication::generateSceneObject(const Vector3 &translationRatio, 
+					 const Vector3 &rotationRatio, const int idx, const String& entName)
+{
+	// Setup the ray scene query
+	/*Vector3 rotation = mMinAngle + rotationRatio * (mMaxAngle - mMinAngle);
+	Vector3 translation = mMinTranslation + translationRatio * (mMaxTranslation - mMinTranslation);
+
+	translation.y = 5000;
+    Ray ray(translation, Vector3::NEGATIVE_UNIT_Y);
+    mRaySceneQuery->setRay(ray);
+
+    // Execute query
+	RaySceneQueryResult &result = mRaySceneQuery->execute();
+	RaySceneQueryResult::iterator itr = result.begin( );
+
+	// Get results, create a node/entity on the position
+	if ( itr != result.end() && itr->worldFragment )
+	{
+		char name[16];
+		sprintf( name, "%s%d", entName.c_str(), mCount++ );
+
+		Entity *ent = mSceneMgr->createEntity( name, entName );
+		SceneNode currentObject = mSceneMgr->getRootSceneNode( )->createChildSceneNode( String(name) + "Node", itr->worldFragment->singleIntersection );
+		currentObject->attachObject( ent );
+		currentObject->setScale( 0.1f, 0.1f, 0.1f );
+	}*/
+}
+
+//-----------------------------------------------------------------------
+void TestCullingTerrainApplication::createScene( void )
+{
+	mRayQueryExecutor = new RayQueryExecutor(mSceneMgr);
+	mTerrainContentGenerator = new TerrainContentGenerator(mSceneMgr, mRayQueryExecutor);
+	// Set ambient light
+	mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
+	
+	// Create a light
+	Light* l = mSceneMgr->createLight("MainLight");
+	// Accept default settings: point light, white diffuse, just set position
+	// NB I could attach the light to a SceneNode if I wanted it to move automatically with
+	//  other objects, but I don't
+	l->setPosition(20,80,50);
+
+	// --Fog
+	// NB it's VERY important to set this before calling setWorldGeometry 
+	// because the vertex program picked will be different
+	ColourValue fadeColour(0.93, 0.86, 0.76);
+	mWindow->getViewport(0)->setBackgroundColour(fadeColour);
+	//mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000);
+
+	// Create a skybox
+    //mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 500, false);
+	//mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8, 500, false );
+
+	/*	// Define the required skyplane
+	Plane plane;
+	// 5000 world units from the camera
+	plane.d = 5000;
+	// Above the camera, facing down
+	plane.normal = -Vector3::UNIT_Y;
+	// Create the plane 10000 units wide, tile the texture 3 times
+    mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane",10000,3);*/
+
+	std::string terrain_cfg("terrain.cfg");
+#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
+	terrain_cfg = mResourcePath + terrain_cfg;
+#endif
+	mSceneMgr -> setWorldGeometry( terrain_cfg );
+	// Infinite far plane?
+	if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))
+	{
+		mCamera->setFarClipDistance(0);
+	}
+
+	// Set a nice viewpoint
+	mCamera->setPosition(707,2500,528);
+	mCamera->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329));
+
+	// CEGUI setup
+	setupGui();
+}
+//-----------------------------------------------------------------------
+void TestCullingTerrainApplication::setupGui( void )
+{
+	 mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, ST_EXTERIOR_CLOSE);
+     mGUISystem = new CEGUI::System(mGUIRenderer);
+
+	 // Mouse
+     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
+     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
+	 mGUISystem->setDefaultMouseCursor(
+                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
+
+	 CEGUI::MouseCursor::getSingleton().show( );
+}
+//-----------------------------------------------------------------------
+void TestCullingTerrainApplication::createFrameListener(void)
+{
+	mFrameListener= new MouseQueryListener(mWindow, mCamera, mSceneMgr, mGUIRenderer, mRayQueryExecutor);
+	mFrameListener->showDebugOverlay(true);
+	mRoot->addFrameListener(mFrameListener);
+}
+//-----------------------------------------------------------------------
+void TestCullingTerrainApplication::chooseSceneManager(void)
+{
+    //mSceneMgr = mRoot->getSceneManager(ST_GENERIC);
+	mSceneMgr = mRoot->getSceneManager(ST_EXTERIOR_CLOSE);
+}
+
+/***********************************************/
+/* MouseQueryListener implementation           */
+/***********************************************/
+//-----------------------------------------------------------------------
+MouseQueryListener::MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, RayQueryExecutor *rqe)
+        : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer), mShutdownRequested(false), mRayQueryExecutor(rqe)
+{
+
+	// Setup default variables
+	mCurrentObject = NULL;
+	mLMouseDown = false;
+	mRMouseDown = false;
+	mSceneMgr = sceneManager;
+
+    // Reduce move speed
+	mMoveSpeed = 50;
+	mRotateSpeed *= 2;
+
+	mCurrentAlgorithm = OcclusionCullingSceneTraverser::RENDER_COHERENT;
+	mThreshold = 0;
+    
+	// Register this so that we get mouse events.
+	mEventProcessor->addMouseListener(this);
+	mEventProcessor->addMouseMotionListener(this);
+	mEventProcessor->addKeyListener(this);
+
+	mRaySceneQuery = mSceneMgr->createRayQuery(Ray());
+
+	// show overlay
+	Overlay* pOver = OverlayManager::getSingleton().getByName("Example/OcclusionCullingDemoOverlay"); 
+
+	mAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/AlgorithmInfo");
+	mThresholdInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/ThresholdInfo");
+	mFrustumCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/FrustumCulledNodesInfo");
+	mQueryCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/QueryCulledNodesInfo");
+    mTraversedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/TraversedNodesInfo");
+	mSceneNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/SceneNodesInfo");
+	mHierarchyNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/HierarchyNodesInfo");
+	mRenderedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/RenderedNodesInfo");
+
+	mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
+	mThresholdInfo->setCaption(": 0");
+	mFrustumCulledNodesInfo->setCaption(": 0");
+	mQueryCulledNodesInfo->setCaption(": 0");
+	mTraversedNodesInfo->setCaption(": 0");
+	mSceneNodesInfo->setCaption(": 0");
+	mHierarchyNodesInfo->setCaption(": 0");
+	mRenderedNodesInfo->setCaption(": 0");
+		
+    pOver->show();
+} 
+//-----------------------------------------------------------------------
+MouseQueryListener::~MouseQueryListener( )
+{
+	delete mRaySceneQuery;
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::mouseMoved (MouseEvent *e)
+{
+	// Update CEGUI with the mouse motion
+    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() * mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::mousePressed(MouseEvent* e)
+{
+     // Left mouse button down
+     if (e->getButtonID() & InputEvent::BUTTON0_MASK)
+     {
+		 CEGUI::MouseCursor::getSingleton().hide( );
+
+		 // Setup the ray scene query
+         Ray mouseRay = mCamera->getCameraToViewportRay( e->getX(), e->getY() );
+         mRaySceneQuery->setRay( mouseRay );
+
+         // Execute query
+         RaySceneQueryResult &result = mRaySceneQuery->execute();
+         RaySceneQueryResult::iterator itr = result.begin( );
+
+         // Get results, create a node/entity on the position
+         if ( itr != result.end() && itr->worldFragment )
+         {
+			 char name[16];
+             sprintf( name, "Robot%d", mCount++ );
+
+             Entity *ent = mSceneMgr->createEntity( name, "robot.mesh" );
+             mCurrentObject = mSceneMgr->getRootSceneNode( )->createChildSceneNode( String(name) + "Node", itr->worldFragment->singleIntersection );
+             mCurrentObject->attachObject( ent );
+             mCurrentObject->setScale( 0.1f, 0.1f, 0.1f );
+         }
+
+         mLMouseDown = true; 
+     }
+     // Right mouse button down
+     else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
+     {
+         CEGUI::MouseCursor::getSingleton().hide( );
+         mRMouseDown = true;
+     } // else if
+} // mousePressed
+
+ //-----------------------------------------------------------------------
+void MouseQueryListener::mouseReleased(MouseEvent* e)
+{
+    // Left mouse button up
+    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
+    {
+		CEGUI::MouseCursor::getSingleton().show( );
+        mLMouseDown = false;
+    }
+    // Right mouse button up
+    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
+    {
+        CEGUI::MouseCursor::getSingleton().show( );
+        mRMouseDown = false;
+    }
+} 
+//-----------------------------------------------------------------------
+void MouseQueryListener::mouseDragged (MouseEvent *e)
+ {
+	 // If we are dragging the left mouse button.	 	 
+	 if ( mLMouseDown )
+     {
+		 Ray mouseRay = mCamera->getCameraToViewportRay( e->getX(), e->getY() );
+		 mRaySceneQuery->setRay( mouseRay );
+
+		 RaySceneQueryResult &result = mRaySceneQuery->execute();
+		 RaySceneQueryResult::iterator itr = result.begin( );
+
+		 if ( itr != result.end() && itr->worldFragment )
+		 {
+			 mCurrentObject->setPosition( itr->worldFragment->singleIntersection );
+		 } 
+     }
+	 // If we are dragging the right mouse button.
+	 if ( mRMouseDown )
+	 {
+		 mCamera->yaw( -e->getRelX() * mRotateSpeed );
+		 mCamera->pitch( -e->getRelY() * mRotateSpeed );
+	 }
+}
+//-----------------------------------------------------------------------
+bool MouseQueryListener::frameStarted(const FrameEvent &evt)
+{
+	// clamp to terrain
+	Vector3 camPos = mCamera->getPosition( );
+    Ray cameraRay( Vector3(camPos.x, 5000.0f, camPos.z), Vector3::NEGATIVE_UNIT_Y );
+    mRaySceneQuery->setRay( cameraRay );
+
+    // Perform the scene query
+    RaySceneQueryResult &queryResult = mRaySceneQuery->execute();
+    RaySceneQueryResult::iterator it = queryResult.begin( );
+
+	if (it != queryResult.end() && it->worldFragment)
+	{
+		SceneQuery::WorldFragment* wf = it->worldFragment;
+
+		mCamera->setPosition(mCamera->getPosition().x, wf->singleIntersection.y + 10, 
+			mCamera->getPosition().z);
+	}
+	 
+	return ExampleFrameListener::frameStarted(evt);
+}
+//-----------------------------------------------------------------------
+bool MouseQueryListener::frameEnded(const FrameEvent& evt)
+{
+	if (mShutdownRequested)
+		return false;
+
+    if (timeDelay >= 0) 
+        timeDelay -= evt.timeSinceLastFrame;
+
+    KEY_PRESSED(KC_SPACE, 0.3, changeAlgorithm());
+
+	KEY_PRESSED(KC_SUBTRACT, 0, changeThreshold(-10));
+	KEY_PRESSED(KC_ADD, 0, changeThreshold(10));
+	//KEY_PRESSED(KC_T, 1, change);
+      
+	changeStats();
+
+    return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);        
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeThreshold(int incr)
+{
+	mThreshold += incr; if(mThreshold < 0) mThreshold = 0;
+	
+	char str[100]; sprintf(str,": %d", mThreshold);
+
+	mSceneMgr->setOption("Threshold", &mThreshold); 
+	mThresholdInfo->setCaption(str);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeAlgorithm()
+{
+    mCurrentAlgorithm = ++mCurrentAlgorithm % OcclusionCullingSceneTraverser::NUM_RENDERMODES;
+
+	mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
+	mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeStats()
+{
+	unsigned int opt = 0;
+	char str[100];
+	
+	mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt); 
+	mFrustumCulledNodesInfo->setCaption(str);
+	
+	mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt); 
+	mQueryCulledNodesInfo->setCaption(str);
+	
+	mSceneMgr->getOption("NumTraversedNodes", &opt); sprintf(str,": %d", opt); 
+	mTraversedNodesInfo->setCaption(str);
+
+	mSceneMgr->getOption("NumSceneNodes", &opt); sprintf(str,": %d", opt); 
+	mSceneNodesInfo->setCaption(str);
+
+	mSceneMgr->getOption("NumOctreeNodes", &opt); sprintf(str,": %d", opt); 
+	mHierarchyNodesInfo->setCaption(str);
+
+	mSceneMgr->getOption("NumRenderedNodes", &opt); sprintf(str,": %d", opt); 
+	mRenderedNodesInfo->setCaption(str);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyPressed(KeyEvent* e)
+{
+	if(e->getKey() == KC_ESCAPE)
+    {
+		mShutdownRequested = true;
+		e->consume();
+		return;
+	}
+
+	CEGUI::System::getSingleton().injectKeyDown(e->getKey());
+	CEGUI::System::getSingleton().injectChar(e->getKeyChar());
+	e->consume();
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyReleased(KeyEvent* e)
+{
+	CEGUI::System::getSingleton().injectKeyUp(e->getKey());
+	e->consume();
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyClicked(KeyEvent* e) 
+{
+	// Do nothing
+	e->consume();
+}
+//-----------------------------------------------------------------------
+INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
+{
+    // Create application object
+    TestCullingTerrainApplication app;
+
+	try 
+	{
+        app.go();
+    } 
+	catch( Ogre::Exception& e ) 
+	{
+        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
+    }	
+
+    return 0;
+}
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.dsp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.dsp	(revision 47)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.dsp	(revision 47)
@@ -0,0 +1,109 @@
+# Microsoft Developer Studio Project File - Name="Demo_TestCullingTerrainApplication" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=Demo_TestCullingTerrainApplication - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "TestCullingTerrainApplication.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "TestCullingTerrainApplication.mak" CFG="Demo_TestCullingTerrainApplication - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "Demo_TestCullingTerrainApplication - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "Demo_TestCullingTerrainApplication - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "Demo_TestCullingTerrainApplication - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "..\bin\Release"
+# PROP BASE Intermediate_Dir "..\obj\Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\bin\Release"
+# PROP Intermediate_Dir "..\obj\Release"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /Zi /Od /I "." /I "$(OGRE_PATH)\OgreMain\include" /I "$(OGRE_PATH)\Samples/Common/include" /D "NDEBUG" /D "_MBCS" /D "_WINDOWS" /D "WIN32" /YX /FD /Zm1000 /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OgreMain.lib /nologo /subsystem:windows /machine:I386 /out:"$(OGRE_PATH)\Samples\Common\Bin\Release\Demo_TestCullingTerrainApplication.exe" /libpath:"$(OGRE_PATH)\OgreMain\lib\release" 
+# SUBTRACT LINK32 /profile /debug
+
+!ELSEIF  "$(CFG)" == "Demo_TestCullingTerrainApplication - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "..\bin\Debug"
+# PROP BASE Intermediate_Dir "..\obj\Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "..\bin\Debug"
+# PROP Intermediate_Dir "..\obj\Debug"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "$(OGRE_PATH)\OgreMain\include" /I "$(OGRE_PATH)\Samples/Common/include" /D "_MBCS" /D "_WINDOWS" /D "_DEBUG" /D "WIN32" /FD /GZ /Zm1000 /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OgreMain_d.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"LIBCMT" /out:"$(OGRE_PATH)\Samples\Common\Bin\Debug\Demo_TestCullingTerrainApplication.exe" /pdbtype:sept /libpath:"$(OGRE_PATH)\OgreMain\lib\debug" 
+# SUBTRACT LINK32 /verbose
+
+!ENDIF 
+
+# Begin Target
+
+# Name "Demo_TestCullingTerrainApplication - Win32 Release"
+# Name "Demo_TestCullingTerrainApplication - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=TestCullingTerrainApplication.cpp
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TerrainContentGenerator.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TerrainContentGenerator.h	(revision 55)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TerrainContentGenerator.h	(revision 55)
@@ -0,0 +1,46 @@
+/**
+    \file 
+        TerrainContentGenerator.h
+*/
+#include "ExampleApplication.h"
+
+class RayQueryExecutor
+{
+public:
+	RayQueryExecutor( SceneManager *sm );
+	~RayQueryExecutor( );
+	bool executeRayQuery( Vector3 *result, const Vector3 &pos, const Vector3 &dir );
+protected:
+	RaySceneQuery *mRaySceneQuery;
+};
+
+class TerrainContentGenerator
+{
+public:
+	TerrainContentGenerator(  SceneManager *sm, RayQueryExecutor *rayQueryEx );
+	/** generates a the scene hierarchy with random values 
+	@param number of objects to generate
+	*/
+	void generateScene( int numObjects );
+	/** 
+		generates a new scene object 
+		@param tranlationRatio ratio between minimal and maximal possible translation
+		@param rotationRatio ratio between minimal and maximal possible rotation
+		@idx the index of the new object
+		@entName the name of the object entity
+	*/
+	void generateSceneObject( const Vector3 &translationRatio, const Vector3 &rotationRatio, 
+							  const int idx, const String &entName );
+
+protected:
+
+	Real mMinAngle;
+	Real mMaxAngle;
+	Vector3 mMaxTranslation;
+	Vector3 mMinTranslation;
+
+	RayQueryExecutor *mRayQueryExecutor;
+	SceneManager *mSceneMgr;
+	int mCount;		// The number of objects on the screen
+};
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.h	(revision 55)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.h	(revision 55)
@@ -0,0 +1,128 @@
+/**
+    \file 
+        TestCullingTerrainApplication.h
+*/
+#include "CEGUIForwardRefs.h"
+#include "ExampleApplication.h"
+#include "OgreOcclusionCullingSceneTraverser.h"
+#include "TerrainContentGenerator.h"
+
+Real timeDelay = 0;
+#define KEY_PRESSED(_key,_timeDelay, _macro) \
+{ \
+    if (mInputDevice->isKeyDown(_key) && timeDelay <= 0) \
+{ \
+    timeDelay = _timeDelay; \
+    _macro ; \
+} \
+}
+
+String mCurrentAlgorithmCaptions[OcclusionCullingSceneTraverser::NUM_RENDERMODES] = 
+{
+    "Cull Frustum", 
+	"Stop and Wait", 
+	"Coherent Occlusion Culling"
+};
+
+class MouseQueryListener : public ExampleFrameListener, public MouseListener, public MouseMotionListener
+{
+public:
+
+    MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, 
+		CEGUI::Renderer *renderer, RayQueryExecutor *rqe);
+
+
+    ~MouseQueryListener( );
+
+	bool frameStarted(const FrameEvent& evt);
+	bool frameEnded(const FrameEvent& evt);
+
+    /* MouseListener callbacks. */
+    virtual void mouseClicked(MouseEvent* e) { }
+    virtual void mouseEntered(MouseEvent* e) { }
+    virtual void mouseExited(MouseEvent* e)  { }
+
+    // This is when the mouse button goes DOWN.
+    virtual void mousePressed(MouseEvent* e);
+
+    // This is when the mouse button is let UP.
+    virtual void mouseReleased(MouseEvent* e);
+
+    /* MouseMotionListener callbacks */
+    virtual void mouseMoved (MouseEvent *e);
+   
+    // This is when the mouse is clicked, held and dragged.
+    virtual void mouseDragged (MouseEvent *e);
+
+    void keyPressed(KeyEvent* e);
+
+	void keyReleased(KeyEvent* e);
+	void keyClicked(KeyEvent* e);
+
+	void changeAlgorithm();
+	void changeThreshold(int incr);
+	void changeStats();
+
+protected:
+    bool mLMouseDown, mRMouseDown;     // True if the mouse buttons are down
+    SceneManager *mSceneMgr;           // A pointer to the scene manager
+    
+	CEGUI::Renderer *mGUIRenderer;     // cegui renderer
+	
+	bool mShutdownRequested;
+	int mCurrentAlgorithm;
+	int mThreshold;
+
+	OverlayElement *mAlgorithmInfo;
+	OverlayElement *mThresholdInfo;
+	OverlayElement *mFrustumCulledNodesInfo;
+	OverlayElement *mQueryCulledNodesInfo;
+    OverlayElement *mTraversedNodesInfo;
+	OverlayElement *mHierarchyNodesInfo;
+	OverlayElement *mSceneNodesInfo;
+	OverlayElement *mRenderedNodesInfo;
+
+	SceneNode *mCurrentObject;         // The newly created object
+	RaySceneQuery *mRaySceneQuery;     // The ray scene query pointer
+	int mCount;                        // The number of robots on the screen
+
+	RayQueryExecutor *mRayQueryExecutor;
+};
+
+
+class TestCullingTerrainApplication : public ExampleApplication
+{
+public:
+	~TestCullingTerrainApplication();
+
+protected:
+	void createScene(void);
+	void createFrameListener(void);
+	void setupGui(void);
+	virtual void createCamera(void);
+
+	/** 
+		generates a new scene object 
+		@param tranlationRatio ratio between minimal and maximal possible translation
+		@param rotationRatio ratio between minimal and maximal possible rotation
+		@idx the index of the new object
+		@entName the name of the object entity
+	*/
+	void generateSceneObject(const Vector3 &translationRatio, const Vector3 &rotationRatio, 
+							 const int idx, const String &entName);
+
+	CEGUI::OgreCEGUIRenderer *mGUIRenderer;
+	CEGUI::System *mGUISystem;
+	RayQueryExecutor *mRayQueryExecutor;
+	TerrainContentGenerator *mTerrainContentGenerator;
+
+	Vector3 mMinTranslation;
+	Vector3 mMaxTranslation;
+
+	Vector3 mMinAngle;
+	Vector3 mMaxAngle;
+
+private:
+	void chooseSceneManager(void);
+};
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingDotSceneManager.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingDotSceneManager.h	(revision 33)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingDotSceneManager.h	(revision 33)
@@ -0,0 +1,47 @@
+#ifndef _OcclusionCullingDotSceneManager_H__
+#define _OcclusionCullingDotSceneManager_H__
+
+#include "OgreSceneNode.h"
+#include "DotSceneManager.h"
+#include "OgreOcclusionCullingSceneTraverser.h"
+
+#include "OgrePrerequisites.h"
+
+using namespace std;
+
+namespace Ogre {
+	
+	/**
+		Class which implements a scene mangager which uses occlusion queries for culling occluded objects
+	*/
+	class OcclusionCullingDotSceneManager: public DotSceneManager
+	{
+	public:
+		OcclusionCullingDotSceneManager();
+		~OcclusionCullingDotSceneManager();
+	
+		void _renderVisibleObjects(void);
+		void _findVisibleObjects(Camera* cam, bool onlyShadowCasters);
+		void _updateSceneGraph(Camera* cam);
+
+		/** Sets the given option for the SceneManager
+			       @remarks
+			Options are:
+			"Algorithm", int *;			
+		*/
+		virtual bool setOption( const String &, const void * );
+		/** Gets the given option for the Scene Manager.
+	        @remarks
+		    See setOption
+		*/
+		virtual bool getOption( const String &, void * );
+
+		bool getOptionValues( const String & key, StringVector &refValueList );
+		bool getOptionKeys( StringVector &refKeys );
+
+	protected:
+		OcclusionCullingSceneTraverser *mOcclusionCullingSceneTraverser;
+	};
+
+}
+#endif // OcclusionCullingDotSceneManager_H
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/SceneTraverser.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/SceneTraverser.h	(revision 56)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/SceneTraverser.h	(revision 56)
@@ -0,0 +1,134 @@
+#ifndef _OcclusionCullingSceneTraverser_H__
+#define _OcclusionCullingSceneTraverser_H__
+
+#include "OgreSceneNode.h"
+#include "OgreSceneManager.h"
+#include "OgrePrerequisites.h"
+#include "OgreSolidHalfBoundingBox.h"
+#include "OgreCamera.h"
+#include "OgreRenderSystem.h"
+#include <queue>
+
+using namespace std;
+
+namespace Ogre {
+	/**
+		This class implements the compare operator for the priority queue.
+		a lower distance has a higher value in the queue
+	*/
+	template <typename T> class myless
+	{
+	public:
+		myless(Camera *cam) { mCamera = cam; }
+		//bool operator() (HierarchyNode *v1, HierarchyNode *v2) const
+		bool operator() (T v1, T v2) const
+		{
+			return v1->getSquaredViewDepth(mCamera) > v2->getSquaredViewDepth(mCamera);
+		}
+	private:
+		Camera *mCamera;
+	};
+
+	typedef pair<SceneNode *, HardwareOcclusionQuery *> QueryPair;
+	typedef priority_queue<SceneNode *, vector<SceneNode *>, myless<vector<SceneNode *>::value_type> > PriorityQueue;
+	typedef queue<QueryPair> QueryQueue;
+	/**
+		Class which implements a scene mangager which uses occlusion queries for culling occluded objects
+	*/
+	class SceneTraverser
+	{
+	public:
+		/** Construction taking the current scene manager and the current rendersystem as argument
+		@param sm current scene manager
+		@param rsys current render system 
+		*/
+		SceneTraverser(SceneManager *sm, RenderSystem *rsys);
+		~SceneTraverser();
+	
+		/** Sets pointer to the current scene manager.
+		@param the scene manager */
+		void setSceneManager( SceneManager *sm );
+		
+		/** Sets pointer to the current render system 
+		@param the rendersystem */
+		void setRenderSystem( RenderSystem *rsys );
+		
+		/** Sets the root of the scene hierarchy. */
+		void setSceneRoot(SceneNode *root);
+
+		/** Doing some necessary preprocessing.
+		@comment e.g., initialises occlusion queries */
+		//void preprocess( void );
+
+	protected:
+	
+		/** returns true if current node is leaf of the hierarchy */
+		bool isLeaf( ) = 0;
+		
+		void traverseNode( HierarchyNode *node);
+		/** Renders current scene node 
+		@param cam current camera
+		@param node current scene node to be rendered
+		*/
+		void renderNode( HierarchyNode *node);
+			
+		/** Issue a occlusion query for this node. 
+			@param box the axis aligned bounding box of the node
+			@wasVisible if the node was visible in previous frame
+		*/
+		HardwareOcclusionQuery *issueOcclusionQuery( AxisAlignedBox *box, bool wasVisible );
+		/** Returns next available occlusion query or creates new one.
+		@return the next occlusion query
+		*/
+		HardwareOcclusionQuery *getNextOcclusionQuery(void);
+		/** Pulls up the visibility from the child node. 
+		@param the child node 
+		*/
+		void pullUpVisibility(SceneNode *node);
+		/** delete all previously defined occlusion queries */
+		void deleteQueries();
+		/** Renders bounding box of specified node.
+		@param box the bounding box of the scene node to be rendered */
+		void renderBoundingBox( AxisAlignedBox *box );
+		/** Returns one half of the bounding box.
+		@param half the half index of the bouding box (0 or 1)
+		*/
+		SolidHalfBoundingBox *getSolidHalfBoundingBox( int half );
+
+		/** Initialises the distance queue. */
+		virtual void initDistanceQueue(Camera *cam);
+		
+		std::vector<HardwareOcclusionQuery *> mOcclusionQueries;
+		// two halfes of a aabb
+		SolidHalfBoundingBox *mHalfBoundingBox[2];	
+
+		int mCurrentAlgorithm;
+
+		unsigned int mFrameId;
+		unsigned int mVisibilityThreshold;
+		
+		SceneManager *mSceneManager;
+		RenderSystem *mRenderSystem;
+	
+		int mCurrentTestIdx;
+		int mQueryMode;
+
+		unsigned int mNumQueries;
+
+		//--- statistics
+		unsigned int mNumSceneNodes;
+		unsigned int mNumTraversedNodes;
+		unsigned int mNumQueryCulledNodes;
+		unsigned int mNumFrustumCulledNodes;
+		unsigned int mNumRenderedGeometry;
+		unsigned int mNumRenderedNodes;
+		
+	private:
+		// the scene root
+		HierarchyNode *mHierarchyRoot;
+		// we use a priority queue ordered by distance
+		PriorityQueue *mDistanceQueue; 
+	};
+
+}
+#endif // SCENETRAVERSER_H
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/Makefile.in
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/Makefile.in	(revision 12)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/Makefile.in	(revision 12)
@@ -0,0 +1,372 @@
+# Makefile.in generated by automake 1.7.5 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_triplet = @host@
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON = @BISON@
+BOOST_CFLAGS = @BOOST_CFLAGS@
+BOOST_LIBS = @BOOST_LIBS@
+BUILD_PYTHON_INTERFACE_FALSE = @BUILD_PYTHON_INTERFACE_FALSE@
+BUILD_PYTHON_INTERFACE_TRUE = @BUILD_PYTHON_INTERFACE_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFGTK_DEPS_CFLAGS = @CFGTK_DEPS_CFLAGS@
+CFGTK_DEPS_LIBS = @CFGTK_DEPS_LIBS@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GLSUPPORT_CFLAGS = @GLSUPPORT_CFLAGS@
+GLSUPPORT_LIBS = @GLSUPPORT_LIBS@
+GL_LIBS = @GL_LIBS@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+OGREMAIN_VERSION_INFO = @OGREMAIN_VERSION_INFO@
+OGRE_CFGTK = @OGRE_CFGTK@
+OGRE_CFLAGS = @OGRE_CFLAGS@
+OGRE_GLSUPPORT = @OGRE_GLSUPPORT@
+OGRE_PLATFORM = @OGRE_PLATFORM@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLATFORM_CFLAGS = @PLATFORM_CFLAGS@
+PLATFORM_LIBS = @PLATFORM_LIBS@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_LIBS = @PYTHON_LIBS@
+RANLIB = @RANLIB@
+SDL_CFLAGS = @SDL_CFLAGS@
+SDL_CONFIG = @SDL_CONFIG@
+SDL_LIBS = @SDL_LIBS@
+SET_MAKE = @SET_MAKE@
+SHARED_FLAGS = @SHARED_FLAGS@
+SHELL = @SHELL@
+STLPORT_CFLAGS = @STLPORT_CFLAGS@
+STLPORT_LIBS = @STLPORT_LIBS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+noinst_HEADERS = OgreBspLevel.h \
+                 OgreBspNode.h \
+                 OgreBspPrerequisites.h \
+                 OgreBspResourceManager.h \
+                 OgreBspSceneManager.h \
+				 OgreBspSceneNode.h \
+                 OgreQuake3Level.h \
+                 OgreQuake3Shader.h \
+                 OgreQuake3ShaderManager.h \
+                 OgreQuake3Types.h
+
+subdir = PlugIns/BSPSceneManager/include
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/OgreMain/include/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+HEADERS = $(noinst_HEADERS)
+
+DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  PlugIns/BSPSceneManager/include/Makefile
+Makefile:  $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+ETAGS = etags
+ETAGSFLAGS =
+
+CTAGS = ctags
+CTAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$tags$$unique" \
+	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	     $$tags $$unique
+
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkinstalldirs) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(HEADERS)
+
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-generic distclean-libtool \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-libtool ctags distclean distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am info \
+	info-am install install-am install-data install-data-am \
+	install-exec install-exec-am install-info install-info-am \
+	install-man install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingResourceManager.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingResourceManager.h	(revision 12)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingResourceManager.h	(revision 12)
@@ -0,0 +1,98 @@
+/*
+-----------------------------------------------------------------------------
+This source file is part of OGRE
+    (Object-oriented Graphics Rendering Engine)
+For the latest info, see http://www.ogre3d.org/
+
+Copyright © 2000-2002 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.
+-----------------------------------------------------------------------------
+*/
+#ifndef _OcclusionCullingResourceManager_H__
+#define _OcclusionCullingResourceManager_H__
+
+#include "OgreResourceManager.h"
+#include "OgreSingleton.h"
+
+namespace Ogre {
+
+    /** Manages the locating and loading of BSP-based indoor levels.
+    Like other ResourceManager specialisations it manages the location and loading
+    of a specific type of resource, in this case files containing Binary
+    Space Partition (BSP) based level files e.g. Quake3 levels.</p>
+    However, note that unlike other ResourceManager implementations,
+    only 1 BspLevel resource is allowed to be loaded at one time. Loading
+    another automatically unloads the currently loaded level if any.
+    */
+    class OcclusionCullingResourceManager : public ResourceManager, public Singleton<OcclusionCullingResourceManager>
+    {
+    public:
+        OcclusionCullingResourceManager();
+        ~OcclusionCullingResourceManager();
+
+        /** Loads a BSP-based level from the named file.
+            Currently only supports loading of Quake3 .bsp files.
+        */
+    //    BspLevel* load( const String& filename, int priority = 1);
+
+
+        /** Creates a BspLevel resource - mainly used internally. */
+      //  Resource* create( const String& name);
+
+        /** Override standard Singleton retrieval.
+        @remarks
+        Why do we do this? Well, it's because the Singleton
+        implementation is in a .h file, which means it gets compiled
+        into anybody who includes it. This is needed for the
+        Singleton template to work, but we actually only want it
+        compiled into the implementation of the class based on the
+        Singleton, not all of them. If we don't change this, we get
+        link errors when trying to use the Singleton-based class from
+        an outside dll.
+        @par
+        This method just delegates to the template version anyway,
+        but the implementation stays in this single compilation unit,
+        preventing link errors.
+        */
+        static OcclusionCullingResourceManager& getSingleton(void);
+        /** Override standard Singleton retrieval.
+        @remarks
+        Why do we do this? Well, it's because the Singleton
+        implementation is in a .h file, which means it gets compiled
+        into anybody who includes it. This is needed for the
+        Singleton template to work, but we actually only want it
+        compiled into the implementation of the class based on the
+        Singleton, not all of them. If we don't change this, we get
+        link errors when trying to use the Singleton-based class from
+        an outside dll.
+        @par
+        This method just delegates to the template version anyway,
+        but the implementation stays in this single compilation unit,
+        preventing link errors.
+        */
+        static OcclusionCullingResourceManager* getSingletonPtr(void);
+
+
+    protected:
+        // Singleton managed by this class
+       // Quake3ShaderManager *mShaderMgr;
+
+    };
+
+}
+
+#endif
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreSolidHalfBoundingBox.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreSolidHalfBoundingBox.h	(revision 54)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreSolidHalfBoundingBox.h	(revision 54)
@@ -0,0 +1,47 @@
+#ifndef _SolidHalfBoundingBox_H__
+#define _SolidHalfBoundingBox_H__
+
+#include "OgrePrerequisites.h"
+
+#include "OgreWireBoundingBox.h"
+
+namespace Ogre {
+
+    /** Allows the rendering of one half of a solid bounding box.
+        @remarks
+            This class builds a wireframe renderable from a given aabb. A pointer to this class can be
+			added to a render queue to display the bounding box of an object.
+    */
+	class SolidHalfBoundingBox : public WireBoundingBox
+	{
+	public:
+
+		SolidHalfBoundingBox( bool isFirstHalf );
+		void setupBoundingBox( const AxisAlignedBox& aabb );
+		/** Override this method to prevent parent transforms (rotation,translation,scale)
+		and to make it public.
+        */
+		void getWorldTransforms( Matrix4* xform ) const;
+
+    protected:
+       
+        /** Builds the wireframe line list.
+		@param the axis aligned bounding box for setting up the list.
+        */
+		void setupBoundingBoxVertices( const AxisAlignedBox& aab );
+		/** 
+			Sets the material used for occlusion queries. 
+			@remarks the material is called "OcclusionQuery" and
+			uses no lighting, no depth write, and no colours
+		*/
+		void setOcclusionQueryMaterial( void );
+		/** Whether this half box is the first or the second half of the bounding box. 
+		*/
+		bool mIsFirstHalf;	
+	};
+
+}// namespace
+
+#endif
+
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingSceneManager.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingSceneManager.h	(revision 38)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingSceneManager.h	(revision 38)
@@ -0,0 +1,56 @@
+#ifndef _OcclusionCullingSceneManager_H__
+#define _OcclusionCullingSceneManager_H__
+
+#include "OgreSceneNode.h"
+#include "OgreSceneManager.h"
+#include "OgreOcclusionCullingSceneTraverser.h"
+#include "OgrePrerequisites.h"
+#include "OgreSolidHalfBoundingBox.h"
+#include <queue>
+
+using namespace std;
+
+namespace Ogre {
+	
+	/**
+		Class which implements a scene mangager which uses occlusion queries for culling occluded objects
+	*/
+	class OcclusionCullingSceneManager : public SceneManager
+	{
+	public:
+		OcclusionCullingSceneManager();
+		~OcclusionCullingSceneManager();
+	
+		/** Overriden from SceneManager. Renders the scene with the specified algorithm
+		/**
+			The algorithm is one of
+			RENDER_CULL_FRUSTUM: renders the scene with view frustum culling only
+			RENDER_STOP_AND_WAIT: renders the scene with the hierarchical stop and wait algorithm
+			RENDER_COHERENT: renders the scene with the coherent hierarchical algorithm
+		*/
+		void _renderVisibleObjects(void);
+		void _findVisibleObjects(Camera* cam, bool onlyShadowCasters);
+		void _updateSceneGraph(Camera* cam);
+
+		/** Sets the given option for the SceneManager
+			       @remarks
+			Options are:
+			"Algorithm", int *;			
+		*/
+		virtual bool setOption( const String &, const void * );
+		/** Gets the given option for the Scene Manager.
+	        @remarks
+		    See setOption
+		*/
+		virtual bool getOption( const String &, void * );
+
+		bool getOptionValues( const String & key, StringVector &refValueList );
+		bool getOptionKeys( StringVector &refKeys );
+
+	protected:
+		
+		OcclusionCullingSceneTraverser *mOcclusionCullingSceneTraverser;
+	};
+
+}
+#endif // OCCLUSIONCULLINGSCENEMANAGER_H
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/Makefile.am
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/Makefile.am	(revision 12)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/Makefile.am	(revision 12)
@@ -0,0 +1,10 @@
+noinst_HEADERS = OgreBspLevel.h \
+                 OgreBspNode.h \
+                 OgreBspPrerequisites.h \
+                 OgreBspResourceManager.h \
+                 OgreBspSceneManager.h \
+				 OgreBspSceneNode.h \
+                 OgreQuake3Level.h \
+                 OgreQuake3Shader.h \
+                 OgreQuake3ShaderManager.h \
+                 OgreQuake3Types.h
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingOctreeSceneManager.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingOctreeSceneManager.h	(revision 51)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingOctreeSceneManager.h	(revision 51)
@@ -0,0 +1,54 @@
+#ifndef _OcclusionCullingOctreeSceneManager_H__
+#define _OcclusionCullingOctreeSceneManager_H__
+
+#include <OgreSceneNode.h>
+#include <OgreOctreeSceneManager.h>
+#include <OgreOctreeNode.h>
+#include <OgreOctreeCamera.h>
+
+#include "OgrePrerequisites.h"
+#include "OgreOcclusionCullingOctreeSceneTraverser.h"
+
+using namespace std;
+
+namespace Ogre {
+	/**
+		Class which implements a scene mangager which uses occlusion queries for culling occluded objects
+	*/
+	class OcclusionCullingOctreeSceneManager: public OctreeSceneManager
+	{
+	public:
+		OcclusionCullingOctreeSceneManager();
+		~OcclusionCullingOctreeSceneManager();
+	
+		void _renderVisibleObjects(void);
+		void _findVisibleObjects(Camera* cam, bool onlyShadowCasters);
+		void _updateSceneGraph(Camera* cam);
+
+		/** Sets the given option for the SceneManager
+			       @remarks
+			Options are:
+			"Algorithm", int *;			
+		*/
+		
+		virtual bool setOption( const String &, const void * );
+		/** Gets the given option for the Scene Manager.
+	        @remarks
+		    See setOption
+		*/
+		virtual bool getOption( const String &, void * );
+
+		bool getOptionValues( const String & key, StringVector &refValueList );
+		bool getOptionKeys( StringVector &refKeys );
+
+	protected:
+		/** Recursively counts octree size (i.e., number of octree instances)
+		@param root current octree
+		*/
+		//unsigned int countOctreeSize(Octree *root);
+
+		OcclusionCullingOctreeSceneTraverser *mOcclusionCullingOctreeSceneTraverser;
+	};
+
+}
+#endif // OcclusionCullingTerrainSceneManager_H
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingSceneTraverser.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingSceneTraverser.h	(revision 52)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingSceneTraverser.h	(revision 52)
@@ -0,0 +1,184 @@
+#ifndef _OcclusionCullingSceneTraverser_H__
+#define _OcclusionCullingSceneTraverser_H__
+
+#include "OgreSceneNode.h"
+#include "OgreSceneManager.h"
+#include "OgrePrerequisites.h"
+#include "OgreSolidHalfBoundingBox.h"
+#include "OgreCamera.h"
+#include "OgreRenderSystem.h"
+#include <queue>
+
+using namespace std;
+
+namespace Ogre {
+	/**
+		This class implements the compare operator for the priority queue.
+		a lower distance has a higher value in the queue
+	*/
+	template <typename T> class myless
+	{
+	public:
+		myless(Camera *cam) { mCamera = cam; }
+		//bool operator() (HierarchyNode *v1, HierarchyNode *v2) const
+		bool operator() (T v1, T v2) const
+		{
+			return v1->getSquaredViewDepth(mCamera) > v2->getSquaredViewDepth(mCamera);
+		}
+	private:
+		Camera *mCamera;
+	};
+
+	typedef pair<SceneNode *, HardwareOcclusionQuery *> QueryPair;
+	typedef priority_queue<SceneNode *, vector<SceneNode *>, myless<vector<SceneNode *>::value_type> > PriorityQueue;
+	typedef queue<QueryPair> QueryQueue;
+	/**
+		Class which implements a scene mangager which uses occlusion queries for culling occluded objects
+	*/
+	class OcclusionCullingSceneTraverser
+	{
+	public:
+		/** Construction taking the current scene manager and the current rendersystem as argument
+		@param sm current scene manager
+		@param rsys current render system 
+		*/
+		OcclusionCullingSceneTraverser(SceneManager *sm, RenderSystem *rsys);
+		~OcclusionCullingSceneTraverser();
+	
+		enum {RENDER_CULL_FRUSTUM, RENDER_STOP_AND_WAIT, RENDER_COHERENT, NUM_RENDERMODES};
+		
+		/** Renders the scene with the specified algorithm
+			@comment 
+			The algorithm type can be set with the parameter "Algorithm" and setOption.
+
+			The algorithm is one of:
+			RENDER_CULL_FRUSTUM: renders the scene with view frustum culling only
+			RENDER_STOP_AND_WAIT: renders the scene with the hierarchical stop and wait algorithm
+			RENDER_COHERENT: renders the scene with the coherent hierarchical algorithm
+			
+			@param cam current camera
+		*/
+		void renderScene( Camera *cam );
+	
+		/** Sets the given option for the scene traverser.
+			       @remarks
+			Options are:
+			"Algorithm", int *;			
+		*/
+		bool setOption( const String &, const void * );
+		/** Gets the given option for the scene traverser.
+	        @remarks
+		    See setOption
+		*/
+		bool getOption( const String &, void * );
+		bool getOptionKeys( StringVector &refKeys );
+		
+		/** Sets pointer to the current scene manager.
+		@param the scene manager */
+		void setSceneManager( SceneManager *sm );
+		
+		/** Sets pointer to the current render system 
+		@param the rendersystem */
+		void setRenderSystem( RenderSystem *rsys );
+		
+		/** Sets the current number of scene nodes in the scene.
+		@param num number of scene nodes
+		*/
+		void setNumSceneNodes(int num );
+
+		/** Sets the root of the scene hierarchy. */
+		void setSceneRoot(SceneNode *root);
+
+		/** Sets the required number of occlusion queries.
+		@param num number occlusion queries
+		*/
+		//void setNumQueries( int num );
+
+		/** Doing some necessary preprocessing.
+		@comment e.g., initialises occlusion queries */
+		//void preprocess( void );
+
+	protected:
+		/** query mode (= without color) or RENDER_MODE */
+		enum {MODE_QUERY, MODE_RENDER};
+		/** returns true if node is leaf of the hierarchy */
+		bool isLeaf( SceneNode *node );
+		//HACK
+		//unsigned int countSceneNodes(SceneNode *node);
+		void traverseNode( Camera *cam, SceneNode *node );
+		/** Renders current scene node 
+		@param cam current camera
+		@param node current scene node to be rendered
+		*/
+		void renderSceneNode( Camera *cam, SceneNode *node);
+		/** Sets rendering mode, e.g. query mode or render mode*/
+		void setRenderingMode( int mode );
+		
+		
+		/** Renders the scene with view frustum culling only. */
+		virtual void renderCullFrustum( Camera *cam );
+		/** Renders the scene with the hierarchical stop and wait algorithm. */
+		virtual void renderStopAndWait( Camera *cam );
+		/** Renders the scene with the coherent hierarchical algorithm and the query queye. */
+		virtual void renderCoherentWithQueue( Camera *cam );
+
+		/** Issue a occlusion query for this node. 
+		@param box the axis aligned bounding box of the node
+		@wasVisible if the node was visible in previous frame
+		*/
+		HardwareOcclusionQuery *issueOcclusionQuery( AxisAlignedBox *box, bool wasVisible );
+		/** Returns next available occlusion query or creates new one.
+		@return the next occlusion query
+		*/
+		HardwareOcclusionQuery *getNextOcclusionQuery(void);
+		/** Pulls up the visibility from the child node. 
+		@param the child node 
+		*/
+		void pullUpVisibility(SceneNode *node);
+		/** delete all previously defined occlusion queries */
+		void deleteQueries();
+		/** Renders bounding box of specified node.
+		@param box the bounding box of the scene node to be rendered */
+		void renderBoundingBox( AxisAlignedBox *box );
+		/** Returns one half of the bounding box.
+		@param half the half index of the bouding box (0 or 1)
+		*/
+		SolidHalfBoundingBox *getSolidHalfBoundingBox( int half );
+
+		/** Initialises the distance queue. */
+		virtual void initDistanceQueue(Camera *cam);
+		
+		std::vector<HardwareOcclusionQuery *> mOcclusionQueries;
+		// two halfes of a aabb
+		SolidHalfBoundingBox *mHalfBoundingBox[2];	
+
+		int mCurrentAlgorithm;
+
+		unsigned int mFrameId;
+		unsigned int mVisibilityThreshold;
+		
+		SceneManager *mSceneManager;
+		RenderSystem *mRenderSystem;
+	
+		int mCurrentTestIdx;
+		int mQueryMode;
+
+		unsigned int mNumQueries;
+
+		//--- statistics
+		unsigned int mNumSceneNodes;
+		unsigned int mNumTraversedNodes;
+		unsigned int mNumQueryCulledNodes;
+		unsigned int mNumFrustumCulledNodes;
+		unsigned int mNumRenderedGeometry;
+		unsigned int mNumRenderedNodes;
+		
+	private:
+		// the scene root
+		SceneNode *mSceneRoot;
+		// we use a priority queue ordered by distance
+		PriorityQueue *mDistanceQueue; 
+	};
+
+}
+#endif // OCCLUSIONCULLINGSCENEMANAGER_H
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingOctreeSceneTraverser.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingOctreeSceneTraverser.h	(revision 52)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingOctreeSceneTraverser.h	(revision 52)
@@ -0,0 +1,90 @@
+#ifndef _OcclusionCullingOctreeSceneTraverser_H__
+#define _OcclusionCullingOctreeSceneTraverser_H__
+
+#include "OgreOctree.h"
+#include "OgreOcclusionCullingSceneTraverser.h"
+
+using namespace std;
+
+namespace Ogre {
+	/**
+		This class implements the compare operator for the priority queue
+		especially for octree hierarchies using getCullBounds for bounding
+		box computation. A lower distance has a higher value in the queue.
+	*/
+	template <typename T> class octreeless 
+	{
+	public:
+		octreeless(Camera *cam) { mCamera = cam; }
+		
+		bool operator() (T v1, T v2) const
+		{
+			AxisAlignedBox box1, box2;
+			v1->_getCullBounds(&box1);
+			v2->_getCullBounds(&box2);
+
+			return getSquaredViewDepth(mCamera, &box1) > getSquaredViewDepth(mCamera, &box2);
+		}
+
+	private:
+		Real getSquaredViewDepth(const Ogre::Camera* cam, const Ogre::AxisAlignedBox* box) const
+		{
+			Vector3 mid  = ((box->getMinimum() - box->getMaximum()) * 0.5) + box->getMinimum();
+			return (cam->getDerivedPosition() - mid).squaredLength();                                                                   
+		}
+
+		Camera *mCamera;
+		//AxisAlignedBox mBox1, mBox2;
+		//Ogre::Vector3 min, max, mid, dist;
+	};
+
+	typedef pair<Octree *, HardwareOcclusionQuery *> OctreeQueryPair;
+	typedef priority_queue<Octree *, vector<Octree *>, octreeless<vector<Octree *>::value_type> > OctreePriorityQueue;
+	typedef queue<OctreeQueryPair> OctreeQueryQueue;
+
+	class OcclusionCullingOctreeSceneTraverser: public OcclusionCullingSceneTraverser
+	{
+	public:
+		OcclusionCullingOctreeSceneTraverser(SceneManager *sm, RenderSystem *rsys);
+		~OcclusionCullingOctreeSceneTraverser();
+		//void renderScene( Camera *cam );
+		void setSceneRoot(Octree *root);
+		/** Sets the number of nodes in this octree 
+		@remark do not confuse this with the OctreeNode class 
+		which is derived from SceneNode
+		@param num number of nodes in the octree
+		*/
+		void setNumOctreeNodes( unsigned int num );
+	
+		/** Gets the given option for the scene traverser.
+	        @remarks
+		    See setOption
+		*/
+		bool getOption( const String &, void * );
+		bool getOptionKeys( StringVector &refKeys );
+		
+	protected:
+		/** Renders the scene with view frustum culling only. */
+		void renderCullFrustum( Camera *cam );
+		/** Renders the scene with the hierarchical stop and wait algorithm. */
+		void renderStopAndWait( Camera *cam );
+		/** Renders the scene with the coherent hierarchical algorithm and the query queye. */
+		void renderCoherentWithQueue( Camera *cam );
+		/** Issue a occlusion query for this node. */
+		
+		void initDistanceQueue(Camera *cam);
+		void pullUpVisibility(Octree *octree);
+		void traverseOctant(Camera *cam, Octree *octant);
+		void renderOctant(Camera *cam, Octree *octant);
+		bool isLeaf(Octree *octant);
+
+	private:
+		OctreePriorityQueue *mOctreeDistanceQueue;
+		// the octree root
+		Octree *mOctreeSceneRoot;
+
+		unsigned int mNumOctreeNodes;
+	};
+
+}
+#endif // OcclusionCullingOctreeSceneTraverser_H
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingTerrainSceneManager.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingTerrainSceneManager.h	(revision 51)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/include/OgreOcclusionCullingTerrainSceneManager.h	(revision 51)
@@ -0,0 +1,52 @@
+#ifndef _OcclusionCullingTerrainSceneManager_H__
+#define _OcclusionCullingTerrainSceneManager_H__
+
+#include <OgreSceneNode.h>
+#include <OgreOctreeSceneManager.h>
+#include <OgreTerrainSceneManager.h>
+#include <OgreOctreeSceneQuery.h>
+#include <OgreOctreeNode.h>
+#include <OgreOctreeCamera.h>
+
+#include "OgrePrerequisites.h"
+#include "OgreOcclusionCullingOctreeSceneTraverser.h"
+
+using namespace std;
+
+namespace Ogre {
+	/**
+		Class which implements a scene mangager which uses occlusion queries for culling occluded objects
+	*/
+	class OcclusionCullingTerrainSceneManager: public TerrainSceneManager
+	{
+	public:
+		OcclusionCullingTerrainSceneManager();
+		~OcclusionCullingTerrainSceneManager();
+	
+		void _renderVisibleObjects(void);
+		void _findVisibleObjects(Camera* cam, bool onlyShadowCasters);
+		void _updateSceneGraph(Camera* cam);
+
+		/** Sets the given option for the SceneManager
+			       @remarks
+			Options are:
+			"Algorithm", int *;			
+		*/
+		
+		virtual bool setOption( const String &, const void * );
+		/** Gets the given option for the Scene Manager.
+	        @remarks
+		    See setOption
+		*/
+		virtual bool getOption( const String &, void * );
+
+		bool getOptionValues( const String & key, StringVector &refValueList );
+		bool getOptionKeys( StringVector &refKeys );
+
+	protected:
+
+		OcclusionCullingOctreeSceneTraverser *mOcclusionCullingOctreeSceneTraverser;
+	};
+
+}
+#endif // OcclusionCullingTerrainSceneManager_H
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinyxmlerror.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinyxmlerror.cpp	(revision 37)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinyxmlerror.cpp	(revision 37)
@@ -0,0 +1,50 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+
+This software is provided 'as-is', without any express or implied 
+warranty. In no event will the authors be held liable for any 
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any 
+purpose, including commercial applications, and to alter it and 
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+*/
+
+#include "tinyxml.h"
+
+// The goal of the seperate error file is to make the first
+// step towards localization. tinyxml (currently) only supports
+// latin-1, but at least the error messages could now be translated.
+//
+// It also cleans up the code a bit.
+//
+
+const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] =
+{
+	"No error",
+	"Error",
+	"Failed to open file",
+	"Memory allocation failed.",
+	"Error parsing Element.",
+	"Failed to read Element name",
+	"Error reading Element value.",
+	"Error reading Attributes.",
+	"Error: empty tag.",
+	"Error reading end tag.",
+	"Error parsing Unknown.",
+	"Error parsing Comment.",
+	"Error parsing Declaration.",
+	"Error document empty."
+};
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinystr.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinystr.h	(revision 37)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinystr.h	(revision 37)
@@ -0,0 +1,228 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original file by Yves Berquin.
+
+This software is provided 'as-is', without any express or implied 
+warranty. In no event will the authors be held liable for any 
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any 
+purpose, including commercial applications, and to alter it and 
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must 
+not claim that you wrote the original software. If you use this 
+software in a product, an acknowledgment in the product documentation 
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source 
+distribution.
+*/
+
+#include "tinyxml.h"
+
+
+#ifndef TIXML_USE_STL
+
+#ifndef TIXML_STRING_INCLUDED
+#define TIXML_STRING_INCLUDED
+
+#pragma warning( disable : 4514 )
+
+#include <assert.h>
+
+/*
+   TiXmlString is an emulation of the std::string template.
+   Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.
+   Only the member functions relevant to the TinyXML project have been implemented.
+   The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase
+   a string and there's no more room, we allocate a buffer twice as big as we need.
+*/
+class TiXmlString
+{
+  public :
+    // TiXmlString constructor, based on a string
+    TiXmlString (const char * instring);
+
+    // TiXmlString empty constructor
+    TiXmlString ()
+    {
+        allocated = 0;
+        cstring = NULL;
+    }
+
+    // TiXmlString copy constructor
+    TiXmlString (const TiXmlString& copy);
+
+    // TiXmlString destructor
+    ~ TiXmlString ()
+    {
+        empty_it ();
+    }
+
+    // Convert a TiXmlString into a classical char *
+    const char * c_str () const
+    {
+        if (allocated)
+            return cstring;
+        return "";
+    }
+
+    // Return the length of a TiXmlString
+    unsigned length () const;
+
+    // TiXmlString = operator
+    void operator = (const char * content);
+
+    // = operator
+    void operator = (const TiXmlString & copy);
+
+    // += operator. Maps to append
+    TiXmlString& operator += (const char * suffix)
+    {
+        append (suffix);
+		return *this;
+    }
+
+    // += operator. Maps to append
+    TiXmlString& operator += (char single)
+    {
+        append (single);
+		return *this;
+    }
+
+    // += operator. Maps to append
+    TiXmlString& operator += (TiXmlString & suffix)
+    {
+        append (suffix);
+		return *this;
+    }
+    bool operator == (const TiXmlString & compare) const;
+    bool operator < (const TiXmlString & compare) const;
+    bool operator > (const TiXmlString & compare) const;
+
+    // Checks if a TiXmlString is empty
+    bool empty () const
+    {
+        return length () ? false : true;
+    }
+
+    // Checks if a TiXmlString contains only whitespace (same rules as isspace)
+	// Not actually used in tinyxml. Conflicts with a C macro, "isblank",
+	// which is a problem. Commenting out. -lee
+//    bool isblank () const;
+
+    // single char extraction
+    const char& at (unsigned index) const
+    {
+        assert( index < length ());
+        return cstring [index];
+    }
+
+    // find a char in a string. Return TiXmlString::notfound if not found
+    unsigned find (char lookup) const
+    {
+        return find (lookup, 0);
+    }
+
+    // find a char in a string from an offset. Return TiXmlString::notfound if not found
+    unsigned find (char tofind, unsigned offset) const;
+
+    /*	Function to reserve a big amount of data when we know we'll need it. Be aware that this
+		function clears the content of the TiXmlString if any exists.
+    */
+    void reserve (unsigned size)
+    {
+        empty_it ();
+        if (size)
+        {
+            allocated = size;
+            cstring = new char [size];
+            cstring [0] = 0;
+        }
+    }
+
+    // [] operator 
+    char& operator [] (unsigned index) const
+    {
+        assert( index < length ());
+        return cstring [index];
+    }
+
+    // Error value for find primitive 
+    enum {	notfound = 0xffffffff,
+            npos = notfound };
+
+    void append (const char *str, int len );
+
+  protected :
+
+    // The base string
+    char * cstring;
+    // Number of chars allocated
+    unsigned allocated;
+
+    // New size computation. It is simplistic right now : it returns twice the amount
+    // we need
+    unsigned assign_new_size (unsigned minimum_to_allocate)
+    {
+        return minimum_to_allocate * 2;
+    }
+
+    // Internal function that clears the content of a TiXmlString
+    void empty_it ()
+    {
+        if (cstring)
+            delete [] cstring;
+        cstring = NULL;
+        allocated = 0;
+    }
+
+    void append (const char *suffix );
+
+    // append function for another TiXmlString
+    void append (const TiXmlString & suffix)
+    {
+        append (suffix . c_str ());
+    }
+
+    // append for a single char. This could be improved a lot if needed
+    void append (char single)
+    {
+        char smallstr [2];
+        smallstr [0] = single;
+        smallstr [1] = 0;
+        append (smallstr);
+    }
+
+} ;
+
+/* 
+   TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.
+   Only the operators that we need for TinyXML have been developped.
+*/
+class TiXmlOutStream : public TiXmlString
+{
+public :
+    TiXmlOutStream () : TiXmlString () {}
+
+    // TiXmlOutStream << operator. Maps to TiXmlString::append
+    TiXmlOutStream & operator << (const char * in)
+    {
+        append (in);
+        return (* this);
+    }
+
+    // TiXmlOutStream << operator. Maps to TiXmlString::append
+    TiXmlOutStream & operator << (const TiXmlString & in)
+    {
+        append (in . c_str ());
+        return (* this);
+    }
+} ;
+
+#endif	// TIXML_STRING_INCLUDED
+#endif	// TIXML_USE_STL
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinyxmlparser.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinyxmlparser.cpp	(revision 37)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinyxmlparser.cpp	(revision 37)
@@ -0,0 +1,939 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+
+This software is provided 'as-is', without any express or implied 
+warranty. In no event will the authors be held liable for any 
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any 
+purpose, including commercial applications, and to alter it and 
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must 
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and 
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source 
+distribution.
+*/
+
+#include "tinyxml.h"
+#include <ctype.h>
+
+//#define DEBUG_PARSER
+
+// Note tha "PutString" hardcodes the same list. This
+// is less flexible than it appears. Changing the entries
+// or order will break putstring.	
+TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = 
+{
+	{ "&amp;",  5, '&' },
+	{ "&lt;",   4, '<' },
+	{ "&gt;",   4, '>' },
+	{ "&quot;", 6, '\"' },
+	{ "&apos;", 6, '\'' }
+};
+
+
+const char* TiXmlBase::SkipWhiteSpace( const char* p )
+{
+	if ( !p || !*p )
+	{
+		return 0;
+	}
+	while ( p && *p )
+	{
+		if ( isspace( *p ) || *p == '\n' || *p =='\r' )		// Still using old rules for white space.
+			++p;
+		else
+			break;
+	}
+
+	return p;
+}
+
+#ifdef TIXML_USE_STL
+/*static*/ bool TiXmlBase::StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	for( ;; )
+	{
+		if ( !in->good() ) return false;
+
+		int c = in->peek();
+		if ( !IsWhiteSpace( c ) )
+			return true;
+		*tag += in->get();
+	}
+}
+
+/*static*/ bool TiXmlBase::StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->peek();
+		if ( c == character )
+			return true;
+
+		in->get();
+		*tag += c;
+	}
+	return false;
+}
+#endif
+
+const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name )
+{
+	*name = "";
+	assert( p );
+
+	// Names start with letters or underscores.
+	// After that, they can be letters, underscores, numbers,
+	// hyphens, or colons. (Colons are valid ony for namespaces,
+	// but tinyxml can't tell namespaces from names.)
+	if (    p && *p 
+		 && ( isalpha( (unsigned char) *p ) || *p == '_' ) )
+	{
+		while(		p && *p
+				&&	(		isalnum( (unsigned char ) *p ) 
+						 || *p == '_'
+						 || *p == '-'
+						 || *p == ':' ) )
+		{
+			(*name) += *p;
+			++p;
+		}
+		return p;
+	}
+	return 0;
+}
+
+const char* TiXmlBase::GetEntity( const char* p, char* value )
+{
+	// Presume an entity, and pull it out.
+    TIXML_STRING ent;
+	int i;
+
+	// Ignore the &#x entities.
+	if (    strncmp( "&#x", p, 3 ) == 0 
+	     && *(p+3) 
+		 && *(p+4) )
+	{
+		*value = 0;
+		
+		if ( isalpha( *(p+3) ) ) *value += ( tolower( *(p+3) ) - 'a' + 10 ) * 16;
+		else				     *value += ( *(p+3) - '0' ) * 16;
+
+		if ( isalpha( *(p+4) ) ) *value += ( tolower( *(p+4) ) - 'a' + 10 );
+		else				     *value += ( *(p+4) - '0' );
+
+		return p+6;
+	}
+
+	// Now try to match it.
+	for( i=0; i<NUM_ENTITY; ++i )
+	{
+		if ( strncmp( entity[i].str, p, entity[i].strLength ) == 0 )
+		{
+			assert( strlen( entity[i].str ) == entity[i].strLength );
+			*value = entity[i].chr;
+			return ( p + entity[i].strLength );
+		}
+	}
+
+	// So it wasn't an entity, its unrecognized, or something like that.
+	*value = *p;	// Don't put back the last one, since we return it!
+	return p+1;
+}
+
+
+bool TiXmlBase::StringEqual( const char* p,
+							 const char* tag,
+							 bool ignoreCase )
+{
+	assert( p );
+	if ( !p || !*p )
+	{
+		assert( 0 );
+		return false;
+	}
+
+    if ( tolower( *p ) == tolower( *tag ) )
+	{
+		const char* q = p;
+
+		if (ignoreCase)
+		{
+			while ( *q && *tag && *q == *tag )
+			{
+				++q;
+				++tag;
+			}
+
+			if ( *tag == 0 )		// Have we found the end of the tag, and everything equal?
+			{
+				return true;
+			}
+		}
+		else
+		{
+			while ( *q && *tag && tolower( *q ) == tolower( *tag ) )
+			{
+				++q;
+				++tag;
+			}
+
+			if ( *tag == 0 )
+			{
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
+const char* TiXmlBase::ReadText(	const char* p, 
+									TIXML_STRING * text, 
+									bool trimWhiteSpace, 
+									const char* endTag, 
+									bool caseInsensitive )
+{
+    *text = "";
+	if (    !trimWhiteSpace			// certain tags always keep whitespace
+		 || !condenseWhiteSpace )	// if true, whitespace is always kept
+	{
+		// Keep all the white space.
+		while (	   p && *p
+				&& !StringEqual( p, endTag, caseInsensitive )
+			  )
+		{
+			char c;
+			p = GetChar( p, &c );
+            (* text) += c;
+		}
+	}
+	else
+	{
+		bool whitespace = false;
+
+		// Remove leading white space:
+		p = SkipWhiteSpace( p );
+		while (	   p && *p
+				&& !StringEqual( p, endTag, caseInsensitive ) )
+		{
+			if ( *p == '\r' || *p == '\n' )
+			{
+				whitespace = true;
+				++p;
+			}
+			else if ( isspace( *p ) )
+			{
+				whitespace = true;
+				++p;
+			}
+			else
+			{
+				// If we've found whitespace, add it before the
+				// new character. Any whitespace just becomes a space.
+				if ( whitespace )
+				{
+               (* text) += ' ';
+					whitespace = false;
+				}
+				char c;
+				p = GetChar( p, &c );
+            (* text) += c;
+			}
+		}
+	}
+	return p + strlen( endTag );
+}
+
+#ifdef TIXML_USE_STL
+
+void TiXmlDocument::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	// The basic issue with a document is that we don't know what we're
+	// streaming. Read something presumed to be a tag (and hope), then
+	// identify it, and call the appropriate stream method on the tag.
+	//
+	// This "pre-streaming" will never read the closing ">" so the
+	// sub-tag can orient itself.
+
+	if ( !StreamTo( in, '<', tag ) ) 
+	{
+		SetError( TIXML_ERROR_PARSING_EMPTY );
+		return;
+	}
+
+	while ( in->good() )
+	{
+		size_t tagIndex = tag->length();
+		while ( in->good() && in->peek() != '>' )
+		{
+			int c = in->get();
+			(*tag) += (char) c;
+		}
+
+		if ( in->good() )
+		{
+			// We now have something we presume to be a node of 
+			// some sort. Identify it, and call the node to
+			// continue streaming.
+			TiXmlNode* node = Identify( tag->c_str() + tagIndex );
+
+			if ( node )
+			{
+				node->StreamIn( in, tag );
+				bool isElement = node->ToElement() != 0;
+				delete node;
+				node = 0;
+
+				// If this is the root element, we're done. Parsing will be
+				// done by the >> operator.
+				if ( isElement )
+				{
+					return;
+				}
+			}
+			else
+			{
+				SetError( TIXML_ERROR );
+				return;
+			}
+		}
+	}
+	// We should have returned sooner.
+	SetError( TIXML_ERROR );
+}
+
+#endif
+
+const char* TiXmlDocument::Parse( const char* p )
+{
+	// Parse away, at the document level. Since a document
+	// contains nothing but other tags, most of what happens
+	// here is skipping white space.
+	//
+	// In this variant (as opposed to stream and Parse) we
+	// read everything we can.
+
+
+	if ( !p || !*p )
+	{
+		SetError( TIXML_ERROR_DOCUMENT_EMPTY );
+		return false;
+	}
+
+    p = SkipWhiteSpace( p );
+	if ( !p )
+	{
+		SetError( TIXML_ERROR_DOCUMENT_EMPTY );
+		return false;
+	}
+
+	while ( p && *p )
+	{
+		TiXmlNode* node = Identify( p );
+		if ( node )
+		{
+			p = node->Parse( p );
+			LinkEndChild( node );
+		}
+		else
+		{
+			break;
+		}
+		p = SkipWhiteSpace( p );
+	}
+	// All is well.
+	return p;
+}
+
+
+TiXmlNode* TiXmlNode::Identify( const char* p )
+{
+	TiXmlNode* returnNode = 0;
+
+	p = SkipWhiteSpace( p );
+	if( !p || !*p || *p != '<' )
+	{
+		return 0;
+	}
+
+	TiXmlDocument* doc = GetDocument();
+	p = SkipWhiteSpace( p );
+
+	if ( !p || !*p )
+	{
+		return 0;
+	}
+
+	// What is this thing? 
+	// - Elements start with a letter or underscore, but xml is reserved.
+	// - Comments: <!--
+	// - Decleration: <?xml
+	// - Everthing else is unknown to tinyxml.
+	//
+
+	const char* xmlHeader = { "<?xml" };
+	const char* commentHeader = { "<!--" };
+
+	if ( StringEqual( p, xmlHeader, true ) )
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Declaration\n" );
+		#endif
+		returnNode = new TiXmlDeclaration();
+	}
+	else if (    isalpha( *(p+1) )
+			  || *(p+1) == '_' )
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Element\n" );
+		#endif
+		returnNode = new TiXmlElement( "" );
+	}
+	else if ( StringEqual( p, commentHeader, false ) )
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Comment\n" );
+		#endif
+		returnNode = new TiXmlComment();
+	}
+	else
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Unknown\n" );
+		#endif
+		returnNode = new TiXmlUnknown();
+	}
+
+	if ( returnNode )
+	{
+		// Set the parent, so it can report errors
+		returnNode->parent = this;
+		//p = returnNode->Parse( p );
+	}
+	else
+	{
+		if ( doc )
+			doc->SetError( TIXML_ERROR_OUT_OF_MEMORY );
+	}
+	return returnNode;
+}
+
+#ifdef TIXML_USE_STL
+
+void TiXmlElement::StreamIn (TIXML_ISTREAM * in, TIXML_STRING * tag)
+{
+	// We're called with some amount of pre-parsing. That is, some of "this"
+	// element is in "tag". Go ahead and stream to the closing ">"
+	while( in->good() )
+	{
+		int c = in->get();
+		(*tag) += (char) c ;
+		
+		if ( c == '>' )
+			break;
+	}
+
+	if ( tag->length() < 3 ) return;
+
+	// Okay...if we are a "/>" tag, then we're done. We've read a complete tag.
+	// If not, identify and stream.
+
+	if (    tag->at( tag->length() - 1 ) == '>' 
+		 && tag->at( tag->length() - 2 ) == '/' )
+	{
+		// All good!
+		return;
+	}
+	else if ( tag->at( tag->length() - 1 ) == '>' )
+	{
+		// There is more. Could be:
+		//		text
+		//		closing tag
+		//		another node.
+		for ( ;; )
+		{
+			StreamWhiteSpace( in, tag );
+
+			// Do we have text?
+			if ( in->peek() != '<' )
+			{
+				// Yep, text.
+				TiXmlText text( "" );
+				text.StreamIn( in, tag );
+
+				// What follows text is a closing tag or another node.
+				// Go around again and figure it out.
+				continue;
+			}
+
+			// We now have either a closing tag...or another node.
+			// We should be at a "<", regardless.
+			if ( !in->good() ) return;
+			assert( in->peek() == '<' );
+			size_t tagIndex = tag->length();
+
+			bool closingTag = false;
+			bool firstCharFound = false;
+
+			for( ;; )
+			{
+				if ( !in->good() )
+					return;
+
+				int c = in->peek();
+				
+				if ( c == '>' )
+					break;
+
+				*tag += c;
+				in->get();
+
+				if ( !firstCharFound && c != '<' && !IsWhiteSpace( c ) )
+				{
+					firstCharFound = true;
+					if ( c == '/' )
+						closingTag = true;
+				}
+			}
+			// If it was a closing tag, then read in the closing '>' to clean up the input stream.
+			// If it was not, the streaming will be done by the tag.
+			if ( closingTag )
+			{
+				int c = in->get();
+				assert( c == '>' );
+				*tag += c;
+
+				// We are done, once we've found our closing tag.
+				return;
+			}
+			else
+			{
+				// If not a closing tag, id it, and stream.
+				const char* tagloc = tag->c_str() + tagIndex;
+				TiXmlNode* node = Identify( tagloc );
+				if ( !node )
+					return;
+				node->StreamIn( in, tag );
+				delete node;
+				node = 0;
+
+				// No return: go around from the beginning: text, closing tag, or node.
+			}
+		}
+	}
+}
+#endif
+
+const char* TiXmlElement::Parse( const char* p )
+{
+	p = SkipWhiteSpace( p );
+	TiXmlDocument* document = GetDocument();
+
+	if ( !p || !*p || *p != '<' )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT );
+		return false;
+	}
+
+	p = SkipWhiteSpace( p+1 );
+
+	// Read the name.
+    p = ReadName( p, &value );
+	if ( !p || !*p )
+	{
+		if ( document )	document->SetError( TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME );
+		return false;
+	}
+
+    TIXML_STRING endTag ("</");
+	endTag += value;
+	endTag += ">";
+
+	// Check for and read attributes. Also look for an empty
+	// tag or an end tag.
+	while ( p && *p )
+	{
+		p = SkipWhiteSpace( p );
+		if ( !p || !*p )
+		{
+			if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES );
+			return 0;
+		}
+		if ( *p == '/' )
+		{
+			++p;
+			// Empty tag.
+			if ( *p  != '>' )
+			{
+				if ( document ) document->SetError( TIXML_ERROR_PARSING_EMPTY );		
+				return 0;
+			}
+			return (p+1);
+		}
+		else if ( *p == '>' )
+		{
+			// Done with attributes (if there were any.)
+			// Read the value -- which can include other
+			// elements -- read the end tag, and return.
+			++p;
+			p = ReadValue( p );		// Note this is an Element method, and will set the error if one happens.
+			if ( !p || !*p )
+				return 0;
+
+			// We should find the end tag now
+			if ( StringEqual( p, endTag.c_str(), false ) )
+			{
+				p += endTag.length();
+				return p;
+			}
+			else
+			{
+				if ( document ) document->SetError( TIXML_ERROR_READING_END_TAG );
+				return 0;
+			}
+		}
+		else
+		{
+			// Try to read an element:
+			TiXmlAttribute attrib;
+			attrib.SetDocument( document );
+			p = attrib.Parse( p );
+
+			if ( !p || !*p )
+			{
+				if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT );
+				return 0;
+			}
+			SetAttribute( attrib.Name(), attrib.Value() );
+		}
+	}
+	return p;
+}
+
+
+const char* TiXmlElement::ReadValue( const char* p )
+{
+	TiXmlDocument* document = GetDocument();
+
+	// Read in text and elements in any order.
+	p = SkipWhiteSpace( p );
+	while ( p && *p )
+	{
+		if ( *p != '<' )
+		{
+			// Take what we have, make a text element.
+			TiXmlText* textNode = new TiXmlText( "" );
+
+			if ( !textNode )
+			{
+				if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY );
+				    return 0;
+			}
+
+			p = textNode->Parse( p );
+
+			if ( !textNode->Blank() )
+				LinkEndChild( textNode );
+			else
+				delete textNode;
+		} 
+		else 
+		{
+			// We hit a '<'
+			// Have we hit a new element or an end tag?
+			if ( StringEqual( p, "</", false ) )
+			{
+				return p;
+			}
+			else
+			{
+				TiXmlNode* node = Identify( p );
+				if ( node )
+				{
+					p = node->Parse( p );
+					LinkEndChild( node );
+				}				
+				else
+				{
+					return 0;
+				}
+			}
+		}
+		p = SkipWhiteSpace( p );
+	}
+
+	if ( !p )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_READING_ELEMENT_VALUE );
+	}	
+	return p;
+}
+
+
+#ifdef TIXML_USE_STL
+void TiXmlUnknown::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->get();	
+		(*tag) += c;
+
+		if ( c == '>' )
+		{
+			// All is well.
+			return;		
+		}
+	}
+}
+#endif
+
+
+const char* TiXmlUnknown::Parse( const char* p )
+{
+	TiXmlDocument* document = GetDocument();
+	p = SkipWhiteSpace( p );
+	if ( !p || !*p || *p != '<' )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_PARSING_UNKNOWN );
+		return 0;
+	}
+	++p;
+    value = "";
+
+	while ( p && *p && *p != '>' )
+	{
+		value += *p;
+		++p;
+	}
+
+	if ( !p )
+	{
+		if ( document )	document->SetError( TIXML_ERROR_PARSING_UNKNOWN );
+	}
+	if ( *p == '>' )
+		return p+1;
+	return p;
+}
+
+#ifdef TIXML_USE_STL
+void TiXmlComment::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->get();	
+		(*tag) += c;
+
+		if ( c == '>' 
+			 && tag->at( tag->length() - 2 ) == '-'
+			 && tag->at( tag->length() - 3 ) == '-' )
+		{
+			// All is well.
+			return;		
+		}
+	}
+}
+#endif
+
+
+const char* TiXmlComment::Parse( const char* p )
+{
+	TiXmlDocument* document = GetDocument();
+	value = "";
+
+	p = SkipWhiteSpace( p );
+	const char* startTag = "<!--";
+	const char* endTag   = "-->";
+
+	if ( !StringEqual( p, startTag, false ) )
+	{
+		document->SetError( TIXML_ERROR_PARSING_COMMENT );
+		return 0;
+	}
+	p += strlen( startTag );
+	p = ReadText( p, &value, false, endTag, false );
+	return p;
+}
+
+
+const char* TiXmlAttribute::Parse( const char* p )
+{
+	p = SkipWhiteSpace( p );
+	if ( !p || !*p ) return 0;
+
+	// Read the name, the '=' and the value.
+	p = ReadName( p, &name );
+	if ( !p || !*p )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES );
+		return 0;
+	}
+	p = SkipWhiteSpace( p );
+	if ( !p || !*p || *p != '=' )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES );
+		return 0;
+	}
+
+	++p;	// skip '='
+	p = SkipWhiteSpace( p );
+	if ( !p || !*p )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES );
+		return 0;
+	}
+	
+	const char* end;
+
+	if ( *p == '\'' )
+	{
+		++p;
+		end = "\'";
+		p = ReadText( p, &value, false, end, false );
+	}
+	else if ( *p == '"' )
+	{
+		++p;
+		end = "\"";
+		p = ReadText( p, &value, false, end, false );
+	}
+	else
+	{
+		// All attribute values should be in single or double quotes.
+		// But this is such a common error that the parser will try
+		// its best, even without them.
+		value = "";
+		while (    p && *p										// existence
+				&& !isspace( *p ) && *p != '\n' && *p != '\r'	// whitespace
+				&& *p != '/' && *p != '>' )						// tag end
+		{
+			value += *p;
+			++p;
+		}
+	}
+	return p;
+}
+
+#ifdef TIXML_USE_STL
+void TiXmlText::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->peek();	
+		if ( c == '<' )
+			return;
+
+		(*tag) += c;
+		in->get();
+	}
+}
+#endif
+
+const char* TiXmlText::Parse( const char* p )
+{
+	value = "";
+
+	//TiXmlDocument* doc = GetDocument();
+	bool ignoreWhite = true;
+//	if ( doc && !doc->IgnoreWhiteSpace() ) ignoreWhite = false;
+
+	const char* end = "<";
+	p = ReadText( p, &value, ignoreWhite, end, false );
+	if ( p )
+		return p-1;	// don't truncate the '<'
+	return 0;
+}
+
+#ifdef TIXML_USE_STL
+void TiXmlDeclaration::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->get();
+		(*tag) += c;
+
+		if ( c == '>' )
+		{
+			// All is well.
+			return;
+		}
+	}
+}
+#endif
+
+const char* TiXmlDeclaration::Parse( const char* p )
+{
+	p = SkipWhiteSpace( p );
+	// Find the beginning, find the end, and look for
+	// the stuff in-between.
+	TiXmlDocument* document = GetDocument();
+	if ( !p || !*p || !StringEqual( p, "<?xml", true ) )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_PARSING_DECLARATION );
+		return 0;
+	}
+
+	p += 5;
+//	const char* start = p+5;
+//	const char* end  = strstr( start, "?>" );
+
+	version = "";
+	encoding = "";
+	standalone = "";
+
+	while ( p && *p )
+	{
+		if ( *p == '>' )
+		{
+			++p;
+			return p;
+		}
+
+		p = SkipWhiteSpace( p );
+		if ( StringEqual( p, "version", true ) )
+		{
+//			p += 7;
+			TiXmlAttribute attrib;
+			p = attrib.Parse( p );		
+			version = attrib.Value();
+		}
+		else if ( StringEqual( p, "encoding", true ) )
+		{
+//			p += 8;
+			TiXmlAttribute attrib;
+			p = attrib.Parse( p );		
+			encoding = attrib.Value();
+		}
+		else if ( StringEqual( p, "standalone", true ) )
+		{
+//			p += 10;
+			TiXmlAttribute attrib;
+			p = attrib.Parse( p );		
+			standalone = attrib.Value();
+		}
+		else
+		{
+			// Read over whatever it is.
+			while( p && *p && *p != '>' && !isspace( *p ) )
+				++p;
+		}
+	}
+	return 0;
+}
+
+bool TiXmlText::Blank() const
+{
+	for ( unsigned i=0; i<value.length(); i++ )
+		if ( !isspace( value[i] ) )
+			return false;
+	return true;
+}
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinyxml.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinyxml.cpp	(revision 37)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinyxml.cpp	(revision 37)
@@ -0,0 +1,1108 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any
+purpose, including commercial applications, and to alter it and
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+*/
+
+#include <ctype.h>
+#include "tinyxml.h"
+
+bool TiXmlBase::condenseWhiteSpace = true;
+
+void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_OSTREAM* stream )
+{
+	TIXML_STRING buffer;
+	PutString( str, &buffer );
+	(*stream) << buffer;
+}
+
+void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_STRING* outString )
+{
+	int i=0;
+
+	while( i<(int)str.length() )
+	{
+		int c = str[i];
+
+		if (    c == '&' 
+		     && i < ( (int)str.length() - 2 )
+			 && str[i+1] == '#'
+			 && str[i+2] == 'x' )
+		{
+			// Hexadecimal character reference.
+			// Pass through unchanged.
+			// &#xA9;	-- copyright symbol, for example.
+			while ( i<(int)str.length() )
+			{
+				outString->append( str.c_str() + i, 1 );
+				++i;
+				if ( str[i] == ';' )
+					break;
+			}
+		}
+		else if ( c == '&' )
+		{
+			outString->append( entity[0].str, entity[0].strLength );
+			++i;
+		}
+		else if ( c == '<' )
+		{
+			outString->append( entity[1].str, entity[1].strLength );
+			++i;
+		}
+		else if ( c == '>' )
+		{
+			outString->append( entity[2].str, entity[2].strLength );
+			++i;
+		}
+		else if ( c == '\"' )
+		{
+			outString->append( entity[3].str, entity[3].strLength );
+			++i;
+		}
+		else if ( c == '\'' )
+		{
+			outString->append( entity[4].str, entity[4].strLength );
+			++i;
+		}
+		else if ( c < 32 || c > 126 )
+		{
+			// Easy pass at non-alpha/numeric/symbol
+			// 127 is the delete key. Below 32 is symbolic.
+			char buf[ 32 ];
+			sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) );
+			outString->append( buf, strlen( buf ) );
+			++i;
+		}
+		else
+		{
+			char realc = (char) c;
+			outString->append( &realc, 1 );
+			++i;
+		}
+	}
+}
+
+
+TiXmlNode::TiXmlNode( NodeType _type )
+{
+	parent = 0;
+	type = _type;
+	firstChild = 0;
+	lastChild = 0;
+	prev = 0;
+	next = 0;
+	userData = 0;
+}
+
+
+TiXmlNode::~TiXmlNode()
+{
+	TiXmlNode* node = firstChild;
+	TiXmlNode* temp = 0;
+
+	while ( node )
+	{
+		temp = node;
+		node = node->next;
+		delete temp;
+	}	
+}
+
+
+void TiXmlNode::Clear()
+{
+	TiXmlNode* node = firstChild;
+	TiXmlNode* temp = 0;
+
+	while ( node )
+	{
+		temp = node;
+		node = node->next;
+		delete temp;
+	}	
+
+	firstChild = 0;
+	lastChild = 0;
+}
+
+
+TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node )
+{
+	node->parent = this;
+
+	node->prev = lastChild;
+	node->next = 0;
+
+	if ( lastChild )
+		lastChild->next = node;
+	else
+		firstChild = node;			// it was an empty list.
+
+	lastChild = node;
+	return node;
+}
+
+
+TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis )
+{
+	TiXmlNode* node = addThis.Clone();
+	if ( !node )
+		return 0;
+
+	return LinkEndChild( node );
+}
+
+
+TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis )
+{	
+	if ( !beforeThis || beforeThis->parent != this )
+		return 0;
+
+	TiXmlNode* node = addThis.Clone();
+	if ( !node )
+		return 0;
+	node->parent = this;
+
+	node->next = beforeThis;
+	node->prev = beforeThis->prev;
+	if ( beforeThis->prev )
+	{
+		beforeThis->prev->next = node;
+	}
+	else
+	{
+		assert( firstChild == beforeThis );
+		firstChild = node;
+	}
+	beforeThis->prev = node;
+	return node;
+}
+
+
+TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis )
+{
+	if ( !afterThis || afterThis->parent != this )
+		return 0;
+
+	TiXmlNode* node = addThis.Clone();
+	if ( !node )
+		return 0;
+	node->parent = this;
+
+	node->prev = afterThis;
+	node->next = afterThis->next;
+	if ( afterThis->next )
+	{
+		afterThis->next->prev = node;
+	}
+	else
+	{
+		assert( lastChild == afterThis );
+		lastChild = node;
+	}
+	afterThis->next = node;
+	return node;
+}
+
+
+TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis )
+{
+	if ( replaceThis->parent != this )
+		return 0;
+
+	TiXmlNode* node = withThis.Clone();
+	if ( !node )
+		return 0;
+
+	node->next = replaceThis->next;
+	node->prev = replaceThis->prev;
+
+	if ( replaceThis->next )
+		replaceThis->next->prev = node;
+	else
+		lastChild = node;
+
+	if ( replaceThis->prev )
+		replaceThis->prev->next = node;
+	else
+		firstChild = node;
+
+	delete replaceThis;
+	node->parent = this;
+	return node;
+}
+
+
+bool TiXmlNode::RemoveChild( TiXmlNode* removeThis )
+{
+	if ( removeThis->parent != this )
+	{	
+		assert( 0 );
+		return false;
+	}
+
+	if ( removeThis->next )
+		removeThis->next->prev = removeThis->prev;
+	else
+		lastChild = removeThis->prev;
+
+	if ( removeThis->prev )
+		removeThis->prev->next = removeThis->next;
+	else
+		firstChild = removeThis->next;
+
+	delete removeThis;
+	return true;
+}
+
+TiXmlNode* TiXmlNode::FirstChild( const char * value ) const
+{
+	TiXmlNode* node;
+	for ( node = firstChild; node; node = node->next )
+	{
+		if ( node->SValue() == TIXML_STRING( value ))
+			return node;
+	}
+	return 0;
+}
+
+TiXmlNode* TiXmlNode::LastChild( const char * value ) const
+{
+	TiXmlNode* node;
+	for ( node = lastChild; node; node = node->prev )
+	{
+		if ( node->SValue() == TIXML_STRING (value))
+			return node;
+	}
+	return 0;
+}
+
+TiXmlNode* TiXmlNode::IterateChildren( TiXmlNode* previous ) const
+{
+	if ( !previous )
+	{
+		return FirstChild();
+	}
+	else
+	{
+		assert( previous->parent == this );
+		return previous->NextSibling();
+	}
+}
+
+TiXmlNode* TiXmlNode::IterateChildren( const char * val, TiXmlNode* previous ) const
+{
+	if ( !previous )
+	{
+		return FirstChild( val );
+	}
+	else
+	{
+		assert( previous->parent == this );
+		return previous->NextSibling( val );
+	}
+}
+
+TiXmlNode* TiXmlNode::NextSibling( const char * value ) const
+{
+	TiXmlNode* node;
+	for ( node = next; node; node = node->next )
+	{
+		if ( node->SValue() == TIXML_STRING (value))
+			return node;
+	}
+	return 0;
+}
+
+
+TiXmlNode* TiXmlNode::PreviousSibling( const char * value ) const
+{
+	TiXmlNode* node;
+	for ( node = prev; node; node = node->prev )
+	{
+		if ( node->SValue() == TIXML_STRING (value))
+			return node;
+	}
+	return 0;
+}
+
+void TiXmlElement::RemoveAttribute( const char * name )
+{
+	TiXmlAttribute* node = attributeSet.Find( name );
+	if ( node )
+	{
+		attributeSet.Remove( node );
+		delete node;
+	}
+}
+
+TiXmlElement* TiXmlNode::FirstChildElement() const
+{
+	TiXmlNode* node;
+
+	for (	node = FirstChild();
+	node;
+	node = node->NextSibling() )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+TiXmlElement* TiXmlNode::FirstChildElement( const char * value ) const
+{
+	TiXmlNode* node;
+
+	for (	node = FirstChild( value );
+	node;
+	node = node->NextSibling( value ) )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+
+TiXmlElement* TiXmlNode::NextSiblingElement() const
+{
+	TiXmlNode* node;
+
+	for (	node = NextSibling();
+	node;
+	node = node->NextSibling() )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+TiXmlElement* TiXmlNode::NextSiblingElement( const char * value ) const
+{
+	TiXmlNode* node;
+
+	for (	node = NextSibling( value );
+	node;
+	node = node->NextSibling( value ) )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+
+
+TiXmlDocument* TiXmlNode::GetDocument() const
+{
+	const TiXmlNode* node;
+
+	for( node = this; node; node = node->parent )
+	{
+		if ( node->ToDocument() )
+			return node->ToDocument();
+	}
+	return 0;
+}
+
+
+TiXmlElement::TiXmlElement (const char * _value)
+: TiXmlNode( TiXmlNode::ELEMENT )
+{
+	firstChild = lastChild = 0;
+	value = _value;
+}
+
+TiXmlElement::~TiXmlElement()
+{
+	while( attributeSet.First() )
+	{
+		TiXmlAttribute* node = attributeSet.First();
+		attributeSet.Remove( node );
+		delete node;
+	}
+}
+
+// BEGIN OGRE CHANGES
+// USE STL ALONE
+#ifndef TIXML_USE_STL
+const char * TiXmlElement::Attribute( const char * name ) const
+{
+	TiXmlAttribute* node = attributeSet.Find( name );
+
+	if ( node )
+		return node->Value();
+
+	return 0;
+}
+
+
+const char * TiXmlElement::Attribute( const char * name, int* i ) const
+{
+	const char * s = Attribute( name );
+	if ( i )
+	{
+		if ( s )
+			*i = atoi( s );
+		else
+			*i = 0;
+	}
+	return s;
+}
+
+
+void TiXmlElement::SetAttribute( const char * name, int val )
+{	
+	char buf[64];
+	sprintf( buf, "%d", val );
+	SetAttribute( name, buf );
+}
+
+
+void TiXmlElement::SetAttribute( const char * name, const char * value )
+{
+	TiXmlAttribute* node = attributeSet.Find( name );
+	if ( node )
+	{
+		node->SetValue( value );
+		return;
+	}
+
+	TiXmlAttribute* attrib = new TiXmlAttribute( name, value );
+	if ( attrib )
+	{
+		attributeSet.Add( attrib );
+	}
+	else
+	{
+		TiXmlDocument* document = GetDocument();
+		if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY );
+	}
+}
+
+#endif
+
+#ifdef TIXML_USE_STL
+
+const char * TiXmlElement::Attribute( const std::string& name ) const
+{
+	TiXmlAttribute* node = attributeSet.Find( name.c_str() );
+
+	if ( node )
+		return node->Value();
+
+	return 0;
+}
+
+
+const char * TiXmlElement::Attribute( const std::string& name, int* i ) const
+{
+	const char * s = Attribute( name );
+	if ( i )
+	{
+		if ( s )
+			*i = atoi( s );
+		else
+			*i = 0;
+	}
+	return s;
+}
+
+
+void TiXmlElement::SetAttribute( const std::string& name, int val )
+{	
+	char buf[64];
+	sprintf( buf, "%d", val );
+	SetAttribute( name, buf );
+}
+
+
+void TiXmlElement::SetAttribute( const std::string& name, const std::string& value )
+{
+	TiXmlAttribute* node = attributeSet.Find( name.c_str() );
+	if ( node )
+	{
+		node->SetValue( value );
+		return;
+	}
+
+	TiXmlAttribute* attrib = new TiXmlAttribute( name, value );
+	if ( attrib )
+	{
+		attributeSet.Add( attrib );
+	}
+	else
+	{
+		TiXmlDocument* document = GetDocument();
+		if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY );
+	}
+}
+
+#endif
+// END OGRE CHANGES
+void TiXmlElement::Print( FILE* cfile, int depth ) const
+{
+	int i;
+	for ( i=0; i<depth; i++ )
+	{
+		fprintf( cfile, "    " );
+	}
+
+	fprintf( cfile, "<%s", value.c_str() );
+
+	TiXmlAttribute* attrib;
+	for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() )
+	{
+		fprintf( cfile, " " );
+		attrib->Print( cfile, depth );
+	}
+
+	// There are 3 different formatting approaches:
+	// 1) An element without children is printed as a <foo /> node
+	// 2) An element with only a text child is printed as <foo> text </foo>
+	// 3) An element with children is printed on multiple lines.
+	TiXmlNode* node;
+	if ( !firstChild )
+	{
+		fprintf( cfile, " />" );
+	}
+	else if ( firstChild == lastChild && firstChild->ToText() )
+	{
+		fprintf( cfile, ">" );
+		firstChild->Print( cfile, depth + 1 );
+		fprintf( cfile, "</%s>", value.c_str() );
+	}
+	else
+	{
+		fprintf( cfile, ">" );
+
+		for ( node = firstChild; node; node=node->NextSibling() )
+		{
+			if ( !node->ToText() )
+			{
+				fprintf( cfile, "\n" );
+			}
+			node->Print( cfile, depth+1 );
+		}
+		fprintf( cfile, "\n" );
+		for( i=0; i<depth; ++i )
+		fprintf( cfile, "    " );
+		fprintf( cfile, "</%s>", value.c_str() );
+	}
+}
+
+void TiXmlElement::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	(*stream) << "<" << value;
+
+	TiXmlAttribute* attrib;
+	for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() )
+	{	
+		(*stream) << " ";
+		attrib->StreamOut( stream );
+	}
+
+	// If this node has children, give it a closing tag. Else
+	// make it an empty tag.
+	TiXmlNode* node;
+	if ( firstChild )
+	{ 		
+		(*stream) << ">";
+
+		for ( node = firstChild; node; node=node->NextSibling() )
+		{
+			node->StreamOut( stream );
+		}
+		(*stream) << "</" << value << ">";
+	}
+	else
+	{
+		(*stream) << " />";
+	}
+}
+
+TiXmlNode* TiXmlElement::Clone() const
+{
+	TiXmlElement* clone = new TiXmlElement( Value() );
+	if ( !clone )
+		return 0;
+
+	CopyToClone( clone );
+
+	// Clone the attributes, then clone the children.
+	TiXmlAttribute* attribute = 0;
+	for(	attribute = attributeSet.First();
+	attribute;
+	attribute = attribute->Next() )
+	{
+		clone->SetAttribute( attribute->Name(), attribute->Value() );
+	}
+
+	TiXmlNode* node = 0;
+	for ( node = firstChild; node; node = node->NextSibling() )
+	{
+		clone->LinkEndChild( node->Clone() );
+	}
+	return clone;
+}
+
+
+TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT )
+{
+	error = false;
+	//	ignoreWhiteSpace = true;
+}
+
+TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT )
+{
+	//	ignoreWhiteSpace = true;
+	value = documentName;
+	error = false;
+}
+
+bool TiXmlDocument::LoadFile()
+{
+	if ( LoadFile( value.c_str() ) )
+		return true;
+
+	return false;
+}
+
+
+bool TiXmlDocument::SaveFile() const
+{
+	if ( SaveFile( value.c_str() ) )
+		return true;
+
+	return false;
+}
+
+bool TiXmlDocument::LoadFile( const char* filename )
+{
+	// Delete the existing data:
+	Clear();
+
+	// There was a really terrifying little bug here. The code:
+	//		value = filename
+	// in the STL case, cause the assignment method of the std::string to
+	// be called. What is strange, is that the std::string had the same
+	// address as it's c_str() method, and so bad things happen. Looks
+	// like a bug in the Microsoft STL implementation.
+	// See STL_STRING_BUG above.
+	// Fixed with the StringToBuffer class.
+	value = filename;
+
+	FILE* file = fopen( value.c_str (), "r" );
+
+	if ( file )
+	{
+		// Get the file size, so we can pre-allocate the string. HUGE speed impact.
+		long length = 0;
+		fseek( file, 0, SEEK_END );
+		length = ftell( file );
+		fseek( file, 0, SEEK_SET );
+
+		// Strange case, but good to handle up front.
+		if ( length == 0 )
+		{
+			fclose( file );
+			return false;
+		}
+
+		// If we have a file, assume it is all one big XML file, and read it in.
+		// The document parser may decide the document ends sooner than the entire file, however.
+		TIXML_STRING data;
+		data.reserve( length );
+
+		const int BUF_SIZE = 2048;
+		char buf[BUF_SIZE];
+
+		while( fgets( buf, BUF_SIZE, file ) )
+		{
+			data += buf;
+		}
+		fclose( file );
+
+		Parse( data.c_str() );
+		if (  !Error() )
+		{
+			return true;
+		}
+	}
+	SetError( TIXML_ERROR_OPENING_FILE );
+	return false;
+}
+
+bool TiXmlDocument::SaveFile( const char * filename ) const
+{
+	// The old c stuff lives on...
+	FILE* fp = fopen( filename, "w" );
+	if ( fp )
+	{
+		Print( fp, 0 );
+		fclose( fp );
+		return true;
+	}
+	return false;
+}
+
+
+TiXmlNode* TiXmlDocument::Clone() const
+{
+	TiXmlDocument* clone = new TiXmlDocument();
+	if ( !clone )
+		return 0;
+
+	CopyToClone( clone );
+	clone->error = error;
+	clone->errorDesc = errorDesc.c_str ();
+
+	TiXmlNode* node = 0;
+	for ( node = firstChild; node; node = node->NextSibling() )
+	{
+		clone->LinkEndChild( node->Clone() );
+	}
+	return clone;
+}
+
+
+void TiXmlDocument::Print( FILE* cfile, int depth ) const
+{
+	TiXmlNode* node;
+	for ( node=FirstChild(); node; node=node->NextSibling() )
+	{
+		node->Print( cfile, depth );
+		fprintf( cfile, "\n" );
+	}
+}
+
+void TiXmlDocument::StreamOut( TIXML_OSTREAM * out ) const
+{
+	TiXmlNode* node;
+	for ( node=FirstChild(); node; node=node->NextSibling() )
+	{
+		node->StreamOut( out );
+
+		// Special rule for streams: stop after the root element.
+		// The stream in code will only read one element, so don't
+		// write more than one.
+		if ( node->ToElement() )
+			break;
+	}
+}
+
+TiXmlAttribute* TiXmlAttribute::Next() const
+{
+	// We are using knowledge of the sentinel. The sentinel
+	// have a value or name.
+	if ( next->value.empty() && next->name.empty() )
+		return 0;
+	return next;
+}
+
+
+TiXmlAttribute* TiXmlAttribute::Previous() const
+{
+	// We are using knowledge of the sentinel. The sentinel
+	// have a value or name.
+	if ( prev->value.empty() && prev->name.empty() )
+		return 0;
+	return prev;
+}
+
+
+void TiXmlAttribute::Print( FILE* cfile, int /*depth*/ ) const
+{
+	TIXML_STRING n, v;
+
+	PutString( Name(), &n );
+	PutString( Value(), &v );
+
+	if (value.find ('\"') == TIXML_STRING::npos)
+		fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() );
+	else
+		fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() );
+}
+
+
+void TiXmlAttribute::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	if (value.find( '\"' ) != TIXML_STRING::npos)
+	{
+		PutString( name, stream );
+		(*stream) << "=" << "'";
+		PutString( value, stream );
+		(*stream) << "'";
+	}
+	else
+	{
+		PutString( name, stream );
+		(*stream) << "=" << "\"";
+		PutString( value, stream );
+		(*stream) << "\"";
+	}
+}
+
+void TiXmlAttribute::SetIntValue( int value )
+{
+	char buf [64];
+	sprintf (buf, "%d", value);
+	SetValue (buf);
+}
+
+void TiXmlAttribute::SetDoubleValue( double value )
+{
+	char buf [64];
+	sprintf (buf, "%lf", value);
+	SetValue (buf);
+}
+
+const int TiXmlAttribute::IntValue() const
+{
+	return atoi (value.c_str ());
+}
+
+const double  TiXmlAttribute::DoubleValue() const
+{
+	return atof (value.c_str ());
+}
+
+void TiXmlComment::Print( FILE* cfile, int depth ) const
+{
+	for ( int i=0; i<depth; i++ )
+	{
+		fputs( "    ", cfile );
+	}
+	fprintf( cfile, "<!--%s-->", value.c_str() );
+}
+
+void TiXmlComment::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	(*stream) << "<!--";
+	PutString( value, stream );
+	(*stream) << "-->";
+}
+
+TiXmlNode* TiXmlComment::Clone() const
+{
+	TiXmlComment* clone = new TiXmlComment();
+
+	if ( !clone )
+		return 0;
+
+	CopyToClone( clone );
+	return clone;
+}
+
+
+void TiXmlText::Print( FILE* cfile, int /*depth*/ ) const
+{
+	TIXML_STRING buffer;
+	PutString( value, &buffer );
+	fprintf( cfile, "%s", buffer.c_str() );
+}
+
+
+void TiXmlText::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	PutString( value, stream );
+}
+
+
+TiXmlNode* TiXmlText::Clone() const
+{	
+	TiXmlText* clone = 0;
+	clone = new TiXmlText( "" );
+
+	if ( !clone )
+		return 0;
+
+	CopyToClone( clone );
+	return clone;
+}
+
+
+TiXmlDeclaration::TiXmlDeclaration( const char * _version,
+	const char * _encoding,
+	const char * _standalone )
+: TiXmlNode( TiXmlNode::DECLARATION )
+{
+	version = _version;
+	encoding = _encoding;
+	standalone = _standalone;
+}
+
+
+void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/ ) const
+{
+	fprintf (cfile, "<?xml ");
+
+	if ( !version.empty() )
+		fprintf (cfile, "version=\"%s\" ", version.c_str ());
+	if ( !encoding.empty() )
+		fprintf (cfile, "encoding=\"%s\" ", encoding.c_str ());
+	if ( !standalone.empty() )
+		fprintf (cfile, "standalone=\"%s\" ", standalone.c_str ());
+	fprintf (cfile, "?>");
+}
+
+void TiXmlDeclaration::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	(*stream) << "<?xml ";
+
+	if ( !version.empty() )
+	{
+		(*stream) << "version=\"";
+		PutString( version, stream );
+		(*stream) << "\" ";
+	}
+	if ( !encoding.empty() )
+	{
+		(*stream) << "encoding=\"";
+		PutString( encoding, stream );
+		(*stream ) << "\" ";
+	}
+	if ( !standalone.empty() )
+	{
+		(*stream) << "standalone=\"";
+		PutString( standalone, stream );
+		(*stream) << "\" ";
+	}
+	(*stream) << "?>";
+}
+
+TiXmlNode* TiXmlDeclaration::Clone() const
+{	
+	TiXmlDeclaration* clone = new TiXmlDeclaration();
+
+	if ( !clone )
+		return 0;
+
+	CopyToClone( clone );
+	clone->version = version;
+	clone->encoding = encoding;
+	clone->standalone = standalone;
+	return clone;
+}
+
+
+void TiXmlUnknown::Print( FILE* cfile, int depth ) const
+{
+	for ( int i=0; i<depth; i++ )
+		fprintf( cfile, "    " );
+	fprintf( cfile, "%s", value.c_str() );
+}
+
+void TiXmlUnknown::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	(*stream) << "<" << value << ">";		// Don't use entities hear! It is unknown.
+}
+
+TiXmlNode* TiXmlUnknown::Clone() const
+{
+	TiXmlUnknown* clone = new TiXmlUnknown();
+
+	if ( !clone )
+		return 0;
+
+	CopyToClone( clone );
+	return clone;
+}
+
+
+TiXmlAttributeSet::TiXmlAttributeSet()
+{
+	sentinel.next = &sentinel;
+	sentinel.prev = &sentinel;
+}
+
+
+TiXmlAttributeSet::~TiXmlAttributeSet()
+{
+	assert( sentinel.next == &sentinel );
+	assert( sentinel.prev == &sentinel );
+}
+
+
+void TiXmlAttributeSet::Add( TiXmlAttribute* addMe )
+{
+	assert( !Find( addMe->Name() ) );	// Shouldn't be multiply adding to the set.
+
+	addMe->next = &sentinel;
+	addMe->prev = sentinel.prev;
+
+	sentinel.prev->next = addMe;
+	sentinel.prev      = addMe;
+}
+
+void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe )
+{
+	TiXmlAttribute* node;
+
+	for( node = sentinel.next; node != &sentinel; node = node->next )
+	{
+		if ( node == removeMe )
+		{
+			node->prev->next = node->next;
+			node->next->prev = node->prev;
+			node->next = 0;
+			node->prev = 0;
+			return;
+		}
+	}
+	assert( 0 );		// we tried to remove a non-linked attribute.
+}
+
+TiXmlAttribute*	TiXmlAttributeSet::Find( const char * name ) const
+{
+	TiXmlAttribute* node;
+
+	for( node = sentinel.next; node != &sentinel; node = node->next )
+	{
+		if ( node->name == name )
+			return node;
+	}
+	return 0;
+}
+
+
+#ifdef TIXML_USE_STL	
+TIXML_ISTREAM & operator >> (TIXML_ISTREAM & in, TiXmlNode & base)
+{
+	TIXML_STRING tag;
+	tag.reserve( 8 * 1000 );
+	base.StreamIn( &in, &tag );
+
+	base.Parse( tag.c_str() );
+	return in;
+}
+#endif
+
+
+TIXML_OSTREAM & operator<< (TIXML_OSTREAM & out, const TiXmlNode & base)
+{
+	base.StreamOut (& out);
+	return out;
+}
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinyxml.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinyxml.h	(revision 37)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinyxml.h	(revision 37)
@@ -0,0 +1,956 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any
+purpose, including commercial applications, and to alter it and
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+*/
+
+
+#ifndef TINYXML_INCLUDED
+#define TINYXML_INCLUDED
+
+#ifdef _MSC_VER
+#pragma warning( disable : 4530 )
+#pragma warning( disable : 4786 )
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+// Help out windows:
+#if defined( _DEBUG ) && !defined( DEBUG )
+#define DEBUG
+#endif
+
+#if defined( DEBUG ) && defined( _MSC_VER )
+#define NOMINMAX
+#include <windows.h>
+#define TIXML_LOG OutputDebugString
+#else
+#define TIXML_LOG printf
+#endif
+
+
+#ifdef TIXML_USE_STL
+	#include <string>
+    #include <iostream>
+	#define TIXML_STRING	std::string
+	#define TIXML_ISTREAM	std::istream
+	#define TIXML_OSTREAM	std::ostream
+#else
+	#include "tinystr.h"
+	#define TIXML_STRING	TiXmlString
+	#define TIXML_OSTREAM	TiXmlOutStream
+#endif
+
+class TiXmlDocument;
+class TiXmlElement;
+class TiXmlComment;
+class TiXmlUnknown;
+class TiXmlAttribute;
+class TiXmlText;
+class TiXmlDeclaration;
+
+
+/** TiXmlBase is a base class for every class in TinyXml.
+	It does little except to establish that TinyXml classes
+	can be printed and provide some utility functions.
+
+	In XML, the document and elements can contain
+	other elements and other types of nodes.
+
+	@verbatim
+	A Document can contain:	Element	(container or leaf)
+							Comment (leaf)
+							Unknown (leaf)
+							Declaration( leaf )
+
+	An Element can contain:	Element (container or leaf)
+							Text	(leaf)
+							Attributes (not on tree)
+							Comment (leaf)
+							Unknown (leaf)
+
+	A Decleration contains: Attributes (not on tree)
+	@endverbatim
+*/
+class TiXmlBase
+{
+	friend class TiXmlNode;
+	friend class TiXmlElement;
+	friend class TiXmlDocument;
+
+public:
+	TiXmlBase()								{}
+	virtual ~TiXmlBase()					{}
+
+	/**	All TinyXml classes can print themselves to a filestream.
+		This is a formatted print, and will insert tabs and newlines.
+		
+		(For an unformatted stream, use the << operator.)
+	*/
+	virtual void Print( FILE* cfile, int depth ) const = 0;
+
+	/**	The world does not agree on whether white space should be kept or
+		not. In order to make everyone happy, these global, static functions
+		are provided to set whether or not TinyXml will condense all white space
+		into a single space or not. The default is to condense. Note changing these
+		values is not thread safe.
+	*/
+	static void SetCondenseWhiteSpace( bool condense )		{ condenseWhiteSpace = condense; }
+
+	/// Return the current white space setting.
+	static bool IsWhiteSpaceCondensed()						{ return condenseWhiteSpace; }
+
+protected:
+
+	static const char*	SkipWhiteSpace( const char* );
+	inline static bool	IsWhiteSpace( int c )		{ return ( isspace( c ) || c == '\n' || c == '\r' ); }
+
+	virtual void StreamOut (TIXML_OSTREAM *) const = 0;
+
+	#ifdef TIXML_USE_STL
+	    static bool	StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	    static bool StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag );
+	#endif
+
+	/*	Reads an XML name into the string provided. Returns
+		a pointer just past the last character of the name,
+		or 0 if the function has an error.
+	*/
+	static const char* ReadName( const char* p, TIXML_STRING* name );
+
+	/*	Reads text. Returns a pointer past the given end tag.
+		Wickedly complex options, but it keeps the (sensitive) code in one place.
+	*/
+	static const char* ReadText(	const char* in,				// where to start
+									TIXML_STRING* text,			// the string read
+									bool ignoreWhiteSpace,		// whether to keep the white space
+									const char* endTag,			// what ends this text
+									bool ignoreCase );			// whether to ignore case in the end tag
+	virtual const char* Parse( const char* p ) = 0;
+
+	// If an entity has been found, transform it into a character.
+	static const char* GetEntity( const char* in, char* value );
+
+	// Get a character, while interpreting entities.
+	inline static const char* GetChar( const char* p, char* value )
+	{
+		assert( p );
+		if ( *p == '&' )
+		{
+			return GetEntity( p, value );
+		}
+		else
+		{
+			*value = *p;
+			return p+1;
+		}
+	}
+
+	// Puts a string to a stream, expanding entities as it goes.
+	// Note this should not contian the '<', '>', etc, or they will be transformed into entities!
+	static void PutString( const TIXML_STRING& str, TIXML_OSTREAM* out );
+
+	static void PutString( const TIXML_STRING& str, TIXML_STRING* out );
+
+	// Return true if the next characters in the stream are any of the endTag sequences.
+	bool static StringEqual(	const char* p,
+								const char* endTag,
+								bool ignoreCase );
+
+
+	enum
+	{
+		TIXML_NO_ERROR = 0,
+		TIXML_ERROR,
+		TIXML_ERROR_OPENING_FILE,
+		TIXML_ERROR_OUT_OF_MEMORY,
+		TIXML_ERROR_PARSING_ELEMENT,
+		TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME,
+		TIXML_ERROR_READING_ELEMENT_VALUE,
+		TIXML_ERROR_READING_ATTRIBUTES,
+		TIXML_ERROR_PARSING_EMPTY,
+		TIXML_ERROR_READING_END_TAG,
+		TIXML_ERROR_PARSING_UNKNOWN,
+		TIXML_ERROR_PARSING_COMMENT,
+		TIXML_ERROR_PARSING_DECLARATION,
+		TIXML_ERROR_DOCUMENT_EMPTY,
+
+		TIXML_ERROR_STRING_COUNT
+	};
+	static const char* errorString[ TIXML_ERROR_STRING_COUNT ];
+
+private:
+	struct Entity
+	{
+		const char*     str;
+		unsigned int	strLength;
+		char		    chr;
+	};
+	enum
+	{
+		NUM_ENTITY = 5,
+		MAX_ENTITY_LENGTH = 6
+
+	};
+	static Entity entity[ NUM_ENTITY ];
+	static bool condenseWhiteSpace;
+};
+
+
+/** The parent class for everything in the Document Object Model.
+	(Except for attributes, which are contained in elements.)
+	Nodes have siblings, a parent, and children. A node can be
+	in a document, or stand on its own. The type of a TiXmlNode
+	can be queried, and it can be cast to its more defined type.
+*/
+class TiXmlNode : public TiXmlBase
+{
+	friend class TiXmlDocument;
+	friend class TiXmlElement;
+
+public:
+	#ifdef TIXML_USE_STL	
+
+	    /** An input stream operator, for every class. Tolerant of newlines and
+		    formatting, but doesn't expect them.
+	    */
+	    friend std::istream& operator >> (std::istream& in, TiXmlNode& base);
+
+	    /** An output stream operator, for every class. Note that this outputs
+		    without any newlines or formatting, as opposed to Print(), which
+		    includes tabs and new lines.
+
+		    The operator<< and operator>> are not completely symmetric. Writing
+		    a node to a stream is very well defined. You'll get a nice stream
+		    of output, without any extra whitespace or newlines.
+		    
+		    But reading is not as well defined. (As it always is.) If you create
+		    a TiXmlElement (for example) and read that from an input stream,
+		    the text needs to define an element or junk will result. This is
+		    true of all input streams, but it's worth keeping in mind.
+
+		    A TiXmlDocument will read nodes until it reads a root element.
+	    */	
+	    friend std::ostream & operator<< (std::ostream& out, const TiXmlNode& base);
+
+	#else
+	    // Used internally, not part of the public API.
+	    friend TIXML_OSTREAM& operator<< (TIXML_OSTREAM& out, const TiXmlNode& base);
+	#endif
+
+	/** The types of XML nodes supported by TinyXml. (All the
+			unsupported types are picked up by UNKNOWN.)
+	*/
+	enum NodeType
+	{
+		DOCUMENT,
+		ELEMENT,
+		COMMENT,
+		UNKNOWN,
+		TEXT,
+		DECLARATION,
+		TYPECOUNT
+	};
+
+	virtual ~TiXmlNode();
+
+	/** The meaning of 'value' changes for the specific type of
+		TiXmlNode.
+		@verbatim
+		Document:	filename of the xml file
+		Element:	name of the element
+		Comment:	the comment text
+		Unknown:	the tag contents
+		Text:		the text string
+		@endverbatim
+
+		The subclasses will wrap this function.
+	*/
+	const char * Value () const { return value.c_str (); }
+
+	/** Changes the value of the node. Defined as:
+		@verbatim
+		Document:	filename of the xml file
+		Element:	name of the element
+		Comment:	the comment text
+		Unknown:	the tag contents
+		Text:		the text string
+		@endverbatim
+	*/
+	void SetValue (const char * _value) { value = _value;}
+
+    #ifdef TIXML_USE_STL
+	/// STL std::string form.
+	void SetValue( const std::string& value )    
+	{	  
+		SetValue( value.c_str() );    	
+	}	
+	#endif
+
+	/// Delete all the children of this node. Does not affect 'this'.
+	void Clear();
+
+	/// One step up the DOM.
+	TiXmlNode* Parent() const					{ return parent; }
+
+	TiXmlNode* FirstChild()	const	{ return firstChild; }		///< The first child of this node. Will be null if there are no children.
+	TiXmlNode* FirstChild( const char * value ) const;			///< The first child of this node with the matching 'value'. Will be null if none found.
+
+	TiXmlNode* LastChild() const	{ return lastChild; }		/// The last child of this node. Will be null if there are no children.
+	TiXmlNode* LastChild( const char * value ) const;			/// The last child of this node matching 'value'. Will be null if there are no children.
+
+    #ifdef TIXML_USE_STL
+	TiXmlNode* FirstChild( const std::string& value ) const	{	return FirstChild (value.c_str ());	}	///< STL std::string form.
+	TiXmlNode* LastChild( const std::string& value ) const	{	return LastChild (value.c_str ());	}	///< STL std::string form.
+	#endif
+
+	/** An alternate way to walk the children of a node.
+		One way to iterate over nodes is:
+		@verbatim
+			for( child = parent->FirstChild(); child; child = child->NextSibling() )
+		@endverbatim
+
+		IterateChildren does the same thing with the syntax:
+		@verbatim
+			child = 0;
+			while( child = parent->IterateChildren( child ) )
+		@endverbatim
+
+		IterateChildren takes the previous child as input and finds
+		the next one. If the previous child is null, it returns the
+		first. IterateChildren will return null when done.
+	*/
+	TiXmlNode* IterateChildren( TiXmlNode* previous ) const;
+
+	/// This flavor of IterateChildren searches for children with a particular 'value'
+	TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous ) const;
+
+    #ifdef TIXML_USE_STL
+	TiXmlNode* IterateChildren( const std::string& value, TiXmlNode* previous ) const	{	return IterateChildren (value.c_str (), previous);	}	///< STL std::string form.
+	#endif
+
+	/** Add a new node related to this. Adds a child past the LastChild.
+		Returns a pointer to the new object or NULL if an error occured.
+	*/
+	TiXmlNode* InsertEndChild( const TiXmlNode& addThis );
+
+	/** Add a new node related to this. Adds a child before the specified child.
+		Returns a pointer to the new object or NULL if an error occured.
+	*/
+	TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
+
+	/** Add a new node related to this. Adds a child after the specified child.
+		Returns a pointer to the new object or NULL if an error occured.
+	*/
+	TiXmlNode* InsertAfterChild(  TiXmlNode* afterThis, const TiXmlNode& addThis );
+
+	/** Replace a child of this node.
+		Returns a pointer to the new object or NULL if an error occured.
+	*/
+	TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
+
+	/// Delete a child of this node.
+	bool RemoveChild( TiXmlNode* removeThis );
+
+	/// Navigate to a sibling node.
+	TiXmlNode* PreviousSibling() const			{ return prev; }
+
+	/// Navigate to a sibling node.
+	TiXmlNode* PreviousSibling( const char * ) const;
+
+    #ifdef TIXML_USE_STL
+	TiXmlNode* PreviousSibling( const std::string& value ) const	{	return PreviousSibling (value.c_str ());	}	///< STL std::string form.
+	TiXmlNode* NextSibling( const std::string& value) const	{	return NextSibling (value.c_str ());	}	///< STL std::string form.
+	#endif
+
+	/// Navigate to a sibling node.
+	TiXmlNode* NextSibling() const				{ return next; }
+
+	/// Navigate to a sibling node with the given 'value'.
+	TiXmlNode* NextSibling( const char * ) const;
+
+	/** Convenience function to get through elements.
+		Calls NextSibling and ToElement. Will skip all non-Element
+		nodes. Returns 0 if there is not another element.
+	*/
+	TiXmlElement* NextSiblingElement() const;
+
+	/** Convenience function to get through elements.
+		Calls NextSibling and ToElement. Will skip all non-Element
+		nodes. Returns 0 if there is not another element.
+	*/
+	TiXmlElement* NextSiblingElement( const char * ) const;
+
+    #ifdef TIXML_USE_STL
+	TiXmlElement* NextSiblingElement( const std::string& value) const	{	return NextSiblingElement (value.c_str ());	}	///< STL std::string form.
+	#endif
+
+	/// Convenience function to get through elements.
+	TiXmlElement* FirstChildElement()	const;
+
+	/// Convenience function to get through elements.
+	TiXmlElement* FirstChildElement( const char * value ) const;
+
+    #ifdef TIXML_USE_STL
+	TiXmlElement* FirstChildElement( const std::string& value ) const	{	return FirstChildElement (value.c_str ());	}	///< STL std::string form.
+	#endif
+
+	/// Query the type (as an enumerated value, above) of this node.
+	virtual int Type() const	{ return type; }
+
+	/** Return a pointer to the Document this node lives in.
+		Returns null if not in a document.
+	*/
+	TiXmlDocument* GetDocument() const;
+
+	/// Returns true if this node has no children.
+	bool NoChildren() const						{ return !firstChild; }
+
+	TiXmlDocument* ToDocument()	const		{ return ( this && type == DOCUMENT ) ? (TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlElement*  ToElement() const		{ return ( this && type == ELEMENT  ) ? (TiXmlElement*)  this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlComment*  ToComment() const		{ return ( this && type == COMMENT  ) ? (TiXmlComment*)  this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlUnknown*  ToUnknown() const		{ return ( this && type == UNKNOWN  ) ? (TiXmlUnknown*)  this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlText*	   ToText()    const		{ return ( this && type == TEXT     ) ? (TiXmlText*)     this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlDeclaration* ToDeclaration() const	{ return ( this && type == DECLARATION ) ? (TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+
+	virtual TiXmlNode* Clone() const = 0;
+
+	void  SetUserData( void* user )			{ userData = user; }
+	void* GetUserData()						{ return userData; }
+
+protected:
+	TiXmlNode( NodeType type );
+
+	#ifdef TIXML_USE_STL
+	    // The real work of the input operator.
+	    virtual void StreamIn( TIXML_ISTREAM* in, TIXML_STRING* tag ) = 0;
+	#endif
+
+	// The node is passed in by ownership. This object will delete it.
+	TiXmlNode* LinkEndChild( TiXmlNode* addThis );
+
+	// Figure out what is at *p, and parse it. Returns null if it is not an xml node.
+	TiXmlNode* Identify( const char* start );
+	void CopyToClone( TiXmlNode* target ) const	{ target->SetValue (value.c_str() );
+												  target->userData = userData; }
+
+	// Internal Value function returning a TIXML_STRING
+	TIXML_STRING SValue() const	{ return value ; }
+
+	TiXmlNode*		parent;
+	NodeType		type;
+
+	TiXmlNode*		firstChild;
+	TiXmlNode*		lastChild;
+
+	TIXML_STRING	value;
+
+	TiXmlNode*		prev;
+	TiXmlNode*		next;
+	void*			userData;
+};
+
+
+/** An attribute is a name-value pair. Elements have an arbitrary
+	number of attributes, each with a unique name.
+
+	@note The attributes are not TiXmlNodes, since they are not
+		  part of the tinyXML document object model. There are other
+		  suggested ways to look at this problem.
+
+	@note Attributes have a parent
+*/
+class TiXmlAttribute : public TiXmlBase
+{
+	friend class TiXmlAttributeSet;
+
+public:
+	/// Construct an empty attribute.
+	TiXmlAttribute() : prev( 0 ), next( 0 )	{}
+
+	#ifdef TIXML_USE_STL
+	/// std::string constructor.
+	TiXmlAttribute( const std::string& _name, const std::string& _value )
+	{
+		name = _name;
+		value = _value;
+	}
+	#endif
+
+	/// Construct an attribute with a name and value.
+	TiXmlAttribute( const char * _name, const char * _value ): name( _name ), value( _value ), prev( 0 ), next( 0 ) {}
+	const char*		Name()  const		{ return name.c_str (); }		///< Return the name of this attribute.
+	const char*		Value() const		{ return value.c_str (); }		///< Return the value of this attribute.
+	const int       IntValue() const;									///< Return the value of this attribute, converted to an integer.
+	const double	DoubleValue() const;								///< Return the value of this attribute, converted to a double.
+
+	void SetName( const char* _name )	{ name = _name; }				///< Set the name of this attribute.
+	void SetValue( const char* _value )	{ value = _value; }				///< Set the value.
+
+	void SetIntValue( int value );										///< Set the value from an integer.
+	void SetDoubleValue( double value );								///< Set the value from a double.
+
+    #ifdef TIXML_USE_STL
+	/// STL std::string form.
+	void SetName( const std::string& _name )	
+	{	
+		SetName(_name.c_str() );	
+	}
+	/// STL std::string form.	
+	void SetValue( const std::string& _value )	
+	{	
+		SetValue( value.c_str() );	
+	}
+	#endif
+
+	/// Get the next sibling attribute in the DOM. Returns null at end.
+	TiXmlAttribute* Next() const;
+	/// Get the previous sibling attribute in the DOM. Returns null at beginning.
+	TiXmlAttribute* Previous() const;
+
+	bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; }
+	bool operator<( const TiXmlAttribute& rhs )	 const { return name < rhs.name; }
+	bool operator>( const TiXmlAttribute& rhs )  const { return name > rhs.name; }
+
+	/*	[internal use]
+		Attribtue parsing starts: first letter of the name
+						 returns: the next char after the value end quote
+	*/
+	virtual const char* Parse( const char* p );
+
+	// [internal use]
+	virtual void Print( FILE* cfile, int depth ) const;
+
+	virtual void StreamOut( TIXML_OSTREAM * out ) const;
+	// [internal use]
+	// Set the document pointer so the attribute can report errors.
+	void SetDocument( TiXmlDocument* doc )	{ document = doc; }
+
+private:
+	TiXmlDocument*	document;	// A pointer back to a document, for error reporting.
+	TIXML_STRING name;
+	TIXML_STRING value;
+	TiXmlAttribute*	prev;
+	TiXmlAttribute*	next;
+};
+
+
+/*	A class used to manage a group of attributes.
+	It is only used internally, both by the ELEMENT and the DECLARATION.
+	
+	The set can be changed transparent to the Element and Declaration
+	classes that use it, but NOT transparent to the Attribute
+	which has to implement a next() and previous() method. Which makes
+	it a bit problematic and prevents the use of STL.
+
+	This version is implemented with circular lists because:
+		- I like circular lists
+		- it demonstrates some independence from the (typical) doubly linked list.
+*/
+class TiXmlAttributeSet
+{
+public:
+	TiXmlAttributeSet();
+	~TiXmlAttributeSet();
+
+	void Add( TiXmlAttribute* attribute );
+	void Remove( TiXmlAttribute* attribute );
+
+	TiXmlAttribute* First() const	{ return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
+	TiXmlAttribute* Last()  const	{ return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
+	TiXmlAttribute*	Find( const char * name ) const;
+
+private:
+	TiXmlAttribute sentinel;
+};
+
+
+/** The element is a container class. It has a value, the element name,
+	and can contain other elements, text, comments, and unknowns.
+	Elements also contain an arbitrary number of attributes.
+*/
+class TiXmlElement : public TiXmlNode
+{
+public:
+	/// Construct an element.
+	TiXmlElement (const char * in_value);
+
+	#ifdef TIXML_USE_STL
+	/// std::string constructor.
+	TiXmlElement( const std::string& _value ) : 	TiXmlNode( TiXmlNode::ELEMENT )
+	{
+		firstChild = lastChild = 0;
+		value = _value;
+	}
+	#endif
+
+	virtual ~TiXmlElement();
+
+// OGRE CHANGE 
+// Resolve ambiguity of std::string / const char* conversion of Ogre::String
+#ifndef TIXML_USE_STL
+// OGRE CHANGE
+	/** Given an attribute name, attribute returns the value
+		for the attribute of that name, or null if none exists.
+	*/
+	const char* Attribute( const char* name ) const;
+
+	/** Given an attribute name, attribute returns the value
+		for the attribute of that name, or null if none exists.
+		If the attribute exists and can be converted to an integer,
+		the integer value will be put in the return 'i', if 'i'
+		is non-null.
+	*/
+	const char* Attribute( const char* name, int* i ) const;
+
+	/** Sets an attribute of name to a given value. The attribute
+		will be created if it does not exist, or changed if it does.
+	*/
+	void SetAttribute( const char* name, const char * value );
+// OGRE CHANGE
+#endif
+// OGRE CHANGE
+    #ifdef TIXML_USE_STL
+	const char* Attribute( const std::string& name ) const;
+	const char* Attribute( const std::string& name, int* i ) const;
+
+	/// STL std::string form.
+	void SetAttribute( const std::string& name, const std::string& value );
+	///< STL std::string form.
+	void SetAttribute( const std::string& name, int value );
+	#endif
+
+	/** Sets an attribute of name to a given value. The attribute
+		will be created if it does not exist, or changed if it does.
+	*/
+	void SetAttribute( const char * name, int value );
+
+	/** Deletes an attribute with the given name.
+	*/
+	void RemoveAttribute( const char * name );
+    #ifdef TIXML_USE_STL
+	void RemoveAttribute( const std::string& name )	{	RemoveAttribute (name.c_str ());	}	///< STL std::string form.
+	#endif
+
+	TiXmlAttribute* FirstAttribute() const	{ return attributeSet.First(); }		///< Access the first attribute in this element.
+	TiXmlAttribute* LastAttribute()	const 	{ return attributeSet.Last(); }		///< Access the last attribute in this element.
+
+	// [internal use] Creates a new Element and returs it.
+	virtual TiXmlNode* Clone() const;
+	// [internal use]
+
+	virtual void Print( FILE* cfile, int depth ) const;
+
+protected:
+
+	// Used to be public [internal use]
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+	virtual void StreamOut( TIXML_OSTREAM * out ) const;
+
+	/*	[internal use]
+		Attribtue parsing starts: next char past '<'
+						 returns: next char past '>'
+	*/
+	virtual const char* Parse( const char* p );
+
+	/*	[internal use]
+		Reads the "value" of the element -- another element, or text.
+		This should terminate with the current end tag.
+	*/
+	const char* ReadValue( const char* in );
+
+private:
+	TiXmlAttributeSet attributeSet;
+};
+
+
+/**	An XML comment.
+*/
+class TiXmlComment : public TiXmlNode
+{
+public:
+	/// Constructs an empty comment.
+	TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {}
+	virtual ~TiXmlComment()	{}
+
+	// [internal use] Creates a new Element and returs it.
+	virtual TiXmlNode* Clone() const;
+	// [internal use]
+	virtual void Print( FILE* cfile, int depth ) const;
+protected:
+	// used to be public
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+	virtual void StreamOut( TIXML_OSTREAM * out ) const;
+	/*	[internal use]
+		Attribtue parsing starts: at the ! of the !--
+						 returns: next char past '>'
+	*/
+	virtual const char* Parse( const char* p );
+};
+
+
+/** XML text. Contained in an element.
+*/
+class TiXmlText : public TiXmlNode
+{
+	friend class TiXmlElement;
+public:
+	/// Constructor.
+	TiXmlText (const char * initValue) : TiXmlNode (TiXmlNode::TEXT)
+	{
+		SetValue( initValue );
+	}
+	virtual ~TiXmlText() {}
+
+	#ifdef TIXML_USE_STL
+	/// Constructor.
+	TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT)
+	{
+		SetValue( initValue );
+	}
+	#endif
+
+protected :
+	// [internal use] Creates a new Element and returns it.
+	virtual TiXmlNode* Clone() const;
+	// [internal use]
+	virtual void Print( FILE* cfile, int depth ) const;
+	virtual void StreamOut ( TIXML_OSTREAM * out ) const;
+	// [internal use]
+	bool Blank() const;	// returns true if all white space and new lines
+	/*	[internal use]
+			Attribtue parsing starts: First char of the text
+							 returns: next char past '>'
+		*/
+	virtual const char* Parse( const char* p );
+	// [internal use]
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+};
+
+
+/** In correct XML the declaration is the first entry in the file.
+	@verbatim
+		<?xml version="1.0" standalone="yes"?>
+	@endverbatim
+
+	TinyXml will happily read or write files without a declaration,
+	however. There are 3 possible attributes to the declaration:
+	version, encoding, and standalone.
+
+	Note: In this version of the code, the attributes are
+	handled as special cases, not generic attributes, simply
+	because there can only be at most 3 and they are always the same.
+*/
+class TiXmlDeclaration : public TiXmlNode
+{
+public:
+	/// Construct an empty declaration.
+	TiXmlDeclaration()   : TiXmlNode( TiXmlNode::DECLARATION ) {}
+
+#ifdef TIXML_USE_STL
+	/// Constructor.
+	TiXmlDeclaration(
+						const std::string& _version,
+						const std::string& _encoding,
+						const std::string& _standalone )
+					: TiXmlNode( TiXmlNode::DECLARATION )
+	{
+		version = _version;
+		encoding = _encoding;
+		standalone = _standalone;
+	}
+#endif
+
+	/// Construct.
+	TiXmlDeclaration::TiXmlDeclaration( const char * _version,
+										const char * _encoding,
+										const char * _standalone );
+
+	virtual ~TiXmlDeclaration()	{}
+
+	/// Version. Will return empty if none was found.
+	const char * Version() const		{ return version.c_str (); }
+	/// Encoding. Will return empty if none was found.
+	const char * Encoding() const		{ return encoding.c_str (); }
+	/// Is this a standalone document?
+	const char * Standalone() const		{ return standalone.c_str (); }
+
+	// [internal use] Creates a new Element and returs it.
+	virtual TiXmlNode* Clone() const;
+	// [internal use]
+	virtual void Print( FILE* cfile, int depth ) const;
+
+protected:
+	// used to be public
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+	virtual void StreamOut ( TIXML_OSTREAM * out) const;
+	//	[internal use]
+	//	Attribtue parsing starts: next char past '<'
+	//					 returns: next char past '>'
+
+	virtual const char* Parse( const char* p );
+
+private:
+	TIXML_STRING version;
+	TIXML_STRING encoding;
+	TIXML_STRING standalone;
+};
+
+
+/** Any tag that tinyXml doesn't recognize is save as an
+	unknown. It is a tag of text, but should not be modified.
+	It will be written back to the XML, unchanged, when the file
+	is saved.
+*/
+class TiXmlUnknown : public TiXmlNode
+{
+public:
+	TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {}
+	virtual ~TiXmlUnknown() {}
+
+	// [internal use]
+	virtual TiXmlNode* Clone() const;
+	// [internal use]
+	virtual void Print( FILE* cfile, int depth ) const;
+protected:
+	// used to be public
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+	virtual void StreamOut ( TIXML_OSTREAM * out ) const;
+	/*	[internal use]
+		Attribute parsing starts: First char of the text
+						 returns: next char past '>'
+	*/
+	virtual const char* Parse( const char* p );
+};
+
+
+/** Always the top level node. A document binds together all the
+	XML pieces. It can be saved, loaded, and printed to the screen.
+	The 'value' of a document node is the xml file name.
+*/
+class TiXmlDocument : public TiXmlNode
+{
+public:
+	/// Create an empty document, that has no name.
+	TiXmlDocument();
+	/// Create a document with a name. The name of the document is also the filename of the xml.
+	TiXmlDocument( const char * documentName );
+
+	#ifdef TIXML_USE_STL
+	/// Constructor.
+	TiXmlDocument( const std::string& documentName ) :
+	    TiXmlNode( TiXmlNode::DOCUMENT )
+	{
+        value = documentName;
+		error = false;
+	}
+	#endif
+
+	virtual ~TiXmlDocument() {}
+
+	/** Load a file using the current document value.
+		Returns true if successful. Will delete any existing
+		document data before loading.
+	*/
+	bool LoadFile();
+	/// Save a file using the current document value. Returns true if successful.
+	bool SaveFile() const;
+	/// Load a file using the given filename. Returns true if successful.
+	bool LoadFile( const char * filename );
+	/// Save a file using the given filename. Returns true if successful.
+	bool SaveFile( const char * filename ) const;
+
+	#ifdef TIXML_USE_STL
+	bool LoadFile( const std::string& filename )			///< STL std::string version.
+	{
+		return ( LoadFile( filename.c_str() ));
+	}
+	bool SaveFile( const std::string& filename ) const		///< STL std::string version.
+	{
+		//StringToBuffer f( filename );
+		return ( SaveFile( filename.c_str() ));
+	}
+	#endif
+
+	/// Parse the given null terminated block of xml data.
+	virtual const char* Parse( const char* p );
+
+	/** Get the root element -- the only top level element -- of the document.
+		In well formed XML, there should only be one. TinyXml is tolerant of
+		multiple elements at the document level.
+	*/
+	TiXmlElement* RootElement() const		{ return FirstChildElement(); }
+
+	/// If, during parsing, a error occurs, Error will be set to true.
+	bool Error() const						{ return error; }
+
+	/// Contains a textual (english) description of the error if one occurs.
+	const char * ErrorDesc() const	{ return errorDesc.c_str (); }
+
+	/** Generally, you probably want the error string ( ErrorDesc() ). But if you
+			prefer the ErrorId, this function will fetch it.
+		*/
+	const int ErrorId()	const				{ return errorId; }
+
+	/// If you have handled the error, it can be reset with this call.
+	void ClearError()						{ error = false; errorId = 0; errorDesc = ""; }
+
+	/** Dump the document to standard out. */
+	void Print() const						{ Print( stdout, 0 ); }
+
+	// [internal use]
+	virtual void Print( FILE* cfile, int depth = 0 ) const;
+	// [internal use]
+	void SetError( int err ) {		assert( err > 0 && err < TIXML_ERROR_STRING_COUNT );
+		error   = true;
+		errorId = err;
+	errorDesc = errorString[ errorId ]; }
+
+protected :
+	virtual void StreamOut ( TIXML_OSTREAM * out) const;
+	// [internal use]
+	virtual TiXmlNode* Clone() const;
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+
+private:
+	bool error;
+	int  errorId;
+	TIXML_STRING errorDesc;
+};
+
+#endif
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinystr.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinystr.cpp	(revision 37)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/tinyxml/tinystr.cpp	(revision 37)
@@ -0,0 +1,265 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original file by Yves Berquin.
+
+This software is provided 'as-is', without any express or implied 
+warranty. In no event will the authors be held liable for any 
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any 
+purpose, including commercial applications, and to alter it and 
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must 
+not claim that you wrote the original software. If you use this 
+software in a product, an acknowledgment in the product documentation 
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source 
+distribution.
+*/
+
+#include "tinyxml.h"
+
+#ifndef TIXML_USE_STL
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "tinystr.h"
+
+// TiXmlString constructor, based on a C string
+TiXmlString::TiXmlString (const char* instring)
+{
+    unsigned newlen;
+    char * newstring;
+
+    if (!instring)
+    {
+        allocated = 0;
+        cstring = NULL;
+        return;
+    }
+    newlen = strlen (instring) + 1;
+    newstring = new char [newlen];
+    strcpy (newstring, instring);
+    allocated = newlen;
+    cstring = newstring;
+}
+
+// TiXmlString copy constructor
+TiXmlString::TiXmlString (const TiXmlString& copy)
+{
+    unsigned newlen;
+    char * newstring;
+
+	// Prevent copy to self!
+	if ( &copy == this )
+		return;
+
+    if (! copy . allocated)
+    {
+        allocated = 0;
+        cstring = NULL;
+        return;
+    }
+    newlen = strlen (copy . cstring) + 1;
+    newstring = new char [newlen];
+    strcpy (newstring, copy . cstring);
+    allocated = newlen;
+    cstring = newstring;
+}
+
+// TiXmlString = operator. Safe when assign own content
+void TiXmlString ::operator = (const char * content)
+{
+    unsigned newlen;
+    char * newstring;
+
+    if (! content)
+    {
+        empty_it ();
+        return;
+    }
+    newlen = strlen (content) + 1;
+    newstring = new char [newlen];
+    strcpy (newstring, content);
+    empty_it ();
+    allocated = newlen;
+    cstring = newstring;
+}
+
+// = operator. Safe when assign own content
+void TiXmlString ::operator = (const TiXmlString & copy)
+{
+    unsigned newlen;
+    char * newstring;
+
+    if (! copy . length ())
+    {
+        empty_it ();
+        return;
+    }
+    newlen = copy . length () + 1;
+    newstring = new char [newlen];
+    strcpy (newstring, copy . c_str ());
+    empty_it ();
+    allocated = newlen;
+    cstring = newstring;
+}
+
+
+//// Checks if a TiXmlString contains only whitespace (same rules as isspace)
+//bool TiXmlString::isblank () const
+//{
+//    char * lookup;
+//    for (lookup = cstring; * lookup; lookup++)
+//        if (! isspace (* lookup))
+//            return false;
+//    return true;
+//}
+
+// append a const char * to an existing TiXmlString
+void TiXmlString::append( const char* str, int len )
+{
+    char * new_string;
+    unsigned new_alloc, new_size;
+
+    new_size = length () + len + 1;
+    // check if we need to expand
+    if (new_size > allocated)
+    {
+        // compute new size
+        new_alloc = assign_new_size (new_size);
+
+        // allocate new buffer
+        new_string = new char [new_alloc];        
+        new_string [0] = 0;
+
+        // copy the previous allocated buffer into this one
+        if (allocated && cstring)
+            strcpy (new_string, cstring);
+
+        // append the suffix. It does exist, otherwize we wouldn't be expanding 
+        strncat (new_string, str, len);
+
+        // return previsously allocated buffer if any
+        if (allocated && cstring)
+            delete [] cstring;
+
+        // update member variables
+        cstring = new_string;
+        allocated = new_alloc;
+    }
+    else
+        // we know we can safely append the new string
+        strncat (cstring, str, len);
+}
+
+
+// append a const char * to an existing TiXmlString
+void TiXmlString::append( const char * suffix )
+{
+    char * new_string;
+    unsigned new_alloc, new_size;
+
+    new_size = length () + strlen (suffix) + 1;
+    // check if we need to expand
+    if (new_size > allocated)
+    {
+        // compute new size
+        new_alloc = assign_new_size (new_size);
+
+        // allocate new buffer
+        new_string = new char [new_alloc];        
+        new_string [0] = 0;
+
+        // copy the previous allocated buffer into this one
+        if (allocated && cstring)
+            strcpy (new_string, cstring);
+
+        // append the suffix. It does exist, otherwize we wouldn't be expanding 
+        strcat (new_string, suffix);
+
+        // return previsously allocated buffer if any
+        if (allocated && cstring)
+            delete [] cstring;
+
+        // update member variables
+        cstring = new_string;
+        allocated = new_alloc;
+    }
+    else
+        // we know we can safely append the new string
+        strcat (cstring, suffix);
+}
+
+// Check for TiXmlString equuivalence
+//bool TiXmlString::operator == (const TiXmlString & compare) const
+//{
+//    return (! strcmp (c_str (), compare . c_str ()));
+//}
+
+unsigned TiXmlString::length () const
+{
+    if (allocated)
+        return strlen (cstring);
+    return 0;
+}
+
+
+unsigned TiXmlString::find (char tofind, unsigned offset) const
+{
+    char * lookup;
+
+    if (offset >= length ())
+        return (unsigned) notfound;
+    for (lookup = cstring + offset; * lookup; lookup++)
+        if (* lookup == tofind)
+            return lookup - cstring;
+    return (unsigned) notfound;
+}
+
+
+bool TiXmlString::operator == (const TiXmlString & compare) const
+{
+	if ( allocated && compare.allocated )
+	{
+		assert( cstring );
+		assert( compare.cstring );
+		return ( strcmp( cstring, compare.cstring ) == 0 );
+ 	}
+	return false;
+}
+
+
+bool TiXmlString::operator < (const TiXmlString & compare) const
+{
+	if ( allocated && compare.allocated )
+	{
+		assert( cstring );
+		assert( compare.cstring );
+		return ( strcmp( cstring, compare.cstring ) > 0 );
+ 	}
+	return false;
+}
+
+
+bool TiXmlString::operator > (const TiXmlString & compare) const
+{
+	if ( allocated && compare.allocated )
+	{
+		assert( cstring );
+		assert( compare.cstring );
+		return ( strcmp( cstring, compare.cstring ) < 0 );
+ 	}
+	return false;
+}
+
+
+#endif	// TIXML_USE_STL
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/scripts/OcclusionCullingDemo.overlay
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/scripts/OcclusionCullingDemo.overlay	(revision 52)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/scripts/OcclusionCullingDemo.overlay	(revision 52)
@@ -0,0 +1,261 @@
+Example/OcclusionCullingDemoOverlay
+{
+	zorder 500
+	// Stats block
+	container BorderPanel(Example/Occlusion/OcclusionPanel)
+	{
+		metrics_mode pixels
+		vert_align top
+		left 5 
+		top 5
+		width 450
+		height 55
+		material Core/StatsBlockCenter
+        	border_size 1 1 1 1
+        	border_material Core/StatsBlockBorder
+        	border_topleft_uv     0.0000 1.0000 0.0039 0.9961
+	    	border_top_uv         0.0039 1.0000 0.9961 0.9961
+	    	border_topright_uv    0.9961 1.0000 1.0000 0.9961
+	    	border_left_uv        0.0000 0.9961 0.0039 0.0039
+	    	border_right_uv       0.9961 0.9961 1.0000 0.0039
+	    	border_bottomleft_uv  0.0000 0.0039 0.0039 0.0000
+        	border_bottom_uv      0.0039 0.0039 0.9961 0.0000
+	    	border_bottomright_uv 0.9961 0.0039 1.0000 0.0000
+
+
+		element TextArea(Example/Occlusion/Algorithm)
+		{
+			metrics_mode pixels
+			left 5
+			top 5
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption [A] Algorithm
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/AlgorithmInfo)
+		{
+			metrics_mode pixels
+			left 155
+			top 5
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+
+		element TextArea(Example/Occlusion/Threshold)
+		{
+			metrics_mode pixels
+			left 5
+			top 20
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption [-][+] Threshold
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/ThresholdInfo)
+		{
+			metrics_mode pixels
+			left 155
+			top 20
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+	}
+
+	container BorderPanel(Example/Occlusion/OcclusionStatsPanel)
+	{
+		metrics_mode pixels
+		vert_align top
+		horz_align right
+		left -355 
+		top 5
+		width 450
+		height 105
+		material Core/StatsBlockCenter
+        	border_size 1 1 1 1
+        	border_material Core/StatsBlockBorder
+        	border_topleft_uv     0.0000 1.0000 0.0039 0.9961
+	    	border_top_uv         0.0039 1.0000 0.9961 0.9961
+	    	border_topright_uv    0.9961 1.0000 1.0000 0.9961
+	    	border_left_uv        0.0000 0.9961 0.0039 0.0039
+	    	border_right_uv       0.9961 0.9961 1.0000 0.0039
+	    	border_bottomleft_uv  0.0000 0.0039 0.0039 0.0000
+        	border_bottom_uv      0.0039 0.0039 0.9961 0.0000
+	    	border_bottomright_uv 0.9961 0.0039 1.0000 0.0000
+
+		element TextArea(Example/Occlusion/FrustumCulledNodes)
+		{
+			metrics_mode pixels
+			left 5
+			top 5
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption Frustum Culled Nodes
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/FrustumCulledNodesInfo)
+		{
+			metrics_mode pixels
+			left 180
+			top 5
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/QueryCulledNodes)
+		{
+			metrics_mode pixels
+			left 5
+			top 20
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption Query Culled Nodes
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}	
+		element TextArea(Example/Occlusion/QueryCulledNodesInfo)
+		{
+			metrics_mode pixels
+			left 180
+			top 20
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/TraversedNodes)
+		{
+			metrics_mode pixels
+			left 5
+			top 35
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption Traversed Nodes
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}	
+		element TextArea(Example/Occlusion/TraversedNodesInfo)
+		{
+			metrics_mode pixels
+			left 180
+			top 35
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/SceneNodes)
+		{
+			metrics_mode pixels
+			left 5
+			top 50
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption Scene Nodes
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}	
+		element TextArea(Example/Occlusion/SceneNodesInfo)
+		{
+			metrics_mode pixels
+			left 180
+			top 50
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/HierarchyNodes)
+		{
+			metrics_mode pixels
+			left 5
+			top 65
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption Hierarchy Nodes
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}	
+		element TextArea(Example/Occlusion/HierarchyNodesInfo)
+		{
+			metrics_mode pixels
+			left 180
+			top 65
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+		element TextArea(Example/Occlusion/RenderedNodes)
+		{
+			metrics_mode pixels
+			left 5
+			top 80
+			width 180
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption Rendered Nodes
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}	
+		element TextArea(Example/Occlusion/RenderedNodesInfo)
+		{
+			metrics_mode pixels
+			left 180
+			top 80
+			width 90
+			height 30
+			font_name TrebuchetMSBold
+			char_height 16
+			caption :
+			colour_top 0.5 0.7 0.5
+			colour_bottom 0.3 0.5 0.3
+		}
+
+
+	}
+}
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/scripts/Plugin_OcclusionCullingSceneManager.vcproj
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/scripts/Plugin_OcclusionCullingSceneManager.vcproj	(revision 56)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/scripts/Plugin_OcclusionCullingSceneManager.vcproj	(revision 56)
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="windows-1250"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="Plugin_OcclusionCullingSceneManager"
+	ProjectGUID="{80DECC17-BDDD-4412-8CF8-F7C1C17A7436}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\bin\$(ConfigurationName)"
+			IntermediateDirectory="..\obj\$(ConfigurationName)"
+			ConfigurationType="2"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\include&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include\CEGUI&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\include&quot;;&quot;$(OGRE_PATH)\OgreMain\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include&quot;;..\include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS;OGRE_COHERENT_OCCLUSION_CULLING"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				EnableFunctionLevelLinking="TRUE"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				IgnoreImportLibrary="TRUE"
+				AdditionalDependencies="OgreMain_d.lib CEGUIBase_d.lib OgreGUIRenderer_d.lib Plugin_OctreeSceneManager.lib Plugin_DotSceneManager.lib"
+				OutputFile="$(OutDir)/Plugin_OcclusionCullingSceneManager.dll"
+				Version="0.99"
+				LinkIncremental="2"
+				SuppressStartupBanner="TRUE"
+				AdditionalLibraryDirectories="&quot;$(OGRE_PATH)\OgreMain\lib\$(ConfigurationName)&quot;;&quot;$(OGRE_PATH)\Dependencies\lib\$(ConfigurationName)&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\bin\$(ConfigurationName)&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\lib&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\bin\debug&quot;"
+				ModuleDefinitionFile="..\misc\OgreOcclusionCullingSceneManager.def"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/Plugin_OcclusionCullingSceneManager.pdb"
+				SubSystem="2"
+				ImportLibrary="$(OUTDIR)\Plugin_OcclusionCullingSceneManager.lib"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"
+				CommandLine="copy $(OutDir)\$(TargetFileName) $(OGRE_PATH)\Samples\Common\bin\$(ConfigurationName)"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="..\bin\$(ConfigurationName)"
+			IntermediateDirectory="..\obj\$(ConfigurationName)"
+			ConfigurationType="2"
+			CharacterSet="2"
+			WholeProgramOptimization="TRUE">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="3"
+				GlobalOptimizations="TRUE"
+				InlineFunctionExpansion="2"
+				EnableIntrinsicFunctions="TRUE"
+				ImproveFloatingPointConsistency="TRUE"
+				FavorSizeOrSpeed="1"
+				OmitFramePointers="TRUE"
+				EnableFiberSafeOptimizations="TRUE"
+				OptimizeForProcessor="2"
+				AdditionalIncludeDirectories="..\include;$(OGRE_PATH)\OgreMain\include"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS"
+				StringPooling="TRUE"
+				RuntimeLibrary="2"
+				BufferSecurityCheck="FALSE"
+				EnableFunctionLevelLinking="TRUE"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				IgnoreImportLibrary="TRUE"
+				AdditionalDependencies="OgreMain.lib"
+				OutputFile="$(OutDir)/Plugin_OcclusionCullingSceneManager.dll"
+				Version="0.99"
+				LinkIncremental="1"
+				SuppressStartupBanner="TRUE"
+				AdditionalLibraryDirectories="&quot;$(OGRE_PATH)\OgreMain\lib\$(ConfigurationName)&quot;;&quot;..\..\..\Dependencies\lib\$(ConfigurationName)&quot;"
+				ModuleDefinitionFile="..\misc\OgreOcclusionCullingSceneManager.def"
+				GenerateDebugInformation="TRUE"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				ImportLibrary="$(OutDir)/Plugin_OcclusionCullingSceneManager.lib"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"
+				CommandLine="copy $(OutDir)\$(TargetFileName) $(OGRE_PATH)\Samples\Common\bin\$(ConfigurationName)"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
+			<File
+				RelativePath="..\src\OgreOcclusionCullingResourceManager.cpp">
+			</File>
+			<File
+				RelativePath="..\src\OgreOcclusionCullingSceneManager.cpp">
+			</File>
+			<File
+				RelativePath="..\src\OgreOcclusionCullingSceneManagerDll.cpp">
+			</File>
+			<File
+				RelativePath="..\src\OgreOcclusionCullingSceneTraverser.cpp">
+			</File>
+			<File
+				RelativePath="..\src\OgreSolidHalfBoundingBox.cpp">
+			</File>
+			<File
+				RelativePath="..\src\SceneTraverser.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc">
+			<File
+				RelativePath="..\include\OgreOcclusionCullingResourceManager.h">
+			</File>
+			<File
+				RelativePath="..\include\OgreOcclusionCullingSceneManager.h">
+			</File>
+			<File
+				RelativePath="..\include\OgreOcclusionCullingSceneTraverser.h">
+			</File>
+			<File
+				RelativePath="..\include\OgreSolidHalfBoundingBox.h">
+			</File>
+			<File
+				RelativePath="..\include\SceneTraverser.h">
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
+		</Filter>
+		<Filter
+			Name="OctreeOcclusionCullingSceneManager"
+			Filter="">
+			<Filter
+				Name="Source Files"
+				Filter="">
+				<File
+					RelativePath="..\src\OgreOcclusionCullingOctreeSceneManager.cpp">
+				</File>
+				<File
+					RelativePath="..\src\OgreOcclusionCullingOctreeSceneTraverser.cpp">
+				</File>
+				<File
+					RelativePath="..\src\OgreOcclusionCullingTerrainSceneManager.cpp">
+				</File>
+			</Filter>
+			<Filter
+				Name="Header Files"
+				Filter="">
+				<File
+					RelativePath="..\include\OgreOcclusionCullingOctreeSceneManager.h">
+				</File>
+				<File
+					RelativePath="..\include\OgreOcclusionCullingOctreeSceneTraverser.h">
+				</File>
+				<File
+					RelativePath="..\include\OgreOcclusionCullingTerrainSceneManager.h">
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="DotSceneOcclusionCullingSceneManager"
+			Filter="">
+			<Filter
+				Name="Source Files"
+				Filter="">
+				<File
+					RelativePath="..\src\OgreOcclusionCullingDotSceneManager.cpp">
+				</File>
+			</Filter>
+			<Filter
+				Name="Header Files"
+				Filter="">
+				<File
+					RelativePath="..\include\OgreOcclusionCullingDotSceneManager.h">
+				</File>
+			</Filter>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/scripts/Plugin_OcclusionCullingSceneManager.dsp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/scripts/Plugin_OcclusionCullingSceneManager.dsp	(revision 15)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/scripts/Plugin_OcclusionCullingSceneManager.dsp	(revision 15)
@@ -0,0 +1,137 @@
+# Microsoft Developer Studio Project File - Name="Plugin_OcclusionCullingSceneManager" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=Plugin_OcclusionCullingSceneManager - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "Plugin_OcclusionCullingSceneManager.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "Plugin_OcclusionCullingSceneManager.mak" CFG="Plugin_OcclusionCullingSceneManager - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "Plugin_OcclusionCullingSceneManager - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "Plugin_OcclusionCullingSceneManager - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "Plugin_OcclusionCullingSceneManager - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\bin\Release"
+# PROP Intermediate_Dir "..\obj\Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\include" /I "$(OGRE_PATH)\OgreMain\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x418 /d "NDEBUG"
+# ADD RSC /l 0x418 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OgreMain.lib /nologo /dll /machine:I386 /libpath:"$(OGRE_PATH)\OgreMain\lib\Release"
+# SUBTRACT LINK32 /pdb:none
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy ..\bin\Release\*.dll $(OGRE_PATH)\Samples\Common\bin\Release
+# End Special Build Tool
+
+!ELSEIF  "$(CFG)" == "Plugin_OcclusionCullingSceneManager - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "..\bin\Debug"
+# PROP Intermediate_Dir "..\obj\Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\include" /I "$(OGRE_PATH)\OgreMain\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS" /YX /FD /GZ /Zm200 /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x418 /d "_DEBUG"
+# ADD RSC /l 0x418 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OgreMain_d.lib /nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"$(OGRE_PATH)\OgreMain\lib\Debug"
+# SUBTRACT LINK32 /pdb:none
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy ..\bin\Debug\*.dll $(OGRE_PATH)\Samples\Common\bin\Debug
+# End Special Build Tool
+
+!ENDIF 
+
+# Begin Target
+
+# Name "Plugin_OcclusionCullingSceneManager - Win32 Release"
+# Name "Plugin_OcclusionCullingSceneManager - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\src\OgreOcclusionCullingResourceManager.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\OgreOcclusionCullingSceneManager.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\misc\OgreOcclusionCullingSceneManager.def
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\OgreOcclusionCullingSceneManagerDll.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\include\OgreOcclusionCullingResourceManager.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\OgreOcclusionCullingSceneManager.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/scripts/Plugin_OcclusionCullingSceneManager.sln
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/scripts/Plugin_OcclusionCullingSceneManager.sln	(revision 52)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/scripts/Plugin_OcclusionCullingSceneManager.sln	(revision 52)
@@ -0,0 +1,47 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_OcclusionCullingSceneManager", "Plugin_OcclusionCullingSceneManager.vcproj", "{80DECC17-BDDD-4412-8CF8-F7C1C17A7436}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestCulling", "..\TestCulling\TestCulling.vcproj", "{248F19A6-2FE0-4F5D-8928-E0EA10609887}"
+	ProjectSection(ProjectDependencies) = postProject
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436} = {80DECC17-BDDD-4412-8CF8-F7C1C17A7436}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestCullingDotScene", "..\TestCullingDotScene\TestCullingDotScene.vcproj", "{BE13944C-D05E-467F-B0AC-8A65A3B5FE60}"
+	ProjectSection(ProjectDependencies) = postProject
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436} = {80DECC17-BDDD-4412-8CF8-F7C1C17A7436}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestCullingTerrain", "..\TestCullingTerrain\TestCullingTerrain.vcproj", "{248F19A6-2FE0-4F5D-8928-E0EA10609887}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		Debug = Debug
+		Release = Release
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436}.Debug.ActiveCfg = Debug|Win32
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436}.Debug.Build.0 = Debug|Win32
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436}.Release.ActiveCfg = Release|Win32
+		{80DECC17-BDDD-4412-8CF8-F7C1C17A7436}.Release.Build.0 = Release|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Debug.ActiveCfg = Debug|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Debug.Build.0 = Debug|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Release.ActiveCfg = Release|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Release.Build.0 = Release|Win32
+		{BE13944C-D05E-467F-B0AC-8A65A3B5FE60}.Debug.ActiveCfg = Debug|Win32
+		{BE13944C-D05E-467F-B0AC-8A65A3B5FE60}.Debug.Build.0 = Debug|Win32
+		{BE13944C-D05E-467F-B0AC-8A65A3B5FE60}.Release.ActiveCfg = Release|Win32
+		{BE13944C-D05E-467F-B0AC-8A65A3B5FE60}.Release.Build.0 = Release|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Debug.ActiveCfg = Debug|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Debug.Build.0 = Debug|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Release.ActiveCfg = Release|Win32
+		{248F19A6-2FE0-4F5D-8928-E0EA10609887}.Release.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneManagerDll.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneManagerDll.cpp	(revision 51)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneManagerDll.cpp	(revision 51)
@@ -0,0 +1,64 @@
+/*
+-----------------------------------------------------------------------------
+This source file is part of OGRE
+    (Object-oriented Graphics Rendering Engine)
+For the latest info, see http://www.ogre3d.org/
+
+Copyright © 2000-2002 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.
+-----------------------------------------------------------------------------
+*/
+
+#include "OgreOcclusionCullingTerrainSceneManager.h"
+#include "OgreOcclusionCullingOctreeSceneManager.h"
+//#include "OgreOcclusionCullingDotSceneManager.h"
+#include "OgreHeightmapTerrainPageSource.h"
+#include <OgreRoot.h>
+
+//#include <windows.h>
+
+namespace Ogre {
+
+	// OcclusionCullingDotSceneManager *occlusionDotPlugin;
+	OcclusionCullingOctreeSceneManager *occlusionOctreePlugin;
+	OcclusionCullingTerrainSceneManager *occlusionTerrainPlugin;
+	HeightmapTerrainPageSource* heightmapTerrainPageSource;
+
+    //-----------------------------------------------------------------------
+    extern "C" void dllStartPlugin(void)
+    {
+		// Create new scene manager
+		//occlusionDotPlugin = new OcclusionCullingDotSceneManager();
+		occlusionOctreePlugin = new OcclusionCullingOctreeSceneManager();
+		occlusionTerrainPlugin = new OcclusionCullingTerrainSceneManager();
+		heightmapTerrainPageSource = new HeightmapTerrainPageSource();
+
+		occlusionTerrainPlugin->registerPageSource("Heightmap", heightmapTerrainPageSource);
+
+	    // Register
+		//Root::getSingleton().setSceneManager( ST_GENERIC, occlusionDotPlugin );
+		Root::getSingleton().setSceneManager( ST_GENERIC, occlusionOctreePlugin );
+		Root::getSingleton().setSceneManager( ST_EXTERIOR_CLOSE, occlusionTerrainPlugin );
+    }
+    extern "C" void dllStopPlugin(void)
+    {
+		delete heightmapTerrainPageSource;
+        //delete occlusionDotPlugin;
+		delete occlusionOctreePlugin;
+		delete occlusionTerrainPlugin;
+    }
+}
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/Makefile.in
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/Makefile.in	(revision 12)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/Makefile.in	(revision 12)
@@ -0,0 +1,501 @@
+# Makefile.in generated by automake 1.7.5 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_triplet = @host@
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON = @BISON@
+BOOST_CFLAGS = @BOOST_CFLAGS@
+BOOST_LIBS = @BOOST_LIBS@
+BUILD_PYTHON_INTERFACE_FALSE = @BUILD_PYTHON_INTERFACE_FALSE@
+BUILD_PYTHON_INTERFACE_TRUE = @BUILD_PYTHON_INTERFACE_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFGTK_DEPS_CFLAGS = @CFGTK_DEPS_CFLAGS@
+CFGTK_DEPS_LIBS = @CFGTK_DEPS_LIBS@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FT2_CFLAGS = @FT2_CFLAGS@
+FT2_CONFIG = @FT2_CONFIG@
+FT2_LIBS = @FT2_LIBS@
+GLSUPPORT_CFLAGS = @GLSUPPORT_CFLAGS@
+GLSUPPORT_LIBS = @GLSUPPORT_LIBS@
+GL_LIBS = @GL_LIBS@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+OGREMAIN_VERSION_INFO = @OGREMAIN_VERSION_INFO@
+OGRE_CFGTK = @OGRE_CFGTK@
+OGRE_CFLAGS = @OGRE_CFLAGS@
+OGRE_GLSUPPORT = @OGRE_GLSUPPORT@
+OGRE_PLATFORM = @OGRE_PLATFORM@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLATFORM_CFLAGS = @PLATFORM_CFLAGS@
+PLATFORM_LIBS = @PLATFORM_LIBS@
+PYTHON_CFLAGS = @PYTHON_CFLAGS@
+PYTHON_LIBS = @PYTHON_LIBS@
+RANLIB = @RANLIB@
+SDL_CFLAGS = @SDL_CFLAGS@
+SDL_CONFIG = @SDL_CONFIG@
+SDL_LIBS = @SDL_LIBS@
+SET_MAKE = @SET_MAKE@
+SHARED_FLAGS = @SHARED_FLAGS@
+SHELL = @SHELL@
+STLPORT_CFLAGS = @STLPORT_CFLAGS@
+STLPORT_LIBS = @STLPORT_LIBS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+INCLUDES = $(STLPORT_CFLAGS) -I$(top_srcdir)/PlugIns/BSPSceneManager/include -I$(top_srcdir)/OgreMain/include
+
+pkglib_PROGRAMS = Plugin_BSPSceneManager.so
+
+Plugin_BSPSceneManager_so_SOURCES = OgreBspLevel.cpp \
+                             OgreBspNode.cpp \
+                             OgreBspResourceManager.cpp \
+                             OgreBspSceneManager.cpp \
+                             OgreBspSceneManagerDll.cpp \
+							 OgreBspSceneNode.cpp \
+                             OgreQuake3ShaderManager.cpp \
+                             OgreQuake3Shader.cpp \
+                             OgreQuake3Level.cpp
+
+
+Plugin_BSPSceneManager_so_LDFLAGS = $(SHARED_FLAGS) -L$(top_srcdir)/OgreMain/src
+Plugin_BSPSceneManager_so_LDADD = -lOgreMain
+subdir = PlugIns/BSPSceneManager/src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/OgreMain/include/config.h
+CONFIG_CLEAN_FILES =
+pkglib_PROGRAMS = Plugin_BSPSceneManager.so$(EXEEXT)
+PROGRAMS = $(pkglib_PROGRAMS)
+
+am_Plugin_BSPSceneManager_so_OBJECTS = OgreBspLevel.$(OBJEXT) \
+	OgreBspNode.$(OBJEXT) OgreBspResourceManager.$(OBJEXT) \
+	OgreBspSceneManager.$(OBJEXT) OgreBspSceneManagerDll.$(OBJEXT) \
+	OgreBspSceneNode.$(OBJEXT) OgreQuake3ShaderManager.$(OBJEXT) \
+	OgreQuake3Shader.$(OBJEXT) OgreQuake3Level.$(OBJEXT)
+Plugin_BSPSceneManager_so_OBJECTS = \
+	$(am_Plugin_BSPSceneManager_so_OBJECTS)
+Plugin_BSPSceneManager_so_DEPENDENCIES =
+
+DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)/OgreMain/include
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/OgreBspLevel.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/OgreBspNode.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/OgreBspResourceManager.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/OgreBspSceneManager.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/OgreBspSceneManagerDll.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/OgreBspSceneNode.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/OgreQuake3Level.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/OgreQuake3Shader.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/OgreQuake3ShaderManager.Po
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+DIST_SOURCES = $(Plugin_BSPSceneManager_so_SOURCES)
+DIST_COMMON = Makefile.am Makefile.in
+SOURCES = $(Plugin_BSPSceneManager_so_SOURCES)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .o .obj
+$(srcdir)/Makefile.in:  Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  PlugIns/BSPSceneManager/src/Makefile
+Makefile:  $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+pkglibPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+install-pkglibPROGRAMS: $(pkglib_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(pkglibdir)
+	@list='$(pkglib_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	     || test -f $$p1 \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(pkglibPROGRAMS_INSTALL) $$p $(DESTDIR)$(pkglibdir)/$$f"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(pkglibPROGRAMS_INSTALL) $$p $(DESTDIR)$(pkglibdir)/$$f || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-pkglibPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f $(DESTDIR)$(pkglibdir)/$$f"; \
+	  rm -f $(DESTDIR)$(pkglibdir)/$$f; \
+	done
+
+clean-pkglibPROGRAMS:
+	@list='$(pkglib_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+Plugin_BSPSceneManager.so$(EXEEXT): $(Plugin_BSPSceneManager_so_OBJECTS) $(Plugin_BSPSceneManager_so_DEPENDENCIES) 
+	@rm -f Plugin_BSPSceneManager.so$(EXEEXT)
+	$(CXXLINK) $(Plugin_BSPSceneManager_so_LDFLAGS) $(Plugin_BSPSceneManager_so_OBJECTS) $(Plugin_BSPSceneManager_so_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT) core *.core
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OgreBspLevel.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OgreBspNode.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OgreBspResourceManager.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OgreBspSceneManager.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OgreBspSceneManagerDll.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OgreBspSceneNode.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OgreQuake3Level.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OgreQuake3Shader.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OgreQuake3ShaderManager.Po@am__quote@
+
+distclean-depend:
+	-rm -rf ./$(DEPDIR)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
+@am__fastdepCXX_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
+@am__fastdepCXX_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
+@am__fastdepCXX_TRUE@	fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
+@am__fastdepCXX_TRUE@	  -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
+@am__fastdepCXX_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
+@am__fastdepCXX_TRUE@	fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
+@am__fastdepCXX_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; \
+@am__fastdepCXX_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
+@am__fastdepCXX_TRUE@	fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+ETAGS = etags
+ETAGSFLAGS =
+
+CTAGS = ctags
+CTAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$tags$$unique" \
+	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	     $$tags $$unique
+
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkinstalldirs) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+
+installdirs:
+	$(mkinstalldirs) $(DESTDIR)$(pkglibdir)
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pkglibPROGRAMS \
+	mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-compile distclean-depend \
+	distclean-generic distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-pkglibPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkglibPROGRAMS
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-libtool clean-pkglibPROGRAMS ctags distclean \
+	distclean-compile distclean-depend distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am info \
+	info-am install install-am install-data install-data-am \
+	install-exec install-exec-am install-info install-info-am \
+	install-man install-pkglibPROGRAMS install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-info-am \
+	uninstall-pkglibPROGRAMS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreSolidHalfBoundingBox.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreSolidHalfBoundingBox.cpp	(revision 54)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreSolidHalfBoundingBox.cpp	(revision 54)
@@ -0,0 +1,118 @@
+#include "OgreStableHeaders.h"
+#include "OgreSolidHalfBoundingBox.h"
+
+#include "OgreSimpleRenderable.h"
+#include "OgreHardwareBufferManager.h"
+#include "OgreCamera.h"
+#include "OgreMaterialManager.h"
+//#include <windows.h>
+
+namespace Ogre {
+    #define POSITION_BINDING 0
+	//-----------------------------------------------------------------------
+	SolidHalfBoundingBox::SolidHalfBoundingBox(bool isFirstHalf)
+		:WireBoundingBox(), mIsFirstHalf(isFirstHalf)
+    {
+		setOcclusionQueryMaterial();
+		
+		mRenderOp.vertexData->vertexCount = 8;
+        mRenderOp.operationType = RenderOperation::OT_TRIANGLE_FAN; 
+	}
+	//-----------------------------------------------------------------------
+	void SolidHalfBoundingBox::setupBoundingBoxVertices(const AxisAlignedBox& aab) {
+
+		Vector3 vmax = aab.getMaximum();
+		Vector3 vmin = aab.getMinimum();
+		
+		
+		Real sqLen = std::max(vmax.squaredLength(), vmin.squaredLength());
+        mRadius = Math::Sqrt(sqLen);
+		
+		Real maxx = vmax.x;
+		Real maxy = vmax.y;
+		Real maxz = vmax.z;
+		
+		Real minx = vmin.x;
+		Real miny = vmin.y;
+		Real minz = vmin.z;
+		
+		// fill in the Vertex buffer: 12 lines with 2 endpoints each make up a box
+        HardwareVertexBufferSharedPtr vbuf =
+            mRenderOp.vertexData->vertexBufferBinding->getBuffer(POSITION_BINDING);     
+
+        float* pPos = static_cast<float*>(
+            vbuf->lock(HardwareBuffer::HBL_DISCARD));
+
+		//     5+------+7
+		//     /|     /|
+		//    / |    / |
+		//   / 1+---/--+3
+		// 2+------+6 /    y   z
+		//  | /    | /     |  /
+		//  |/     |/      |/
+		// 0+------+4      *---x
+
+		// fan 1
+		if(mIsFirstHalf)
+		{
+			*pPos++ = minx; *pPos++ = maxy; *pPos++ = maxz; //011
+			*pPos++ = minx; *pPos++ = miny; *pPos++ = maxz; //001
+			*pPos++ = maxx; *pPos++ = miny; *pPos++ = maxz; //101
+			*pPos++ = maxx; *pPos++ = maxy; *pPos++ = maxz; //111
+			
+			*pPos++ = maxx; *pPos++ = maxy; *pPos++ = minz; //110
+			*pPos++ = minx; *pPos++ = maxy; *pPos++ = minz; //010
+			*pPos++ = minx; *pPos++ = miny; *pPos++ = minz; //000
+			*pPos++ = minx; *pPos++ = miny; *pPos++ = maxz; //001
+
+		}
+		else
+		// fan 2
+		{
+			*pPos++ = maxx; *pPos++ = miny; *pPos++ = minz; //100
+			*pPos++ = minx; *pPos++ = miny; *pPos++ = minz; //000 					
+			*pPos++ = minx; *pPos++ = maxy; *pPos++ = minz; //010
+			*pPos++ = maxx; *pPos++ = maxy; *pPos++ = minz; //110
+
+			*pPos++ = maxx; *pPos++ = maxy; *pPos++ = maxz; //111
+			*pPos++ = maxx; *pPos++ = miny; *pPos++ = maxz; //101
+			*pPos++ = minx; *pPos++ = miny; *pPos++ = maxz; //001
+			*pPos++ = minx; *pPos++ = miny; *pPos++ = minz; //000
+		}
+
+        vbuf->unlock();
+	}
+
+	void SolidHalfBoundingBox::setupBoundingBox(const AxisAlignedBox& aabb) 
+    {
+		// init the vertices to the aabb
+		SolidHalfBoundingBox::setupBoundingBoxVertices(aabb);
+
+    	// setup the bounding box of this SimpleRenderable
+		setBoundingBox(aabb);
+	}
+	// Override this method to prevent parent transforms (rotation,translation,scale)
+    void SolidHalfBoundingBox::getWorldTransforms( Matrix4* xform ) const
+    {
+		// return identity matrix to prevent parent transforms
+        *xform = Matrix4::IDENTITY;
+    }
+
+	void SolidHalfBoundingBox::setOcclusionQueryMaterial( void )
+	{
+		m_pMaterial = MaterialManager::getSingleton().getByName("OcclusionQuery");
+
+		if(m_pMaterial.isNull())
+		{
+			m_pMaterial = MaterialManager::getSingleton().
+				create("OcclusionQuery", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+		}
+
+		m_pMaterial->setColourWriteEnabled(false);
+		m_pMaterial->setDepthWriteEnabled(false);
+		m_pMaterial->setLightingEnabled(false);
+
+		setMaterial("OcclusionQuery");
+	}
+}
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneManager.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneManager.cpp	(revision 42)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneManager.cpp	(revision 42)
@@ -0,0 +1,101 @@
+#include "OgreOcclusionCullingSceneManager.h"
+#include "OgreMath.h"
+#include "OgreIteratorWrappers.h"
+#include "OgreRenderSystem.h"
+#include "OgreCamera.h"
+#include "OgreHardwareOcclusionQuery.h"
+//#include "OgreWireBoundingBox.h"
+#include "OgreSolidHalfBoundingBox.h"
+
+#include <windows.h>
+
+namespace Ogre {
+	
+	//-----------------------------------------------------------------------
+	OcclusionCullingSceneManager::OcclusionCullingSceneManager()
+	{
+		mOcclusionCullingSceneTraverser = new OcclusionCullingSceneTraverser(this, mDestRenderSystem);
+	}
+	//-----------------------------------------------------------------------
+	OcclusionCullingSceneManager::~OcclusionCullingSceneManager()
+	{
+		delete mOcclusionCullingSceneTraverser;
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneManager::_findVisibleObjects( Camera* cam, bool onlyShadowCasters )
+	{
+		// empty because we have to find objects in _renderVisibleObjects
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneManager::_renderVisibleObjects( void )
+	{
+			//-- render background
+		clearSpecialCaseRenderQueues();
+		addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND);
+		addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY);
+	
+		setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE);
+		SceneManager::_renderVisibleObjects( );
+		_deleteRenderedQueueGroups();
+
+		//-- render visible objects (i.e., all but overlay)
+		clearSpecialCaseRenderQueues();
+		addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY);
+		setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE);
+
+		mOcclusionCullingSceneTraverser->setSceneRoot(mSceneRoot);
+		mOcclusionCullingSceneTraverser->renderScene(mCameraInProgress);
+
+		_deleteRenderedQueueGroups();
+
+		//-- render overlay
+		clearSpecialCaseRenderQueues();
+		SceneManager::_renderVisibleObjects( );
+	
+		clearSpecialCaseRenderQueues();
+	}
+	//-----------------------------------------------------------------------
+	/*void OcclusionCullingSceneManager::renderZPass()
+	{
+		traverseNode(mSceneRoot);
+	}*/
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneManager::_updateSceneGraph( Camera* cam )
+	{
+		mOcclusionCullingSceneTraverser->setNumSceneNodes((int)mSceneNodes.size());
+		mOcclusionCullingSceneTraverser->setRenderSystem(mDestRenderSystem);
+		
+		//mOcclusionCullingSceneTraverser->setNumQueries((int)mSceneNodes.size());
+        //mOcclusionCullingSceneTraverser->preprocess();
+		
+		SceneManager::_updateSceneGraph(cam);
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingSceneManager::setOption( const String & key, const void * val )
+	{
+		mOcclusionCullingSceneTraverser->setOption(key, val);
+			
+		return SceneManager::setOption( key, val );
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingSceneManager::getOption( const String & key, void *val )
+	{
+		mOcclusionCullingSceneTraverser->getOption(key, val);
+		
+		return SceneManager::getOption( key, val );
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingSceneManager::getOptionValues( const String & key, StringVector  &refValueList )
+	{
+		return SceneManager::getOptionValues( key, refValueList );
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingSceneManager::getOptionKeys( StringVector & refKeys )
+	{
+		SceneManager::getOptionKeys( refKeys );
+
+		mOcclusionCullingSceneTraverser->getOptionKeys( refKeys );
+
+		return true;
+	}
+}	
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingOctreeSceneManager.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingOctreeSceneManager.cpp	(revision 52)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingOctreeSceneManager.cpp	(revision 52)
@@ -0,0 +1,89 @@
+#include "OgreOcclusionCullingOctreeSceneManager.h"
+#include "OgreMath.h"
+#include "OgreIteratorWrappers.h"
+#include "OgreRenderSystem.h"
+#include "OgreCamera.h"
+
+#include <windows.h>
+
+namespace Ogre {
+	//-----------------------------------------------------------------------
+	OcclusionCullingOctreeSceneManager::OcclusionCullingOctreeSceneManager()
+	{
+		mOcclusionCullingOctreeSceneTraverser = 
+			new OcclusionCullingOctreeSceneTraverser(this, mDestRenderSystem);
+
+		//mDisplayNodes = true;
+		//mShowBoundingBoxes = true;
+		//mShowBoxes = true;
+		//mMaxDepth = 20;
+	}
+	//-----------------------------------------------------------------------
+	OcclusionCullingOctreeSceneManager::~OcclusionCullingOctreeSceneManager()
+	{
+		delete mOcclusionCullingOctreeSceneTraverser;
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingOctreeSceneManager::_renderVisibleObjects(void)
+	{
+		//-- render background
+		clearSpecialCaseRenderQueues();
+		addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND);
+		addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY);
+	
+		setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE);
+		SceneManager::_renderVisibleObjects( );
+		_deleteRenderedQueueGroups();
+
+		//-- render visible objects (i.e., all but overlay)
+		clearSpecialCaseRenderQueues();
+		addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY);
+		setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE);
+
+		mOcclusionCullingOctreeSceneTraverser->setSceneRoot(mOctree);
+		mOcclusionCullingOctreeSceneTraverser->renderScene(mCameraInProgress);
+
+		_deleteRenderedQueueGroups();
+
+		//-- render rest, e.g., overlay
+		clearSpecialCaseRenderQueues();
+		SceneManager::_renderVisibleObjects();
+		//_deleteRenderedQueueGroups();
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingOctreeSceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters)
+	{
+		// must be empty because objects are found and rendered in an interleaved fashion
+		// in _renderVisibibleObjects 
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingOctreeSceneManager::_updateSceneGraph(Camera* cam)
+	{
+		mOcclusionCullingOctreeSceneTraverser->setNumSceneNodes((int)mSceneNodes.size());
+		mOcclusionCullingOctreeSceneTraverser->setRenderSystem(mDestRenderSystem);
+        
+		mOcclusionCullingOctreeSceneTraverser->setNumOctreeNodes(mNumOctreeNodes);
+
+		OctreeSceneManager::_updateSceneGraph(cam);
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingOctreeSceneManager::setOption( const String & key, const void * val )
+	{
+		return mOcclusionCullingOctreeSceneTraverser->setOption( key, val) || OctreeSceneManager::setOption( key, val );
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingOctreeSceneManager::getOption( const String & key, void *val )
+	{
+		return mOcclusionCullingOctreeSceneTraverser->getOption( key, val) || OctreeSceneManager::getOption( key, val ) ;
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingOctreeSceneManager::getOptionValues( const String & key, StringVector  &refValueList )
+	{
+		return OctreeSceneManager::getOptionValues( key, refValueList );
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingOctreeSceneManager::getOptionKeys( StringVector & refKeys )
+	{
+		return mOcclusionCullingOctreeSceneTraverser->getOptionKeys ( refKeys ) || OctreeSceneManager::getOptionKeys( refKeys );
+	}
+}	
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneTraverser.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneTraverser.cpp	(revision 59)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneTraverser.cpp	(revision 59)
@@ -0,0 +1,509 @@
+#include "OgreOcclusionCullingSceneTraverser.h"
+#include "OgreMath.h"
+#include "OgreIteratorWrappers.h"
+#include "OgreCamera.h"
+#include "OgreHardwareOcclusionQuery.h"
+#include "OgreSolidHalfBoundingBox.h"
+
+
+#include <windows.h>
+
+namespace Ogre {
+	
+	//-----------------------------------------------------------------------
+	OcclusionCullingSceneTraverser::OcclusionCullingSceneTraverser(SceneManager *sm, RenderSystem *rsys): 
+	mFrameId(1), mDistanceQueue(NULL), mVisibilityThreshold(0), mCurrentTestIdx(0),
+	mQueryMode(MODE_RENDER), mNumSceneNodes(0), mCurrentAlgorithm(RENDER_COHERENT),
+	mNumQueries(0), mNumTraversedNodes(0), mNumQueryCulledNodes(0), mNumFrustumCulledNodes(0), 
+	mNumRenderedNodes(0),mNumRenderedGeometry(0), mSceneManager(sm), mRenderSystem(rsys), mSceneRoot(NULL)
+	{		
+		mHalfBoundingBox[0] = mHalfBoundingBox[1] = 0;
+	}
+	//-----------------------------------------------------------------------
+	OcclusionCullingSceneTraverser::~OcclusionCullingSceneTraverser()
+	{		
+		if(mHalfBoundingBox[0]) delete mHalfBoundingBox[0];
+		if(mHalfBoundingBox[1]) delete mHalfBoundingBox[1];
+
+		deleteQueries();
+
+		if(mDistanceQueue)
+			delete mDistanceQueue;
+		//SceneManager::~SceneManager();
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::renderScene( Camera *cam )
+	{
+		mNumTraversedNodes = 0;
+		mNumQueryCulledNodes = 0;
+		mNumFrustumCulledNodes = 0;
+		mNumRenderedGeometry = 0;
+		mNumRenderedNodes = 0;
+
+		mCurrentTestIdx = 0;
+
+		initDistanceQueue(cam);
+
+		switch(mCurrentAlgorithm)
+		{
+			case RENDER_CULL_FRUSTUM:
+				renderCullFrustum(cam);
+		        break;
+			case RENDER_STOP_AND_WAIT:
+				renderStopAndWait(cam);
+				break;
+			case RENDER_COHERENT:
+				renderCoherentWithQueue(cam);
+				break;
+			default:
+				renderCullFrustum(cam);
+				break;
+		}	
+
+		mFrameId ++;
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::renderCoherentWithQueue(Camera *cam)
+	{
+		QueryQueue queryQueue;
+
+		//-- PART 1: process finished occlusion queries
+		while(!mDistanceQueue->empty() || !queryQueue.empty())
+		{
+			 
+				SceneNode *node = queryQueue.front().first;
+				HardwareOcclusionQuery *query = queryQueue.front().second;
+
+				queryQueue.pop();
+			
+				// wait until result available
+				unsigned int visiblePixels;
+				query->pullOcclusionQuery(&visiblePixels);
+
+				if(visiblePixels > mVisibilityThreshold)
+				{
+					pullUpVisibility(node);
+					traverseNode(cam, node);
+				}
+				else
+				{
+					mNumQueryCulledNodes ++;
+				}
+			}	
+
+			//-- PART 2: hierarchical traversal
+			if(!mDistanceQueue->empty())
+			{
+				SceneNode *node = mDistanceQueue->top();
+				mDistanceQueue->pop();
+				
+				bool intersects = false;
+				//TODO: Isvisible also checked inside scenenode::findvisibleobjects
+				if(!cam->isVisible(node->_getWorldAABB(), intersects))
+				{
+                    mNumFrustumCulledNodes ++;
+					continue;
+				}
+
+				// if intersects near plane => skip occlusion query because wrong results possible
+				if(intersects)
+				{
+					// update node's visited flag
+					node->setLastVisited(mFrameId);
+					pullUpVisibility(node);			
+					traverseNode(cam, node);
+
+					continue;
+				}
+
+				// identify previously visible nodes
+				bool wasVisible = node->isNodeVisible() && (node->lastVisited() == mFrameId - 1);
+					
+				// identify nodes that we cannot skip queries for
+				bool mustQuery= !wasVisible || (node->numAttachedObjects() > 0) || isLeaf(node);
+
+				// reset node's visibility classification 
+				node->setNodeVisible(false);
+
+				// update node's visited flag
+				node->setLastVisited(mFrameId);
+				
+				// skip testing previously visible interior nodes without geometry
+				if(mustQuery)
+				{
+					HardwareOcclusionQuery *query = issueOcclusionQuery(&node->_getWorldAABB(), wasVisible);
+					queryQueue.push(QueryPair(node, query));
+				}
+					
+				// always traverse a node if it was visible
+				if(wasVisible)
+				{
+					traverseNode(cam, node);
+				}
+				else
+				{
+					mNumFrustumCulledNodes ++;
+				}
+			}
+		}
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::renderCullFrustum(Camera *cam)
+	{
+		while(!mDistanceQueue->empty())
+		{
+			SceneNode *node = mDistanceQueue->top();
+			mDistanceQueue->pop();
+	
+			// interesting for visualization purpose
+			node->setNodeVisible(false);
+
+			//TODO: IsVisible also checked inside scenenode::_findvisibleobjects
+			if(!cam->isVisible(node->_getWorldAABB()))
+			{			
+				mNumFrustumCulledNodes ++;
+				continue;
+			}
+
+			// update node's visited flag 
+			node->setLastVisited(mFrameId);
+			node->setNodeVisible(true);
+			traverseNode(cam, node);
+		}
+	}	
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::renderStopAndWait(Camera *cam)
+	{
+		while(!mDistanceQueue->empty())
+		{
+			SceneNode *node = mDistanceQueue->top();
+			mDistanceQueue->pop();
+		
+			// interesting for the visualization
+			node->setNodeVisible(false);
+			node->setLastVisited(mFrameId);
+
+			bool intersects = false;
+			//TODO: Isvisible also checked inside scenenode::findvisibleobjects
+			if(!cam->isVisible(node->_getWorldAABB(), intersects))
+			{
+				mNumFrustumCulledNodes ++;
+				continue;
+			}
+
+			// if intersects near plane => skip occlusion query because wrong results possible
+			if(intersects)
+			{
+				node->setNodeVisible(true);
+				traverseNode(cam, node);
+
+				continue;
+			}
+
+			HardwareOcclusionQuery *query = issueOcclusionQuery(&node->_getWorldAABB(), false);
+				
+			unsigned int visiblePixels;
+			// wait if result not available
+			query->pullOcclusionQuery(&visiblePixels);
+	
+			// node visible
+			if(visiblePixels > mVisibilityThreshold)
+			{
+				node->setNodeVisible(true);
+				traverseNode(cam, node);
+			}
+			else
+			{
+				mNumQueryCulledNodes ++;
+			}
+		}
+	}
+	//-----------------------------------------------------------------------
+	HardwareOcclusionQuery *OcclusionCullingSceneTraverser::issueOcclusionQuery( 
+		AxisAlignedBox *box, bool wasVisible )
+	{
+		// change state so the bounding box gets not actually rendered on the screen
+		// TODO: in rendervisibleobjects, the rendermode is changed by ogre itself => change this!!
+		
+		//setRenderingMode(MODE_QUERY);
+		//mRenderSystem->_setRasterisationMode(SDL_SOLID); setRenderingMode(MODE_RENDER);
+
+		// get next available test id
+		HardwareOcclusionQuery *query = getNextOcclusionQuery();
+
+		//-- the actual query test
+		query->beginOcclusionQuery();
+				
+		renderBoundingBox(box);
+
+		query->endOcclusionQuery();
+	
+		/*mRenderSystem->_setRasterisationMode(SDL_WIREFRAME);
+		setRenderingMode(MODE_RENDER);
+		renderBoundingBox(box);
+		mRenderSystem->_setRasterisationMode(SDL_SOLID);*/
+		
+		return query;
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::setRenderingMode( int mode )
+	{	
+		// avoid unnecessary state changes
+		if(mode != mQueryMode)
+		{
+			mQueryMode = mode;
+			bool enabled = (mode == MODE_RENDER);
+			
+			//if(mode == MODE_RENDER) return;
+
+			/*
+			mRenderSystem->_setRasterisationMode(SDL_SOLID);
+			mRenderSystem->_setSurfaceParams(ColourValue(0.9, 0.2, 0.2),
+			ColourValue(0.2, 0.2, 0.2), ColourValue(0.2, 0.2, 0.2),
+			ColourValue(0, 0, 0), Real(100));
+			mRenderSystem->_setDepthBufferCheckEnabled(false);
+			mRenderSystem->_setAlphaRejectSettings(CMPF_ALWAYS_PASS, 255);
+			*/
+
+          	mRenderSystem->_setColourBufferWriteEnabled(enabled, enabled, enabled, enabled);
+			mRenderSystem->_setDepthBufferWriteEnabled(enabled);
+			//mRenderSystem->setLightingEnabled(enabled);
+		}
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::traverseNode( Camera *cam, SceneNode *node )
+	{
+		mNumTraversedNodes ++;
+		
+		if(node->numAttachedObjects() > 0)
+		{
+			renderSceneNode(cam, node);
+		}
+
+		// internal node: add children to priority queue for further processing
+		Node::ChildNodeIterator it = node->getChildIterator();
+					
+		while (it.hasMoreElements())			
+		{ 
+			SceneNode* sceneChild = static_cast<SceneNode*>(it.getNext());
+			mDistanceQueue->push(sceneChild);
+		}
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::renderSceneNode( Camera *cam, SceneNode *node )
+	{
+		//TODO: does not do any changes
+		//setRenderingMode(MODE_RENDER);
+		
+		if(node->lastRendered() != node->lastVisited())
+		{
+			node->setLastRendered(node->lastVisited());
+			mNumRenderedNodes ++;
+
+			mSceneManager->_renderSceneNode(cam, node);
+		}
+	}
+	//-----------------------------------------------------------------------
+/*	void OcclusionCullingSceneTraverser::preprocess( void )
+	{
+		//-- initialise occlusion queries.
+		deleteQueries();
+
+		for(unsigned int i=0; i < mNumQueries; i++)
+		{
+			mOcclusionQueries.push_back(mRenderSystem->createHardwareOcclusionQuery());
+		}	
+	}*/
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::setSceneManager( SceneManager *sm )
+	{
+		mSceneManager = sm;
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::setRenderSystem( RenderSystem *rsys )
+	{
+		mRenderSystem = rsys;
+	}
+	//-----------------------------------------------------------------------
+	/*unsigned int OcclusionCullingSceneManager::countSceneNodes(SceneNode *node)
+	{
+		unsigned int result = 1;
+		
+		Node::ChildNodeIterator it = node->getChildIterator();
+		
+		while (it.hasMoreElements())
+		{ 
+			SceneNode* sceneChild = static_cast<SceneNode*>(it.getNext());
+			result += countSceneNodes(sceneChild);
+        }
+
+		return result;
+	}*/
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingSceneTraverser::isLeaf( SceneNode *node )
+	{
+		return (node->numChildren() == 0);
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::pullUpVisibility(SceneNode *node )
+	{
+		while(node && !node->isNodeVisible())
+		{
+			node->setNodeVisible(true);
+			node = node->getParentSceneNode();
+		}
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::deleteQueries( void )
+	{
+		for(unsigned int i=0; i < (unsigned int)mOcclusionQueries.size(); ++i)
+			delete mOcclusionQueries[i];
+
+		mOcclusionQueries.clear();
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::renderBoundingBox( AxisAlignedBox *box )
+	{
+		// Render two halfes of the bounding box (using triangle fans)
+		for(int half = 0; half < 2; half ++)
+		{
+			static Matrix4 xform[256];
+			//TODO: this should be full bounding box
+			SolidHalfBoundingBox *halfbox = getSolidHalfBoundingBox(half);
+			halfbox->setupBoundingBox(*box);
+			
+			/*mRenderSystem->_setWorldMatrix(Matrix4::IDENTITY);
+
+			halfbox->getWorldTransforms(xform);
+
+			int numMatrices = halfbox->getNumWorldTransforms();
+			if (numMatrices > 1)
+			{
+				mRenderSystem->_setWorldMatrices(xform, numMatrices);
+			}
+			else
+			{
+				mRenderSystem->_setWorldMatrix(*xform);
+			}
+			mRenderSystem->setClipPlanes(halfbox->getClipPlanes());
+
+			static RenderOperation ro;
+
+			mSceneManager->useRenderableViewProjMode(halfbox);
+			halfbox->getRenderOperation(ro);
+			ro.srcRenderable = halfbox; 
+			mRenderSystem->_render(ro);*/
+			
+			mSceneManager->myrenderSingleObject(getSolidHalfBoundingBox(half), 
+				getSolidHalfBoundingBox(half)->getTechnique()->getPass(0), true);
+		}
+	}
+	//-----------------------------------------------------------------------
+	SolidHalfBoundingBox *OcclusionCullingSceneTraverser::getSolidHalfBoundingBox( int half )
+	{
+		if(!mHalfBoundingBox[half])
+			mHalfBoundingBox[half] = new SolidHalfBoundingBox(half == 1);
+
+		return mHalfBoundingBox[half];	
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::setNumSceneNodes(int num)
+	{
+		mNumSceneNodes = num;
+	}
+	//-----------------------------------------------------------------------
+	/*void OcclusionCullingSceneTraverser::setNumQueries(int num)
+	{
+		mNumQueries = num;
+	}*/
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::setSceneRoot(SceneNode *root)
+	{
+		mSceneRoot = root;
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::initDistanceQueue(Camera *cam)
+	{
+		mDistanceQueue = new PriorityQueue(myless<SceneNode *>(cam));
+		mDistanceQueue->push(mSceneRoot);
+	}
+	//-----------------------------------------------------------------------
+	HardwareOcclusionQuery *OcclusionCullingSceneTraverser::getNextOcclusionQuery(void)
+	{
+		if(mCurrentTestIdx == mOcclusionQueries.size())
+		{
+			mOcclusionQueries.push_back(mRenderSystem->createHardwareOcclusionQuery());
+		}
+		
+		return mOcclusionQueries[mCurrentTestIdx ++];
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingSceneTraverser::setOption( const String & key, const void * val )
+	{
+		if ( key == "Algorithm" )
+		{
+			mCurrentAlgorithm = * static_cast < const int * > ( val );
+			return true;
+		}
+		if ( key == "Threshold" )
+		{
+			mVisibilityThreshold = * static_cast < const int * > ( val );
+			return true;
+		}
+
+		return false;
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingSceneTraverser::getOption( const String & key, void *val )
+	{
+		if ( key == "Algorithm" )
+		{
+			* static_cast < int * > ( val ) = mCurrentAlgorithm;
+			return true;
+		}
+		if ( key == "Threshold" )
+		{
+			* static_cast < unsigned int * > ( val ) = mVisibilityThreshold;
+			return true;
+		}
+		if ( key == "NumSceneNodes" )
+		{
+			* static_cast < unsigned int * > ( val ) = mNumSceneNodes;
+			return true;
+		}
+		if ( key == "NumTraversedNodes" )
+		{
+			* static_cast < unsigned int * > ( val ) = mNumTraversedNodes;
+			return true;
+		}
+		if ( key == "NumQueryCulledNodes" )
+		{
+			* static_cast < unsigned int * > ( val ) = mNumQueryCulledNodes;
+			return true;
+		}
+		if ( key == "NumFrustumCulledNodes" )
+		{
+			* static_cast < unsigned int * > ( val ) = mNumFrustumCulledNodes;
+			return true;
+		}
+		if ( key == "NumRenderedNodes" )
+		{
+			* static_cast < unsigned int * > ( val ) = mNumRenderedNodes;
+			return true;
+		}
+		return false;
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingSceneTraverser::getOptionKeys( StringVector & refKeys )
+	{
+		refKeys.push_back( "Algorithm" );
+		refKeys.push_back( "Threshold" );
+		refKeys.push_back( "NumSceneNodes" );
+		refKeys.push_back( "NumTraversedNodes" );
+		refKeys.push_back( "NumQueryCulledNodes" );
+		refKeys.push_back( "NumFrustumCulledNodes" );
+		refKeys.push_back( "mNumRenderedGeometry" );
+
+		return true;
+	}
+}	
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingOctreeSceneTraverser.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingOctreeSceneTraverser.cpp	(revision 55)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingOctreeSceneTraverser.cpp	(revision 55)
@@ -0,0 +1,282 @@
+#include "OgreOcclusionCullingOctreeSceneTraverser.h"
+#include "OgreOcclusionCullingOctreeSceneManager.h"
+#include "OgreHardwareOcclusionQuery.h"
+
+#include <windows.h>
+
+namespace Ogre {
+	//-----------------------------------------------------------------------
+	OcclusionCullingOctreeSceneTraverser::OcclusionCullingOctreeSceneTraverser(SceneManager *sm, RenderSystem *rsys): 
+	OcclusionCullingSceneTraverser(sm, rsys), mOctreeSceneRoot(0), mOctreeDistanceQueue(0)
+	{
+	}
+	//-----------------------------------------------------------------------
+	OcclusionCullingOctreeSceneTraverser::~OcclusionCullingOctreeSceneTraverser()
+	{		
+		if(mOctreeDistanceQueue)
+			delete mOctreeDistanceQueue;
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingOctreeSceneTraverser::traverseOctant(Camera *cam, Octree *octant)
+	{
+		mNumTraversedNodes ++;
+	
+		// if we come across some renderable geometry => render it
+		renderOctant(cam, octant);
+		
+		for(int i=0; i<8; i++)
+		{
+			Octree *nextChild = octant->mChildren[(i & 4) >> 2][(i & 2) >> 1][i & 1];
+
+			if(nextChild)
+			{
+				mOctreeDistanceQueue->push(nextChild);
+			}
+		}
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingOctreeSceneTraverser::renderCullFrustum(Camera *cam)
+	{
+		AxisAlignedBox box;
+
+		while(!mOctreeDistanceQueue->empty())
+		{
+			Octree *octant = mOctreeDistanceQueue->top();
+			mOctreeDistanceQueue->pop();
+	
+			// interesting for visualization purpose
+			octant->setOctreeVisible(false);
+			octant->_getCullBounds(&box);
+			
+			if(!cam->isVisible(box))
+			{
+				mNumFrustumCulledNodes ++;
+				continue;
+			}
+
+			mRenderSystem->_setRasterisationMode(SDL_WIREFRAME);
+			renderBoundingBox(&box);
+			mRenderSystem->_setRasterisationMode(SDL_SOLID);
+			// update node's visited flag 
+			octant->setLastVisited(mFrameId);
+			octant->setOctreeVisible(true);
+		
+			traverseOctant(cam, octant);
+		}
+	}	
+	//-----------------------------------------------------------------------
+	/** Renders the scene with the hierarchical stop and wait algorithm. */
+	void OcclusionCullingOctreeSceneTraverser::renderStopAndWait( Camera *cam )
+	{
+		AxisAlignedBox box;
+
+		while(!mOctreeDistanceQueue->empty())
+		{
+			Octree *octant = mOctreeDistanceQueue->top();
+			mOctreeDistanceQueue->pop();
+		
+			// interesting for visualization purpose
+			octant->setOctreeVisible(false);
+			octant->setLastVisited(mFrameId);
+
+			//TODO: Isvisible also checked inside scenenode::findvisibleobjects
+			octant->_getCullBounds(&box);
+
+			bool intersects = false;
+
+			if(!cam->isVisible(box, intersects))
+			{
+				mNumFrustumCulledNodes ++;
+				continue;
+			}
+			//if intersects near plane => skip occlusion query because wrong results possible
+			if(intersects)
+			{
+				octant->setOctreeVisible(true);
+				traverseOctant(cam, octant);
+				continue;
+			}
+
+			HardwareOcclusionQuery *query = issueOcclusionQuery(&box, false);
+				
+			unsigned int visiblePixels;
+			// wait if result not available
+			query->pullOcclusionQuery(&visiblePixels);
+
+			//char msg[100]; sprintf(msg, "visible pixels: %d\n", visiblePixels);
+			//OutputDebugString(msg);
+
+			// node visible
+			if(visiblePixels > mVisibilityThreshold)
+			{
+				traverseOctant(cam, octant);
+			}
+			else
+			{
+				mNumQueryCulledNodes ++;
+			}
+		}
+	}
+	//-----------------------------------------------------------------------
+	/** Renders the scene with the coherent hierarchical algorithm and the query queye. */
+	void OcclusionCullingOctreeSceneTraverser::renderCoherentWithQueue( Camera *cam )
+	{
+		OctreeQueryQueue queryQueue;
+		AxisAlignedBox box;
+
+		//-- PART 1: process finished occlusion queries
+		while(!mOctreeDistanceQueue->empty() || !queryQueue.empty())
+		{
+			while(!queryQueue.empty() && 
+				  ((queryQueue.front().second)->resultAvailable() || mOctreeDistanceQueue->empty()))
+			{
+				Octree *octant = queryQueue.front().first;
+				HardwareOcclusionQuery *query = queryQueue.front().second;
+
+				queryQueue.pop();
+			
+				// wait until result available
+				unsigned int visiblePixels;
+				query->pullOcclusionQuery(&visiblePixels);
+
+				if(visiblePixels > mVisibilityThreshold)
+				{
+					pullUpVisibility(octant);
+					traverseOctant(cam, octant);
+				}
+				else
+				{
+					mNumQueryCulledNodes ++;
+				}
+			}	
+
+			//-- PART 2: hierarchical traversal
+			if(!mOctreeDistanceQueue->empty())
+			{
+				Octree *octant = mOctreeDistanceQueue->top();
+				mOctreeDistanceQueue->pop();
+					
+				octant->_getCullBounds(&box);
+
+				bool intersects = false;
+				//TODO: Isvisible also checked inside scenenode::findvisibleobjects
+				if(!cam->isVisible(box, intersects))
+				{
+                    mNumFrustumCulledNodes ++;
+					continue;
+				}
+
+				// if intersects near plane => skip occlusion query because wrong results possible
+				if(intersects)
+				{
+					// update octant's visited flag
+					octant->setLastVisited(mFrameId);
+
+					pullUpVisibility(octant);			
+					traverseOctant(cam, octant);
+
+					continue;
+				}
+
+				// identify previously visible nodes
+				bool wasVisible = octant->isOctreeVisible() && (octant->lastVisited() == mFrameId - 1);
+				
+				// identify nodes that we cannot skip queries for
+				bool mustQuery = !wasVisible || (octant->numNodes() > 0) || isLeaf(octant);
+
+				// reset node's visibility classification 
+				octant->setOctreeVisible(false);
+
+				// update node's visited flag
+				octant->setLastVisited(mFrameId);
+			
+				// skip testing previously visible interior nodes
+				if(mustQuery)
+				{
+					HardwareOcclusionQuery *query = issueOcclusionQuery(&box, wasVisible);
+					queryQueue.push(OctreeQueryPair(octant, query));
+				}
+					
+				// always traverse a node if it was visible
+				if(wasVisible)
+				{
+					traverseOctant(cam, octant);
+				}
+			}
+		}
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingOctreeSceneTraverser::pullUpVisibility( Octree *octant )
+	{
+		while(octant && !octant->isOctreeVisible())
+		{
+			octant->setOctreeVisible(true);
+			octant = octant->getParent();
+		}
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingOctreeSceneTraverser::renderOctant( Camera *cam, Octree *octant )
+	{
+		if(octant->lastRendered() != mFrameId)
+		{
+			octant->setLastRendered(mFrameId);
+
+			if(octant->numNodes() == 0) return;
+
+			//TODO: does nothing useful
+			//setRenderingMode(MODE_RENDER);
+
+			((OctreeSceneManager *)mSceneManager)->_renderOctant(cam, octant);
+
+			mNumRenderedNodes ++;
+		}
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingOctreeSceneTraverser::setSceneRoot( Octree *root )
+	{
+		mOctreeSceneRoot = root;
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingOctreeSceneTraverser::initDistanceQueue( Camera *cam )
+	{
+		if(mOctreeDistanceQueue)
+			delete mOctreeDistanceQueue;
+
+		mOctreeDistanceQueue = new OctreePriorityQueue(octreeless<Octree *>(cam));
+		mOctreeDistanceQueue->push(mOctreeSceneRoot);
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingOctreeSceneTraverser::isLeaf(Octree *octant)
+	{
+		for(int i=0; i<8; i++)
+		{
+			if(octant->mChildren[(i & 4) >> 2][(i & 2) >> 1][i & 1])
+				return false;
+		}
+
+		return true;
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingOctreeSceneTraverser::setNumOctreeNodes(unsigned int num)
+	{
+		mNumOctreeNodes = num;
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingOctreeSceneTraverser::getOption( const String & key, void *val )
+	{
+		if (key == "NumOctreeNodes")
+		{
+			* static_cast < unsigned int * > ( val ) = mNumOctreeNodes;
+			return true;
+		}
+
+		return OcclusionCullingSceneTraverser::getOption(key, val);
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingOctreeSceneTraverser::getOptionKeys( StringVector & refKeys )
+	{
+		refKeys.push_back("NumOctreeNodes");
+		
+		return OcclusionCullingSceneTraverser::getOptionKeys(refKeys);		
+	}
+}	
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneManager.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneManager.cpp	(revision 56)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneManager.cpp	(revision 56)
@@ -0,0 +1,91 @@
+#include "OgreOcclusionCullingTerrainSceneManager.h"
+#include "OgreMath.h"
+#include "OgreIteratorWrappers.h"
+#include "OgreRenderSystem.h"
+#include "OgreCamera.h"
+#include "OgreHardwareOcclusionQuery.h"
+#include "OgreSolidHalfBoundingBox.h"
+
+#include <windows.h>
+
+namespace Ogre {
+	//-----------------------------------------------------------------------
+	OcclusionCullingTerrainSceneManager::OcclusionCullingTerrainSceneManager()
+	{
+		mOcclusionCullingOctreeSceneTraverser = 
+			new OcclusionCullingOctreeSceneTraverser(this, mDestRenderSystem);
+
+		//mShowBoxes = true;
+		//mDisplayNodes = true;
+		//mShowBoundingBoxes = true;
+		mMaxDepth = 20;
+	}
+	//-----------------------------------------------------------------------
+	OcclusionCullingTerrainSceneManager::~OcclusionCullingTerrainSceneManager()
+	{
+		delete mOcclusionCullingOctreeSceneTraverser;
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingTerrainSceneManager::_renderVisibleObjects(void)
+	{
+		//-- render background
+		clearSpecialCaseRenderQueues();
+		addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND);
+		addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY);
+	
+		setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE);
+		SceneManager::_renderVisibleObjects();
+		_deleteRenderedQueueGroups();
+
+		//-- render visible objects (i.e., all but overlay)
+		clearSpecialCaseRenderQueues();
+		addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY);
+		setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE);
+
+		mOcclusionCullingOctreeSceneTraverser->setSceneRoot(mOctree);
+		mOcclusionCullingOctreeSceneTraverser->renderScene(mCameraInProgress);
+		
+		_deleteRenderedQueueGroups();
+
+		//-- render overlay
+		clearSpecialCaseRenderQueues();
+		SceneManager::_renderVisibleObjects( );
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingTerrainSceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters)
+	{
+		// must be empty because objects are found and rendered in an interleaved fashion
+		// in _renderVisibibleObjects 
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingTerrainSceneManager::_updateSceneGraph(Camera* cam)
+	{
+		mOcclusionCullingOctreeSceneTraverser->setNumSceneNodes((int)mSceneNodes.size());
+		mOcclusionCullingOctreeSceneTraverser->setRenderSystem(mDestRenderSystem);
+        
+		mOcclusionCullingOctreeSceneTraverser->setNumOctreeNodes(mNumOctreeNodes);
+
+		TerrainSceneManager::_updateSceneGraph(cam);
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingTerrainSceneManager::setOption( const String & key, const void * val )
+	{
+		return mOcclusionCullingOctreeSceneTraverser->setOption( key, val) || TerrainSceneManager::setOption( key, val );
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingTerrainSceneManager::getOption( const String & key, void *val )
+	{
+		return mOcclusionCullingOctreeSceneTraverser->getOption( key, val) || TerrainSceneManager::getOption( key, val ) ;
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingTerrainSceneManager::getOptionValues( const String & key, StringVector  &refValueList )
+	{
+		return TerrainSceneManager::getOptionValues( key, refValueList );
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingTerrainSceneManager::getOptionKeys( StringVector & refKeys )
+	{
+		return mOcclusionCullingOctreeSceneTraverser->getOptionKeys ( refKeys ) || TerrainSceneManager::getOptionKeys( refKeys );
+	}
+	//-----------------------------------------------------------------------
+}	
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/Makefile.am
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/Makefile.am	(revision 16)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/Makefile.am	(revision 16)
@@ -0,0 +1,11 @@
+INCLUDES = $(STLPORT_CFLAGS) -I$(top_srcdir)/PlugIns/OcclusionCullingSceneManager/include -I$(top_srcdir)/OgreMain/include
+
+pkglib_PROGRAMS = Plugin_BSPSceneManager.so
+
+Plugin_OcclusionCullingSceneManager_so_SOURCES = OgreBspLevel.cpp \
+                             OcclusionCullingResourceManager.cpp \
+                             OcclusionCullingSceneManager.cpp \
+                             OcclusionCullingSceneManagerDll.cpp
+					
+Plugin_OcclusionCullingSceneManager_so_LDFLAGS = $(SHARED_FLAGS) -L$(top_srcdir)/OgreMain/src
+Plugin_OcclusionCullingSceneManager_so_LDADD = -lOgreMain
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingDotSceneManager.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingDotSceneManager.cpp	(revision 44)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingDotSceneManager.cpp	(revision 44)
@@ -0,0 +1,89 @@
+#include "OgreOcclusionCullingDotSceneManager.h"
+#include "OgreMath.h"
+#include "OgreIteratorWrappers.h"
+#include "OgreRenderSystem.h"
+#include "OgreCamera.h"
+#include "OgreHardwareOcclusionQuery.h"
+#include "OgreSolidHalfBoundingBox.h"
+
+//#include <windows.h>
+
+namespace Ogre {
+	//-----------------------------------------------------------------------
+	OcclusionCullingDotSceneManager::OcclusionCullingDotSceneManager()
+	{
+		mOcclusionCullingSceneTraverser = new OcclusionCullingSceneTraverser(this, mDestRenderSystem);
+		//mDisplayNodes = true;
+		mShowBoundingBoxes = true;
+		//mShowBoxes = true;
+	}
+	//-----------------------------------------------------------------------
+	OcclusionCullingDotSceneManager::~OcclusionCullingDotSceneManager()
+	{
+		delete mOcclusionCullingSceneTraverser;
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingDotSceneManager::_renderVisibleObjects(void)
+	{
+		//-- render background
+		clearSpecialCaseRenderQueues();
+		addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND);
+		addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY);
+	
+		setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE);
+		DotSceneManager::_renderVisibleObjects( );
+		_deleteRenderedQueueGroups();
+
+		//-- render visible objects (i.e., all but overlay)
+		clearSpecialCaseRenderQueues();
+		addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY);
+		setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE);
+
+		mOcclusionCullingSceneTraverser->setSceneRoot(mSceneRoot);
+		mOcclusionCullingSceneTraverser->renderScene(mCameraInProgress);
+		_deleteRenderedQueueGroups();
+
+		//-- render overlay
+		clearSpecialCaseRenderQueues();
+		DotSceneManager::_renderVisibleObjects( );
+	
+		clearSpecialCaseRenderQueues();
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingDotSceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters)
+	{
+		// must be empty because objects are found and rendered in an interleaved fashion
+		// in _renderVisibibleObjects 
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingDotSceneManager::_updateSceneGraph(Camera* cam)
+	{
+		mOcclusionCullingSceneTraverser->setNumSceneNodes((int)mSceneNodes.size());
+		mOcclusionCullingSceneTraverser->setRenderSystem(mDestRenderSystem);
+
+        //mOcclusionCullingSceneTraverser->preprocess();
+		
+		DotSceneManager::_updateSceneGraph(cam);
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingDotSceneManager::setOption( const String & key, const void * val )
+	{
+		return mOcclusionCullingSceneTraverser->setOption( key, val) || DotSceneManager::setOption( key, val );
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingDotSceneManager::getOption( const String & key, void *val )
+	{
+		return mOcclusionCullingSceneTraverser->getOption( key, val) || DotSceneManager::getOption( key, val ) ;
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingDotSceneManager::getOptionValues( const String & key, StringVector  &refValueList )
+	{
+		return DotSceneManager::getOptionValues( key, refValueList );
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingDotSceneManager::getOptionKeys( StringVector & refKeys )
+	{
+		return mOcclusionCullingSceneTraverser->getOptionKeys ( refKeys ) || DotSceneManager::getOptionKeys( refKeys );
+	}
+	
+}	
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/SceneTraverser.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/SceneTraverser.cpp	(revision 56)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/SceneTraverser.cpp	(revision 56)
@@ -0,0 +1,235 @@
+#include "OgreOcclusionCullingSceneTraverser.h"
+#include "OgreMath.h"
+#include "OgreIteratorWrappers.h"
+#include "OgreCamera.h"
+#include "OgreHardwareOcclusionQuery.h"
+#include "OgreSolidHalfBoundingBox.h"
+
+
+#include <windows.h>
+
+namespace Ogre {
+	
+	//-----------------------------------------------------------------------
+	SceneTraverser::OcclusionCullingSceneTraverser(SceneManager *sm, RenderSystem *rsys): 
+	mFrameId(1), mDistanceQueue(NULL), mVisibilityThreshold(0), mCurrentTestIdx(0),
+	mNumSceneNodes(0), mNumTraversedNodes(0), mNumQueryCulledNodes(0), mNumFrustumCulledNodes(0), 
+	mNumRenderedNodes(0),mNumRenderedGeometry(0), mSceneManager(sm), mRenderSystem(rsys), mSceneRoot(NULL)
+	{		
+		mHalfBoundingBox[0] = mHalfBoundingBox[1] = 0;
+	}
+	//-----------------------------------------------------------------------
+	SceneTraverser::~OcclusionCullingSceneTraverser()
+	{		
+		if(mHalfBoundingBox[0]) delete mHalfBoundingBox[0];
+		if(mHalfBoundingBox[1]) delete mHalfBoundingBox[1];
+
+		deleteQueries();
+
+		if(mDistanceQueue)
+			delete mDistanceQueue;
+		//SceneManager::~SceneManager();
+	}
+	//-----------------------------------------------------------------------
+	void SceneTraverser::traverseNode( Camera *cam, HierarchyNode *node )
+	{
+		mNumTraversedNodes ++;
+		
+		if(node->numAttachedObjects() > 0)
+		{
+			renderSceneNode(cam, node);
+		}
+
+		// internal node: add children to priority queue for further processing
+		Node::ChildNodeIterator it = node->getChildIterator();
+					
+		while (it.hasMoreElements())			
+		{ 
+			SceneNode* sceneChild = static_cast<SceneNode*>(it.getNext());
+			mDistanceQueue->push(sceneChild);
+		}
+	}
+	//-----------------------------------------------------------------------
+	void SceneTraverser::renderSceneNode( Camera *cam, HierarchyNode *node )
+	{
+		if(node->lastRendered() != node->lastVisited())
+		{
+			node->setLastRendered(node->lastVisited());
+			mNumRenderedNodes ++;
+
+			mSceneManager->_renderSceneNode(cam, node);
+		}
+	}
+	//-----------------------------------------------------------------------
+	void SceneTraverser::setSceneManager( SceneManager *sm )
+	{
+		mSceneManager = sm;
+	}
+	//-----------------------------------------------------------------------
+	void SceneTraverser::setRenderSystem( RenderSystem *rsys )
+	{
+		mRenderSystem = rsys;
+	}
+	//-----------------------------------------------------------------------
+	bool SceneTraverser::isLeaf( SceneNode *node )
+	{
+		return (node->numChildren() == 0);
+	}
+	//-----------------------------------------------------------------------
+	void SceneTraverser::pullUpVisibility(SceneNode *node )
+	{
+		while(node && !node->isNodeVisible())
+		{
+			node->setNodeVisible(true);
+			node = node->getParentSceneNode();
+		}
+	}
+	//-----------------------------------------------------------------------
+	void SceneTraverser::deleteQueries( void )
+	{
+		for(unsigned int i=0; i < (unsigned int)mOcclusionQueries.size(); ++i)
+			delete mOcclusionQueries[i];
+
+		mOcclusionQueries.clear();
+	}
+	//-----------------------------------------------------------------------
+	void SceneTraverser::renderBoundingBox( AxisAlignedBox *box )
+	{
+		// Render two halfes of the bounding box (using triangle fans)
+		for(int half = 0; half < 2; half ++)
+		{
+			static Matrix4 xform[256];
+			//TODO: this should be full bounding box
+			SolidHalfBoundingBox *halfbox = getSolidHalfBoundingBox(half);
+			halfbox->setupBoundingBox(*box);
+			
+			/*mRenderSystem->_setWorldMatrix(Matrix4::IDENTITY);
+
+			halfbox->getWorldTransforms(xform);
+
+			int numMatrices = halfbox->getNumWorldTransforms();
+			if (numMatrices > 1)
+			{
+				mRenderSystem->_setWorldMatrices(xform, numMatrices);
+			}
+			else
+			{
+				mRenderSystem->_setWorldMatrix(*xform);
+			}
+			mRenderSystem->setClipPlanes(halfbox->getClipPlanes());
+
+			static RenderOperation ro;
+
+			mSceneManager->useRenderableViewProjMode(halfbox);
+			halfbox->getRenderOperation(ro);
+			ro.srcRenderable = halfbox; 
+			mRenderSystem->_render(ro);*/
+			
+			mSceneManager->myrenderSingleObject(getSolidHalfBoundingBox(half), 
+				getSolidHalfBoundingBox(half)->getTechnique()->getPass(0), true);
+		}
+	}
+	//-----------------------------------------------------------------------
+	SolidHalfBoundingBox *SceneTraverser::getSolidHalfBoundingBox( int half )
+	{
+		if(!mHalfBoundingBox[half])
+			mHalfBoundingBox[half] = new SolidHalfBoundingBox(half == 1);
+
+		return mHalfBoundingBox[half];	
+	}
+	//-----------------------------------------------------------------------
+	void OcclusionCullingSceneTraverser::setNumSceneNodes(int num)
+	{
+		mNumSceneNodes = num;
+	}
+	//-----------------------------------------------------------------------
+	void SceneTraverser::setSceneRoot(SceneNode *root)
+	{
+		mSceneRoot = root;
+	}
+	//-----------------------------------------------------------------------
+	void SceneTraverser::initDistanceQueue(Camera *cam)
+	{
+		mDistanceQueue = new PriorityQueue(myless<SceneNode *>(cam));
+		mDistanceQueue->push(mSceneRoot);
+	}
+	//-----------------------------------------------------------------------
+	HardwareOcclusionQuery *SceneTraverser::getNextOcclusionQuery(void)
+	{
+		if(mCurrentTestIdx == mOcclusionQueries.size())
+		{
+			mOcclusionQueries.push_back(mRenderSystem->createHardwareOcclusionQuery());
+		}
+		
+		return mOcclusionQueries[mCurrentTestIdx ++];
+	}
+	//-----------------------------------------------------------------------
+	bool OcclusionCullingSceneTraverser::setOption( const String & key, const void * val )
+	{
+		if ( key == "Algorithm" )
+		{
+			mCurrentAlgorithm = * static_cast < const int * > ( val );
+			return true;
+		}
+		if ( key == "Threshold" )
+		{
+			mVisibilityThreshold = * static_cast < const int * > ( val );
+			return true;
+		}
+
+		return false;
+	}
+	//-----------------------------------------------------------------------
+	bool SceneTraverser::getOption( const String & key, void *val )
+	{
+		if ( key == "Algorithm" )
+		{
+			* static_cast < int * > ( val ) = mCurrentAlgorithm;
+			return true;
+		}
+		if ( key == "Threshold" )
+		{
+			* static_cast < unsigned int * > ( val ) = mVisibilityThreshold;
+			return true;
+		}
+		if ( key == "NumSceneNodes" )
+		{
+			* static_cast < unsigned int * > ( val ) = mNumSceneNodes;
+			return true;
+		}
+		if ( key == "NumTraversedNodes" )
+		{
+			* static_cast < unsigned int * > ( val ) = mNumTraversedNodes;
+			return true;
+		}
+		if ( key == "NumQueryCulledNodes" )
+		{
+			* static_cast < unsigned int * > ( val ) = mNumQueryCulledNodes;
+			return true;
+		}
+		if ( key == "NumFrustumCulledNodes" )
+		{
+			* static_cast < unsigned int * > ( val ) = mNumFrustumCulledNodes;
+			return true;
+		}
+		if ( key == "NumRenderedNodes" )
+		{
+			* static_cast < unsigned int * > ( val ) = mNumRenderedNodes;
+			return true;
+		}
+		return false;
+	}
+	//-----------------------------------------------------------------------
+	bool SceneTraverser::getOptionKeys( StringVector & refKeys )
+	{
+		refKeys.push_back( "Algorithm" );
+		refKeys.push_back( "Threshold" );
+		refKeys.push_back( "NumSceneNodes" );
+		refKeys.push_back( "NumTraversedNodes" );
+		refKeys.push_back( "NumQueryCulledNodes" );
+		refKeys.push_back( "NumFrustumCulledNodes" );
+		refKeys.push_back( "mNumRenderedGeometry" );
+
+		return true;
+	}
+}	
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingResourceManager.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingResourceManager.cpp	(revision 12)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/src/OgreOcclusionCullingResourceManager.cpp	(revision 12)
@@ -0,0 +1,72 @@
+/*
+-----------------------------------------------------------------------------
+This source file is part of OGRE
+    (Object-oriented Graphics Rendering Engine)
+For the latest info, see http://www.ogre3d.org/
+
+Copyright © 2000-2002 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.
+-----------------------------------------------------------------------------
+*/
+#include "OgreOcclusionCullingResourceManager.h"
+
+
+namespace Ogre {
+
+    //-----------------------------------------------------------------------
+    template<> OcclusionCullingResourceManager* Singleton<OcclusionCullingResourceManager>::ms_Singleton = 0;
+    OcclusionCullingResourceManager* OcclusionCullingResourceManager::getSingletonPtr(void)
+    {
+        return ms_Singleton;
+    }
+    OcclusionCullingResourceManager& OcclusionCullingResourceManager::getSingleton(void)
+    {  
+        assert( ms_Singleton );  return ( *ms_Singleton );  
+    }
+    //-----------------------------------------------------------------------
+
+    //-----------------------------------------------------------------------
+    OcclusionCullingResourceManager::OcclusionCullingResourceManager()
+    {
+        // Also create related shader manager (singleton managed)
+       // mShaderMgr = new Quake3ShaderManager();
+    }
+    //-----------------------------------------------------------------------
+    OcclusionCullingResourceManager::~OcclusionCullingResourceManager()
+    {
+        //delete mShaderMgr;
+    }
+    //-----------------------------------------------------------------------
+  /*  BspLevel* OcclusionCullingResourceManager::load( const String& filename, int priority)
+    {
+        // Only 1 BSP level allowed loaded at once
+        unloadAndDestroyAll();
+
+        BspLevel* pBsp = (BspLevel*)create(filename);
+        ResourceManager::load(pBsp, priority);
+        return pBsp;
+
+    }*/
+    //-----------------------------------------------------------------------
+    /*Resource* OcclusionCullingResourceManager::create( const String& name)
+    {
+        return new BspLevel(name);
+
+    }*/
+
+
+}
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/Makefile.am
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/Makefile.am	(revision 12)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/Makefile.am	(revision 12)
@@ -0,0 +1,1 @@
+SUBDIRS = src include
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/misc/OgreOcclusionCullingSceneManager.def
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/misc/OgreOcclusionCullingSceneManager.def	(revision 12)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/misc/OgreOcclusionCullingSceneManager.def	(revision 12)
@@ -0,0 +1,4 @@
+LIBRARY Plugin_OcclusionCullingSceneManager
+EXPORTS	
+	dllStartPlugin
+	dllStopPlugin
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/misc/todo_occlusionculling.txt
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/misc/todo_occlusionculling.txt	(revision 59)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/misc/todo_occlusionculling.txt	(revision 59)
@@ -0,0 +1,30 @@
+1) write into ogre forum
+2) mode_render does not do any change
+3) scenenode::_rendervisibleobjects already uses frustum culling
+4) implement for bsp trees
+5) improve mouse control (strave)
+6) cull camera for testing
+7) error when near plane crosses bounding volume
+8) bounding box should be not two parts
+9) implement z-buffer pass
+10) nice scene for dotscenemanager + terrainscenemanager
+11) ask about ogre changes
+12) preprocess: do not always destroy occlusion queries
+13) prevent multiple rendering of objects, scene nodes and hierarchy nodes
+14) learn to create terrains (heightmaps)
+15) work with maya
+16) occlusion culling + transparent materials, shadows!!
+17) minimize code for new scenemanager (macros?)
+18) make more flexible: callbacks
+19) find out how rotations happen
+20) investigate time coherence options (i.e., query only every nth frame
+21) möllers acceleration for frustum culling
+22) update so less code has to be replicated in terrainscenetraverser
+23) implement frustum test where intersect by near plane is considered
+24) tell ogre-people about changes
+25) check glfinish error
+26) also disable frustum culling on mouse click
+27) better comments
+28) setrendermode: change!!!
+29) problems with coherent & geometry not in leave
+30) split up into occlusioncullingscenemanager + visibilitymodule projects
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCulling.vcproj
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCulling.vcproj	(revision 45)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCulling.vcproj	(revision 45)
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="TestCulling"
+	ProjectGUID="{248F19A6-2FE0-4F5D-8928-E0EA10609887}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\bin\$(ConfigurationName)"
+			IntermediateDirectory="..\obj\$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(OGRE_PATH)\Dependencies\include&quot;;&quot;$(OGRE_PATH)\OgreMain\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include\CEGUI&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\include&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\include&quot;;../include"
+				PreprocessorDefinitions="_WINDOWS;_STLP_USE_DYNAMIC_LIB;OGRE_LIBRARY_IMPORTS;_DEBUG;WIN32;_STLP_DEBUG;PLUGIN_TERRAIN_IMPORTS"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="Plugin_OctreeSceneManager.lib OGREMain_d.LIB CEGUIBase_d.lib OgreGUIRenderer_d.lib Plugin_DotSceneManager.lib"
+				OutputFile="$(OGRE_PATH)/Samples/Common/bin/Debug/TestCulling.exe"
+				LinkIncremental="2"
+				AdditionalLibraryDirectories="&quot;$(OGRE_PATH)\Dependencies\Lib\Debug&quot;;&quot;$(OGRE_ADDONS_PATH)\dotsceneoctree\PlugIns\DotSceneManager\bin\debug&quot;;&quot;$(OGRE_PATH)\OgreMain\Lib\Debug&quot;;&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\bin\debug&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\lib&quot;"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/TestCulling.pdb"
+				SubSystem="2"
+				ImportLibrary=""
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\..\Samples\Common\Include, ..\..\..\OgreMain\include"
+				PreprocessorDefinitions="_WINDOWS,_STLP_USE_DYNAMIC_LIB,OGRE_LIBRARY_IMPORTS,_RELEASE,WIN32,_STLP_RELEASE"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="OGREMain.LIB"
+				OutputFile="..\..\..\Samples\Common\Bin\Release\TestCulling.exe"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="..\..\..\OgreMain\Lib\Release"
+				GenerateDebugInformation="TRUE"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath=".\TestCullingApplication.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath=".\TestCullingApplication.h">
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.cpp	(revision 52)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.cpp	(revision 52)
@@ -0,0 +1,350 @@
+/**
+    \file 
+        TestCullingApplication.cpp
+    \brief
+        Tests the occlusion culling algorithm
+*/
+
+#include <OgreNoMemoryMacros.h>
+#include <CEGUI/CEGUI.h>
+#include <../CEGUIRenderer/include/OgreCEGUIRenderer.h>
+#include <../CEGUIRenderer/include/OgreCEGUIResourceProvider.h>
+#include <../CEGUIRenderer/include/OgreCEGUITexture.h>
+#include <OgreMemoryMacros.h>
+
+#include "Ogre.h"
+#include "TestCullingApplication.h"
+#include "OgreOcclusionCullingSceneTraverser.h"
+
+#define WIN32_LEAN_AND_MEAN
+#include "windows.h"
+
+
+/***********************************************/
+/* TestCullingApplication implementation       */
+/***********************************************/
+TestCullingApplication::~TestCullingApplication()
+{
+}
+//-----------------------------------------------------------------------
+/*void TestCullingApplication::createCamera( void )
+{
+	// Create the camera
+	mCamera = mSceneMgr->createCamera("PlayerCam");
+
+	// Position it at 500 in Z direction
+	mCamera->setPosition(Vector3(128,25,128));
+
+	// Look back along -Z
+    mCamera->lookAt(Vector3(0,0,-300));
+    mCamera->setNearClipDistance( 1 );
+    mCamera->setFarClipDistance( 1000 );
+}*/
+//-----------------------------------------------------------------------
+void TestCullingApplication::createScene(void)
+{
+	// Set ambient light
+	mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
+	
+	// Create a light
+	Light* l = mSceneMgr->createLight("MainLight");
+	//l->setPosition(20,80,50);
+
+	mMinTranslation = Vector3(-70.0f, -70.0f, 0.0f);
+	mMaxTranslation = Vector3(70.0f, 70.0f, 600.0f);
+
+	mMinAngle = Vector3(0, 0, 0);
+	mMaxAngle = Vector3(360, 360, 360);
+
+	generateScene(330);
+
+	// Create a skybox
+    //mSceneMgr->setSkyBox(true, "Examples/CloudyNoonSkyBox", 1000, false);
+    ColourValue fadeColour(0.1, 0.1, 0.6);
+	mWindow->getViewport(0)->setBackgroundColour(fadeColour);
+
+	// CEGUI setup
+	setupGui();
+}
+//-----------------------------------------------------------------------
+void TestCullingApplication::setupGui( void )
+{
+	 mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, ST_EXTERIOR_CLOSE);
+     mGUISystem = new CEGUI::System(mGUIRenderer);
+
+	 // Mouse
+     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
+     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
+	 mGUISystem->setDefaultMouseCursor(
+                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
+
+	 CEGUI::MouseCursor::getSingleton().show( );
+}
+//-----------------------------------------------------------------------
+void TestCullingApplication::createFrameListener(void)
+{
+	mFrameListener= new MouseQueryListener(mWindow, mCamera, mSceneMgr, mGUIRenderer);
+	mFrameListener->showDebugOverlay(true);
+	mRoot->addFrameListener(mFrameListener);
+}
+//-----------------------------------------------------------------------
+void TestCullingApplication::chooseSceneManager(void)
+{
+    mSceneMgr = mRoot->getSceneManager(ST_GENERIC);
+}
+//-----------------------------------------------------------------------
+void TestCullingApplication::generateSceneObject(const Vector3 &translationRatio, 
+												 const Vector3 &rotationRatio, const int idx, const String& entName)
+{
+	Vector3 rotation = mMinAngle + rotationRatio * (mMaxAngle - mMinAngle);
+	Vector3 translation = mMinTranslation + translationRatio * (mMaxTranslation - mMinTranslation);
+
+	char name[16];
+    sprintf( name, "object%d", idx );
+
+    Entity *ent = mSceneMgr->createEntity( name, entName );
+	SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode( String(name) + "Node", translation);
+	node->attachObject(ent);
+	node->scale(0.1,0.1,0.1);
+
+	node->yaw(Degree(rotation.x));
+    node->pitch(Degree(rotation.y));
+	node->roll(Degree(rotation.z));
+}
+//-----------------------------------------------------------------------
+void TestCullingApplication::generateScene( int numObjects )
+{
+	srand (time (0));
+	
+	Vector3 rotationRatio;
+	Vector3 translationRatio;
+
+	for(int i=0; i < numObjects; i++)
+	{
+		rotationRatio.x = rand() / (float) RAND_MAX;
+		rotationRatio.y = rand() / (float) RAND_MAX;
+		rotationRatio.z = rand() / (float) RAND_MAX;
+
+		translationRatio.x = rand() / (float) RAND_MAX;
+		translationRatio.y = rand() / (float) RAND_MAX;
+		translationRatio.z = rand() / (float) RAND_MAX;
+
+		generateSceneObject(translationRatio, rotationRatio, i, "sphere.mesh");
+	}
+}
+/***********************************************/
+/* MouseQueryListener implementation           */
+/***********************************************/
+//-----------------------------------------------------------------------
+MouseQueryListener::MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer)
+        : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer), 
+		mShutdownRequested(false)
+{
+
+	// Setup default variables
+	//mOgreHead = NULL;
+	mLMouseDown = false;
+	mRMouseDown = false;
+	mSceneMgr = sceneManager;
+
+    // Reduce move speed
+	mMoveSpeed = 50;
+	mRotateSpeed *= 2;
+
+	mCurrentAlgorithm = OcclusionCullingSceneTraverser::RENDER_COHERENT;
+	mThreshold = 0;
+    
+	// Register this so that we get mouse events.
+	mEventProcessor->addMouseListener(this);
+	mEventProcessor->addMouseMotionListener(this);
+	mEventProcessor->addKeyListener(this);
+
+	// show overlay
+	Overlay* pOver = OverlayManager::getSingleton().getByName("Example/OcclusionCullingDemoOverlay"); 
+
+	mAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/AlgorithmInfo");
+	mThresholdInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/ThresholdInfo");
+	mFrustumCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/FrustumCulledNodesInfo");
+	mQueryCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/QueryCulledNodesInfo");
+    mTraversedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/TraversedNodesInfo");
+	mSceneNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/SceneNodesInfo");
+	mHierarchyNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/HierarchyNodesInfo");
+	mRenderedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/RenderedNodesInfo");
+
+	mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
+	mThresholdInfo->setCaption(": 0");
+	mFrustumCulledNodesInfo->setCaption(": 0");
+	mQueryCulledNodesInfo->setCaption(": 0");
+	mTraversedNodesInfo->setCaption(": 0");
+	mSceneNodesInfo->setCaption(": 0");
+	mHierarchyNodesInfo->setCaption(": 0");
+	mRenderedNodesInfo->setCaption(": 0");
+
+    pOver->show();
+} 
+//-----------------------------------------------------------------------
+MouseQueryListener::~MouseQueryListener( )
+{
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::mouseMoved (MouseEvent *e)
+{
+	// Update CEGUI with the mouse motion
+    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() * mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::mousePressed(MouseEvent* e)
+{
+     // Left mouse button down
+     if (e->getButtonID() & InputEvent::BUTTON0_MASK)
+     {
+		mLMouseDown = true; 
+     }
+     // Right mouse button down
+     else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
+     {
+         CEGUI::MouseCursor::getSingleton().hide( );
+         mRMouseDown = true;
+     } // else if
+} // mousePressed
+
+ //-----------------------------------------------------------------------
+void MouseQueryListener::mouseReleased(MouseEvent* e)
+{
+    // Left mouse button up
+    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
+    {
+		CEGUI::MouseCursor::getSingleton().show( );
+        mLMouseDown = false;
+    }
+    // Right mouse button up
+    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
+    {
+        CEGUI::MouseCursor::getSingleton().show( );
+        mRMouseDown = false;
+    }
+} 
+//-----------------------------------------------------------------------
+void MouseQueryListener::mouseDragged (MouseEvent *e)
+ {
+	 // If we are dragging the left mouse button.	 	 
+	 if ( mLMouseDown )
+     {
+		
+     }
+	 // If we are dragging the right mouse button.
+	 if ( mRMouseDown )
+	 {
+		 mCamera->yaw( -e->getRelX() * mRotateSpeed );
+		 mCamera->pitch( -e->getRelY() * mRotateSpeed );
+	 }
+}
+//-----------------------------------------------------------------------
+bool MouseQueryListener::frameStarted(const FrameEvent &evt)
+{	 
+	return ExampleFrameListener::frameStarted(evt);
+}
+//-----------------------------------------------------------------------
+bool MouseQueryListener::frameEnded(const FrameEvent& evt)
+{
+	if (mShutdownRequested)
+		return false;
+
+    if (timeDelay >= 0) 
+        timeDelay -= evt.timeSinceLastFrame;
+
+    KEY_PRESSED(KC_SPACE, 0.3, changeAlgorithm());
+
+	KEY_PRESSED(KC_SUBTRACT, 0, changeThreshold(-10));
+	KEY_PRESSED(KC_ADD, 0, changeThreshold(10));
+	//KEY_PRESSED(KC_T, 1, change);
+      
+	changeStats();
+
+    return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);        
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeThreshold(int incr)
+{
+	mThreshold += incr; if(mThreshold < 0) mThreshold = 0;
+	
+	char str[100]; sprintf(str,": %d", mThreshold);
+
+	mSceneMgr->setOption("Threshold", &mThreshold); 
+	mThresholdInfo->setCaption(str);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeAlgorithm()
+{
+    mCurrentAlgorithm = ++mCurrentAlgorithm % OcclusionCullingSceneTraverser::NUM_RENDERMODES;
+
+	mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
+	mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::changeStats()
+{
+	unsigned int opt = 0;
+	char str[100];
+	
+	mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt); 
+	mFrustumCulledNodesInfo->setCaption(str);
+	
+	mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt); 
+	mQueryCulledNodesInfo->setCaption(str);
+	
+	mSceneMgr->getOption("NumTraversedNodes", &opt); sprintf(str,": %d", opt); 
+	mTraversedNodesInfo->setCaption(str);
+
+	mSceneMgr->getOption("NumSceneNodes", &opt); sprintf(str,": %d", opt); 
+	mSceneNodesInfo->setCaption(str);
+
+	mSceneMgr->getOption("NumOctreeNodes", &opt); sprintf(str,": %d", opt); 
+	mHierarchyNodesInfo->setCaption(str);
+
+	mSceneMgr->getOption("NumRenderedNodes", &opt); sprintf(str,": %d", opt); 
+	mRenderedNodesInfo->setCaption(str);
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyPressed(KeyEvent* e)
+{
+	if(e->getKey() == KC_ESCAPE)
+    {
+		mShutdownRequested = true;
+		e->consume();
+		return;
+	}
+
+	CEGUI::System::getSingleton().injectKeyDown(e->getKey());
+	CEGUI::System::getSingleton().injectChar(e->getKeyChar());
+	e->consume();
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyReleased(KeyEvent* e)
+{
+	CEGUI::System::getSingleton().injectKeyUp(e->getKey());
+	e->consume();
+}
+//-----------------------------------------------------------------------
+void MouseQueryListener::keyClicked(KeyEvent* e) 
+{
+	// Do nothing
+	e->consume();
+}
+//-----------------------------------------------------------------------
+INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
+{
+    // Create application object
+    TestCullingApplication app;
+
+	try 
+	{
+        app.go();
+    } 
+	catch( Ogre::Exception& e ) 
+	{
+        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
+    }	
+
+    return 0;
+}
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.dsp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.dsp	(revision 15)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.dsp	(revision 15)
@@ -0,0 +1,109 @@
+# Microsoft Developer Studio Project File - Name="Demo_TestCullingApplication" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=Demo_TestCullingApplication - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "TestCullingApplication.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "TestCullingApplication.mak" CFG="Demo_TestCullingApplication - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "Demo_TestCullingApplication - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "Demo_TestCullingApplication - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "Demo_TestCullingApplication - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "..\bin\Release"
+# PROP BASE Intermediate_Dir "..\obj\Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\bin\Release"
+# PROP Intermediate_Dir "..\obj\Release"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /Zi /Od /I "." /I "$(OGRE_PATH)\OgreMain\include" /I "$(OGRE_PATH)\Samples/Common/include" /D "NDEBUG" /D "_MBCS" /D "_WINDOWS" /D "WIN32" /YX /FD /Zm1000 /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OgreMain.lib /nologo /subsystem:windows /machine:I386 /out:"$(OGRE_PATH)\Samples\Common\Bin\Release\Demo_TestCullingApplication.exe" /libpath:"$(OGRE_PATH)\OgreMain\lib\release" 
+# SUBTRACT LINK32 /profile /debug
+
+!ELSEIF  "$(CFG)" == "Demo_TestCullingApplication - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "..\bin\Debug"
+# PROP BASE Intermediate_Dir "..\obj\Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "..\bin\Debug"
+# PROP Intermediate_Dir "..\obj\Debug"
+# PROP Ignore_Export_Lib 1
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "$(OGRE_PATH)\OgreMain\include" /I "$(OGRE_PATH)\Samples/Common/include" /D "_MBCS" /D "_WINDOWS" /D "_DEBUG" /D "WIN32" /FD /GZ /Zm1000 /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OgreMain_d.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"LIBCMT" /out:"$(OGRE_PATH)\Samples\Common\Bin\Debug\Demo_TestCullingApplication.exe" /pdbtype:sept /libpath:"$(OGRE_PATH)\OgreMain\lib\debug" 
+# SUBTRACT LINK32 /verbose
+
+!ENDIF 
+
+# Begin Target
+
+# Name "Demo_TestCullingApplication - Win32 Release"
+# Name "Demo_TestCullingApplication - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=TestCullingApplication.cpp
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TerrainContentGenerator.cpp
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TerrainContentGenerator.cpp	(revision 44)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TerrainContentGenerator.cpp	(revision 44)
@@ -0,0 +1,14 @@
+/**
+    \file 
+        TerrainContentGenerator.cpp
+    \brief
+        Creates content for the terrain,
+*/
+
+#include "TerrainContentGenerator.h"
+
+//-----------------------------------------------------------------------
+TerrainContentGenerator::TerrainContentGenerator( void )
+{
+}
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.h	(revision 55)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.h	(revision 55)
@@ -0,0 +1,124 @@
+/**
+    \file 
+        TestCullingApplication.h
+*/
+#include "CEGUIForwardRefs.h"
+#include "ExampleApplication.h"
+#include "OgreOcclusionCullingSceneTraverser.h"
+
+
+Real timeDelay = 0;
+#define KEY_PRESSED(_key,_timeDelay, _macro) \
+{ \
+    if (mInputDevice->isKeyDown(_key) && timeDelay <= 0) \
+{ \
+    timeDelay = _timeDelay; \
+    _macro ; \
+} \
+}
+
+String mCurrentAlgorithmCaptions[OcclusionCullingSceneTraverser::NUM_RENDERMODES] = 
+{
+    "Cull Frustum", 
+	"Stop and Wait", 
+	"Coherent Occlusion Culling"
+};
+
+class MouseQueryListener : public ExampleFrameListener, public MouseListener, public MouseMotionListener
+{
+public:
+
+    MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, 
+			CEGUI::Renderer *renderer);
+
+
+    ~MouseQueryListener( );
+
+	bool frameStarted(const FrameEvent& evt);
+	bool frameEnded(const FrameEvent& evt);
+
+    /* MouseListener callbacks. */
+    virtual void mouseClicked(MouseEvent* e) { }
+    virtual void mouseEntered(MouseEvent* e) { }
+    virtual void mouseExited(MouseEvent* e)  { }
+
+    // This is when the mouse button goes DOWN.
+    virtual void mousePressed(MouseEvent* e);
+
+    // This is when the mouse button is let UP.
+    virtual void mouseReleased(MouseEvent* e);
+
+    /* MouseMotionListener callbacks */
+    virtual void mouseMoved (MouseEvent *e);
+   
+    // This is when the mouse is clicked, held and dragged.
+    virtual void mouseDragged (MouseEvent *e);
+
+    void keyPressed(KeyEvent* e);
+
+	void keyReleased(KeyEvent* e);
+	void keyClicked(KeyEvent* e);
+
+	void changeAlgorithm();
+	void changeThreshold(int incr);
+	void changeStats();
+
+protected:
+    bool mLMouseDown, mRMouseDown;     // True if the mouse buttons are down
+    SceneManager *mSceneMgr;           // A pointer to the scene manager
+    
+	CEGUI::Renderer *mGUIRenderer;     // cegui renderer
+	
+	bool mShutdownRequested;
+	int mCurrentAlgorithm;
+	int mThreshold;
+
+	OverlayElement *mAlgorithmInfo;
+	OverlayElement *mThresholdInfo;
+	OverlayElement *mFrustumCulledNodesInfo;
+	OverlayElement *mQueryCulledNodesInfo;
+    OverlayElement *mTraversedNodesInfo;
+	OverlayElement *mHierarchyNodesInfo;
+	OverlayElement *mSceneNodesInfo;
+	OverlayElement *mRenderedNodesInfo;
+};
+
+
+class TestCullingApplication : public ExampleApplication
+{
+public:
+	//~TestCullingApplication();
+
+protected:
+	void createScene(void);
+	void createFrameListener(void);
+	void setupGui(void);
+	/** generates a the scene hierarchy with random values 
+	@param number of objects to generate
+	*/
+	void generateScene(int numObjects);
+
+	/** generates a new scene object 
+	@param tranlationRatio ratio between minimal and maximal possible translation
+	@param rotationRatio ratio between minimal and maximal possible rotation
+	@idx the index of the new object
+	@entName the name of the object entity
+	*/
+	void generateSceneObject(const Vector3 &translationRatio, const Vector3 &rotationRatio, 
+							 const int idx, const String &entName);
+
+	//virtual void createCamera(void);
+
+	CEGUI::OgreCEGUIRenderer *mGUIRenderer;
+	CEGUI::System *mGUISystem;
+
+	Vector3 mMinTranslation;
+	Vector3 mMaxTranslation;
+
+	Vector3 mMinAngle;
+	Vector3 mMaxAngle;
+
+private:
+	void chooseSceneManager(void);
+};
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TerrainContentGenerator.h
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TerrainContentGenerator.h	(revision 44)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TerrainContentGenerator.h	(revision 44)
@@ -0,0 +1,14 @@
+/**
+    \file 
+        TerrainContentGenerator.h
+*/
+
+class TerrainContentGenerator
+{
+public:
+	TerrainContentGenerator();
+
+protected:
+
+};
+
Index: /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.dsw
===================================================================
--- /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.dsw	(revision 15)
+++ /tags/DummyModules/VUT/obsolete/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.dsw	(revision 15)
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "Demo_TestCulling"=.\TestCullingApplication.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
