24#include <boost/filesystem/path.hpp>
25#include <G3D/Vector4.h>
32G3D::Vector3
translateLocation(G3D::Vector4
const* dbcLocation, G3D::Vector3
const* basePosition, G3D::Vector3
const* splineVector)
35 float x = basePosition->x + splineVector->x;
36 float y = basePosition->y + splineVector->y;
37 float z = basePosition->z + splineVector->z;
38 float const distance = sqrt((x * x) + (y * y));
39 float angle = std::atan2(x, y) - dbcLocation->w;
42 angle += 2 * float(
M_PI);
44 work.x = dbcLocation->x + (distance * sin(angle));
45 work.y = dbcLocation->y + (distance * cos(angle));
46 work.z = dbcLocation->z + z;
53 char const* buffer =
reinterpret_cast<char const*
>(header);
93 targetcam.push_back(thisCam);
128 if (targetcam.size() > 0)
135 lastTarget = targetcam[0];
136 nextTarget = targetcam[0];
137 for (
uint32 j = 0; j < targetcam.size(); ++j)
139 nextTarget = targetcam[j];
140 if (targetcam[j].timeStamp > posTimestamps[i])
143 lastTarget = targetcam[j];
150 if (lastTarget.
timeStamp != posTimestamps[i])
164 cameras.push_back(thisCam);
177 TC_LOG_INFO(
"server.loading",
">> Loading Cinematic Camera files");
179 boost::filesystem::path camerasPath = boost::filesystem::path(dataPath) /
"cameras";
184 boost::filesystem::path filename = camerasPath /
Trinity::StringFormat(
"FILE{:08X}.xxx", cameraEntry->FileDataID);
187 filename.make_preferred();
189 std::ifstream m2file(filename.string().c_str(), std::ios::in | std::ios::binary);
190 if (!m2file.is_open())
194 m2file.seekg(0, std::ios::end);
195 std::streamoff fileSize = m2file.tellg();
200 TC_LOG_ERROR(
"server.loading",
"Camera file {} is damaged. File is smaller than header size", filename.string());
206 m2file.seekg(0, std::ios::beg);
208 m2file.read(fileCheck, 4);
212 if (strcmp(fileCheck,
"MD21"))
214 TC_LOG_ERROR(
"server.loading",
"Camera file {} is damaged. File identifier not found.", filename.string());
220 std::vector<char> buffer(fileSize);
221 m2file.seekg(0, std::ios::beg);
222 if (!m2file.read(buffer.data(), fileSize))
229 bool fileValid =
true;
231 char const* ptr = buffer.data();
232 while (m2start + 4 < buffer.size() && memcmp(ptr,
"MD20", 4) != 0)
236 if (m2start +
sizeof(
M2Header) > buffer.size())
245 TC_LOG_ERROR(
"server.loading",
"Camera file {} is damaged. File is smaller than header size.", filename.string());
250 M2Header const* header =
reinterpret_cast<M2Header const*
>(buffer.data() + m2start);
254 TC_LOG_ERROR(
"server.loading",
"Camera file {} is damaged. Camera references position beyond file end", filename.string());
260 if (!
readCamera(cam, fileSize - m2start, header, cameraEntry))
261 TC_LOG_ERROR(
"server.loading",
"Camera file {} is damaged. Camera references position beyond file end", filename.string());
DB2Storage< CinematicCameraEntry > sCinematicCameraStore("CinematicCamera.db2", &CinematicCameraLoadInfo::Instance)
#define TC_LOG_ERROR(filterType__,...)
#define TC_LOG_INFO(filterType__,...)
std::vector< FlyByCamera > FlyByCameraCollection
std::unordered_map< uint32, FlyByCameraCollection > sFlyByCameraStore
G3D::Vector3 translateLocation(G3D::Vector4 const *dbcLocation, G3D::Vector3 const *basePosition, G3D::Vector3 const *splineVector)
bool readCamera(M2Camera const *cam, uint32 buffSize, M2Header const *header, CinematicCameraEntry const *dbcentry)
std::vector< FlyByCamera > const * GetFlyByCameras(uint32 cinematicCameraId)
TC_GAME_API void LoadM2Cameras(std::string const &dataPath)
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
G3D::Vector3 target_position_base
G3D::Vector3 position_base
constexpr void SetOrientation(float orientation)
constexpr float GetPositionX() const
constexpr float GetPositionY() const
constexpr void Relocate(float x, float y)