Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

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 }