cucumber merge: world scaling + video texture constants
[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 "VideoBase.h"
42 #include "FilterBase.h"
43 #include "Texture.h"
44
45 #include "Exception.h"
46
47
48 // get material id
49 static PyObject * getMaterialID (PyObject *self, PyObject *args)
50 {
51         // parameters - game object with video texture
52         PyObject * obj = NULL;
53         // material name
54         char * matName;
55
56         // get parameters
57         if (!PyArg_ParseTuple(args, "Os:materialID", &obj, &matName))
58                 return NULL;
59         // get material id
60         short matID = getMaterialID(obj, matName);
61         // if material was not found, report errot
62         if (matID < 0)
63         {
64                 PyErr_SetString(PyExc_RuntimeError, "VideoTexture.materialID(ob, string): Object doesn't have material with given name");
65                 return NULL;
66         }
67         // return material ID
68         return Py_BuildValue("h", matID);
69 }
70
71
72 // get last error description
73 static PyObject * getLastError (PyObject *self, PyObject *args)
74 {
75         return PyUnicode_FromString(Exception::m_lastError.c_str());
76 }
77
78 // set log file
79 static PyObject * setLogFile (PyObject *self, PyObject *args)
80 {
81         // get parameters
82         if (!PyArg_ParseTuple(args, "s:setLogFile", &Exception::m_logFile))
83                 return Py_BuildValue("i", -1);
84         // log file was loaded
85         return Py_BuildValue("i", 0);
86 }
87
88
89 // image to numpy array
90 static PyObject * imageToArray (PyObject * self, PyObject *args)
91 {
92         // parameter is Image object
93         PyObject * pyImg;
94         char *mode = NULL;
95         if (!PyArg_ParseTuple(args, "O|s:imageToArray", &pyImg, &mode) || !pyImageTypes.in(Py_TYPE(pyImg)))
96         {
97                 // if object is incorect, report error
98                 PyErr_SetString(PyExc_TypeError, "VideoTexture.imageToArray(image): The value must be a image source object");
99                 return NULL;
100         }
101         // get image structure
102         PyImage * img = reinterpret_cast<PyImage*>(pyImg);
103         return Image_getImage(img, mode);
104 }
105
106
107 // metody modulu
108 static PyMethodDef moduleMethods[] =
109 {
110         {"materialID", getMaterialID, METH_VARARGS, "Gets object's Blender Material ID"},
111         {"getLastError", getLastError, METH_NOARGS, "Gets last error description"},
112         {"setLogFile", setLogFile, METH_VARARGS, "Sets log file name"},
113         {"imageToArray", imageToArray, METH_VARARGS, "get buffer from image source, color channels are selectable"},
114         {NULL}  /* Sentinel */
115 };
116
117 #ifdef WITH_FFMPEG
118 extern PyTypeObject VideoFFmpegType;
119 extern PyTypeObject ImageFFmpegType;
120 #endif
121 extern PyTypeObject FilterBlueScreenType;
122 extern PyTypeObject FilterGrayType;
123 extern PyTypeObject FilterColorType;
124 extern PyTypeObject FilterLevelType;
125 extern PyTypeObject FilterNormalType;
126 extern PyTypeObject FilterRGB24Type;
127 extern PyTypeObject FilterRGBA32Type;
128 extern PyTypeObject FilterBGR24Type;
129 extern PyTypeObject ImageBuffType;
130 extern PyTypeObject ImageMixType;
131 extern PyTypeObject ImageRenderType;
132 extern PyTypeObject ImageMirrorType;
133 extern PyTypeObject ImageViewportType;
134 extern PyTypeObject ImageViewportType;
135
136
137 static void registerAllTypes(void)
138 {
139 #ifdef WITH_FFMPEG
140         pyImageTypes.add(&VideoFFmpegType, "VideoFFmpeg");
141         pyImageTypes.add(&ImageFFmpegType, "ImageFFmpeg");
142 #endif
143         pyImageTypes.add(&ImageBuffType, "ImageBuff");
144         pyImageTypes.add(&ImageMixType, "ImageMix");
145         pyImageTypes.add(&ImageRenderType, "ImageRender");
146         pyImageTypes.add(&ImageMirrorType, "ImageMirror");
147         pyImageTypes.add(&ImageViewportType, "ImageViewport");
148
149         pyFilterTypes.add(&FilterBlueScreenType, "FilterBlueScreen");
150         pyFilterTypes.add(&FilterGrayType, "FilterGray");
151         pyFilterTypes.add(&FilterColorType, "FilterColor");
152         pyFilterTypes.add(&FilterLevelType, "FilterLevel");
153         pyFilterTypes.add(&FilterNormalType, "FilterNormal");
154         pyFilterTypes.add(&FilterRGB24Type, "FilterRGB24");
155         pyFilterTypes.add(&FilterRGBA32Type, "FilterRGBA32");
156         pyFilterTypes.add(&FilterBGR24Type, "FilterBGR24");
157 }
158
159 static struct PyModuleDef VideoTexture_module_def = {
160         {}, /* m_base */
161         "VideoTexture",  /* m_name */
162         "Module that allows to play video files on textures in GameBlender.",  /* m_doc */
163         0,  /* m_size */
164         moduleMethods,  /* m_methods */
165         0,  /* m_reload */
166         0,  /* m_traverse */
167         0,  /* m_clear */
168         0,  /* m_free */
169 };
170
171 PyObject* initVideoTexture(void) 
172 {
173         PyObject * m;
174         
175         // initialize GL extensions
176         //bgl::InitExtensions(0);
177
178         // prepare classes
179         registerAllTypes();
180         registerAllExceptions();
181
182         if (!pyImageTypes.ready())
183                 return NULL;
184         if (!pyFilterTypes.ready()) 
185                 return NULL;
186         if (PyType_Ready(&TextureType) < 0) 
187                 return NULL;
188
189         /* Use existing module where possible
190          * be careful not to init any runtime vars after this */
191         m = PyImport_ImportModule( "VideoTexture" );
192         if(m) {
193                 Py_DECREF(m);
194                 return m;
195         }
196         else {
197                 PyErr_Clear();
198         
199                 m = PyModule_Create(&VideoTexture_module_def);
200                 PyDict_SetItemString(PySys_GetObject("modules"), VideoTexture_module_def.m_name, m);
201         }
202         
203         if (m == NULL) 
204                 return NULL;
205
206         // initialize classes
207         pyImageTypes.reg(m);
208         pyFilterTypes.reg(m);
209
210         Py_INCREF(&TextureType);
211         PyModule_AddObject(m, (char*)"Texture", (PyObject*)&TextureType);
212         PyModule_AddIntConstant(m, (char*)"SOURCE_ERROR", SourceError);
213         PyModule_AddIntConstant(m, (char*)"SOURCE_EMPTY", SourceEmpty);
214         PyModule_AddIntConstant(m, (char*)"SOURCE_READY", SourceReady);
215         PyModule_AddIntConstant(m, (char*)"SOURCE_PLAYING", SourcePlaying);
216         PyModule_AddIntConstant(m, (char*)"SOURCE_STOPPED", SourceStopped);
217         
218         // init last error description
219         Exception::m_lastError = "";
220         
221         return m;
222 }
223
224 // registration to Image types, put here because of silly linker bug