This commit is contained in:
romkazvo
2023-08-07 19:29:24 +08:00
commit 34d6c5d489
4832 changed files with 1389451 additions and 0 deletions

View File

@@ -0,0 +1,308 @@
////////////////////////////////////////////////////////////////////////////
//
// 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<CCameraObject*> &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<CString> &categories );
void GetClassTypes( const CString &category,std::vector<CString> &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<CBaseObjectPtr> &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<GUID,CBaseObjectPtr,guid_less_predicate> Objects;
Objects m_objects;
std::map<CString,CSelectionGroup*> m_selections;
//! Array of currently visible objects.
std::vector<CBaseObjectPtr> m_visibleObjects;
bool m_bVisibleObjectValid;
unsigned int m_lastHideMask;
//! List of objects that was displayed at last frame.
std::vector<CBaseObject*> 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<CString,int,stl::less_stricmp<CString> > NameNumbersMap;
NameNumbersMap m_nameNumbersMap;
//////////////////////////////////////////////////////////////////////////
// Listeners.
std::list<EventCallback> m_objectEventListeners;
};
#endif // __ObjectManager_h__