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