Ghost Context Refactor
[blender-staging.git] / source / gameengine / VideoTexture / ImageRender.cpp
index 2cc2cfb6bfc70d83d6989303879d58697c214427..617e7fd1d8e5bb51a8d04c40249cf2bebf036d29 100644 (file)
@@ -1,24 +1,28 @@
 /*
------------------------------------------------------------------------------
-This source file is part of VideoTexture library
-
-Copyright (c) 2007 The Zdeno Ash Miklas
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU Lesser General Public License as published by the Free Software
-Foundation; either version 2 of the License, or (at your option) any later
-version.
-
-This program is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License along with
-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-Place - Suite 330, Boston, MA 02111-1307, USA, or go to
-http://www.gnu.org/copyleft/lesser.txt.
------------------------------------------------------------------------------
-*/
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software  Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright (c) 2007 The Zdeno Ash Miklas
+ *
+ * This source file is part of VideoTexture library
+ *
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
 
 /** \file gameengine/VideoTexture/ImageRender.cpp
  *  \ingroup bgevideotex
@@ -32,12 +36,13 @@ http://www.gnu.org/copyleft/lesser.txt.
 #include <math.h>
 
 
-#include "GL/glew.h"
+#include "glew-mx.h"
 
 #include "KX_PythonInit.h"
 #include "DNA_scene_types.h"
 #include "RAS_CameraData.h"
 #include "RAS_MeshObject.h"
+#include "RAS_Polygon.h"
 #include "BLI_math.h"
 
 #include "ImageRender.h"
@@ -48,17 +53,17 @@ http://www.gnu.org/copyleft/lesser.txt.
 
 ExceptionID SceneInvalid, CameraInvalid, ObserverInvalid;
 ExceptionID MirrorInvalid, MirrorSizeInvalid, MirrorNormalInvalid, MirrorHorizontal, MirrorTooSmall;
-ExpDesc SceneInvalidDesc (SceneInvalid, "Scene object is invalid");
-ExpDesc CameraInvalidDesc (CameraInvalid, "Camera object is invalid");
-ExpDesc ObserverInvalidDesc (ObserverInvalid, "Observer object is invalid");
-ExpDesc MirrorInvalidDesc (MirrorInvalid, "Mirror object is invalid");
-ExpDesc MirrorSizeInvalidDesc (MirrorSizeInvalid, "Mirror has no vertex or no size");
-ExpDesc MirrorNormalInvalidDesc (MirrorNormalInvalid, "Cannot determine mirror plane");
-ExpDesc MirrorHorizontalDesc (MirrorHorizontal, "Mirror is horizontal in local space");
-ExpDesc MirrorTooSmallDesc (MirrorTooSmall, "Mirror is too small");
+ExpDesc SceneInvalidDesc(SceneInvalid, "Scene object is invalid");
+ExpDesc CameraInvalidDesc(CameraInvalid, "Camera object is invalid");
+ExpDesc ObserverInvalidDesc(ObserverInvalid, "Observer object is invalid");
+ExpDesc MirrorInvalidDesc(MirrorInvalid, "Mirror object is invalid");
+ExpDesc MirrorSizeInvalidDesc(MirrorSizeInvalid, "Mirror has no vertex or no size");
+ExpDesc MirrorNormalInvalidDesc(MirrorNormalInvalid, "Cannot determine mirror plane");
+ExpDesc MirrorHorizontalDesc(MirrorHorizontal, "Mirror is horizontal in local space");
+ExpDesc MirrorTooSmallDesc(MirrorTooSmall, "Mirror is too small");
 
 // constructor
-ImageRender::ImageRender (KX_Scene * scene, KX_Camera * camera) : 
+ImageRender::ImageRender (KX_Scene *scene, KX_Camera * camera) :
     ImageViewport(),
     m_render(true),
     m_scene(scene),
@@ -66,7 +71,9 @@ ImageRender::ImageRender (KX_Scene * scene, KX_Camera * camera) :
     m_owncamera(false),
     m_observer(NULL),
     m_mirror(NULL),
-    m_clip(100.f)
+    m_clip(100.f),
+    m_mirrorHalfWidth(0.f),
+    m_mirrorHalfHeight(0.f)
 {
        // initialize background color
        setBackground(0, 0, 255, 255);
@@ -74,7 +81,6 @@ ImageRender::ImageRender (KX_Scene * scene, KX_Camera * camera) :
        m_engine = KX_GetActiveEngine();
        m_rasterizer = m_engine->GetRasterizer();
        m_canvas = m_engine->GetCanvas();
-       m_rendertools = m_engine->GetRenderTools();
 }
 
 // destructor
@@ -193,10 +199,9 @@ void ImageRender::Render()
        m_canvas->SetViewPort(m_position[0], m_position[1], m_position[0]+m_capSize[0]-1, m_position[1]+m_capSize[1]-1);
        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(RAS_IRasterizer::KX_TEXTURED,m_engine->GetClockTime());
-       m_rendertools->BeginFrame(m_rasterizer);
+       m_rasterizer->BeginFrame(m_engine->GetClockTime());
        m_engine->SetWorldSettings(m_scene->GetWorldInfo());
-       m_rendertools->SetAuxilaryClientInfo(m_scene);
+       m_rasterizer->SetAuxilaryClientInfo(m_scene);
        m_rasterizer->DisplayFog();
        // matrix calculation, don't apply any of the stereo mode
        m_rasterizer->SetStereoMode(RAS_IRasterizer::RAS_STEREO_NOSTEREO);
@@ -269,7 +274,11 @@ void ImageRender::Render()
 
        m_scene->CalculateVisibleMeshes(m_rasterizer,m_camera);
 
-       m_scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+       m_scene->UpdateAnimations(m_engine->GetFrameTime());
+
+       m_scene->RenderBuckets(camtrans, m_rasterizer);
+
+       m_scene->RenderFonts();
 
        // restore the canvas area now that the render is completed
        m_canvas->GetWindowArea() = area;
@@ -284,18 +293,18 @@ inline ImageRender * getImageRender (PyImage *self)
 // python methods
 
 // Blender Scene type
-BlendType<KX_Scene> sceneType ("KX_Scene");
+static BlendType<KX_Scene> sceneType ("KX_Scene");
 // Blender Camera type
-BlendType<KX_Camera> cameraType ("KX_Camera");
+static BlendType<KX_Camera> cameraType ("KX_Camera");
 
 
 // object initialization
-static int ImageRender_init (PyObject *pySelf, PyObject *args, PyObject *kwds)
+static int ImageRender_init(PyObject *pySelf, PyObject *args, PyObject *kwds)
 {
        // parameters - scene object
        PyObject *scene;
        // camera object
-       PyObject * camera;
+       PyObject *camera;
        // parameter keywords
        static const char *kwlist[] = {"sceneObj", "cameraObj", NULL};
        // get parameters
@@ -343,7 +352,7 @@ static PyObject *getBackground (PyImage *self, void *closure)
 }
 
 // set color
-static int setBackground (PyImage *self, PyObject *value, void *closure)
+static int setBackground(PyImage *self, PyObject *value, void *closure)
 {
        // check validity of parameter
        if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 4
@@ -356,10 +365,11 @@ static int setBackground (PyImage *self, PyObject *value, void *closure)
                return -1;
        }
        // set background color
-       getImageRender(self)->setBackground((unsigned char)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 0))),
-               (unsigned char)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 1))),
-               (unsigned char)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 2))),
-               (unsigned char)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 3))));
+       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))));
        // success
        return 0;
 }
@@ -393,8 +403,7 @@ static PyGetSetDef imageRenderGetSets[] =
 
 
 // define python type
-PyTypeObject ImageRenderType =
-{ 
+PyTypeObject ImageRenderType = {
        PyVarObject_HEAD_INIT(NULL, 0)
        "VideoTexture.ImageRender",   /*tp_name*/
        sizeof(PyImage),          /*tp_basicsize*/
@@ -436,7 +445,7 @@ PyTypeObject ImageRenderType =
 };
 
 // object initialization
-static int ImageMirror_init (PyObject *pySelf, PyObject *args, PyObject *kwds)
+static int ImageMirror_init(PyObject *pySelf, PyObject *args, PyObject *kwds)
 {
        // parameters - scene object
        PyObject *scene;
@@ -518,7 +527,7 @@ static PyObject *getClip (PyImage *self, void *closure)
 }
 
 // set clip
-static int setClip (PyImage *self, PyObject *value, void *closure)
+static int setClip(PyImage *self, PyObject *value, void *closure)
 {
        // check validity of parameter
        double clip;
@@ -557,7 +566,7 @@ static PyGetSetDef imageMirrorGetSets[] =
 
 
 // constructor
-ImageRender::ImageRender (KX_Scene * scene, KX_GameObject * observer, KX_GameObject * mirror, RAS_IPolyMaterial * mat) :
+ImageRender::ImageRender (KX_Scene *scene, KX_GameObject *observer, KX_GameObject *mirror, RAS_IPolyMaterial *mat) :
     ImageViewport(),
     m_render(false),
     m_scene(scene),
@@ -587,7 +596,6 @@ ImageRender::ImageRender (KX_Scene * scene, KX_GameObject * observer, KX_GameObj
        m_engine = KX_GetActiveEngine();
        m_rasterizer = m_engine->GetRasterizer();
        m_canvas = m_engine->GetCanvas();
-       m_rendertools = m_engine->GetRenderTools();
        // locate the vertex assigned to mat and do following calculation in mesh coordinates
        for (int meshIndex = 0; meshIndex < mirror->GetMeshCount(); meshIndex++)
        {
@@ -728,8 +736,7 @@ ImageRender::ImageRender (KX_Scene * scene, KX_GameObject * observer, KX_GameObj
 
 
 // define python type
-PyTypeObject ImageMirrorType =
-{ 
+PyTypeObject ImageMirrorType = {
        PyVarObject_HEAD_INIT(NULL, 0)
        "VideoTexture.ImageMirror",   /*tp_name*/
        sizeof(PyImage),          /*tp_basicsize*/