svn merge ^/trunk/blender -r41226:41227 .
[blender.git] / source / gameengine / VideoTexture / blendVideoTex.cpp
1 /** \file gameengine/VideoTexture/blendVideoTex.cpp
2  *  \ingroup bgevideotex
3  */
4 -----------------------------------------------------------------------------
5 This source file is part of VideoTexture library
6
7 Copyright (c) 2006 The Zdeno Ash Miklas
8
9 This program is free software; you can redistribute it and/or modify it under
10 the terms of the GNU Lesser General Public License as published by the Free Software
11 Foundation; either version 2 of the License, or (at your option) any later
12 version.
13
14 This program is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License along with
19 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
20 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
21 http://www.gnu.org/copyleft/lesser.txt.
22 -----------------------------------------------------------------------------
23 */
24
25 #include <PyObjectPlus.h>
26
27 #include <RAS_GLExtensionManager.h>
28
29 #include <RAS_IPolygonMaterial.h>
30
31 //Old API
32 //#include "TexPlayer.h"
33 //#include "TexImage.h"
34 //#include "TexFrameBuff.h"
35
36 //#include "TexPlayerGL.h"
37
38 #include "ImageBase.h"
39 #include "FilterBase.h"
40 #include "Texture.h"
41
42 #include "Exception.h"
43
44
45 // get material id
46 static PyObject * getMaterialID (PyObject *self, PyObject *args)
47 {
48         // parameters - game object with video texture
49         PyObject * obj = NULL;
50         // material name
51         char * matName;
52
53         // get parameters
54         if (!PyArg_ParseTuple(args, "Os:materialID", &obj, &matName))
55                 return NULL;
56         // get material id
57         short matID = getMaterialID(obj, matName);
58         // if material was not found, report errot
59         if (matID < 0)
60         {
61                 PyErr_SetString(PyExc_RuntimeError, "VideoTexture.materialID(ob, string): Object doesn't have material with given name");
62                 return NULL;
63         }
64         // return material ID
65         return Py_BuildValue("h", matID);
66 }
67
68
69 // get last error description
70 static PyObject * getLastError (PyObject *self, PyObject *args)
71 {
72         return PyUnicode_FromString(Exception::m_lastError.c_str());
73 }
74
75 // set log file
76 static PyObject * setLogFile (PyObject *self, PyObject *args)
77 {
78         // get parameters
79         if (!PyArg_ParseTuple(args, "s:setLogFile", &Exception::m_logFile))
80                 return Py_BuildValue("i", -1);
81         // log file was loaded
82         return Py_BuildValue("i", 0);
83 }
84
85
86 // image to numpy array
87 static PyObject * imageToArray (PyObject * self, PyObject *args)
88 {
89         // parameter is Image object
90         PyObject * pyImg;
91         char *mode = NULL;
92         if (!PyArg_ParseTuple(args, "O|s:imageToArray", &pyImg, &mode) || !pyImageTypes.in(pyImg->ob_type))
93         {
94                 // if object is incorect, report error
95                 PyErr_SetString(PyExc_TypeError, "VideoTexture.imageToArray(image): The value must be a image source object");
96                 return NULL;
97         }
98         // get image structure
99         PyImage * img = reinterpret_cast<PyImage*>(pyImg);
100         return Image_getImage(img, mode);
101 }
102
103
104 // metody modulu
105 static PyMethodDef moduleMethods[] =
106 {
107         {"materialID", getMaterialID, METH_VARARGS, "Gets object's Blender Material ID"},
108         {"getLastError", getLastError, METH_NOARGS, "Gets last error description"},
109         {"setLogFile", setLogFile, METH_VARARGS, "Sets log file name"},
110         {"imageToArray", imageToArray, METH_VARARGS, "get buffer from image source, color channels are selectable"},
111         {NULL}  /* Sentinel */
112 };
113
114 #ifdef WITH_FFMPEG
115 extern PyTypeObject VideoFFmpegType;
116 extern PyTypeObject ImageFFmpegType;
117 #endif
118 extern PyTypeObject FilterBlueScreenType;
119 extern PyTypeObject FilterGrayType;
120 extern PyTypeObject FilterColorType;
121 extern PyTypeObject FilterLevelType;
122 extern PyTypeObject FilterNormalType;
123 extern PyTypeObject FilterRGB24Type;
124 extern PyTypeObject FilterRGBA32Type;
125 extern PyTypeObject FilterBGR24Type;
126 extern PyTypeObject ImageBuffType;
127 extern PyTypeObject ImageMixType;
128 extern PyTypeObject ImageRenderType;
129 extern PyTypeObject ImageMirrorType;
130 extern PyTypeObject ImageViewportType;
131 extern PyTypeObject ImageViewportType;
132
133
134 static void registerAllTypes(void)
135 {
136 #ifdef WITH_FFMPEG
137         pyImageTypes.add(&VideoFFmpegType, "VideoFFmpeg");
138         pyImageTypes.add(&ImageFFmpegType, "ImageFFmpeg");
139 #endif
140         pyImageTypes.add(&ImageBuffType, "ImageBuff");
141         pyImageTypes.add(&ImageMixType, "ImageMix");
142         pyImageTypes.add(&ImageRenderType, "ImageRender");
143         pyImageTypes.add(&ImageMirrorType, "ImageMirror");
144         pyImageTypes.add(&ImageViewportType, "ImageViewport");
145
146         pyFilterTypes.add(&FilterBlueScreenType, "FilterBlueScreen");
147         pyFilterTypes.add(&FilterGrayType, "FilterGray");
148         pyFilterTypes.add(&FilterColorType, "FilterColor");
149         pyFilterTypes.add(&FilterLevelType, "FilterLevel");
150         pyFilterTypes.add(&FilterNormalType, "FilterNormal");
151         pyFilterTypes.add(&FilterRGB24Type, "FilterRGB24");
152         pyFilterTypes.add(&FilterRGBA32Type, "FilterRGBA32");
153         pyFilterTypes.add(&FilterBGR24Type, "FilterBGR24");
154 }
155
156 static struct PyModuleDef VideoTexture_module_def = {
157         {}, /* m_base */
158         "VideoTexture",  /* m_name */
159         "Module that allows to play video files on textures in GameBlender.",  /* m_doc */
160         0,  /* m_size */
161         moduleMethods,  /* m_methods */
162         0,  /* m_reload */
163         0,  /* m_traverse */
164         0,  /* m_clear */
165         0,  /* m_free */
166 };
167
168 PyObject* initVideoTexture(void) 
169 {
170         PyObject * m;
171         
172         // initialize GL extensions
173         //bgl::InitExtensions(0);
174
175         // prepare classes
176         registerAllTypes();
177         registerAllExceptions();
178
179         if (!pyImageTypes.ready())
180                 return NULL;
181         if (!pyFilterTypes.ready()) 
182                 return NULL;
183         if (PyType_Ready(&TextureType) < 0) 
184                 return NULL;
185
186         /* Use existing module where possible
187          * be careful not to init any runtime vars after this */
188         m = PyImport_ImportModule( "VideoTexture" );
189         if(m) {
190                 Py_DECREF(m);
191                 return m;
192         }
193         else {
194                 PyErr_Clear();
195         
196                 m = PyModule_Create(&VideoTexture_module_def);
197                 PyDict_SetItemString(PySys_GetObject("modules"), VideoTexture_module_def.m_name, m);
198         }
199         
200         if (m == NULL) 
201                 return NULL;
202
203         // initialize classes
204         pyImageTypes.reg(m);
205         pyFilterTypes.reg(m);
206
207         Py_INCREF(&TextureType);
208         PyModule_AddObject(m, (char*)"Texture", (PyObject*)&TextureType);
209         
210         // init last error description
211         Exception::m_lastError = "";
212         
213         return m;
214 }
215
216 // registration to Image types, put here because of silly linker bug