blender/source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp

172 lines
3.8 KiB
C++

/**
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
*/
#include "GPW_Canvas.h"
GPW_Canvas::GPW_Canvas(HWND hWnd, HDC hDC, int width, int height)
: GPC_Canvas(width, height), m_hWnd(hWnd), m_hRC(0), m_hDC(hDC)
{
}
GPW_Canvas::~GPW_Canvas()
{
if (m_hRC) {
::wglDeleteContext(m_hRC);
}
//if (m_hDC) {
// ::ReleaseDC(m_hWnd, m_hDC);
//}
}
void GPW_Canvas::Init()
{
// log_entry("GPW_Canvas::Init");
/*
* Color and depth bit values are not to be trusted.
* For instance, on TNT2:
* When the screen color depth is set to 16 bit, we get 5 color bits
* and 16 depth bits.
* When the screen color depth is set to 32 bit, we get 8 color bits
* and 24 depth bits.
* Just to be safe, we request high quality settings.
*/
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // iSize
1, // iVersion
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
// PFD_STEREO |
PFD_DOUBLEBUFFER, // dwFlags
PFD_TYPE_RGBA, // iPixelType
32, // cColorBits
0, 0, // cRedBits, cRedShift (ignored)
0, 0, // cGreenBits, cGreenShift (ignored)
0, 0, // cBlueBits, cBlueShift (ignored)
0, 0, // cAlphaBits, cAlphaShift (ignored)
0, 0, 0, 0, 0, // cAccum_X_Bits
32, // cDepthBits
0, // cStencilBits
0, // cAuxBuffers
PFD_MAIN_PLANE, // iLayerType
0, // bReserved
0, // dwLayerMask
0, // dwVisibleMask
0 // dwDamageMask
};
PIXELFORMATDESCRIPTOR match;
// Look what we get back for this pixel format
int pixelFormat = ::ChoosePixelFormat(m_hDC, &pfd);
if (!pixelFormat) {
DWORD error = ::GetLastError();
}
::DescribePixelFormat(m_hDC, pixelFormat, sizeof(match), &match);
// Activate the pixel format for this context
::SetPixelFormat(m_hDC, ::ChoosePixelFormat(m_hDC, &match), &match);
// Create the OpenGL context and make it current
m_hRC = ::wglCreateContext(m_hDC);
::wglMakeCurrent(m_hDC, m_hRC);
}
void GPW_Canvas::SetMousePosition(int x, int y)
{
POINT point = { x, y };
if (m_hWnd)
{
::ClientToScreen(m_hWnd, &point);
::SetCursorPos(point.x, point.y);
}
}
void GPW_Canvas::SetMouseState(RAS_MouseState mousestate)
{
LPCSTR id;
switch (mousestate)
{
case MOUSE_INVISIBLE:
HideCursor();
break;
case MOUSE_WAIT:
::SetCursor(::LoadCursor(0, IDC_WAIT));
ShowCursor();
break;
case MOUSE_NORMAL:
::SetCursor(::LoadCursor(0, IDC_ARROW));
ShowCursor();
break;
}
}
bool GPW_Canvas::BeginDraw(void)
{
::wglMakeCurrent(m_hDC, m_hRC);
// check errors, anyone?
return true;
}
void GPW_Canvas::EndDraw(void)
{
::wglMakeCurrent(NULL, NULL);
}
void GPW_Canvas::SwapBuffers(void)
{
if (m_hDC) {
::SwapBuffers(m_hDC);
}
}
void GPW_Canvas::HideCursor(void)
{
int count = ::ShowCursor(FALSE);
while (count >= 0)
{
count = ::ShowCursor(FALSE);
}
}
void GPW_Canvas::ShowCursor(void)
{
::ShowCursor(TRUE);
}