Revision: 16510
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16510
Author:   blendix
Date:     2008-09-14 02:32:18 +0200 (Sun, 14 Sep 2008)

Log Message:
-----------

Various game engine fixes:

* Fix issue with add transparency mode with blender materials.
* Possible fix at frontface flip in the game engine.
* Fix color buffering clearing for multiple viewports, it used
  to clear as if there was one.
* Fix for zoom level in user defined viewports, it was based on
  the full window before, now it is based on the viewport itself.
* For user defined viewports, always use Expose instead of
  Letterbox with bars, the latter doesn't make sense then.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h
    trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_FramingManager.h
    trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h
    
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2008-09-13 
21:06:22 UTC (rev 16509)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2008-09-14 
00:32:18 UTC (rev 16510)
@@ -7762,7 +7762,7 @@
                }
        }
 
-       if(main->versionfile <= 246 && main->subversionfile < 1){
+       if(main->versionfile < 246 || (main->versionfile == 246 && 
main->subversionfile < 1)) {
                Mesh *me;
 
                for(me=main->mesh.first; me; me= me->id.next)

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp      
2008-09-13 21:06:22 UTC (rev 16509)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp      
2008-09-14 00:32:18 UTC (rev 16510)
@@ -627,7 +627,7 @@
                material->transp = TF_ALPHA;
 
        // always zsort alpha + add
-       if((material->transp == TF_ALPHA || texalpha) && (material->transp != 
TF_CLIP)) {
+       if((material->transp == TF_ALPHA || material->transp == TF_ADD || 
texalpha) && (material->transp != TF_CLIP)) {
                material->ras_mode |= ALPHA;
                material->ras_mode |= (material->mode & TF_ALPHASORT)? ZSORT: 0;
        }

Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp      
2008-09-13 21:06:22 UTC (rev 16509)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp      
2008-09-14 00:32:18 UTC (rev 16510)
@@ -629,7 +629,8 @@
                                char pathname[160];
 
                                get_filename(argc, argv, filename);
-                               make_absolute_filename(filename);
+                               if(filename[0])
+                                       make_absolute_filename(filename);
                                
                                do
                                {

Modified: trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp  2008-09-13 
21:06:22 UTC (rev 16509)
+++ trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp  2008-09-14 
00:32:18 UTC (rev 16510)
@@ -276,30 +276,73 @@
 
 }
 
-bool KX_KetsjiEngine::BeginFrame()
+void KX_KetsjiEngine::ClearFrame()
 {
-       bool result = false;
+       // clear unless we're drawing overlapping stereo
+       if(m_rasterizer->InterlacedStereo() &&
+               m_rasterizer->GetEye() == RAS_IRasterizer::RAS_STEREO_RIGHTEYE)
+               return;
 
-       RAS_Rect vp;
-       KX_Scene* firstscene = *m_scenes.begin();
-       const RAS_FrameSettings &framesettings = firstscene->GetFramingType();
+       // clear the viewports with the background color of the first scene
+       bool doclear = false;
+       KX_SceneList::iterator sceneit;
+       RAS_Rect clearvp, area, viewport;
 
-       // set the area used for rendering
+       for (sceneit = m_scenes.begin(); sceneit != m_scenes.end(); sceneit++)
+       {
+               KX_Scene* scene = *sceneit;
+               //const RAS_FrameSettings &framesettings = 
scene->GetFramingType();
+               list<class KX_Camera*>* cameras = scene->GetCameras();
+
+               list<KX_Camera*>::iterator it;
+               for(it = cameras->begin(); it != cameras->end(); it++)
+               {
+                       SetupViewport(scene, (*it), area, viewport);
+
+                       if(!doclear) {
+                               clearvp = viewport;
+                               doclear = true;
+                       }
+                       else {
+                               if(viewport.GetLeft() < clearvp.GetLeft())
+                                       clearvp.SetLeft(viewport.GetLeft());
+                               if(viewport.GetBottom() < clearvp.GetBottom())
+                                       clearvp.SetBottom(viewport.GetBottom());
+                               if(viewport.GetRight() > clearvp.GetRight())
+                                       clearvp.SetRight(viewport.GetRight());
+                               if(viewport.GetTop() > clearvp.GetTop())
+                                       clearvp.SetTop(viewport.GetTop());
+
+                       }
+               }
+       }
+
+       if(doclear) {
+               KX_Scene* firstscene = *m_scenes.begin();
+               SetBackGround(firstscene->GetWorldInfo());
+
+               m_canvas->SetViewPort(clearvp.GetLeft(), clearvp.GetBottom(),
+                       clearvp.GetRight(), clearvp.GetTop());  
+               m_rasterizer->ClearColorBuffer();
+       }
+}
+
+bool KX_KetsjiEngine::BeginFrame()
+{
+       // set the area used for rendering (stereo can assign only a subset)
        m_rasterizer->SetRenderArea();
 
-       RAS_FramingManager::ComputeViewport(framesettings, 
m_canvas->GetDisplayArea(), vp);
-
        if (m_canvas->BeginDraw())
        {
-               result = true;
+               ClearFrame();
 
-               m_canvas->SetViewPort(vp.GetLeft(), vp.GetBottom(), 
vp.GetRight(), vp.GetTop());
-               SetBackGround( firstscene->GetWorldInfo() );
-               m_rasterizer->BeginFrame( m_drawingmode , 
m_kxsystem->GetTimeInSeconds());
-               m_rendertools->BeginFrame( m_rasterizer);
+               m_rasterizer->BeginFrame(m_drawingmode , 
m_kxsystem->GetTimeInSeconds());
+               m_rendertools->BeginFrame(m_rasterizer);
+
+               return true;
        }
        
-       return result;
+       return false;
 }              
 
 
@@ -606,7 +649,7 @@
                                );
                }
                // clear the -whole- viewport
-               m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER);
+               
m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
        }
 
        m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_LEFTEYE);
@@ -635,9 +678,6 @@
        
                        m_rendertools->SetAuxilaryClientInfo(scene);
        
-                       //Initialize scene viewport.
-                       SetupRenderFrame(scene, cam);
-       
                        // do the rendering
                        RenderFrame(scene, cam);
                }
@@ -655,9 +695,6 @@
                
                                m_rendertools->SetAuxilaryClientInfo(scene);
                
-                               //Initialize scene viewport.
-                               SetupRenderFrame(scene, (*it));
-               
                                // do the rendering
                                RenderFrame(scene, (*it));
                        }
@@ -690,10 +727,6 @@
                        //pass the scene, for picking and raycasting (shadows)
                        m_rendertools->SetAuxilaryClientInfo(scene);
 
-                       //Initialize scene viewport.
-                       //SetupRenderFrame(scene);
-                       SetupRenderFrame(scene, cam);
-
                        // do the rendering
                        //RenderFrame(scene);
                        RenderFrame(scene, cam);
@@ -854,7 +887,7 @@
 }
 
        
-void KX_KetsjiEngine::SetupRenderFrame(KX_Scene *scene, KX_Camera* cam)
+void KX_KetsjiEngine::SetupViewport(KX_Scene *scene, KX_Camera* cam, RAS_Rect& 
area, RAS_Rect& viewport)
 {
        // In this function we make sure the rasterizer settings are upto
        // date. We compute the viewport so that logic
@@ -862,17 +895,26 @@
 
        // Note we postpone computation of the projection matrix
        // so that we are using the latest camera position.
+       if (cam->GetViewport()) {
+               RAS_Rect userviewport;
 
-       RAS_Rect viewport;
+               userviewport.SetLeft(cam->GetViewportLeft()); 
+               userviewport.SetBottom(cam->GetViewportBottom());
+               userviewport.SetRight(cam->GetViewportRight());
+               userviewport.SetTop(cam->GetViewportTop());
 
-       if (!cam)
-               return;
+               // Don't do bars on user specified viewport
+               RAS_FrameSettings settings = scene->GetFramingType();
+               if(settings.FrameType() == RAS_FrameSettings::e_frame_bars)
+                       
settings.SetFrameType(RAS_FrameSettings::e_frame_extend);
 
-       if (cam->GetViewport()) {
-               viewport.SetLeft(cam->GetViewportLeft()); 
-               viewport.SetBottom(cam->GetViewportBottom());
-               viewport.SetRight(cam->GetViewportRight());
-               viewport.SetTop(cam->GetViewportTop());
+               RAS_FramingManager::ComputeViewport(
+                       scene->GetFramingType(),
+                       userviewport,
+                       viewport
+               );
+
+               area = userviewport;
        }
        else if ( m_overrideCam || (scene->GetName() != m_overrideSceneName) || 
 m_overrideCamUseOrtho ) {
                RAS_FramingManager::ComputeViewport(
@@ -880,24 +922,16 @@
                        m_canvas->GetDisplayArea(),
                        viewport
                );
+
+               area = m_canvas->GetDisplayArea();
        } else {
                viewport.SetLeft(0); 
                viewport.SetBottom(0);
                viewport.SetRight(int(m_canvas->GetWidth()));
                viewport.SetTop(int(m_canvas->GetHeight()));
+
+               area = m_canvas->GetDisplayArea();
        }
-       // store the computed viewport in the scene
-
-       scene->SetSceneViewport(viewport);      
-
-       // set the viewport for this frame and scene
-       m_canvas->SetViewPort(
-               viewport.GetLeft(),
-               viewport.GetBottom(),
-               viewport.GetRight(),
-               viewport.GetTop()
-       );      
-
 }
 
 void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene)
@@ -951,12 +985,22 @@
 // update graphics
 void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
 {
+       RAS_Rect viewport, area;
        float left, right, bottom, top, nearfrust, farfrust, focallength;
        const float ortho = 100.0;
 //     KX_Camera* cam = scene->GetActiveCamera();
        
        if (!cam)
                return;
+
+       SetupViewport(scene, cam, area, viewport);
+
+       // store the computed viewport in the scene
+       scene->SetSceneViewport(viewport);      
+
+       // set the viewport for this frame and scene
+       m_canvas->SetViewPort(viewport.GetLeft(), viewport.GetBottom(),
+               viewport.GetRight(), viewport.GetTop());        
        
        // see KX_BlenderMaterial::Activate
        //m_rasterizer->SetAmbient();
@@ -985,8 +1029,8 @@
                
                RAS_FramingManager::ComputeFrustum(
                        scene->GetFramingType(),
-                       m_canvas->GetDisplayArea(),
-                       scene->GetSceneViewport(),
+                       area,
+                       viewport,
                        lens,
                        nearfrust,
                        farfrust,
@@ -1002,7 +1046,7 @@
 
                MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
                        left, right, bottom, top, nearfrust, farfrust, 
focallength);
-       
+
                cam->SetProjectionMatrix(projmat);
                
                // Otherwise the projection matrix for each eye will be the 
same...

Modified: trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h    2008-09-13 
21:06:22 UTC (rev 16509)
+++ trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h    2008-09-14 
00:32:18 UTC (rev 16510)
@@ -177,7 +177,7 @@
        /** Blue component of framing bar color. */
        float                                   m_overrideFrameColorB;
 
-       void                                    SetupRenderFrame(KX_Scene 
*scene, KX_Camera* cam);
+       void                                    SetupViewport(KX_Scene *scene, 
KX_Camera* cam, RAS_Rect& area, RAS_Rect& viewport);
        void                                    RenderFrame(KX_Scene* scene, 
KX_Camera* cam);
        void                                    PostRenderFrame();
        void                                    RenderDebugProperties();
@@ -355,6 +355,7 @@
        KX_Scene*               CreateScene(const STR_String& scenename);
        
        bool                    BeginFrame();
+       void                    ClearFrame();
        void                    EndFrame();
 };
 

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp    
2008-09-13 21:06:22 UTC (rev 16509)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp    
2008-09-14 00:32:18 UTC (rev 16510)
@@ -130,9 +130,6 @@
                sort(slots.begin(), slots.end(), fronttoback());
 }
 
-//static int TOTASLOT = 0;
-//static int TOTSLOT = 0;
-
 void RAS_BucketManager::RenderAlphaBuckets(
        const MT_Transform& cameratrans, RAS_IRasterizer* rasty, 
RAS_IRenderTools* rendertools)
 {
@@ -149,10 +146,8 @@

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to