Revision: 14947
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14947
Author:   ben2610
Date:     2008-05-24 10:34:04 +0200 (Sat, 24 May 2008)

Log Message:
-----------
fix BGE bug #8646: unusable anaglyph settings

The best rules for stereo rendering are now applied to Blender. Here is the new 
situation:
1) The focal distance is now settable through the GUI: select the camera (each 
camera can have a different setting) and go to the camera data (F9): the "Dof 
Dist" and "Dof Ob" can be used to set the focal distance for that camera. The 
"Dof Ob" is interesting because it sets the focal distance so that the center 
this object will appear at the surface of the screen when running the game.
2) The eye separation is automatically set to focal_distance/30, which is 
considered to be a reasonable value. If you need a different value, you can 
always use Python scripting. 

Notes: 
- If you switch camera during the game, the focal distance will also change 
unless you have set the focal distance by scripting, in which case it 
overwrites the focal distance setting of all cameras.
- If you don't set the focal distance in the camera data or by scripting, the 
default value will be used. The default value corresponds more of less to the 
near clipping plane which means that all the objects will be very far with 
little 3D effect.
- If you don't set the eye separation by scripting, it is automatically 
computed as focal_distance/30, regardless on how the focal distance was set.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Camera.h
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_CameraData.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/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp      
2008-05-23 20:36:05 UTC (rev 14946)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp      
2008-05-24 08:34:04 UTC (rev 14947)
@@ -87,6 +87,7 @@
 #include "DNA_action_types.h"
 #include "BKE_main.h"
 #include "BKE_global.h"
+#include "BKE_object.h"
 #include "BL_SkinMeshObject.h"
 #include "BL_SkinDeformer.h"
 #include "BL_MeshDeformer.h"
@@ -1571,8 +1572,9 @@
        return gamelight;
 }
 
-static KX_Camera *gamecamera_from_bcamera(Camera *ca, KX_Scene *kxscene, 
KX_BlenderSceneConverter *converter) {
-       RAS_CameraData camdata(ca->lens, ca->clipsta, ca->clipend, ca->type == 
CAM_PERSP);
+static KX_Camera *gamecamera_from_bcamera(Object *ob, KX_Scene *kxscene, 
KX_BlenderSceneConverter *converter) {
+       Camera* ca = static_cast<Camera*>(ob->data);
+       RAS_CameraData camdata(ca->lens, ca->clipsta, ca->clipend, ca->type == 
CAM_PERSP, dof_camera(ob));
        KX_Camera *gamecamera;
        
        gamecamera= new KX_Camera(kxscene, KX_Scene::m_callbacks, camdata);
@@ -1607,7 +1609,7 @@
        
        case OB_CAMERA:
        {
-               KX_Camera* gamecamera = 
gamecamera_from_bcamera(static_cast<Camera*>(ob->data), kxscene, converter);
+               KX_Camera* gamecamera = gamecamera_from_bcamera(ob, kxscene, 
converter);
                gameobj = gamecamera;
                
                //don't add a reference: the camera list in kxscene->m_cameras 
is not released at the end

Modified: trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp        2008-05-23 
20:36:05 UTC (rev 14946)
+++ trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp        2008-05-24 
08:34:04 UTC (rev 14947)
@@ -204,8 +204,13 @@
        return m_camdata.m_clipend;
 }
 
+float KX_Camera::GetFocalLength() const
+{
+       return m_camdata.m_focallength;
+}
 
 
+
 RAS_CameraData*        KX_Camera::GetCameraData()
 {
        return &m_camdata; 

Modified: trunk/blender/source/gameengine/Ketsji/KX_Camera.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Camera.h  2008-05-23 20:36:05 UTC 
(rev 14946)
+++ trunk/blender/source/gameengine/Ketsji/KX_Camera.h  2008-05-24 08:34:04 UTC 
(rev 14947)
@@ -184,12 +184,14 @@
         */
        const MT_Matrix4x4&             GetModelviewMatrix() const;
 
-       /** Gets the focal length. */
+       /** Gets the aperture. */
        float                           GetLens() const;
        /** Gets the near clip distance. */
        float                           GetCameraNear() const;
        /** Gets the far clip distance. */
        float                           GetCameraFar() const;
+       /** Gets the focal length (only used for stereo rendering) */
+       float                           GetFocalLength() const;
        /** Gets all camera data. */
        RAS_CameraData*         GetCameraData();
        

Modified: trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp  2008-05-23 
20:36:05 UTC (rev 14946)
+++ trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp  2008-05-24 
08:34:04 UTC (rev 14947)
@@ -890,7 +890,7 @@
 // update graphics
 void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
 {
-       float left, right, bottom, top, nearfrust, farfrust;
+       float left, right, bottom, top, nearfrust, farfrust, focallength;
        const float ortho = 100.0;
 //     KX_Camera* cam = scene->GetActiveCamera();
        
@@ -913,6 +913,7 @@
                float lens = cam->GetLens();
                nearfrust = cam->GetCameraNear();
                farfrust = cam->GetCameraFar();
+               focallength = cam->GetFocalLength();
 
                if (!cam->GetCameraData()->m_perspective)
                {
@@ -939,7 +940,7 @@
                farfrust = frustum.camfar;
 
                MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
-                       left, right, bottom, top, nearfrust, farfrust);
+                       left, right, bottom, top, nearfrust, farfrust, 
focallength);
        
                cam->SetProjectionMatrix(projmat);
                

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_CameraData.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_CameraData.h 2008-05-23 
20:36:05 UTC (rev 14946)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_CameraData.h 2008-05-24 
08:34:04 UTC (rev 14947)
@@ -40,13 +40,16 @@
        int m_viewportbottom;
        int m_viewportright;
        int m_viewporttop;
+       float m_focallength;
 
        RAS_CameraData(float lens = 35., float clipstart = 0.1, float clipend = 
100., bool perspective = true,
-       bool viewport = false, int viewportleft = 0, int viewportbottom = 0, 
int viewportright = 0, int viewporttop = 0) :
+       float focallength = 0.0f, bool viewport = false, int viewportleft = 0, 
int viewportbottom = 0, 
+       int viewportright = 0, int viewporttop = 0) :
                m_lens(lens),
                m_clipstart(clipstart),
                m_clipend(clipend),
                m_perspective(perspective),
+               m_focallength(focallength),
                m_viewport(viewport),
                m_viewportleft(viewportleft),
                m_viewportbottom(viewportbottom),

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h        
2008-05-23 20:36:05 UTC (rev 14946)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h        
2008-05-24 08:34:04 UTC (rev 14947)
@@ -344,6 +344,7 @@
                float top,
                float frustnear,
                float frustfar,
+               float focallength = 0.0f,
                bool perspective = true
        )=0;
        /**

Modified: 
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- 
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    2008-05-23 20:36:05 UTC (rev 14946)
+++ 
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    2008-05-24 08:34:04 UTC (rev 14947)
@@ -1802,6 +1802,7 @@
        float top,
        float frustnear,
        float frustfar,
+       float focallength,
        bool
 ){
        MT_Matrix4x4 result;
@@ -1813,9 +1814,10 @@
                        float near_div_focallength;
                        // next 2 params should be specified on command line 
and in Blender publisher
                        if (!m_setfocallength)
-                               m_focallength = 1.5 * right;  // derived from 
example
+                               m_focallength = (focallength == 0.f) ? 1.5 * 
right  // derived from example
+                                       : focallength; 
                        if (!m_seteyesep)
-                               m_eyeseparation = 0.18 * right;  // just a 
guess...
+                               m_eyeseparation = m_focallength/30;  // 
reasonable value...
 
                        near_div_focallength = frustnear / m_focallength;
                        switch(m_curreye)

Modified: 
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- 
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
      2008-05-23 20:36:05 UTC (rev 14946)
+++ 
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
      2008-05-24 08:34:04 UTC (rev 14947)
@@ -246,6 +246,7 @@
                                                        float top,
                                                        float frustnear,
                                                        float frustfar,
+                                                       float focallength,
                                                        bool perspective
                                                );
 


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

Reply via email to