/* Animation system initialization function. * ARGUMENTS: * - window: * HWND hWnd; * RETURNS: None. */ VOID DS1_AnimInit( HWND hWnd ) { INT i; PIXELFORMATDESCRIPTOR pfd = {0}; LARGE_INTEGER t; memset(&DS1_Anim, 0, sizeof(ds1ANIM)); /* Store window and create memory device context */ DS1_Anim.hWnd = hWnd; DS1_Anim.hDC = GetDC(hWnd); DS1_Anim.NumOfUnits = 0; /* OpenGL init: pixel format setup */ pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL; pfd.cColorBits = 32; pfd.cDepthBits = 32; i = ChoosePixelFormat(DS1_Anim.hDC, &pfd); DescribePixelFormat(DS1_Anim.hDC, i, sizeof(pfd), &pfd); SetPixelFormat(DS1_Anim.hDC, i, &pfd); /* OpenGL init: setup rendering context */ DS1_Anim.hGLRC = wglCreateContext(DS1_Anim.hDC); wglMakeCurrent(DS1_Anim.hDC, DS1_Anim.hGLRC); /* OpenGL init: setup extensions: GLEW library */ if (glewInit() != GLEW_OK || !(GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader)) { wglMakeCurrent(NULL, NULL); wglDeleteContext(DS1_Anim.hGLRC); ReleaseDC(DS1_Anim.hWnd, DS1_Anim.hDC); exit(0); } /* Timer initialization */ QueryPerformanceFrequency(&t); DS1_TimePerSec = t.QuadPart; QueryPerformanceCounter(&t); DS1_StartTime = DS1_OldTime = DS1_OldTimeFPS = t.QuadPart; DS1_PauseTime = 0; DS1_RndMatrWorld = MatrixIdentity(); DS1_RndMatrProj = MatrFrustum(-1, 1, -1, 1, 1, 100); DS1_RndMatrView = MatrView(VecSet(0, 0, 3), VecSet(0, 0, 0), VecSet(0, 1, 0)); /* OpenGL specific initialization */ glClearColor((FLT)100 / 255, (FLT)200 / 255, (FLT)150 / 255, 1); /* RGB(100, 200, 150) glClearColor(0.3, 0.5, 0.7, 1); */ DS1_Anim.ShNo = 1; glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); DS1_RndPrg = DS1_RndShaderLoad( (DS1_Anim.ShNo == 1) ? DS1_SHADER_NAME_1 : DS1_SHADER_NAME_2); /* glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); */ } /* End of 'DS1_ANIMInit' function */
/* Функция обработки изменения размера области вывода. * АРГУМЕНТЫ: * - новый размер области вывода: * INT W, H; * ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. */ VOID VG4_AnimResize( INT W, INT H ) { HDC hDC = GetDC(VG4_Anim.hWnd); /* Перевыделение памяти у буфера кадра */ DeleteObject(VG4_Anim.hBmFrame); VG4_Anim.hBmFrame = CreateCompatibleBitmap(hDC, W, H); SelectObject(VG4_Anim.hDC, VG4_Anim.hBmFrame); /* Сохранение размера */ VG4_Anim.W = W; VG4_Anim.H = H; ReleaseDC(VG4_Anim.hWnd, hDC); /* корректировка параметров проецирования */ if (W > H) VG4_RndWp = (DBL)W / H * 3, VG4_RndHp = 3; else VG4_RndHp = (DBL)H / W * 3, VG4_RndWp = 3; VG4_RndMatrProj = MatrFrustum(-VG4_RndWp / 2, VG4_RndWp / 2, -VG4_RndHp / 2, VG4_RndHp / 2, VG4_RndProjDist, 800); } /* End of 'VG4_AnimResize' function */
VOID IK3_AnimUnit( HWND hWnd ) { INT i; LARGE_INTEGER t; PIXELFORMATDESCRIPTOR pfd = {0}; memset(&IK3_Anim, 0, sizeof(ik3Anim)); /* Store window and create memory device context */ IK3_Anim.hWnd = hWnd; IK3_Anim.hDC = GetDC(hWnd); /* OpenGL init: pixel format setup */ pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL; pfd.cColorBits = 32; pfd.cDepthBits = 32; i = ChoosePixelFormat(IK3_Anim.hDC, &pfd); DescribePixelFormat(IK3_Anim.hDC, i, sizeof(pfd), &pfd); SetPixelFormat(IK3_Anim.hDC, i, &pfd); /* OpenGL init: setup rendering context */ IK3_Anim.hGLRC = wglCreateContext(IK3_Anim.hDC); wglMakeCurrent(IK3_Anim.hDC, IK3_Anim.hGLRC); /* OpenGL init: setup extensions: GLEW library */ if (glewInit() != GLEW_OK || !(GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader)) { wglMakeCurrent(NULL, NULL); wglDeleteContext(IK3_Anim.hGLRC); ReleaseDC(IK3_Anim.hWnd, IK3_Anim.hDC); exit(0); } QueryPerformanceFrequency(&t); IK3_TimePerSec = t.QuadPart; QueryPerformanceCounter(&t); IK3_StartTime = IK3_OldTime = IK3_OldTimeFPS = t.QuadPart; IK3_PauseTime = 0; IK3_RndMatrWorld = MatrIdentity(); IK3_RndMatrView = MatrView(VecSet(0, 1, 0), VecSet(0, 0, 0), VecSet(0, 1, 0)); IK3_RndMatrProj = MatrFrustum(-1, 1, -1, 1, 1, 100); IK3_RndProjDist = 3; IK3_RndFarClip = 3000; IK3_RndProjSize = 3; /* OpenGL specific initialization */ glClearColor(0.3, 0.5, 0.7, 1); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); IK3_RndPrg = IK3_RndShaderLoad("a"); /* glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); */ }
VOID AL5_AnimInit( HWND hWnd ) { INT i; PIXELFORMATDESCRIPTOR pfd = {0}; LARGE_INTEGER t; AL5_Anim.NumOfUnits = 0; memset(&AL5_Anim, 0, sizeof(al5ANIM)); AL5_Anim.hWnd = hWnd; AL5_Anim.hDC = GetDC(hWnd); /*** openGl ***/ pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL; pfd.cColorBits = 32; pfd.cDepthBits = 32; i = ChoosePixelFormat(AL5_Anim.hDC, &pfd); DescribePixelFormat(AL5_Anim.hDC, i, sizeof(pfd), &pfd); SetPixelFormat(AL5_Anim.hDC, i, &pfd); /* OpenGL init: setup rendering context */ AL5_Anim.hGLRC = wglCreateContext(AL5_Anim.hDC); wglMakeCurrent(AL5_Anim.hDC, AL5_Anim.hGLRC); /* OpenGL init: setup extensions: GLEW library */ if (glewInit() != GLEW_OK || !(GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader)) { wglMakeCurrent(NULL, NULL); wglDeleteContext(AL5_Anim.hGLRC); ReleaseDC(AL5_Anim.hWnd, AL5_Anim.hDC); exit(0); } /*** init timer ***/ QueryPerformanceFrequency(&t); AL5_TimePerSec = t.QuadPart; QueryPerformanceCounter(&t); AL5_StartTime = AL5_OldTime = AL5_OldTimeFPS = t.QuadPart; AL5_PauseTime = 0; AL5_RndMatrProj = MatrFrustum(-1, 1, -1, 1, 1, 100); AL5_RndMatrWorld = MatrIdentity(); AL5_RndMatrView = MatrMulMatr(MatrIdentity(), MatrTranslate(VecSet(-1, -1, 0))); /* OpenGL specific initialization */ glClearColor(0.3, 0.5, 0.7, 1); glEnable(GL_DEPTH_TEST ); /* glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); */ AL5_RndPrg = AL5_RndShaderLoad("a"); }
/* Setup projection function. * ARGUMENTS: None. * RETURNS: None. */ VOID VG4_RndSetProj( VOID ) { DBL ratio_x = 1, ratio_y = 1; if (VG4_Anim.W >= VG4_Anim.H) ratio_x = (DBL)VG4_Anim.W / VG4_Anim.H; else ratio_y = (DBL)VG4_Anim.H / VG4_Anim.W; VG4_RndMatrProj = MatrFrustum(-ratio_x * VG4_RndProjSize / 2, ratio_x * VG4_RndProjSize / 2, -ratio_y * VG4_RndProjSize / 2, ratio_y * VG4_RndProjSize / 2, VG4_RndProjDist, VG4_RndFarClip); } /* End of 'VG4_RndSetProj' function */
/* Setup projection function. * ARGUMENTS: None. * RETURNS: None. */ VOID MM3_RndSetProj( VOID ) { DBL ratio_x = 1, ratio_y = 1; if (MM3_Anim.W >= MM3_Anim.H) ratio_x = (DBL)MM3_Anim.W / MM3_Anim.H; else ratio_y = (DBL)MM3_Anim.H / MM3_Anim.W; MM3_RndMatrProj = MatrFrustum(-ratio_x * MM3_RndProjSize / 2, ratio_x * MM3_RndProjSize / 2, -ratio_y * MM3_RndProjSize / 2, ratio_y * MM3_RndProjSize / 2, MM3_RndProjDist, MM3_RndFarClip); } /* End of 'VG4_RndSetProj' function */
/* Функция обработки изменения размера области вывода. * АРГУМЕНТЫ: * - новый размер области вывода: * INT W, H; * ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. */ VOID PD6_AnimResize( INT W, INT H ) { HDC hDC = GetDC(PD6_Anim.hWnd); /* Перевыделение памяти у буфера кадра */ DeleteObject(PD6_Anim.hBmFrame); PD6_Anim.hBmFrame = CreateCompatibleBitmap(hDC, W, H); SelectObject(PD6_Anim.hDC, PD6_Anim.hBmFrame); /* Сохранение размера */ PD6_Anim.W = W; PD6_Anim.H = H; ReleaseDC(PD6_Anim.hWnd, hDC); if (W > H) PD6_RndWp = (DBL)W / H * 3, PD6_RndHp = 3; else PD6_RndHp = (DBL)H / W * 3, PD6_RndWp = 3; PD6_RndMatrProj = MatrFrustum(-PD6_RndWp / 2, PD6_RndWp / 2, -PD6_RndHp / 2, PD6_RndHp / 2, PD6_RndProjDist, 800); } /* End of 'PD6_AnimResize' function */
/* Animation system functions */ BOOL BG3_AnimInit( HWND hWnd ) { PIXELFORMATDESCRIPTOR pfd = {0}; LARGE_INTEGER timeFreq; LARGE_INTEGER time; POINT cursorPoint; INT i; HDC winDC; // Create context BG3_ANIM.hWnd = hWnd; winDC = GetDC(hWnd); BG3_ANIM.hDC = winDC; /* Ñîçäàíèå ñöåíû */ /* OPEN GL */ /*** èíèöèàëèçàöèÿ OpenGL ***/ pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_SUPPORT_GDI | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cDepthBits = 24; pfd.cStencilBits = 0; i = ChoosePixelFormat(BG3_ANIM.hDC, &pfd); DescribePixelFormat(BG3_ANIM.hDC, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd); SetPixelFormat(BG3_ANIM.hDC, i, &pfd); BG3_ANIM.hGLRC = wglCreateContext(BG3_ANIM.hDC); wglMakeCurrent(BG3_ANIM.hDC, BG3_ANIM.hGLRC); ReleaseDC(BG3_ANIM.hWnd, BG3_ANIM.hDC); /* óñòàíîâêà áàçîâûõ ïàðàìåòðîâ OpenGL */ if (glewInit() != GLEW_OK) { ReleaseDC(BG3_ANIM.hWnd, BG3_ANIM.hDC); wglMakeCurrent(NULL, NULL); wglDeleteContext(BG3_ANIM.hGLRC); memset(&BG3_ANIM, 0, sizeof(BG3_ANIM)); return FALSE; } glClearColor(0.3, 0.5, 0.7, 1); BG3_SceneCreate(&BG3_ANIM); /* Get input state */ memset(&BG3_ANIM.keyState, 0, sizeof(BG3_ANIM.keyState)); memset(&BG3_ANIM.mouse, 0, sizeof(BG3_ANIM.mouse)); memset(&BG3_ANIM.timer, 0, sizeof(BG3_ANIM.timer)); memset(&BG3_ANIM.joy, 0, sizeof(BG3_ANIM.joy)); /* Camera */ BG3_ANIM.camera.Wh = 2; BG3_ANIM.camera.Hh = 2; BG3_ANIM.camera.PD = 1; BG3_ANIM.camera.projMatr = MatrFrustum(-BG3_ANIM.camera.Wh/2, BG3_ANIM.camera.Wh/2, -BG3_ANIM.camera.Hh/2, BG3_ANIM.camera.Hh/2, 1, 10000); /* Mouse position */ GetCursorPos(&cursorPoint); // Convert to window ScreenToClient(hWnd, &cursorPoint); BG3_ANIM.mouse.x = cursorPoint.x; BG3_ANIM.mouse.y = cursorPoint.y; /* Timer state */ QueryPerformanceFrequency(&timeFreq); QueryPerformanceCounter(&time); BG3_ANIM.timer.animStart = ((DBL)time.QuadPart / timeFreq.QuadPart); memset(&BG3_ANIM.mouse, 0, sizeof(BG3_ANIM.mouse)); // Init units for (i = 0; i < BG3_ANIM.unitsNum; i++) { BG3_ANIM.units[i]->Init(BG3_ANIM.units[i], &BG3_ANIM); } BG3_IsInit = TRUE; return TRUE; }