From 7302dfdc917bc0dfc701eab373b6ec509f5b3f4d Mon Sep 17 00:00:00 2001 From: ron Date: Fri, 2 Apr 2021 00:35:40 +0300 Subject: [PATCH] Initial commit. --- .gitignore | 2 + BehaviorDialog.cpp | 274 +++++++++++ Debug.h | 17 + Dialogs.h | 25 + GeneralDialog.cpp | 286 ++++++++++++ GraphicConfigDialog.cpp | 148 ++++++ HotCorners.cpp | 71 +++ HotCorners.h | 19 + Moebius Clock.hlp | Bin 0 -> 13365 bytes Moebius.cpp | 692 ++++++++++++++++++++++++++++ Moebius.ico | Bin 0 -> 3310 bytes Moebius32.aps | Bin 0 -> 1014616 bytes Moebius32.rc | 318 +++++++++++++ MoebiusScreenSaver.dsp | 231 ++++++++++ MoebiusScreenSaver.dsw | 45 ++ MoebiusScreenSaver.hpj | 35 ++ MoebiusScreenSaver.rtf | 92 ++++ MoebiusScreenSaver.sln | 21 + MoebiusScreenSaver.suo | Bin 0 -> 9216 bytes MoebiusScreenSaver.vcproj | 429 ++++++++++++++++++ OpenGLenv.cpp | 931 ++++++++++++++++++++++++++++++++++++++ OpenGLenv.h | 76 ++++ Password.cpp | 72 +++ Password.h | 20 + Readme.txt | 116 +++++ Readppm.cpp | 35 ++ SaverSettings.cpp | 291 ++++++++++++ SaverSettings.h | 51 +++ ScreenSaver.cpp | 570 +++++++++++++++++++++++ TransparentBitmap.cpp | 105 +++++ TransparentBitmap.h | 17 + bcheck.bmp | Bin 0 -> 486 bytes bdot.bmp | Bin 0 -> 486 bytes bnone.bmp | Bin 0 -> 486 bytes cafe.bmp | Bin 0 -> 49220 bytes hours0.bmp | Bin 0 -> 24644 bytes hours1.bmp | Bin 0 -> 24644 bytes hours2.bmp | Bin 0 -> 24644 bytes hours3.bmp | Bin 0 -> 24644 bytes monitor.bmp | Bin 0 -> 15666 bytes monitor2.bmp | Bin 0 -> 15666 bytes ogllogo.bmp | Bin 0 -> 786500 bytes resource.h | 100 ++++ resource.hm | 39 ++ texture.c | 256 +++++++++++ texture.h | 24 + 46 files changed, 5408 insertions(+) create mode 100644 .gitignore create mode 100644 BehaviorDialog.cpp create mode 100644 Debug.h create mode 100644 Dialogs.h create mode 100644 GeneralDialog.cpp create mode 100644 GraphicConfigDialog.cpp create mode 100644 HotCorners.cpp create mode 100644 HotCorners.h create mode 100644 Moebius Clock.hlp create mode 100644 Moebius.cpp create mode 100644 Moebius.ico create mode 100644 Moebius32.aps create mode 100644 Moebius32.rc create mode 100644 MoebiusScreenSaver.dsp create mode 100644 MoebiusScreenSaver.dsw create mode 100644 MoebiusScreenSaver.hpj create mode 100644 MoebiusScreenSaver.rtf create mode 100644 MoebiusScreenSaver.sln create mode 100644 MoebiusScreenSaver.suo create mode 100644 MoebiusScreenSaver.vcproj create mode 100644 OpenGLenv.cpp create mode 100644 OpenGLenv.h create mode 100644 Password.cpp create mode 100644 Password.h create mode 100644 Readme.txt create mode 100644 Readppm.cpp create mode 100644 SaverSettings.cpp create mode 100644 SaverSettings.h create mode 100644 ScreenSaver.cpp create mode 100644 TransparentBitmap.cpp create mode 100644 TransparentBitmap.h create mode 100644 bcheck.bmp create mode 100644 bdot.bmp create mode 100644 bnone.bmp create mode 100644 cafe.bmp create mode 100644 hours0.bmp create mode 100644 hours1.bmp create mode 100644 hours2.bmp create mode 100644 hours3.bmp create mode 100644 monitor.bmp create mode 100644 monitor2.bmp create mode 100644 ogllogo.bmp create mode 100644 resource.h create mode 100644 resource.hm create mode 100644 texture.c create mode 100644 texture.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6db035b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +Debug/ +Release/ diff --git a/BehaviorDialog.cpp b/BehaviorDialog.cpp new file mode 100644 index 0000000..bda6ae6 --- /dev/null +++ b/BehaviorDialog.cpp @@ -0,0 +1,274 @@ +//========================================================================== +// +// File: BehaviorDialog.cpp +// +//========================================================================== + +#include +#include +#include + +#include "SaverSettings.h" +#include "TransparentBitmap.h" +#include "resource.h" +#include "resource.hm" + +extern SaverSettings* ss; +extern HINSTANCE hInstance; + +#define BMPMONITOR_WIDTH 184 +#define BMPMONITOR_HEIGHT 169 + +#define BMPBUTTON_WIDTH 25 +#define BMPBUTTON_HEIGHT 23 + +static const DWORD aHelpIDs[] = +{ + IDC_ABOUT, HIDC_ABOUT, + IDC_SWING, HIDC_SWING, + IDC_USEMOUSE, HIDC_USEMOUSE, + IDC_BACK, HIDC_BACK, + IDC_QUICK, HIDC_QUICK, + IDC_EDIT1, HIDC_SPIN1, + IDC_SPIN1, HIDC_SPIN1, + IDC_MONITOR, HIDC_COLOR1, + IDC_COLOR1, HIDC_COLOR1, + IDC_COLOR2, HIDC_COLOR1, + IDC_COLOR3, HIDC_COLOR1, + IDC_COLOR4, HIDC_COLOR1, + 0, 0 +}; + +/****************************************************************************/ +// +// Process the messages for the 'About' dialog. +// +BOOL FAR PASCAL +AboutDialogProc(HWND win, UINT msg, WPARAM wparam, LONG lparam) +{ + // Check the message + switch (msg) + { + // If we received an InitDialog message, just return true + case WM_INITDIALOG: + return TRUE; + + // If we received an OK button selection, + // close the dialog and return true + case WM_COMMAND: + if (wparam == IDOK) + { + EndDialog(win, TRUE); + return TRUE; + } + break; + } + // Otherwise, return false + return FALSE; +} + +/****************************************************************************/ +// +// Process the messages for the 'Behavior' dialog. +// +BOOL APIENTRY +BehaviorDialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + int i; + int nBtnCoordx[] = { 20, 140, 140, 20 }; + int nBtnCoordy[] = { 21, 21, 103, 103 }; + char chNum[10]; + HWND hspin, hedit; + HWND hstb; + HWND hmonitor; + HBITMAP hbmpmonitor; + HGDIOBJ holdbmp; + RECT rectBmp, rectDlg; + + switch (msg) + { + case WM_INITDIALOG: + hmonitor = GetDlgItem(hwnd, IDC_MONITOR); + GetWindowRect(hwnd, &rectDlg); + GetWindowRect(hmonitor, &rectBmp); + rectBmp.top -= rectDlg.top; + rectBmp.left -= rectDlg.left; + MoveWindow(hmonitor, + rectBmp.left, rectBmp.top, + BMPMONITOR_WIDTH, BMPMONITOR_HEIGHT, TRUE + ); + for (i=0; i < 4; i++) + { + hstb = GetDlgItem(hwnd, IDC_COLOR1+i); + MoveWindow(hstb, + nBtnCoordx[i] + rectBmp.left, + nBtnCoordy[i] + rectBmp.top, + BMPBUTTON_WIDTH, BMPBUTTON_HEIGHT, TRUE + ); + } + return TRUE; + + case WM_DRAWITEM: + { + LPDRAWITEMSTRUCT lpdis; + lpdis = (LPDRAWITEMSTRUCT)lParam; + if (lpdis->CtlType == ODT_BUTTON) + { + HPEN hpen1, hpen2; + HBRUSH hbrush; + HGDIOBJ holdpen, holdbrush; + POINT points[3]; + int nR, nG, nB; + + if (lpdis->CtlID == IDC_MONITOR) + { + hbmpmonitor = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_MONITOR2)); + holdbmp = SelectObject(lpdis->hDC, hbmpmonitor); + DrawTransparentBitmap(lpdis->hDC, hbmpmonitor, 0, 0, RGB(255, 0, 0)); + SelectObject(lpdis->hDC, holdbmp); + DeleteObject(hbmpmonitor); + for (i=0; i < 4; i++) + { + hstb = GetDlgItem(hwnd, IDC_COLOR1+i); + InvalidateRect(hstb, NULL, FALSE); + } + return TRUE; + } + else if ( (lpdis->CtlID >= IDC_COLOR1) && (lpdis->CtlID <= IDC_COLOR4) ) + { + i = lpdis->CtlID - IDC_COLOR1; + nR = (int)(255 * ss->state.fColorR[i]); + nG = (int)(255 * ss->state.fColorG[i]); + nB = (int)(255 * ss->state.fColorB[i]); + + hpen1 = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW)); + hpen2 = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DHILIGHT)); + hbrush = CreateSolidBrush(RGB(nR, nG, nB)); + holdpen = SelectObject(lpdis->hDC, hpen1); + holdbrush = SelectObject(lpdis->hDC, hbrush); + Rectangle(lpdis->hDC, + lpdis->rcItem.left, lpdis->rcItem.top, + lpdis->rcItem.right, lpdis->rcItem.bottom + ); + SelectObject(lpdis->hDC, hpen2); + points[0].x = lpdis->rcItem.left-1; + points[0].y = points[1].y = lpdis->rcItem.bottom - 1; + points[1].x = points[2].x = lpdis->rcItem.right-1; + points[2].y = lpdis->rcItem.top - 1; + Polyline(lpdis->hDC, points, 3); + SelectObject(lpdis->hDC, holdpen); + SelectObject(lpdis->hDC, holdbrush); + DeleteObject(hpen1); + DeleteObject(hpen2); + DeleteObject(hbrush); + + return TRUE; + } + } + } + break; + + case WM_NOTIFY: + switch (((NMHDR FAR *) lParam)->code) + { + case PSN_SETACTIVE: + CheckDlgButton(hwnd, IDC_QUICK, ss->state.bQuick); + CheckDlgButton(hwnd, IDC_SWING, ss->state.bSwing); + CheckDlgButton(hwnd, IDC_USEMOUSE, ss->state.bUseMouse); + CheckDlgButton(hwnd, IDC_BACK, !ss->state.bBlackBackground); + hedit = GetDlgItem(hwnd, IDC_EDIT1); + hspin = GetDlgItem(hwnd, IDC_SPIN1); + sprintf(chNum, "%d", ss->state.nTwists); + SendMessage(hedit, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)chNum); + SendMessage(hspin, UDM_SETRANGE, 0L, MAKELONG(9, 0)); + SendMessage(hspin, UDM_SETPOS, 0L, MAKELONG(ss->state.nTwists, 0)); + break; + + case PSN_KILLACTIVE: + { + DWORD nSpinSel; + hspin = GetDlgItem(hwnd, IDC_SPIN1); + nSpinSel = SendMessage(hspin, UDM_GETPOS, 0, 0L); + ss->state.nTwists = LOWORD(nSpinSel); + ss->state.bQuick = IsDlgButtonChecked(hwnd, IDC_QUICK); + ss->state.bSwing = IsDlgButtonChecked(hwnd, IDC_SWING); + ss->state.bUseMouse = IsDlgButtonChecked(hwnd, IDC_USEMOUSE); + ss->state.bBlackBackground = !IsDlgButtonChecked(hwnd, IDC_BACK); + SetWindowLong(hwnd, DWL_MSGRESULT, FALSE); + return TRUE; + } + break; + + case PSN_RESET: + SetWindowLong(hwnd, DWL_MSGRESULT, FALSE); + return TRUE; + break; + + case PSN_APPLY: + ss->WriteBehaviorRegistry(); + SetWindowLong(hwnd, DWL_MSGRESULT, FALSE); + break; + } + break; + + case WM_COMMAND: + { + int id = LOWORD(wParam); + BOOL bStatus; + CHOOSECOLOR chooseColor; + int nR, nG, nB; + if ( (id >= IDC_COLOR1) && (id <= IDC_COLOR4) ) + { + i = id - IDC_COLOR1; + nR = (int)(255 * ss->state.fColorR[i]); + nG = (int)(255 * ss->state.fColorG[i]); + nB = (int)(255 * ss->state.fColorB[i]); + chooseColor.lStructSize = sizeof(CHOOSECOLOR); + chooseColor.hwndOwner = hwnd; + chooseColor.rgbResult = RGB(nR, nG, nB); + chooseColor.lpCustColors = ss->customColors; + chooseColor.Flags = CC_ANYCOLOR | CC_RGBINIT | CC_FULLOPEN; + chooseColor.lpfnHook = NULL; + chooseColor.lpTemplateName = NULL; + bStatus = ChooseColor(&chooseColor); + if (bStatus) + { + nR = GetRValue(chooseColor.rgbResult); + nG = GetGValue(chooseColor.rgbResult); + nB = GetBValue(chooseColor.rgbResult); + ss->state.fColorR[i] = (float)nR / 255.0f; + ss->state.fColorG[i] = (float)nG / 255.0f; + ss->state.fColorB[i] = (float)nB / 255.0f; + hstb = GetDlgItem(hwnd, id); + InvalidateRect(hstb, NULL, FALSE); + } + } + else if (id == IDC_ABOUT) + { + DialogBox( + hInstance, MAKEINTRESOURCE(IDD_ABOUT), + hwnd, AboutDialogProc + ); + } + } + break; + + case WM_HELP: + { + LPHELPINFO lphi = (LPHELPINFO)lParam; + if (lphi->iContextType == HELPINFO_WINDOW) + { + WinHelp((HWND)lphi->hItemHandle, "Moebius Clock.hlp", HELP_WM_HELP, (DWORD)(LPSTR)aHelpIDs); + } + return TRUE; + } + break; + + case WM_CONTEXTMENU: + WinHelp((HWND)wParam, "Moebius Clock.hlp", HELP_CONTEXTMENU, (DWORD)(LPVOID)aHelpIDs); + return TRUE; + break; + } + return FALSE; +} + diff --git a/Debug.h b/Debug.h new file mode 100644 index 0000000..9651ce4 --- /dev/null +++ b/Debug.h @@ -0,0 +1,17 @@ +//========================================================================== +// +// File: Debug.h +// +//========================================================================== + +#ifndef DEBUG_H +#define DEBUG_H + +#ifndef DEBUG +#define DEBUG FALSE +#endif + +void Debug(char *); + +#endif + diff --git a/Dialogs.h b/Dialogs.h new file mode 100644 index 0000000..f9cdaee --- /dev/null +++ b/Dialogs.h @@ -0,0 +1,25 @@ +//========================================================================== +// +// File: Dialogs.h +// +//========================================================================== + +#ifndef DIALOGS_H +#define DIALOGS_H + +#include + +/****************************************************************************/ + +BOOL APIENTRY +GeneralDialogProc(HWND win, UINT msg, UINT wparam, LONG lparam); + +BOOL APIENTRY +GraphicConfigDialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + +BOOL APIENTRY +BehaviorDialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + +/****************************************************************************/ + +#endif diff --git a/GeneralDialog.cpp b/GeneralDialog.cpp new file mode 100644 index 0000000..96f98be --- /dev/null +++ b/GeneralDialog.cpp @@ -0,0 +1,286 @@ +//========================================================================== +// +// File: GeneralDialog.cpp +// +//========================================================================== + +#include +#include +#include + +#include "SaverSettings.h" +#include "TransparentBitmap.h" +#include "HotCorners.h" +#include "resource.h" +#include "resource.hm" + +extern SaverSettings* ss; +extern HINSTANCE hInstance; + +#define BMPMONITOR_WIDTH 184 +#define BMPMONITOR_HEIGHT 169 + +#define BMPBUTTON_WIDTH 25 +#define BMPBUTTON_HEIGHT 23 + +static bool firstTime = true; + +static const DWORD aHelpIDs[] = +{ + ID_MUTE, HID_MUTE, + ID_THRESHOLD, HID_THRESHOLD, + ID_WAITBOX, HID_WAITBOX, + ID_WAITBUDDY, HID_WAITTEXT, + ID_WAITTEXT, HID_WAITTEXT, + IDC_UL, HIDC_UL, + IDC_UR, HIDC_UL, + IDC_DL, HIDC_UL, + IDC_DR, HIDC_UL, + IDC_MONITOR, HIDC_UL, + 0, 0 +}; + +/****************************************************************************/ +// +// Process the messages for the 'General' dialog. +// +BOOL APIENTRY +GeneralDialogProc(HWND win, UINT msg, UINT wparam, LONG lparam) +{ + HWND hstaticOK, hstaticBad; + HWND hmute; + HWND hcomboTh; + HWND hstaticPasswd, hbuddyPasswd, htextPasswd, hcomboPasswd; + HWND hstb; + HWND hmonitor; + static HBITMAP hbcheck=0, hbdot=0, hbnone=0; + HBITMAP hbmpmonitor; + HGDIOBJ holdbmp; + HANDLE hbuttonim; + DWORD nText; + char achNum[10]; + RECT rectBmp, rectDlg; + int nBtnCoordx[] = { 17, 143, 143, 17 }; + int nBtnCoordy[] = { 18, 18, 106, 106 }; + int nComboSel, i; + DWORD nSpinSel; + + // Check the message + switch (msg) + { + // If we received an InitDialog message, just return true + case WM_INITDIALOG: + hmonitor = GetDlgItem(win, IDC_MONITOR); + GetWindowRect(win, &rectDlg); + GetWindowRect(hmonitor, &rectBmp); + rectBmp.top -= rectDlg.top; + rectBmp.left -= rectDlg.left; + MoveWindow(hmonitor, + rectBmp.left, rectBmp.top, + BMPMONITOR_WIDTH, BMPMONITOR_HEIGHT, TRUE + ); + return TRUE; + + case WM_DRAWITEM: + { + LPDRAWITEMSTRUCT lpdis; + lpdis = (LPDRAWITEMSTRUCT)lparam; + if (lpdis->CtlType == ODT_BUTTON) + { + hbmpmonitor = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_MONITOR)); + holdbmp = SelectObject(lpdis->hDC, hbmpmonitor); + DrawTransparentBitmap(lpdis->hDC, hbmpmonitor, 0, 0, RGB(255, 0, 0)); + SelectObject(lpdis->hDC, holdbmp); + DeleteObject(hbmpmonitor); + for (i=0; i < 4; i++) + { + hstb = GetDlgItem(win, IDC_UL+i); + InvalidateRect(hstb, NULL, FALSE); + } + return TRUE; + } + } + break; + + case WM_NOTIFY: + switch (((NMHDR FAR *) lparam)->code) + { + case PSN_SETACTIVE: + hstaticOK = GetDlgItem(win, ID_SAGEOK); + hstaticBad = GetDlgItem(win, ID_SAGEBAD); + hmute = GetDlgItem(win, ID_MUTE); + hcomboTh = GetDlgItem(win, ID_THRESHOLD); + hstaticPasswd = GetDlgItem(win, ID_WAITSUMMARY); + hbuddyPasswd = GetDlgItem(win, ID_WAITBUDDY); + htextPasswd = GetDlgItem(win, ID_WAITTEXT); + hcomboPasswd = GetDlgItem(win, ID_WAITBOX); + ShowWindow(hmute, SW_HIDE); + ShowWindow(hstaticPasswd, SW_HIDE); + ShowWindow(hbuddyPasswd, SW_SHOW); + ShowWindow(htextPasswd, SW_SHOW); + ShowWindow(hcomboPasswd, SW_SHOW); + if (CheckHots()) + { + ShowWindow(hstaticOK, SW_SHOW); + ShowWindow(hstaticBad, SW_HIDE); + } + else + { + ShowWindow(hstaticOK, SW_HIDE); + ShowWindow(hstaticBad, SW_SHOW); + } + if (firstTime) + { + SendMessage(hcomboTh, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"High"); + SendMessage(hcomboTh, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"Normal"); + SendMessage(hcomboTh, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"Low"); + SendMessage(hcomboTh, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"Ignore mouse movement"); + SendMessage(hcomboPasswd, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"seconds"); + SendMessage(hcomboPasswd, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"minutes"); + firstTime = false; + } + SendMessage(hcomboTh, CB_SETCURSEL, (WPARAM)ss->MouseThresholdIndex, 0L); + SendMessage(hcomboPasswd, CB_SETCURSEL, (WPARAM)ss->PasswordDelayIndex, 0L); + if (ss->PasswordDelayIndex) nText = ss->PasswordDelay / 60; + else nText = ss->PasswordDelay; + sprintf(achNum, "%d", nText); + SendMessage(htextPasswd, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)achNum); + SendMessage(hbuddyPasswd, UDM_SETRANGE, 0L, MAKELONG(99, 0)); + SendMessage(hbuddyPasswd, UDM_SETPOS, 0L, MAKELONG(nText, 0)); + CheckDlgButton(win, ID_MUTE, ss->MuteSound); + hbcheck = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BCHECK)); + hbdot = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BDOT)); + hbnone = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BNONE)); + hmonitor = GetDlgItem(win, IDC_MONITOR); + GetWindowRect(win, &rectDlg); + GetWindowRect(hmonitor, &rectBmp); + rectBmp.top -= rectDlg.top; + rectBmp.left -= rectDlg.left; + for (i=0; i < 4; i++) + { + hstb = GetDlgItem(win, IDC_UL+i); + switch (ss->Corners[i]) + { + case '-': hbuttonim = hbnone; break; + case 'Y': hbuttonim = hbcheck; break; + case 'N': hbuttonim = hbdot; break; + } + SendMessage(hstb, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)(HANDLE)hbuttonim); + MoveWindow(hstb, + nBtnCoordx[i] + rectBmp.left, + nBtnCoordy[i] + rectBmp.top, + BMPBUTTON_WIDTH, BMPBUTTON_HEIGHT, TRUE + ); + } + break; + + case PSN_RESET: + SetWindowLong(win, DWL_MSGRESULT, FALSE); + break; + + case PSN_KILLACTIVE: + if (hbcheck) DeleteObject(hbcheck); + if (hbdot) DeleteObject(hbdot); + if (hbnone) DeleteObject(hbnone); + hmute = GetDlgItem(win, ID_MUTE); + hcomboTh = GetDlgItem(win, ID_THRESHOLD); + hbuddyPasswd = GetDlgItem(win, ID_WAITBUDDY); + hcomboPasswd = GetDlgItem(win, ID_WAITBOX); + ss->MuteSound = IsDlgButtonChecked(win, ID_MUTE); + nSpinSel = SendMessage(hbuddyPasswd, UDM_GETPOS, 0, 0L); + nComboSel = SendMessage(hcomboPasswd, CB_GETCURSEL, 0, 0L); + ss->PasswordDelayIndex = nComboSel; + ss->PasswordDelay = LOWORD(nSpinSel); + if (nComboSel) ss->PasswordDelay *= 60; + nComboSel = SendMessage(hcomboTh, CB_GETCURSEL, 0, 0L); + ss->MouseThresholdIndex = nComboSel; + switch (nComboSel) + { + case 0: + ss->MouseThreshold = 0; + break; + case 1: + ss->MouseThreshold = 200; + break; + case 2: + ss->MouseThreshold = 400; + break; + case 3: + ss->MouseThreshold = 999999; + break; + } + SetWindowLong(win, DWL_MSGRESULT, FALSE); + return TRUE; + break; + + case PSN_APPLY: + ss->WriteGeneralRegistry(); + NotifyHots(); + SetWindowLong(win, DWL_MSGRESULT, TRUE); + break; + } + + case WM_COMMAND: + { + HMENU hpopup; + POINT point; + int nButton; // 0=UL 1=UR 2=DR 3=DL + int id = LOWORD(wparam); + UINT nMenu; + if ( (id >= IDC_UL) && (id <= IDC_DL) ) + { + nButton = id - IDC_UL; + hpopup = CreatePopupMenu(); + AppendMenu(hpopup, + MF_STRING | (ss->Corners[nButton] == '-' ? MF_CHECKED : 0), + ID_DEFAULT, "Default"); + AppendMenu(hpopup, + MF_STRING | (ss->Corners[nButton] == 'Y' ? MF_CHECKED : 0), + ID_NOW, "Now"); + AppendMenu(hpopup, + MF_STRING | (ss->Corners[nButton] == 'N' ? MF_CHECKED : 0), + ID_NEVER, "Never"); + GetCursorPos(&point); + nMenu = TrackPopupMenu(hpopup, + TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD | TPM_LEFTBUTTON, + point.x, point.y, 0, win, NULL); + DestroyMenu(hpopup); + hstb = GetDlgItem(win, id); + switch (nMenu) + { + case 0: break; + case ID_DEFAULT: + ss->Corners[nButton] = '-'; + SendMessage(hstb, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)(HANDLE)hbnone); + break; + case ID_NOW: + ss->Corners[nButton] = 'Y'; + SendMessage(hstb, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)(HANDLE)hbcheck); + break; + case ID_NEVER: + ss->Corners[nButton] = 'N'; + SendMessage(hstb, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)(HANDLE)hbdot); + break; + } + } + } + break; + case WM_HELP: + { + LPHELPINFO lphi = (LPHELPINFO)lparam; + if (lphi->iContextType == HELPINFO_WINDOW) + { + WinHelp((HWND)lphi->hItemHandle, "Moebius Clock.hlp", HELP_WM_HELP, (DWORD)(LPSTR)aHelpIDs); + } + return TRUE; + } + break; + + case WM_CONTEXTMENU: + WinHelp((HWND)wparam, "Moebius Clock.hlp", HELP_CONTEXTMENU, (DWORD)(LPVOID)aHelpIDs); + return TRUE; + break; + } + // Otherwise, return false + return FALSE; +} diff --git a/GraphicConfigDialog.cpp b/GraphicConfigDialog.cpp new file mode 100644 index 0000000..ca69be3 --- /dev/null +++ b/GraphicConfigDialog.cpp @@ -0,0 +1,148 @@ +//========================================================================== +// +// File: GraphicConfigDialog.cpp +// +//========================================================================== + +#include + +#include "SaverSettings.h" +#include "resource.h" +#include "resource.hm" + +extern SaverSettings* ss; + +static const DWORD aHelpIDs[] = +{ + IDC_FLAT, HIDC_FLAT, + IDC_GOURAUD, HIDC_GOURAUD, + IDC_ANTIALIAS, HIDC_ANTIALIAS, + IDC_BLEND, HIDC_BLEND, + IDC_NORMALS, HIDC_NORMALS, + IDC_WIREFRAME, HIDC_WIREFRAME, + IDC_ZBUFFER, HIDC_ZBUFFER, + IDC_CULL, HIDC_CULL, + IDC_NOGLASS, HIDC_NOGLASS, + IDC_NOTEXTURES, HIDC_NOTEXTURES, + IDC_NEAREST, HIDC_NEAREST, + IDC_LINEAR, HIDC_NEAREST, + IDC_WMIPMAPS, HIDC_WMIPMAPS, + IDC_NMIPMAPS, HIDC_WMIPMAPS, + IDC_LMIPMAPS, HIDC_WMIPMAPS, + 0, 0 +}; + +/****************************************************************************/ +// +// Process the messages for the 'GraphicConfig' dialog. +// +BOOL APIENTRY +GraphicConfigDialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_INITDIALOG: + return TRUE; + + case WM_NOTIFY: + switch (((NMHDR FAR *) lParam)->code) + { + case PSN_SETACTIVE: + CheckDlgButton(hwnd, IDC_BLEND, ss->state.bBlend); + CheckDlgButton(hwnd, IDC_ANTIALIAS, ss->state.bSmooth); + CheckDlgButton(hwnd, IDC_NORMALS, ss->state.bNormals); + CheckDlgButton( + hwnd, IDC_WIREFRAME, + (ss->state.nPolygonMode == GL_FILL) ? FALSE : TRUE + ); + CheckDlgButton(hwnd, IDC_ZBUFFER, ss->state.bDepthTest); + CheckDlgButton(hwnd, IDC_CULL, ss->state.bCulling); + CheckDlgButton(hwnd, IDC_NOGLASS, ss->state.bNoGlass); + EnableWindow(GetDlgItem(hwnd, IDC_BLEND), !ss->state.bNoGlass); + CheckDlgButton(hwnd, IDC_NOTEXTURES, ss->state.bNoExtraTextures); + CheckRadioButton( + hwnd, IDC_FLAT, IDC_GOURAUD, + ss->state.nShadeModel == GL_FLAT ? IDC_FLAT : IDC_GOURAUD + ); + CheckRadioButton( + hwnd, IDC_NEAREST, IDC_LINEAR, + ss->state.nLinear == 1 ? IDC_LINEAR : IDC_NEAREST + ); + CheckRadioButton( + hwnd, IDC_WMIPMAPS, IDC_LMIPMAPS, + IDC_WMIPMAPS + ss->state.nMipmap + ); + break; + + case PSN_KILLACTIVE: + { + BOOL bBlend; + ss->state.bCulling = IsDlgButtonChecked(hwnd, IDC_CULL); + ss->state.bDepthTest = IsDlgButtonChecked(hwnd, IDC_ZBUFFER); + ss->state.bNormals = IsDlgButtonChecked(hwnd, IDC_NORMALS); + ss->state.bNoGlass = IsDlgButtonChecked(hwnd, IDC_NOGLASS); + ss->state.bNoExtraTextures = IsDlgButtonChecked(hwnd, IDC_NOTEXTURES); + ss->state.nLinear = + IsDlgButtonChecked(hwnd, IDC_LINEAR) ? 1 : 0; + ss->state.nMipmap = + IsDlgButtonChecked(hwnd, IDC_WMIPMAPS) ? 0 : 1; + ss->state.nMipmap = + IsDlgButtonChecked(hwnd, IDC_LMIPMAPS) ? 2 : ss->state.nMipmap; + ss->state.nPolygonMode = + IsDlgButtonChecked(hwnd, IDC_WIREFRAME) ? GL_LINE : GL_FILL; + ss->state.nShadeModel = + IsDlgButtonChecked(hwnd, IDC_FLAT) ? GL_FLAT : GL_SMOOTH; + ss->state.bSmooth = IsDlgButtonChecked(hwnd, IDC_ANTIALIAS); + bBlend = IsDlgButtonChecked(hwnd, IDC_BLEND); + if (ss->state.bBlend != bBlend) + { + ss->state.da = -ss->state.da; + ss->state.bBlend = bBlend; + } + SetWindowLong(hwnd, DWL_MSGRESULT, FALSE); + return TRUE; + } + break; + + case PSN_RESET: + SetWindowLong(hwnd, DWL_MSGRESULT, FALSE); + return TRUE; + break; + + case PSN_APPLY: + ss->WriteGraphicConfigRegistry(); + SetWindowLong(hwnd, DWL_MSGRESULT, FALSE); + break; + } + break; + + case WM_COMMAND: + { + int id = LOWORD(wParam); + if (id == IDC_NOGLASS) + { + HWND hblend = GetDlgItem(hwnd, IDC_BLEND); + EnableWindow(hblend, !IsWindowEnabled(hblend)); + } + } + break; + + case WM_HELP: + { + LPHELPINFO lphi = (LPHELPINFO)lParam; + if (lphi->iContextType == HELPINFO_WINDOW) + { + WinHelp((HWND)lphi->hItemHandle, "Moebius Clock.hlp", HELP_WM_HELP, (DWORD)(LPSTR)aHelpIDs); + } + return TRUE; + } + break; + + case WM_CONTEXTMENU: + WinHelp((HWND)wParam, "Moebius Clock.hlp", HELP_CONTEXTMENU, (DWORD)(LPVOID)aHelpIDs); + return TRUE; + break; + } + return FALSE; +} + diff --git a/HotCorners.cpp b/HotCorners.cpp new file mode 100644 index 0000000..bce04be --- /dev/null +++ b/HotCorners.cpp @@ -0,0 +1,71 @@ +//========================================================================== +// +// File: HotCorners.cpp +// +//========================================================================== + +#include + +//****************************************************************************************** +// CheckHots: this routine checks for Hot Corner services. +// It first tries with SAGE.DLL, which comes with Windows Plus! +// Failint this it tries with ScrHots, a third-party hot-corner +// service program written by the author that is freely +// distributable and works with NT and '95. +// It's not actually used in the saver, but code is included here +// just to be useful. +BOOL +CheckHots() +{ + typedef BOOL (WINAPI *SYSTEMAGENTDETECT)(); + HINSTANCE sagedll = LoadLibrary("Sage.dll"); + if (sagedll != NULL) + { + SYSTEMAGENTDETECT detectproc = + (SYSTEMAGENTDETECT)GetProcAddress(sagedll, "System_Agent_Detect"); + BOOL res = FALSE; + if (detectproc != NULL) res = detectproc(); + FreeLibrary(sagedll); + if (res) return TRUE; + } + HINSTANCE hotsdll = LoadLibrary("ScrHots.dll"); + if (hotsdll != NULL) + { + SYSTEMAGENTDETECT detectproc = + (SYSTEMAGENTDETECT)GetProcAddress(hotsdll, "System_Agent_Detect"); + BOOL res = FALSE; + if (detectproc != NULL) res = detectproc(); + FreeLibrary(hotsdll); + if (res) return TRUE; + } + return FALSE; +} + +//****************************************************************************************** +// NotifyHots: if you make any changes to the hot corner +// information in the registry, you must call NotifyHots +// to inform the hot corner services of your change. +// It's not actually used in the saver, but code is included here +// just to be useful. +void __fastcall +NotifyHots() +{ + typedef VOID (WINAPI *SCREENSAVERCHANGED)(); + HINSTANCE sagedll = LoadLibrary("Sage.DLL"); + if (sagedll != NULL) + { + SCREENSAVERCHANGED changedproc = + (SCREENSAVERCHANGED)GetProcAddress(sagedll, "Screen_Saver_Changed"); + if (changedproc != NULL) changedproc(); + FreeLibrary(sagedll); + } + HINSTANCE hotsdll = LoadLibrary("ScrHots.dll"); + if (hotsdll != NULL) + { + SCREENSAVERCHANGED changedproc = + (SCREENSAVERCHANGED)GetProcAddress(hotsdll, "Screen_Saver_Changed"); + if (changedproc != NULL) changedproc(); + FreeLibrary(hotsdll); + } +} + diff --git a/HotCorners.h b/HotCorners.h new file mode 100644 index 0000000..ba4df01 --- /dev/null +++ b/HotCorners.h @@ -0,0 +1,19 @@ +//========================================================================== +// +// File: HotCorners.h +// +//========================================================================== + +#ifndef HOTCORNERS_H +#define HOTCORNERS_H + +#include + +//****************************************************************************************** + +BOOL CheckHots(); +void __fastcall NotifyHots(); + +//****************************************************************************************** + +#endif diff --git a/Moebius Clock.hlp b/Moebius Clock.hlp new file mode 100644 index 0000000000000000000000000000000000000000..7ce6d7a0ba8017252771d4f776b795dc2da0eff8 GIT binary patch literal 13365 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 +#include +#include "afxres.h" +#include "resource.h" +#include "OpenGLenv.h" + +#define TIMERID 1000 +#define UPDATE_TIME 10 + +#define SIGN_EXTEND(w) ((((int)(w)) << 16) >> 16) + + +/****************************************************************************/ + +#ifndef _SIM_DLL + int style = WS_OVERLAPPEDWINDOW; +#else + int style = WS_CHILD | WS_CAPTION; // style + char* str_DllName = "SimOpenGLDLL"; +#endif + +/****************************************************************************/ +// Forward function declarations + +static BOOL FirstInstance(HINSTANCE); +static BOOL AnyInstance(HWND&, HINSTANCE, int); +long FAR PASCAL WindowProc(HWND, UINT, WPARAM, LPARAM); + +/****************************************************************************/ +// Frame rate stuff +DWORD g_dwBegTime = 0; +DWORD g_dwLastTime = 0; +DWORD g_dwCurTime = 0; +DWORD g_dwFpsTime = 0; +DWORD g_dwDeltaTime = 0; +DWORD g_dwFramesRendered = 0; +DWORD g_dwFps = 0; +DWORD g_faces = 0; + +/****************************************************************************/ + +HINSTANCE _prev_inst = NULL; +LPSTR _cmdline = NULL; +int _cmdshow = SW_SHOW; + +int hChildLeft = 0; +int hChildTop = 0; +int hChildWidth = 512; +int hChildHeight= 512; +HWND hParwin = NULL; +HWND hWin = NULL; // Child application +HDC hdc = NULL; +HGLRC hglrc = NULL; + +static char ClassName[32] = "OpenGLClass"; +static char CaptionName[32] = "OpenGL Moebius Clock"; + +BOOL done = FALSE; // If simulation should be finished +BOOL bQuit = FALSE; // Set if we are quitting +BOOL bMovement = FALSE; + +extern GraphicEnvState state; + +/****************************************************************************/ +// +// Register the window class for the application. Also perform other +// desired application initialization +// +static BOOL +FirstInstance(HINSTANCE this_inst) +{ + // Contains the window class attributes to be registered + WNDCLASS wc; + // Status of the RegisteredClass call + BOOL rc; + + // + // Fill the slots of and register the window class + // + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = WindowProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = sizeof(DWORD); + wc.hInstance = this_inst; + wc.hIcon = LoadIcon(this_inst, MAKEINTRESOURCE(IDI_ICON1)); + //wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); + wc.lpszMenuName = "OpenGLMenu"; + wc.lpszClassName = ClassName; + rc = RegisterClass(&wc); + + // Return the initialized object + return rc; +} + +/****************************************************************************/ +// +// Perform the setup required for every instance of the application - +// Creation of the window and initialization of the data. +// + +static BOOL +AnyInstance(HWND& win, HINSTANCE this_inst, int cmdshow) +{ + HMENU hmenu = LoadMenu(this_inst, MAKEINTRESOURCE(IDR_MENU1)); + + // + // Create the main window + // + win = CreateWindow( + ClassName, // class + CaptionName, // caption + style, // style + hChildLeft, // init. x pos + hChildTop, // init. y pos + hChildWidth, // init. x size + hChildHeight, // init. y size + hParwin, // parent window + hmenu, // menu handle + this_inst, // program handle + NULL // create params + ); + if (!win) return FALSE; + + if (!InitGraphicEnv(hWin, &hdc, &hglrc)) return FALSE; + + InitState(); + InitTexture(); + InitDisplayLists(); + + SetTimer(win, TIMERID, UPDATE_TIME, NULL); + + // + // Show and update the window + // + ShowWindow(win, cmdshow); + UpdateWindow(win); + + return TRUE; +} + +/****************************************************************************/ + +BOOL +InitWindow(HINSTANCE this_inst, HWND hPar, int xleft, int xright, int width, int height) +{ + hParwin = hPar; + hChildLeft = xleft; + hChildTop = xright; + hChildWidth = width; + hChildHeight = height; + + g_dwBegTime = timeGetTime(); + + // If there is no previous instance set, register the window class + // for the application + if (!_prev_inst) + if (!FirstInstance(this_inst)) + return FALSE; + + // If we cannot do the remaining window setup, return an error + if (!AnyInstance(hWin, this_inst, _cmdshow)) + return FALSE; + + return TRUE; +} + +/****************************************************************************/ + +BOOL +ReInitWindow() +{ + KillTimer(hWin, TIMERID); + DestroyGraphicEnv(hWin, hdc, hglrc); + CloseWindow(hWin); + + return TRUE; +} + +/****************************************************************************/ + +int +WinOpen(HINSTANCE this_inst, HWND hPar, int xleft, int xright, int width, int height) +{ + MSG msg; + + if (InitWindow(this_inst, hPar, xleft, xright, width, height) == FALSE) + return FALSE; + + // Loop until we are done - either the user quits or an error occurs + while (!done) + { + // Check the thread message queue for a message and place it in + // message if there is one. + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + { + done = TRUE; + break; + } + // Translate the virtual key messages into character messages + TranslateMessage(&msg); + + // Dispatch the message to the window proceedure + DispatchMessage(&msg); + } + } + + ReInitWindow(); + return msg.wParam; +} + +/****************************************************************************/ +// +// This function is the main routine containing the message loop. +// Here we call the functions to create, initialize, and activate +// the program's main window and handle the various messages. +// + +int PASCAL +WinMain(HINSTANCE this_inst, HINSTANCE prev_inst, LPSTR cmdline, int cmdshow) +{ + _prev_inst = prev_inst; + _cmdline = cmdline; + _cmdshow = cmdshow; + + return WinOpen(this_inst, NULL, 0, 0, 512, 512); +} + +/****************************************************************************/ + +BOOL +TimerProc(HWND hwnd) +{ + if (!bQuit) + { + // Try to render the screen + g_dwCurTime = timeGetTime(); + + // Perform some timing stuff + g_dwDeltaTime = g_dwCurTime - g_dwLastTime; + g_dwLastTime = g_dwCurTime; + g_dwFpsTime += g_dwDeltaTime; + g_dwFramesRendered++; + + // Update every second + if (g_dwFpsTime > 1000) + { + char str[256]; + + g_dwFps = g_dwFramesRendered; + g_dwFramesRendered = 0; + + sprintf ( (LPSTR)str, "OpenGLDemo - FPS: %.3f", + 1000.0*(float)g_dwFps/(float)g_dwFpsTime ); + SetWindowText(hWin, (LPSTR)str); + + g_dwFpsTime = 0; + } + UpdateTime(); + InvalidateRect(hwnd, NULL, FALSE); + } + + return TRUE; +} + +/****************************************************************************/ +// +// Process the messages for the 'about' dialog. +// +BOOL FAR PASCAL +AboutDlgProc(HWND win, unsigned msg, WORD wparam, LONG lparam) +{ + // Check the message + switch (msg) + { + // If we received an InitDialog message, just return true + case WM_INITDIALOG: + return TRUE; + + // If we received an OK button selection, + // close the dialog and return true + case WM_COMMAND: + if (wparam == IDOK) + { + EndDialog(win, TRUE); + return TRUE; + } + break; + } + // Otherwise, return false + return FALSE; +} + +/****************************************************************************/ + +void +OnCreate(HWND win) +{ + CheckMenuItem( + GetMenu(win), ID_VIEW_ANTIALIAS, + state.bSmooth ? MF_CHECKED : MF_UNCHECKED + ); + CheckMenuItem( + GetMenu(win), ID_VIEW_BLEND, + state.bBlend ? MF_CHECKED : MF_UNCHECKED + ); + CheckMenuItem( + GetMenu(win), ID_VIEW_CULL, + state.bCulling ? MF_CHECKED : MF_UNCHECKED + ); + CheckMenuRadioItem( + GetMenu(win), ID_VIEW_METHOD_NICEST, ID_VIEW_METHOD_FASTEST, + state.nLineSmoothHint == GL_NICEST ? ID_VIEW_METHOD_NICEST : + ID_VIEW_METHOD_FASTEST, MF_BYCOMMAND + ); + CheckMenuRadioItem( + GetMenu(win), + ID_VIEW_SHADE_FLAT, ID_VIEW_SHADE_GOURARD, + state.nShadeModel == GL_SMOOTH ? ID_VIEW_SHADE_GOURARD : + ID_VIEW_SHADE_FLAT, MF_BYCOMMAND + ); + CheckMenuItem( + GetMenu(win), ID_VIEW_LINEAR, + state.nLinear == 1 ? MF_CHECKED : MF_UNCHECKED + ); + + CheckMenuItem(GetMenu(win), ID_VIEW_MIDMAPS, MF_CHECKED); + + CheckMenuRadioItem( + GetMenu(win), + ID_VIEW_PERSP_NICEST, ID_VIEW_PERSP_FASTEST, + state.nPerspCorrectionHint == GL_NICEST ? ID_VIEW_PERSP_NICEST : + ID_VIEW_PERSP_FASTEST, MF_BYCOMMAND + ); + CheckMenuItem( + GetMenu(win), ID_VIEW_NORMALS, + state.bNormals ? MF_CHECKED : MF_UNCHECKED + ); + CheckMenuItem( + GetMenu(win), ID_VIEW_QUICK, + state.bQuick ? MF_CHECKED : MF_UNCHECKED + ); + CheckMenuItem( + GetMenu(win), ID_VIEW_SWING, + state.bSwing ? MF_CHECKED : MF_UNCHECKED + ); + CheckMenuItem( + GetMenu(win), ID_VIEW_ZBUFFER, + state.bDepthTest ? MF_CHECKED : MF_UNCHECKED + ); + CheckMenuItem( + GetMenu(win), ID_VIEW_WIREFRAME, + state.nPolygonMode == GL_LINE ? MF_CHECKED : MF_UNCHECKED + ); +} + +/****************************************************************************/ + +void +OnCommand(HWND win, WPARAM wparam, LPARAM lparam) +{ + switch( wparam & 0xffff ) + { + case ID_FILE_EXIT: + PostQuitMessage(0); + bQuit = TRUE; + break; + + case ID_VIEW_ANTIALIAS: + state.bSmooth = !state.bSmooth; + CheckMenuItem( + GetMenu(win), ID_VIEW_ANTIALIAS, + state.bSmooth ? MF_CHECKED : MF_UNCHECKED + ); + EnableGraphicOption(GL_LINE_SMOOTH, state.bSmooth); + EnableGraphicOption(GL_POLYGON_SMOOTH, state.bSmooth); + break; + + case ID_VIEW_BLEND: + state.da = -state.da; + state.bBlend = !state.bBlend; + CheckMenuItem( + GetMenu(win), ID_VIEW_BLEND, + state.bBlend ? MF_CHECKED : MF_UNCHECKED + ); + break; + + case ID_VIEW_CULL: + state.bCulling = !state.bCulling; + CheckMenuItem( + GetMenu(win), ID_VIEW_CULL, + state.bCulling ? MF_CHECKED : MF_UNCHECKED + ); + EnableGraphicOption(GL_CULL_FACE, state.bCulling); + break; + + case ID_VIEW_METHOD_NICEST: + if (state.nLineSmoothHint != GL_NICEST) + { + state.nLineSmoothHint = GL_NICEST; + CheckMenuRadioItem( + GetMenu(win), ID_VIEW_METHOD_NICEST, ID_VIEW_METHOD_FASTEST, + ID_VIEW_METHOD_NICEST, MF_BYCOMMAND + ); + glHint(GL_LINE_SMOOTH_HINT, state.nLineSmoothHint); + } + break; + + case ID_VIEW_METHOD_FASTEST: + if (state.nLineSmoothHint != GL_FASTEST) + { + state.nLineSmoothHint = GL_FASTEST; + CheckMenuRadioItem( + GetMenu(win), ID_VIEW_METHOD_NICEST, ID_VIEW_METHOD_FASTEST, + ID_VIEW_METHOD_FASTEST, MF_BYCOMMAND + ); + glHint(GL_LINE_SMOOTH_HINT, state.nLineSmoothHint); + } + break; + + case ID_VIEW_SHADE_FLAT: + if (state.nShadeModel != GL_FLAT) + { + state.nShadeModel = GL_FLAT; + CheckMenuRadioItem( + GetMenu(win), + ID_VIEW_SHADE_FLAT, ID_VIEW_SHADE_GOURARD, + ID_VIEW_SHADE_FLAT, MF_BYCOMMAND + ); + glShadeModel(state.nShadeModel); + } + break; + + case ID_VIEW_SHADE_GOURARD: + if (state.nShadeModel != GL_SMOOTH) + { + state.nShadeModel = GL_SMOOTH; + CheckMenuRadioItem( + GetMenu(win), + ID_VIEW_SHADE_FLAT, ID_VIEW_SHADE_GOURARD, + ID_VIEW_SHADE_GOURARD, MF_BYCOMMAND + ); + glShadeModel(state.nShadeModel); + } + break; + + case ID_VIEW_LINEAR: + state.nLinear = (state.nLinear == 1 ? 0 : 1); + CheckMenuItem( + GetMenu(win), ID_VIEW_LINEAR, + state.nLinear == 1 ? MF_CHECKED : MF_UNCHECKED + ); + break; + + case ID_VIEW_PERSP_NICEST: + if (state.nPerspCorrectionHint != GL_NICEST) + { + state.nPerspCorrectionHint = GL_NICEST; + CheckMenuRadioItem( + GetMenu(win), + ID_VIEW_PERSP_NICEST, ID_VIEW_PERSP_FASTEST, + ID_VIEW_PERSP_NICEST, MF_BYCOMMAND + ); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, state.nPerspCorrectionHint); + } + break; + + case ID_VIEW_PERSP_FASTEST: + if (state.nPerspCorrectionHint != GL_FASTEST) + { + state.nPerspCorrectionHint = GL_FASTEST; + CheckMenuRadioItem( + GetMenu(win), + ID_VIEW_PERSP_NICEST, ID_VIEW_PERSP_FASTEST, + ID_VIEW_PERSP_FASTEST, MF_BYCOMMAND + ); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, state.nPerspCorrectionHint); + } + break; + + case ID_VIEW_NORMALS: + state.bNormals = !state.bNormals; + CheckMenuItem( + GetMenu(win), ID_VIEW_NORMALS, + state.bNormals ? MF_CHECKED : MF_UNCHECKED + ); + break; + + case ID_VIEW_QUICK: + state.bQuick = !state.bQuick; + CheckMenuItem( + GetMenu(win), ID_VIEW_QUICK, + state.bQuick ? MF_CHECKED : MF_UNCHECKED + ); + break; + + case ID_VIEW_SWING: + state.bSwing = !state.bSwing; + CheckMenuItem( + GetMenu(win), ID_VIEW_SWING, + state.bSwing ? MF_CHECKED : MF_UNCHECKED + ); + break; + + case ID_VIEW_ZBUFFER: + state.bDepthTest = !state.bDepthTest; + CheckMenuItem( + GetMenu(win), ID_VIEW_ZBUFFER, + state.bDepthTest ? MF_CHECKED : MF_UNCHECKED + ); + EnableGraphicOption(GL_DEPTH_TEST, state.bDepthTest); + break; + + case ID_VIEW_WIREFRAME: + state.nPolygonMode = (state.nPolygonMode == GL_LINE ? GL_FILL : GL_LINE); + CheckMenuItem( + GetMenu(win), ID_VIEW_WIREFRAME, + state.nPolygonMode == GL_LINE ? MF_CHECKED : MF_UNCHECKED + ); + glPolygonMode(GL_FRONT_AND_BACK, state.nPolygonMode); + break; + + case ID_HELP_ABOUT: + DialogBox( + (HINSTANCE)GetWindowLong(win, GWL_HINSTANCE), + MAKEINTRESOURCE(IDD_ABOUT), win, + (DLGPROC)AboutDlgProc + ); + break; + } + InvalidateRect(win, NULL, FALSE); +} + +/****************************************************************************/ +// +// Process the messages for the main application window +// +LONG FAR PASCAL +WindowProc(HWND win, UINT msg, WPARAM wparam, LPARAM lparam) +{ + static BOOL bRoll = FALSE; + static POINT anchor; + + // Handle the various message that we received + switch (msg) + { + case WM_CREATE: + OnCreate(win); + break; + + case WM_KEYDOWN: + { + // Check for any keyboard key depression + switch (wparam) + { + case VK_SPACE: + ResetOrientationGraphicEnv(); + CheckMenuItem( + GetMenu(win), ID_VIEW_SWING, + state.bSwing ? MF_CHECKED : MF_UNCHECKED + ); + break; + + case 'T': + break; + case VK_UP: + break; + case VK_DOWN: + break; + case VK_RIGHT: + break; + case VK_LEFT: + break; + case VK_HOME: + break; + case VK_END: + break; + case VK_INSERT: + break; + case VK_DELETE: + break; + case VK_PRIOR: // PageUp + break; + case VK_NEXT: // PageDown + break; + case VK_NUMPAD4: + break; + } + } + break; + + // If the user releases a key, see which one it was and do the appropriate action + case WM_KEYUP: + switch (wparam) + { + case 'T': + break; + } + break; + + case WM_COMMAND: + OnCommand(win, wparam, lparam); + break; + + case WM_LBUTTONDOWN: + RECT rc; + bMovement = TRUE; + GetClientRect(win, &rc); + GetCursorPos(&anchor); + ScreenToClient(hWin, &anchor); + bRoll = (GetKeyState(VK_SHIFT) & 0x8000) >> 15; + SetCapture(win); + break; + + case WM_LBUTTONUP: + bMovement = FALSE; + bRoll = FALSE; + ReleaseCapture(); + break; + + case WM_RBUTTONDOWN: + break; + case WM_RBUTTONUP: + break; + + case WM_MOUSEMOVE: + if (bMovement & wparam & MK_LBUTTON) + { + POINT mouse; + mouse.x = SIGN_EXTEND(LOWORD(lparam)); + mouse.y = SIGN_EXTEND(HIWORD(lparam)); + MotionOfGraphicEnv(&anchor, mouse, bRoll); + } + break; + + case WM_TIMER: + if (wparam == TIMERID) + TimerProc(win); + break; + + // We are quitting and destroying the window + case WM_DESTROY: + PostQuitMessage(0); + bQuit = TRUE; + break; + + case WM_SIZE: + { + int width = LOWORD(lparam); + int height = HIWORD(lparam); + if (width && height) + { + Reshape(hdc, width, height); + } + } + break; + + case WM_ACTIVATE: + break; + + // Handle the window paint message and update the window + case WM_PAINT: + { + RECT r; + PAINTSTRUCT ps; + + // Retrieve the coordinates of the smallest rectangle that completely encloses the + // update region of the specified window (win) + if (GetUpdateRect(win, &r, FALSE)) + { + BeginPaint(win, &ps); + Display(hdc); + EndPaint(win, &ps); + } + } + + default: + // Default to just handling any messages not explicitly handled above + return DefWindowProc(win, msg, wparam, lparam); + } + return 0L; +} + diff --git a/Moebius.ico b/Moebius.ico new file mode 100644 index 0000000000000000000000000000000000000000..dd02f8acc71471021369bb4ab1c91ae536928d5a GIT binary patch literal 3310 zcmbW4ziS*v6vyBB1SjvEk=(d4vEs_E2Li4l+#A%mb~pcmn?SY_xDyH(wo{P=M-VvN zy4lJ_JVh$Ii9q1O!3c8dUz3=<+-I<-!$ZTX|+uGVR$?sRp zzGB?kl4ka7-Rz68+2&@!?~Ke|PR;IsZPB)ABU__Kh`n5DGrm^WWuRwjZQC*m$o{pQ zHKXy7N!_J#csNT-pgNSE+RlQi*K?87!vpma&$)z&Xw9kvK}BZms(T3- zvdM)C|Ik;%323En$kj#q#=<`vmKXV=HCt?SVvEJBozBr07&R=+q?cHR#nrv(9JEMY zxZY_#T-~!5t9oOf>hq<;Rq*MmzK6b&ph346gM-{x9UR7?i)b8{gBzL-cEh|`s-ClV zR>oDyi;bM?QU1&9+Y7U=&&+NuSi)noNozJ%t9b?cX8$6+pT@R}KPH!QDz|E=mTIc@ z$L~3ZL9$i`?>P?~fKF=T)uz>Dpl9mudHY*yi(h`UwY4={UthP`Y-ZQ5U$+}KZrIJ6 zH|_TA+jjTvU3>WOp*?u;!0z9_Z};xqv-+ECJ3HCFv)7hSlD&NWhrNFH&h~!#nL>dU zXjGj{| zMIT5WNE8SPoLetX7vK=!5a1Bt;FRDH;1J*t;1J;8G~p275a1Bt5a8g{;Sk^u;1J*t z;1Du4cm#L^@!&TCR?Z^QN4P||M7a1P!zEHYQYex%!o`;XFfxg7iE!~{fk%W#ghzx& zgoiH`JR%$-93mXFbP*mA4iOH?f3Z?oLh6(cx-YL*2UgT>@bjgnb_1t|q74NaI5pI6 z067;l<-(@z@Y>j^-%!7yzP6~Le#6={aA@GrunyWbR>hwl3nRU@ku^xvOK?l@NYwMK z6%W=R!6S(W59ZrVP=ZT>OM*nApuYleNdzXG5{3j9zBKZ%CkZY|>)~AVHfR^H!6CyT z!y&^V!y&`LUne*uIAl0vI3zfbhK4^JG8{4-G8{-v!w!cGhYW`dflU2GvP@vcDUu_i zM|fngD9*KT`T-vvuVnXdG6+BM1bP4$ zL47%g2Yfn}gNJtU0}caKa8l}u04sf$00)(jlTZ5Ujw?Ymk%#T??@uO5(1q*eJ=Zf5 z3qW&p3HJ{27-Td=%j6l($AgEX;?_%Xz++sE5QsbV9##gCKq|+y?#pPo`FZT|USGz$ zWr$cg>ec7&D97cF;rA15$p4YLyWh0rI{wUEMfa3V+7_+9kJrpEm)f|R(CRYKGyRYE z@#@*EB}aAmY?hcD9<1DlQ+I8i`F&USUOcbu*m}KQ+qI(|?tpXjUv+<#-S4T_^w-O; umwpd@F@NGW#_9aY9?_kg-P*R}$+orQZL3G6mH$Gv@%Xs)xO^3(*uMd-b6l_h literal 0 HcmV?d00001 diff --git a/Moebius32.aps b/Moebius32.aps new file mode 100644 index 0000000000000000000000000000000000000000..ec08808b6aa45ad5bd70d27dd756d61a0e26c4a5 GIT binary patch literal 1014616 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]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\n{kb1OF*b+5RIvrJc6S_`}gW!+-)r5zoVS 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 literal 0 HcmV?d00001 diff --git a/Moebius32.rc b/Moebius32.rc new file mode 100644 index 0000000..fb4d943 --- /dev/null +++ b/Moebius32.rc @@ -0,0 +1,318 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +// Generated Help ID header file +#define APSTUDIO_HIDDEN_SYMBOLS +#include "resource.hm" +#undef APSTUDIO_HIDDEN_SYMBOLS + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1255) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_CAFE BITMAP DISCARDABLE "cafe.bmp" +IDB_HOURS0 BITMAP DISCARDABLE "hours0.bmp" +IDB_HOURS1 BITMAP DISCARDABLE "hours1.bmp" +IDB_HOURS2 BITMAP DISCARDABLE "hours2.bmp" +IDB_HOURS3 BITMAP DISCARDABLE "hours3.bmp" +IDB_OGLLOGO BITMAP DISCARDABLE "ogllogo.bmp" +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Unknown language: 0xD, 0x1 resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_HEB) +#ifdef _WIN32 +LANGUAGE 0xD, 0x1 +#pragma code_page(1255) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_MONITOR BITMAP DISCARDABLE "monitor.bmp" +IDB_BCHECK BITMAP DISCARDABLE "bcheck.bmp" +IDB_BDOT BITMAP DISCARDABLE "bdot.bmp" +IDB_BNONE BITMAP DISCARDABLE "bnone.bmp" +IDB_MONITOR2 BITMAP DISCARDABLE "monitor2.bmp" + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_MENU1 MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "E&xit", ID_FILE_EXIT + END + POPUP "&View" + BEGIN + MENUITEM "&Antialiasing", ID_VIEW_ANTIALIAS + POPUP "Antialiasing &Method" + BEGIN + MENUITEM "&Nicest", ID_VIEW_METHOD_NICEST + MENUITEM "&Fastest", ID_VIEW_METHOD_FASTEST + END + POPUP "&Shading Model" + BEGIN + MENUITEM "&Flat", ID_VIEW_SHADE_FLAT + MENUITEM "&Gourard", ID_VIEW_SHADE_GOURARD + END + MENUITEM "Alpha &Blending", ID_VIEW_BLEND + MENUITEM "&Linear Filtering", ID_VIEW_LINEAR + MENUITEM "Mi&dmaps", ID_VIEW_MIDMAPS + MENUITEM SEPARATOR + MENUITEM "Swin&g Clock", ID_VIEW_SWING + MENUITEM "Speed &Up Clock", ID_VIEW_QUICK + MENUITEM SEPARATOR + MENUITEM "Show &Wireframe", ID_VIEW_WIREFRAME + MENUITEM "Show &Normals", ID_VIEW_NORMALS + MENUITEM SEPARATOR + MENUITEM "Use &Z-Buffer", ID_VIEW_ZBUFFER + MENUITEM "Backface &Culling", ID_VIEW_CULL + POPUP "&Perspective Correction" + BEGIN + MENUITEM "&Nicest", ID_VIEW_PERSP_NICEST + MENUITEM "&Fastest", ID_VIEW_PERSP_FASTEST + END + END + POPUP "&Help" + BEGIN + MENUITEM "&About", ID_HELP_ABOUT + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ICON1 ICON DISCARDABLE "Moebius.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUT DIALOG DISCARDABLE 0, 0, 246, 98 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About Moebius Clock Screensaver" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,189,7,50,14 + ICON IDI_ICON1,IDC_STATIC,15,25,20,20 + LTEXT "Moebius Clock Screensaver v 1.8",IDC_STATIC,50,15,131, + 15 + LTEXT "Concept and OpenGL implementation by\n\tRon Inbar :\trinbar@netvision.net.il\nWin32 implementation by\n\t Uriel Cohen :\turielc@actcom.co.il", + IDC_STATIC,50,35,185,35 + LTEXT "Copyright © 1999-2000 by Uriel Cohen && Ron Inbar", + IDC_STATIC,50,75,185,15 +END + +IDD_GRAPHIC_CONFIG DIALOGEX 0, 0, 239, 220 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "OpenGL" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + GROUPBOX "Rendering",IDC_STATIC,15,20,120,95 + CONTROL "Flat Shading",IDC_FLAT,"Button",BS_AUTORADIOBUTTON | + WS_GROUP | WS_TABSTOP,30,35,70,15,0,HIDC_FLAT + CONTROL "Gouraud Shading",IDC_GOURAUD,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,30,50,75,15,0, + HIDC_GOURAUD + CONTROL "Alpha Blending",IDC_BLEND,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,30,90,75,15,0,HIDC_BLEND + GROUPBOX "Texture Filtering",IDC_STATIC,15,130,205,70 + CONTROL "Nearest",IDC_NEAREST,"Button",BS_AUTORADIOBUTTON | + WS_GROUP | WS_TABSTOP,30,150,60,15,0,HIDC_NEAREST + CONTROL "Linear",IDC_LINEAR,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,30,165,60,15,0,HIDC_LINEAR + CONTROL "Without Mipmaps",IDC_WMIPMAPS,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,105,145,105, + 15,0,HIDC_WMIPMAPS + CONTROL "Nearest Mipmap",IDC_NMIPMAPS,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,105,160,105,15,0, + HIDC_NMIPMAPS + CONTROL "Linear Between Mipmaps",IDC_LMIPMAPS,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,105,175,105,15,0, + HIDC_LMIPMAPS + CONTROL "Normals",IDC_NORMALS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,155,25,75,15,0,HIDC_NORMALS + CONTROL "Wireframe",IDC_WIREFRAME,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,155,40,75,15,0,HIDC_WIREFRAME + CONTROL "Z-Buffer",IDC_ZBUFFER,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,155,55,75,15,0,HIDC_ZBUFFER + CONTROL "Backface Culling",IDC_CULL,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,155,70,75,15,0,HIDC_CULL + CONTROL "No Covering Glass",IDC_NOGLASS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,155,85,75,15,0,HIDC_NOGLASS + CONTROL "No Extra Textures",IDC_NOTEXTURES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,155,100,75,15,0, + HIDC_NOTEXTURES + CONTROL "Antialiasing",IDC_ANTIALIAS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,30,75,75,15,0,HIDC_ANTIALIAS +END + +IDD_GENERAL DIALOGEX 0, 0, 237, 220 +STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU +CAPTION "General" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "You can display the screen saver immediately or prevent it from\nappearing at all,by moving the mouse pointer to a corner on \nthe screen. Click the corners you want to use.", + ID_SAGEOK,13,8,282,32 + LTEXT "The system agent must be active in order for you to display \nthe screen saver immediately by moving the mouse \npointer to a corner on the screen.", + ID_SAGEBAD,13,13,282,32 + GROUPBOX "Options for dismissing the screen saver", + ID_DISMISSGROUP,7,154,223,47 + LTEXT "&Mouse sensitivity",ID_THRESHOLDDESC,13,169,58,12 + COMBOBOX ID_THRESHOLD,74,167,148,72,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP,0,HID_THRESHOLD + RTEXT "&Wait",ID_WAITDESC,13,184,16,12 + EDITTEXT ID_WAITTEXT,32,184,25,12,0,0,HID_WAITTEXT + CONTROL "Generic1",ID_WAITBUDDY,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,57,184,11,36,0,HID_WAITBUDDY + COMBOBOX ID_WAITBOX,74,184,50,36,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP,0,HID_WAITBOX + LTEXT "before requiring a password",ID_WAITMOREDESC,130,185,95, + 11 + LTEXT "Always require password",ID_WAITSUMMARY,13,184,282,11, + NOT WS_GROUP + CONTROL "Mute Sound",ID_MUTE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,11,202,65,15,0,HID_MUTE + CONTROL 122,IDC_UL,"Static",SS_BITMAP | SS_NOTIFY,64,54,12,11,0, + HIDC_UL + CONTROL 122,IDC_UR,"Static",SS_BITMAP | SS_NOTIFY,127,54,12,11,0, + HIDC_UR + CONTROL 122,IDC_DL,"Static",SS_BITMAP | SS_NOTIFY,64,98,12,11,0, + HIDC_DL + CONTROL 122,IDC_DR,"Static",SS_BITMAP | SS_NOTIFY,127,98,12,11,0, + HIDC_DR + CONTROL "Monitor",IDC_MONITOR,"Button",BS_OWNERDRAW | WS_TABSTOP, + 55,45,92,85,0,HIDC_MONITOR +END + +IDD_BEHAVIOR DIALOGEX 0, 0, 239, 220 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Behavior" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Speed Up Clock",IDC_QUICK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,150,70,70,15,0,HIDC_QUICK + CONTROL "Swing Clock",IDC_SWING,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,150,85,70,15,0,HIDC_SWING + CONTROL "Interactive",IDC_USEMOUSE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,150,100,70,15,0,HIDC_USEMOUSE + CONTROL "Backdrop",IDC_BACK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,150,115,70,15,0,HIDC_BACK + LTEXT "Moebius Strip Twists",IDC_STATIC,65,173,65,15 + EDITTEXT IDC_EDIT1,132,171,30,15,ES_AUTOHSCROLL | ES_READONLY | + ES_NUMBER,0,HIDC_EDIT1 + CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,164,170,7, + 15,0,HIDC_SPIN1 + PUSHBUTTON "About...",IDC_ABOUT,160,15,50,14,0,0,HIDC_ABOUT + CONTROL "Monitor",IDC_MONITOR,"Button",BS_OWNERDRAW | + WS_DISABLED | WS_TABSTOP,15,60,92,85,0,HIDC_MONITOR + LTEXT "Backdrop Colors:",IDC_STATIC,15,45,85,10 + CONTROL "Color 1",IDC_COLOR1,"Button",BS_OWNERDRAW | WS_TABSTOP, + 24,69,12,11,0,HIDC_COLOR1 + CONTROL "Color 2",IDC_COLOR2,"Button",BS_OWNERDRAW | WS_TABSTOP, + 87,70,12,11,0,HIDC_COLOR2 + CONTROL "Color 3",IDC_COLOR3,"Button",BS_OWNERDRAW | WS_TABSTOP, + 24,113,12,11,0,HIDC_COLOR3 + CONTROL "Color 4",IDC_COLOR4,"Button",BS_OWNERDRAW | WS_TABSTOP, + 87,113,12,11,0,HIDC_COLOR4 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_BEHAVIOR, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 232 + TOPMARGIN, 7 + BOTTOMMARGIN, 213 + END +END +#endif // APSTUDIO_INVOKED + +#endif // Unknown language: 0xD, 0x1 resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/MoebiusScreenSaver.dsp b/MoebiusScreenSaver.dsp new file mode 100644 index 0000000..07df511 --- /dev/null +++ b/MoebiusScreenSaver.dsp @@ -0,0 +1,231 @@ +# Microsoft Developer Studio Project File - Name="MoebiusScreenSaver" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=MoebiusScreenSaver - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "MoebiusScreenSaver.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "MoebiusScreenSaver.mak" CFG="MoebiusScreenSaver - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "MoebiusScreenSaver - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "MoebiusScreenSaver - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName ""$/MoebiusScreenSaver", BAAAAAAA" +# PROP Scc_LocalPath "." +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "MoebiusScreenSaver - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FR /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x40d /d "NDEBUG" +# ADD RSC /l 0x40d /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib winmm.lib comctl32.lib /nologo /subsystem:windows /machine:I386 /out:"Release/Moebius Clock.scr" + +!ELSEIF "$(CFG)" == "MoebiusScreenSaver - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FR /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x40d /d "_DEBUG" +# ADD RSC /l 0x40d /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib winmm.lib comctl32.lib /nologo /subsystem:windows /debug /machine:I386 /out:"Debug/Moebius Clock.scr" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "MoebiusScreenSaver - Win32 Release" +# Name "MoebiusScreenSaver - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\BehaviorDialog.cpp +# End Source File +# Begin Source File + +SOURCE=.\GeneralDialog.cpp +# End Source File +# Begin Source File + +SOURCE=.\GraphicConfigDialog.cpp +# End Source File +# Begin Source File + +SOURCE=.\HotCorners.cpp +# End Source File +# Begin Source File + +SOURCE=.\Moebius32.rc +# End Source File +# Begin Source File + +SOURCE=.\OpenGLenv.cpp +# End Source File +# Begin Source File + +SOURCE=.\Password.cpp +# End Source File +# Begin Source File + +SOURCE=.\SaverSettings.cpp +# End Source File +# Begin Source File + +SOURCE=.\ScreenSaver.cpp +# End Source File +# Begin Source File + +SOURCE=.\texture.c +# End Source File +# Begin Source File + +SOURCE=.\TransparentBitmap.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\Debug.h +# End Source File +# Begin Source File + +SOURCE=.\Dialogs.h +# End Source File +# Begin Source File + +SOURCE=.\HotCorners.h +# End Source File +# Begin Source File + +SOURCE=.\OpenGLenv.h +# End Source File +# Begin Source File + +SOURCE=.\Password.h +# End Source File +# Begin Source File + +SOURCE=.\SaverSettings.h +# End Source File +# Begin Source File + +SOURCE=.\TransparentBitmap.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\bcheck.bmp +# End Source File +# Begin Source File + +SOURCE=.\bdot.bmp +# End Source File +# Begin Source File + +SOURCE=.\bnone.bmp +# End Source File +# Begin Source File + +SOURCE=.\cafe.bmp +# End Source File +# Begin Source File + +SOURCE=.\hours0.bmp +# End Source File +# Begin Source File + +SOURCE=.\hours1.bmp +# End Source File +# Begin Source File + +SOURCE=.\hours2.bmp +# End Source File +# Begin Source File + +SOURCE=.\hours3.bmp +# End Source File +# Begin Source File + +SOURCE=.\icon2.ico +# End Source File +# Begin Source File + +SOURCE=.\Moebius.ico +# End Source File +# Begin Source File + +SOURCE=.\monitor.bmp +# End Source File +# Begin Source File + +SOURCE=.\monitor.ico +# End Source File +# Begin Source File + +SOURCE=.\monitor2.bmp +# End Source File +# Begin Source File + +SOURCE=.\ogllogo.bmp +# End Source File +# End Group +# End Target +# End Project diff --git a/MoebiusScreenSaver.dsw b/MoebiusScreenSaver.dsw new file mode 100644 index 0000000..1d8654c --- /dev/null +++ b/MoebiusScreenSaver.dsw @@ -0,0 +1,45 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Mobius32"="..\Mobius32\Mobius32.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MoebiusScreenSaver"=".\MoebiusScreenSaver.dsp" - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + "$/MoebiusScreenSaver", BAAAAAAA + . + end source code control +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/MoebiusScreenSaver.hpj b/MoebiusScreenSaver.hpj new file mode 100644 index 0000000..9fd87a5 --- /dev/null +++ b/MoebiusScreenSaver.hpj @@ -0,0 +1,35 @@ +; This file is maintained by HCW. Do not modify this file directly. + +[OPTIONS] +LCID=0x409 0x0 0x0 ; English (United States) +REPORT=Yes +HLP=Moebius Clock.hlp + +[FILES] +MoebiusScreenSaver.rtf + +[MAP] +HID_MUTE=0x80710404 +HID_THRESHOLD=0x807103fb +HID_WAITBOX=0x80710400 +HID_WAITTEXT=0x807103fe +HIDC_ABOUT=0x807b03ec +HIDC_ANTIALIAS=0x806f0415 +HIDC_BACK=0x807b03fa +HIDC_BLEND=0x806f03eb +HIDC_COLOR1=0x807b040f +HIDC_CULL=0x806f03f3 +HIDC_FLAT=0x806f03e9 +HIDC_GOURAUD=0x806f03ea +HIDC_NEAREST=0x806f040a +HIDC_NOGLASS=0x806f0413 +HIDC_NORMALS=0x806f03ee +HIDC_NOTEXTURES=0x806f0414 +HIDC_QUICK=0x807b03ed +HIDC_SPIN1=0x807b03f1 +HIDC_SWING=0x807b03f8 +HIDC_UL=0x80710406 +HIDC_USEMOUSE=0x807b03fc +HIDC_WIREFRAME=0x806f03ef +HIDC_WMIPMAPS=0x806f040c +HIDC_ZBUFFER=0x806f03f2 diff --git a/MoebiusScreenSaver.rtf b/MoebiusScreenSaver.rtf new file mode 100644 index 0000000..b7bbbb7 --- /dev/null +++ b/MoebiusScreenSaver.rtf @@ -0,0 +1,92 @@ +{\rtf1\adeflang1037\ansi\ansicpg1255\uc1\adeff15 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f11\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}MS Sans Serif{\*\falt Arial};} +{\f15\fbidi \fcharset177\fprq2{\*\panose 00000000000000000000}Miriam;}{\f17\froman\fcharset238\fprq2 Times New Roman CE;}{\f18\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f20\froman\fcharset161\fprq2 Times New Roman Greek;} +{\f21\froman\fcharset162\fprq2 Times New Roman Tur;}{\f22\fbidi \fcharset177\fprq2 Times New Roman (Hebrew);}{\f24\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f110\fbidi \fcharset177\fprq2 MS Sans Serif (Hebrew){\*\falt Arial};}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; +\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql\nowidctlpar\widctlpar\adjustright \ql \rtlch\af15\afs20 \ltrch\fs20 \snext0 Normal;}{\*\cs10 \additive +Default Paragraph Font;}{\s15\ql\nowidctlpar\widctlpar\adjustright \ql \rtlch\af15\afs20 \ltrch\fs20 \sbasedon0 \snext15 footnote text;}{\*\cs16 \additive \rtlch\af15\super \ltrch\super \sbasedon10 footnote reference;}{\s17\ql\li142\sb80\sl240\slmult0 +\nowidctlpar\adjustright \ql \rtlch\af15\afs20 \ltrch\f11\fs16\lang1024 \sbasedon0 \snext17 Body Text 2;}}{\info{\title Renders the clock model using flat shading (only one color is calculated for each polygon)}{\author Uriel Cohen}{\operator Uriel Cohen} +{\creatim\yr1999\mo11\dy28\hr18\min20}{\revtim\yr1999\mo11\dy29\hr20\min10}{\version46}{\edmins66}{\nofpages24}{\nofwords712}{\nofchars4063}{\*\company Cohen S.A}{\nofcharsws4989}{\vern89}}\ltrsect +\widowctrl\ftnbj\aenddoc\hyphcaps0\viewkind4\viewscale125 \fet0\ltrpar \qj \sectd \ltrsect\linex0\headery709\footery709\colsx709\sectdefaultcl {\*\pnseclvl1\pnucrm\pnqc\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnqc\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnqc\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnqc\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5\pndec\pnqc\pnstart1\pnindent720\pnhang{\pntxtb (} +{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnqc\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnqc\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnqc\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9 +\pnlcrm\pnqc\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qj \qj\li142\sb80\sl240\slmult0\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\f11\fs16\super #{\footnote +\ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HID_THRESHOLD}}}{\rtlch \af15 \ltrch \f11\fs16 Determines the }{\rtlch \ab\af15 +\ltrch \b\f11\fs16 Mouse sensitivity}{\rtlch \af15 \ltrch \f11\fs16 to dismiss the screen saver. Click on }{\rtlch \ab\af15 \ltrch \b\f11\fs16 High}{\rtlch \af15 \ltrch \f11\fs16 , }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Normal}{\rtlch \af15 \ltrch +\f11\fs16 or }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Low}{\rtlch \af15 \ltrch \f11\fs16 to select one of the three corresponding levels of sensitivity. Click on }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Ignore mouse movement}{\rtlch \af15 \ltrch \f11\fs16 + not to allow dismissing the screen saver with the mouse; in this case the screen saver can only be dismissed with the keyboard. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page }{\rtlch \cs16\af15\super \ltrch \cs16\f11\fs16\super #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super +#}{\rtlch \af15 \ltrch HID_WAITTEXT}}}{\rtlch \af15 \ltrch \f11\fs16 Specifies how m}{\rtlch \af15 \ltrch \f11\fs16 +uch time will be elapsed since the screen saver started until it starts requiring a password to dismiss it. If you dismiss the screen saver in this time lapse you will not be required to enter a password. Enter a number in here or use the spin button (the +}{\rtlch \af15 \ltrch \f11\fs16 }{\rtlch \af15 \ltrch \f11\fs16 up and down arrows). +\par }{\rtlch \af15 \ltrch \f11\fs16 \page }{\rtlch \cs16\af15\super \ltrch \cs16\f11\fs16\super #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super +#}{\rtlch \af15 \ltrch HID_WAITBOX}}}{\rtlch \af15 \ltrch \f11\fs16 +Specifies how much time will be elapsed since the screen saver started until it starts requiring a password to dismiss it. If you dismiss the screen saver in this time lapse you will not be required to enter a password.}{\rtlch \af15 \ltrch \f11\fs16 + Click on }{\rtlch \ab\af15 \ltrch \b\f11\fs16 seconds}{\rtlch \af15 \ltrch \f11\fs16 so that the number in the text box on the left will represent seconds unit, or click on }{\rtlch \ab\af15 \ltrch \b\f11\fs16 minutes}{\rtlch \af15 \ltrch \f11\fs16 + so that it will represent minutes unit. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page }{\rtlch \cs16\af15\super \ltrch \cs16\f11\fs16\super #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super +#}{\rtlch \af15 \ltrch HIDC_UL}}}{\rtlch \af15 \ltrch \f11\fs16 Click on the monitor control corner buttons to open a pop-up menu to select the }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Hot Corner}{\rtlch \ab\af15 \ltrch \b\f11\fs16 s}{\rtlch \af15 \ltrch +\f11\fs16 action of the corresponding screen corner. Choose }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Default}{\rtlch \af15 \ltrch \f11\fs16 to deactivate the }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Hot Corner}{\rtlch \af15 \ltrch \f11\fs16 + of that corner. Choose }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Now}{\rtlch \af15 \ltrch \f11\fs16 so that you can start the screen saver by taking the cursor to the corresponding corner or choose }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Never}{\rtlch \af15 +\ltrch \f11\fs16 so that the screen saver will never }{\rtlch \af15 \ltrch \f11\fs16 start while you hold the cursor close to that corner. +\par }{\rtlch \af15 \ltrch \f11\fs16 Note that you need to have installed in your computer a }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Hot Corners}{\rtlch \af15 \ltrch \f11\fs16 manager like Microsoft}{\rtlch \af15 \ltrch \f11\fs16 \rquote }{\rtlch \af15 \ltrch +\f11\fs16 s Plus! or compatible.}{\rtlch \af15 \ltrch \f11\fs16 +\par }{\rtlch \af15 \ltrch \f11\fs16 \page }{\rtlch \cs16\af15\super \ltrch \cs16\f11\fs16\super #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super +#}{\rtlch \af15 \ltrch HID_MUTE}}}{\rtlch \af15 \ltrch \f11\fs16 Check this to mute the screen saver while it is running.}{\rtlch \af15 \ltrch \f11\fs16 +\par }{\rtlch \af15 \ltrch \f11\fs16 \page #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HIDC_FLAT}}}{\rtlch \af15 +\ltrch \f11\fs16 Renders the clock model using }{\rtlch \ab\af15 \ltrch \b\f11\fs16 flat shading}{\rtlch \af15 \ltrch \f11\fs16 (only one color is calculated f}{\rtlch \af15 \ltrch \f11\fs16 or each polygon). +\par }{\rtlch \af15 \ltrch \f11\fs16 \page #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HIDC_GOURAUD}}}{\rtlch \af15 +\ltrch \f11\fs16 Renders the clock model using }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Gouraud shading}{\rtlch \af15 \ltrch \f11\fs16 (one color is calculated for each polygon vertex). +\par }{\rtlch \af15 \ltrch \f11\fs16 \page #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HIDC_ANTIALIAS}}}{\rtlch +\af15 \ltrch \f11\fs16 Improves lines and polygons edges by rendering with }{\rtlch \ab\af15 \ltrch \b\f11\fs16 antialiasing}{\rtlch \af15 \ltrch \f11\fs16 (ignored in OpenGL implementations that }{\rtlch \af15 \ltrch \f11\fs16 doesn't support it). + +\par }{\rtlch \af15 \ltrch \f11\fs16 Not recommended for computers without a 3D-acceleration card. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HIDC_BLEND}}}{\rtlch \af15 +\ltrch \f11\fs16 Blends the colors of the covering glass with the rest of the clock giving a glass impression. Without this option only the environment texture is visible and }{\rtlch \af15 \ltrch \f11\fs16 the clock interior is hidden. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HIDC_NORMALS}}}{\rtlch \af15 +\ltrch \f11\fs16 Shows the }{\rtlch \ab\af15 \ltrch \b\f11\fs16 normal}{\rtlch \af15 \ltrch \f11\fs16 vector to every polygon by drawing a small line segment. +\par }{\rtlch \af15 \ltrch \f11\fs16 Not recommended for computers without a 3D-acceleration card. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HIDC_WIREFRAME}}}{\rtlch +\af15 \ltrch \f11\fs16 Renders the clock model using shaded }{\rtlch \ab\af15 \ltrch \b\f11\fs16 wireframe}{\rtlch \af15 \ltrch \f11\fs16 instead}{\rtlch \af15 \ltrch \f11\fs16 + of filled polygons (if not implemented in hardware may slow down performance dramatically). +\par }{\rtlch \af15 \ltrch \f11\fs16 Not recommended for computers without a 3D-acceleration card. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HIDC_ZBUFFER}}}{\rtlch \af15 +\ltrch \f11\fs16 Activates the use of the }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Z-buffer}{\rtlch \af15 \ltrch \f11\fs16 . This option should be checked for normal behavior}{\rtlch \af15 \ltrch \f11\fs16 of the clock model. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HIDC_CULL}}}{\rtlch \af15 +\ltrch \f11\fs16 Activates the use of }{\rtlch \ab\af15 \ltrch \b\f11\fs16 backface culling}{\rtlch \af15 \ltrch \f11\fs16 . This option should be checked for normal behavior of the clock model. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HIDC_NOGLASS}}}{\rtlch \af15 +\ltrch \f11\fs16 Drops the clock's }{\rtlch \ab\af15 \ltrch \b\f11\fs16 covering glass}{\rtlch \af15 \ltrch \f11\fs16 . +\par }{\rtlch \af15 \ltrch \f11\fs16 Recommended for computers without a 3D-acceleration card. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HIDC_NOTEXTURES}}}{\rtlch +\af15 \ltrch \f11\fs16 Drops the }{\rtlch \ab\af15 \ltrch \b\f11\fs16 texture}{\rtlch \af15 \ltrch \f11\fs16 inside the clock. +\par }{\rtlch \af15 \ltrch \f11\fs16 Recommended for computers without a 3D-acceleration card. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HIDC_NEAREST}}}{\rtlch \af15 +\ltrch \f11\fs16 Click }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Nearest}{\rtlch \af15 \ltrch \f11\fs16 to use the worst texture filtering algorithm (recommended for computers without a 3D acceleration card). Click }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Linear} +{\rtlch \af15 \ltrch \f11\fs16 to use a better algorithm. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super #}{\rtlch \af15 \ltrch HIDC_WMIPMAPS}}}{\rtlch \af15 +\ltrch \f11\fs16 Click }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Without Mipmaps}{\rtlch \af15 \ltrch \f11\fs16 not to use mipmaps' algorithm when filtering textures. Click }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Nearest Mipmap}{\rtlch \af15 \ltrch \f11\fs16 + to use the closest mipmap level algorithm. Click }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Linear Between Mipmaps}{\rtlch \af15 \ltrch \f11\fs16 for the best mipmaps' algorithm. +\par }{\rtlch \ab\af15 \ltrch \b\f11\fs16 W}{\rtlch \ab\af15 \ltrch \b\f11\fs16 ithout Mipmaps}{\rtlch \af15 \ltrch \f11\fs16 is recommended for computers without a 3D-acceleration card. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page }{\rtlch \cs16\af15\super \ltrch \cs16\f11\fs16\super #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super +#}{\rtlch \af15 \ltrch HIDC_ABOUT}}}{\rtlch \af15 \ltrch \f11\fs16 Shows the }{\rtlch \ab\af15 \ltrch \b\f11\fs16 About}{\rtlch \af15 \ltrch \f11\fs16 dialog with the version number, credits and copyright information. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page }{\rtlch \cs16\af15\super \ltrch \cs16\f11\fs16\super #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super +#}{\rtlch \af15 \ltrch HIDC_QUICK}}}{\rtlch \af15 \ltrch \f11\fs16 Check }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Speed Up Clock }{\rtlch \af15 \ltrch \f11\fs16 to accelerate the rotation speed of the clock}{\rtlch \af15 \ltrch \f11\fs16 \rquote }{\rtlch +\af15 \ltrch \f11\fs16 s hands. With this option the clock won}{\rtlch \af15 \ltrch \f11\fs16 \rquote }{\rtlch \af15 \ltrch \f11\fs16 +t show the correct time anymore (until the option is cleared). It is used mainly to see and understand the rotation effect of the Moebius strip. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page }{\rtlch \cs16\af15\super \ltrch \cs16\f11\fs16\super #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super +#}{\rtlch \af15 \ltrch HIDC_SWING}}}{\rtlch \af15 \ltrch \f11\fs16 Check }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Swing Clock}{\rtlch \af15 \ltrch \f11\fs16 to allow the clock}{\rtlch \af15 \ltrch \f11\fs16 \rquote }{\rtlch \af15 \ltrch \f11\fs16 +s rotation when the}{\rtlch \af15 \ltrch \f11\fs16 screen saver is running. With this option the clock will rotate back and forth in a fixed pattern around it}{\rtlch \af15 \ltrch \f11\fs16 \rquote }{\rtlch \af15 \ltrch \f11\fs16 s center. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page }{\rtlch \cs16\af15\super \ltrch \cs16\f11\fs16\super #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super +#}{\rtlch \af15 \ltrch HIDC_USEMOUSE}}}{\rtlch \af15 \ltrch \f11\fs16 Check this option to allow mouse interaction during screen saving. While the screen saver is running drag the mouse wit}{\rtlch \af15 \ltrch \f11\fs16 +h the left button pressed to rotate the clock around it}{\rtlch \af15 \ltrch \f11\fs16 \rquote }{\rtlch \af15 \ltrch \f11\fs16 s center, and drag the mouse with the right button to roll the clock. Double click on the left mouse button to reset the clock}{ +\rtlch \af15 \ltrch \f11\fs16 \rquote }{\rtlch \af15 \ltrch \f11\fs16 s orientation to the default. Press a key on the keyboard to close the sc}{\rtlch \af15 \ltrch \f11\fs16 reen saver. +\par }{\rtlch \af15 \ltrch \f11\fs16 Note that if }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Swing Clock}{\rtlch \af15 \ltrch \f11\fs16 is checked, then the clock will rotate when you stop dragging the mouse. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page }{\rtlch \cs16\af15\super \ltrch \cs16\f11\fs16\super #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super +#}{\rtlch \af15 \ltrch HIDC_BACK}}}{\rtlch \af15 \ltrch \f11\fs16 Check }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Backdrop}{\rtlch \af15 \ltrch \f11\fs16 to draw a background with gradient using the colors specified inside the monitor control to the left. + +\par }{\rtlch \af15 \ltrch \f11\fs16 \page }{\rtlch \cs16\af15\super \ltrch \cs16\f11\fs16\super #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super +#}{\rtlch \af15 \ltrch HIDC_SPIN1}}}{\rtlch \af15 \ltrch \f11\fs16 Use the spin controls (the two arrow buttons) to choose the number of }{\rtlch \ab\af15 \ltrch \b\f11\fs16 twists}{\rtlch \af15 \ltrch \f11\fs16 + that the strip will have. The strip will actually be a }{\rtlch \ab\af15 \ltrch \b\f11\fs16 Moebius strip}{\rtlch \af15 \ltrch \f11\fs16 if the number of twists is odd. The number of twists is limited between 0 and 9. +\par }{\rtlch \af15 \ltrch \f11\fs16 \page }{\rtlch \cs16\af15\super \ltrch \cs16\f11\fs16\super #{\footnote \ltrpar \ql \pard\plain \ltrpar\ql \s15\ql\nowidctlpar\widctlpar\adjustright \rtlch\af15\afs20 \ltrch\fs20 {\rtlch \cs16\af15\super \ltrch \cs16\super +#}{\rtlch \af15 \ltrch HIDC_COLOR1}}}{\rtlch \af15 \ltrch \f11\fs16 Use this to s}{\rtlch \af15 \ltrch \f11\fs16 elect the four colors that will be used with the backdrop}{\rtlch \af15 \ltrch \f11\fs16 \rquote }{\rtlch \af15 \ltrch \f11\fs16 +s gradient. Press on the sunken square color areas in the monitor control corners to open the color selection dialog. The color selected will be shown on the sunken areas. +\par }} \ No newline at end of file diff --git a/MoebiusScreenSaver.sln b/MoebiusScreenSaver.sln new file mode 100644 index 0000000..de32ab3 --- /dev/null +++ b/MoebiusScreenSaver.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MoebiusScreenSaver", "MoebiusScreenSaver.vcproj", "{222966EC-A4AB-4FAC-8A40-8266695C44B6}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {222966EC-A4AB-4FAC-8A40-8266695C44B6}.Debug.ActiveCfg = Debug|Win32 + {222966EC-A4AB-4FAC-8A40-8266695C44B6}.Debug.Build.0 = Debug|Win32 + {222966EC-A4AB-4FAC-8A40-8266695C44B6}.Release.ActiveCfg = Release|Win32 + {222966EC-A4AB-4FAC-8A40-8266695C44B6}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/MoebiusScreenSaver.suo b/MoebiusScreenSaver.suo new file mode 100644 index 0000000000000000000000000000000000000000..badb7e22652120b1ed338296c2f1459eed84b18c GIT binary patch literal 9216 zcmeHMTWnNC7@pmNv|P&lV#RuFxrwk8C>1Co?RF`IE=5`>4}IBoPnU)5p3Ux|Kr9JQ z5{xlEsfkA8<;|%0VoW4>Nlf&?V0`h#7||Gf!v_^qVEw*1XLiro?ru+8ifQ2A{5x~z z{5$_YGyiq=+spHRdh^4YE202)iVAT%TO}TFjQh|hN|+~vA00m5&StaLpb+TZhbgoJ zw;<~@`wXX}<$2ElRsySlvw$;!vw?Gf)j*#2T(nRD*`Gqoy)SCP4jdE)KBmw_NF>pw z#c7R|kT_LtiV^RYzzaE- zG=iYS0CktpEg~W#j*AWvM{9~h_|_ql8qZi{CBIh)zmIl9d!Za92^}x!Gf7X_3r;+N zgy_TfDbXdl4?&uK^hO5_{K-+teonzl^jnJ7P?#*`0G&rTnp?4QS|-Y;_W zx7+;((bfPT0xkzW46Fq{0@Q$y0$YIfK+dxg?JD4E;2Pj#z_q}~fxCh0fdSwKU;}U? za1(Gduo1Wg*aUn6xD}{mYes(u@JZlK;8Va|K)!E98w9oiL-rWQ?*+JC_eo@5OMKVM zuYcV9`SXX*WBFr(--C=2;|Iol47GzsQ~jlOt7*Lw6mZMTsgls~U>JYp}_|H#tHD#r8mzA4csY@COwM@iQ;&U!OQgu`u@G* zFy4gmOUo0dr2jDy1zM$NK56^IQZlWz{V!KednrZd9H(um=Pt-_0-WgWg6K!>)`~^+ zi{*j-cL7Ki1HJO6zg}lg+XjApkRXN+{eBPj%Y-yX@g$YSrYqIZ|1QBx`cJR?nPbsc z5(@cq*QqhbMGCvYvog!du?GCvtsmQHkwK}F5$!W*uJy2z)97(zb{$~^e;-3j%$|7U@g9ayr(z>Bu0 zA#%jA0-h+PWNc;DkpT`scCG9>17bgHx*JrR5OEq1X}B-_h%mi!9usW_^Yx<@;)S~| z1NAk5RSrlAlqBkTG>HoJkNFpEF@;%q&PlAT9IS%=QSVqIc-24Bs{E&rKTnGO%IOzI z;V=1;H=!J@dPiS%(N?_D{7+*~nUj_GKwLi~Ann;JfBLIZ_8-RH4}vT6@E&_F3_&kk z9M;+U&wR`)|AnCKwx^p6t0=CK)~M6=i?3+xqs(UuVIpINb4}*+bm5~WMkSA>;ursU zAIu}0t@X>0!r=@1V*al>Vt&$9NxSij*L=^w9pQuD%Nd@91ALWE(1vf`ZCr5e(tAIu z=Ta^0-IQKADZPB&Q@Z^-V>4rs$}7}-+o6BF7ohGD)Ofj;v6{68p)g}{>ihxl%)kc9 zd7=he|1Iv`_%mLApR<2=#^mI$YQZ+_j0r3T0r2NqW&^#he<^4+Ac1}^fq1FbXzlX= zRvp7A}`^?P58|gylcd#6(eU*%SGYc+%2z)1zp?m+td_1WTKU}v_4Vx^ z{d(oh>b}87vJ}-{*CcLM)px#_J$K{s7w?3m@8orXJN0xXp82#B4w7@Y;b~2XpRwEH ztDgR!?Agm=1IV@eVMo^OnsrZKY@MCRagJg8m@Aj^@$MaSKh=)I|FC3E+S3G~?Yx1@ z$Q)dUFBqE?tp8X~G2VOif6n?-`4Ps!6l7uM#Tv!(HjH=W0sP18e^+429d?3p2s=Tp z5!k#ARPv~*syufg>c+v}xqhp@9PO51>gYN5t42mub*td4{;b`s5qq%L){gTSmIDuB zgt;(vQ5R0%Y`xF>U*6CW z{>k|8nxdjCmOR^AfBYN8~+62n=c()lnzUMtc5ZEGnXK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenGLenv.cpp b/OpenGLenv.cpp new file mode 100644 index 0000000..1368a35 --- /dev/null +++ b/OpenGLenv.cpp @@ -0,0 +1,931 @@ +//========================================================================== +// +// File: OpenGLenv.cpp +// +//========================================================================== + +#define _USE_MATH_DEFINES +#include +#include +#include "OpenGLenv.h" +#include "texture.h" +#include "resource.h" +#include "SaverSettings.h" + +#define max3(a, b, c) (max(max((a), (b)), (c))) + +extern SaverSettings* ss; + +/****************************************************************************/ + +// Colors +const GLfloat no_color[]= { 0.0, 0.0, 0.0, 0.0 }; +const GLfloat black[]= { 0.0, 0.0, 0.0, 1.0 }; +const GLfloat white[]= { 1.0, 1.0, 1.0, 1.0 }; +const GLfloat gray5[]= { 0.5, 0.5, 0.5, 1.0 }; +const GLfloat gray25[]= { 0.25, 0.25, 0.25, 1.0 }; +const GLfloat gray75[]= { 0.75, 0.75, 0.75, 1.0 }; +const GLfloat gray125[]= { 0.125, 0.125, 0.125, 1.0 }; +const GLfloat gray375[]= { 0.375, 0.375, 0.375, 1.0 }; +const GLfloat gray625[]= { 0.625, 0.625, 0.625, 1.0 }; +const GLfloat gray875[]= { 0.875, 0.875, 0.875, 1.0 }; +const GLfloat red[]= { 1.0, 0.0, 0.0, 1.0 }; +const GLfloat red5[]= { 0.5, 0.0, 0.0, 1.0 }; +const GLfloat green[]= { 0.0, 1.0, 0.0, 1.0 }; +const GLfloat green5[]= { 0.0, 0.5, 0.0, 1.0 }; +const GLfloat green25[]= { 0.0, 0.25, 0.0, 1.0 }; +const GLfloat green75[]= { 0.0, 0.75, 0.0, 1.0 }; +const GLfloat blue[]= { 0.0, 0.0, 1.0, 1.0 }; +const GLfloat blue5[]= { 0.0, 0.0, 0.5, 1.0 }; +const GLfloat yellow[]= { 1.0, 1.0, 0.0, 1.0 }; +const GLfloat yellow5[]= { 0.5, 0.5, 0.0, 1.0 }; +const GLfloat yellow25[]= { 0.25, 0.25, 0.0, 1.0 }; +const GLfloat yellow75[]= { 0.75, 0.75, 0.0, 1.0 }; +const GLfloat magenta[]= { 1.0, 0.0, 1.0, 1.0 }; +const GLfloat magenta5[]= { 0.5, 0.0, 0.5, 1.0 }; +const GLfloat cyan[]= { 0.0, 1.0, 1.0, 1.0 }; +const GLfloat cyan5[]= { 0.0, 0.5, 0.5, 1.0 }; +const GLfloat orange[]= { 1.0, 0.8f, 0.0, 1.0 }; +const GLfloat gold[]= { 1.0, 0.8f, 0.5, 1.0 }; +const GLfloat copper[]= { 0.5, 0.3f, 0.125, 1.0 }; + +// Tranlucent colors +const GLfloat white_5[]= { 1.0, 1.0, 1.0, 0.5 }; +const GLfloat white_25[]= { 1.0, 1.0, 1.0, 0.25 }; +const GLfloat white_75[]= { 1.0, 1.0, 1.0, 0.75 }; + +// Texture filter methods +const GLenum filter[2][3]= { + GL_NEAREST, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, + GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR +}; + +// Constants +const double step= M_PI / 120.0; +const double R= 10.0, h= 1.0; +const double epsilon= 0.001; +const double t0= M_PI, dt0= 0.0; + +// Global variables +GLuint hours[4], envmap, face; // Texture objects +GLuint frisbee, disc, rim; // Display lists +struct { + double msec, sec, min, hour, day; +} time; +double t= t0, dt= dt0; +double alpha= 1.0; + +int frames= 0; + +/****************************************************************************/ + +void +EnableGraphicOption(GLenum which, BOOL bEnable) +{ + if (bEnable) glEnable(which); + else glDisable(which); +} + +/****************************************************************************/ + +void +ResetOrientationGraphicEnv() +{ + glLoadIdentity(); + glTranslatef(0.0, 0.0, -25.0); + t = t0; + dt= dt0; +} + +/****************************************************************************/ + +void +MotionOfGraphicEnv(POINT* pAnchor, POINT mouse, BOOL roll) +{ + double dx = mouse.x - pAnchor->x, dy = mouse.y - pAnchor->y; + double distance = sqrt(dx * dx + dy * dy); + double u[3]= { + roll ? 0.0 : dy, + roll ? 0.0 : dx, + roll ? -dx : 0.0 + }; + double M[4][4], v[3]= { 0.0, 0.0, 0.0 }; + + glGetDoublev(GL_MODELVIEW_MATRIX, (GLdouble *) M); + + for (int i= 0; i < 3; i++) + for (int j= 0; j < 3; j++) + v[i]+= M[i][j] * u[j]; + + glRotated(0.25 * distance, v[0], v[1], v[2]); + + pAnchor->x = mouse.x; + pAnchor->y = mouse.y; +} + +/****************************************************************************/ + +static BOOL +bSetupPixelFormat(HDC hdc) +{ + PIXELFORMATDESCRIPTOR pfd, *ppfd; + int pixelformat; + + ppfd = &pfd; + memset(&pfd, 0, sizeof(pfd)); + + ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR); + ppfd->nVersion = 1; + ppfd->dwFlags = PFD_DRAW_TO_WINDOW | + PFD_SUPPORT_OPENGL | + PFD_DOUBLEBUFFER; + + ppfd->iPixelType= PFD_TYPE_RGBA; + ppfd->cColorBits= 32; + + pixelformat = ChoosePixelFormat(hdc, &pfd); + if (pixelformat == 0) + { + MessageBox( + NULL, "ChoosePixelFormat() failed: " + "Cannot find a suitable pixel format.", "Error", MB_OK + ); + return 0; + } + + if (SetPixelFormat(hdc, pixelformat, &pfd) == FALSE) + { + MessageBox( + NULL, "SetPixelFormat() failed: " + "Cannot set format specified.", "Error", MB_OK + ); + return 0; + } + DescribePixelFormat(hdc, pixelformat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); + + return TRUE; +} + +/****************************************************************************/ + +BOOL +InitGraphicEnv(HWND wnd, HDC* phdc, HGLRC* phglrc) +{ + // Get the windows device context + *phdc = GetDC(wnd); + if (!bSetupPixelFormat(*phdc)) + return FALSE; + + *phglrc = wglCreateContext(*phdc); + wglMakeCurrent(*phdc, *phglrc); + + return TRUE; +} + +/****************************************************************************/ + +void +DestroyGraphicEnv(HWND hwnd, HDC hdc, HGLRC hglrc) +{ + wglMakeCurrent(NULL, NULL); + wglDeleteContext(hglrc); + ReleaseDC(hwnd, hdc); +} + +/****************************************************************************/ + +void +InitState() +{ + // Polygon Mode + glPolygonMode(GL_FRONT_AND_BACK, ss->state.nPolygonMode); + + // Material properties + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white); + glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 128); + glEnable(GL_COLOR_MATERIAL); // for ambient and diffuse reflection + + // Lighting + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHTING); + + // Face Culling + EnableGraphicOption(GL_CULL_FACE, ss->state.bCulling); + + // Blending + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + // Antialiasing + EnableGraphicOption(GL_LINE_SMOOTH, ss->state.bSmooth); + EnableGraphicOption(GL_POLYGON_SMOOTH, ss->state.bSmooth); + + // Z-Buffering + EnableGraphicOption(GL_DEPTH_TEST, ss->state.bDepthTest); + + // Perspective Correction Hint + glHint(GL_PERSPECTIVE_CORRECTION_HINT, ss->state.nPerspCorrectionHint); + + // Shade Model + glShadeModel(ss->state.nShadeModel); + + // Line Smooth Hint + glHint(GL_LINE_SMOOTH_HINT, ss->state.nLineSmoothHint); + + // Clear Color + glClearColor(0.0, 0.0, 0.0, 1.0); + + // Clear Depth + glClearDepth(1.0); + + // Model/View + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0, 0.0, -25.0); +} + +/****************************************************************************/ + +void +init_hours_texture(HWND hwnd, HDC hdc) +{ + + int width, height; + HBITMAP hbitmap; + BITMAPINFO bitmapinfo; + unsigned char* texture; + unsigned char* bitmap; + unsigned char *p, *q; + + glGenTextures(4, hours); + + hbitmap = (HBITMAP)LoadImage( + (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), + MAKEINTRESOURCE(IDB_HOURS0), IMAGE_BITMAP, + 0, 0, LR_DEFAULTCOLOR | LR_CREATEDIBSECTION + ); + bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bitmapinfo.bmiHeader.biPlanes = 1; + bitmapinfo.bmiHeader.biBitCount = 0; + GetDIBits(hdc, hbitmap, 0, 0, NULL, &bitmapinfo, DIB_RGB_COLORS); + width = bitmapinfo.bmiHeader.biWidth; + height = bitmapinfo.bmiHeader.biHeight; + bitmap = new unsigned char[bitmapinfo.bmiHeader.biSizeImage]; + texture = new unsigned char[width * height * 4]; + for (int i=0; i < 4; i++) + { + if (i > 0) + hbitmap = (HBITMAP)LoadImage( + (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), + MAKEINTRESOURCE(IDB_HOURS0+i), IMAGE_BITMAP, + 0, 0, LR_DEFAULTCOLOR | LR_CREATEDIBSECTION + ); + GetDIBits(hdc, hbitmap, 0, height, (LPVOID)bitmap, &bitmapinfo, DIB_RGB_COLORS); + p = texture; + q = bitmap; + for (int j=0; j < width*height; j++) + { + *(p++) = *(q++); + *(p++) = *(q++); + *(p++) = *(q++); + *(p) = max3( *(p-1), *(p-2), *(p-3) ); + p++; + } + glBindTexture(GL_TEXTURE_2D, hours[i]); + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + gluBuild2DMipmaps(GL_TEXTURE_2D, 4, width, height, GL_RGBA, GL_UNSIGNED_BYTE, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + DeleteObject(hbitmap); + } + delete[] texture; + delete[] bitmap; +} + +/****************************************************************************/ + +void +loadTextureFromFile(GLuint &object, const char *filename) +{ + int width, height, components; + + unsigned char *texture= readTexture(filename, &width, &height, &components); + if (texture == NULL) + { + //logfile << "Failed to read " << filename << "\n"; + exit(-1); + } + glGenTextures(1, &object); + glBindTexture(GL_TEXTURE_2D, object); + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + int err= gluBuild2DMipmaps(GL_TEXTURE_2D, 4, width, height, GL_RGBA, GL_UNSIGNED_BYTE, texture); + if (err != 0) + { + const unsigned char *errstr= gluErrorString(err); + //logfile << "Mipmap error: " << errstr << "\n"; + } + free(texture); + + //check_for_gl_error("creating texture #%d from %s", object, filename); +} + +/****************************************************************************/ + +void +loadTextureFromResource(HWND hwnd, HDC hdc, GLuint& object, UINT bitmapResID) +{ + int width, height; + HBITMAP hbitmap; + BITMAPINFO bitmapinfo; + unsigned char* texture; + + hbitmap = (HBITMAP)LoadImage( + (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), + MAKEINTRESOURCE(bitmapResID), IMAGE_BITMAP, + 0, 0, LR_DEFAULTCOLOR | LR_CREATEDIBSECTION + ); + bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bitmapinfo.bmiHeader.biPlanes = 1; + bitmapinfo.bmiHeader.biBitCount = 0; + GetDIBits(hdc, hbitmap, 0, 0, NULL, &bitmapinfo, DIB_RGB_COLORS); + width = bitmapinfo.bmiHeader.biWidth; + height = bitmapinfo.bmiHeader.biHeight; + texture = new unsigned char[bitmapinfo.bmiHeader.biSizeImage]; + + GetDIBits(hdc, hbitmap, 0, height, (LPVOID)texture, &bitmapinfo, DIB_RGB_COLORS); + + glGenTextures(1, &object); + glBindTexture(GL_TEXTURE_2D, object); + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, texture); + + delete[] texture; + DeleteObject(hbitmap); +} + +/****************************************************************************/ + +void +InitTexture(HWND hwnd, HDC hdc) +{ + init_hours_texture(hwnd, hdc); + if (!ss->state.bNoGlass) + { + loadTextureFromResource(hwnd, hdc, envmap, IDB_CAFE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } + if (!ss->state.bNoExtraTextures) + { + loadTextureFromResource(hwnd, hdc, face, IDB_OGLLOGO); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } +} + +/****************************************************************************/ + +void +draw_backdrop() +{ + GLfloat firstColor[4]; + GLfloat secondColor[4]; + GLfloat thirdColor[4]; + GLfloat fourthColor[4]; + + firstColor[0] = ss->state.fColorR[0]; + firstColor[1] = ss->state.fColorG[0]; + firstColor[2] = ss->state.fColorB[0]; + secondColor[0] = ss->state.fColorR[1]; + secondColor[1] = ss->state.fColorG[1]; + secondColor[2] = ss->state.fColorB[1]; + thirdColor[0] = ss->state.fColorR[2]; + thirdColor[1] = ss->state.fColorG[2]; + thirdColor[2] = ss->state.fColorB[2]; + fourthColor[0] = ss->state.fColorR[3]; + fourthColor[1] = ss->state.fColorG[3]; + fourthColor[2] = ss->state.fColorB[3]; + firstColor[3] = secondColor[3] = thirdColor[3] = fourthColor[3] = 1.0f; + + glPushAttrib(GL_ENABLE_BIT); + glDisable(GL_LIGHTING); + + glPushMatrix(); + glLoadIdentity(); + glTranslatef(0.0, 0.0, -40.0); + + glBegin(GL_QUADS); + { + glColor4fv(fourthColor); + glVertex2f(-30.0, -20.0); + glColor4fv(thirdColor); + glVertex2f(+30.0, -20.0); + glColor4fv(secondColor); + glVertex2f(+30.0, +20.0); + glColor4fv(firstColor); + glVertex2f(-30.0, +20.0); + } + glEnd(); + + glPopMatrix(); + + glPopAttrib(); +} + +/****************************************************************************/ + +void +draw_frisbee() +{ + glPushAttrib(GL_ENABLE_BIT); + glEnable(GL_NORMALIZE); + + glPushMatrix(); + glScalef(1.0, 1.0, 0.2f); + + glBegin(GL_TRIANGLE_FAN); + { + glNormal3d(0.0, 0.0, 1.0); + glVertex3d(0.0, 0.0, R); + + const double r= R * sin(step); + const double z= R * cos(step); + + for (double f= -M_PI; f < +M_PI + epsilon; f+= step) + { + const double x= r * cos(f), y= r * sin(f); + + glNormal3d(x, y, z); + glVertex3d(x, y, z); + } + } + glEnd(); + + for (double t= step; t < 0.5 * M_PI - epsilon; t+= step) + { + const double r0= R * sin(t), r1= R * sin(t + step); + const double z0= R * cos(t), z1= R * cos(t + step); + + glBegin(GL_TRIANGLE_STRIP); + { + for (double f= -M_PI; f < +M_PI + epsilon; f+= step) + { + const double x0= r0 * cos(f), x1= r1 * cos(f); + const double y0= r0 * sin(f), y1= r1 * sin(f); + + glNormal3d(x0, y0, z0); + glVertex3d(x0, y0, z0); + glNormal3d(x1, y1, z1); + glVertex3d(x1, y1, z1); + } + } + glEnd(); + } + + glPopMatrix(); + glPopAttrib(); +} + +/****************************************************************************/ + +double texx(double x, double y) +{ + return x; +} + +double texy(double x, double y) +{ + return y; +} + +/****************************************************************************/ + +void +draw_disc() +{ + const double R= 9.9; + const double dr= R / 6.0; + + glNormal3f(0.0, 0.0, 1.0); + + glBegin(GL_TRIANGLE_FAN); + { + glTexCoord2d(texx(0.0, 0.0), texy(0.0, 0.0)); + glVertex2d(0.0, 0.0); + for (double t= 0.0; t < 2 * M_PI + epsilon; t+= step) + { + double x= dr * cos(t), y= dr * sin(t); + glTexCoord2d(texx(x / R, y / R), texy(x / R, y / R)); + glVertex2d(x, y); + } + } + glEnd(); + + for (double r= dr; r < R - epsilon; r+= dr) + { + glBegin(GL_TRIANGLE_STRIP); + { + for (double t= 0.0; t < 2 * M_PI + epsilon; t+= step) + { + double x0= r * cos(t), y0= r * sin(t); + glTexCoord2d(texx(x0 / R, y0 / R), texy(x0 / R, y0 / R)); + glVertex2d(x0, y0); + + double x1= (r + dr) * cos(t), y1= (r + dr) * sin(t); + glTexCoord2d(texx(x1 / R, y1 / R), texy(x1 / R, y1 / R)); + glVertex2d(x1 ,y1); + } + } + glEnd(); + } +} + +/****************************************************************************/ + +void +draw_rim() +{ + glBegin(GL_TRIANGLE_STRIP); + { + for (double t= 0.0; t < 2 * M_PI + epsilon; t+= step) + { + glNormal3d(cos(t), sin(t), 0.0); + glVertex3d(R * cos(t), R * sin(t), +h); + glVertex3d(R * cos(t), R * sin(t), -h); + } + } + glEnd(); +} + +/****************************************************************************/ + +void +draw_hours_strip(int base) +{ + const double R= 9.0, h= 1.0; + const double torsion= 2 * ss->state.nTwists * M_PI * time.day; + const GLfloat *color[]= { blue, green, yellow, red }; + + for (int i= 0; i < 2; i++) + { + glPushAttrib(GL_ENABLE_BIT); + glEnable(GL_TEXTURE_2D); + + + glBindTexture(GL_TEXTURE_2D, hours[base + i]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter[ss->state.nLinear][ss->state.nMipmap]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter[ss->state.nLinear][0]); + + glBegin(GL_TRIANGLE_STRIP); + { + for (float s= 0.0; s < 1.0 + epsilon; s+= float(step / M_PI)) + { + double t= (double(i) + s) * M_PI; + double tt= ss->state.nTwists * 0.5 * t - torsion; + double ct= cos(t), st= sin(t); + double ctt= cos(tt), stt= sin(tt); + double r1= R - h * ctt; + double r2= R + h * ctt; + double z1= -h * stt; + double z2= +h * stt; + + GLfloat vcolor[4]; + + for (int k = 0; k < 4; k++) + { + vcolor[k] = (1 - s) * color[base + i][k] + s * color[(base + i + 1) % 4][k]; + } + + glColor4fv(vcolor); + glNormal3d(-st * stt, -ct * stt, ct * ct * ctt + ctt * st * st); + + glTexCoord2d(t / M_PI, 0.0); + glVertex3d(r2 * st, r2 * ct, z2); + glTexCoord2d(t / M_PI, 1.0); + glVertex3d(r1 * st, r1 * ct, z1); + } + } + glEnd(); + + glPopAttrib(); + + if (ss->state.bNormals) + { + glPushAttrib(GL_LIGHTING_BIT); + glDisable(GL_LIGHTING); + glColor4fv(white); + + glBegin(GL_LINES); + { + for (double t= i * M_PI; t < (i + 1) * M_PI + epsilon; t+= M_PI / 24) + { + double tt= ss->state.nTwists * 0.5 * t - torsion; + double ct= cos(t), st= sin(t); + double ctt= cos(tt), stt= sin(tt); + double r1= R - h * ctt; + double r2= R + h * ctt; + double z1= -h * stt; + double z2= +h * stt; + + double n[3]= { -st * stt, -ct * stt, ct * ct * ctt + ctt * st * st }; + + glVertex3d(r2 * st, r2 * ct, z2); + glVertex3d(r2 * st + n[0], r2 * ct + n[1], z2 + n[2]); + glVertex3d(r1 * st, r1 * ct, z1); + glVertex3d(r1 * st + n[0], r1 * ct + n[1], z1 + n[2]); + } + } + glEnd(); + + glPopAttrib(); + } + } +} + +/****************************************************************************/ + +void +draw_hand(GLdouble rotation, GLdouble length, GLdouble width) +{ + glPushMatrix(); + glRotated(rotation, 0.0, 0.0, 1.0); + + glNormal3d(0.0, 0.0, 1.0); + glRectd(-width, -0.2 * length, +width, +length); + + glPopMatrix(); +} + +/****************************************************************************/ + +void +draw_cap() +{ + const double R= 0.5, h= 0.1; + const double norm= sqrt(h * h + R * R); + const double nR= R / norm, nh= h / norm; + + glBegin(GL_TRIANGLE_FAN); + { + glNormal3d(0.0, 0.0, 1.0); + glVertex3d(0.0, 0.0, h); + for (double t= 0.0; t < 2 * M_PI + epsilon; t+= 4 * step) + { + glNormal3d(nh * cos(t), nh * sin(t), nR); + glVertex2d(R * cos(t), R * sin(t)); + } + } + glEnd(); +} + +/****************************************************************************/ + +void +draw_face() +{ + if (!ss->state.bNoExtraTextures) + { + glPushAttrib(GL_ENABLE_BIT); + glEnable(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, face); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter[ss->state.nLinear][ss->state.nMipmap]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter[ss->state.nLinear][0]); + glCallList(disc); + + glPopAttrib(); + } + else + { + glPushAttrib(GL_LIGHTING_BIT | GL_POLYGON_BIT); + glDisable(GL_LIGHTING); + glColor4fv(black); + glCallList(disc); + glPopAttrib(); + } +} + +/****************************************************************************/ + +void +draw_glass() +{ + glPushAttrib(GL_ENABLE_BIT | GL_TEXTURE_BIT); + glDisable(GL_POLYGON_SMOOTH); + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glEnable(GL_TEXTURE_2D); + glDisable(GL_LIGHTING); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + + glBindTexture(GL_TEXTURE_2D, envmap); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter[ss->state.nLinear][ss->state.nMipmap]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter[ss->state.nLinear][0]); + glCallList(frisbee); + + glPopAttrib(); +} + +/****************************************************************************/ + +void +draw_clock() +{ + // Inside of rim + glPushAttrib(GL_LIGHTING_BIT | GL_POLYGON_BIT); + glColor4fv(gold); + glCullFace(GL_FRONT); + glCallList(rim); + glPopAttrib(); + + // Face + glColor4fv(gold); + glPushMatrix(); + glTranslated(0.0, 0.0, -h); + draw_face(); + glPopMatrix(); + + // Hours strip + glPushAttrib(GL_POLYGON_BIT); + glCullFace(GL_BACK); + draw_hours_strip(0); + glCullFace(GL_FRONT); + draw_hours_strip(2); + glPopAttrib(); + + glPushAttrib(GL_LIGHTING_BIT); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, gray5); + + glPushMatrix(); + + // Hours hand + glColor4fv(gray25); + draw_hand(-30.0 * time.hour, 5.0, 0.1f); + glTranslatef(0.0, 0.0, 0.2f); + + // Minutes hand + glColor4fv(gray25); + draw_hand(-6.0 * time.min, 7.0, 0.1f); + glTranslatef(0.0, 0.0, 0.2f); + + // Seconds hand + glColor4fv(red5); + draw_hand(-6.0 * time.sec, 8.0, 0.02f); + glTranslatef(0.0, 0.0, 0.2f); + + // Hands axis cap + glColor4fv(gray125); + draw_cap(); + + glPopMatrix(); + + glPopAttrib(); + + // Case + glPushAttrib(GL_LIGHTING_BIT); + glMateriali(GL_FRONT, GL_SHININESS, 32); + glColor4fv(copper); + glPushMatrix(); + glRotated(180.0, 0.0, 1.0, 0.0); + glTranslated(0.0, 0.0, +h); + glCallList(frisbee); + glPopMatrix(); + glCallList(rim); + glPopAttrib(); + + if (!ss->state.bNoGlass) + { + // Fade Glass + alpha= alpha + ss->state.da; + alpha= min(alpha, 1.0); + alpha= max(alpha, 0.3); + + void (__stdcall *proc[2])(GLenum)= { glDisable, glEnable }; + + proc[alpha < 1.0](GL_BLEND); + + // Glass cover + glPushMatrix(); + glTranslated(0.0, 0.0, +h); + glColor4d(1.0, 1.0, 1.0, alpha); + draw_glass(); + glPopMatrix(); + } +} + +/****************************************************************************/ + +void +InitDisplayLists() +{ + frisbee = glGenLists(1); + glNewList(frisbee, GL_COMPILE); + { + draw_frisbee(); + } + glEndList(); + + disc = glGenLists(1); + glNewList(disc, GL_COMPILE); + { + draw_disc(); + } + glEndList(); + + rim = glGenLists(1); + glNewList(rim, GL_COMPILE); + { + draw_rim(); + } + glEndList(); +} + +/****************************************************************************/ + +void +Display(HDC hdc) +{ + static BOOL bfirstTime = TRUE; + + const double xrot = 30 * (1.0 + cos(t)); + const double zrot = 30 * sin(t); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + glRotated(xrot, 1.0, 0.0, 0.0); + glRotated(zrot, 0.0, 0.0, 1.0); + + if (!ss->state.bBlackBackground) + draw_backdrop(); + draw_clock(); + + glPopMatrix(); + + if (ss->state.bSwing) + { + t+= dt; + dt+= -0.001 * t; + } + + SwapBuffers(hdc); + + frames++; +} + +/****************************************************************************/ + +void +Reshape(HDC hdc, int width, int height) +{ + const double w= width, h= height; + const double aspect= w / h; + double fw, fh; + + glViewport(0, 0, width, height); + + glPushAttrib(GL_TRANSFORM_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + if (width < height) + { + fw= 0.5; + fh= fw / aspect; + } + else + { + fh= 0.5; + fw= fh * aspect; + } + + glFrustum(-fw, +fw, -fh, +fh, 1.0, 100.0); + + glPopAttrib(); +} + +/****************************************************************************/ + +void +UpdateTime() +{ + SYSTEMTIME systime; + + GetLocalTime(&systime); + time.msec = (double) systime.wMilliseconds; + time.sec = (double) systime.wSecond + time.msec / 1000.0; + time.min = (double) systime.wMinute + time.sec / 60.0; + time.hour = (double) systime.wHour + time.min / 60.0; + time.day = time.hour / 24.0; + if (ss->state.bQuick) + { + time.sec= 0.0; + time.min*= 900.0; + time.hour*= 900.0; + time.day*= 900.0; + } +} + diff --git a/OpenGLenv.h b/OpenGLenv.h new file mode 100644 index 0000000..a1ff8b7 --- /dev/null +++ b/OpenGLenv.h @@ -0,0 +1,76 @@ +//========================================================================== +// +// File: OpenGLenv.h +// +//========================================================================== + +#ifndef OPENGLENV_H +#define OPENGLENV_H + +#include +#include +#include + +/****************************************************************************/ + +class GraphicEnvState +{ +public: + GraphicEnvState() : + nLinear(1), nMipmap(2), da(-0.02f), bBlend(TRUE), nTwists(3), + bNormals(FALSE), bQuick(FALSE), bSwing(TRUE), bBlackBackground(TRUE), + bCulling(TRUE), bSmooth(TRUE), bDepthTest(TRUE), bUseMouse(FALSE), + bNoGlass(FALSE), bNoExtraTextures(FALSE), + nLineSmoothHint(GL_FASTEST), nShadeModel(GL_SMOOTH), + nPerspCorrectionHint(GL_FASTEST), nPolygonMode(GL_FILL) + { + fColorR[0] = fColorR[1] = 1.0f; // red - top corners + fColorG[0] = fColorG[1] = 0.0f; + fColorB[0] = fColorB[1] = 0.0f; + fColorR[2] = fColorR[3] = 1.0f; // orange - bottom corners + fColorG[2] = fColorG[3] = 0.8f; + fColorB[2] = fColorB[3] = 0.0f; + }; + + short nLinear; + short nMipmap; + short nTwists; // Number of 180-degree twists + float da; + BOOL bBlend; + BOOL bNormals; + BOOL bQuick; + BOOL bSwing; + BOOL bCulling; + BOOL bSmooth; + BOOL bDepthTest; + BOOL bBlackBackground; + BOOL bUseMouse; + BOOL bNoGlass; + BOOL bNoExtraTextures; + GLint nLineSmoothHint; // GL_NICEST or GL_FASTEST + GLint nShadeModel; // GL_SMOOTH or GL_FLAT + GLint nPerspCorrectionHint; // GL_NICEST or GL_FASTEST + GLint nPolygonMode; // GL_FILL or GL_LINE + float fColorR[4]; + float fColorG[4]; + float fColorB[4]; +}; + +/****************************************************************************/ + +BOOL InitGraphicEnv(HWND wnd, HDC* phdc, HGLRC* phglrc); +void DestroyGraphicEnv(HWND hwnd, HDC hdc, HGLRC hglrc); +void EnableGraphicOption(GLenum which, BOOL bEnable); +void ResetOrientationGraphicEnv(); +void MotionOfGraphicEnv(POINT* pAnchor, POINT mouse, BOOL roll); + +void InitState(); +void InitTexture(HWND hwnd, HDC hdc); +void InitDisplayLists(); + +void Display(HDC hdc); +void Reshape(HDC hdc, int width, int height); + +void UpdateTime(); + +#endif diff --git a/Password.cpp b/Password.cpp new file mode 100644 index 0000000..1729c1c --- /dev/null +++ b/Password.cpp @@ -0,0 +1,72 @@ +//========================================================================== +// +// File: Password.cpp +// +//========================================================================== + +#include "Password.h" +#include "Debug.h" + +//****************************************************************************************** + +BOOL +VerifyPassword(HWND hwnd) +{ + // Under NT, we return TRUE immediately. This lets the saver quit, + // and the system manages passwords. + // Under '95, we call VerifyScreenSavePwd. + // This checks the appropriate registry key and, if necessary, + // pops up a verify dialog + OSVERSIONINFO osv; + + osv.dwOSVersionInfoSize = sizeof(osv); + GetVersionEx(&osv); + if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) + return TRUE; + + HINSTANCE hpwdcpl = ::LoadLibrary("PASSWORD.CPL"); + if (hpwdcpl == NULL) + { + Debug("Unable to load PASSWORD.CPL. Aborting"); + return TRUE; + } + typedef BOOL (WINAPI *VERIFYSCREENSAVEPWD)(HWND hwnd); + VERIFYSCREENSAVEPWD VerifyScreenSavePwd; + VerifyScreenSavePwd = + (VERIFYSCREENSAVEPWD)GetProcAddress(hpwdcpl, "VerifyScreenSavePwd"); + if (VerifyScreenSavePwd == NULL) + { + Debug("Unable to get VerifyPwProc address. Aborting"); + FreeLibrary(hpwdcpl); + return TRUE; + } + Debug("About to call VerifyPwProc"); + BOOL bres = VerifyScreenSavePwd(hwnd); + FreeLibrary(hpwdcpl); + return bres; +} + +//****************************************************************************************** + +void +ChangePassword(HWND hwnd) +{ + // This only ever gets called under '95, when started with the /a option. + HINSTANCE hmpr = ::LoadLibrary("MPR.DLL"); + if (hmpr == NULL) + { + Debug("MPR.DLL not found: cannot change password."); + return; + } + typedef VOID (WINAPI *PWDCHANGEPASSWORD) (LPCSTR lpcRegkeyname, HWND hwnd, UINT uiReserved1, UINT uiReserved2); + PWDCHANGEPASSWORD PwdChangePassword = + (PWDCHANGEPASSWORD)::GetProcAddress(hmpr, "PwdChangePasswordA"); + if (PwdChangePassword == NULL) + { + FreeLibrary(hmpr); + Debug("PwdChangeProc not found: cannot change password"); + return; + } + PwdChangePassword("SCRSAVE", hwnd, 0, 0); + FreeLibrary(hmpr); +} diff --git a/Password.h b/Password.h new file mode 100644 index 0000000..4604046 --- /dev/null +++ b/Password.h @@ -0,0 +1,20 @@ +//========================================================================== +// +// File: Password.h +// +//========================================================================== + +#ifndef PASSWORD_H +#define PASSWORD_H + +#include + +//****************************************************************************************** + +BOOL VerifyPassword(HWND hwnd); +void ChangePassword(HWND hwnd); + +//****************************************************************************************** + +#endif + diff --git a/Readme.txt b/Readme.txt new file mode 100644 index 0000000..abb8a6e --- /dev/null +++ b/Readme.txt @@ -0,0 +1,116 @@ +------------------------------------------------------------------------------- +Moebius Clock Screen Saver v 1.7 README.TXT November 1999 + Copyright (c) 1999-2000 by Uriel Cohen & Ron Inbar. +------------------------------------------------------------------------------- + +I. INTRODUCTION + Thank you for trying the Moebius Clock Screen Saver! This file contains + installation/removal instructions, requirements and a brief help section. + + +II. CONTENTS + 1. INTRODUCTION + A. THE CLOCK CONCEPT + B. THE SCREEN SAVER + 2. REQUIREMENTS + 3. INSTALLATION INSTRUCTIONS + 4. REMOVING INSTRUCTIONS + 5. CREDITS + + +1. INTRODUCTION + + A. THE CLOCK CONCEPT + The Moebius Clock is an original clock concept designed to show the 24 hours + with regular clock hands and without addins showing AM or PM time. Instead of + a regular flat ring of numbers (the 12 numbers) it has a vertical Moebius + strip with the 24 numbers on it. + The Moebius strip is a circular strip which was twisted before being closed + (before one extreme was connected with the other). If you follow one side of + it with your finger along the strip you will finish where you started. Thus, + we say that the Moebius strip has no inside or outside. + The Moebius Clock has the 24 hours numbers arranged on a Moebius strip on such + a way that numbers with 12 hours difference fall back to back (for example 2:00 + and 14:00; 2:00 AM and PM). + The hours hand will turn normaly, and will show the hour where we expect it to + point. The Moebius strip at that point will have the correct number (in the 24 + hours interval) facing the hours hand. How is this possible? Simple...the + Moebius strip turns on itself while the hands are turning, so that it turns 180 + degrees in 12 hours. When the hours hand returns to this place, the strip will + have the other number facing it (the number with 12 hours difference). + + B. THE SCREEN SAVER + The Moebius Clock Screen Saver shows a fully functional Moebius Clock in 3D + in the middle of the screen, which shows the correct hour taken from your + system settings. + The screen saver has several options to control how the Moebius Clock will be + rendered (quality and performance options), and other options that control the + behavior of the clock. It even implements some other options compatible with + Microsoft's Plus! screen savers (like Hot Spots and mouse sensitivity). + The Moebius Clock Screen Saver was implemented in OpenGL and depends highly on + the current OpenGL implementation installed in your computer (see Requirements + and Installation instructions). + +2. REQUIREMENTS + 1) Operating System. The Moebius Clock Screen Saver was fully tested in Windows + NT 4, Windows 95 and Windows 98. It requires the OpenGL drivers/dlls installed + on your computer. Luckily, Windows NT 4 and Windows 98 come with a software + implementation of those drivers. If you own Windows 95 you will have to + download and install the drivers/dlls since they are not included in this + package. + 2) Hardware requirements. The hardware requirements are simple: the faster your + processor and the better your 3D acceleration card the best performance you + will get. It was fully tested with a Pentium II 350 Mhz and a Creative Riva TNT + 3D acceleration card and found to run smoothly. It was executed also with + several other graphic cards and processor speeds. The thumb rule: you'll need + a reasonable good 3D accelerator with OpenGL implementation and support for + texture mapping in hardware. + Some settings have been added to improve the performance in non 3D accelerated + computers. With those options it was tested on a Pentium 266 Mhz with a regular + VGA card. Check every option with the question mark cursor in the settings + dialog for an explanation. + We recommend a resolution of at least 800x600 with 16 bits color depth. + +3. INSTALLATION INSTRUCTIONS + The installation instructions are a bit more complicated than the usual since we + didn't use an automatic installer with this version (we plan to use it in the + next one). We apologize in advance for the inconvinience. + 1) To install the screen saver from this ZIP distribution, you must first + decompress it. Decompression requires a ZIP extraction program like PKUNZIP or + WinZip. + You should extract all files in the archive to a temporary directory (see + the PKZIP or WinZip documentation for instructions). If the files were + extracted succesfully you should see the following files in your temporary + directory: + Readme.txt - this readme + Moebius Clock.scr - the screen saver executable + Moebius Clock.hlp - the screen saver context help + + 2) After extracting all the files, you should copy the "Moebius Clock.scr" and the + "Moebius Clock.hlp" files to your Windows System directory (usually + Windows\System for Windows 95/98 and WinNT\System32 for NT 4). + 3) Then open the Display properties by double clicking on it's icon from the Control + Panel. Press on the Screen Saver tab at the top of the dialog. On the screen + saver section you should see a combo box with the name of the current screen + saver displayed on it. Press on the combo box and scroll until you see "Moebius + Clock". Select it. Close the dialog by pressing OK or Preview the screen saver + before. It is recommended to configure the screen saver by pressing on Settings + before you run it for the first time. + +4. REMOVING INTRUCTIONS + 1) Select another screen saver by following the 3rd step of the previous section. + 2) Delete the "Moebius Clock.scr" and "Moebius Clock.hlp" files from your Windows + System directory (see 2nd step of the previous section). + 3) If you like to clean up the registry entries that the screen saver added (for + advanced Windows users only) open the Registry Editor (regedit). Delete all the + subtree from the following registry path: + HKEY_CURRENT_USER\Software\Moebius Clock + +5. CREDITS + The original Moebius Clock concept was created by Ron Inbar. He also did the + OpenGL implementation. The Win32 porting and documentation was done by + Uriel Cohen. Thank you to all who supported us and gave us constructive criticism. + + Contact us at: + Uriel Cohen : urielc@actcom.co.il + Ron Inbar : rinbar@netvision.net.il diff --git a/Readppm.cpp b/Readppm.cpp new file mode 100644 index 0000000..9b192df --- /dev/null +++ b/Readppm.cpp @@ -0,0 +1,35 @@ +#include +#include + +#define max3(a, b, c) (max(max((a), (b)), (c))) + +unsigned char *ReadPPM(const char *filename, int *width, int *height) +{ + FILE *file= fopen(filename, "r"); + + char magic[10]; + + fscanf(file, "%s", magic); + fscanf(file, "%d %d", width, height); + + int maxcolor; + + fscanf(file, "%d", &maxcolor); + + int npixels= *width * *height; + unsigned char (*data)[4]= new unsigned char[npixels][4]; + unsigned char (*p)[4]= data - 1; + + fseek(file, -3 * npixels, SEEK_END); + + while (npixels--) + { + fread(++p, 3, 1, file); + (*p)[3]= max3((*p)[0], (*p)[1], (*p)[2]); + } + + fclose(file); + + return (unsigned char *) data; +} + diff --git a/SaverSettings.cpp b/SaverSettings.cpp new file mode 100644 index 0000000..f82284e --- /dev/null +++ b/SaverSettings.cpp @@ -0,0 +1,291 @@ +//========================================================================== +// +// File: SaverSettings.cpp +// +//========================================================================== + +#include +#include +#include +#include "SaverSettings.h" + +#define REGSTR_PATH_PLUSSCR (REGSTR_PATH_SETUP "\\Screen Savers") +#define REGSTR_PATH_CONFIG ("Software\\Moebius Clock\\Moebius Clock Saver") + +//****************************************************************************************** + +SaverSettings::SaverSettings() : + state(), hwnd(NULL), ReallyClose(FALSE), idTimer(0), + hdc(NULL), hglrc(NULL) +{ + int i; + + for (i=0; i < 16; i++) + customColors[i] = RGB(255, 255, 255); +} + +//****************************************************************************************** + +void +SaverSettings::ReadGeneralRegistry() +{ + PasswordDelay = 15; // default values in case they're not in registry + PasswordDelayIndex = 0; + MouseThreshold = 0; + MouseThresholdIndex = 1; + IsDialogActive = FALSE; + Corners[0] = '-'; Corners[1] = '-'; Corners[2] = '-'; Corners[3] = '-'; + Corners[4] = '\0'; + + LONG res; + HKEY skey; + DWORD valtype, valsize, val; + char achVal[5]; + + res = RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_PLUSSCR, 0, KEY_ALL_ACCESS, &skey); + if (res != ERROR_SUCCESS) return; + valsize = sizeof(val); + res = RegQueryValueEx(skey, "Password Delay", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) PasswordDelay = val; + valsize = sizeof(val); + res = RegQueryValueEx(skey, "Password Delay Index", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) PasswordDelayIndex = val; + valsize = sizeof(val); + res = RegQueryValueEx(skey, "Mouse Threshold", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) MouseThreshold = val; + valsize = sizeof(val); + res = RegQueryValueEx(skey, "Mouse Threshold Index", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) MouseThresholdIndex = val; + valsize = sizeof(val); + res = RegQueryValueEx(skey, "Mute Sound", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) MuteSound = val; + valsize = sizeof(char)*5; + res = RegQueryValueEx(skey, "Mouse Corners", 0, &valtype, (LPBYTE)achVal, &valsize); + if (res == ERROR_SUCCESS) + { + Corners[0] = achVal[0]; Corners[1] = achVal[1]; Corners[2] = achVal[2]; + Corners[3] = achVal[3]; Corners[4] = achVal[4]; + } + RegCloseKey(skey); +} + +//****************************************************************************************** + +void +SaverSettings::ReadGraphicConfigRegistry() +{ + LONG res; + HKEY skey; + DWORD valtype, valsize, val; + + res = RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_CONFIG, 0, KEY_ALL_ACCESS, &skey); + if (res != ERROR_SUCCESS) return; + valsize = sizeof(val); + + res = RegQueryValueEx(skey, "Alpha Blending", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.bBlend = val; + res = RegQueryValueEx(skey, "Antialiasing", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.bSmooth = val; + res = RegQueryValueEx(skey, "Backface Culling", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.bCulling = val; + res = RegQueryValueEx(skey, "Use Z-Buffer", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.bDepthTest = val; + res = RegQueryValueEx(skey, "Show Normals", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.bNormals = val; + res = RegQueryValueEx(skey, "No Glass", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.bNoGlass = val; + res = RegQueryValueEx(skey, "No Extra Textures", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.bNoExtraTextures = val; + res = RegQueryValueEx(skey, "Linear", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.nLinear = (short)val; + res = RegQueryValueEx(skey, "Mipmaps", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.nMipmap = (short)val; + res = RegQueryValueEx(skey, "Show Wireframe", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) + state.nPolygonMode = (val ? GL_LINE : GL_FILL); + res = RegQueryValueEx(skey, "Gouraud Shading", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) + state.nShadeModel = (val ? GL_SMOOTH : GL_FLAT); + if (!state.bBlend) + state.da = -state.da; + + RegCloseKey(skey); +} + +//****************************************************************************************** + +void +SaverSettings::ReadBehaviorRegistry() +{ + int i; + char str[20]; + LONG res; + HKEY skey; + DWORD valtype, valsize, val; + float fval; + + res = RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_CONFIG, 0, KEY_ALL_ACCESS, &skey); + if (res != ERROR_SUCCESS) return; + valsize = sizeof(fval); + + for (i=0; i < 4; i++) + { + sprintf(str, "Color %d Red", i+1); + res = RegQueryValueEx(skey, str, 0, &valtype, (LPBYTE)&fval, &valsize); + if (res == ERROR_SUCCESS) state.fColorR[i] = fval; + sprintf(str, "Color %d Green", i+1); + res = RegQueryValueEx(skey, str, 0, &valtype, (LPBYTE)&fval, &valsize); + if (res == ERROR_SUCCESS) state.fColorG[i] = fval; + sprintf(str, "Color %d Blue", i+1); + res = RegQueryValueEx(skey, str, 0, &valtype, (LPBYTE)&fval, &valsize); + if (res == ERROR_SUCCESS) state.fColorB[i] = fval; + } + res = RegQueryValueEx(skey, "Speed Up Clock", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.bQuick = val; + res = RegQueryValueEx(skey, "Swing Clock", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.bSwing = val; + res = RegQueryValueEx(skey, "Use Backdrop", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) + val == TRUE ? state.bBlackBackground = FALSE : state.bBlackBackground = TRUE; + res = RegQueryValueEx(skey, "Use Mouse", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.bUseMouse = val; + res = RegQueryValueEx(skey, "Moebius Strip Twists", 0, &valtype, (LPBYTE)&val, &valsize); + if (res == ERROR_SUCCESS) state.nTwists = (short)val; + + RegCloseKey(skey); +} + +//****************************************************************************************** + +void +SaverSettings::WriteGeneralRegistry() +{ + LONG res; + HKEY skey; + DWORD val, disp; + + res = RegCreateKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_PLUSSCR, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &skey, &disp); + if (res != ERROR_SUCCESS) return; + + val = PasswordDelay; + RegSetValueEx(skey, "Password Delay", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = PasswordDelayIndex; + RegSetValueEx(skey, "Password Delay Index", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = MouseThreshold; + RegSetValueEx(skey, "Mouse Threshold", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = MouseThresholdIndex; + RegSetValueEx(skey, "Mouse Threshold Index", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = MuteSound; + RegSetValueEx(skey, "Mute Sound", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + RegSetValueEx(skey, "Mouse Corners", 0, REG_SZ, (CONST BYTE*)Corners, sizeof(char)*5); + + RegCloseKey(skey); +} + +//****************************************************************************************** + +void +SaverSettings::WriteGraphicConfigRegistry() +{ + LONG res; + HKEY skey; + DWORD val, disp; + + res = RegCreateKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_CONFIG, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &skey, &disp); + if (res != ERROR_SUCCESS) return; + + val = state.bBlend; + RegSetValueEx(skey, "Alpha Blending", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = state.bSmooth; + RegSetValueEx(skey, "Antialiasing", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = state.bCulling; + RegSetValueEx(skey, "Backface Culling", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = state.bDepthTest; + RegSetValueEx(skey, "Use Z-Buffer", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = state.bNormals; + RegSetValueEx(skey, "Show Normals", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = state.bNoGlass; + RegSetValueEx(skey, "No Glass", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = state.bNoExtraTextures; + RegSetValueEx(skey, "No Extra Textures", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = state.nLinear; + RegSetValueEx(skey, "Linear", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = state.nMipmap; + RegSetValueEx(skey, "Mipmaps", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = (state.nPolygonMode == GL_LINE ? TRUE : FALSE); + RegSetValueEx(skey, "Show Wireframe", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = (state.nShadeModel == GL_SMOOTH ? TRUE : FALSE); + RegSetValueEx(skey, "Gouraud Shading", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + + RegCloseKey(skey); +} + +//****************************************************************************************** + +void +SaverSettings::WriteBehaviorRegistry() +{ + int i; + char str[20]; + LONG res; + HKEY skey; + DWORD disp, val; + float fval; + + res = RegCreateKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_CONFIG, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &skey, &disp); + if (res != ERROR_SUCCESS) return; + + for (i=0; i < 4; i++) + { + fval = state.fColorR[i]; + sprintf(str, "Color %d Red", i+1); + RegSetValueEx(skey, str, 0, REG_DWORD, (CONST BYTE*)&fval, sizeof(fval)); + fval = state.fColorG[i]; + sprintf(str, "Color %d Green", i+1); + RegSetValueEx(skey, str, 0, REG_DWORD, (CONST BYTE*)&fval, sizeof(fval)); + fval = state.fColorB[i]; + sprintf(str, "Color %d Blue", i+1); + RegSetValueEx(skey, str, 0, REG_DWORD, (CONST BYTE*)&fval, sizeof(fval)); + } + val = state.bQuick; + RegSetValueEx(skey, "Speed Up Clock", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = state.bSwing; + RegSetValueEx(skey, "Swing Clock", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = state.bUseMouse; + RegSetValueEx(skey, "Use Mouse", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + state.bBlackBackground == TRUE ? val = FALSE : val = TRUE; + RegSetValueEx(skey, "Use Backdrop", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + val = state.nTwists; + RegSetValueEx(skey, "Moebius Strip Twists", 0, REG_DWORD, (CONST BYTE*)&val, sizeof(val)); + + RegCloseKey(skey); +} + +//****************************************************************************************** + +void +SaverSettings::CloseSaverWindow() +{ + ReallyClose = TRUE; + PostMessage(hwnd, WM_CLOSE, 0, 0); +} + +//****************************************************************************************** + +void +SaverSettings::StartDialog() +{ + IsDialogActive = TRUE; + SendMessage(hwnd, WM_SETCURSOR, 0, 0); +} + +//****************************************************************************************** + +void +SaverSettings::EndDialog() +{ + IsDialogActive = FALSE; + SendMessage(hwnd, WM_SETCURSOR, 0, 0); + GetCursorPos(&InitCursorPos); +} + diff --git a/SaverSettings.h b/SaverSettings.h new file mode 100644 index 0000000..ca84272 --- /dev/null +++ b/SaverSettings.h @@ -0,0 +1,51 @@ +//========================================================================== +// +// File: SaverSettings.h +// +//========================================================================== + +#ifndef SAVERSETTINGS_H +#define SAVERSETTINGS_H + +#include "OpenGLenv.h" + +//****************************************************************************************** + +class SaverSettings +{ +public: + HWND hwnd; + HDC hdc; + HGLRC hglrc; + UINT idTimer; // a timer id, because this particular saver uses a timer + DWORD customColors[16]; + + DWORD PasswordDelay; // in seconds + DWORD PasswordDelayIndex; + DWORD MouseThreshold; // in pixels + DWORD MouseThresholdIndex; + BOOL MuteSound; + char Corners[5]; + POINT InitCursorPos; + DWORD InitTime; // in ms + BOOL IsDialogActive; + BOOL ReallyClose; // for NT, so we know if a WM_CLOSE came from us or it. + + GraphicEnvState state; + + SaverSettings(); + + void ReadGeneralRegistry(); + void WriteGeneralRegistry(); + void ReadGraphicConfigRegistry(); + void WriteGraphicConfigRegistry(); + void ReadBehaviorRegistry(); + void WriteBehaviorRegistry(); + void CloseSaverWindow(); + void StartDialog(); + void EndDialog(); +}; + +//****************************************************************************************** + +#endif diff --git a/ScreenSaver.cpp b/ScreenSaver.cpp new file mode 100644 index 0000000..37c316f --- /dev/null +++ b/ScreenSaver.cpp @@ -0,0 +1,570 @@ +// Minimal Screensaver +// --------------------- +// (c) 1998 Lucian Wischik. You may do whatever you want with this code, without restriction. +// +// This code is a basic minimal screensaver. It does not use SCRNSAVE.LIB or any other library: +// absolutely all the code is in this source file. +// The saver works perfectly fine under '95 and NT. It respects the Plus! configuration settings +// (password delay, mouse movement threshold). It can handle passwords correctly. +// It makes all the correct calls in the correct places, including calls that are undocumented +// by Microsoft. +// This code accompanies the guide 'How To Write a 32bit Screen Saver'. All documentation for this +// code is in that guide. It can be found at http://classic.physiol.cam.ac.uk/scr/ +// +// Notes: +// 0. All of this is a real hassle. If you used my ScrPlus library then it would all be much much +// easier. And you'd get lots of extra features, like a standard 'Plus!' style configuration dialog +// with preview in it, and proper handling of hot corners under NT as well as '95, and a high +// performance multimedia timer, and lots of examples including some that use full-screen DirectDraw. +// http://classic.physiol.cam.ac.uk/scr/ +// If you have C++Builder then you should use my ScrPlus/C++Builder library which has an expert +// and components for easily generating screensavers. +// If you remain blind to the joys of using ScrPlus and are willing to waste time programming it +// all yourself, then read on... +// 1. Having a 'DEBUG' flag, with diagnostic output, is ABSOLUTELY ESSENTIAL. I can guarantee +// that if you develop a screensaver without diagnostic output for every single message that +// you handle, your screensaver will crash and you won't know why. +// 2. If you also wanted to write a configuration dialog that was able to set the standard Plus! +// options, you'd need to use two additional calls: SystemAgentDetect, and ScreenSaverChanged. +// They are documented in my 'how to write a 32bit screensaver' technical guide. +// 3. NT and '95 handle passwords differently. Under NT, the saver must terminate and then the +// verify-password dialog comes up. If the user fails, then the screensaver is launched again from +// scratch. Under '95, the password dialog comes up while the saver is running. +// 4. You should probably use WM_TIMER messages for your animation, rather than idle-processing. +// By using WM_TIMER messages your animation will keep going even when (under '95) the password +// dialog is up. +// 5. Changing the saver to allow interraction is easy. All you have to do is figure out which +// messages (keyboard, mouse, ...) will be used by you and stop them from closing the window. +// 6. Changing the saver to implement your own password routine is easy under '95: all you have +// to do is change the VerifyPassword routine. Under NT it's not really possible. + +#include +#include +#include +#include + +#pragma hdrstop + +#include "resource.h" +#include "SaverSettings.h" +#include "Password.h" +#include "Debug.h" +#include "Dialogs.h" + +//****************************************************************************************** + +#define TIMERID 1000 +#define UPDATE_TIME 10 + +#define SIGN_EXTEND(w) ((((int)(w)) << 16) >> 16) + +//****************************************************************************************** + +enum TScrMode { smNone, smConfig, smPassword, smPreview, smSaver}; + +HINSTANCE hInstance = NULL; +HWND hScrWindow = NULL; +TScrMode ScrMode = smNone; +SaverSettings* ss = NULL; + +//****************************************************************************************** + +#if DEBUG +void Debug(char *c) { OutputDebugString(c); OutputDebugString("\n"); } +#else +void Debug(char *) {} +#endif + +//****************************************************************************************** + +LRESULT CALLBACK +SaverWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static BOOL bRoll = FALSE; + static BOOL bMovement = FALSE; + static POINT anchor; + + switch (msg) + { + case WM_CREATE: + { + Debug("WM_CREATE..."); + ss->hwnd = hwnd; + GetCursorPos(&(ss->InitCursorPos)); + ss->InitTime = GetTickCount(); + ss->idTimer = SetTimer(hwnd, TIMERID, UPDATE_TIME, NULL); + if (!InitGraphicEnv(ss->hwnd, &ss->hdc, &ss->hglrc)) + return FALSE; + InitState(); + InitTexture(ss->hwnd, ss->hdc); + InitDisplayLists(); + } + break; + + case WM_TIMER: + { + UpdateTime(); + InvalidateRect(hwnd, NULL, FALSE); + } + break; + + case WM_ACTIVATE: + case WM_ACTIVATEAPP: + case WM_NCACTIVATE: + { + if (ScrMode==smSaver && !ss->IsDialogActive && LOWORD(wParam)==WA_INACTIVE && !DEBUG) + { + Debug("WM_ACTIVATE: about to inactive window, so sending close"); + ss->CloseSaverWindow(); + } + } + break; + + case WM_SETCURSOR: + { + if (ScrMode==smSaver && !ss->IsDialogActive && !DEBUG) + SetCursor(NULL); + else + SetCursor(LoadCursor(NULL, IDC_ARROW)); + } + break; + + case WM_KEYDOWN: + case WM_MBUTTONDOWN: + ss->CloseSaverWindow(); + break; + + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + { + if (ScrMode==smSaver && !ss->IsDialogActive) + { + if (ss->state.bUseMouse) + { + RECT rc; + bMovement = TRUE; + GetClientRect(hwnd, &rc); + GetCursorPos(&anchor); + ScreenToClient(hwnd, &anchor); + if (msg == WM_RBUTTONDOWN) bRoll = TRUE; + else bRoll = FALSE; + SetCapture(hwnd); + } + else // Not using mouse so we can try to close the screensaver + { + Debug("WM_BUTTONDOWN: sending close"); + ss->CloseSaverWindow(); + } + } + } + break; + + case WM_LBUTTONUP: + { + if (ScrMode==smSaver && !ss->IsDialogActive) + { + bMovement = FALSE; + bRoll = FALSE; + ReleaseCapture(); + } + } + break; + + case WM_LBUTTONDBLCLK: + { + if (ScrMode==smSaver && !ss->IsDialogActive) + { + if (ss->state.bUseMouse) + { + ResetOrientationGraphicEnv(); + } + else // Not using mouse so we can try to close the screensaver + { + Debug("WM_BUTTONDOWN: sending close"); + ss->CloseSaverWindow(); + } + } + } + break; + + case WM_MOUSEMOVE: + { + if (ScrMode==smSaver && !ss->IsDialogActive) + { + if (ss->state.bUseMouse) + { + if (bMovement & ((wParam & MK_LBUTTON) || (wParam & MK_RBUTTON)) ) + { + POINT mouse; + mouse.x = SIGN_EXTEND(LOWORD(lParam)); + mouse.y = SIGN_EXTEND(HIWORD(lParam)); + MotionOfGraphicEnv(&anchor, mouse, bRoll); + } + } + else // Not using mouse so we can try to close the screensaver + { + POINT pt; + GetCursorPos(&pt); + int dx = pt.x-ss->InitCursorPos.x; + if (dx<0) dx=-dx; + int dy=pt.y-ss->InitCursorPos.y; + if (dy<0) dy=-dy; + if (dx>(int)ss->MouseThreshold || dy>(int)ss->MouseThreshold) + { + Debug("WM_MOUSEMOVE: gone beyond threshold, sending close"); + ss->CloseSaverWindow(); + } + } + } + } + break; + + case (WM_SYSCOMMAND): + { + if (ScrMode == smSaver) + { + if (wParam == SC_SCREENSAVE) + { + Debug("WM_SYSCOMMAND: gobbling up a SC_SCREENSAVE to stop a new saver from running."); + return FALSE; + } + if (wParam == SC_CLOSE && !DEBUG) + { + Debug("WM_SYSCOMMAND: gobbling up a SC_CLOSE"); + return FALSE; + } + } + } + break; + + case WM_SIZE: + { + int width = LOWORD(lParam); + int height = HIWORD(lParam); + if (width && height) + { + Reshape(ss->hdc, width, height); + } + } + break; + + case WM_PAINT: + { + RECT r; + PAINTSTRUCT ps; + + // Retrieve the coordinates of the smallest rectangle that completely encloses the + // update region of the specified window (win) + if (GetUpdateRect(ss->hwnd, &r, FALSE)) + { + BeginPaint(ss->hwnd, &ps); + Display(ss->hdc); + EndPaint(ss->hwnd, &ps); + } + } + break; + + case WM_CLOSE: + { + if (ScrMode==smSaver && ss->ReallyClose && !ss->IsDialogActive) + { + Debug("WM_CLOSE: maybe we need a password"); + BOOL CanClose = TRUE; + if (GetTickCount()-ss->InitTime > 1000*ss->PasswordDelay) + { + ss->StartDialog(); + CanClose = VerifyPassword(hwnd); + ss->EndDialog(); + } + if (CanClose) + { + Debug("WM_CLOSE: doing a DestroyWindow"); + DestroyWindow(hwnd); + } + else + { + Debug("WM_CLOSE: but failed password, so doing nothing"); + } + } + if (ScrMode == smSaver) + return FALSE; // so that DefWindowProc doesn't get called, because it would just DestroyWindow + } + break; + + case WM_DESTROY: + { + if (ss->idTimer != 0) + KillTimer(hwnd, ss->idTimer); + DestroyGraphicEnv(ss->hwnd, ss->hdc, ss->hglrc); + ss->idTimer = 0; + Debug("POSTQUITMESSAGE from WM_DESTROY!!"); + PostQuitMessage(0); + } + break; + } + return DefWindowProc(hwnd, msg, wParam, lParam); +} + +//****************************************************************************************** + +void +DoSaver(HWND hparwnd) +{ + WNDCLASS wc; + wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; + wc.lpfnWndProc = SaverWindowProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = NULL; + wc.hCursor = NULL; + wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + wc.lpszMenuName = NULL; + wc.lpszClassName = "ScrClass"; + RegisterClass(&wc); + if (ScrMode == smPreview) + { + RECT rc; + GetWindowRect(hparwnd, &rc); + int cx = rc.right-rc.left, cy = rc.bottom-rc.top; + hScrWindow = CreateWindowEx( + 0, "ScrClass", "SaverPreview", + WS_CHILD | WS_VISIBLE, + 0, 0, cx, cy, + hparwnd, NULL, hInstance, NULL + ); + } + else + { + int cx = GetSystemMetrics(SM_CXSCREEN), cy = GetSystemMetrics(SM_CYSCREEN); + DWORD exstyle, style; + if (DEBUG) + { + cx = cx/3; + cy = cy/3; + exstyle = 0; + style = WS_OVERLAPPEDWINDOW | WS_VISIBLE; + } + else + { + exstyle = WS_EX_TOPMOST; + style = WS_POPUP | WS_VISIBLE; + } + hScrWindow = CreateWindowEx( + exstyle, "ScrClass", "SaverWindow", + style, 0, 0, cx, cy, + NULL, NULL, hInstance, NULL + ); + } + if (hScrWindow == NULL) return; + + UINT oldval; + if (ScrMode == smSaver) + SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, &oldval, 0); + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + if (ScrMode == smSaver) + SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, &oldval, 0); + + return; +} + +/****************************************************************************/ +// +// Creates the Property Sheets - Replaces calls to DialogBox +// +int +CreatePropertySheet(HWND hwndOwner) +{ + PROPSHEETPAGE psp[3]; + PROPSHEETHEADER psh; + + psp[0].dwSize = sizeof(PROPSHEETPAGE); + psp[0].dwFlags = PSP_USETITLE; + psp[0].hInstance = hInstance; + psp[0].pszTemplate = MAKEINTRESOURCE(IDD_GENERAL); + psp[0].pszIcon = NULL; + psp[0].pfnDlgProc = GeneralDialogProc; + psp[0].pszTitle = "General"; + psp[0].lParam = 0; + + psp[1].dwSize = sizeof(PROPSHEETPAGE); + psp[1].dwFlags = PSP_USETITLE; + psp[1].hInstance = hInstance; + psp[1].pszTemplate = MAKEINTRESOURCE(IDD_GRAPHIC_CONFIG); + psp[1].pszIcon = NULL; + psp[1].pfnDlgProc = GraphicConfigDialogProc; + psp[1].pszTitle = "OpenGL"; + psp[1].lParam = 0; + + psp[2].dwSize = sizeof(PROPSHEETPAGE); + psp[2].dwFlags = PSP_USETITLE; + psp[2].hInstance = hInstance; + psp[2].pszTemplate = MAKEINTRESOURCE(IDD_BEHAVIOR); + psp[2].pszIcon = NULL; + psp[2].pfnDlgProc = BehaviorDialogProc; + psp[2].pszTitle = "Behavior"; + psp[2].lParam = 0; + + psh.dwSize = sizeof(PROPSHEETHEADER); + psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW | PSH_USEICONID; + psh.hwndParent = hwndOwner; + psh.hInstance = hInstance; + psh.pszIcon = MAKEINTRESOURCE(IDI_ICON1); + psh.pszCaption = (LPSTR) "Screen Saver Properties"; + psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); + psh.nStartPage = 1; + psh.ppsp = (LPCPROPSHEETPAGE) &psp; + + return (PropertySheet(&psh)); +} + +//****************************************************************************************** +// This routine is for using ScrPrev. It's so that you can start the saver +// with the command line /p scrprev and it runs itself in a preview window. +// You must first copy ScrPrev somewhere in your search path. + +HWND +CheckForScrprev() +{ + HWND hwnd = FindWindow("Scrprev", NULL); // looks for the Scrprev class + if (hwnd == NULL) // try to load it + { + STARTUPINFO si; + PROCESS_INFORMATION pi; + ZeroMemory(&si, sizeof(si)); + ZeroMemory(&pi, sizeof(pi)); + si.cb = sizeof(si); + si.lpReserved = NULL; + si.lpTitle = NULL; + si.dwFlags = 0; + si.cbReserved2 = 0; + si.lpReserved2 = 0; + si.lpDesktop = 0; + BOOL cres = CreateProcess( + NULL, "Scrprev", 0, 0, FALSE, + CREATE_NEW_PROCESS_GROUP | CREATE_DEFAULT_ERROR_MODE, + 0, 0, &si, &pi + ); + if (!cres) + { + Debug("Error creating scrprev process"); + return NULL; + } + DWORD wres = WaitForInputIdle(pi.hProcess, 2000); + if (wres == WAIT_TIMEOUT) + { + Debug("Scrprev never becomes idle"); + return NULL; + } + if (wres == 0xFFFFFFFF) + { + Debug("ScrPrev, misc error after ScrPrev execution"); + return NULL; + } + hwnd = FindWindow("Scrprev", NULL); + } + if (hwnd == NULL) + { + Debug("Unable to find Scrprev window"); + return NULL; + } + ::SetForegroundWindow(hwnd); + hwnd = GetWindow(hwnd, GW_CHILD); + if (hwnd == NULL) + { + Debug("Couldn't find Scrprev child"); + return NULL; + } + return hwnd; +} + +//****************************************************************************************** + +int WINAPI +WinMain(HINSTANCE h, HINSTANCE, LPSTR, int) +{ + hInstance = h; + HWND hwnd = NULL; + INITCOMMONCONTROLSEX initCntrls; + + char *c = GetCommandLine(); + if (*c == '\"') + { + c++; + while (*c!=0 && *c!='\"') c++; + } + else + { + while (*c!=0 && *c!=' ') c++; + } + if (*c != 0) c++; + while (*c == ' ') c++; + + if (*c == 0) + { + ScrMode = smConfig; + hwnd = NULL; + } + else + { + if (*c=='-' || *c=='/') c++; + if (*c=='p' || *c=='P' || *c=='l' || *c=='L') + { + c++; + while (*c==' ' || *c==':') c++; + if ( (strcmp(c, "scrprev") == 0) || (strcmp(c, "ScrPrev") == 0) || + (strcmp(c, "SCRPREV") == 0) ) + hwnd = CheckForScrprev(); + else hwnd = (HWND)atoi(c); + ScrMode = smPreview; + } + else if (*c=='s' || *c=='S') + { + ScrMode = smSaver; + } + else if (*c=='c' || *c=='C') + { + c++; + while (*c==' ' || *c==':') c++; + if (*c == 0) hwnd = GetForegroundWindow(); + else hwnd = (HWND)atoi(c); + ScrMode = smConfig; + } + else if (*c=='a' || *c=='A') + { + c++; + while (*c==' ' || *c==':') c++; + hwnd = (HWND)atoi(c); + ScrMode = smPassword; + } + } + + initCntrls.dwSize = sizeof(INITCOMMONCONTROLSEX); + initCntrls.dwICC = ICC_WIN95_CLASSES; + InitCommonControlsEx(&initCntrls); + + // We create a global SaverSettings here, for convenience. + // It will get used by the config dialog and by the saver as it runs. + + ss = new SaverSettings(); + ss->ReadGeneralRegistry(); + ss->ReadGraphicConfigRegistry(); + ss->ReadBehaviorRegistry(); + + if (ScrMode == smPassword) ChangePassword(hwnd); + if (ScrMode == smConfig) + { + CreatePropertySheet(hwnd); + } + if (ScrMode == smSaver || ScrMode == smPreview) DoSaver(hwnd); + + delete ss; + return 0; +} + +//****************************************************************************************** diff --git a/TransparentBitmap.cpp b/TransparentBitmap.cpp new file mode 100644 index 0000000..9cca657 --- /dev/null +++ b/TransparentBitmap.cpp @@ -0,0 +1,105 @@ +//========================================================================== +// +// File: TransparentBitmap.cpp +// +//========================================================================== + +#include + +void +DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, short xStart, + short yStart, COLORREF cTransparentColor) +{ + BITMAP bm; + COLORREF cColor; + HBITMAP bmAndBack, bmAndObject, bmAndMem, bmSave; + HGDIOBJ bmBackOld, bmObjectOld, bmMemOld, bmSaveOld; + HDC hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave; + POINT ptSize; + + hdcTemp = CreateCompatibleDC(hdc); + SelectObject(hdcTemp, hBitmap); // Select the bitmap + + GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm); + ptSize.x = bm.bmWidth; // Get width of bitmap + ptSize.y = bm.bmHeight; // Get height of bitmap + DPtoLP(hdcTemp, &ptSize, 1); // Convert from device + // to logical points + + // Create some DCs to hold temporary data. + hdcBack = CreateCompatibleDC(hdc); + hdcObject = CreateCompatibleDC(hdc); + hdcMem = CreateCompatibleDC(hdc); + hdcSave = CreateCompatibleDC(hdc); + + // Create a bitmap for each DC. DCs are required for a number of + // GDI functions. + + // Monochrome DC + bmAndBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL); + + // Monochrome DC + bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL); + + bmAndMem = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); + bmSave = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); + + // Each DC must select a bitmap object to store pixel data. + bmBackOld = SelectObject(hdcBack, bmAndBack); + bmObjectOld = SelectObject(hdcObject, bmAndObject); + bmMemOld = SelectObject(hdcMem, bmAndMem); + bmSaveOld = SelectObject(hdcSave, bmSave); + + // Set proper mapping mode. + SetMapMode(hdcTemp, GetMapMode(hdc)); + + // Save the bitmap sent here, because it will be overwritten. + BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY); + + // Set the background color of the source DC to the color. + // contained in the parts of the bitmap that should be transparent + cColor = SetBkColor(hdcTemp, cTransparentColor); + + // Create the object mask for the bitmap by performing a BitBlt + // from the source bitmap to a monochrome bitmap. + BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY); + + // Set the background color of the source DC back to the original + // color. + SetBkColor(hdcTemp, cColor); + + // Create the inverse of the object mask. + BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY); + + // Copy the background of the main DC to the destination. + BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY); + + // Mask out the places where the bitmap will be placed. + BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND); + + // Mask out the transparent colored pixels on the bitmap. + BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND); + + // XOR the bitmap with the background on the destination DC. + BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT); + + // Copy the destination to the screen. + BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY); + + // Place the original bitmap back into the bitmap sent here. + BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY); + + // Delete the memory bitmaps. + DeleteObject(SelectObject(hdcBack, bmBackOld)); + DeleteObject(SelectObject(hdcObject, bmObjectOld)); + DeleteObject(SelectObject(hdcMem, bmMemOld)); + DeleteObject(SelectObject(hdcSave, bmSaveOld)); + + // Delete the memory DCs. + DeleteDC(hdcMem); + DeleteDC(hdcBack); + DeleteDC(hdcObject); + DeleteDC(hdcSave); + DeleteDC(hdcTemp); +} + diff --git a/TransparentBitmap.h b/TransparentBitmap.h new file mode 100644 index 0000000..06eb28c --- /dev/null +++ b/TransparentBitmap.h @@ -0,0 +1,17 @@ +//========================================================================== +// +// File: TransparentBitmap.h +// +//========================================================================== + +#ifndef TRANSPARENTBITMAP_H +#define TRANSPARENTBITMAP_H + +#include + +void DrawTransparentBitmap( + HDC hdc, HBITMAP hBitmap, short xStart, + short yStart, COLORREF cTransparentColor +); + +#endif diff --git a/bcheck.bmp b/bcheck.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6d19f325378277f83fe03610387d7e28c2210d7c GIT binary patch literal 486 zcmbVIIS#@w5S$!Ro`CoP@1Uon;uWcIy95bQ@FgTafmcw|LFdeFz*$ovCf>0pGxo|} zZ|)Tgd-964WGz?~S~AeTeG>%|4Wy(i7C-$(Iy(qFl8~TA7zL&!R2ET!UmjPM60caR1|G)uq m_=SRCJApod=ob_e2MG|(N7oNF4M{&O`M@B9fe#HP`x^mXPR$Ph literal 0 HcmV?d00001 diff --git a/bnone.bmp b/bnone.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fb03915f63061cf8bd4ec04720bbee617794bd25 GIT binary patch literal 486 zcmZ?rea6TD24z4}1BfMoSR9BM8CZZM1498+9?U@@8WFl8~TA7zL&!R2ET!UmjPM60caR1|Gx&418!X+205NNDa|z literal 0 HcmV?d00001 diff --git a/cafe.bmp b/cafe.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9328a3e9e91156bb98f8351dcd2fa6805954be71 GIT binary patch literal 49220 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

`|*=!(4{bz+(v+bTuF6 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 literal 0 HcmV?d00001 diff --git a/hours0.bmp b/hours0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d2d0b376123e6a45af929a7e459137e99703ff4d GIT binary patch literal 24644 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 U;hz`%Y0msPi~l%(&M&|G2Vm6hlmGw# literal 0 HcmV?d00001 diff --git a/hours2.bmp b/hours2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6c0082de90544f01d224d459f2a60a1c61930fa5 GIT binary patch literal 24644 zcmeI)SI8zs76#y1_I6>fguU=$@x}$g3&BMYL54v@X2lgn6vaVN(ZzrnA)zzm?oqFq>w@&pxbN@DP!JH-6U)}%m zYw34$=KOidKY#l5SLgN1>@{nFSqscsVAcZvuNL_F>#zS^aeejGS3myv;|L>t^UXIQ z{>v}F{NaZm$`XG5`DYz{`st_tT5^5-@yFhs`c_${*JF$nP|!uWeLnr^r=Ob2j~hN| zdi?IY@6yIohoiw4UwlDZJ<{Q`&pz{W>RYLHXMrdJLkEK*wzFAQQaJhzbD5DD>JUZ< z9o)&!zB&uve*100hQjr;)+sG2jk;w7HTU0t|Fzd%d(Ac1{Imb^^v*l){N$5Q3c~vy zJ^JXQmtA(*Raaeg^UXKE`|i7C%LD)Ix8HvF;fHUs$tD|Yu)*%T?|%8^m%sDQJAJ}y z>fd|sy}R$e`^qb?G)#kK%$m2f`TXU_MT4?Oi(@#IGWi)>H;fJTLm$I~Y%KHH! zD4L6h9(oAaEURaqeRlu-_up)@&HmAUZMD@_M;&$4TW`Hp(@U!j@Nc^5rdw{g<(_-) zsjq?`o1b~+nM_xBvDIVi=kw1$f824$ZL!4`+itt<>8GF0 zkF^@~{RC8o@*>0Rw%cywhEKQ^X8{@rIi!JBUyr=>%P+rt_St7!`->JW`skyN;C9zt zcinj7jn6vkERQUuzIV&@e8?Vq>=6oFdg-O_zyE$;dv<>0kw<`k_0?B5>4E>X*It_r zF%f+)mg|A-jyvwyZoBOu!To^;9w@ihVBx}r8gH}BHU}Ma(9{K6mKIM%G$16?T%3FE zxooRmlsW9M!xC?O1+TDwO)srBC!BCX$Xs>RRT;K#2CYq=zpr;fps^e~TK(ovJ{~Ghh%eT9U84@=Bp`;gP8qdU9w_KKW#4W4=g;;q9X(!24;+;5KTkhyrdq zWoG5;ufM*^DyxK?l6-MJfA+*|R zs}=AsDDyC_PV?v7xpOfPU?>}{^XcP{Kfc2bI}o+hQcH0u_4pU=PdVk3(1G2ihV0JX zRl>iBpJQR|&X&T2pv+3qlCy<>+6p~U!yyabo$pSqeB+Hb=FOWIa!x$)#6J9^$1tDq zm;Vp^ud&7&@h&@@bIv&8W(`l zlPt5$GW+ba&mjEg6tLTyZ@yU=X5kV1Uw{4eIS|aYvoVH$%rVDgGc3q@7xxc2uHwA4J_YhlM9EKEd{9T=1>I|BEla2<>5E&O!OEyYAw*FTVKVRM=B2 zx;dQ6avA?77sYK|oF3u)f8w8Kz}q#`zOvtJR*8RcVY%g&3nN&n(BegxJ;(|xtPu5x zoXucLt}oQ!-*QWeB37=y{`$dE3>hn90hQF?3V6#-KUUCZDE^5u(j2%2Xb1)QHIEAT zx7#P$~jB4`p%w)Qq&* zrhtDl``T--A?Gk=PF+yvVtKt=?}>jCfeUHb=e?Ufw#sy#>i?~{#ful`NcY}*Z$5!~ zE=I5g4$nD%{(MTdk28$GV7z&0F_y>c%_S!4-VgEkf zSTp=+1H@Ur1M?!UoU~@=;}>jDMjV zuo10|HrmJr#N8F#!@^Jei%M&)wU$kg6k=t+*{l-(l4CTHsyg`KgJqimCM8^O!3B0e z>;QX=koEP28vJtw>#et5SlfQEwcnSJk-YL$6ksU%`TE|q9D#qX7y-!HN15t#*PXge z#Xs1?n}i9XZm-JMjpIDc-fQsB^;4ga>fQcrfEGHFlN$U} zj2|{f_GMTo7#Mp-A8dp&EI<@8(2_s(=T!XL5j*G+ebUqxqjfile+`6&sXewD)Z;&1 zoZMPE4h!yq1=$I<NpolhVKs0k-9&5B%T*j)b7J{`4wkPQ|~LVm;zv_7QB? zX{ViLQ8f9FppSvrq+D^u6)Cy0P>+8;ANRBH-CaBnw+V;bksYx~0frF@(6a{ra_pIM zx6#JOa)1DE-+lKvKBEIun2X6U}vCZ{N(?L_kjlA=A6z4zXlPFrni@Xys4dvt{9F+vLAc8)yqNR^&0 zzx?u48p;Yr@E^TP|4L0n-bvTk$WY#uLr|!}zh=m%O;&8UbSiIbN6_TtO_@{6?iK=j4?0bU*f)8~d8ZV;Zzqi#JNhkrKV zjZ-DLkrpd!^-}&>iGM=CPtGm+wd$P+)E^tQbQp(!qfP~=asK(|Ghj<{<$q7v>M`gpYU)?3>Ppu1TD}{(koKL7E{Gnm_XlS7x|JI$;>O6gLATAaU?JnBewukBDHv7(h zCnekI#77J9u1T>CnQT^5LsZb(nVkPhjEuH`$TBtmZy@k5$2bZ5tU*pjq`$&MBG**^ zuO*)23^eE#a|uHhZ;(&hBAS>88L$y+P;imu9)W)fI1LGvye<;eOnPS<{9$VTKVRhT z#NRZ&$Y==pbZUX$kjbGu_7Xw{;UD*Q*wj3B_xUa#GPU1U19I%0V@E$j{BwFO;Waj$H zkGYWcu?9zc1_K7D9gjK!|27)7{AoR3aEK+6T;&A5i~hQfMh zf03wQ=hh?q*^r-k=9&C_tAKwxWYQyiiyFSpVowE7@e$Nl1UF?qxHW|T3jS^6?O|=J za|SE%4}{W9NQgWDS1`!<&AH%(gifimB=80Ndl3fgyx5Auye{e+Gs27x=Eg-~z@vaK z`bOYi?@;6`Xx4B!dL97-OU6Pr5#m=&MB<-+pqu1|(aAGgCa@O36&1pf3SW&Cr1zI=eRn0Fz-ybw+k*U+?2Xl2M!ri>6Yo+kDD z9~guWQ!hd1LQ4kmkWc{gmq+qNQ>3sAE%7g;W{TBk0L|F}zqEs`_fY)H8s(R?dMx1I z6#L_d$UX8Bx!2}5=o}N_@MQ!856>SGhT`9NbMub>kK;dlP7Wc|Xj-@l+7|!uO;q#g z=ra80-xP!bW&G>Nz^&P6%yn3a<6xgULqZ@wWDdfA3YkfPSC_kv-s7J5CpORZtWaro zgXILc-{u!tY$z*OuY=cpz?tWXIxXOzW0Chu^@J*vEF@&=JF=kl3Pj6h5@{&@g(N{g zv>J_n9MV@qIW&bz{BsCgpNoUai%rxFG6MVqa8rS)_$MFp%Hp0I%b z)_8N^twNKfPj)w1!~fg1H;vH5zooJA$}4*cAqbDyL}6cF=V_ovDs2!ZCHK{sDKJjD zMM44pR$Nm(NpBfuq!;x~zu{9Tqv-3duijs7=BS6_AM2n-ygnNLe8@Qe5B~-w6#CmY z=S>KzOCD+H2{`_rt2o9|gMXYSzrAEPjA#Vw$Vq{OoCSpf{yAzNpTuCBcNWM?RtiZT zLBY{*BkD!wEPI9LIlfNEyZSr8KGZ|8e~4`$J>TiGz)y zP5^HCF7!Kv)ZpJ+{vO0pZ@eXmF^K)PW{2tIZ4wCu{A0YSXQ9A3529pTS<4YM@h?PX zmVUBR+G@;=v<5ZxC;Zs`L2}3}wgx*m6d)4Mt%v77nd| zf2*vy-djkBpQZz2w<+%ItFMyXoT6rGw~2qgntGY2Y;_92qTwLtpE_7sGG@M+ z9PG0pq{%!t4W4S?pHBVQFvZpv&@eRK5kQR2f2fk1>lz{GD7yiV#Vh?@^U7o!jD-;h z2?yBs5u*V%&wt}jeeH~bnuaxG;fDHu`mnhrz=m-S!q4>O|C`G5coKs-3miBf)of5- zW=7(}y@vKwxP64^-nSA^Z3PkvGjA-gd1TtR*NPmr< z{m_9B2`<|!Cjy=J6wrAgNBp=bKfvF55!&%^yBL)o*#xmt2poDR9|y1mY=? zv-dvD>vaet$O-oaL9E8Yj~>f+E2V&?f=Y}4hm6p~f3&v*xG4zah}?~r{R^T7J>s}T z85StNrAI-~L{pLiL(?4v;RY@Ojx(C@U5H$TPFs&8B201Ta*jo6mASZ!;CpmtfvoiI zR0FnpZ2h!+2(O%0ed#fJ#{>H`Z*?*CCsAZ}HZxv0i5|;$SRHK&woMCnsxezRYk^q{ e%vxa90{`0<`1`^?F8afq`EwTke*T+?5%|MJV|cXQ_a z`PYB`^vkc#=jYjHmIJdKnB~AM2WB}i%Yj)A{2z1Ri!Z)-=9y<6c;JE8Uw<7NUVi!I zhaP(9`RAYi>Z`A&&6UqS`wYx~{rY_L(MLc0@IxP{AAkJu(@#Hr_St8xeeSvEUVH5| z^z<$6oB!mKPhNQ81=|DTz~8UG{<;P7@y8#d_Rc%+y#D&@Z@A%xJMOsS>8GFm{PWM- zm3=eszWc5%19;M(Y1$rJ&x z9ei8H(2O}`)FLfss0!jkh{I&y>Q6uYRPHs#6Wi~(=N`=W+m2mr{iSkDuee~di58iCE&2GK*Rw%B#^2#l@-13-Xj(O^-r=}!@lDwB*dg-8p z4m$eiqmMlD$S0qCasUp~c;k&XjyvwSqmDZ2@WT&3=bUqhsRT7~jGx4M{`u!0al{cY z_C4Su=Kc5IuK;2`&L4Q-fh(-ALexsjFTeZ&2ORLoBag7+R#?^c`00#sgg)%%4?FBI z_VwO-?{z|8!V4EJjAb|9eDjANe%QIJbCSm(ZX$EWJ_5Y5009AkKHPZYjTqjyKIRWS z^iaCQzB=*dB$d15l1nD?9}SGIQf$CEu9Htbd6iXG3I4CS=9+%;!{2@PU7{E>AgnLH z{POO*@7{m^{RuIk&7C`!a36m7;nwuPzwENhHr#MSi`QCfEj)zf+H0>hwrlIHx5lC| zc-u9PJ@y!wfOwb{s@gRHb6Mvk{|xLJYph}K00Dp_ARyR6Pd43j)8Q@N(ux8170}4*s;jQT zv0-Rv<0vYvmUwKp-FBqE_~MHP^Osm+2|qXAd~+VS^SphNTp4L1qm<@ii!J77NRvY= z_tMf$HrXVQQoP%5zunubufBTal~<0*U3S@}QkZi4!1%!j9}Eco@;SpP4G(bXrI+S< zwjg{A0PlSD_~Vb`SOV!AyzoSgZo5r{hM%eb z7|ZH~+P+<45F$$~17k)?nrpAUb{{m-eBy~G5<8pSd+)u&=-9|Q>#QRU0AJRWD#38h zJ@?!yU=7fauN*VUz`$Ys7q(;tC`X1}e28RbWa5z+4TNAG*og+7()}t-cHe#Xq?6nE z>#vVNPI8#SQ;DT->x+B-~c#N)qlEV%lhlDKR|$22q>{jeaU@* zV6TMlG5QZILCax=p;6J)Kwxc&BV)LYE&ngS{PK~SAY#haQg99%(3V_s$(%gxw9`KL z-~*&$7t2aLUwY}K4>{zJ5Di1#V~;(8Dt|ZHXrp26E%}+_De1pmOia*^u!Rph@4Pe5 zkkCdBD1a=89sRTGaS)lFL?xgxf0bGpC`I85FTC)gi!R!A*Ikoi8*jX^06m5PM^Lrx zu)_{r$bXp=g3mbPj6TKwjrxy5dPSXf+G(c+3l_9AIJ>jpPk9z8@h!L9(z!k$th?^I z_uY5j#QY~<@+VvngKDvx3H~cZ)19huw%Tf|WVK}M?6c42`jnqJNi9c)00}@Df2j~@ zdP*1PI5abOrOHm}OF3jLq33uas^4NEPx6p@Xz!Q|~!_1{Lx9vKBvZbS{3&_)gz zHRF}E-*nSWw#P%h1{A|1v}Hc;uzn_=amlGg2l<{jxWyJ*IJmdVEw|iRXPq^Y02-*< z0MUPu|L0%ym{eHtetps8x9dM5ISpC8gcIU8cu){$_ZI=xS@^^2uDhLrJqFanq)2kx!>{QmpzZxK~9EEL{^Mw)lsbr)hh z1`H~oSpW;vQf{V7xMnzclO;fMR7V6fp`naf<+6eCH1wZ|mGO%so!E95AYkGv;ZpY_ zIi}^CTkwZUWIJM?ef9~F<$^^qm=XP76of4zm^7B3N&btB*%`xawM;1IN-M2YDQ71= zT(qPyp{cUP_gG1blx6|V0+6{r*o8vbvKf^x*H?j61qU?xFH%fZ6{o8I(IA2-LjbBo zv^+&c-tbSSqu!jM$Ds2fgR99Hr!wLwN|>U6kR2S@e*5hsX)G5Ek41L+90b@q#(ZW_ z|G8_aND^Q?Ol`ciKDPMV7o^6(v4+&-nQ?sl@9h2&3ePNAl@_kH+G<2!Mj7fC$|(w0 zIa?t+)~-iBFSTn$fMW{nIOFlhA763IdAHeSn|Lb(PxVSd zWg!g{VfD3$QVV@z0!izBOZ}U&Gr&^Gq=N?sumbR50z`b;Na(g8Th>%Dq=Y|lOlnfT zz>W-loM-6(y9ult!SGYuKawD&DH{ zFo%3KY(oL)n{20C&-{gnSkM0xUum1=%D(YP|L?Gf(Y5fzWs}q~)e`E;E%%|T<{h7z z;~of_033Lm_iBa30sSST*5m2@#sajp+bfLKPZrG`F<}JoW7}@KZD$NBcg>*w1IuMO zIPCGL2wD$NVyAdikspp-tFOK~%Pkj7Y3#7>^2iZ(0LApm!3H$ar&sZWc~Z-aR(y_H zo^qad-gy(TGu|*3>(y(O+k^yS4OcMiJzDZc z>c1o;+P}!=C3qozz{PQ(_SaolWy>wDb_Pokkf)=8C!Tm>r2tUxx#ym+vlI+z_4A4= zu5fRtV}I(Yr%u)Xvt@mZkcd-I0~zLU44qm1$3~Gf*{IFJiM5O>XB3`%V{VZX0y0&( z2SD28O4of{K$DY@>6m~bjX&Xp6SyO(uTF*bEI*ug)+M#om@;ea5~UJSDkZp-3!K7N z4PKF^Xd?8R5t68V*2U5=NbTY}jDvE$Q+=di!Ig+|JVyV4MO88!c}PN-&>4xDSCa7Q zg#aRO+fMNUzTk*Or8MDkQgnJ`s!S${kAa&qpFqf+Y@BNT4}uVY+w3|B;D3gbkeStg z9#5xH4VCQWMOz!Mj;!kE`D2UVB}1qbsaik$Q-bZnH=s%F6rrdZ-h$P!ey_du;&YgQ zzY{GNOs<=-h?2>0;G|z6B27U&q#2fo7~Roik&iBTV7oM_jDrl^pd=H?u5kH@l7Qf^ zl%|SDvEI?NR&tq$LkGN~IgBpm8KCxitDG&yc7{V^;0Z@QDZZ4;oQp-2Mp3?vSMj%; zA2~+zZMWT)AwU`+Mh{#h&8+?-lJd~`WG_}syvPu0%PtBv;2B1qw_V0*$UK7pAwWRs zRD*IOn~n7xm+pk0WK>D5T%Y4oSe*hb7vwJHmR%02p5H&n1A`20@XW_@*O&ogOwRY| zznqX;u#A&55auG)!6n6GZWj&t>M=;GHR6lC*~T>RSw(sVSQwft$fV>y=MxB*;;kz! zy`bv5kz6x8pgbz;Jcw*6s=Ur!oYG9yzX6}-pkE_BVi1keNSPSQrGnWOLphZgu-VRo zl#@iCWhqxcD~4TJ`u|{>9I~y;O87Zu>>)~ip0>0en>4)&X<8f`&Cu|`#n@e)n5T!C zxv}3WZBC4R1E@V*P0GDb|9x2zYxqXjd}XLbr}!IhsZCr=_hB5E#}grj^8tziXf-4j zX9ro5>|+~=Un^x~`#eTgsW~v!{69(3h|V0qF+1yMu8H+YeYu^`)oFbHkQmDWK_~{3 z0QcGx{W;x`6(BX3FQbmCumn4P%&2iVzCa*QpU4j9VEC-zpIf*n8R zi>On{ib^yyeT+TW)~)%W%cr&Js6r4Mh+3oFtj*m-z=Q^~Q8w@FqA=t)2V zBy{Gl{P+FmwDn(J0d-*4F~~3ni_=9J!VmCxi5HWpI%_(=!&PuBt2xWKVeF%oPwVAom6`d=QEzF|)GGkpsY zeI5{U(m-{VFm)Xx0`ibz@o>(TyJFz%J}XU$8%*^7^4{{o8XQazc|#do=Zz78W`%Ic z#(f3NpC?rqo`D82SRJpVSS%~()Cgrhxy3*L$~2h&uilm`V@#L09SY2r38Iv;vm`fk z#oKg(u=L(@jlneXA3y|a4i*itl!b;1IP<{rX5~c>o^y0K=BqH?FHJ@&$O$JsRJuKH zJ0p1(H9*7F^2U~Rml3dxCJ@Okv@11Uc!{X~cnns_AqN3Kjd8y`WZYLqp*Nntx66T-8J_ z04l!#^eXkAO6Qm7bcQnI76Wx(=nSU$tUdjCxuzUTpXk5EVY9NgO$O;dPVdiZi*r8f2a$sxpK;K37os z|Hv_7FIMn8vLj6x?vA8lULKx(GaMV^|AoB#n#*21FUeDlCP4K_hG406$V={|HjJ!^ zC`HWRm|e!DW|m+($0%W9$vuNU|L?{vlpOyBAhA2t4980TbA~0;I+29D>=3awo_*0$OzK zO!+|tAIRweA$o*DKVIa{xd+5O)n?1J1hcR>837m%cU}Nccq`<10^by zFpFQ5Q0Xzw$DwGTup6gve7*=X!6(+3#0QD7!zKreElB=gH6IQLS;Q8{k%{H{;Q(8*<@ zv#eX;S*DBBmL6LUjRWBvUt_Ds)n#sB_0VY)OgG=BuiOwH$8s>`Y6+wqtNmMP+QI~U z;waW|K~RVS#u_rx^kXCb3*0cq7P~lMkyHqygw(QxKRhN)9z*`d+|+tZSQIu^ znn@$Q9o|ko5Th1=x(w69yUMrZMQWt!)Y2Gd5qFehicq{QSLQhQuPdSjfnB!nld=N+ z@F_W;07$`PzjAm52(Q8y=|%7`bgWFh61xG3qnVz_b)jaA8g7^%^O=(M0hJ6SJ_kpD zhcgd#>XRn9@Eg=ViX&f#I>Pw8t2|3PCU>B!#G_qijaxGecVr$(FQUDWZFhCf;Ilka zEuiWb-0AkjvuH%X7+dUOFZ|em&359=NnVS-`Qlpbz@Hm~pKm7)1QBWBl(tkbNzZbMl)kbg8jq(so zs1}U>$p(qf!4cpQc?oyg(j1R>cI7MwW;rm+fmsgx?{nZEyZv$DALh)TbL;Qt&-wZ1 Fe*^IOAkP2* literal 0 HcmV?d00001 diff --git a/monitor.bmp b/monitor.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0b12889b7a29152f1161963afa1b081c37db0fcf GIT binary patch literal 15666 zcmeI2F;c@Y5JkldO=!3VH8nK!T!SNEcXnq{g)&ssRJ0Tnxs}r?YiY*$hA=p6?%xk5_5$Wc!irOSUU>Ev+%X4}Le&)W*o$)OFZND~D#k-^;!` z;r!b;*B!|wudYj)4;4F`6e`bH$F@j{x3OHqzKhK*(~uC0nB<(x6aQ@+o7J*Djb3-e z+?rQTCQTV#{mFBgG55RN*5a|zEaN>3*H99bLlkxxkWlz%bWw&yYZD50)9d}#6_u~K z8&cZUh0m3J^IcRvt^fM({1E0%15YS}qU3_(dq9bTZ1KU&4fD9OnRLp{85;>#D7uGJMAVq zaaH&?*4JIX{9%OLecc&yvu>O&@Xd1|bzJq+|J4k~%(KL_=eFyo_caR2k zqG=!#`VR8>FTRudaQfJFgZs(E6O3uy1K#>k&a-=ZeV?64C+K}gpE|pTb!&v=t(jc1 VPTE{yovU(%jD4( literal 0 HcmV?d00001 diff --git a/monitor2.bmp b/monitor2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2343420bf926eef6a77ddec97b0d955618fea0f3 GIT binary patch literal 15666 zcmeI2F>iw~5QSZ-OS<%Lbne_P-TQY68*I2!I;Kn^HyC0li zjC0+dtn%r)r1?~Fut}lvjCJgbq_ZYXd1|bzJq+|J4k~%(KL_=eFyo_ zcaR2kqG=!#`VR7;?;s88MAJYf^d00w-$5GGiKc-}=sU=VzJoNV6HNn|(07mzeFte! zCz=K_q3ach<=ouU>w9x1ouKy}{nO?i)~ykew`Ow9 VI%#u-b*{=4k~>?Rs%)uUdj{Koiz@&C literal 0 HcmV?d00001 diff --git a/ogllogo.bmp b/ogllogo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5143ee7ed4add92dfb89c6bef4f95a99619071f9 GIT binary patch literal 786500 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

-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 literal 0 HcmV?d00001 diff --git a/resource.h b/resource.h new file mode 100644 index 0000000..5ed825a --- /dev/null +++ b/resource.h @@ -0,0 +1,100 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by Moebius32.rc +// +#define IDR_MENU1 101 +#define ID_DEFAULT 101 +#define IDI_ICON1 102 +#define ID_NOW 102 +#define IDD_ABOUT 103 +#define ID_NEVER 103 +#define DLG_CONFIG 104 +#define IDB_CAFE 105 +#define IDB_HOURS0 106 +#define IDB_HOURS1 107 +#define IDB_HOURS2 108 +#define IDB_HOURS3 109 +#define IDB_OGLLOGO 110 +#define IDD_GRAPHIC_CONFIG 111 +#define IDD_GENERAL 113 +#define IDB_MONITOR 116 +#define IDB_BCHECK 120 +#define IDB_BDOT 121 +#define IDB_BNONE 122 +#define IDD_BEHAVIOR 123 +#define IDB_MONITOR2 125 +#define IDC_FLASH 1000 +#define IDC_FLAT 1001 +#define IDC_GOURAUD 1002 +#define IDC_BLEND 1003 +#define IDC_ABOUT 1004 +#define IDC_QUICK 1005 +#define IDC_NORMALS 1006 +#define IDC_WIREFRAME 1007 +#define IDC_EDIT1 1008 +#define IDC_SPIN1 1009 +#define IDC_ZBUFFER 1010 +#define IDC_CULL 1011 +#define IDC_MIPMAPS 1012 +#define ID_SAGEOK 1013 +#define ID_SAGEBAD 1014 +#define ID_DISMISSGROUP 1015 +#define IDC_SWING 1016 +#define ID_THRESHOLDDESC 1017 +#define IDC_BACK 1018 +#define ID_THRESHOLD 1019 +#define IDC_USEMOUSE 1020 +#define ID_WAITDESC 1021 +#define ID_WAITTEXT 1022 +#define ID_WAITBUDDY 1023 +#define ID_WAITBOX 1024 +#define ID_WAITMOREDESC 1025 +#define ID_WAITSUMMARY 1026 +#define ID_MONITOR 1027 +#define ID_MUTE 1028 +#define IDC_MONITOR 1029 +#define IDC_UL 1030 +#define IDC_UR 1031 +#define IDC_DR 1032 +#define IDC_DL 1033 +#define IDC_NEAREST 1034 +#define IDC_LINEAR 1035 +#define IDC_WMIPMAPS 1036 +#define IDC_NMIPMAPS 1037 +#define IDC_LMIPMAPS 1038 +#define IDC_COLOR1 1039 +#define IDC_COLOR2 1040 +#define IDC_COLOR3 1041 +#define IDC_COLOR4 1042 +#define IDC_NOGLASS 1043 +#define IDC_NOTEXTURES 1044 +#define IDC_ANTIALIAS 1045 +#define ID_FILE_EXIT 40001 +#define ID_HELP_ABOUT 40002 +#define ID_VIEW_ANTIALIAS 40003 +#define ID_VIEW_BLEND 40004 +#define ID_VIEW_CULL 40005 +#define ID_VIEW_METHOD_NICEST 40006 +#define ID_VIEW_METHOD_FASTEST 40007 +#define ID_VIEW_SHADE_FLAT 40008 +#define ID_VIEW_SHADE_GOURARD 40009 +#define ID_VIEW_LINEAR 40010 +#define ID_VIEW_MIDMAPS 40011 +#define ID_VIEW_PERSP_NICEST 40012 +#define ID_VIEW_PERSP_FASTEST 40013 +#define ID_VIEW_NORMALS 40014 +#define ID_VIEW_QUICK 40015 +#define ID_VIEW_SWING 40016 +#define ID_VIEW_WIREFRAME 40017 +#define ID_VIEW_ZBUFFER 40018 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 126 +#define _APS_NEXT_COMMAND_VALUE 40019 +#define _APS_NEXT_CONTROL_VALUE 1046 +#define _APS_NEXT_SYMED_VALUE 104 +#endif +#endif diff --git a/resource.hm b/resource.hm new file mode 100644 index 0000000..3ce1c74 --- /dev/null +++ b/resource.hm @@ -0,0 +1,39 @@ +// Microsoft Developer Studio generated Help ID include file. +// Used by Moebius32.rc +// +#define HIDC_ABOUT 0x807b03ec // IDD_BEHAVIOR +#define HIDC_ANTIALIAS 0x806f0415 // IDD_GRAPHIC_CONFIG +#define HIDC_BACK 0x807b03fa // IDD_BEHAVIOR +#define HIDC_BLEND 0x806f03eb // IDD_GRAPHIC_CONFIG +#define HIDC_COLOR1 0x807b040f // IDD_BEHAVIOR +#define HIDC_COLOR2 0x807b0410 // IDD_BEHAVIOR +#define HIDC_COLOR3 0x807b0411 // IDD_BEHAVIOR +#define HIDC_COLOR4 0x807b0412 // IDD_BEHAVIOR +#define HIDC_CULL 0x806f03f3 // IDD_GRAPHIC_CONFIG +#define HIDC_DL 0x80710409 // IDD_GENERAL +#define HIDC_DR 0x80710408 // IDD_GENERAL +#define HIDC_EDIT1 0x807b03f0 // IDD_BEHAVIOR +#define HIDC_FLAT 0x806f03e9 // IDD_GRAPHIC_CONFIG +#define HIDC_GOURAUD 0x806f03ea // IDD_GRAPHIC_CONFIG +#define HIDC_LINEAR 0x806f040b // IDD_GRAPHIC_CONFIG +#define HIDC_LMIPMAPS 0x806f040e // IDD_GRAPHIC_CONFIG +#define HIDC_MONITOR 0x807b0405 // IDD_BEHAVIOR +#define HIDC_NEAREST 0x806f040a // IDD_GRAPHIC_CONFIG +#define HIDC_NMIPMAPS 0x806f040d // IDD_GRAPHIC_CONFIG +#define HIDC_NOGLASS 0x806f0413 // IDD_GRAPHIC_CONFIG +#define HIDC_NORMALS 0x806f03ee // IDD_GRAPHIC_CONFIG +#define HIDC_NOTEXTURES 0x806f0414 // IDD_GRAPHIC_CONFIG +#define HIDC_QUICK 0x807b03ed // IDD_BEHAVIOR +#define HIDC_SPIN1 0x807b03f1 // IDD_BEHAVIOR +#define HIDC_SWING 0x807b03f8 // IDD_BEHAVIOR +#define HIDC_UL 0x80710406 // IDD_GENERAL +#define HIDC_UR 0x80710407 // IDD_GENERAL +#define HIDC_USEMOUSE 0x807b03fc // IDD_BEHAVIOR +#define HIDC_WIREFRAME 0x806f03ef // IDD_GRAPHIC_CONFIG +#define HIDC_WMIPMAPS 0x806f040c // IDD_GRAPHIC_CONFIG +#define HIDC_ZBUFFER 0x806f03f2 // IDD_GRAPHIC_CONFIG +#define HID_MUTE 0x80710404 // IDD_GENERAL +#define HID_THRESHOLD 0x807103fb // IDD_GENERAL +#define HID_WAITBOX 0x80710400 // IDD_GENERAL +#define HID_WAITBUDDY 0x807103ff // IDD_GENERAL +#define HID_WAITTEXT 0x807103fe // IDD_GENERAL diff --git a/texture.c b/texture.c new file mode 100644 index 0000000..a7ec776 --- /dev/null +++ b/texture.c @@ -0,0 +1,256 @@ +#include +#include +#include + +void +bwtorgba(unsigned char *b,unsigned char *l,int n) { + while(n--) { + l[0] = *b; + l[1] = *b; + l[2] = *b; + l[3] = 0xff; + l += 4; b++; + } +} + +void +latorgba(unsigned char *b, unsigned char *a,unsigned char *l,int n) { + while(n--) { + l[0] = *b; + l[1] = *b; + l[2] = *b; + l[3] = *a; + l += 4; b++; a++; + } +} + +void +rgbtorgba(unsigned char *r,unsigned char *g,unsigned char *b,unsigned char *l,int n) { + while(n--) { + l[0] = r[0]; + l[1] = g[0]; + l[2] = b[0]; + l[3] = 0xff; + l += 4; r++; g++; b++; + } +} + +void +rgbatorgba(unsigned char *r,unsigned char *g,unsigned char *b,unsigned char *a,unsigned char *l,int n) { + while(n--) { + l[0] = r[0]; + l[1] = g[0]; + l[2] = b[0]; + l[3] = a[0]; + l += 4; r++; g++; b++; a++; + } +} + +typedef struct _ImageRec { + unsigned short imagic; + unsigned short type; + unsigned short dim; + unsigned short xsize, ysize, zsize; + unsigned int min, max; + unsigned int wasteBytes; + char name[80]; + unsigned long colorMap; + FILE *file; + unsigned char *tmp, *tmpR, *tmpG, *tmpB; + unsigned long rleEnd; + unsigned int *rowStart; + int *rowSize; +} ImageRec; + +static void +ConvertShort(unsigned short *array, long length) { + unsigned b1, b2; + unsigned char *ptr; + + ptr = (unsigned char *)array; + while (length--) { + b1 = *ptr++; + b2 = *ptr++; + *array++ = (b1 << 8) | (b2); + } +} + +static void +ConvertLong(unsigned *array, long length) { + unsigned b1, b2, b3, b4; + unsigned char *ptr; + + ptr = (unsigned char *)array; + while (length--) { + b1 = *ptr++; + b2 = *ptr++; + b3 = *ptr++; + b4 = *ptr++; + *array++ = (b1 << 24) | (b2 << 16) | (b3 << 8) | (b4); + } +} + +static ImageRec *ImageOpen(const char *fileName) +{ + union { + int testWord; + char testByte[4]; + } endianTest; + ImageRec *image; + int swapFlag; + int x; + + endianTest.testWord = 1; + if (endianTest.testByte[0] == 1) { + swapFlag = 1; + } else { + swapFlag = 0; + } + + image = (ImageRec *)malloc(sizeof(ImageRec)); + if (image == NULL) { + fprintf(stderr, "Out of memory!\n"); + exit(1); + } + if ((image->file = fopen(fileName, "rb")) == NULL) { + perror(fileName); + exit(1); + } + + fread(image, 1, 12, image->file); + + if (swapFlag) { + ConvertShort(&image->imagic, 6); + } + + image->tmp = (unsigned char *)malloc(image->xsize*256); + image->tmpR = (unsigned char *)malloc(image->xsize*256); + image->tmpG = (unsigned char *)malloc(image->xsize*256); + image->tmpB = (unsigned char *)malloc(image->xsize*256); + if (image->tmp == NULL || image->tmpR == NULL || image->tmpG == NULL || + image->tmpB == NULL) { + fprintf(stderr, "Out of memory!\n"); + exit(1); + } + + if ((image->type & 0xFF00) == 0x0100) { + x = image->ysize * image->zsize * sizeof(unsigned); + image->rowStart = (unsigned *)malloc(x); + image->rowSize = (int *)malloc(x); + if (image->rowStart == NULL || image->rowSize == NULL) { + fprintf(stderr, "Out of memory!\n"); + exit(1); + } + image->rleEnd = 512 + (2 * x); + fseek(image->file, 512, SEEK_SET); + fread(image->rowStart, 1, x, image->file); + fread(image->rowSize, 1, x, image->file); + if (swapFlag) { + ConvertLong(image->rowStart, x/sizeof(unsigned)); + ConvertLong((unsigned *)image->rowSize, x/sizeof(int)); + } + } + return image; +} + +static void +ImageClose(ImageRec *image) { + fclose(image->file); + free(image->tmp); + free(image->tmpR); + free(image->tmpG); + free(image->tmpB); + free(image); +} + +static void +ImageGetRow(ImageRec *image, unsigned char *buf, int y, int z) { + unsigned char *iPtr, *oPtr, pixel; + int count; + + if ((image->type & 0xFF00) == 0x0100) { + fseek(image->file, image->rowStart[y+z*image->ysize], SEEK_SET); + fread(image->tmp, 1, (unsigned int)image->rowSize[y+z*image->ysize], + image->file); + + iPtr = image->tmp; + oPtr = buf; + while (1) { + pixel = *iPtr++; + count = (int)(pixel & 0x7F); + if (!count) { + return; + } + if (pixel & 0x80) { + while (count--) { + *oPtr++ = *iPtr++; + } + } else { + pixel = *iPtr++; + while (count--) { + *oPtr++ = pixel; + } + } + } + } else { + fseek(image->file, 512+(y*image->xsize)+(z*image->xsize*image->ysize), + SEEK_SET); + fread(buf, 1, image->xsize, image->file); + } +} + +unsigned char* +readTexture(char *name, int *width, int *height, int *components) { + unsigned *base, *lptr; + unsigned char *rbuf, *gbuf, *bbuf, *abuf; + ImageRec *image; + int y; + + image = ImageOpen(name); + + if(!image) + return NULL; + (*width)=image->xsize; + (*height)=image->ysize; + (*components)=image->zsize; + base = (unsigned *)malloc(image->xsize*image->ysize*sizeof(unsigned)); + rbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char)); + gbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char)); + bbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char)); + abuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char)); + if(!base || !rbuf || !gbuf || !bbuf) + return NULL; + lptr = base; + for(y=0; yysize; y++) { + if(image->zsize>=4) { + ImageGetRow(image,rbuf,y,0); + ImageGetRow(image,gbuf,y,1); + ImageGetRow(image,bbuf,y,2); + ImageGetRow(image,abuf,y,3); + rgbatorgba(rbuf,gbuf,bbuf,abuf,(unsigned char *)lptr,image->xsize); + lptr += image->xsize; + } else if(image->zsize==3) { + ImageGetRow(image,rbuf,y,0); + ImageGetRow(image,gbuf,y,1); + ImageGetRow(image,bbuf,y,2); + rgbtorgba(rbuf,gbuf,bbuf,(unsigned char *)lptr,image->xsize); + lptr += image->xsize; + } else if(image->zsize==2) { + ImageGetRow(image,rbuf,y,0); + ImageGetRow(image,abuf,y,1); + latorgba(rbuf,abuf,(unsigned char *)lptr,image->xsize); + lptr += image->xsize; + } else { + ImageGetRow(image,rbuf,y,0); + bwtorgba(rbuf,(unsigned char *)lptr,image->xsize); + lptr += image->xsize; + } + } + ImageClose(image); + free(rbuf); + free(gbuf); + free(bbuf); + free(abuf); + + return (unsigned char*) base; +} diff --git a/texture.h b/texture.h new file mode 100644 index 0000000..27e601d --- /dev/null +++ b/texture.h @@ -0,0 +1,24 @@ +/* + * read_texture() - read in an image file in SGI 'libimage' format + * currently its very simple minded and converts all images + * to RGBA8 regardless of the input format and returns the + * original number of components in the appropriate parameter. + * + * + * the components are converted as follows + * L -> LLL 1.0 + * LA -> LLL A + * RGB -> RGB 1.0 + * RGBA -> RGB A + * + */ +#ifdef __cplusplus + extern "C" { +#endif + +unsigned char* +readTexture(const char *name, int *width, int *height, int *components); + +#ifdef __cplusplus + }; +#endif