Descent3/legacy/D3Launch/VideoTab.cpp
JeodC a4ab78192c Join license header with historical commentrs
Join the license header with historical comments using a separator so IDEs can correctly parse the initial header.

Also use .gitattributes to ensure all files are LF.
2024-05-08 14:41:19 -04:00

442 lines
11 KiB
C++

/*
* Descent 3
* Copyright (C) 2024 Parallax Software
*
* This program 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 3 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
--- HISTORICAL COMMENTS FOLLOW ---
* $Logfile: /DescentIII/Main/D3Launch/VideoTab.cpp $
* $Revision: 1.1.1.1 $
* $Date: 2003-08-26 03:56:51 $
* $Author: kevinb $
*
*
*
* $Log: not supported by cvs2svn $
*
* 18 5/19/99 12:29p Nate
* Fixed openGL crash, changed Network speed default, changed OpenGL
* detection to default to unchecked, and removed config file parsing from
* US version
*
* 17 4/26/99 11:38a Nate
* Added warning message for opengl or direct3d renderer selection when
* user has glide as an option.
*
* 16 3/02/99 5:46p Nate
* Lots of little changes/fixes
*
* 15 2/05/99 3:51p Nate
* Added conditional compilation directives for OEM support
*
* 14 10/19/98 9:03a Nate
* Video tab now only auto-detects when "None selected"
*
* 13 10/13/98 3:03p Nate
* More fixes and changes.
*
* 12 10/12/98 7:13p Nate
* Fixed several bugs.
*
* 11 10/10/98 4:05p Nate
* Added detection/scanning window messages
*
* 10 10/08/98 6:23p Nate
* Fixed a few bugs.
*
* 9 9/22/98 3:33p Nate
* Added conditional compiling to help system (can toggle between HTML and
* standard windows help)
*
* 8 9/21/98 5:40p Nate
* Incorporated the new HTML help system
*
* 7 9/02/98 9:48a Nate
* Fixed hardware accelerator display bug in the Speed Tab
*
* 6 9/01/98 7:15p Nate
* Major Revision #2
*
* 5 8/31/98 6:44p Nate
* Major Revision
*
* 4 8/10/98 10:44a Nate
* Added Language selection support
*
* 3 8/05/98 4:52p Nate
* Added registry reading and writing.
*
* 2 8/05/98 11:54a Nate
* Initial Version
*
* $NoKeywords: $
*/
// VideoTab.cpp : implementation file
//
#include "stdafx.h"
#include "afxpriv.h"
#include "afxext.h"
#include "D3Launch.h"
#include "VideoTab.h"
#include "3D_detect.h"
#include "PsTypes.h"
#include "OS_Config.h"
#include "VideoDetectDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CVideoTab * CurrentVideoTab = NULL;
BOOL VideoTabInitialized = FALSE;
/////////////////////////////////////////////////////////////////////////////
// CVideoTab property page
IMPLEMENT_DYNCREATE(CVideoTab, CPropertyPage)
CVideoTab::CVideoTab() : CPropertyPage(CVideoTab::IDD)
{
//{{AFX_DATA_INIT(CVideoTab)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
CurrentVideoTab = NULL;
}
CVideoTab::~CVideoTab()
{
CurrentVideoTab = NULL;
}
int CVideoTab::GetCurrentCard()
{
int current = m_videocard_list.GetCurSel();
if ( (current < 0) || (current>=Num_cards)) {
current = 0;
}
return current;
}
void CVideoTab::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CVideoTab)
DDX_Control(pDX, IDC_VIDEOCARD_LIST, m_videocard_list);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CVideoTab, CPropertyPage)
//{{AFX_MSG_MAP(CVideoTab)
ON_BN_CLICKED(IDC_VIDEOCARD_DETECT, OnVideocardDetect)
ON_MESSAGE(WM_COMMANDHELP,OnCommandHelp)
ON_WM_HELPINFO()
ON_CBN_SELCHANGE(IDC_VIDEOCARD_LIST, OnSelchangeVideocardList)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CVideoTab message handlers
extern HINSTANCE Dd_dll_handle;
void CVideoTab::OnVideocardDetect()
{
// TODO: Add your control notification handler code here
if(VideoCardsDetected) return;
#if (!defined(OEM_VOODOO3) || defined(USE_ALL_VIDEO_OPTIONS))
// Display the scan selection options to user
CVideoDetectDlg dlg;
dlg.DoModal();
#endif
// Set the wait cursor
CWaitCursor wc;
// Clear the box
m_videocard_list.ResetContent();
// Display the scanning window
m_MsgDlg.m_ScanningMsg.LoadString(IDS_VIDEOTAB_SCANNING);
m_MsgDlg.m_WaitMsg.LoadString(IDS_PLEASE_WAIT_MSG);
m_MsgDlg.Create(IDD_MSG_DLG,this);
m_MsgDlg.ShowWindow(SW_SHOW);
m_MsgDlg.UpdateData(FALSE);
#if (defined(OEM_VOODOO3) && !defined(USE_ALL_VIDEO_OPTIONS))
// Detect only 3dfx cards
detect_3dcards(0,1,0);
#else
// Detect the cards
detect_3dcards(dlg.DetectDirect3D,dlg.DetectGlide,dlg.DetectOpenGL);
#endif
// Remove the scanning window
m_MsgDlg.DestroyWindow();
// Now that the window is gone, release the opengl dll (fixes crash)
if(opengl_dll_handle!=NULL) {
FreeLibrary(opengl_dll_handle);
opengl_dll_handle=NULL;
}
int i;
int current=0;
// Add cards to listbox
for (i=0; i<Num_cards; i++ ) {
// Construct the listbox name
m_videocard_list.InsertString( i, GetFullName(&Cards[i]) );
}
// If only one card (in addition to NONE option) has been detected, select it
if(Num_cards==2) current=1;
// If more than one card, then display the "you must select one" message
if(Num_cards>2) {
current=0; // set it to "none", make user pick
CString mtod_msg, mtod_title;
mtod_msg.LoadString(IDS_VIDEOTAB_MTOD_MSG);
mtod_title.LoadString(IDS_VIDEOTAB_MTOD_TITLE);
MessageBox(mtod_msg,mtod_title,MB_OK|MB_ICONINFORMATION);
}
// Set the determined selection
m_videocard_list.SetCurSel(current);
// Desensitize detection button since cards have been detected
//HWND hwnd;
//GetDlgItem(IDC_VIDEOCARD_DETECT,&hwnd);
//::EnableWindow(hwnd,FALSE);
}
BOOL CVideoTab::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: Add extra initialization here
CDialog::OnInitDialog();
CurrentVideoTab = this;
// Get the PreferredRenderer
RendererType renderer_id = (RendererType)os_config_read_uint(NULL, "PreferredRenderer", RENDERER_NONE);
// Get the name of the selected rendering device
char *current_card = os_config_read_string(szSectionName, "RenderingDeviceName", "" );
// Clear the box
m_videocard_list.ResetContent();
// if renderer none is selected, automatically display the detection dialog
int current=-1;
if(renderer_id==RENDERER_NONE) {
#if (!defined(OEM_VOODOO3) || defined(USE_ALL_VIDEO_OPTIONS))
// Display the scan selection options to user
CVideoDetectDlg dlg;
dlg.DoModal();
#endif
// Set the wait cursor
CWaitCursor wc;
// Display the scanning window
m_MsgDlg.m_ScanningMsg.LoadString(IDS_VIDEOTAB_SCANNING);
m_MsgDlg.m_WaitMsg.LoadString(IDS_PLEASE_WAIT_MSG);
m_MsgDlg.Create(IDD_MSG_DLG,this);
m_MsgDlg.ShowWindow(SW_SHOW);
m_MsgDlg.UpdateData(FALSE);
#if (defined(OEM_VOODOO3) && !defined(USE_ALL_VIDEO_OPTIONS))
// Detect only 3dfx cards
detect_3dcards(0,1,0);
#else
// Detect the cards
detect_3dcards(dlg.DetectDirect3D,dlg.DetectGlide,dlg.DetectOpenGL);
#endif
// Remove the scanning window
m_MsgDlg.DestroyWindow();
// Now that the window is gone, release the opengl dll (fixes crash)
if(opengl_dll_handle!=NULL) {
FreeLibrary(opengl_dll_handle);
opengl_dll_handle=NULL;
}
// Put the detected cards into the list, and see if the selected card is one of them
for(int j=0; j<Num_cards; j++) {
m_videocard_list.InsertString( j, GetFullName(&Cards[j]) );
if ( Cards[j].renderer_type==renderer_id && !stricmp(Cards[j].name, current_card) )
current=j;
}
}
else { // just put the selected card in the list (and none selected)
detect_3dcards(0,0,0);
m_videocard_list.InsertString( 0, GetFullName(&Cards[0]) );
Cards[Num_cards].renderer_type=renderer_id;
strcpy( Cards[Num_cards].name, current_card );
m_videocard_list.InsertString( Num_cards, GetFullName(&Cards[Num_cards]) );
current = Num_cards;
Num_cards++;
}
// Only do "auto-selection" when renderer_id is set to RENDERER_NONE
if(renderer_id==RENDERER_NONE || current==-1) {
if(Num_cards<=2) current=Num_cards-1;
// If more than one card, then display the "you must select one" message
if(Num_cards>2) {
current=0; // set it to "none", make user pick
CString mtod_msg, mtod_title;
mtod_msg.LoadString(IDS_VIDEOTAB_MTOD_MSG);
mtod_title.LoadString(IDS_VIDEOTAB_MTOD_TITLE);
MessageBox(mtod_msg,mtod_title,MB_OK|MB_ICONINFORMATION);
}
}
/*
// If the selected card isn't in the current list, put it in the list
if(current==-1) {
Cards[Num_cards].renderer_type=renderer_id;
strcpy( Cards[Num_cards].name, current_card );
m_videocard_list.InsertString( Num_cards, GetFullName(&Cards[Num_cards]) );
current = Num_cards;
Num_cards++;
}
*/
// Desensitize detection button since cards have been detected
//HWND hwnd;
//GetDlgItem(IDC_VIDEOCARD_DETECT,&hwnd);
//::EnableWindow(hwnd,FALSE);
/*
detect_3dcards(0);
m_videocard_list.InsertString( 0, GetFullName(&Cards[0]) );
if ( renderer_id != RENDERER_NONE ) {
Cards[Num_cards].renderer_type=renderer_id;
strcpy( Cards[Num_cards].name, current_card );
m_videocard_list.InsertString( Num_cards, GetFullName(&Cards[Num_cards]) );
current = Num_cards;
Num_cards++;
}
*/
m_videocard_list.SetCurSel(current);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CVideoTab::OnOK()
{
// TODO: Add your specialized code here and/or call the base class
int current = m_videocard_list.GetCurSel();
if ( (current < 0) || (current>=Num_cards)) {
current = 0;
}
OutputDebugString("Setting the videocard!\n");
// Get the PreferredRenderer
os_config_write_uint(NULL, "PreferredRenderer", Cards[current].renderer_type);
// Write out the name of the rendering device
os_config_write_string(szSectionName, "RenderingDeviceName", Cards[current].name);
CPropertyPage::OnOK();
}
BOOL CVideoTab::OnHelpInfo(HELPINFO* pHelpInfo)
{
// TODO: Add your message handler code here and/or call default
#ifdef USE_HTML_HELP_SYSTEM
CWaitCursor wc;
help_launch(VIDEOTAB_HELP);
return 1;
#else
return CPropertyPage::OnHelpInfo(pHelpInfo);
#endif
}
// Display the html help file
afx_msg LRESULT CVideoTab::OnCommandHelp(WPARAM wParam, LPARAM lParam)
{
#ifdef USE_HTML_HELP_SYSTEM
help_launch(VIDEOTAB_HELP);
return 1;
#else
return CPropertyPage::OnCommandHelp(wParam,lParam);
#endif
}
void CVideoTab::OnSelchangeVideocardList()
{
int current = m_videocard_list.GetCurSel();
if ( (current < 0) || (current>=Num_cards)) {
current = 0;
}
// If user's DirectX version is less than 6.0,
// then don't let them select Direct 3D
if(Dx_version<6) {
if(Cards[current].renderer_type==RENDERER_DIRECT3D) {
CString title, msg;
title.LoadString(IDS_VIDEOTAB_DXVERSION_TITLE);
msg.LoadString(IDS_VIDEOTAB_DXVERSION_MSG);
MessageBox(msg,title,MB_OK|MB_ICONEXCLAMATION);
m_videocard_list.SetCurSel(0);
return;
}
}
// See if user has the option of selecting 3Dfx glide
int glide = -1;
for(int j=0;j<Num_cards;j++) {
if(Cards[j].renderer_type==RENDERER_GLIDE) {
glide=j;
break;
}
}
// Display warning if user has glide and is choosing opengl or direct3d
if(glide>=0 && glide<Num_cards) {
if(Cards[current].renderer_type==RENDERER_DIRECT3D || Cards[current].renderer_type==RENDERER_OPENGL) {
CString title, msg;
title.LoadString(IDS_NOTGLIDE_TITLE);
msg.LoadString(IDS_NOTGLIDE_MSG);
MessageBox(msg,title,MB_OK|MB_ICONEXCLAMATION);
}
}
}