Changeset View
Changeset View
Standalone View
Standalone View
source/graphics/ObjectManager.h
/* Copyright (C) 2009 Wildfire Games. | /* Copyright (C) 2021 Wildfire Games. | ||||
* This file is part of 0 A.D. | * This file is part of 0 A.D. | ||||
* | * | ||||
* 0 A.D. is free software: you can redistribute it and/or modify | * 0 A.D. is free software: you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by | ||||
* the Free Software Foundation, either version 2 of the License, or | * the Free Software Foundation, either version 2 of the License, or | ||||
* (at your option) any later version. | * (at your option) any later version. | ||||
* | * | ||||
* 0 A.D. is distributed in the hope that it will be useful, | * 0 A.D. is distributed in the hope that it will be useful, | ||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
* GNU General Public License for more details. | * GNU General Public License for more details. | ||||
* | * | ||||
* You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>. | * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>. | ||||
*/ | */ | ||||
#ifndef INCLUDED_OBJECTMANAGER | #ifndef INCLUDED_OBJECTMANAGER | ||||
#define INCLUDED_OBJECTMANAGER | #define INCLUDED_OBJECTMANAGER | ||||
#include <vector> | |||||
#include <map> | |||||
#include <set> | |||||
#include "ps/CStr.h" | #include "ps/CStr.h" | ||||
#include "lib/file/vfs/vfs_path.h" | #include "lib/file/vfs/vfs_path.h" | ||||
#include <set> | |||||
#include <map> | |||||
#include <unordered_map> | |||||
#include <vector> | |||||
class CActorDef; | |||||
class CMeshManager; | class CMeshManager; | ||||
class CObjectBase; | class CObjectBase; | ||||
class CObjectEntry; | class CObjectEntry; | ||||
class CSkeletonAnimManager; | class CSkeletonAnimManager; | ||||
class CSimulation2; | class CSimulation2; | ||||
class CTerrain; | class CTerrain; | ||||
/////////////////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////////////////// | ||||
// CObjectManager: manager class for all possible actor types | // CObjectManager: manager class for all possible actor types | ||||
class CObjectManager | class CObjectManager | ||||
{ | { | ||||
NONCOPYABLE(CObjectManager); | NONCOPYABLE(CObjectManager); | ||||
public: | public: | ||||
// Unique identifier of an actor variation | // Unique identifier of an actor variation | ||||
struct ObjectKey | struct ObjectKey | ||||
{ | { | ||||
ObjectKey(const CStrW& name, const std::vector<u8>& var) | ObjectKey(const CStrW& name, u8 qualityLevel, const std::vector<u8>& var) | ||||
: ActorName(name), ActorVariation(var) {} | : ActorName(name), QualityLevel(qualityLevel), ActorVariation(var) {} | ||||
bool operator< (const CObjectManager::ObjectKey& a) const; | bool operator< (const CObjectManager::ObjectKey& a) const; | ||||
private: | private: | ||||
CStrW ActorName; | CStrW ActorName; | ||||
u8 QualityLevel; | |||||
std::vector<u8> ActorVariation; | std::vector<u8> ActorVariation; | ||||
}; | }; | ||||
public: | public: | ||||
// constructor, destructor | // constructor, destructor | ||||
CObjectManager(CMeshManager& meshManager, CSkeletonAnimManager& skeletonAnimManager, CSimulation2& simulation); | CObjectManager(CMeshManager& meshManager, CSkeletonAnimManager& skeletonAnimManager, CSimulation2& simulation); | ||||
~CObjectManager(); | ~CObjectManager(); | ||||
// Provide access to the manager classes for meshes and animations - they're | // Provide access to the manager classes for meshes and animations - they're | ||||
// needed when objects are being created and so this seems like a convenient | // needed when objects are being created and so this seems like a convenient | ||||
// place to centralise access. | // place to centralise access. | ||||
CMeshManager& GetMeshManager() const { return m_MeshManager; } | CMeshManager& GetMeshManager() const { return m_MeshManager; } | ||||
CSkeletonAnimManager& GetSkeletonAnimManager() const { return m_SkeletonAnimManager; } | CSkeletonAnimManager& GetSkeletonAnimManager() const { return m_SkeletonAnimManager; } | ||||
void UnloadObjects(); | void UnloadObjects(); | ||||
CObjectEntry* FindObject(const CStrW& objname); | CActorDef* FindActorDef(const CStrW& actorName); | ||||
void DeleteObject(CObjectEntry* entry); | |||||
CObjectBase* FindObjectBase(const CStrW& objname); | /** | ||||
* Get the object entry for a given actor & the given selections list. | |||||
* @param selections - a possibly incomplete list of selections. | |||||
* @param seed - the randomness seed to use to complete the random selections. | |||||
*/ | |||||
CObjectEntry* FindObjectVariation(const CActorDef* actor, const std::vector<std::set<CStr>>& selections, uint32_t seed); | |||||
CObjectEntry* FindObjectVariation(const CStrW& objname, const std::vector<std::set<CStr> >& selections); | /** | ||||
CObjectEntry* FindObjectVariation(CObjectBase* base, const std::vector<std::set<CStr> >& selections); | * @see FindObjectVariation. | ||||
* These take a complete selection. These are pointers to sets that are | |||||
* guaranteed to exist (pointers are used to avoid copying the sets). | |||||
*/ | |||||
CObjectEntry* FindObjectVariation(const std::shared_ptr<CObjectBase>& base, const std::vector<const std::set<CStr>*>& completeSelections); | |||||
CObjectEntry* FindObjectVariation(const CStrW& objname, const std::vector<const std::set<CStr>*>& completeSelections); | |||||
/** | /** | ||||
* Get the terrain object that actors managed by this manager should be linked | * Get the terrain object that actors managed by this manager should be linked | ||||
* with (primarily for the purpose of decals) | * with (primarily for the purpose of decals) | ||||
*/ | */ | ||||
CTerrain* GetTerrain(); | CTerrain* GetTerrain(); | ||||
/** | /** | ||||
* Reload any scripts that were loaded from the given filename. | * Reload any scripts that were loaded from the given filename. | ||||
* (This is used to implement hotloading.) | * (This is used to implement hotloading.) | ||||
*/ | */ | ||||
Status ReloadChangedFile(const VfsPath& path); | Status ReloadChangedFile(const VfsPath& path); | ||||
private: | |||||
/** | |||||
* Reload actors that have a quality setting. Used when changing the actor quality. | |||||
*/ | |||||
void ActorQualityChanged(); | |||||
CMeshManager& m_MeshManager; | CMeshManager& m_MeshManager; | ||||
CSkeletonAnimManager& m_SkeletonAnimManager; | CSkeletonAnimManager& m_SkeletonAnimManager; | ||||
CSimulation2& m_Simulation; | CSimulation2& m_Simulation; | ||||
std::map<ObjectKey, CObjectEntry*> m_Objects; | u8 m_QualityLevel = 100; | ||||
std::map<CStrW, CObjectBase*> m_ObjectBases; | struct QualityHook; | ||||
std::unique_ptr<QualityHook> m_QualityHook; | |||||
// TODO: define a hash and switch to unordered_map | |||||
std::map<ObjectKey, std::unique_ptr<CObjectEntry>> m_Objects; | |||||
std::unordered_map<CStrW, std::unique_ptr<CActorDef>> m_ActorDefs; | |||||
}; | }; | ||||
#endif | #endif |
Wildfire Games · Phabricator