Revision: 53318
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53318
Author:   moguri
Date:     2012-12-25 06:20:50 +0000 (Tue, 25 Dec 2012)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h
    trunk/blender/source/gameengine/GamePlayer/common/GPC_Canvas.cpp
    trunk/blender/source/gameengine/GamePlayer/common/GPC_Canvas.h
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Light.h
    trunk/blender/source/gameengine/Rasterizer/RAS_ICanvas.h

Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp        
2012-12-24 17:55:50 UTC (rev 53317)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp        
2012-12-25 06:20:50 UTC (rev 53318)
@@ -178,6 +178,18 @@
        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() {

Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h  
2012-12-24 17:55:50 UTC (rev 53317)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h  
2012-12-25 06:20:50 UTC (rev 53318)
@@ -151,6 +151,13 @@
                int x1, int y1,
                int x2, int y2
        );
+
+               void
+       UpdateViewPort(
+               int x1, int y1,
+               int x2, int y2
+       );
+
                const int*
        GetViewPort();
 

Modified: trunk/blender/source/gameengine/GamePlayer/common/GPC_Canvas.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/common/GPC_Canvas.cpp    
2012-12-24 17:55:50 UTC (rev 53317)
+++ trunk/blender/source/gameengine/GamePlayer/common/GPC_Canvas.cpp    
2012-12-25 06:20:50 UTC (rev 53318)
@@ -131,8 +131,16 @@
 
        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()
 {
 #ifdef DEBUG

Modified: trunk/blender/source/gameengine/GamePlayer/common/GPC_Canvas.h
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/common/GPC_Canvas.h      
2012-12-24 17:55:50 UTC (rev 53317)
+++ trunk/blender/source/gameengine/GamePlayer/common/GPC_Canvas.h      
2012-12-25 06:20:50 UTC (rev 53318)
@@ -155,6 +155,7 @@
        );
        
        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);

Modified: trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp  2012-12-24 
17:55:50 UTC (rev 53317)
+++ trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp  2012-12-25 
06:20:50 UTC (rev 53318)
@@ -1167,7 +1167,7 @@
                        
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());

Modified: trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Light.cpp 2012-12-24 17:55:50 UTC 
(rev 53317)
+++ trunk/blender/source/gameengine/Ketsji/KX_Light.cpp 2012-12-25 06:20:50 UTC 
(rev 53318)
@@ -236,7 +236,7 @@
                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 @@
        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);

Modified: trunk/blender/source/gameengine/Ketsji/KX_Light.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Light.h   2012-12-24 17:55:50 UTC 
(rev 53317)
+++ trunk/blender/source/gameengine/Ketsji/KX_Light.h   2012-12-25 06:20:50 UTC 
(rev 53318)
@@ -64,7 +64,7 @@
        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();

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_ICanvas.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_ICanvas.h    2012-12-24 
17:55:50 UTC (rev 53317)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_ICanvas.h    2012-12-25 
06:20:50 UTC (rev 53318)
@@ -178,9 +178,21 @@
        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
         */
        virtual

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to