dlgcamera.cpp (10145B)
1 /* 2 =========================================================================== 3 Copyright (C) 1999-2005 Id Software, Inc. 4 5 This file is part of Quake III Arena source code. 6 7 Quake III Arena source code is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 2 of the License, 10 or (at your option) any later version. 11 12 Quake III Arena source code is distributed in the hope that it will be 13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with Foobar; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 20 =========================================================================== 21 */ 22 // DlgCamera.cpp : implementation file 23 // 24 25 #include "stdafx.h" 26 #include "DlgCamera.h" 27 #include "DlgEvent.h" 28 #include "NameDlg.h" 29 #include "splines/splines.h" 30 #include "CameraTargetDlg.h" 31 32 #ifdef _DEBUG 33 #define new DEBUG_NEW 34 #undef THIS_FILE 35 static char THIS_FILE[] = __FILE__; 36 #endif 37 38 CDlgCamera g_dlgCamera; 39 40 /* 41 ============ 42 va 43 44 does a varargs printf into a temp buffer, so I don't need to have 45 varargs versions of all text functions. 46 FIXME: make this buffer size safe someday 47 ============ 48 */ 49 char *va( char *format, ... ) { 50 va_list argptr; 51 static char string[2][32000]; // in case va is called by nested functions 52 static int index = 0; 53 char *buf; 54 55 buf = string[index & 1]; 56 index++; 57 58 va_start (argptr, format); 59 vsprintf (buf, format,argptr); 60 va_end (argptr); 61 62 return buf; 63 } 64 65 66 void showCameraInspector() { 67 if (g_dlgCamera.GetSafeHwnd() == NULL) { 68 g_dlgCamera.Create(IDD_DLG_CAMERA); 69 CRect rct; 70 LONG lSize = sizeof(rct); 71 if (LoadRegistryInfo("Radiant::CameraInspector", &rct, &lSize)) { 72 g_dlgCamera.SetWindowPos(NULL, rct.left, rct.top, 0,0, SWP_NOSIZE | SWP_SHOWWINDOW); 73 } 74 Sys_UpdateWindows(W_ALL); 75 } 76 g_dlgCamera.ShowWindow(SW_SHOW); 77 g_dlgCamera.setupFromCamera(); 78 } 79 ///////////////////////////////////////////////////////////////////////////// 80 // CDlgCamera dialog 81 82 83 CDlgCamera::CDlgCamera(CWnd* pParent /*=NULL*/) 84 : CDialog(CDlgCamera::IDD, pParent) 85 { 86 //{{AFX_DATA_INIT(CDlgCamera) 87 m_strName = _T(""); 88 m_fSeconds = 0.0f; 89 m_trackCamera = TRUE; 90 m_numSegments = 0; 91 m_currentSegment = 0; 92 m_strType = _T(""); 93 m_editPoints = 0; 94 //}}AFX_DATA_INIT 95 } 96 97 98 void CDlgCamera::DoDataExchange(CDataExchange* pDX) 99 { 100 CDialog::DoDataExchange(pDX); 101 //{{AFX_DATA_MAP(CDlgCamera) 102 DDX_Control(pDX, IDC_SCROLLBAR_SEGMENT, m_wndSegments); 103 DDX_Control(pDX, IDC_LIST_EVENTS, m_wndEvents); 104 DDX_Control(pDX, IDC_COMBO_SPLINES, m_wndSplines); 105 DDX_Text(pDX, IDC_EDIT_CAM_NAME, m_strName); 106 DDX_Text(pDX, IDC_EDIT_LENGTH, m_fSeconds); 107 DDX_Check(pDX, IDC_CHECK_TRACKCAMERA, m_trackCamera); 108 DDX_Text(pDX, IDC_EDIT_TOTALSEGMENTS, m_numSegments); 109 DDX_Text(pDX, IDC_EDIT_SEGMENT, m_currentSegment); 110 DDX_Text(pDX, IDC_EDIT_TYPE, m_strType); 111 DDX_Radio(pDX, IDC_RADIO_EDITPOINTS, m_editPoints); 112 //}}AFX_DATA_MAP 113 } 114 115 116 BEGIN_MESSAGE_MAP(CDlgCamera, CDialog) 117 //{{AFX_MSG_MAP(CDlgCamera) 118 ON_BN_CLICKED(IDC_BTN_ADDEVENT, OnBtnAddevent) 119 ON_BN_CLICKED(IDC_BTN_ADDTARGET, OnBtnAddtarget) 120 ON_BN_CLICKED(IDC_BTN_DELEVENT, OnBtnDelevent) 121 ON_CBN_DBLCLK(IDC_COMBO_SPLINES, OnDblclkComboSplines) 122 ON_CBN_SELCHANGE(IDC_COMBO_SPLINES, OnSelchangeComboSplines) 123 ON_LBN_SELCHANGE(IDC_LIST_EVENTS, OnSelchangeListEvents) 124 ON_LBN_DBLCLK(IDC_LIST_EVENTS, OnDblclkListEvents) 125 ON_WM_DESTROY() 126 ON_BN_CLICKED(IDAPPLY, OnApply) 127 ON_WM_HSCROLL() 128 ON_BN_CLICKED(ID_FILE_NEW, OnFileNew) 129 ON_BN_CLICKED(ID_FILE_OPEN, OnFileOpen) 130 ON_BN_CLICKED(ID_FILE_SAVE, OnFileSave) 131 ON_BN_CLICKED(ID_TESTCAMERA, OnTestcamera) 132 ON_BN_CLICKED(IDC_BTN_DELETEPOINTS, OnBtnDeletepoints) 133 ON_BN_CLICKED(IDC_BTN_SELECTALL, OnBtnSelectall) 134 ON_BN_CLICKED(IDC_RADIO_EDITPOINTS, OnRadioEditpoints) 135 ON_BN_CLICKED(IDC_RADIO_EDITPOINTS2, OnRadioAddPoints) 136 //}}AFX_MSG_MAP 137 END_MESSAGE_MAP() 138 139 ///////////////////////////////////////////////////////////////////////////// 140 // CDlgCamera message handlers 141 142 void CDlgCamera::OnBtnAddevent() 143 { 144 CDlgEvent dlg; 145 if (dlg.DoModal() == IDOK) { 146 long n = m_wndSegments.GetScrollPos() / 4 * 1000; 147 g_splineList->addEvent(static_cast<idCameraEvent::eventType>(dlg.m_event+1), dlg.m_strParm, n); 148 setupFromCamera(); 149 } 150 } 151 152 void CDlgCamera::OnBtnAddtarget() 153 { 154 CCameraTargetDlg dlg; 155 if (dlg.DoModal() == IDOK) { 156 g_splineList->addTarget(dlg.m_strName, static_cast<idCameraPosition::positionType>(dlg.m_nType)); 157 setupFromCamera(); 158 m_wndSplines.SetCurSel(g_splineList->numTargets()); 159 OnSelchangeComboSplines(); 160 OnRadioAddPoints(); 161 } 162 } 163 164 void CDlgCamera::OnBtnDelevent() 165 { 166 // TODO: Add your control notification handler code here 167 168 } 169 170 void CDlgCamera::OnBtnDeltarget() 171 { 172 // TODO: Add your control notification handler code here 173 174 } 175 176 void CDlgCamera::OnDblclkComboSplines() 177 { 178 // TODO: Add your control notification handler code here 179 180 } 181 182 void CDlgCamera::OnSelchangeComboSplines() 183 { 184 UpdateData(TRUE); 185 g_qeglobals.d_select_mode = (m_editPoints == 0) ? sel_editpoint : sel_addpoint; 186 g_qeglobals.d_numpoints = 0; 187 g_qeglobals.d_num_move_points = 0; 188 int i = m_wndSplines.GetCurSel(); 189 if (i > 0) { 190 g_splineList->setActiveTarget(i-1); 191 g_qeglobals.selectObject = g_splineList->getActiveTarget(i-1); 192 g_splineList->startEdit(false); 193 } else { 194 g_splineList->startEdit(true); 195 g_qeglobals.selectObject = g_splineList->getPositionObj(); 196 } 197 198 // * 4.0 to set increments in quarter seconds 199 m_wndSegments.SetScrollRange(0, g_splineList->getTotalTime() * 4.0); 200 201 Sys_UpdateWindows(W_ALL); 202 } 203 204 void CDlgCamera::OnSelchangeListEvents() 205 { 206 int sel = m_wndEvents.GetCurSel(); 207 //g_splineList->setActiveSegment(sel >= 0 ? sel : 0); 208 } 209 210 void CDlgCamera::OnDblclkListEvents() 211 { 212 // TODO: Add your control notification handler code here 213 214 } 215 216 void CDlgCamera::setupFromCamera() 217 { 218 if (m_wndSplines.GetSafeHwnd()) { 219 int i; 220 idStr str; 221 m_strName = g_splineList->getName(); 222 m_strType = g_splineList->getPositionObj()->typeStr(); 223 m_wndSplines.ResetContent(); 224 m_wndSplines.AddString("Path"); 225 for (i = 0; i < g_splineList->numTargets(); i++) { 226 m_wndSplines.AddString(g_splineList->getActiveTarget(i)->getName()); 227 } 228 m_wndSplines.SetCurSel(0); 229 m_fSeconds = g_splineList->getBaseTime(); 230 m_wndSegments.SetScrollRange(0, g_splineList->getTotalTime() * 4.0); 231 232 m_wndEvents.ResetContent(); 233 for (i = 0; i < g_splineList->numEvents(); i++) { 234 str = va("%s\t%s", g_splineList->getEvent(i)->typeStr(), g_splineList->getEvent(i)->getParam()); 235 m_wndEvents.AddString(str); 236 } 237 //m_currentSegment = g_splineList->getActiveSegment(); 238 //m_numSegments = g_splineList->numSegments(); 239 } 240 g_splineList->startEdit(true); 241 UpdateData(FALSE); 242 } 243 244 BOOL CDlgCamera::OnInitDialog() 245 { 246 CDialog::OnInitDialog(); 247 setupFromCamera(); 248 return TRUE; // return TRUE unless you set the focus to a control 249 // EXCEPTION: OCX Property Pages should return FALSE 250 } 251 252 void CDlgCamera::OnOK() 253 { 254 g_dlgCamera.ShowWindow(SW_HIDE); 255 clearSelection(); 256 g_splineList->stopEdit(); 257 Sys_UpdateWindows(W_ALL); 258 } 259 260 void CDlgCamera::OnDestroy() 261 { 262 if (GetSafeHwnd()) { 263 CRect rct; 264 GetWindowRect(rct); 265 SaveRegistryInfo("Radiant::CameraInspector", &rct, sizeof(rct)); 266 } 267 CDialog::OnDestroy(); 268 Sys_UpdateWindows(W_ALL); 269 } 270 271 272 void CDlgCamera::OnApply() 273 { 274 UpdateData(TRUE); 275 g_splineList->setBaseTime(m_fSeconds); 276 g_splineList->setName(m_strName); 277 g_splineList->buildCamera(); 278 m_wndSegments.SetScrollRange(0, g_splineList->getTotalTime() * 4.0); 279 } 280 281 void CDlgCamera::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 282 { 283 CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 284 int max = g_splineList->getTotalTime() * 4; 285 if (max == 0) { 286 max = 1; 287 } 288 int n = pScrollBar->GetScrollPos(); 289 switch (nSBCode) { 290 case SB_LINEUP : { 291 n--; 292 } 293 break; 294 case SB_LINEDOWN : { 295 n++; 296 } 297 break; 298 case SB_PAGEUP : { 299 n -= (float)max * 0.10; 300 } 301 break; 302 case SB_PAGEDOWN : { 303 n += (float)max * 0.10; 304 } 305 break; 306 case SB_THUMBPOSITION : { 307 n = nPos; 308 } 309 break; 310 case SB_THUMBTRACK : { 311 n = nPos; 312 } 313 } 314 // if (n < 0) { 315 // n = 0; 316 // } else if (n >= g_splineList->numSegments()) { 317 // if (g_splineList->numSegments() == 0) { 318 // g_splineList->buildCamera(); 319 // } 320 // n = g_splineList->numSegments() - 1; 321 // } 322 pScrollBar->SetScrollPos(n); 323 if (m_trackCamera) { 324 float p = (float)n / max; 325 p *= g_splineList->getTotalTime() * 1000; 326 g_splineList->startCamera(0); 327 g_splineList->buildCamera(); 328 vec3_t dir; 329 float fov; 330 g_splineList->getCameraInfo(p, g_pParentWnd->GetCamera()->Camera().origin, dir, &fov); 331 g_pParentWnd->GetCamera()->Camera().angles[1] = atan2 (dir[1], dir[0])*180/3.14159; 332 g_pParentWnd->GetCamera()->Camera().angles[0] = asin (dir[2])*180/3.14159; 333 334 } 335 UpdateData(FALSE); 336 Sys_UpdateWindows(W_XY | W_CAMERA); 337 } 338 339 void CDlgCamera::OnFileNew() 340 { 341 g_splineList->clear(); 342 g_qeglobals.selectObject = g_splineList->getPositionObj(); 343 setupFromCamera(); 344 Sys_UpdateWindows(W_ALL); 345 } 346 347 void CDlgCamera::OnFileOpen() 348 { 349 CNameDlg dlg("Open Camera File"); 350 if (dlg.DoModal() == IDOK) { 351 g_splineList->clear(); 352 g_qeglobals.selectObject = g_splineList->getPositionObj(); 353 g_splineList->load(va("%s.camera", dlg.m_strName)); 354 setupFromCamera(); 355 Sys_UpdateWindows(W_ALL); 356 } 357 } 358 359 void CDlgCamera::OnFileSave() 360 { 361 CNameDlg dlg("Save Camera File"); 362 if (dlg.DoModal() == IDOK) { 363 g_splineList->save(va("%s.camera", dlg.m_strName)); 364 } 365 } 366 367 void CDlgCamera::OnTestcamera() 368 { 369 // TODO: Add your control notification handler code here 370 371 } 372 373 void CDlgCamera::OnBtnDeletepoints() 374 { 375 // TODO: Add your control notification handler code here 376 377 } 378 379 void CDlgCamera::OnBtnSelectall() 380 { 381 // TODO: Add your control notification handler code here 382 383 } 384 385 void CDlgCamera::OnRadioEditpoints() 386 { 387 UpdateData(TRUE); 388 g_qeglobals.d_select_mode = sel_editpoint; 389 } 390 391 void CDlgCamera::OnRadioAddPoints() 392 { 393 UpdateData(TRUE); 394 g_qeglobals.d_select_mode = sel_addpoint; 395 }