client/UserInterface/PythonApplicationCamera.cpp

416 lines
13 KiB
C++
Raw Blame History

#include "StdAfx.h"
#include "PythonApplication.h"
#include "../eterbase/timer.h"
#include "../eterlib/Camera.h"
float BlendValueByLinear(float fElapsedTime, float fDuration, float fBeginValue, float fEndValue)
{
if (fElapsedTime >= fDuration)
return fEndValue;
return (fEndValue - fBeginValue) * (fElapsedTime / fDuration) + fBeginValue;
}
void CPythonApplication::__UpdateCamera()
{
//////////////////////
// Camera Setting
CCamera * pMainCamera = CCameraManager::Instance().GetCurrentCamera();
if (!pMainCamera)
return;
if (CAMERA_MODE_BLEND == m_iCameraMode)
{
float fcurTime = CTimer::Instance().GetCurrentSecond();
float fElapsedTime = fcurTime - m_fBlendCameraStartTime;
float fxCenter = BlendValueByLinear(fElapsedTime, m_fBlendCameraBlendTime, m_kEventCameraSetting.v3CenterPosition.x, m_kEndBlendCameraSetting.v3CenterPosition.x);
float fyCenter = BlendValueByLinear(fElapsedTime, m_fBlendCameraBlendTime, m_kEventCameraSetting.v3CenterPosition.y, m_kEndBlendCameraSetting.v3CenterPosition.y);
float fzCenter = BlendValueByLinear(fElapsedTime, m_fBlendCameraBlendTime, m_kEventCameraSetting.v3CenterPosition.z, m_kEndBlendCameraSetting.v3CenterPosition.z);
float fDistance = BlendValueByLinear(fElapsedTime, m_fBlendCameraBlendTime, m_kEventCameraSetting.fZoom, m_kEndBlendCameraSetting.fZoom);
float fPitch = BlendValueByLinear(fElapsedTime, m_fBlendCameraBlendTime, m_kEventCameraSetting.fPitch, m_kEndBlendCameraSetting.fPitch);
float fRotation = BlendValueByLinear(fElapsedTime, m_fBlendCameraBlendTime, m_kEventCameraSetting.fRotation, m_kEndBlendCameraSetting.fRotation);
float fUpDir = BlendValueByLinear(fElapsedTime, m_fBlendCameraBlendTime, m_kEventCameraSetting.kCmrPos.m_fUpDir, m_kEndBlendCameraSetting.kCmrPos.m_fUpDir);
float fViewDir = BlendValueByLinear(fElapsedTime, m_fBlendCameraBlendTime, m_kEventCameraSetting.kCmrPos.m_fViewDir, m_kEndBlendCameraSetting.kCmrPos.m_fViewDir);
float fCrossDir = BlendValueByLinear(fElapsedTime, m_fBlendCameraBlendTime, m_kEventCameraSetting.kCmrPos.m_fCrossDir, m_kEndBlendCameraSetting.kCmrPos.m_fCrossDir);
// Temporary. Have to fix that this work in camera class. - [levites]
pMainCamera->Unlock();
m_pyGraphic.SetPositionCamera(fxCenter, fyCenter, fzCenter, fDistance, fPitch, fRotation);
pMainCamera->MoveVertical(fUpDir);
pMainCamera->MoveFront(fViewDir);
pMainCamera->MoveAlongCross(fCrossDir);
pMainCamera->Lock();
}
else if (CAMERA_MODE_STAND == m_iCameraMode)
{
float fDistance, fPitch, fRotation, fHeight;
GetCamera(&fDistance, &fPitch, &fRotation, &fHeight);
m_pyGraphic.SetPositionCamera(m_kEventCameraSetting.v3CenterPosition.x,
m_kEventCameraSetting.v3CenterPosition.y,
m_kEventCameraSetting.v3CenterPosition.z + pMainCamera->GetTargetHeight(),
fDistance, fPitch, fRotation);
}
else if (CAMERA_MODE_NORMAL == m_iCameraMode)
{
float fDistance, fPitch, fRotation, fHeight;
GetCamera(&fDistance, &fPitch, &fRotation, &fHeight);
m_pyGraphic.SetPositionCamera(m_v3CenterPosition.x, m_v3CenterPosition.y, m_v3CenterPosition.z + pMainCamera->GetTargetHeight(), fDistance, fPitch, fRotation);
}
if (0.0f != m_fRotationSpeed)
pMainCamera->Roll(m_fRotationSpeed);
if (0.0f != m_fPitchSpeed)
pMainCamera->Pitch(m_fPitchSpeed);
if (0.0f != m_fZoomSpeed)
pMainCamera->Zoom(m_fZoomSpeed);
if (0.0f !=m_kCmrSpd.m_fViewDir)
m_kCmrPos.m_fViewDir+=m_kCmrSpd.m_fViewDir;
if (0.0f !=m_kCmrSpd.m_fCrossDir)
m_kCmrPos.m_fCrossDir+=m_kCmrSpd.m_fCrossDir;
if (0.0f !=m_kCmrSpd.m_fUpDir)
m_kCmrPos.m_fUpDir+=m_kCmrSpd.m_fUpDir;
if (0.0f != m_kCmrPos.m_fViewDir)
pMainCamera->MoveFront(m_kCmrPos.m_fViewDir);
if (0.0f != m_kCmrPos.m_fCrossDir)
pMainCamera->MoveAlongCross(m_kCmrPos.m_fCrossDir);
if (0.0f != m_kCmrPos.m_fUpDir)
pMainCamera->MoveVertical(m_kCmrPos.m_fUpDir);
//////////////////////
if (pMainCamera->IsDraging())
SkipRenderBuffering(3000);
//////////////////////
// Sound Setting
const D3DXVECTOR3 & c_rv3CameraDirection = pMainCamera->GetView();
const D3DXVECTOR3 & c_rv3CameraUp = pMainCamera->GetUp();
m_SoundManager.SetPosition(m_v3CenterPosition.x, m_v3CenterPosition.y, m_v3CenterPosition.z); // Listener - ij<><C4B3><EFBFBD><EFBFBD> <20><>ġ
m_SoundManager.SetDirection(c_rv3CameraDirection.x, c_rv3CameraDirection.y, c_rv3CameraDirection.z, c_rv3CameraUp.x, c_rv3CameraUp.y, c_rv3CameraUp.z);
m_SoundManager.Update();
//////////////////////
}
void CPythonApplication::SetViewDirCameraSpeed(float fSpeed)
{
if (IsLockCurrentCamera())
return;
m_kCmrSpd.m_fViewDir=fSpeed;
}
void CPythonApplication::SetCrossDirCameraSpeed(float fSpeed)
{
if (IsLockCurrentCamera())
return;
m_kCmrSpd.m_fCrossDir=fSpeed;
}
void CPythonApplication::SetUpDirCameraSpeed(float fSpeed)
{
if (IsLockCurrentCamera())
return;
m_kCmrSpd.m_fUpDir=fSpeed;
}
void CPythonApplication::SetCamera(float Distance, float Pitch, float Rotation, float fDestinationHeight)
{
if (IsLockCurrentCamera())
return;
CCamera * pCurrentCamera = CCameraManager::Instance().GetCurrentCamera();
if (!pCurrentCamera)
return;
D3DXVECTOR3 v3Target = pCurrentCamera->GetTarget();
m_pyGraphic.SetPositionCamera(v3Target.x, v3Target.y, v3Target.z, Distance, Pitch, Rotation);
CCamera * pMainCamera = CCameraManager::Instance().GetCurrentCamera();
if (pMainCamera)
pMainCamera->SetTargetHeight(fDestinationHeight);
}
void CPythonApplication::GetCamera(float * Distance, float * Pitch, float * Rotation, float * DestinationHeight)
{
CCamera * pCurrentCamera = CCameraManager::Instance().GetCurrentCamera();
*Distance = pCurrentCamera->GetDistance();
*Pitch = pCurrentCamera->GetPitch();
*Rotation = pCurrentCamera->GetRoll();
*DestinationHeight = pCurrentCamera->GetTarget().z;
}
void CPythonApplication::RotateCamera(int iDirection)
{
if (IsLockCurrentCamera())
return;
float fDegree = m_fCameraRotateSpeed * float(iDirection);
m_fRotationSpeed = fDegree;
}
void CPythonApplication::PitchCamera(int iDirection)
{
if (IsLockCurrentCamera())
return;
float fDegree = m_fCameraPitchSpeed * float(iDirection);
m_fPitchSpeed = fDegree;
}
void CPythonApplication::ZoomCamera(int iDirection)
{
if (IsLockCurrentCamera())
return;
float fRatio = 1.0f + m_fCameraZoomSpeed * float(iDirection);
m_fZoomSpeed = fRatio;
}
void CPythonApplication::MovieRotateCamera(int iDirection)
{
if (IsLockCurrentCamera())
return;
float fDegree = m_fCameraRotateSpeed * float(iDirection);
if (m_isSpecialCameraMode)
{
if (GetKeyState(VK_SCROLL) & 1)
{
SetCrossDirCameraSpeed(-fDegree * 6.0f);
return;
}
}
m_fRotationSpeed = fDegree;
}
void CPythonApplication::MoviePitchCamera(int iDirection)
{
if (IsLockCurrentCamera())
return;
float fDegree = m_fCameraPitchSpeed * float(iDirection);
if (m_isSpecialCameraMode)
{
if (GetKeyState(VK_SCROLL) & 1)
{
SetViewDirCameraSpeed(-fDegree * 6.0f);
return;
}
}
m_fPitchSpeed = fDegree;
}
void CPythonApplication::MovieZoomCamera(int iDirection)
{
if (IsLockCurrentCamera())
return;
float fRatio = 1.0f + m_fCameraZoomSpeed * float(iDirection);
if (m_isSpecialCameraMode)
{
if (GetKeyState(VK_SCROLL) & 1)
{
SetUpDirCameraSpeed((1.0f - fRatio) * 200.0f);
return;
}
}
m_fZoomSpeed = fRatio;
}
void CPythonApplication::MovieResetCamera()
{
if (IsLockCurrentCamera())
return;
if (m_isSpecialCameraMode)
{
SetCrossDirCameraSpeed(0.0f);
SetViewDirCameraSpeed(0.0f);
SetUpDirCameraSpeed(0.0f);
m_kCmrPos.m_fViewDir = 0;
m_kCmrPos.m_fCrossDir = 0;
m_kCmrPos.m_fUpDir = 0;
}
}
float CPythonApplication::GetRotation()
{
return CCameraManager::Instance().GetCurrentCamera()->GetRoll();
}
float CPythonApplication::GetPitch()
{
return CCameraManager::Instance().GetCurrentCamera()->GetPitch();
}
bool CPythonApplication::IsLockCurrentCamera()
{
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
if (!pCamera)
return false;
return pCamera->IsLock();
}
void CPythonApplication::SetEventCamera(const SCameraSetting & c_rCameraSetting)
{
if (CCameraManager::DEFAULT_PERSPECTIVE_CAMERA == CCameraManager::Instance().GetCurrentCameraNum())
{
GetCameraSetting(&m_DefaultCameraSetting);
}
/////
CCameraManager::Instance().SetCurrentCamera(EVENT_CAMERA_NUMBER);
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
if (!pCamera)
return;
SetCameraSetting(c_rCameraSetting);
m_kEventCameraSetting = c_rCameraSetting;
m_iCameraMode = CAMERA_MODE_STAND;
}
void CPythonApplication::BlendEventCamera(const SCameraSetting & c_rCameraSetting, float fBlendTime)
{
m_iCameraMode = CAMERA_MODE_BLEND;
m_fBlendCameraStartTime = CTimer::Instance().GetCurrentSecond();
m_fBlendCameraBlendTime = fBlendTime;
m_kEndBlendCameraSetting = c_rCameraSetting;
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
if (pCamera)
pCamera->Lock();
}
void CPythonApplication::SetDefaultCamera()
{
m_iCameraMode = CAMERA_MODE_NORMAL;
m_fBlendCameraStartTime = 0.0f;
m_fBlendCameraBlendTime = 0.0f;
/////
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
if (pCamera)
pCamera->Unlock();
if (CCameraManager::DEFAULT_PERSPECTIVE_CAMERA != CCameraManager::Instance().GetCurrentCameraNum())
{
CCameraManager::Instance().SetCurrentCamera(CCameraManager::DEFAULT_PERSPECTIVE_CAMERA);
SetCameraSetting(m_DefaultCameraSetting);
}
}
void CPythonApplication::SetCameraSetting(const SCameraSetting & c_rCameraSetting)
{
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
if (!pCamera)
return;
m_pyGraphic.SetPositionCamera( c_rCameraSetting.v3CenterPosition.x,
c_rCameraSetting.v3CenterPosition.y,
c_rCameraSetting.v3CenterPosition.z,
c_rCameraSetting.fZoom,
c_rCameraSetting.fPitch,
c_rCameraSetting.fRotation);
if (0.0f != c_rCameraSetting.kCmrPos.m_fViewDir)
pCamera->MoveFront(c_rCameraSetting.kCmrPos.m_fViewDir);
if (0.0f != c_rCameraSetting.kCmrPos.m_fCrossDir)
pCamera->MoveAlongCross(c_rCameraSetting.kCmrPos.m_fCrossDir);
if (0.0f != c_rCameraSetting.kCmrPos.m_fUpDir)
pCamera->MoveVertical(c_rCameraSetting.kCmrPos.m_fUpDir);
m_kCmrPos.m_fUpDir = 0.0f;
m_kCmrPos.m_fViewDir = 0.0f;
m_kCmrPos.m_fCrossDir = 0.0f;
m_kCmrSpd.m_fUpDir = 0.0f;
m_kCmrSpd.m_fViewDir = 0.0f;
m_kCmrSpd.m_fCrossDir = 0.0f;
m_fZoomSpeed = 0.0f;
m_fPitchSpeed = 0.0f;
m_fRotationSpeed = 0.0f;
}
void CPythonApplication::GetCameraSetting(SCameraSetting * pCameraSetting)
{
pCameraSetting->v3CenterPosition = m_v3CenterPosition;
pCameraSetting->kCmrPos = m_kCmrPos;
if (CCameraManager::Instance().GetCurrentCamera())
pCameraSetting->v3CenterPosition.z += CCameraManager::Instance().GetCurrentCamera()->GetTargetHeight();
float fHeight;
GetCamera(&pCameraSetting->fZoom, &pCameraSetting->fPitch, &pCameraSetting->fRotation, &fHeight);
}
void CPythonApplication::SaveCameraSetting(const char * c_szFileName)
{
SCameraSetting CameraSetting;
GetCameraSetting(&CameraSetting);
FILE * File = fopen(c_szFileName, "w");
SetFileAttributes(c_szFileName, FILE_ATTRIBUTE_NORMAL);
PrintfTabs(File, 0, "CenterPos %f %f %f\n", CameraSetting.v3CenterPosition.x, CameraSetting.v3CenterPosition.y, CameraSetting.v3CenterPosition.z);
PrintfTabs(File, 0, "CameraSetting %f %f %f\n", CameraSetting.fZoom, CameraSetting.fPitch, CameraSetting.fRotation);
PrintfTabs(File, 0, "CmrPos %f %f %f\n", CameraSetting.kCmrPos.m_fUpDir, CameraSetting.kCmrPos.m_fViewDir, CameraSetting.kCmrPos.m_fCrossDir);
PrintfTabs(File, 0, "Line \"x;%d|y;%d|z;%d|distance;%d|pitch;%d|rot;%d|up;%d|view;%d|cross;%d\"\n",
int(CameraSetting.v3CenterPosition.x),
int(CameraSetting.v3CenterPosition.y),
int(CameraSetting.v3CenterPosition.z),
int(CameraSetting.fZoom),
int(CameraSetting.fPitch),
int(CameraSetting.fRotation),
int(CameraSetting.kCmrPos.m_fUpDir),
int(CameraSetting.kCmrPos.m_fViewDir),
int(CameraSetting.kCmrPos.m_fCrossDir));
fclose(File);
}
bool CPythonApplication::LoadCameraSetting(const char * c_szFileName)
{
CTextFileLoader TextFileLoader;
if (!TextFileLoader.Load(c_szFileName))
return false;
TextFileLoader.SetTop();
D3DXVECTOR3 v3CenterPosition;
CTokenVector * pCameraSetting;
CTokenVector * pCmrPos;
if (TextFileLoader.GetTokenVector3("centerpos", &v3CenterPosition))
if (TextFileLoader.GetTokenVector("camerasetting", &pCameraSetting))
if (TextFileLoader.GetTokenVector("cmrpos", &pCmrPos))
if (3 == pCameraSetting->size())
if (3 == pCmrPos->size())
{
SCameraSetting CameraSetting;
CameraSetting.v3CenterPosition = v3CenterPosition;
CameraSetting.fZoom = atof(pCameraSetting->at(0).c_str());
CameraSetting.fPitch = atof(pCameraSetting->at(1).c_str());
CameraSetting.fRotation = atof(pCameraSetting->at(2).c_str());
CameraSetting.kCmrPos.m_fUpDir = atof(pCmrPos->at(0).c_str());
CameraSetting.kCmrPos.m_fViewDir = atof(pCmrPos->at(1).c_str());
CameraSetting.kCmrPos.m_fCrossDir = atof(pCmrPos->at(2).c_str());
SetEventCamera(CameraSetting);
return true;
}
return false;
}