Author: fireball
Date: Mon Jun 19 21:19:04 2006
New Revision: 22424
URL:
http://svn.reactos.ru/svn/reactos?rev=22424&view=rev
Log:
Simple OpenGL screensaver by Andrey Korotaev. This is a good app to test opengl
regressions.
Added:
trunk/reactos/base/applications/screensavers/cylfrac/
trunk/reactos/base/applications/screensavers/cylfrac/cylfrac.c (with props)
trunk/reactos/base/applications/screensavers/cylfrac/cylfrac.rbuild (with props)
Modified:
trunk/reactos/base/applications/screensavers/screensavers.rbuild
Added: trunk/reactos/base/applications/screensavers/cylfrac/cylfrac.c
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/base/applications/screensav…
==============================================================================
--- trunk/reactos/base/applications/screensavers/cylfrac/cylfrac.c (added)
+++ trunk/reactos/base/applications/screensavers/cylfrac/cylfrac.c Mon Jun 19 21:19:04
2006
@@ -1,0 +1,298 @@
+/*
+ * Copyright 2003 J Brown
+ * Copyright 2006 Andrey Korotaev <unC0Rr(a)inbox.ru>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <windows.h>
+#include <gl.h>
+#include <glu.h>
+#include <tchar.h>
+
+#define APPNAME _T("Cylfrac")
+#define wfactor 0.9
+#define rotfactor 1.5
+#define FPS 100
+#define timerdelay 1000/FPS
+
+POINT initpoint;
+HDC dc;
+HGLRC hrc;
+DWORD oldticks;
+MMRESULT TimerID;
+
+DWORD lvls = 7;
+int cylquality = 8;
+
+HINSTANCE hInstance;
+
+GLUquadricObj * cylinder;
+
+float angle = 0;
+float colorh = 0.0;
+float rval, gval, bval;
+
+BOOL fullscreen = FALSE;
+
+float _RGB(float H, float M1, float M2)
+{
+ if(H < 0.0) H += 360.0;
+ else if(H > 360.0) H -= 360.0;
+ if(H < 60) return M1 + (M2 - M1) * H / 60.0;
+ if((H >= 60 )&&(H < 180)) return M2;
+ if((H >= 180)&&(H < 240)) return M1 + (M2 - M1)*(240 - H) / 60.0;
+ return M1;
+}
+
+void HLStoRGB(float H, float L, float S,
+ float* R, float* G, float* B)
+{
+ float M1, M2;
+ if(S <= 0.5) M2 = S * (1 + L);
+ else M2 = S * (1 - L) + L;
+ M1 = 2 * S - M2;
+ if (L == 0.0)
+ {
+ *R = S;
+ *G = S;
+ *B = S;
+ } else {
+ *R = _RGB(H + 120.0, M1, M2);
+ *G = _RGB(H , M1, M2);
+ *B = _RGB(H - 120.0, M1, M2);
+ }
+}
+
+void DrawCylinder(int n, float rota, float width)
+{
+ glPushMatrix();
+ glColor3f(rval/n, gval/n, bval/n);
+ glRotatef(rota, 0.0, 1.0, 0.0);
+ gluCylinder(cylinder, width, width * wfactor, n * 0.5, cylquality, 1);
+ glTranslatef(0.0, 0.0, -n * 0.5);
+ gluCylinder(cylinder, width * wfactor, width, n * 0.5, cylquality, 1);
+ if(n > 1)
+ {
+ float r = rota * rotfactor;
+ glRotatef(90.0, 1.0, 0.0, 0.0);
+ DrawCylinder(n - 1, r, width * wfactor);
+ glTranslatef(0.0, n, 0.0);
+ DrawCylinder(n - 1, -r, width * wfactor);
+ }
+ glPopMatrix();
+}
+
+void DrawScene(HWND hwnd, HDC dc, int ticks)
+{
+ PAINTSTRUCT ps;
+ dc = BeginPaint(hwnd, &ps);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glRotatef(ticks * 0.01, 0.0, 1.0, -0.5);
+ angle += ticks * 0.01;
+ colorh += ticks * 0.003;
+ if (colorh > 360.0) colorh -= 360.0;
+ HLStoRGB(colorh, 1.0, 0.7, &rval, &gval, &bval);
+ DrawCylinder(lvls, angle, 0.2);
+ SwapBuffers(dc);
+ EndPaint(hwnd, &ps);
+}
+
+void CALLBACK TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
+{
+ InvalidateRect((HWND)dwUser, NULL, 0);
+}
+
+void MyPixelFormat(HDC dc)
+{
+ int npf;
+ PIXELFORMATDESCRIPTOR pfd;
+
+ ZeroMemory(&pfd, sizeof(pfd));
+ pfd.nSize = sizeof(pfd);
+ pfd.nVersion = 1;
+ pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
+
+ npf = ChoosePixelFormat(dc, &pfd);
+ if(npf != 0)
+ SetPixelFormat(dc, npf, &pfd);
+}
+
+void InitGL(HWND hwnd)
+{
+ GLfloat lightpos[4] = {2.0, 2.0, -2.0, 0.7};
+ GLfloat ca = 1.0;
+ dc = GetDC(hwnd);
+ MyPixelFormat(dc);
+ hrc = wglCreateContext(dc);
+ wglMakeCurrent(dc, hrc);
+ cylinder = gluNewQuadric();
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHT0);
+ glLightfv(GL_LIGHT0, GL_POSITION, (GLfloat *)&lightpos);
+ glLightfv(GL_LIGHT0, GL_LINEAR_ATTENUATION, &ca);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_COLOR_MATERIAL);
+}
+
+LRESULT WINAPI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg) {
+ case WM_CREATE:
+ GetCursorPos(&initpoint);
+ InitGL(hwnd);
+ oldticks = GetTickCount();
+ TimerID = timeSetEvent (timerdelay, 0, TimeProc, (DWORD)hwnd, TIME_PERIODIC);
+ break;
+ case WM_PAINT:
+ {
+ DWORD ticks = oldticks;
+ oldticks = GetTickCount();
+ DrawScene(hwnd, dc, oldticks - ticks);
+ POINT currpoint;
+ if(fullscreen)
+ {
+ GetCursorPos(&currpoint);
+ if(abs(currpoint.x - initpoint.x) + (abs(currpoint.y - initpoint.y)) > 10)
+ PostMessage(hwnd, WM_CLOSE, 0, 0);
+ }
+ break;
+ }
+ case WM_DESTROY:
+ timeKillEvent(TimerID);
+ gluDeleteQuadric(cylinder);
+ wglMakeCurrent(0, 0);
+ wglDeleteContext(hrc);
+ ReleaseDC(hwnd, dc);
+ DeleteDC(dc);
+ PostQuitMessage(0);
+ break;
+ case WM_NOTIFY:
+ case WM_SYSKEYDOWN:
+ PostMessage(hwnd, WM_CLOSE, 0, 0);
+ break;
+ case WM_SIZE:
+ {
+ int width = LOWORD(lParam);
+ int height = HIWORD(lParam);
+ glViewport(0, 0, width, height);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ float fscale = 0.8/(float)lvls;
+ glScalef(fscale, fscale, fscale);
+ break;
+ }
+
+ }
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+}
+
+void InitSaver(HWND hwndParent)
+{
+ WNDCLASS wc;
+ ZeroMemory(&wc, sizeof(wc));
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = WndProc;
+ wc.lpszClassName = APPNAME;
+ RegisterClass(&wc);
+
+ if (hwndParent != 0)
+ {
+ RECT rect;
+ GetClientRect(hwndParent, &rect);
+ CreateWindow(APPNAME, APPNAME,
+ WS_VISIBLE | WS_CHILD,
+ 0, 0,
+ rect.right,
+ rect.bottom,
+ hwndParent, 0,
+ hInstance, NULL);
+ fullscreen = FALSE;
+ } else {
+ HWND hwnd;
+ hwnd = CreateWindow(APPNAME, APPNAME,
+ WS_VISIBLE | WS_POPUP | WS_EX_TOPMOST,
+ 0, 0,
+ GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
+ HWND_DESKTOP, 0,
+ hInstance, NULL);
+ ShowWindow(hwnd, SW_SHOWMAXIMIZED);
+ ShowCursor(FALSE);
+ fullscreen = TRUE;
+ }
+}
+
+void ParseCommandLine(PSTR szCmdLine, int *chOption, HWND *hwndParent)
+{
+ int ch = *szCmdLine++;
+
+ if(ch == '-' || ch == '/')
+ ch = *szCmdLine++;
+
+ if(ch >= 'A' && ch <= 'Z')
+ ch += 'a' - 'A';
+
+ *chOption = ch;
+ ch = *szCmdLine++;
+
+ if(ch == ':')
+ ch = *szCmdLine++;
+
+ while(ch == ' ' || ch == '\t')
+ ch = *szCmdLine++;
+
+ if(isdigit(ch))
+ {
+ unsigned int i = atoi(szCmdLine - 1);
+ *hwndParent = (HWND)i;
+ }
+ else
+ *hwndParent = 0;
+}
+
+int WINAPI WinMain (HINSTANCE hInst,
+ HINSTANCE hPrev,
+ LPSTR lpCmdLine,
+ int iCmdShow)
+{
+ HWND hwndParent;
+ int chOption;
+
+ hInstance = hInst;
+
+ ParseCommandLine(lpCmdLine, &chOption, &hwndParent);
+
+ switch(chOption)
+ {
+ case 's': InitSaver(0); break;
+ case 'p': InitSaver(hwndParent); break;
+ case 'c':
+ MessageBox(0,
+ _T("Cylinders fractal by unC0Rr.\nSpecial for ReactOS.\n"),
+ _T("About"),
+ MB_OK | MB_ICONINFORMATION);
+ return 0;
+ default: InitSaver(0);
+ }
+
+ MSG Message;
+
+ while (GetMessage(&Message, 0, 0, 0))
+ DispatchMessage(&Message);
+
+ return Message.wParam;
+}
+
+
Propchange: trunk/reactos/base/applications/screensavers/cylfrac/cylfrac.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/base/applications/screensavers/cylfrac/cylfrac.rbuild
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/base/applications/screensav…
==============================================================================
--- trunk/reactos/base/applications/screensavers/cylfrac/cylfrac.rbuild (added)
+++ trunk/reactos/base/applications/screensavers/cylfrac/cylfrac.rbuild Mon Jun 19
21:19:04 2006
@@ -1,0 +1,15 @@
+<module name="cylfrac" type="win32scr"
installbase="system32" installname="cylfrac.scr">
+ <define name="__USE_W32API" />
+ <define name="__REACTOS__" />
+ <define name="UNICODE" />
+ <define name="_UNICODE" />
+
+ <library>kernel32</library>
+ <library>user32</library>
+ <library>gdi32</library>
+ <library>opengl32</library>
+ <library>glu32</library>
+ <library>winmm</library>
+
+ <file>cylfrac.c</file>
+</module>
Propchange: trunk/reactos/base/applications/screensavers/cylfrac/cylfrac.rbuild
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/base/applications/screensavers/screensavers.rbuild
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/base/applications/screensav…
==============================================================================
--- trunk/reactos/base/applications/screensavers/screensavers.rbuild (original)
+++ trunk/reactos/base/applications/screensavers/screensavers.rbuild Mon Jun 19 21:19:04
2006
@@ -4,5 +4,7 @@
<directory name="matrix">
<xi:include href="matrix/matrix.rbuild" />
</directory>
-
+<directory name="cylfrac">
+ <xi:include href="cylfrac/cylfrac.rbuild" />
+</directory>
</group>