home *** CD-ROM | disk | FTP | other *** search
- /*
- Company: Sensaura Ltd
- Copyright: (C) 1999
-
- File Name: lstnrdlg.cpp
- File Description: Source file for implementation of ListenerDlg class
- Author: Adam Philp
- Last Update: 22-DEC-99
-
- Target Compiler: Microsoft Visual C++ Version 5.0
- */
-
- /////////////////////// Included files ////////////////////////////////////////////////////////////
-
- #include <windows.h>
- #include <commctrl.h>
- #include <stdio.h>
-
- #include "lstnrdlg.h" // ListenerDlg class declaration
- #include "directx.h"
- #include "debug.h" // Debugging support macros and functions
- #include "resource.h" // Resources
-
- /////////////////////// Definitions ///////////////////////////////////////////////////////////////
-
- #define XYZ_SLIDER_MAX 100
- #define XYZ_SLIDER_MIN (-XYZ_SLIDER_MAX)
- #define FACTOR_SLIDER_MAX 100
- #define FACTOR_SLIDER_MIN 0
- #define FACTOR_SLIDER_TIC 10
-
- /////////////////////// Constants /////////////////////////////////////////////////////////////////
-
- DS3DLISTENER DefaultListener =
- {
- sizeof ( DS3DLISTENER ), /* dwSize */
- { 0.0f, 0.0f, 0.0f }, /* vPosition */
- { 0.0f, 0.0f, 0.0f }, /* vVelocity */
- { 0.0f, 0.0f, 1.0f }, /* vOrientFront */
- { 0.0f, 1.0f, 0.0f }, /* vOrientTop */
- DS3D_DEFAULTDISTANCEFACTOR, /* flDistanceFactor */
- DS3D_DEFAULTROLLOFFFACTOR, /* flRolloffFactor */
- DS3D_DEFAULTDOPPLERFACTOR /* flDopplerFactor */
- };
-
- /////////////////////// ListenerDlg class implementation //////////////////////////////////////////
-
- ListenerDlg::ListenerDlg()
- {
- PTRACE("ListenerDlg::ListenerDlg()");
-
- m_hWnd = NULL;
- m_hInstance = NULL;
- m_pListener = NULL;
-
- m_hDistanceSlider = m_hDopplerSlider = m_hRolloffSlider = NULL;
- m_hDistanceStatic = m_hDopplerStatic = m_hRolloffStatic = NULL;
- m_hXSlider = m_hYSlider = m_hZSlider = NULL;
- m_hXStatic = m_hYStatic = m_hZStatic = NULL;
- m_hFrontXSlider = m_hFrontYSlider = m_hFrontZSlider = NULL;
- m_hFrontXStatic = m_hFrontYStatic = m_hFrontZStatic = NULL;
- m_hTopXSlider = m_hTopYSlider = m_hTopZSlider = NULL;
- m_hTopXStatic = m_hTopYStatic = m_hTopZStatic = NULL;
- m_hImmediateBtn = m_hDeferredBtn = NULL;
- m_hCommitBtn = m_hDefaultBtn = NULL;
-
- m_dwApply = DS3D_IMMEDIATE;
- }
-
- ListenerDlg::~ListenerDlg()
- {
- PTRACE("ListenerDlg::~ListenerDlg()");
-
- if(m_hWnd)
- {
- DestroyWindow(m_hWnd);
- m_hWnd = NULL;
- }
- m_hInstance = NULL;
- m_pListener = NULL;
- }
-
- /////////////////////// ListenerDlg public member functions ///////////////////////////////////////
-
- bool ListenerDlg::Create(Application* pApp, LPDIRECTSOUND3DLISTENER pListener)
- {
- char str[100];
-
- PTRACE("ListenerDlg::Create()");
-
- ASSERT(m_hWnd == NULL);
- if(m_hWnd != NULL)
- {
- MessageBox(NULL, "Listener dialog already created", pApp->GetName(), MB_OK|MB_ICONSTOP);
- return false;
- }
-
- m_pListener = pListener;
- m_hInstance = pApp->GetInstance();
- m_hWnd = CreateDialogParam(m_hInstance, MAKEINTRESOURCE(IDD_LISTENER),
- pApp->GetMainWindow()->m_hWnd,
- (DLGPROC)ListenerDlgProc, (LPARAM)this);
- if(m_hWnd == NULL)
- {
- MessageBox(NULL, "Cannot create listener dialog", pApp->GetName(), MB_OK|MB_ICONSTOP);
- return false;
- }
-
- LoadString(m_hInstance, IDS_LISTENERCAPTION, str, 99);
- SetWindowText(m_hWnd, str);
- pApp->GetMainWindow()->CascadeWindow(m_hWnd);
- ::ShowWindow(m_hWnd, SW_SHOW);
-
- PTRACE("ListenerDlg::Create() OK");
-
- return true;
- }
-
- /////////////////////// ListenerDlg protected member functions ////////////////////////////////////
-
- BOOL ListenerDlg::OnInitDialog(HWND hDlg, WPARAM)
- {
- m_hDistanceSlider = GetDlgItem(hDlg, IDC_DSLDISTANCE);
- m_hDopplerSlider = GetDlgItem(hDlg, IDC_DSLDOPPLER);
- m_hRolloffSlider = GetDlgItem(hDlg, IDC_DSLROLLOFF);
- m_hDistanceStatic = GetDlgItem(hDlg, IDC_DSLDISTANCESTATIC);
- m_hDopplerStatic = GetDlgItem(hDlg, IDC_DSLDOPPLERSTATIC);
- m_hRolloffStatic = GetDlgItem(hDlg, IDC_DSLROLLOFFSTATIC);
- m_hXSlider = GetDlgItem(hDlg, IDC_DSLPOSITIONX);
- m_hYSlider = GetDlgItem(hDlg, IDC_DSLPOSITIONY);
- m_hZSlider = GetDlgItem(hDlg, IDC_DSLPOSITIONZ);
- m_hXStatic = GetDlgItem(hDlg, IDC_DSLPOSITIONXSTATIC);
- m_hYStatic = GetDlgItem(hDlg, IDC_DSLPOSITIONYSTATIC);
- m_hZStatic = GetDlgItem(hDlg, IDC_DSLPOSITIONZSTATIC);
- m_hFrontXSlider = GetDlgItem(hDlg, IDC_DSLFRONTX);
- m_hFrontYSlider = GetDlgItem(hDlg, IDC_DSLFRONTY);
- m_hFrontZSlider = GetDlgItem(hDlg, IDC_DSLFRONTZ);
- m_hFrontXStatic = GetDlgItem(hDlg, IDC_DSLFRONTXSTATIC);
- m_hFrontYStatic = GetDlgItem(hDlg, IDC_DSLFRONTYSTATIC);
- m_hFrontZStatic = GetDlgItem(hDlg, IDC_DSLFRONTZSTATIC);
- m_hTopXSlider = GetDlgItem(hDlg, IDC_DSLTOPX);
- m_hTopYSlider = GetDlgItem(hDlg, IDC_DSLTOPY);
- m_hTopZSlider = GetDlgItem(hDlg, IDC_DSLTOPZ);
- m_hTopXStatic = GetDlgItem(hDlg, IDC_DSLTOPXSTATIC);
- m_hTopYStatic = GetDlgItem(hDlg, IDC_DSLTOPYSTATIC);
- m_hTopZStatic = GetDlgItem(hDlg, IDC_DSLTOPZSTATIC);
- m_hImmediateBtn = GetDlgItem(hDlg, IDC_DSLIMMEDIATE);
- m_hDeferredBtn = GetDlgItem(hDlg, IDC_DSLDEFERRED);
- m_hCommitBtn = GetDlgItem(hDlg, IDC_DSLCOMMIT);
- m_hDefaultBtn = GetDlgItem(hDlg, IDC_DSLDEFAULT);
-
- SendMessage(m_hDistanceSlider, TBM_SETRANGE, (WPARAM)FALSE, (LPARAM)MAKELONG(FACTOR_SLIDER_MIN, FACTOR_SLIDER_MAX));
- SendMessage(m_hDistanceSlider, TBM_SETTICFREQ, (WPARAM)FACTOR_SLIDER_TIC, 0);
- SendMessage(m_hDopplerSlider, TBM_SETRANGE, (WPARAM)FALSE, (LPARAM)MAKELONG(FACTOR_SLIDER_MIN, FACTOR_SLIDER_MAX));
- SendMessage(m_hDopplerSlider, TBM_SETTICFREQ, (WPARAM)FACTOR_SLIDER_TIC, 0);
- SendMessage(m_hRolloffSlider, TBM_SETRANGE, (WPARAM)FALSE, (LPARAM)MAKELONG(FACTOR_SLIDER_MIN, FACTOR_SLIDER_MAX));
- SendMessage(m_hRolloffSlider, TBM_SETTICFREQ, (WPARAM)FACTOR_SLIDER_TIC, 0);
-
- SendMessage(m_hXSlider, TBM_SETRANGE, (WPARAM)FALSE, (LPARAM)MAKELONG(XYZ_SLIDER_MIN, XYZ_SLIDER_MAX));
- SendMessage(m_hXSlider, TBM_SETTICFREQ, (WPARAM)XYZ_SLIDER_MAX, 0);
- SendMessage(m_hYSlider, TBM_SETRANGE, (WPARAM)FALSE, (LPARAM)MAKELONG(XYZ_SLIDER_MIN, XYZ_SLIDER_MAX));
- SendMessage(m_hYSlider, TBM_SETTICFREQ, (WPARAM)XYZ_SLIDER_MAX, 0);
- SendMessage(m_hZSlider, TBM_SETRANGE, (WPARAM)FALSE, (LPARAM)MAKELONG(XYZ_SLIDER_MIN, XYZ_SLIDER_MAX));
- SendMessage(m_hZSlider, TBM_SETTICFREQ, (WPARAM)XYZ_SLIDER_MAX, 0);
-
- SendMessage(m_hFrontXSlider, TBM_SETRANGE, (WPARAM)FALSE, (LPARAM)MAKELONG(XYZ_SLIDER_MIN, XYZ_SLIDER_MAX));
- SendMessage(m_hFrontXSlider, TBM_SETTICFREQ, (WPARAM)XYZ_SLIDER_MAX, 0);
- SendMessage(m_hFrontYSlider, TBM_SETRANGE, (WPARAM)FALSE, (LPARAM)MAKELONG(XYZ_SLIDER_MIN, XYZ_SLIDER_MAX));
- SendMessage(m_hFrontYSlider, TBM_SETTICFREQ, (WPARAM)XYZ_SLIDER_MAX, 0);
- SendMessage(m_hFrontZSlider, TBM_SETRANGE, (WPARAM)FALSE, (LPARAM)MAKELONG(XYZ_SLIDER_MIN, XYZ_SLIDER_MAX));
- SendMessage(m_hFrontZSlider, TBM_SETTICFREQ, (WPARAM)XYZ_SLIDER_MAX, 0);
-
- SendMessage(m_hTopXSlider, TBM_SETRANGE, (WPARAM)FALSE, (LPARAM)MAKELONG(XYZ_SLIDER_MIN, XYZ_SLIDER_MAX));
- SendMessage(m_hTopXSlider, TBM_SETTICFREQ, (WPARAM)XYZ_SLIDER_MAX, 0);
- SendMessage(m_hTopYSlider, TBM_SETRANGE, (WPARAM)FALSE, (LPARAM)MAKELONG(XYZ_SLIDER_MIN, XYZ_SLIDER_MAX));
- SendMessage(m_hTopYSlider, TBM_SETTICFREQ, (WPARAM)XYZ_SLIDER_MAX, 0);
- SendMessage(m_hTopZSlider, TBM_SETRANGE, (WPARAM)FALSE, (LPARAM)MAKELONG(XYZ_SLIDER_MIN, XYZ_SLIDER_MAX));
- SendMessage(m_hTopZSlider, TBM_SETTICFREQ, (WPARAM)XYZ_SLIDER_MAX, 0);
-
- InitControls(hDlg);
- return TRUE;
- }
-
- BOOL ListenerDlg::OnCommand(WPARAM wParam, LPARAM/* lParam*/)
- {
- if(HIWORD(wParam) == BN_CLICKED)
- {
- switch(LOWORD(wParam))
- {
- case IDC_DSLIMMEDIATE:
- EnableWindow(m_hCommitBtn, FALSE);
- m_dwApply = DS3D_IMMEDIATE;
- break;
-
- case IDC_DSLDEFERRED:
- EnableWindow(m_hCommitBtn, TRUE);
- m_dwApply = DS3D_DEFERRED;
- break;
-
- case IDC_DSLCOMMIT:
- m_pListener->CommitDeferredSettings();
- InitControls(m_hWnd);
- EnableWindow(m_hCommitBtn, m_dwApply == DS3D_DEFERRED ? TRUE : FALSE);
- break;
-
- case IDC_DSLDEFAULT:
- m_pListener->SetAllParameters(&DefaultListener, DS3D_IMMEDIATE);
- InitControls(m_hWnd);
- break;
- }
- }
-
- return FALSE;
- }
-
- BOOL ListenerDlg::OnHScroll(WORD wNotifyCode, LONG lPos, HWND hwndCtl)
- {
- int id;
-
- ASSERT(hwndCtl);
- id = GetDlgCtrlID(hwndCtl);
- switch(id)
- {
- case IDC_DSLDISTANCE:
- case IDC_DSLDOPPLER:
- case IDC_DSLROLLOFF:
- SetFactors();
- break;
-
- case IDC_DSLPOSITIONX:
- case IDC_DSLPOSITIONY:
- case IDC_DSLPOSITIONZ:
- SetPosition();
- break;
-
- case IDC_DSLFRONTX:
- case IDC_DSLFRONTY:
- case IDC_DSLFRONTZ:
- case IDC_DSLTOPX:
- case IDC_DSLTOPY:
- case IDC_DSLTOPZ:
- SetOrientation();
- break;
- }
- return TRUE;
- }
-
- void ListenerDlg::OnDestroy()
- {
- }
-
- BOOL CALLBACK ListenerDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
- ListenerDlg* pDlg;
-
- switch(message)
- {
- case WM_INITDIALOG:
- PTRACE("ListenerDlgProc():WM_INITDIALOG");
-
- ASSERT(lParam != NULL);
- pDlg = (ListenerDlg*)lParam;
- SetWindowLong(hDlg, DWL_USER, (LONG)pDlg);
-
- if(!pDlg->OnInitDialog(hDlg, wParam))
- DestroyWindow(hDlg);
- return TRUE;
-
- case WM_HSCROLL:
- PTRACE("ListenerDlgProc():WM_HSCROLL");
- pDlg = (ListenerDlg*)GetWindowLong(hDlg, DWL_USER);
- ASSERT(pDlg != NULL);
- return !pDlg->OnHScroll(LOWORD(wParam), (LONG)HIWORD(wParam), (HWND)lParam);
-
- case WM_COMMAND:
- PTRACE("ListenerDlgProc():WM_COMMAND");
- pDlg = (ListenerDlg*)GetWindowLong(hDlg, DWL_USER);
- // It's possible to get child notifications before the
- // INITDIALOG message, so we'll handle a NULL class item
- // here a less stringently
- if(!pDlg)
- return FALSE;
- return !pDlg->OnCommand(wParam, lParam);
-
- case WM_DESTROY:
- PTRACE("ListenerDlgProc():WM_DESTROY");
- pDlg = (ListenerDlg*)GetWindowLong(hDlg, DWL_USER);
- ASSERT(pDlg != NULL);
- pDlg->OnDestroy();
- return TRUE;
-
- default:
- return FALSE;
- }
- }
-
- BOOL ListenerDlg::InitControls(HWND hWnd)
- {
- DS3DLISTENER listener;
-
- PTRACE("ListenerDlg():InitControls()");
- listener.dwSize = sizeof(DS3DLISTENER);
- TRY_DS(m_pListener->GetAllParameters(&listener))
-
- SendMessage(m_hDistanceSlider, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(listener.flDistanceFactor*10.0f));
- SendMessage(m_hDopplerSlider, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(listener.flDopplerFactor*10.0f));
- SendMessage(m_hRolloffSlider, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(listener.flRolloffFactor*10.0f));
-
- SendMessage(m_hXSlider, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)listener.vPosition.x);
- SendMessage(m_hYSlider, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)listener.vPosition.y);
- SendMessage(m_hZSlider, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)listener.vPosition.z);
-
- SendMessage(m_hFrontXSlider, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(listener.vOrientFront.x*XYZ_SLIDER_MAX));
- SendMessage(m_hFrontYSlider, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(listener.vOrientFront.y*XYZ_SLIDER_MAX));
- SendMessage(m_hFrontZSlider, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(listener.vOrientFront.z*XYZ_SLIDER_MAX));
- SendMessage(m_hTopXSlider, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(listener.vOrientTop.x*XYZ_SLIDER_MAX));
- SendMessage(m_hTopYSlider, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(listener.vOrientTop.y*XYZ_SLIDER_MAX));
- SendMessage(m_hTopZSlider, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(listener.vOrientTop.z*XYZ_SLIDER_MAX));
-
- if(m_dwApply == DS3D_IMMEDIATE)
- {
- CheckRadioButton(hWnd, IDC_DSLIMMEDIATE, IDC_DSLDEFERRED, IDC_DSLIMMEDIATE);
- EnableWindow(m_hCommitBtn, FALSE);
- }
- else
- {
- CheckRadioButton(hWnd, IDC_DSLIMMEDIATE, IDC_DSLDEFERRED, IDC_DSLDEFERRED);
- EnableWindow(m_hCommitBtn, TRUE);
- }
-
- SetFactorStatics();
- SetPositionStatics();
- SetOrientationStatics();
-
- return TRUE;
-
- DS_ERROR:
- return FALSE;
- }
-
- void ListenerDlg::SetFactors()
- {
- D3DVALUE flFactor;
-
- flFactor = (D3DVALUE)SendMessage(m_hDistanceSlider, TBM_GETPOS, 0, 0)/10.0f;
- if(flFactor < 0.1f)
- flFactor = 0.1f;
-
- m_pListener->SetDistanceFactor(flFactor, m_dwApply);
- flFactor = (D3DVALUE)SendMessage(m_hDopplerSlider, TBM_GETPOS, 0, 0)/10.0f;
- m_pListener->SetDopplerFactor(flFactor, m_dwApply);
- flFactor = (D3DVALUE)SendMessage(m_hRolloffSlider, TBM_GETPOS, 0, 0)/10.0f;
- m_pListener->SetRolloffFactor(flFactor, m_dwApply);
-
- SetFactorStatics();
- }
-
- void ListenerDlg::SetPosition()
- {
- D3DVECTOR pos;
-
- pos.x = (D3DVALUE)SendMessage(m_hXSlider, TBM_GETPOS, 0, 0);
- pos.y = (D3DVALUE)SendMessage(m_hYSlider, TBM_GETPOS, 0, 0);
- pos.z = (D3DVALUE)SendMessage(m_hZSlider, TBM_GETPOS, 0, 0);
-
- m_pListener->SetPosition(pos.x, pos.y, pos.z, m_dwApply);
- SetPositionStatics();
- }
-
- void ListenerDlg::SetOrientation()
- {
- D3DVECTOR front;
- D3DVECTOR top;
-
- front.x = (D3DVALUE)SendMessage(m_hFrontXSlider, TBM_GETPOS, 0, 0);
- front.y = (D3DVALUE)SendMessage(m_hFrontYSlider, TBM_GETPOS, 0, 0);
- front.z = (D3DVALUE)SendMessage(m_hFrontZSlider, TBM_GETPOS, 0, 0);
- top.x = (D3DVALUE)SendMessage(m_hTopXSlider, TBM_GETPOS, 0, 0);
- top.y = (D3DVALUE)SendMessage(m_hTopYSlider, TBM_GETPOS, 0, 0);
- top.z = (D3DVALUE)SendMessage(m_hTopZSlider, TBM_GETPOS, 0, 0);
-
- m_pListener->SetOrientation(front.x/XYZ_SLIDER_MAX, front.y/XYZ_SLIDER_MAX, front.z/XYZ_SLIDER_MAX,
- top.x/XYZ_SLIDER_MAX, top.y/XYZ_SLIDER_MAX, top.z/XYZ_SLIDER_MAX,
- DS3D_DEFERRED);
- EnableWindow(m_hCommitBtn, TRUE);
- SetOrientationStatics();
- }
-
- void ListenerDlg::SetFactorStatics()
- {
- D3DVALUE flFactor;
- char str[20];
-
- flFactor = (D3DVALUE)SendMessage(m_hDistanceSlider, TBM_GETPOS, 0, 0)/10.0f;
- if(flFactor < 0.1f)
- flFactor = 0.1f;
- sprintf(str, "Distance:%.1f", flFactor);
- SetWindowText(m_hDistanceStatic, str);
-
- flFactor = (D3DVALUE)SendMessage(m_hDopplerSlider, TBM_GETPOS, 0, 0)/10.0f;
- sprintf(str, "Doppler:%.1f", flFactor);
- SetWindowText(m_hDopplerStatic, str);
-
- flFactor = (D3DVALUE)SendMessage(m_hRolloffSlider, TBM_GETPOS, 0, 0)/10.0f;
- sprintf(str, "Rolloff:%.1f", flFactor);
- SetWindowText(m_hRolloffStatic, str);
- }
-
- void ListenerDlg::SetPositionStatics()
- {
- D3DVECTOR pos;
- char str[20];
-
- pos.x = (D3DVALUE)SendMessage(m_hXSlider, TBM_GETPOS, 0, 0);
- pos.y = (D3DVALUE)SendMessage(m_hYSlider, TBM_GETPOS, 0, 0);
- pos.z = (D3DVALUE)SendMessage(m_hZSlider, TBM_GETPOS, 0, 0);
-
- sprintf(str, "X:%.0f", pos.x);
- SetWindowText(m_hXStatic, str);
- sprintf(str, "Y:%.0f", pos.y);
- SetWindowText(m_hYStatic, str);
- sprintf(str, "Z:%.0f", pos.z);
- SetWindowText(m_hZStatic, str);
- }
-
- void ListenerDlg::SetOrientationStatics()
- {
- D3DVECTOR front, top;
- char str[20];
-
- front.x = (D3DVALUE)SendMessage(m_hFrontXSlider, TBM_GETPOS, 0, 0);
- front.y = (D3DVALUE)SendMessage(m_hFrontYSlider, TBM_GETPOS, 0, 0);
- front.z = (D3DVALUE)SendMessage(m_hFrontZSlider, TBM_GETPOS, 0, 0);
- top.x = (D3DVALUE)SendMessage(m_hTopXSlider, TBM_GETPOS, 0, 0);
- top.y = (D3DVALUE)SendMessage(m_hTopYSlider, TBM_GETPOS, 0, 0);
- top.z = (D3DVALUE)SendMessage(m_hTopZSlider, TBM_GETPOS, 0, 0);
-
- sprintf(str, "X:%.2f", front.x/XYZ_SLIDER_MAX);
- SetWindowText(m_hFrontXStatic, str);
- sprintf(str, "Y:%.2f", front.y/XYZ_SLIDER_MAX);
- SetWindowText(m_hFrontYStatic, str);
- sprintf(str, "Z:%.2f", front.z/XYZ_SLIDER_MAX);
- SetWindowText(m_hFrontZStatic, str);
-
- sprintf(str, "X:%.2f", top.x/XYZ_SLIDER_MAX);
- SetWindowText(m_hTopXStatic, str);
- sprintf(str, "Y:%.2f", top.y/XYZ_SLIDER_MAX);
- SetWindowText(m_hTopYStatic, str);
- sprintf(str, "Z:%.2f", top.z/XYZ_SLIDER_MAX);
- SetWindowText(m_hTopZStatic, str);
- }
-
-