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:
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_Camera.cpp16
-rw-r--r--source/gameengine/Ketsji/KX_Camera.h4
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp4
-rw-r--r--source/gameengine/Rasterizer/RAS_CameraData.h5
-rw-r--r--source/gameengine/Rasterizer/RAS_FramingManager.cpp52
-rw-r--r--source/gameengine/Rasterizer/RAS_FramingManager.h8
-rw-r--r--source/gameengine/VideoTexture/ImageRender.cpp6
8 files changed, 83 insertions, 14 deletions
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 4899eafd84c..8ccfeadea7b 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -1461,7 +1461,7 @@ static KX_LightObject *gamelight_from_blamp(Object *ob, Lamp *la, unsigned int l
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->ortho_scale, ca->sensor_x, ca->sensor_y, ca->sensor_fit, ca->clipsta, ca->clipend, ca->type == CAM_PERSP, ca->YF_dofdist);
+ RAS_CameraData camdata(ca->lens, ca->ortho_scale, ca->sensor_x, ca->sensor_y, ca->sensor_fit, ca->shiftx, ca->shifty, ca->clipsta, ca->clipend, ca->type == CAM_PERSP, ca->YF_dofdist);
KX_Camera *gamecamera;
gamecamera= new KX_Camera(kxscene, KX_Scene::m_callbacks, camdata);
diff --git a/source/gameengine/Ketsji/KX_Camera.cpp b/source/gameengine/Ketsji/KX_Camera.cpp
index 4456345e1d9..70bcf505f2e 100644
--- a/source/gameengine/Ketsji/KX_Camera.cpp
+++ b/source/gameengine/Ketsji/KX_Camera.cpp
@@ -224,6 +224,22 @@ short KX_Camera::GetSensorFit() const
return m_camdata.m_sensor_fit;
}
+/**
+ * Gets the horizontal shift of the sensor - for camera matching.
+ */
+float KX_Camera::GetShiftHorizontal() const
+{
+ return m_camdata.m_shift_x;
+}
+
+/**
+ * Gets the vertical shift of the sensor - for camera matching.
+ */
+float KX_Camera::GetShiftVertical() const
+{
+ return m_camdata.m_shift_y;
+}
+
float KX_Camera::GetCameraNear() const
{
return m_camdata.m_clipstart;
diff --git a/source/gameengine/Ketsji/KX_Camera.h b/source/gameengine/Ketsji/KX_Camera.h
index eeb836c44b8..41d0172f2cd 100644
--- a/source/gameengine/Ketsji/KX_Camera.h
+++ b/source/gameengine/Ketsji/KX_Camera.h
@@ -206,6 +206,10 @@ public:
float GetSensorHeight() const;
/** Gets the mode FOV is calculating from sensor dimensions */
short GetSensorFit() const;
+ /** Gets the horizontal shift of the sensor - for camera matching */
+ float GetShiftHorizontal() const;
+ /** Gets the vertical shift of the sensor - for camera matching */
+ float GetShiftVertical() const;
/** Gets the near clip distance. */
float GetCameraNear() const;
/** Gets the far clip distance. */
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index be0cd8433f7..91963713dad 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -1159,6 +1159,8 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
nearfrust,
farfrust,
cam->GetSensorFit(),
+ cam->GetShiftHorizontal(),
+ cam->GetShiftVertical(),
frustum
);
if (!cam->GetViewport()) {
@@ -1179,6 +1181,8 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
cam->GetSensorWidth(),
cam->GetSensorHeight(),
cam->GetSensorFit(),
+ cam->GetShiftHorizontal(),
+ cam->GetShiftVertical(),
nearfrust,
farfrust,
frustum
diff --git a/source/gameengine/Rasterizer/RAS_CameraData.h b/source/gameengine/Rasterizer/RAS_CameraData.h
index 7a6bb541a1a..e2024a4a55d 100644
--- a/source/gameengine/Rasterizer/RAS_CameraData.h
+++ b/source/gameengine/Rasterizer/RAS_CameraData.h
@@ -39,6 +39,8 @@ struct RAS_CameraData
float m_sensor_x;
float m_sensor_y;
short m_sensor_fit;
+ float m_shift_x;
+ float m_shift_y;
float m_clipstart;
float m_clipend;
bool m_perspective;
@@ -50,6 +52,7 @@ struct RAS_CameraData
float m_focallength;
RAS_CameraData(float lens = 35.0, float scale = 6.0, float sensor_x = 32.0, float sensor_y = 18.0, short sensor_fit = 0,
+ float shift_x = 0.0, float shift_y = 0.0,
float clipstart = 0.1, float clipend = 5000.0, bool perspective = true,
float focallength = 3.0, bool viewport = false, int viewportleft = 0, int viewportbottom = 0,
int viewportright = 0, int viewporttop = 0) :
@@ -58,6 +61,8 @@ struct RAS_CameraData
m_sensor_x(sensor_x),
m_sensor_y(sensor_y),
m_sensor_fit(sensor_fit),
+ m_shift_x(shift_x),
+ m_shift_y(shift_y),
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 d1a801c52f8..c5f15c9ad21 100644
--- a/source/gameengine/Rasterizer/RAS_FramingManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_FramingManager.cpp
@@ -41,15 +41,21 @@ ComputeDefaultFrustum(
const float lens,
const float sensor_x, const float sensor_y,
const short sensor_fit,
+ const float shift_x,
+ const float shift_y,
const float design_aspect_ratio,
RAS_FrameFrustum & frustum
) {
+ float size;
float halfSize;
float sizeX;
float sizeY;
+ float offsetX;
+ float offsetY;
if (sensor_fit==RAS_SENSORFIT_AUTO) {
- halfSize = (sensor_x / 2.f) * camnear / lens;
+ size = sensor_x * camnear / lens;
+ halfSize = size * 0.5f;
if (design_aspect_ratio > 1.f) {
// halfsize defines the width
@@ -62,20 +68,25 @@ ComputeDefaultFrustum(
}
}
else if (sensor_fit==RAS_SENSORFIT_HOR) {
- halfSize = (sensor_x / 2.f) * camnear / lens;
+ size = sensor_x * camnear / lens;
+ halfSize = size * 0.5f;
sizeX = halfSize;
sizeY = halfSize/design_aspect_ratio;
}
else {
- halfSize = (sensor_y / 2.f) * camnear / lens;
+ size = sensor_y * camnear / lens;
+ halfSize = size * 0.5f;
sizeX = halfSize * design_aspect_ratio;
sizeY = halfSize;
}
-
- frustum.x2 = sizeX;
- frustum.x1 = -frustum.x2;
- frustum.y2 = sizeY;
- frustum.y1 = -frustum.y2;
+
+ offsetX = size * shift_x;
+ offsetY = size * shift_y;
+
+ frustum.x2 = sizeX + offsetX;
+ frustum.x1 = -sizeX + offsetX;
+ frustum.y2 = sizeY + offsetY;
+ frustum.y1 = -sizeY + offsetY;
frustum.camnear = camnear;
frustum.camfar = camfar;
}
@@ -88,12 +99,16 @@ ComputeDefaultOrtho(
const float scale,
const float design_aspect_ratio,
const short sensor_fit,
+ const float shift_x,
+ const float shift_y,
RAS_FrameFrustum & frustum
)
{
float halfSize = scale*0.5f;
float sizeX;
float sizeY;
+ float offsetX;
+ float offsetY;
if (sensor_fit==RAS_SENSORFIT_AUTO) {
if (design_aspect_ratio > 1.f) {
@@ -114,11 +129,14 @@ ComputeDefaultOrtho(
sizeX = halfSize * design_aspect_ratio;
sizeY = halfSize;
}
-
- frustum.x2 = sizeX;
- frustum.x1 = -frustum.x2;
- frustum.y2 = sizeY;
- frustum.y1 = -frustum.y2;
+
+ offsetX = scale * shift_x;
+ offsetY = scale * shift_y;
+
+ frustum.x2 = sizeX + offsetX;
+ frustum.x1 = -sizeX + offsetX;
+ frustum.y2 = sizeY + offsetY;
+ frustum.y1 = -sizeY + offsetY;
frustum.camnear = camnear;
frustum.camfar = camfar;
}
@@ -221,6 +239,8 @@ ComputeFrustum(
const RAS_Rect &viewport,
const float lens,
const float sensor_x, const float sensor_y, const short sensor_fit,
+ const float shift_x,
+ const float shift_y,
const float camnear,
const float camfar,
RAS_FrameFrustum &frustum
@@ -249,6 +269,8 @@ ComputeFrustum(
sensor_x,
sensor_y,
sensor_fit,
+ shift_x,
+ shift_y,
design_aspect_ratio,
frustum
);
@@ -315,6 +337,8 @@ RAS_FramingManager::
const float camnear,
const float camfar,
const short sensor_fit,
+ const float shift_x,
+ const float shift_y,
RAS_FrameFrustum &frustum
)
{
@@ -340,6 +364,8 @@ RAS_FramingManager::
scale,
design_aspect_ratio,
sensor_fit,
+ shift_x,
+ shift_y,
frustum
);
diff --git a/source/gameengine/Rasterizer/RAS_FramingManager.h b/source/gameengine/Rasterizer/RAS_FramingManager.h
index 122f0ca46ec..5741a91939e 100644
--- a/source/gameengine/Rasterizer/RAS_FramingManager.h
+++ b/source/gameengine/Rasterizer/RAS_FramingManager.h
@@ -236,6 +236,8 @@ public :
const float camnear,
const float camfar,
const short sensor_fit,
+ const float shift_x,
+ const float shift_y,
RAS_FrameFrustum &frustum
);
@@ -247,6 +249,8 @@ public :
const RAS_Rect &viewport,
const float lens,
const float sensor_x, const float sensor_y, const short sensor_fit,
+ const float shift_x,
+ const float shift_y,
const float camnear,
const float camfar,
RAS_FrameFrustum &frustum
@@ -260,6 +264,8 @@ public :
const float lens,
const float sensor_x, const float sensor_y,
const short sensor_fit,
+ const float shift_x,
+ const float shift_y,
const float design_aspect_ratio,
RAS_FrameFrustum & frustum
);
@@ -272,6 +278,8 @@ public :
const float scale,
const float design_aspect_ratio,
const short sensor_fit,
+ const float shift_x,
+ const float shift_y,
RAS_FrameFrustum & frustum
);
diff --git a/source/gameengine/VideoTexture/ImageRender.cpp b/source/gameengine/VideoTexture/ImageRender.cpp
index 0850995eaaf..797313366cd 100644
--- a/source/gameengine/VideoTexture/ImageRender.cpp
+++ b/source/gameengine/VideoTexture/ImageRender.cpp
@@ -240,6 +240,8 @@ void ImageRender::Render()
float lens = m_camera->GetLens();
float sensor_x = m_camera->GetSensorWidth();
float sensor_y = m_camera->GetSensorHeight();
+ float shift_x = m_camera->GetShiftHorizontal();
+ float shift_y = m_camera->GetShiftVertical();
bool orthographic = !m_camera->GetCameraData()->m_perspective;
float nearfrust = m_camera->GetCameraNear();
float farfrust = m_camera->GetCameraFar();
@@ -260,6 +262,8 @@ void ImageRender::Render()
m_camera->GetScale(),
aspect_ratio,
m_camera->GetSensorFit(),
+ shift_x,
+ shift_y,
frustrum
);
@@ -274,6 +278,8 @@ void ImageRender::Render()
sensor_x,
sensor_y,
RAS_SENSORFIT_AUTO,
+ shift_x,
+ shift_y,
aspect_ratio,
frustrum);