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