diff options
author | Mitchell Stokes <mogurijin@gmail.com> | 2012-12-25 10:20:50 +0400 |
---|---|---|
committer | Mitchell Stokes <mogurijin@gmail.com> | 2012-12-25 10:20:50 +0400 |
commit | 62b6303735a1bbdb0f978ecf6afc1829d13ebe7b (patch) | |
tree | a69e00d21893bb7c64ef0fcf124c94247b3dbace /source/gameengine | |
parent | f339c63584526a56e5053dc288ccf557a722a202 (diff) |
BGE: Fixing an assert with the canvas' GetViewPort(). bf_gpu was changing the viewport when handling shadow buffers. KX_LightObject::BindShadowBuffer() now updates the canvas with the new viewport information from bf_gpu.
Diffstat (limited to 'source/gameengine')
-rw-r--r-- | source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp | 12 | ||||
-rw-r--r-- | source/gameengine/BlenderRoutines/KX_BlenderCanvas.h | 7 | ||||
-rw-r--r-- | source/gameengine/GamePlayer/common/GPC_Canvas.cpp | 10 | ||||
-rw-r--r-- | source/gameengine/GamePlayer/common/GPC_Canvas.h | 1 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_KetsjiEngine.cpp | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Light.cpp | 5 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Light.h | 2 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_ICanvas.h | 14 |
8 files changed, 48 insertions, 5 deletions
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp index 346d2017ef0..719041e8d41 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp @@ -178,6 +178,18 @@ SetViewPort( glScissor(minx + x1, miny + y1, vp_width, vp_height); } + void +KX_BlenderCanvas:: +UpdateViewPort( + int x1, int y1, + int x2, int y2 +) { + m_viewport[0] = x1; + m_viewport[1] = y1; + m_viewport[2] = x2; + m_viewport[3] = y2; +} + const int* KX_BlenderCanvas:: GetViewPort() { diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h index 244394a115d..4117c13aede 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h @@ -151,6 +151,13 @@ public: int x1, int y1, int x2, int y2 ); + + void + UpdateViewPort( + int x1, int y1, + int x2, int y2 + ); + const int* GetViewPort(); diff --git a/source/gameengine/GamePlayer/common/GPC_Canvas.cpp b/source/gameengine/GamePlayer/common/GPC_Canvas.cpp index b5c1c29238a..058454ca352 100644 --- a/source/gameengine/GamePlayer/common/GPC_Canvas.cpp +++ b/source/gameengine/GamePlayer/common/GPC_Canvas.cpp @@ -131,7 +131,15 @@ void GPC_Canvas::SetViewPort(int x1, int y1, int x2, int y2) glViewport(x1,y1,x2-x1 + 1,y2-y1 + 1); glScissor(x1,y1,x2-x1 + 1,y2-y1 + 1); -}; +} + +void GPC_Canvas::UpdateViewPort(int x1, int y1, int x2, int y2) +{ + m_viewport[0] = x1; + m_viewport[1] = y1; + m_viewport[2] = x2; + m_viewport[3] = y2; +} const int *GPC_Canvas::GetViewPort() { diff --git a/source/gameengine/GamePlayer/common/GPC_Canvas.h b/source/gameengine/GamePlayer/common/GPC_Canvas.h index ec5375c0e13..00c5911a8b4 100644 --- a/source/gameengine/GamePlayer/common/GPC_Canvas.h +++ b/source/gameengine/GamePlayer/common/GPC_Canvas.h @@ -155,6 +155,7 @@ public: ); void SetViewPort(int x1, int y1, int x2, int y2); + void UpdateViewPort(int x1, int y1, int x2, int y2); const int *GetViewPort(); void ClearColor(float r, float g, float b, float a); diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index 6638b711a1b..f0d5d5c6685 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -1167,7 +1167,7 @@ void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene) m_rasterizer->SetDrawingMode(RAS_IRasterizer::KX_SHADOW); /* binds framebuffer object, sets up camera .. */ - light->BindShadowBuffer(m_rasterizer, cam, camtrans); + light->BindShadowBuffer(m_rasterizer, m_canvas, cam, camtrans); /* update scene */ scene->CalculateVisibleMeshes(m_rasterizer, cam, light->GetShadowLayer()); diff --git a/source/gameengine/Ketsji/KX_Light.cpp b/source/gameengine/Ketsji/KX_Light.cpp index cf58d18838a..5414a4df0f8 100644 --- a/source/gameengine/Ketsji/KX_Light.cpp +++ b/source/gameengine/Ketsji/KX_Light.cpp @@ -236,7 +236,7 @@ int KX_LightObject::GetShadowLayer() return 0; } -void KX_LightObject::BindShadowBuffer(RAS_IRasterizer *ras, KX_Camera *cam, MT_Transform& camtrans) +void KX_LightObject::BindShadowBuffer(RAS_IRasterizer *ras, RAS_ICanvas *canvas, KX_Camera *cam, MT_Transform& camtrans) { GPULamp *lamp; float viewmat[4][4], winmat[4][4]; @@ -246,6 +246,9 @@ void KX_LightObject::BindShadowBuffer(RAS_IRasterizer *ras, KX_Camera *cam, MT_T lamp = GetGPULamp(); GPU_lamp_shadow_buffer_bind(lamp, viewmat, &winsize, winmat); + /* GPU_lamp_shadow_buffer_bind() changes the viewport, so update the canvas */ + canvas->UpdateViewPort(0, 0, winsize, winsize); + /* setup camera transformation */ MT_Matrix4x4 modelviewmat((float*)viewmat); MT_Matrix4x4 projectionmat((float*)winmat); diff --git a/source/gameengine/Ketsji/KX_Light.h b/source/gameengine/Ketsji/KX_Light.h index 52f076c772a..f88fc7f6a1b 100644 --- a/source/gameengine/Ketsji/KX_Light.h +++ b/source/gameengine/Ketsji/KX_Light.h @@ -64,7 +64,7 @@ public: struct GPULamp *GetGPULamp(); bool HasShadowBuffer(); int GetShadowLayer(); - void BindShadowBuffer(class RAS_IRasterizer *ras, class KX_Camera *cam, class MT_Transform& camtrans); + void BindShadowBuffer(class RAS_IRasterizer *ras, class RAS_ICanvas *canvas, class KX_Camera *cam, class MT_Transform& camtrans); void UnbindShadowBuffer(class RAS_IRasterizer *ras); struct Image *GetTextureImage(short texslot); void Update(); diff --git a/source/gameengine/Rasterizer/RAS_ICanvas.h b/source/gameengine/Rasterizer/RAS_ICanvas.h index 60b9f052075..63ad7892aa5 100644 --- a/source/gameengine/Rasterizer/RAS_ICanvas.h +++ b/source/gameengine/Rasterizer/RAS_ICanvas.h @@ -178,7 +178,19 @@ public: SetViewPort( int x1, int y1, int x2, int y2 - ) = 0; + ) = 0; + + /** + * Update the Canvas' viewport (used when the viewport changes without using SetViewPort() + * eg: Shadow buffers and FBOs + */ + + virtual + void + UpdateViewPort( + int x1, int y1, + int x2, int y2 + ) = 0; /** * Get the visible viewport |