Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/RenderSystems/GL/src/win32/OgreWin32Context.cpp @ 1

Last change on this file since 1 was 1, checked in by landauf, 17 years ago
File size: 3.2 KB
Line 
1/*
2-----------------------------------------------------------------------------
3This source file is part of OGRE
4    (Object-oriented Graphics Rendering Engine)
5For the latest info, see http://www.ogre3d.org/
6
7Copyright (c) 2000-2006 Torus Knot Software Ltd
8Also see acknowledgements in Readme.html
9
10This program is free software; you can redistribute it and/or modify it under
11the terms of the GNU Lesser General Public License as published by the Free Software
12Foundation; either version 2 of the License, or (at your option) any later
13version.
14
15This program is distributed in the hope that it will be useful, but WITHOUT
16ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
18
19You should have received a copy of the GNU Lesser General Public License along with
20this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21Place - Suite 330, Boston, MA 02111-1307, USA, or go to
22http://www.gnu.org/copyleft/lesser.txt.
23
24You may alternatively use this source under the terms of a specific version of
25the OGRE Unrestricted License provided you have obtained such a license from
26Torus Knot Software Ltd.
27-----------------------------------------------------------------------------
28*/
29
30#include "OgreWin32Context.h"
31#include "OgreException.h"
32#include "OgreGLRenderSystem.h"
33#include "OgreRoot.h"
34
35namespace Ogre {
36
37    Win32Context::Win32Context(HDC     HDC,
38                 HGLRC   Glrc):
39        mHDC(HDC),
40        mGlrc(Glrc)
41    {
42    }
43   
44    Win32Context::~Win32Context()
45    {
46                // NB have to do this is subclass to ensure any methods called back
47                // are on this subclass and not half-destructed superclass
48                GLRenderSystem *rs = static_cast<GLRenderSystem*>(Root::getSingleton().getRenderSystem());
49                rs->_unregisterContext(this);
50    }
51       
52    void Win32Context::setCurrent()
53    {
54         wglMakeCurrent(mHDC, mGlrc);     
55    }
56        void Win32Context::endCurrent()
57        {
58                wglMakeCurrent(NULL, NULL);
59        }
60
61        String translateError()
62        {
63
64                int winError = GetLastError();
65                char* errDesc;
66                int i;
67
68                errDesc = new char[255];
69                // Try windows errors first
70                i = FormatMessage(
71                        FORMAT_MESSAGE_FROM_SYSTEM |
72                        FORMAT_MESSAGE_IGNORE_INSERTS,
73                        NULL,
74                        winError,
75                        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
76                        (LPTSTR) errDesc,
77                        255,
78                        NULL
79                        );
80
81                return String(errDesc);
82        }
83        GLContext* Win32Context::clone() const
84        {
85                // Create new context based on own HDC
86                HGLRC newCtx = wglCreateContext(mHDC);
87               
88                if (!newCtx)
89                {
90                        OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, 
91                                "Error calling wglCreateContext", "Win32Context::clone");
92                }
93
94                HGLRC oldrc = wglGetCurrentContext();
95                HDC oldhdc = wglGetCurrentDC();
96                wglMakeCurrent(NULL, NULL);
97                // Share lists with old context
98            if (!wglShareLists(mGlrc, newCtx))
99                {
100                        String errorMsg = translateError();
101                        wglDeleteContext(newCtx);
102                        OGRE_EXCEPT(Exception::ERR_RENDERINGAPI_ERROR, String("wglShareLists() failed: ") + errorMsg, "Win32Context::clone");
103                }
104                // restore old context
105                wglMakeCurrent(oldhdc, oldrc);
106               
107
108                return new Win32Context(mHDC, newCtx);
109        }
110}
Note: See TracBrowser for help on using the repository browser.