diff options
Diffstat (limited to 'source/gameengine/VideoTexture/ImageRender.cpp')
-rw-r--r-- | source/gameengine/VideoTexture/ImageRender.cpp | 79 |
1 files changed, 56 insertions, 23 deletions
diff --git a/source/gameengine/VideoTexture/ImageRender.cpp b/source/gameengine/VideoTexture/ImageRender.cpp index 8c6dcf45d6f..9086b042537 100644 --- a/source/gameengine/VideoTexture/ImageRender.cpp +++ b/source/gameengine/VideoTexture/ImageRender.cpp @@ -30,13 +30,13 @@ // implementation -#include "PyObjectPlus.h" +#include "EXP_PyObjectPlus.h" #include <structmember.h> #include <float.h> #include <math.h> -#include "GL/glew.h" +#include "glew-mx.h" #include "KX_PythonInit.h" #include "DNA_scene_types.h" @@ -75,8 +75,8 @@ ImageRender::ImageRender (KX_Scene *scene, KX_Camera * camera) : m_mirrorHalfWidth(0.f), m_mirrorHalfHeight(0.f) { - // initialize background color - setBackground(0, 0, 255, 255); + // initialize background color to scene background color as default + setBackgroundFromScene(m_scene); // retrieve rendering objects m_engine = KX_GetActiveEngine(); m_rasterizer = m_engine->GetRasterizer(); @@ -90,14 +90,33 @@ ImageRender::~ImageRender (void) m_camera->Release(); } +// get background color +float ImageRender::getBackground (int idx) +{ + return (idx < 0 || idx > 3) ? 0.0f : m_background[idx] * 255.0f; +} // set background color -void ImageRender::setBackground (int red, int green, int blue, int alpha) +void ImageRender::setBackground (float red, float green, float blue, float alpha) +{ + m_background[0] = (red < 0.0f) ? 0.0f : (red > 255.0f) ? 1.0f : red / 255.0f; + m_background[1] = (green < 0.0f) ? 0.0f : (green > 255.0f) ? 1.0f : green / 255.0f; + m_background[2] = (blue < 0.0f) ? 0.0f : (blue > 255.0f) ? 1.0f : blue / 255.0f; + m_background[3] = (alpha < 0.0f) ? 0.0f : (alpha > 255.0f) ? 1.0f : alpha / 255.0f; +} + +// set background color from scene +void ImageRender::setBackgroundFromScene (KX_Scene *scene) { - m_background[0] = (red < 0) ? 0.f : (red > 255) ? 1.f : float(red)/255.f; - m_background[1] = (green < 0) ? 0.f : (green > 255) ? 1.f : float(green)/255.f; - m_background[2] = (blue < 0) ? 0.f : (blue > 255) ? 1.f : float(blue)/255.f; - m_background[3] = (alpha < 0) ? 0.f : (alpha > 255) ? 1.f : float(alpha)/255.f; + if (scene) { + const float *background_color = scene->GetWorldInfo()->getBackColorConverted(); + copy_v3_v3(m_background, background_color); + m_background[3] = 1.0f; + } + else { + const float blue_color[] = {0.0f, 0.0f, 1.0f, 1.0f}; + copy_v4_v4(m_background, blue_color); + } } @@ -200,7 +219,7 @@ void ImageRender::Render() m_canvas->ClearColor(m_background[0], m_background[1], m_background[2], m_background[3]); m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER); m_rasterizer->BeginFrame(m_engine->GetClockTime()); - m_engine->SetWorldSettings(m_scene->GetWorldInfo()); + m_scene->GetWorldInfo()->UpdateWorldSettings(); m_rasterizer->SetAuxilaryClientInfo(m_scene); m_rasterizer->DisplayFog(); // matrix calculation, don't apply any of the stereo mode @@ -221,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(); @@ -241,6 +262,8 @@ void ImageRender::Render() m_camera->GetScale(), aspect_ratio, m_camera->GetSensorFit(), + shift_x, + shift_y, frustrum ); @@ -255,6 +278,8 @@ void ImageRender::Render() sensor_x, sensor_y, RAS_SENSORFIT_AUTO, + shift_x, + shift_y, aspect_ratio, frustrum); @@ -272,9 +297,16 @@ void ImageRender::Render() // restore the stereo mode now that the matrix is computed m_rasterizer->SetStereoMode(stereomode); + if (stereomode == RAS_IRasterizer::RAS_STEREO_QUADBUFFERED) { + // In QUAD buffer stereo mode, the GE render pass ends with the right eye on the right buffer + // but we need to draw on the left buffer to capture the render + // TODO: implement an explicit function in rasterizer to restore the left buffer. + m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_LEFTEYE); + } + m_scene->CalculateVisibleMeshes(m_rasterizer,m_camera); - m_scene->UpdateAnimations(m_engine->GetFrameTime()); + m_engine->UpdateAnimations(m_scene); m_scene->RenderBuckets(camtrans, m_rasterizer); @@ -344,7 +376,7 @@ static int ImageRender_init(PyObject *pySelf, PyObject *args, PyObject *kwds) // get background color static PyObject *getBackground (PyImage *self, void *closure) { - return Py_BuildValue("[BBBB]", + return Py_BuildValue("[ffff]", getImageRender(self)->getBackground(0), getImageRender(self)->getBackground(1), getImageRender(self)->getBackground(2), @@ -356,20 +388,20 @@ static int setBackground(PyImage *self, PyObject *value, void *closure) { // check validity of parameter if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 4 - || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0)) - || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1)) - || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 2)) - || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 3))) - { - PyErr_SetString(PyExc_TypeError, "The value must be a sequence of 4 integer between 0 and 255"); + || (!PyFloat_Check(PySequence_Fast_GET_ITEM(value, 0)) && !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))) + || (!PyFloat_Check(PySequence_Fast_GET_ITEM(value, 1)) && !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1))) + || (!PyFloat_Check(PySequence_Fast_GET_ITEM(value, 2)) && !PyLong_Check(PySequence_Fast_GET_ITEM(value, 2))) + || (!PyFloat_Check(PySequence_Fast_GET_ITEM(value, 3)) && !PyLong_Check(PySequence_Fast_GET_ITEM(value, 3)))) { + + PyErr_SetString(PyExc_TypeError, "The value must be a sequence of 4 floats or ints between 0.0 and 255.0"); return -1; } // set background color getImageRender(self)->setBackground( - (unsigned char)(PyLong_AsLong(PySequence_Fast_GET_ITEM(value, 0))), - (unsigned char)(PyLong_AsLong(PySequence_Fast_GET_ITEM(value, 1))), - (unsigned char)(PyLong_AsLong(PySequence_Fast_GET_ITEM(value, 2))), - (unsigned char)(PyLong_AsLong(PySequence_Fast_GET_ITEM(value, 3)))); + PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 0)), + PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 1)), + PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 2)), + PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 3))); // success return 0; } @@ -729,7 +761,8 @@ ImageRender::ImageRender (KX_Scene *scene, KX_GameObject *observer, KX_GameObjec m_mirrorX = m_mirrorY.cross(m_mirrorZ); m_render = true; - setBackground(0, 0, 255, 255); + // set mirror background color to scene background color as default + setBackgroundFromScene(m_scene); } |