//////////////////////////////////////////////////////////////////////////// // // Crytek Engine Source File. // Copyright (C), Crytek Studios, 2001. // ------------------------------------------------------------------------- // File name: ObjectManager.h // Version: v1.00 // Created: 10/10/2001 by Timur. // Compilers: Visual C++ 6.0 // Description: ObjectManager definition. // ------------------------------------------------------------------------- // History: // //////////////////////////////////////////////////////////////////////////// #ifndef __ObjectManager_h__ #define __ObjectManager_h__ #if _MSC_VER > 1000 #pragma once #endif #include "IObjectManager.h" #include "BaseObject.h" #include "SelectionGroup.h" #include "ClassDesc.h" #include "ObjectLayer.h" #include "ObjectLayerManager.h" // forward declarations. class CGizmoManager; class CCameraObject; /*! * CObjectManager is a singleton object that * manages global set of objects in level. */ class CObjectManager : public IObjectManager { public: //! Selection functor callback. //! Callback function must return a boolean value. //! Return true if selection should proceed, or false to abort object selection. CObjectManager(); ~CObjectManager(); void RegisterObjectClasses(); CBaseObject* NewObject( CObjectClassDesc *cls,CBaseObject *prev=0,const CString &file="" ); CBaseObject* NewObject( const CString &typeName,CBaseObject *prev=0,const CString &file="" ); /** Creates and serialize object from xml node. @param objectNode Xml node to serialize object info from. @param pUndoObject Pointer to deleted object for undo. */ CBaseObject* NewObject( CObjectArchive &archive,CBaseObject *pUndoObject=0,bool bMakeNewId=false ); void DeleteObject( CBaseObject *obj ); void DeleteAllObjects(); CBaseObject* CloneObject( CBaseObject *obj ); void BeginEditParams( CBaseObject *obj,int flags ); void EndEditParams( int flags=0 ); //! Get number of objects manager by ObjectManager, (not contain sub objects of groups). int GetObjectCount() const; //! Get array of objects, managed by manager, (not contain sub objects of groups). //! @param layer if 0 get objects for all layers, or layer to get objects from. void GetObjects( CBaseObjectsArray &objects,CObjectLayer *layer=0 ); //! Get all camera sources in object manager void GetCameras( std::vector &objects ); //! Update objects. void Update(); //! Display objects on display context. void Display( DisplayContext &dc ); //! Check intersection with objects. //! Find intersection with nearest to ray origin object hit by ray. //! If distance tollerance is specified certain relaxation applied on collision test. //! @return true if hit any object, and fills hitInfo structure. bool HitTest( Vec3 &raySrc,Vec3 &rayDir,float distanceTollerance,ObjectHitInfo &hitInfo ); //! Send event to all objects. //! Will cause OnEvent handler to be called on all objects. void SendEvent( ObjectEvent event ); //! Send event to all objects within givven bounding box. //! Will cause OnEvent handler to be called on objects withing bounding box. void SendEvent( ObjectEvent event,const BBox &bounds ); ////////////////////////////////////////////////////////////////////////// //! Find object by ID. CBaseObject* FindObject( REFGUID guid ) const; ////////////////////////////////////////////////////////////////////////// //! Find object by name. CBaseObject* FindObject( const CString &sName ) const; ////////////////////////////////////////////////////////////////////////// //! Find BaseObject who is owner of specified animation node. CBaseObject* FindAnimNodeOwner( IAnimNode* node ) const; ////////////////////////////////////////////////////////////////////////// // Operations on objects. ////////////////////////////////////////////////////////////////////////// //! Makes object visible or invisible. void HideObject( CBaseObject *obj,bool hide ); //! Freeze object, making it unselectable. void FreezeObject( CBaseObject *obj,bool freeze ); //! Unhide all hidden objects. void UnhideAll(); //! Unfreeze all frozen objects. void UnfreezeAll(); ////////////////////////////////////////////////////////////////////////// // Object Selection. ////////////////////////////////////////////////////////////////////////// bool SelectObject( CBaseObject *obj ); void UnselectObject( CBaseObject *obj ); //! Select objects withing specified distance from givven position. //! Return number of selected objects. int SelectObjects( const BBox &box,bool bUnselect=false ); //! Selects/Unselects all objects within 2d rectangle in given viewport. void SelectObjectsInRect( CViewport *view,const CRect &rect,bool bSelect ); //! Clear default selection set. //! @Return number of objects removed from selection. int ClearSelection(); //! Deselect all current selected objects and selects object that were unselected. //! @Return number of selected objects. int InvertSelection(); //! Get current selection. CSelectionGroup* GetSelection() const { return m_currSelection; }; //! Get named selection. CSelectionGroup* GetSelection( const CString &name ) const; //! Change name of current selection group. //! And store it in list. void NameSelection( const CString &name ); //! Set one of name selections as current selection. void SetSelection( const CString &name ); void RemoveSelection( const CString &name ); //! Delete all objects in selection group. void DeleteSelection(); //! Generates uniq name base on type name of object. CString GenUniqObjectName( const CString &typeName ); //! Register object name in object manager, needed for generating uniq names. void RegisterObjectName( const CString &name ); //! Enable/Disable generating of unique object names (Enabled by default). //! Return previous value. bool EnableUniqObjectNames( bool bEnable ); //! Register XML template of runtime class. void RegisterClassTemplate( XmlNodeRef &templ ); //! Load class templates for specified directory, void LoadClassTemplates( const CString &path ); //! Find object class by name. CObjectClassDesc* FindClass( const CString &className ); void GetClassCategories( std::vector &categories ); void GetClassTypes( const CString &category,std::vector &types ); //! Export objects to xml. //! When onlyShared is true ony objects with shared flags exported, overwise only not shared object exported. void Export( const CString &levelPath,XmlNodeRef &rootNode,bool onlyShared ); //! Serialize Objects in manager to specified XML Node. //! @param flags Can be one of SerializeFlags. void Serialize( XmlNodeRef &rootNode,bool bLoading,int flags=SERIALIZE_ALL ); //! Load objects from object archive. //! @param bSelect if set newly loaded object will be selected. void LoadObjects( CObjectArchive &ar,bool bSelect ); //! Delete from Object manager all objects without SHARED flag. void DeleteNotSharedObjects(); //! Delete from Object manager all objects with SHARED flag. void DeleteSharedObjects(); bool AddObject( CBaseObject *obj ); void RemoveObject( CBaseObject *obj ); void ChangeObjectId( CBaseObject *obj,int newId ); void ChangeObjectName( CBaseObject *obj,const CString &newName ); //! Convert object of one type to object of another type. //! Original object is deleted. bool ConvertToType( CBaseObject *object,ObjectType objectType ); //! Set new selection callback. //! @return previous selection callback. IObjectSelectCallback* SetSelectCallback( IObjectSelectCallback* callback ); // Enables/Disables creating of game objects. void SetCreateGameObject( bool enable ) { m_createGameObjects = enable; }; //! Return true if objects loaded from xml should immidiatly create game objects associated with them. bool IsCreateGameObjects() const { return m_createGameObjects; }; //void ExportLayer( CObjectLayer *pLayer,CObjectArchive &ar ); //CObjectLayer* ImportLayer( CObjectArchive &ar ); ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //! Get access to gizmo manager. IGizmoManager* GetGizmoManager(); ////////////////////////////////////////////////////////////////////////// //! Get acess to object layers manager. CObjectLayerManager* GetLayersManager() const { return m_pLayerManager; } ////////////////////////////////////////////////////////////////////////// //! Invalidate visibily settings of objects. void InvalidateVisibleList(); ////////////////////////////////////////////////////////////////////////// // ObjectManager notification Callbacks. ////////////////////////////////////////////////////////////////////////// void AddObjectEventListener( const EventCallback &cb ); void RemoveObjectEventListener( const EventCallback &cb ); ////////////////////////////////////////////////////////////////////////// // Used to indicate starting and ending of objects loading. ////////////////////////////////////////////////////////////////////////// void StartObjectsLoading( int numObjects ); void EndObjectsLoading(); ////////////////////////////////////////////////////////////////////////// // Gathers all resources used by all objects. void GatherUsedResources( CUsedResources &resources ); private: //! Update visibility of all objects. void UpdateVisibilityList(); //! Get array of all objects in manager. void GetAllObjects( std::vector &objects ) const; void UnselectCurrent(); void SelectCurrent(); void SetObjectSelected( CBaseObject* pObject,bool bSelect ); void SaveRegistry(); void LoadRegistry(); void NotifyObjectListeners( CBaseObject *pObject,CBaseObject::EObjectListenerEvent event ); private: typedef std::map Objects; Objects m_objects; std::map m_selections; //! Array of currently visible objects. std::vector m_visibleObjects; bool m_bVisibleObjectValid; unsigned int m_lastHideMask; //! List of objects that was displayed at last frame. std::vector m_displayedObjects; ////////////////////////////////////////////////////////////////////////// // Selection. //! Current selection group. CSelectionGroup* m_currSelection; int m_nLastSelCount; bool m_bSelectionChanged; IObjectSelectCallback* m_selectCallback; //! Default selection. CSelectionGroup m_defaultSelection; CBaseObjectPtr m_currEditObject; bool m_bSingleSelection; bool m_createGameObjects; bool m_bGenUniqObjectNames; // Object manager also handles Gizmo manager. CGizmoManager* m_gizmoManager; friend CObjectLayerManager; //! Manager of object layers. CObjectLayerManager* m_pLayerManager; ////////////////////////////////////////////////////////////////////////// // Loading progress. CWaitProgress *m_pLoadProgress; int m_loadedObjects; int m_totalObjectsToLoad; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // Numbering for names. ////////////////////////////////////////////////////////////////////////// typedef std::map > NameNumbersMap; NameNumbersMap m_nameNumbersMap; ////////////////////////////////////////////////////////////////////////// // Listeners. std::list m_objectEventListeners; }; #endif // __ObjectManager_h__