From 5013bb0f5bc8c691b6e4929cb2c3e858587fb118 Mon Sep 17 00:00:00 2001 From: Justin Miller Date: Tue, 8 Oct 2024 17:19:22 -0700 Subject: [PATCH] Grab glears based on illens screen saver work --- base/applications/CMakeLists.txt | 1 + base/applications/glgears/CMakeLists.txt | 9 + base/applications/glgears/glgears.c | 494 ++++++++++++++++++ .../applications/glgears/res/icon_glgears.ico | Bin 0 -> 17542 bytes base/applications/glgears/resouce.h | 8 + base/applications/glgears/rsrc.rc | 11 + sdk/include/reactos/wine/wglext.h | 5 + 7 files changed, 528 insertions(+) create mode 100644 base/applications/glgears/CMakeLists.txt create mode 100644 base/applications/glgears/glgears.c create mode 100644 base/applications/glgears/res/icon_glgears.ico create mode 100644 base/applications/glgears/resouce.h create mode 100644 base/applications/glgears/rsrc.rc diff --git a/base/applications/CMakeLists.txt b/base/applications/CMakeLists.txt index 696d000cf0e35..1295825046eec 100644 --- a/base/applications/CMakeLists.txt +++ b/base/applications/CMakeLists.txt @@ -13,6 +13,7 @@ add_subdirectory(extrac32) add_subdirectory(findstr) add_subdirectory(fltmc) add_subdirectory(fontview) +add_subdirectory(glgears) add_subdirectory(games) add_subdirectory(hh) add_subdirectory(iexplore) diff --git a/base/applications/glgears/CMakeLists.txt b/base/applications/glgears/CMakeLists.txt new file mode 100644 index 0000000000000..c0a75e1d80d80 --- /dev/null +++ b/base/applications/glgears/CMakeLists.txt @@ -0,0 +1,9 @@ + +list(APPEND SOURCE + glgears.c) + +add_rc_deps(rsrc.rc ${CMAKE_CURRENT_SOURCE_DIR}/res/icon_glgears.ico) +add_executable(glgears ${SOURCE} rsrc.rc) +set_module_type(glgears win32gui UNICODE) +add_importlibs(glgears user32 gdi32 opengl32 glu32 winmm advapi32 msvcrt kernel32 ntdll) +add_cd_file(TARGET glgears DESTINATION reactos/system32 FOR all) \ No newline at end of file diff --git a/base/applications/glgears/glgears.c b/base/applications/glgears/glgears.c new file mode 100644 index 0000000000000..6c189d592fc57 --- /dev/null +++ b/base/applications/glgears/glgears.c @@ -0,0 +1,494 @@ +/* + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/* $XFree86: xc/programs/glxgears/glxgears.c,v 1.3tsi Exp $ */ + +/* + * This is a port of the infamous "gears" demo to straight GLX (i.e. no GLUT) + * Port by Brian Paul 23 March 2001 + * + * Command line options: + * -info print GL implementation information + * + */ + +/* Modified from X11/GLX to Win32/WGL by Ben Skeggs + * 25th October 2004 + */ + +#include +#include +#include + + + +#include +#include +#include +#include +#include +#include + +/* XXX this probably isn't very portable */ +#include +#include +#include +#ifndef M_PI +#define M_PI 3.14159265 +#endif /* !M_PI */ + +/* Turn a NULL pointer string into an empty string */ +#define NULLSTR(x) (((x)!=NULL)?(x):("")) +#define Log(x) { if(verbose) printf x; } + +#define Bool int +#define False 0 +#define True 1 + +#if 0 +/* wgl extensions */ +PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = 0; +#endif + +/* Global vars */ +static HDC hDC; +static HGLRC hRC; +static HWND hWnd; +static HINSTANCE hInst; +static RECT winrect; + +static const char *ProgramName; /* program name (from argv[0]) */ +static Bool verbose = False; /* verbose output what the program is doing */ + +static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0; +static GLint gear1, gear2, gear3; +static GLfloat angle = 0.0; + +static +void usage(void) +{ + fprintf (stderr, "usage: %s [options]\n", ProgramName); + fprintf (stderr, "-info\tPrint additional GL information.\n"); + fprintf (stderr, "-h\tPrint this help page.\n"); + fprintf (stderr, "-v\tVerbose output.\n"); + fprintf (stderr, "\n"); + exit(EXIT_FAILURE); +} + + +/* return current time (in seconds) */ +static int current_time(void) { + return (int)time(NULL); +} + +/* + * + * Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * Input: inner_radius - radius of hole at center + * outer_radius - radius at center of teeth + * width - width of gear + * teeth - number of teeth + * tooth_depth - depth of tooth + */ +static void +gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, + GLint teeth, GLfloat tooth_depth) +{ + GLint i; + GLfloat r0, r1, r2; + GLfloat angle, da; + GLfloat u, v, len; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0; + r2 = outer_radius + tooth_depth / 2.0; + + da = 2.0 * M_PI / teeth / 4.0; + + glShadeModel(GL_FLAT); + + glNormal3f(0.0, 0.0, 1.0); + + /* draw front face */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0 * M_PI / teeth; + glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); + glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); + if (i < teeth) { + glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), + width * 0.5); + } + } + glEnd(); + + /* draw front sides of teeth */ + glBegin(GL_QUADS); + da = 2.0 * M_PI / teeth / 4.0; + for (i = 0; i < teeth; i++) { + angle = i * 2.0 * M_PI / teeth; + + glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); + glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); + glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), + width * 0.5); + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), + width * 0.5); + } + glEnd(); + + glNormal3f(0.0, 0.0, -1.0); + + /* draw back face */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0 * M_PI / teeth; + glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); + glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); + if (i < teeth) { + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), + -width * 0.5); + glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); + } + } + glEnd(); + + /* draw back sides of teeth */ + glBegin(GL_QUADS); + da = 2.0 * M_PI / teeth / 4.0; + for (i = 0; i < teeth; i++) { + angle = i * 2.0 * M_PI / teeth; + + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), + -width * 0.5); + glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), + -width * 0.5); + glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); + glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); + } + glEnd(); + + /* draw outward faces of teeth */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i < teeth; i++) { + angle = i * 2.0 * M_PI / teeth; + + glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); + glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); + u = r2 * cos(angle + da) - r1 * cos(angle); + v = r2 * sin(angle + da) - r1 * sin(angle); + len = sqrt(u * u + v * v); + u /= len; + v /= len; + glNormal3f(v, -u, 0.0); + glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); + glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); + glNormal3f(cos(angle), sin(angle), 0.0); + glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), + width * 0.5); + glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), + -width * 0.5); + u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da); + v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da); + glNormal3f(v, -u, 0.0); + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), + width * 0.5); + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), + -width * 0.5); + glNormal3f(cos(angle), sin(angle), 0.0); + } + + glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5); + glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5); + + glEnd(); + + glShadeModel(GL_SMOOTH); + + /* draw inside radius cylinder */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0 * M_PI / teeth; + glNormal3f(-cos(angle), -sin(angle), 0.0); + glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); + glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); + } + glEnd(); +} + + +static void +draw(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + glRotatef(view_rotx, 1.0, 0.0, 0.0); + glRotatef(view_roty, 0.0, 1.0, 0.0); + glRotatef(view_rotz, 0.0, 0.0, 1.0); + + glPushMatrix(); + glTranslatef(-3.0, -2.0, 0.0); + glRotatef(angle, 0.0, 0.0, 1.0); + glCallList(gear1); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(3.1, -2.0, 0.0); + glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0); + glCallList(gear2); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(-3.1, 4.2, 0.0); + glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0); + glCallList(gear3); + glPopMatrix(); + + glPopMatrix(); +} + + +/* new window size or exposure */ +static void +reshape(int width, int height) +{ + GLfloat h = (GLfloat) height / (GLfloat) width; + + glViewport(0, 0, (GLint) width, (GLint) height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0, 0.0, -40.0); +} + + +static void +init(void) +{ + static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 }; + static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; + static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; + static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; + + glLightfv(GL_LIGHT0, GL_POSITION, pos); + glEnable(GL_CULL_FACE); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_DEPTH_TEST); + + /* make the gears */ + gear1 = glGenLists(1); + glNewList(gear1, GL_COMPILE); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); + gear(1.0, 4.0, 1.0, 20, 0.7); + glEndList(); + + gear2 = glGenLists(1); + glNewList(gear2, GL_COMPILE); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); + gear(0.5, 2.0, 2.0, 10, 0.7); + glEndList(); + + gear3 = glGenLists(1); + glNewList(gear3, GL_COMPILE); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); + gear(1.3, 2.0, 0.5, 10, 0.7); + glEndList(); + + glEnable(GL_NORMALIZE); +} + +LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + switch (uMsg) { + case WM_CLOSE: + PostQuitMessage(0); + return 0; + case WM_SIZE: + reshape(LOWORD(lParam), HIWORD(lParam)); + return 0; + case WM_KEYDOWN: + if (wParam == VK_LEFT) + view_roty += 5.0; + else if (wParam == VK_RIGHT) + view_roty -= 5.0; + else if (wParam == VK_UP) + view_rotx += 5.0; + else if (wParam == VK_DOWN) + view_rotx -= 5.0; + else if (wParam == VK_ESCAPE) + PostQuitMessage(0); + return 0; + } + + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} + +/* + * Create an RGB, double-buffered window. + * Return the window and context handles. + */ +static void make_window(LPCWSTR name, int x, int y, int width, int height) { + GLuint PixelFormat; + WNDCLASS wc; + DWORD dwExStyle, dwStyle; + static PIXELFORMATDESCRIPTOR pfd = { + sizeof(PIXELFORMATDESCRIPTOR), + 1, + PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, + PFD_TYPE_RGBA, + 24, + 0, 0, 0, 0, 0, 0, + 0, + 0, + 0, + 0, 0, 0, 0, + 16, + 0, + 0, + PFD_MAIN_PLANE, + 0, + 0, 0, 0 + }; + + winrect.left = (long)0; + winrect.right = (long)width; + winrect.top = (long) 0; + winrect.bottom = (long)height; + + hInst = GetModuleHandle(NULL); + wc.style = CS_OWNDC; + wc.lpfnWndProc = (WNDPROC)WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInst; + wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = NULL; + wc.lpszMenuName = NULL; + wc.lpszClassName = name; + if (!RegisterClass(&wc)) { + printf("failed to register class\n"); + exit(0); + } + + dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; + dwStyle = WS_OVERLAPPEDWINDOW; + AdjustWindowRectEx(&winrect, dwStyle, False, dwExStyle); + + if (!(hWnd = CreateWindowEx(dwExStyle, name, name, + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | dwStyle, 0, 0, + winrect.right - winrect.left, winrect.bottom - winrect.top, + NULL, NULL, hInst, NULL))) { + printf("failed to create window\n"); + exit(0); + } + + if (!(hDC = GetDC(hWnd)) || + !(PixelFormat = ChoosePixelFormat(hDC, &pfd)) || + !(SetPixelFormat(hDC, PixelFormat, &pfd)) || + !(hRC = wglCreateContext(hDC)) || + !(wglMakeCurrent(hDC, hRC))) { + printf("failed to initialise opengl\n"); + exit(0); + } + + ShowWindow(hWnd, SW_SHOW); + SetForegroundWindow(hWnd); + SetFocus(hWnd); +} + + +static void event_loop() { + MSG msg; + int t, t0 = current_time(); + int frames = 0; + + while(1) { + if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + if (msg.message == WM_QUIT) break;; + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + angle += 2.0; + draw(); + SwapBuffers(hDC); + + /* calc framerate */ + t = current_time(); + frames++; + if (t - t0 >= 5.0) { + WCHAR buff[32]; + GLfloat s = t - t0; + GLfloat fps = frames / s; + + wsprintfW(buff, L"FPS: %u", (int)fps); + SetWindowTextW(hWnd, buff); + t0 = t; + frames = 0; + } + } +} + +int +WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) +{ + Bool printInfo = False; + + printInfo = GL_TRUE; + + + make_window(L"glxgears", 0, 0, 300, 300); + reshape(300, 300); + +/* force vsync off */ +#if 0 + wglSwapIntervalEXT = wglGetProcAddress("wglSwapIntervalEXT"); + if (!wglSwapIntervalEXT) { + printf("warning: wglSwapIntervalEXT missing, cannot force vsync off\n"); + } else if (!wglSwapIntervalEXT(0)) { + printf("warning: failed to force vsync off, it may still be on\n"); + } +#endif + + if (printInfo) { + DPRINT1("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + DPRINT1("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); + DPRINT1("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); + DPRINT1("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS)); + } + + init(); + + event_loop(); + +/* cleanup */ + wglMakeCurrent (NULL, NULL); + wglDeleteContext (hRC); + ReleaseDC (hWnd, hDC); + + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/base/applications/glgears/res/icon_glgears.ico b/base/applications/glgears/res/icon_glgears.ico new file mode 100644 index 0000000000000000000000000000000000000000..f41fe6ee39ecbf0cbc6767a46a24d91462109ce0 GIT binary patch literal 17542 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 +#include +#include +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_ICON ICON DISCARDABLE "res/icon_glgears.ico" +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "OpenGL Gears ScreenSaver" +#define REACTOS_STR_INTERNAL_NAME "glgears" +#define REACTOS_STR_ORIGINAL_FILENAME "glgears.exe" +#include +#include \ No newline at end of file diff --git a/sdk/include/reactos/wine/wglext.h b/sdk/include/reactos/wine/wglext.h index 76c42c19f8c47..c8987a221ebf5 100644 --- a/sdk/include/reactos/wine/wglext.h +++ b/sdk/include/reactos/wine/wglext.h @@ -431,6 +431,7 @@ extern "C" { /*************************************************************/ +#ifndef __WINE_WGL_H #ifndef WGL_ARB_pbuffer DECLARE_HANDLE(HPBUFFERARB); #endif @@ -446,6 +447,7 @@ DECLARE_HANDLE(HPVIDEODEV); #ifndef WGL_NV_gpu_affinity DECLARE_HANDLE(HPGPUNV); DECLARE_HANDLE(HGPUNV); +#endif typedef struct _GPU_DEVICE { DWORD cb; @@ -455,9 +457,12 @@ typedef struct _GPU_DEVICE { RECT rcVirtualScreen; } GPU_DEVICE, *PGPU_DEVICE; #endif + +#ifndef __WINE_WGL_H #ifndef WGL_NV_video_capture DECLARE_HANDLE(HVIDEOINPUTDEVICENV); #endif +#endif #ifndef WGL_ARB_buffer_region #define WGL_ARB_buffer_region 1