//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $Revision: $ // $NoKeywords: $ // // The BSP tree leaf data system // //=============================================================================// #include "tier0/platform.h" #if !defined(BSPTREEDATA) #define BSPTREEDATA #ifdef _WIN32 #pragma once #endif //----------------------------------------------------------------------------- // Forward declarations //----------------------------------------------------------------------------- class Vector; struct Ray_t; //----------------------------------------------------------------------------- // Handle to an renderable in the client leaf system //----------------------------------------------------------------------------- typedef unsigned short BSPTreeDataHandle_t; enum { TREEDATA_INVALID_HANDLE = (BSPTreeDataHandle_t)~0 }; //----------------------------------------------------------------------------- // Interface needed by tree data to do its job // // Note that anything that has convex spatial regions with leaves identified // by indices can implement the ISpatialQuery. All you have to do is to // implement a class that can answer the 5 questions in the Query interface // about the spatial subdivision. For example, a K-D tree or a BSP tree could // implement this interface // //----------------------------------------------------------------------------- abstract_class ISpatialLeafEnumerator { public: // call back with a leaf and a context // The context is completely user defined; it's passed into the enumeration // function of ISpatialQuery. // This gets called by the enumeration methods with each leaf // that passes the test; return true to continue enumerating, // false to stop virtual bool EnumerateLeaf(int leaf, int context) = 0; }; abstract_class ISpatialQuery { public: // Returns the number of leaves virtual int LeafCount() const = 0; // Enumerates the leaves along a ray, box, etc. virtual bool EnumerateLeavesAtPoint( Vector const& pt, ISpatialLeafEnumerator* pEnum, int context) = 0; virtual bool EnumerateLeavesInBox(Vector const& mins, Vector const& maxs, ISpatialLeafEnumerator* pEnum, int context) = 0; virtual bool EnumerateLeavesInSphere(Vector const& center, float radius, ISpatialLeafEnumerator* pEnum, int context) = 0; virtual bool EnumerateLeavesAlongRay( Ray_t const& ray, ISpatialLeafEnumerator* pEnum, int context) = 0; }; //----------------------------------------------------------------------------- // Data associated with leaves. // // This is a parasitic class that attaches data to the leaves specified by the // ISpatialQuery sent in to the initialization function. It can't exist without // a spatial partition of some sort to hold onto. //----------------------------------------------------------------------------- abstract_class IBSPTreeDataEnumerator { public: // call back with a userId and a context virtual bool FASTCALL EnumerateElement(int userId, int context) = 0; }; abstract_class IBSPTreeData { public: // Add a virtual destructor so that the derived class destructors will // be called. virtual ~IBSPTreeData() {} // Initializes, shuts down virtual void Init(ISpatialQuery * pBSPTree) = 0; virtual void Shutdown() = 0; // Adds and removes data from the leaf lists virtual BSPTreeDataHandle_t Insert(int userId, Vector const& mins, Vector const& maxs) = 0; virtual void Remove(BSPTreeDataHandle_t handle) = 0; // Call this when a element moves virtual void ElementMoved(BSPTreeDataHandle_t handle, Vector const& mins, Vector const& maxs) = 0; // Enumerate elements in a particular leaf virtual bool EnumerateElementsInLeaf( int leaf, IBSPTreeDataEnumerator* pEnum, int context) = 0; // Is the element in any leaves at all? virtual bool IsElementInTree(BSPTreeDataHandle_t handle) const = 0; // NOTE: These methods call through to the functions in the attached // ISpatialQuery // For convenience, enumerates the leaves along a ray, box, etc. virtual bool EnumerateLeavesAtPoint( Vector const& pt, ISpatialLeafEnumerator* pEnum, int context) = 0; virtual bool EnumerateLeavesInBox(Vector const& mins, Vector const& maxs, ISpatialLeafEnumerator* pEnum, int context) = 0; virtual bool EnumerateLeavesInSphere(Vector const& center, float radius, ISpatialLeafEnumerator* pEnum, int context) = 0; virtual bool EnumerateLeavesAlongRay( Ray_t const& ray, ISpatialLeafEnumerator* pEnum, int context) = 0; }; //----------------------------------------------------------------------------- // Class factory //----------------------------------------------------------------------------- IBSPTreeData* CreateBSPTreeData(); void DestroyBSPTreeData(IBSPTreeData* pTreeData); #endif // BSPTREEDATA