TrackCamera.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. //===========================================================================================================================
  2. // Spirenkov Maxim, 2003
  3. //===========================================================================================================================//
  4. //
  5. //===========================================================================================================================
  6. // TrackCamera
  7. //============================================================================================
  8. #include "TrackCamera.h"
  9. #include "..\CameraController\CameraController.h"
  10. #include "..\TrackCamera\CameraTracksFile.h"
  11. void TrackCamera::InitParams()
  12. {
  13. BaseCamera::InitParams();
  14. pos = 0.0f;
  15. ang.SetIdentity();
  16. currentIndex = -1;
  17. fovFar = fovNear = 1.25f;
  18. fovNearDist = 10.0f;
  19. fovFarDist = 50.0f;;
  20. track = null;
  21. distFactor = 1.0f;
  22. previewIndex = 0.0f;
  23. traceTarget = false;
  24. isMoveToPos = false;
  25. CamBlendK = 0;
  26. traceTarget = false;
  27. bNormalize = false;
  28. }
  29. TrackCamera::~TrackCamera()
  30. {
  31. if(track) delete track;
  32. track = null;
  33. if(model) model->Release();
  34. model = null;
  35. }
  36. bool TrackCamera::GetCameraTarget(const Vector & position, Vector & target_pos, Vector & up)
  37. {
  38. Matrix camRot;
  39. ang.GetMatrix(camRot);
  40. camRot.vz = -camRot.vz;
  41. target_pos = position + camRot.vz;
  42. up = camRot.vy;
  43. if (bNormalize)
  44. {
  45. up = Vector(0.0f,1.0f,0.0f);
  46. }
  47. return true;
  48. }
  49. void TrackCamera::ReadTrack(MOPReader & reader)
  50. {
  51. //Зачитаем трек
  52. string path = "Resource\\Cameras\\";
  53. path += reader.String().c_str();
  54. if(track) delete track;
  55. track = NEW PathTracks();
  56. // if(!track->LoadANT(&Files(), path))
  57. {
  58. // delete track;
  59. track = null;
  60. }
  61. isMoveToPos = true;
  62. MissionObject * obj = Mission().Player();
  63. if(obj)
  64. {
  65. Matrix mtx;
  66. chrPos = obj->GetMatrix(mtx).pos;
  67. }
  68. }
  69. //Прочитать параметры идущие перед стандартных
  70. bool TrackCamera::CameraPreCreate(MOPReader & reader)
  71. {
  72. ReadTrack(reader);
  73. //Изменение перспективы
  74. fovNear = reader.Float()*(PI/180.0f);
  75. fovNearDist = reader.Float();
  76. fovFar = reader.Float()*(PI/180.0f);
  77. fovFarDist = reader.Float();
  78. if(fovFarDist - fovNearDist < 1e-5f)
  79. {
  80. fovFarDist = fovNearDist + 1e-5f;
  81. }
  82. distFactor = reader.Float();
  83. //Режим слежения за целью
  84. traceTarget = reader.Bool();
  85. Vector offset = reader.Position();
  86. if (track)
  87. {
  88. track->SetOffset(offset);
  89. }
  90. bNormalize = reader.Bool();
  91. currentIndex = -1;
  92. isMoveToPos = true;
  93. return track != null;
  94. }
  95. void TrackCamera::Reset()
  96. {
  97. MissionObject * obj = Mission().Player();
  98. Matrix mtx;
  99. if(obj)
  100. {
  101. obj->GetMatrix(mtx);
  102. chrPos = mtx.pos;
  103. }
  104. if(IsActive())
  105. {
  106. if(track)
  107. {
  108. track->Find(chrPos, currentIndex, pos, ang);
  109. if(!obj) MissionObject::Activate(false);
  110. }
  111. }
  112. else
  113. {
  114. currentIndex = -1;
  115. isMoveToPos = true;
  116. }
  117. }
  118. //Работа
  119. void TrackCamera::WorkUpdate(float dltTime)
  120. {
  121. if (AutoZoom)
  122. {
  123. CamBlendK+=dltTime*2.5f;
  124. if (CamBlendK>1.0f)
  125. {
  126. CamBlendK = 1.0f;
  127. }
  128. }
  129. else
  130. {
  131. CamBlendK-=dltTime*2.5f;
  132. if (CamBlendK<0.0f)
  133. {
  134. CamBlendK = 0.0f;
  135. }
  136. }
  137. Vector trg, up(0.0f, 1.0f, 0.0f);
  138. GetCameraPosition(pos);
  139. //Получим матрицу цели
  140. Matrix mtx;
  141. if(targetID.NotEmpty())
  142. {
  143. if(!target.Validate())
  144. {
  145. FindObject(targetID,target);
  146. }
  147. }
  148. if(!target.Ptr())
  149. {
  150. Activate(false);
  151. return;
  152. }
  153. target.Ptr()->GetMatrix(mtx);
  154. //Если надо двигать, делаем это
  155. //if(isMoveToPos)
  156. {
  157. chrPos = mtx.pos;
  158. chrPos.Lerp(chrPos, mtx.pos, Clampf(dltTime*6.0f));
  159. //Найдём соответствующую позицию на треке
  160. if(track)
  161. {
  162. track->Find(chrPos, currentIndex, pos, ang);
  163. }
  164. else
  165. {
  166. pos = 0.0f;
  167. ang.SetIdentity();
  168. }
  169. if(traceTarget)
  170. {
  171. Matrix mtmp;
  172. mtmp.BuildView(chrPos + targetPos, pos, Vector(0.0f, 1.0f, 0.0f));
  173. mtmp.Inverse();
  174. ang.Set(mtmp);
  175. }
  176. else
  177. {
  178. Matrix mtmp;
  179. mtmp.BuildView(chrPos + targetPos, pos, Vector(0.0f, 1.0f, 0.0f));
  180. mtmp.Inverse();
  181. Quaternion q(mtmp);
  182. ang.SLerp(ang, q, CamBlendK);
  183. }
  184. //Надо ли ещё двигать
  185. if(~(mtx.pos - chrPos) < 0.005f) isMoveToPos = false;
  186. }
  187. /*else
  188. {
  189. //Смотрим, начать двигать или телепортнуть камеру
  190. float d = ~(mtx.pos - chrPos);
  191. if(d > 0.5f)
  192. {
  193. if(d < 3.0f)
  194. {
  195. isMoveToPos = true;
  196. }else{
  197. chrPos = mtx.pos;
  198. }
  199. }
  200. }*/
  201. //Установим камеру
  202. float kDist = (pos - mtx.pos).GetLength();
  203. kDist = (kDist - fovNearDist)/(fovFarDist - fovNearDist);
  204. if(kDist < 0.0f) kDist = 0.0f;
  205. if(kDist > 1.0f) kDist = 1.0f;
  206. kDist = powf(kDist, distFactor);
  207. fov = fovNear + (fovFar - fovNear)*kDist;
  208. }
  209. //Нарисовать дополнительную информацию нри селекте
  210. void TrackCamera::SelectedDraw(float dltTime)
  211. {
  212. previewIndex += dltTime*1.0f;
  213. if(track)
  214. {
  215. //Найдём соответствующую позицию на треке
  216. if(EditMode_IsSelect())
  217. {
  218. if(!track->GetPoint(previewIndex, pos, ang))
  219. {
  220. previewIndex = 0.0f;
  221. if(!track->GetPoint(previewIndex, pos, ang))
  222. {
  223. pos = 0.0f;
  224. ang.SetIdentity();
  225. }
  226. }
  227. }
  228. else
  229. {
  230. track->GetPoint(0.0f, pos, ang);
  231. previewIndex = 0.0f;
  232. }
  233. }
  234. else
  235. {
  236. pos = 0.0f;
  237. ang.SetIdentity();
  238. }
  239. //if(isPreview)
  240. //{
  241. //Work(dltTime, level);
  242. // Render().SetView((Mission().GetSwingMatrix()*GetMatrix(Matrix())).BuildViewFromObject());
  243. //}
  244. if (track)
  245. {
  246. track->Draw(Render());
  247. }
  248. BaseCamera::SelectedDraw(dltTime);
  249. }
  250. //Получить позицию камеры
  251. void TrackCamera::GetCameraPosition(Vector & position)
  252. {
  253. position = pos;
  254. }
  255. //Отрисовка в выделеном режиме
  256. void _cdecl TrackCamera::DebugDraw(float dltTime, long level)
  257. {
  258. EditModeDrawSelected(dltTime, level);
  259. RS_SPRITE spr[4];
  260. float fPosX = -1.0f;
  261. float fPosY = 1.0f-0.075f;
  262. spr[0].vPos = Vector (fPosX, fPosY+0.075f, 0.0f);
  263. spr[1].vPos = Vector (fPosX+1.0f, fPosY+0.075f, 0.0f);
  264. spr[2].vPos = Vector (fPosX+1.0f, fPosY, 0.0f);
  265. spr[3].vPos = Vector (fPosX, fPosY, 0.0f);
  266. spr[0].tv = 0.0f;
  267. spr[0].tu = 0.0f;
  268. spr[0].dwColor = 0xAA000000;
  269. spr[1].tv = 0.0f;
  270. spr[1].tu = 1.0f;
  271. spr[1].dwColor = 0xAA000000;
  272. spr[2].tv = 1.0f;
  273. spr[2].tu = 1.0f;
  274. spr[2].dwColor = 0xAA000000;
  275. spr[3].tv = 1.0f;
  276. spr[3].tu = 0.0f;
  277. spr[3].dwColor = 0xAA000000;
  278. Render().DrawSprites(NULL,spr, 1);
  279. Render().Print(0,0,0xff00ff00,"%s : Current Segment is %i",GetObjectID().c_str(),currentIndex);
  280. Render().DrawSphere(chrPos,0.5f,0xff00ff00);
  281. }
  282. //============================================================================================
  283. //Параметры инициализации
  284. //============================================================================================
  285. MOP_BEGINLISTCG(TrackCamera, "Tracked camera", '1.00', 1000, CAMERA_COMMENT("Tracked camera\n\n"),"Cameras")
  286. MOP_STRINGC("Camera track file", "Camera", "File whith track data (*.ant)")
  287. MOP_TRACK_CAM
  288. MOP_CAM_STD
  289. MOP_ENDLIST(TrackCamera)