📄 geneditpreviewdlg.cpp
字号:
// ==================================================================================
void CGenEditPreviewDlg :: ControlCamera()
{
geXForm3d TempXform; // for holding rotational info
geQuaternion Quat; // our quaternion variable
geFloat TURN_SPEED = 0.0f; // speed camera will move if turning left/right
geFloat MOVE_SPEED = 0.0f; // speed craft will move forward or backward
int Movement = 0;
char buffer[256];
HRESULT hr;
DIMOUSESTATE MouseState;
float Sensitivity = 0.005f;
float NormalSpeed = 60.0f;
// DirectInput stuff
hr = g_pdevKeyboard->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
if FAILED(hr)
{ if (hr == DIERR_INPUTLOST) ReacquireKeyboardInput();
hr = g_pdevKeyboard->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
}
hr = g_pdevMouse->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&MouseState);
if FAILED(hr)
{ if (hr == DIERR_INPUTLOST) ReacquireMouseInput();
hr = g_pdevMouse->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&MouseState);
}
if ((MouseState.lX) | (MouseState.lY) |
(KEYDOWN(buffer, ACTION_FORWARD)) |
(KEYDOWN(buffer, ACTION_BACKWARD)) |
(KEYDOWN(buffer, ACTION_SLIDE_LEFT)) |
(KEYDOWN(buffer, ACTION_SLIDE_RIGHT)))
{
if (MouseState.lX) // is mouse moving left or right?
{
TempXform = XForm;
geXForm3d_SetZRotation(&TempXform, 0.0f); // Prevent actor roll
geXForm3d_GetUp(&TempXform, &m_cameraUp); // Get Z axis
TURN_SPEED = MouseState.lX * Sensitivity *20;
/* We will create a quaternion based on our actor's
object-space y axis. This is completely independent
from the World's y axis. Then we will rotate this
quaternion based on our mouse's position. */
geQuaternion_SetFromAxisAngle(&Quat, &m_cameraUp, -RAD(TURN_SPEED));
/* Now, we convert our quaternion into a temporary
transform. This is a preparatory step so we can
give our PlayerXform the rotational properties of
our quaternion. */
geQuaternion_ToMatrix(&Quat, &TempXform);
/* Finally, we paste our TempXform's rotational
properties into our PlayerXform. Our PlayerXform
now is rotated in object-space. */
geXForm3d_Multiply(&TempXform, &XForm, &XForm);
} // if (MouseState.1X...
if (MouseState.lY) // is mouse moving up or down?
{
TempXform = XForm;
geXForm3d_SetZRotation(&TempXform, 0.0f); // Prevent actor roll
geXForm3d_GetLeft(&XForm, &m_cameraLeft); // Get X axis
TURN_SPEED = MouseState.lY * Sensitivity *20;
geQuaternion_SetFromAxisAngle(&Quat, &m_cameraLeft, RAD(TURN_SPEED));
geQuaternion_ToMatrix(&Quat, &TempXform);
geXForm3d_Multiply(&TempXform, &XForm, &XForm);
} // if (MouseState.1Y...
// MOVEMENT CONTROL =============================================================
if (KEYDOWN(buffer, ACTION_FORWARD)) // Move Forward
{
Movement += 1;
MOVE_SPEED = Movement * Sensitivity * 2000; // determine the speed
geXForm3d_GetIn(&XForm, &m_cameraIn); // Get the forward vector for the craft
MoveCamera ((float)NormalSpeed * MOVE_SPEED, &m_cameraIn); // move it forward
}
if (KEYDOWN(buffer, ACTION_BACKWARD)) // Move Backward
{
Movement -= 1;
MOVE_SPEED = Movement * Sensitivity * 2000; // determine the speed
geXForm3d_GetIn(&XForm, &m_cameraIn); // Get the forward vector for the craft
MoveCamera ((float)NormalSpeed * MOVE_SPEED, &m_cameraIn); // move it forward
}
if (KEYDOWN(buffer, ACTION_SLIDE_LEFT)) // Slide left
{
Movement += 1;
MOVE_SPEED = Movement * Sensitivity * 2000; // determine the speed
geXForm3d_GetLeft(&XForm, &m_cameraLeft); // Get the left vector for the craft
MoveCamera ((float)NormalSpeed * MOVE_SPEED, &m_cameraLeft); // move it left
}
if (KEYDOWN(buffer, ACTION_SLIDE_RIGHT)) // Slide right
{
Movement -= 1;
MOVE_SPEED = Movement * Sensitivity * 2000; // determine the speed
geXForm3d_GetLeft(&XForm, &m_cameraLeft); // Get the left vector for the craft
MoveCamera ((float)NormalSpeed * MOVE_SPEED, &m_cameraLeft); // move it right
}
} // if (MouseState.1X ||...
// Translate ONCE after rotation and movement
XForm.Translation = m_cameraNewPos; // update our camera's position in the world
geCamera_SetWorldSpaceXForm(Camera, &XForm);
if (KEYDOWN(buffer, ACTION_MENU)) // check for <Esc>
{run = 0;}
}
void CGenEditPreviewDlg::OnPreviewBrowseBtn()
{
int itemtext = 0;
int nItem = 0;
LPCTSTR bsp = NULL;
CFileDialog m_levelFile
(
TRUE,
bsp,
CGlobals::m_GlobalAppPath,
OFN_EXTENSIONDIFFERENT |
OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST,
_T("bsp files(.bsp)|*.bsp|")
);
m_levelFile.m_ofn.lpstrTitle ="GenEdit QuickViewer Level Picker";
if(IDOK !=m_levelFile.DoModal())
return;
m_previewLevelList.DeleteItem(nItem); // clear the list to make room for new entry
POSITION pos = m_levelFile.GetStartPosition();
while (pos)
m_previewLevelList.InsertItem(m_previewLevelList.GetItemCount(), m_levelFile.GetNextPathName(pos));
m_previewLevelPath = m_previewLevelList.GetItemText( itemtext, NULL );
m_previewWithEngineBtn.EnableWindow(TRUE);
UpdateData(FALSE);
}
void CGenEditPreviewDlg::OnRadio640()
{
Width = 640;
Height = 480;
}
void CGenEditPreviewDlg::OnRadio800()
{
Width = 800;
Height = 600;
}
void CGenEditPreviewDlg::OnRadio1024()
{
Width = 1024;
Height = 768;
}
void CGenEditPreviewDlg::OnSoftwareRadio()
{
m_DriverName = _T("Software");
OnRadio640();
m_640RadioBtn->SetCheck(1);
m_800RadioBtn->SetCheck(0);
m_1024RadioBtn->SetCheck(0);
m_softwareText.ShowWindow(TRUE);
m_800RadioBtn->EnableWindow(FALSE);
m_1024RadioBtn->EnableWindow(FALSE);
m_bDrawGripper = TRUE;
RedrawWindow();
}
void CGenEditPreviewDlg::OnDirect3dRadio()
{
m_DriverName = _T("D3D");
m_softwareText.ShowWindow(FALSE);
m_800RadioBtn->EnableWindow(TRUE);
m_1024RadioBtn->EnableWindow(TRUE);
m_bDrawGripper = FALSE;
RedrawWindow();
}
void CGenEditPreviewDlg::OnGlideRadio()
{
m_DriverName = _T("Glide");
m_softwareText.ShowWindow(FALSE);
m_800RadioBtn->EnableWindow(TRUE);
m_1024RadioBtn->EnableWindow(TRUE);
m_bDrawGripper = FALSE;
RedrawWindow();
}
void CGenEditPreviewDlg::OnRadioCollide()
{
m_collisionDetection = true;
}
void CGenEditPreviewDlg::OnRadioNocollide()
{
m_collisionDetection = false;
}
void CGenEditPreviewDlg::OnClose()
{
run = 0;
CDialog::EndDialog(1);
}
void CGenEditPreviewDlg::OnOK()
{
run = 0;
CDialog::EndDialog(1);
}
void CGenEditPreviewDlg::OnKillfocusCameraX()
{
int lastValue = m_cameraXPos;
int currentValue = GetDlgItemInt(IDC_CAMERA_X);
if (currentValue == 0)
{
this->SetDlgItemInt(IDC_CAMERA_X, 0);
m_cameraSliderX.SetPos(0);
UpdateData(TRUE);
return;
}
if ((currentValue >= -4000) && (currentValue <= 4000))
{
m_cameraXPos = currentValue;
m_cameraSliderX.SetPos(m_cameraXPos);
UpdateData(TRUE);
return;
}
else
{
m_cameraXPos = lastValue;
UpdateData(FALSE);
AfxMessageBox("Value must be >= -4000 and <= 4000");
}
}
void CGenEditPreviewDlg::OnKillfocusCameraY()
{
int lastValue = m_cameraYPos;
int currentValue = GetDlgItemInt(IDC_CAMERA_Y);
if (currentValue == 0)
{
this->SetDlgItemInt(IDC_CAMERA_Y, 0);
m_cameraSliderY.SetPos(0);
UpdateData(TRUE);
return;
}
if ((currentValue >= -4000) && (currentValue <= 4000))
{
m_cameraYPos = currentValue;
m_cameraSliderY.SetPos(m_cameraYPos);
UpdateData(TRUE);
return;
}
else
{
m_cameraYPos = lastValue;
UpdateData(FALSE);
AfxMessageBox("Value must be >= -4000 and <= 4000");
}
}
void CGenEditPreviewDlg::OnKillfocusCameraZ()
{
int lastValue = m_cameraZPos;
int currentValue = GetDlgItemInt(IDC_CAMERA_Z);
if (currentValue == 0)
{
this->SetDlgItemInt(IDC_CAMERA_Z, 0);
m_cameraSliderZ.SetPos(0);
UpdateData(TRUE);
return;
}
if ((currentValue >= -4000) && (currentValue <= 4000))
{
m_cameraZPos = currentValue;
m_cameraSliderZ.SetPos(m_cameraZPos);
UpdateData(TRUE);
return;
}
else
{
m_cameraZPos = lastValue;
UpdateData(FALSE);
AfxMessageBox("Value must be >= -4000 and <= 4000");
}
}
void CGenEditPreviewDlg::OnHScroll(UINT nSBCode, UINT nPos, CSliderCtrl* pScrollBar)
{
CSliderCtrl *pSlider = (CSliderCtrl*) pScrollBar;
if (pSlider->m_hWnd == m_cameraSliderX.m_hWnd)
m_cameraXPos = m_cameraSliderX.GetPos();
if (pSlider->m_hWnd == m_cameraSliderY.m_hWnd)
m_cameraYPos = m_cameraSliderY.GetPos();
if (pSlider->m_hWnd == m_cameraSliderZ.m_hWnd)
m_cameraZPos = m_cameraSliderZ.GetPos();
UpdateData(FALSE);
}
void CGenEditPreviewDlg::OnPaint()
{
CPaintDC dc(this);
if(m_bDrawGripper)
{
CRect rc;
GetClientRect(rc);
rc.left = rc.right - 20;
rc.top = rc.bottom - 20;
m_GripperRect = rc;
dc.DrawFrameControl(rc,DFC_SCROLL,DFCS_SCROLLSIZEGRIP);
}
}
UINT CGenEditPreviewDlg::OnNcHitTest(CPoint point)
{
UINT ht = CDialog::OnNcHitTest(point);
if(ht==HTCLIENT && m_bDrawGripper)
{
CRect rc;
GetWindowRect( rc );
rc.left = rc.right - 20;
rc.top = rc.bottom - 20;
if(rc.PtInRect(point))
{
ht = HTBOTTOMRIGHT;
}
}
return ht;
}
void CGenEditPreviewDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
InvalidateRect(m_GripperRect);
RedrawWindow();
}
// post 0.55
// zero out camera coordinates,
// set camera at level center
void CGenEditPreviewDlg::OnZeroCameraBtn()
{
m_cameraSliderX.SetPos(0);
m_cameraSliderY.SetPos(0);
m_cameraSliderZ.SetPos(0);
m_cameraXPos = m_cameraSliderX.GetPos();
m_cameraYPos = m_cameraSliderY.GetPos();
m_cameraZPos = m_cameraSliderZ.GetPos();
UpdateData(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -