https://github.com/id-Software/Quake-III-Arena
Tip revision: dbe4ddb10315479fc00086f08e25d968b4b43c49 authored by Travis Bradshaw on 31 January 2012, 19:41:34 UTC
The Quake III Arena sources as originally released under the GPL license on August 20, 2005.
The Quake III Arena sources as originally released under the GPL license on August 20, 2005.
Tip revision: dbe4ddb
dlgcamera.cpp
/*
===========================================================================
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<idCameraEvent::eventType>(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<idCameraPosition::positionType>(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;
}