200 std::string modelFileName = cinematicCamera->
filename;
201 modelFileName = modelFileName.substr(modelFileName.find(
'\\') + 1);
202 modelFileName = modelFileName.substr(0, modelFileName.find(
"mdx"));
203 modelFileName +=
"m2";
204 modelFileName =
sWorld->GetDataPath() +
"cameras/" + modelFileName;
206 FILE* modelFile = fopen(modelFileName.c_str(),
"rb");
209 SF_LOG_INFO(
"server.loading",
"Cinematic camera '%s': does not exist!", modelFileName.c_str());
214 char* fileBuffer = 0;
218 fread(magicHeader, 1,
sizeof(magicHeader), modelFile);
220 if (0 != memcmp(magicHeader,
"MD20",
sizeof(magicHeader)))
222 SF_LOG_INFO(
"server.loading",
"Cinematic camera '%s': invalid magic header!", modelFileName.c_str());
227 fseek(modelFile, 0, SEEK_END);
228 fileSize = ftell(modelFile);
229 fseek(modelFile, 0, SEEK_SET);
232 fileBuffer = (
char*)malloc(fileSize);
233 fread(fileBuffer, 1, fileSize, modelFile);
243 SF_LOG_INFO(
"server.loading",
"Cinematic camera '%s': no cameras!", modelFileName.c_str());
248 float sourcePosition[3];
250 if (modelHeader->
Version[0] <= 9)
255 for (; camera != endCamera; ++camera)
257 if (camera->
Type != -1)
261 memcpy(sourcePosition, camera->
SourcePosition,
sizeof(sourcePosition));
271 for (; cameraV10 != endCameraV10; ++cameraV10)
273 if (cameraV10->
Type != -1)
277 memcpy(sourcePosition, cameraV10->
SourcePosition,
sizeof(sourcePosition));
283 if (!animationBlock ||
287 SF_LOG_INFO(
"server.loading",
"Cinematic camera '%s': no translations!", modelFileName.c_str());
297 size_t blockSize = 3 *
sizeof(float);
302 G3D::Matrix3 matrix = G3D::Matrix3::identity();
303 matrix = matrix.fromAxisAngle(G3D::Vector3(0, 0, 1), cinematicCamera->
GlobalRotation);
315 Pair* framePair = framePairs + i;
316 Pair* transPair = transPairs + i;
329 G3D::Vector3 result = matrix * pt;
387 if (!nextCinematicKeyFrame || cinematicKeyFrame->
Frame == time)
389 *x = cinematicKeyFrame->Position[0];
390 *y = cinematicKeyFrame->Position[1];
391 *z = cinematicKeyFrame->Position[2];
395 else if (nextCinematicKeyFrame && cinematicKeyFrame->
Frame < time && nextCinematicKeyFrame->
Frame > time)
398 if (nextCinematicKeyFrame->
Frame == cinematicKeyFrame->Frame)
400 *x = cinematicKeyFrame->Position[0];
401 *y = cinematicKeyFrame->Position[1];
402 *z = cinematicKeyFrame->Position[2];
406 float l_Progress = (float(time) - float(cinematicKeyFrame->Frame)) / (
float(nextCinematicKeyFrame->
Frame) -
float(cinematicKeyFrame->Frame));
408 *x = cinematicKeyFrame->Position[0] + (l_Progress * (nextCinematicKeyFrame->
Position[0] - cinematicKeyFrame->Position[0]));
409 *y = cinematicKeyFrame->Position[1] + (l_Progress * (nextCinematicKeyFrame->
Position[1] - cinematicKeyFrame->Position[1]));
410 *z = cinematicKeyFrame->Position[2] + (l_Progress * (nextCinematicKeyFrame->
Position[2] - cinematicKeyFrame->Position[2]));
420 if (cinematicKeyFrame->Frame < time)
421 lastGood = cinematicKeyFrame;