Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Bolsee <benoit.bolsee@online.be>2009-04-26 16:23:30 +0400
committerBenoit Bolsee <benoit.bolsee@online.be>2009-04-26 16:23:30 +0400
commitba563216e9ec4e7c3e55ca343948d925a2dc1651 (patch)
treec982d2100e4625559d53ab1e9c8e2be04c4a1033 /source/gameengine/Rasterizer
parentfc4ba5e13116835c3208ecfe21c9ccc3e93277f7 (diff)
BGE: Fix Orthographic mode and viewport scaling
- the BGE now uses correct glOrtho projection whe camera is in orthographic mode -
Diffstat (limited to 'source/gameengine/Rasterizer')
-rw-r--r--source/gameengine/Rasterizer/RAS_CameraData.h4
-rw-r--r--source/gameengine/Rasterizer/RAS_FramingManager.cpp101
-rw-r--r--source/gameengine/Rasterizer/RAS_FramingManager.h22
-rw-r--r--source/gameengine/Rasterizer/RAS_IRasterizer.h26
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp33
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h15
6 files changed, 189 insertions, 12 deletions
diff --git a/source/gameengine/Rasterizer/RAS_CameraData.h b/source/gameengine/Rasterizer/RAS_CameraData.h
index e3af43fb839..c8f4d9a0a17 100644
--- a/source/gameengine/Rasterizer/RAS_CameraData.h
+++ b/source/gameengine/Rasterizer/RAS_CameraData.h
@@ -32,6 +32,7 @@
struct RAS_CameraData
{
float m_lens;
+ float m_scale;
float m_clipstart;
float m_clipend;
bool m_perspective;
@@ -42,10 +43,11 @@ struct RAS_CameraData
int m_viewporttop;
float m_focallength;
- RAS_CameraData(float lens = 35.0, float clipstart = 0.1, float clipend = 5000.0, bool perspective = true,
+ RAS_CameraData(float lens = 35.0, float scale = 6.0, float clipstart = 0.1, float clipend = 5000.0, bool perspective = true,
float focallength = 0.0f, bool viewport = false, int viewportleft = 0, int viewportbottom = 0,
int viewportright = 0, int viewporttop = 0) :
m_lens(lens),
+ m_scale(scale),
m_clipstart(clipstart),
m_clipend(clipend),
m_perspective(perspective),
diff --git a/source/gameengine/Rasterizer/RAS_FramingManager.cpp b/source/gameengine/Rasterizer/RAS_FramingManager.cpp
index e2bbca48bb5..ea18ffb2298 100644
--- a/source/gameengine/Rasterizer/RAS_FramingManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_FramingManager.cpp
@@ -72,6 +72,39 @@ ComputeDefaultFrustum(
void
RAS_FramingManager::
+ComputeDefaultOrtho(
+ const float camnear,
+ const float camfar,
+ const float scale,
+ const float design_aspect_ratio,
+ RAS_FrameFrustum & frustum
+)
+{
+ float halfSize = scale*0.5f;
+ float sizeX;
+ float sizeY;
+
+ if (design_aspect_ratio > 1.f) {
+ // halfsize defines the width
+ sizeX = halfSize;
+ sizeY = halfSize/design_aspect_ratio;
+ } else {
+ // halfsize defines the height
+ sizeX = halfSize * design_aspect_ratio;
+ sizeY = halfSize;
+ }
+
+ frustum.x2 = sizeX;
+ frustum.x1 = -frustum.x2;
+ frustum.y2 = sizeY;
+ frustum.y1 = -frustum.y2;
+ frustum.camnear = -camfar;
+ frustum.camfar = camfar;
+}
+
+
+ void
+RAS_FramingManager::
ComputeBestFitViewRect(
const RAS_Rect &availableViewport,
const float design_aspect_ratio,
@@ -227,5 +260,73 @@ ComputeFrustum(
}
}
+ void
+RAS_FramingManager::
+ ComputeOrtho(
+ const RAS_FrameSettings &settings,
+ const RAS_Rect &availableViewport,
+ const RAS_Rect &viewport,
+ const float scale,
+ const float camnear,
+ const float camfar,
+ RAS_FrameFrustum &frustum
+ )
+{
+ RAS_FrameSettings::RAS_FrameType type = settings.FrameType();
+
+ const float design_width = float(settings.DesignAspectWidth());
+ const float design_height = float(settings.DesignAspectHeight());
+
+ float design_aspect_ratio = float(1);
+
+ if (design_height == float(0)) {
+ // well this is ill defined
+ // lets just scale the thing
+ type = RAS_FrameSettings::e_frame_scale;
+ } else {
+ design_aspect_ratio = design_width/design_height;
+ }
+
+
+ ComputeDefaultOrtho(
+ camnear,
+ camfar,
+ scale,
+ design_aspect_ratio,
+ frustum
+ );
+
+ switch (type) {
+
+ case RAS_FrameSettings::e_frame_extend:
+ {
+ RAS_Rect vt;
+ ComputeBestFitViewRect(
+ availableViewport,
+ design_aspect_ratio,
+ vt
+ );
+
+ // now scale the calculated frustum by the difference
+ // between vt and the viewport in each axis.
+ // These are always > 1
+
+ float x_scale = float(viewport.GetWidth())/float(vt.GetWidth());
+ float y_scale = float(viewport.GetHeight())/float(vt.GetHeight());
+
+ frustum.x1 *= x_scale;
+ frustum.x2 *= x_scale;
+ frustum.y1 *= y_scale;
+ frustum.y2 *= y_scale;
+
+ break;
+ }
+ case RAS_FrameSettings::e_frame_scale :
+ case RAS_FrameSettings::e_frame_bars:
+ default :
+ break;
+ }
+
+}
diff --git a/source/gameengine/Rasterizer/RAS_FramingManager.h b/source/gameengine/Rasterizer/RAS_FramingManager.h
index 0a226ac30f9..4398e2d00c3 100644
--- a/source/gameengine/Rasterizer/RAS_FramingManager.h
+++ b/source/gameengine/Rasterizer/RAS_FramingManager.h
@@ -209,6 +209,18 @@ public :
static
void
+ ComputeOrtho(
+ const RAS_FrameSettings &settings,
+ const RAS_Rect &availableViewport,
+ const RAS_Rect &viewport,
+ const float scale,
+ const float camnear,
+ const float camfar,
+ RAS_FrameFrustum &frustum
+ );
+
+ static
+ void
ComputeFrustum(
const RAS_FrameSettings &settings,
const RAS_Rect &availableViewport,
@@ -229,6 +241,16 @@ public :
RAS_FrameFrustum & frustum
);
+ static
+ void
+ ComputeDefaultOrtho(
+ const float camnear,
+ const float camfar,
+ const float scale,
+ const float design_aspect_ratio,
+ RAS_FrameFrustum & frustum
+ );
+
private :
static
diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h
index 96472b112d6..dc8c3c1ebf8 100644
--- a/source/gameengine/Rasterizer/RAS_IRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h
@@ -250,9 +250,9 @@ public:
* Sets the modelview matrix.
*/
virtual void SetViewMatrix(const MT_Matrix4x4 & mat,
- const MT_Vector3& campos,
- const MT_Point3 &camLoc,
- const MT_Quaternion &camOrientQuat)=0;
+ const MT_Matrix3x3 & ori,
+ const MT_Point3 & pos,
+ bool perspective)=0;
/**
*/
virtual const MT_Point3& GetCameraPosition()=0;
@@ -326,6 +326,26 @@ public:
float focallength = 0.0f,
bool perspective = true
)=0;
+
+ /**
+ * Generates a orthographic projection matrix from the specified frustum.
+ * @param left the left clipping plane
+ * @param right the right clipping plane
+ * @param bottom the bottom clipping plane
+ * @param top the top clipping plane
+ * @param frustnear the near clipping plane
+ * @param frustfar the far clipping plane
+ * @return a 4x4 matrix representing the projection transform.
+ */
+ virtual MT_Matrix4x4 GetOrthoMatrix(
+ float left,
+ float right,
+ float bottom,
+ float top,
+ float frustnear,
+ float frustfar
+ )=0;
+
/**
* Sets the specular color component of the lighting equation.
*/
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
index bf50cde2280..3fe5e26abc3 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
@@ -921,17 +921,40 @@ MT_Matrix4x4 RAS_OpenGLRasterizer::GetFrustumMatrix(
return result;
}
+MT_Matrix4x4 RAS_OpenGLRasterizer::GetOrthoMatrix(
+ float left,
+ float right,
+ float bottom,
+ float top,
+ float frustnear,
+ float frustfar
+){
+ MT_Matrix4x4 result;
+ double mat[16];
+
+ // stereo is meaning less for orthographic, disable it
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(left, right, bottom, top, frustnear, frustfar);
+
+ glGetDoublev(GL_PROJECTION_MATRIX, mat);
+ result.setValue(mat);
+
+ return result;
+}
+
// next arguments probably contain redundant info, for later...
-void RAS_OpenGLRasterizer::SetViewMatrix(const MT_Matrix4x4 &mat, const MT_Vector3& campos,
- const MT_Point3 &, const MT_Quaternion &camOrientQuat)
+void RAS_OpenGLRasterizer::SetViewMatrix(const MT_Matrix4x4 &mat,
+ const MT_Matrix3x3 & camOrientMat3x3,
+ const MT_Point3 & pos,
+ bool perspective)
{
m_viewmatrix = mat;
// correction for stereo
- if(Stereo())
+ if(Stereo() && perspective)
{
- MT_Matrix3x3 camOrientMat3x3(camOrientQuat);
MT_Vector3 unitViewDir(0.0, -1.0, 0.0); // minus y direction, Blender convention
MT_Vector3 unitViewupVec(0.0, 0.0, 1.0);
MT_Vector3 viewDir, viewupVec;
@@ -977,7 +1000,7 @@ void RAS_OpenGLRasterizer::SetViewMatrix(const MT_Matrix4x4 &mat, const MT_Vecto
glMatrixMode(GL_MODELVIEW);
glLoadMatrixd(glviewmat);
- m_campos = campos;
+ m_campos = pos;
}
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
index 6013946fadf..4d51a477d48 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
@@ -163,9 +163,9 @@ public:
virtual void SetProjectionMatrix(const MT_Matrix4x4 & mat);
virtual void SetViewMatrix(
const MT_Matrix4x4 & mat,
- const MT_Vector3& campos,
- const MT_Point3 &camLoc,
- const MT_Quaternion &camOrientQuat
+ const MT_Matrix3x3 & ori,
+ const MT_Point3 & pos,
+ bool perspective
);
virtual const MT_Point3& GetCameraPosition();
@@ -216,6 +216,15 @@ public:
bool perspective
);
+ virtual MT_Matrix4x4 GetOrthoMatrix(
+ float left,
+ float right,
+ float bottom,
+ float top,
+ float frustnear,
+ float frustfar
+ );
+
virtual void SetSpecularity(
float specX,
float specY,