windows-nt/Source/XPSP1/NT/multimedia/opengl/scrsave/pipes/dialog.c
2020-09-26 16:20:57 +08:00

356 lines
10 KiB
C

/******************************Module*Header*******************************\
* Module Name: sspipes.c
*
* Message loop and dialog box for the OpenGL-based 3D Pipes screen saver.
*
* Copyright (c) 1994 Microsoft Corporation
*
\**************************************************************************/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <commdlg.h>
#include <scrnsave.h>
#include <GL\gl.h>
#include <math.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <sys\timeb.h>
#include <time.h>
#include <commctrl.h>
#include "sscommon.h"
#include "sspipes.h"
#include "dlgs.h"
#include "dialog.h"
//#define NEW_TEXTURE 1
BOOL bFlexMode;
BOOL bMultiPipes;
// ulJointType controls the style of the elbows.
ULONG ulJointType = JOINT_ELBOW;
// ulSurfStyle determines whether the pipe surfaces are textured.
ULONG ulSurfStyle = SURFSTYLE_SOLID;
// ulTexQuality control the texture quality.
ULONG ulTexQuality = TEXQUAL_DEFAULT;
// fTesselFact controls the how finely the surface is tesselated. It
// varies from very course (0.0) to very fine (2.0).
float fTesselFact = 1.0f;
// If ulSurfStyle indicates a textured surface, szTexPathname specifies
// the bitmap chosen as the texture.
// Texture file(s)
TEXFILE gTexFile[MAX_TEXTURES] = {0};
int gnTextures = 0;
static void updateDialogControls(HWND hDlg);
/******************************Public*Routine******************************\
* getIniSettings
*
* Get the screen saver configuration options from .INI file/registry.
*
* Apr. 95 [marcfo]
* - Use ss_GetDefaultBmpFile
*
\**************************************************************************/
void
getIniSettings()
{
TCHAR szDefaultBitmap[MAX_PATH];
int tessel;
int idsTexture;
int idsTexOffset;
int i;
// Load resources
LoadString(hMainInstance, IDS_GENNAME, szScreenSaver,
sizeof(szScreenSaver) / sizeof(TCHAR));
// Load resource strings for texture processing
ss_LoadTextureResourceStrings();
// Get registry settings
if( ss_RegistrySetup( hMainInstance, IDS_SAVERNAME, IDS_INIFILE ) )
{
ulJointType = ss_GetRegistryInt( IDS_JOINTTYPE, JOINT_ELBOW );
ulSurfStyle = ss_GetRegistryInt( IDS_SURFSTYLE, SURFSTYLE_SOLID );
ulTexQuality = ss_GetRegistryInt( IDS_TEXQUAL, TEXQUAL_DEFAULT );
tessel = ss_GetRegistryInt( IDS_TESSELATION, 0 );
SS_CLAMP_TO_RANGE2( tessel, 0, 200 );
fTesselFact = (float)tessel / 100.0f;
bFlexMode = ss_GetRegistryInt( IDS_FLEX, 0 );
bMultiPipes = ss_GetRegistryInt( IDS_MULTIPIPES, 0 );
// Get any textures
#ifndef NEW_TEXTURE
// Just get one texture with old registry names
ss_GetRegistryString( IDS_TEXTURE, 0, gTexFile[0].szPathName, MAX_PATH);
gTexFile[0].nOffset = ss_GetRegistryInt( IDS_TEXTURE_FILE_OFFSET, 0 );
gnTextures = 1;
#else
gnTextures = ss_GetRegistryInt( IDS_TEXTURE_COUNT, 0 );
SS_CLAMP_TO_RANGE2( gnTextures, 0, MAX_TEXTURES );
idsTexture = IDS_TEXTURE0;
idsTexOffset = IDS_TEXOFFSET0;
for( i = 0; i < gnTextures; i++, idsTexture++, idsTexOffset++ ) {
ss_GetRegistryString( idsTexture, 0, gTexFile[i].szPathName,
MAX_PATH);
gTexFile[i].nOffset = ss_GetRegistryInt( idsTexOffset, 0 );
}
#endif
}
}
/**************************************************************************\
* ConfigInit
*
\**************************************************************************/
BOOL
ss_ConfigInit( HWND hDlg )
{
return TRUE;
}
/******************************Public*Routine******************************\
* saveIniSettings
*
* Save the screen saver configuration option to the .INI file/registry.
*
\**************************************************************************/
static void saveIniSettings(HWND hDlg)
{
if( ss_RegistrySetup( hMainInstance, IDS_SAVERNAME, IDS_INIFILE ) )
{
int idsTexture;
int idsTexOffset;
int i;
ss_WriteRegistryInt( IDS_JOINTTYPE, ulJointType );
ss_WriteRegistryInt( IDS_SURFSTYLE, ulSurfStyle );
ss_WriteRegistryInt( IDS_TEXQUAL, ulTexQuality );
ss_WriteRegistryInt( IDS_TESSELATION,
ss_GetTrackbarPos(hDlg, DLG_SETUP_TESSEL) );
ss_WriteRegistryInt( IDS_FLEX, bFlexMode );
ss_WriteRegistryInt( IDS_MULTIPIPES, bMultiPipes );
#ifndef NEW_TEXTURE
ss_WriteRegistryString( IDS_TEXTURE, gTexFile[0].szPathName );
ss_WriteRegistryInt( IDS_TEXTURE_FILE_OFFSET, gTexFile[0].nOffset );
#else
idsTexture = IDS_TEXTURE0;
idsTexOffset = IDS_TEXOFFSET0;
for( i = 0; i < gnTextures; i++, idsTexture++, idsTexOffset++ ) {
ss_WriteRegistryString( idsTexture, gTexFile[i].szPathName );
ss_WriteRegistryInt( idsTexOffset, gTexFile[i].nOffset );
}
#endif
}
}
/******************************Public*Routine******************************\
* setupDialogControls
*
* Do initial setup of dialog controls.
*
* History:
* Jan. 95 -by- Marc Fortier [marcfo]
* Wrote it.
\**************************************************************************/
static void
setupDialogControls(HWND hDlg)
{
int pos;
int wTmp;
TCHAR szStr[GEN_STRING_SIZE];
int idsJointType;
InitCommonControls();
pos = (int)(fTesselFact * 100.0f);
ss_SetupTrackbar( hDlg, DLG_SETUP_TESSEL, 0, 200, 1, 10, pos );
// setup jointType combo box
idsJointType = IDS_JOINT_ELBOW;
for (wTmp = 0; wTmp < NUM_JOINTTYPES; wTmp++, idsJointType++) {
LoadString(hMainInstance, idsJointType, szStr,
GEN_STRING_SIZE);
SendDlgItemMessage(hDlg, DLG_COMBO_JOINTTYPE, CB_ADDSTRING, 0,
(LPARAM) szStr);
}
SendDlgItemMessage(hDlg, DLG_COMBO_JOINTTYPE, CB_SETCURSEL,
ulJointType, 0);
updateDialogControls( hDlg );
}
/******************************Public*Routine******************************\
* updateDialogControls
*
* Setup the dialog controls based on the current global state.
*
\**************************************************************************/
static void updateDialogControls(HWND hDlg)
{
BOOL bTexture = (ulSurfStyle == SURFSTYLE_TEX);
CheckDlgButton( hDlg, IDC_RADIO_SOLID, ulSurfStyle == SURFSTYLE_SOLID );
CheckDlgButton( hDlg, IDC_RADIO_TEX , bTexture );
#ifdef NEED_THESE_LATER
CheckDlgButton( hDlg, IDC_RADIO_WIREFRAME, ulSurfStyle == SURFSTYLE_WIREFRAME );
CheckDlgButton( hDlg, IDC_RADIO_TEXQUAL_DEFAULT ,
bTexture && ulTexQuality == TEXQUAL_DEFAULT);
CheckDlgButton( hDlg, IDC_RADIO_TEXQUAL_HIGH,
bTexture && ulTexQuality == TEXQUAL_HIGH);
#endif
CheckDlgButton( hDlg, IDC_RADIO_NORMAL, !bFlexMode);
CheckDlgButton( hDlg, IDC_RADIO_FLEX, bFlexMode);
CheckDlgButton( hDlg, IDC_RADIO_SINGLE_PIPE, !bMultiPipes);
CheckDlgButton( hDlg, IDC_RADIO_MULTIPLE_PIPES, bMultiPipes);
EnableWindow( GetDlgItem(hDlg, DLG_COMBO_JOINTTYPE), !bFlexMode);
EnableWindow( GetDlgItem(hDlg, IDC_STATIC_JOINTTYPE), !bFlexMode);
EnableWindow( GetDlgItem(hDlg, DLG_SETUP_TEXTURE), bTexture );
EnableWindow( GetDlgItem(hDlg, IDC_RADIO_TEXQUAL_DEFAULT), bTexture );
EnableWindow( GetDlgItem(hDlg, IDC_RADIO_TEXQUAL_HIGH), bTexture );
EnableWindow( GetDlgItem(hDlg, IDC_STATIC_TEXQUAL_GRP), bTexture );
EnableWindow(GetDlgItem(hDlg, DLG_SETUP_TESSEL), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_TESS_MIN), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_TESS_MAX), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_TESS_GRP), TRUE);
}
BOOL WINAPI RegisterDialogClasses(HANDLE hinst)
{
return TRUE;
}
/******************************Public*Routine******************************\
* ScreenSaverConfigureDialog
*
* Screen saver setup dialog box procedure.
* Apr. 95 [marcfo]
* - Use ss_SelectTextureFile
*
\**************************************************************************/
BOOL ScreenSaverConfigureDialog(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
int wTmp;
int optMask = 1;
switch (message)
{
case WM_INITDIALOG:
getIniSettings();
setupDialogControls(hDlg);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_RADIO_SOLID:
case IDC_RADIO_TEX:
case IDC_RADIO_WIREFRAME:
ulSurfStyle = IDC_TO_SURFSTYLE(LOWORD(wParam));
break;
case IDC_RADIO_TEXQUAL_DEFAULT:
case IDC_RADIO_TEXQUAL_HIGH:
ulTexQuality = IDC_TO_TEXQUAL(LOWORD(wParam));
break;
case IDC_RADIO_NORMAL:
bFlexMode = FALSE;
break;
case IDC_RADIO_FLEX:
bFlexMode = TRUE;
break;
case IDC_RADIO_SINGLE_PIPE:
bMultiPipes = FALSE;
break;
case IDC_RADIO_MULTIPLE_PIPES:
bMultiPipes = TRUE;
break;
case DLG_SETUP_TEXTURE:
// Run choose texture dialog
#if 1
ss_SelectTextureFile( hDlg, &gTexFile[0] );
#else
ss_SelectTextureFile( hDlg, &gTexFile[0] );
// NEW_TEXTURE dialog box
#endif
break;
case DLG_COMBO_JOINTTYPE:
switch (HIWORD(wParam))
{
case CBN_EDITCHANGE:
case CBN_SELCHANGE:
ulJointType =
(ULONG)SendDlgItemMessage(hDlg, DLG_COMBO_JOINTTYPE,
CB_GETCURSEL, 0, 0);
break;
default:
return FALSE;
}
break;
case IDOK:
saveIniSettings(hDlg);
EndDialog(hDlg, TRUE);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
default:
break;
}
updateDialogControls(hDlg);
return TRUE;
default:
return 0;
}
return 0;
}