Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2013-04-18 20:28:39 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-04-18 20:28:39 +0400
commitfeeab1ad53f1b7cd4496fb8e7f173f21e460aac0 (patch)
tree3c9142be45eaf2b7d85b8de2b88cdf4e2243769f /source/gameengine
parentfb2b3155f72d3bc6d2025d332cb843befea78d75 (diff)
Fix #34997: when starting the game engine in one window and switching to a second
window, the game would stop drawing in the first and mess up the OpenGL state of the second. Also fixes glPushAttrib/glPopAttrib getting out of sync in some cases.
Diffstat (limited to 'source/gameengine')
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp3
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp22
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderCanvas.h17
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.cpp5
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.h5
5 files changed, 32 insertions, 20 deletions
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index 38302a51a45..dbb7cbc1816 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -210,6 +210,7 @@ static int BL_KetsjiPyNextFrame(void *state0)
extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *cam_frame, int always_use_expand_framing)
{
/* context values */
+ struct wmWindowManager *wm= CTX_wm_manager(C);
struct wmWindow *win= CTX_wm_window(C);
struct Scene *startscene= CTX_data_scene(C);
struct Main* maggie1= CTX_data_main(C);
@@ -276,7 +277,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
if (animation_record) usefixed= false; /* override since you don't want to run full-speed for sim recording */
// create the canvas, rasterizer and rendertools
- RAS_ICanvas* canvas = new KX_BlenderCanvas(win, area_rect, ar);
+ RAS_ICanvas* canvas = new KX_BlenderCanvas(wm, win, area_rect, ar);
// default mouse state set on render panel
if (mouse_state)
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
index b6c41064282..3bd1c02f12e 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
@@ -37,7 +37,8 @@
#include <assert.h>
-KX_BlenderCanvas::KX_BlenderCanvas(struct wmWindow *win, RAS_Rect &rect, struct ARegion *ar) :
+KX_BlenderCanvas::KX_BlenderCanvas(wmWindowManager *wm, wmWindow *win, RAS_Rect &rect, struct ARegion *ar) :
+m_wm(wm),
m_win(win),
m_frame_rect(rect)
{
@@ -81,20 +82,29 @@ bool KX_BlenderCanvas::GetFullScreen()
return false;
}
+bool KX_BlenderCanvas::BeginDraw()
+{
+ // in case of multi-window we need to ensure we are drawing to the correct
+ // window always, because it may change in window event handling
+ BL_MakeDrawable(m_wm, m_win);
+ return true;
+}
+
+
+void KX_BlenderCanvas::EndDraw()
+{
+ // nothing needs to be done here
+}
+
void KX_BlenderCanvas::BeginFrame()
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
-
}
void KX_BlenderCanvas::EndFrame()
{
- // this is needed, else blender distorts a lot
- glPopAttrib();
- glPushAttrib(GL_ALL_ATTRIB_BITS);
-
glDisable(GL_FOG);
}
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h
index bc487504eeb..c201d866efe 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h
@@ -49,6 +49,7 @@
struct ARegion;
struct wmWindow;
+struct wmWindowManager;
/**
* 2D Blender device context abstraction.
@@ -69,7 +70,7 @@ public:
*
* \param area The Blender ARegion to run the game within.
*/
- KX_BlenderCanvas(struct wmWindow* win, class RAS_Rect &rect, struct ARegion* ar);
+ KX_BlenderCanvas(struct wmWindowManager *wm, struct wmWindow* win, class RAS_Rect &rect, struct ARegion* ar);
~KX_BlenderCanvas();
void
@@ -186,25 +187,17 @@ public:
const char* filename
);
- /**
- * Nothing needs be done for BlenderCanvas
- * Begin/End Draw, as the game engine GL context
- * is always current/active.
- */
-
bool
BeginDraw(
- ) {
- return true;
- };
+ );
void
EndDraw(
- ) {
- };
+ );
private:
/** Blender area the game engine is running within */
+ struct wmWindowManager *m_wm;
struct wmWindow* m_win;
RAS_Rect m_frame_rect;
RAS_Rect m_area_rect;
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
index f43f8c30d57..61598995040 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
@@ -93,6 +93,11 @@ void BL_SwapBuffers(wmWindow *win)
wm_window_swap_buffers(win);
}
+void BL_MakeDrawable(wmWindowManager *wm, wmWindow *win)
+{
+ wm_window_make_drawable(wm, win);
+}
+
static void DisableForText()
{
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); /* needed for texture fonts otherwise they render as wireframe */
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.h b/source/gameengine/BlenderRoutines/KX_BlenderGL.h
index 0f35494c73a..54e76ff6489 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.h
@@ -36,13 +36,16 @@
extern "C" {
#endif /* __cplusplus */
-struct wmWindow;
struct ARegion;
struct bScreen;
+struct wmWindow;
+struct wmWindowManager;
// special swapbuffers, that takes care of which area (viewport) needs to be swapped
void BL_SwapBuffers(struct wmWindow *win);
+void BL_MakeDrawable(struct wmWindowManager *wm, struct wmWindow *win);
+
void BL_warp_pointer(struct wmWindow *win,int x,int y);
void BL_MakeScreenShot(struct bScreen *screen, struct ScrArea *curarea, const char *filename);