1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
4 #include "CoverSurfaceManager.h"
5 #include "Objects/AICoverSurface.h"
7 const uint32 BAI_COVER_FILE_VERSION_WRITE
= 2;
9 CCoverSurfaceManager::CCoverSurfaceManager()
13 CCoverSurfaceManager::~CCoverSurfaceManager()
17 void CCoverSurfaceManager::ClearGameSurfaces()
19 gEnv
->pAISystem
->GetCoverSystem()->Clear();
21 SurfaceObjects::iterator it
= m_surfaceObjects
.begin();
22 SurfaceObjects::iterator end
= m_surfaceObjects
.end();
24 for (; it
!= end
; ++it
)
26 CAICoverSurface
* coverSurfaceObject
= *it
;
27 coverSurfaceObject
->SetSurfaceID(CoverSurfaceID(0));
31 // This also compresses CoverSurfaceIDs down to a sequential range
32 bool CCoverSurfaceManager::WriteToFile(const char* fileName
)
36 if (!file
.Open(fileName
, "wb"))
38 Warning("Could not save AI Cover Surfaces. [%s]", fileName
);
43 ICoverSystem
* coverSystem
= gEnv
->pAISystem
->GetCoverSystem();
45 uint32 fileVersion
= BAI_COVER_FILE_VERSION_WRITE
;
46 uint32 surfaceCount
= coverSystem
->GetSurfaceCount();
48 file
.Write(&fileVersion
, sizeof(fileVersion
));
49 file
.Write(&surfaceCount
, sizeof(surfaceCount
));
51 SurfaceObjects::iterator it
= m_surfaceObjects
.begin();
52 SurfaceObjects::iterator end
= m_surfaceObjects
.end();
55 // 1. Save all valid surfaces in sequence to the file
56 // 2. Assign a sequenced ID to all the CAICoverSurface objects
57 // Assign 0 to any invalid CAICoverSurface objects
58 // 3. Load the valid surfaces again in sequence
61 for (; it
!= end
; ++it
)
63 CAICoverSurface
* coverSurfaceObject
= *it
;
64 CoverSurfaceID surfaceID
= coverSurfaceObject
->GetSurfaceID();
65 coverSurfaceObject
->SetSurfaceID(CoverSurfaceID(0));
70 ICoverSystem::SurfaceInfo surfaceInfo
;
71 if (!coverSystem
->GetSurfaceInfo(surfaceID
, &surfaceInfo
))
74 file
.Write(&surfaceInfo
.sampleCount
, sizeof(surfaceInfo
.sampleCount
));
75 file
.Write(&surfaceInfo
.flags
, sizeof(surfaceInfo
.flags
));
77 for (uint i
= 0; i
< surfaceInfo
.sampleCount
; ++i
)
79 const ICoverSampler::Sample
& sample
= surfaceInfo
.samples
[i
];
81 file
.Write(&sample
.position
, sizeof(sample
.position
));
82 file
.Write(&sample
.height
, sizeof(sample
.height
));
83 file
.Write(&sample
.flags
, sizeof(sample
.flags
));
87 coverSurfaceObject
->SetSurfaceID(CoverSurfaceID(runningID
));
93 return coverSystem
->ReadSurfacesFromFile(fileName
);
96 bool CCoverSurfaceManager::ReadFromFile(const char* fileName
)
98 return gEnv
->pAISystem
->GetCoverSystem()->ReadSurfacesFromFile(fileName
);
101 void CCoverSurfaceManager::AddSurfaceObject(CAICoverSurface
* surface
)
103 m_surfaceObjects
.insert(surface
);
106 void CCoverSurfaceManager::RemoveSurfaceObject(CAICoverSurface
* surface
)
108 m_surfaceObjects
.erase(surface
);
111 const CCoverSurfaceManager::SurfaceObjects
& CCoverSurfaceManager::GetSurfaceObjects() const
113 return m_surfaceObjects
;