/* =========================================================================== Copyright (C) 1999-2005 Id Software, Inc. This file is part of Quake III Arena source code. Quake III Arena source code is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Quake III Arena source code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Foobar; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ // DlgCamera.cpp : implementation file // #include "stdafx.h" #include "DlgCamera.h" #include "DlgEvent.h" #include "NameDlg.h" #include "splines/splines.h" #include "CameraTargetDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CDlgCamera g_dlgCamera; /* ============ va does a varargs printf into a temp buffer, so I don't need to have varargs versions of all text functions. FIXME: make this buffer size safe someday ============ */ char *va( char *format, ... ) { va_list argptr; static char string[2][32000]; // in case va is called by nested functions static int index = 0; char *buf; buf = string[index & 1]; index++; va_start (argptr, format); vsprintf (buf, format,argptr); va_end (argptr); return buf; } void showCameraInspector() { if (g_dlgCamera.GetSafeHwnd() == NULL) { g_dlgCamera.Create(IDD_DLG_CAMERA); CRect rct; LONG lSize = sizeof(rct); if (LoadRegistryInfo("Radiant::CameraInspector", &rct, &lSize)) { g_dlgCamera.SetWindowPos(NULL, rct.left, rct.top, 0,0, SWP_NOSIZE | SWP_SHOWWINDOW); } Sys_UpdateWindows(W_ALL); } g_dlgCamera.ShowWindow(SW_SHOW); g_dlgCamera.setupFromCamera(); } ///////////////////////////////////////////////////////////////////////////// // CDlgCamera dialog CDlgCamera::CDlgCamera(CWnd* pParent /*=NULL*/) : CDialog(CDlgCamera::IDD, pParent) { //{{AFX_DATA_INIT(CDlgCamera) m_strName = _T(""); m_fSeconds = 0.0f; m_trackCamera = TRUE; m_numSegments = 0; m_currentSegment = 0; m_strType = _T(""); m_editPoints = 0; //}}AFX_DATA_INIT } void CDlgCamera::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgCamera) DDX_Control(pDX, IDC_SCROLLBAR_SEGMENT, m_wndSegments); DDX_Control(pDX, IDC_LIST_EVENTS, m_wndEvents); DDX_Control(pDX, IDC_COMBO_SPLINES, m_wndSplines); DDX_Text(pDX, IDC_EDIT_CAM_NAME, m_strName); DDX_Text(pDX, IDC_EDIT_LENGTH, m_fSeconds); DDX_Check(pDX, IDC_CHECK_TRACKCAMERA, m_trackCamera); DDX_Text(pDX, IDC_EDIT_TOTALSEGMENTS, m_numSegments); DDX_Text(pDX, IDC_EDIT_SEGMENT, m_currentSegment); DDX_Text(pDX, IDC_EDIT_TYPE, m_strType); DDX_Radio(pDX, IDC_RADIO_EDITPOINTS, m_editPoints); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDlgCamera, CDialog) //{{AFX_MSG_MAP(CDlgCamera) ON_BN_CLICKED(IDC_BTN_ADDEVENT, OnBtnAddevent) ON_BN_CLICKED(IDC_BTN_ADDTARGET, OnBtnAddtarget) ON_BN_CLICKED(IDC_BTN_DELEVENT, OnBtnDelevent) ON_CBN_DBLCLK(IDC_COMBO_SPLINES, OnDblclkComboSplines) ON_CBN_SELCHANGE(IDC_COMBO_SPLINES, OnSelchangeComboSplines) ON_LBN_SELCHANGE(IDC_LIST_EVENTS, OnSelchangeListEvents) ON_LBN_DBLCLK(IDC_LIST_EVENTS, OnDblclkListEvents) ON_WM_DESTROY() ON_BN_CLICKED(IDAPPLY, OnApply) ON_WM_HSCROLL() ON_BN_CLICKED(ID_FILE_NEW, OnFileNew) ON_BN_CLICKED(ID_FILE_OPEN, OnFileOpen) ON_BN_CLICKED(ID_FILE_SAVE, OnFileSave) ON_BN_CLICKED(ID_TESTCAMERA, OnTestcamera) ON_BN_CLICKED(IDC_BTN_DELETEPOINTS, OnBtnDeletepoints) ON_BN_CLICKED(IDC_BTN_SELECTALL, OnBtnSelectall) ON_BN_CLICKED(IDC_RADIO_EDITPOINTS, OnRadioEditpoints) ON_BN_CLICKED(IDC_RADIO_EDITPOINTS2, OnRadioAddPoints) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDlgCamera message handlers void CDlgCamera::OnBtnAddevent() { CDlgEvent dlg; if (dlg.DoModal() == IDOK) { long n = m_wndSegments.GetScrollPos() / 4 * 1000; g_splineList->addEvent(static_cast(dlg.m_event+1), dlg.m_strParm, n); setupFromCamera(); } } void CDlgCamera::OnBtnAddtarget() { CCameraTargetDlg dlg; if (dlg.DoModal() == IDOK) { g_splineList->addTarget(dlg.m_strName, static_cast(dlg.m_nType)); setupFromCamera(); m_wndSplines.SetCurSel(g_splineList->numTargets()); OnSelchangeComboSplines(); OnRadioAddPoints(); } } void CDlgCamera::OnBtnDelevent() { // TODO: Add your control notification handler code here } void CDlgCamera::OnBtnDeltarget() { // TODO: Add your control notification handler code here } void CDlgCamera::OnDblclkComboSplines() { // TODO: Add your control notification handler code here } void CDlgCamera::OnSelchangeComboSplines() { UpdateData(TRUE); g_qeglobals.d_select_mode = (m_editPoints == 0) ? sel_editpoint : sel_addpoint; g_qeglobals.d_numpoints = 0; g_qeglobals.d_num_move_points = 0; int i = m_wndSplines.GetCurSel(); if (i > 0) { g_splineList->setActiveTarget(i-1); g_qeglobals.selectObject = g_splineList->getActiveTarget(i-1); g_splineList->startEdit(false); } else { g_splineList->startEdit(true); g_qeglobals.selectObject = g_splineList->getPositionObj(); } // * 4.0 to set increments in quarter seconds m_wndSegments.SetScrollRange(0, g_splineList->getTotalTime() * 4.0); Sys_UpdateWindows(W_ALL); } void CDlgCamera::OnSelchangeListEvents() { int sel = m_wndEvents.GetCurSel(); //g_splineList->setActiveSegment(sel >= 0 ? sel : 0); } void CDlgCamera::OnDblclkListEvents() { // TODO: Add your control notification handler code here } void CDlgCamera::setupFromCamera() { if (m_wndSplines.GetSafeHwnd()) { int i; idStr str; m_strName = g_splineList->getName(); m_strType = g_splineList->getPositionObj()->typeStr(); m_wndSplines.ResetContent(); m_wndSplines.AddString("Path"); for (i = 0; i < g_splineList->numTargets(); i++) { m_wndSplines.AddString(g_splineList->getActiveTarget(i)->getName()); } m_wndSplines.SetCurSel(0); m_fSeconds = g_splineList->getBaseTime(); m_wndSegments.SetScrollRange(0, g_splineList->getTotalTime() * 4.0); m_wndEvents.ResetContent(); for (i = 0; i < g_splineList->numEvents(); i++) { str = va("%s\t%s", g_splineList->getEvent(i)->typeStr(), g_splineList->getEvent(i)->getParam()); m_wndEvents.AddString(str); } //m_currentSegment = g_splineList->getActiveSegment(); //m_numSegments = g_splineList->numSegments(); } g_splineList->startEdit(true); UpdateData(FALSE); } BOOL CDlgCamera::OnInitDialog() { CDialog::OnInitDialog(); setupFromCamera(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDlgCamera::OnOK() { g_dlgCamera.ShowWindow(SW_HIDE); clearSelection(); g_splineList->stopEdit(); Sys_UpdateWindows(W_ALL); } void CDlgCamera::OnDestroy() { if (GetSafeHwnd()) { CRect rct; GetWindowRect(rct); SaveRegistryInfo("Radiant::CameraInspector", &rct, sizeof(rct)); } CDialog::OnDestroy(); Sys_UpdateWindows(W_ALL); } void CDlgCamera::OnApply() { UpdateData(TRUE); g_splineList->setBaseTime(m_fSeconds); g_splineList->setName(m_strName); g_splineList->buildCamera(); m_wndSegments.SetScrollRange(0, g_splineList->getTotalTime() * 4.0); } void CDlgCamera::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { CDialog::OnHScroll(nSBCode, nPos, pScrollBar); int max = g_splineList->getTotalTime() * 4; if (max == 0) { max = 1; } int n = pScrollBar->GetScrollPos(); switch (nSBCode) { case SB_LINEUP : { n--; } break; case SB_LINEDOWN : { n++; } break; case SB_PAGEUP : { n -= (float)max * 0.10; } break; case SB_PAGEDOWN : { n += (float)max * 0.10; } break; case SB_THUMBPOSITION : { n = nPos; } break; case SB_THUMBTRACK : { n = nPos; } } // if (n < 0) { // n = 0; // } else if (n >= g_splineList->numSegments()) { // if (g_splineList->numSegments() == 0) { // g_splineList->buildCamera(); // } // n = g_splineList->numSegments() - 1; // } pScrollBar->SetScrollPos(n); if (m_trackCamera) { float p = (float)n / max; p *= g_splineList->getTotalTime() * 1000; g_splineList->startCamera(0); g_splineList->buildCamera(); vec3_t dir; float fov; g_splineList->getCameraInfo(p, g_pParentWnd->GetCamera()->Camera().origin, dir, &fov); g_pParentWnd->GetCamera()->Camera().angles[1] = atan2 (dir[1], dir[0])*180/3.14159; g_pParentWnd->GetCamera()->Camera().angles[0] = asin (dir[2])*180/3.14159; } UpdateData(FALSE); Sys_UpdateWindows(W_XY | W_CAMERA); } void CDlgCamera::OnFileNew() { g_splineList->clear(); g_qeglobals.selectObject = g_splineList->getPositionObj(); setupFromCamera(); Sys_UpdateWindows(W_ALL); } void CDlgCamera::OnFileOpen() { CNameDlg dlg("Open Camera File"); if (dlg.DoModal() == IDOK) { g_splineList->clear(); g_qeglobals.selectObject = g_splineList->getPositionObj(); g_splineList->load(va("%s.camera", dlg.m_strName)); setupFromCamera(); Sys_UpdateWindows(W_ALL); } } void CDlgCamera::OnFileSave() { CNameDlg dlg("Save Camera File"); if (dlg.DoModal() == IDOK) { g_splineList->save(va("%s.camera", dlg.m_strName)); } } void CDlgCamera::OnTestcamera() { // TODO: Add your control notification handler code here } void CDlgCamera::OnBtnDeletepoints() { // TODO: Add your control notification handler code here } void CDlgCamera::OnBtnSelectall() { // TODO: Add your control notification handler code here } void CDlgCamera::OnRadioEditpoints() { UpdateData(TRUE); g_qeglobals.d_select_mode = sel_editpoint; } void CDlgCamera::OnRadioAddPoints() { UpdateData(TRUE); g_qeglobals.d_select_mode = sel_addpoint; }