| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- //===========================================================================================================================
- // Spirenkov Maxim, 2003
- //===========================================================================================================================//
- //
- //===========================================================================================================================
- // TrackCamera
- //============================================================================================
-
- #include "TrackCamera.h"
- #include "..\CameraController\CameraController.h"
- #include "..\TrackCamera\CameraTracksFile.h"
- void TrackCamera::InitParams()
- {
- BaseCamera::InitParams();
- pos = 0.0f;
- ang.SetIdentity();
- currentIndex = -1;
- fovFar = fovNear = 1.25f;
- fovNearDist = 10.0f;
- fovFarDist = 50.0f;;
- track = null;
- distFactor = 1.0f;
- previewIndex = 0.0f;
- traceTarget = false;
- isMoveToPos = false;
- CamBlendK = 0;
- traceTarget = false;
- bNormalize = false;
- }
- TrackCamera::~TrackCamera()
- {
- if(track) delete track;
- track = null;
- if(model) model->Release();
- model = null;
- }
- bool TrackCamera::GetCameraTarget(const Vector & position, Vector & target_pos, Vector & up)
- {
- Matrix camRot;
- ang.GetMatrix(camRot);
- camRot.vz = -camRot.vz;
- target_pos = position + camRot.vz;
- up = camRot.vy;
- if (bNormalize)
- {
- up = Vector(0.0f,1.0f,0.0f);
- }
- return true;
- }
- void TrackCamera::ReadTrack(MOPReader & reader)
- {
- //Зачитаем трек
- string path = "Resource\\Cameras\\";
- path += reader.String().c_str();
- if(track) delete track;
- track = NEW PathTracks();
- // if(!track->LoadANT(&Files(), path))
- {
- // delete track;
- track = null;
- }
- isMoveToPos = true;
- MissionObject * obj = Mission().Player();
- if(obj)
- {
- Matrix mtx;
- chrPos = obj->GetMatrix(mtx).pos;
- }
- }
- //Прочитать параметры идущие перед стандартных
- bool TrackCamera::CameraPreCreate(MOPReader & reader)
- {
- ReadTrack(reader);
-
- //Изменение перспективы
- fovNear = reader.Float()*(PI/180.0f);
- fovNearDist = reader.Float();
- fovFar = reader.Float()*(PI/180.0f);
- fovFarDist = reader.Float();
- if(fovFarDist - fovNearDist < 1e-5f)
- {
- fovFarDist = fovNearDist + 1e-5f;
- }
- distFactor = reader.Float();
- //Режим слежения за целью
- traceTarget = reader.Bool();
- Vector offset = reader.Position();
-
- if (track)
- {
- track->SetOffset(offset);
- }
-
- bNormalize = reader.Bool();
- currentIndex = -1;
- isMoveToPos = true;
- return track != null;
- }
- void TrackCamera::Reset()
- {
- MissionObject * obj = Mission().Player();
- Matrix mtx;
- if(obj)
- {
- obj->GetMatrix(mtx);
- chrPos = mtx.pos;
- }
- if(IsActive())
- {
- if(track)
- {
- track->Find(chrPos, currentIndex, pos, ang);
- if(!obj) MissionObject::Activate(false);
- }
- }
- else
- {
- currentIndex = -1;
- isMoveToPos = true;
- }
- }
- //Работа
- void TrackCamera::WorkUpdate(float dltTime)
- {
- if (AutoZoom)
- {
- CamBlendK+=dltTime*2.5f;
- if (CamBlendK>1.0f)
- {
- CamBlendK = 1.0f;
- }
- }
- else
- {
- CamBlendK-=dltTime*2.5f;
- if (CamBlendK<0.0f)
- {
- CamBlendK = 0.0f;
- }
- }
- Vector trg, up(0.0f, 1.0f, 0.0f);
- GetCameraPosition(pos);
-
- //Получим матрицу цели
- Matrix mtx;
-
- if(targetID.NotEmpty())
- {
- if(!target.Validate())
- {
- FindObject(targetID,target);
- }
- }
- if(!target.Ptr())
- {
- Activate(false);
- return;
- }
- target.Ptr()->GetMatrix(mtx);
-
- //Если надо двигать, делаем это
- //if(isMoveToPos)
- {
- chrPos = mtx.pos;
- chrPos.Lerp(chrPos, mtx.pos, Clampf(dltTime*6.0f));
-
- //Найдём соответствующую позицию на треке
- if(track)
- {
- track->Find(chrPos, currentIndex, pos, ang);
- }
- else
- {
- pos = 0.0f;
- ang.SetIdentity();
- }
-
- if(traceTarget)
- {
- Matrix mtmp;
- mtmp.BuildView(chrPos + targetPos, pos, Vector(0.0f, 1.0f, 0.0f));
- mtmp.Inverse();
- ang.Set(mtmp);
- }
- else
- {
- Matrix mtmp;
- mtmp.BuildView(chrPos + targetPos, pos, Vector(0.0f, 1.0f, 0.0f));
- mtmp.Inverse();
- Quaternion q(mtmp);
- ang.SLerp(ang, q, CamBlendK);
- }
-
- //Надо ли ещё двигать
- if(~(mtx.pos - chrPos) < 0.005f) isMoveToPos = false;
- }
- /*else
- {
- //Смотрим, начать двигать или телепортнуть камеру
- float d = ~(mtx.pos - chrPos);
- if(d > 0.5f)
- {
- if(d < 3.0f)
- {
- isMoveToPos = true;
- }else{
- chrPos = mtx.pos;
- }
- }
- }*/
-
- //Установим камеру
- float kDist = (pos - mtx.pos).GetLength();
- kDist = (kDist - fovNearDist)/(fovFarDist - fovNearDist);
-
- if(kDist < 0.0f) kDist = 0.0f;
- if(kDist > 1.0f) kDist = 1.0f;
-
- kDist = powf(kDist, distFactor);
-
- fov = fovNear + (fovFar - fovNear)*kDist;
- }
- //Нарисовать дополнительную информацию нри селекте
- void TrackCamera::SelectedDraw(float dltTime)
- {
- previewIndex += dltTime*1.0f;
- if(track)
- {
- //Найдём соответствующую позицию на треке
- if(EditMode_IsSelect())
- {
- if(!track->GetPoint(previewIndex, pos, ang))
- {
- previewIndex = 0.0f;
- if(!track->GetPoint(previewIndex, pos, ang))
- {
- pos = 0.0f;
- ang.SetIdentity();
- }
- }
- }
- else
- {
- track->GetPoint(0.0f, pos, ang);
- previewIndex = 0.0f;
- }
- }
- else
- {
- pos = 0.0f;
- ang.SetIdentity();
- }
- //if(isPreview)
- //{
- //Work(dltTime, level);
- // Render().SetView((Mission().GetSwingMatrix()*GetMatrix(Matrix())).BuildViewFromObject());
- //}
- if (track)
- {
- track->Draw(Render());
- }
-
- BaseCamera::SelectedDraw(dltTime);
- }
- //Получить позицию камеры
- void TrackCamera::GetCameraPosition(Vector & position)
- {
- position = pos;
- }
- //Отрисовка в выделеном режиме
- void _cdecl TrackCamera::DebugDraw(float dltTime, long level)
- {
- EditModeDrawSelected(dltTime, level);
- RS_SPRITE spr[4];
- float fPosX = -1.0f;
- float fPosY = 1.0f-0.075f;
- spr[0].vPos = Vector (fPosX, fPosY+0.075f, 0.0f);
- spr[1].vPos = Vector (fPosX+1.0f, fPosY+0.075f, 0.0f);
- spr[2].vPos = Vector (fPosX+1.0f, fPosY, 0.0f);
- spr[3].vPos = Vector (fPosX, fPosY, 0.0f);
- spr[0].tv = 0.0f;
- spr[0].tu = 0.0f;
- spr[0].dwColor = 0xAA000000;
- spr[1].tv = 0.0f;
- spr[1].tu = 1.0f;
- spr[1].dwColor = 0xAA000000;
- spr[2].tv = 1.0f;
- spr[2].tu = 1.0f;
- spr[2].dwColor = 0xAA000000;
- spr[3].tv = 1.0f;
- spr[3].tu = 0.0f;
- spr[3].dwColor = 0xAA000000;
- Render().DrawSprites(NULL,spr, 1);
- Render().Print(0,0,0xff00ff00,"%s : Current Segment is %i",GetObjectID().c_str(),currentIndex);
- Render().DrawSphere(chrPos,0.5f,0xff00ff00);
- }
- //============================================================================================
- //Параметры инициализации
- //============================================================================================
- MOP_BEGINLISTCG(TrackCamera, "Tracked camera", '1.00', 1000, CAMERA_COMMENT("Tracked camera\n\n"),"Cameras")
- MOP_STRINGC("Camera track file", "Camera", "File whith track data (*.ant)")
- MOP_TRACK_CAM
- MOP_CAM_STD
- MOP_ENDLIST(TrackCamera)
|