VideoTexture: Bug report #17946: add (char*) casting to fix compile error with Python...
[blender.git] / source / gameengine / VideoTexture / blendVideoTex.cpp
1 /* $Id$
2 -----------------------------------------------------------------------------
3 This source file is part of VideoTexure 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 #include <PyObjectPlus.h>
24
25 #include <RAS_GLExtensionManager.h>
26
27 #include <RAS_IPolygonMaterial.h>
28
29 //Old API
30 //#include "TexPlayer.h"
31 //#include "TexImage.h"
32 //#include "TexFrameBuff.h"
33
34 //#include "TexPlayerGL.h"
35
36 #include "ImageBase.h"
37 #include "FilterBase.h"
38 #include "Texture.h"
39
40 #include "Exception.h"
41
42
43 // get material id
44 static PyObject * getMaterialID (PyObject *self, PyObject *args)
45 {
46         // parameters - game object with video texture
47         PyObject * obj = NULL;
48         // material name
49         char * matName;
50
51         // get parameters
52         if (!PyArg_ParseTuple(args, "Os", &obj, &matName))
53                 return NULL;
54         // get material id
55         short matID = getMaterialID(obj, matName);
56         // if material was not found, report errot
57         if (matID < 0)
58         {
59                 PyErr_SetString(PyExc_RuntimeError, "object doesn't have material with given name");
60                 return NULL;
61         }
62         // return material ID
63         return Py_BuildValue("h", matID);
64 }
65
66
67 // get last error description
68 static PyObject * getLastError (PyObject *self, PyObject *args)
69 {
70         return Py_BuildValue("s", Exception::m_lastError.c_str());
71 }
72
73 // set log file
74 static PyObject * setLogFile (PyObject *self, PyObject *args)
75 {
76         // get parameters
77         if (!PyArg_ParseTuple(args, "s", &Exception::m_logFile))
78                 return Py_BuildValue("i", -1);
79         // log file was loaded
80         return Py_BuildValue("i", 0);
81 }
82
83
84 // image to numpy array
85 static PyObject * imageToArray (PyObject * self, PyObject *args)
86 {
87         // parameter is Image object
88         PyObject * pyImg;
89         if (!PyArg_ParseTuple(args, "O", &pyImg) || !pyImageTypes.in(pyImg->ob_type))
90         {
91                 // if object is incorect, report error
92                 PyErr_SetString(PyExc_TypeError, "The value must be a image source object");
93                 return NULL;
94         }
95         // get image structure
96         PyImage * img = reinterpret_cast<PyImage*>(pyImg);
97         // create array object
98         unsigned int * imgBuff = img->m_image->getImage();
99         // if image is available, convert it to array
100         if (imgBuff != NULL)
101         // Nasty problem here: the image buffer is an array of integers 
102         // in the processor endian format. The user must take care of that in the script. 
103         // Need to find an elegant solution to this problem 
104         return Py_BuildValue("s#", imgBuff, img->m_image->getBuffSize());
105         // otherwise return None
106         Py_RETURN_NONE;
107 }
108
109
110 // metody modulu
111 static PyMethodDef moduleMethods[] =
112 {
113         {"materialID", getMaterialID, METH_VARARGS, "Gets object's Blender Material ID"},
114         {"getLastError", getLastError, METH_NOARGS, "Gets last error description"},
115         {"setLogFile", setLogFile, METH_VARARGS, "Sets log file name"},
116         {"imageToArray", imageToArray, METH_VARARGS, "get array from image source"},
117         {NULL}  /* Sentinel */
118 };
119
120 #if WITH_FFMPEG
121 extern PyTypeObject VideoFFmpegType;
122 #endif
123 extern PyTypeObject FilterBlueScreenType;
124 extern PyTypeObject FilterGrayType;
125 extern PyTypeObject FilterColorType;
126 extern PyTypeObject FilterLevelType;
127 extern PyTypeObject FilterNormalType;
128 extern PyTypeObject FilterRGB24Type;
129 extern PyTypeObject FilterBGR24Type;
130 extern PyTypeObject ImageBuffType;
131 extern PyTypeObject ImageMixType;
132 extern PyTypeObject ImageRenderType;
133 extern PyTypeObject ImageViewportType;
134 extern PyTypeObject ImageViewportType;
135
136
137 static void registerAllTypes(void)
138 {
139 #if WITH_FFMPEG
140         pyImageTypes.add(&VideoFFmpegType, "VideoFFmpeg");
141 #endif
142         pyImageTypes.add(&ImageBuffType, "ImageBuff");
143         pyImageTypes.add(&ImageMixType, "ImageMix");
144         //pyImageTypes.add(&ImageRenderType, "ImageRender");
145         pyImageTypes.add(&ImageViewportType, "ImageViewport");
146
147         pyFilterTypes.add(&FilterBlueScreenType, "FilterBlueScreen");
148         pyFilterTypes.add(&FilterGrayType, "FilterGray");
149         pyFilterTypes.add(&FilterColorType, "FilterColor");
150         pyFilterTypes.add(&FilterLevelType, "FilterLevel");
151         pyFilterTypes.add(&FilterNormalType, "FilterNormal");
152         pyFilterTypes.add(&FilterRGB24Type, "FilterRGB24");
153         pyFilterTypes.add(&FilterBGR24Type, "FilterBGR24");
154 }
155
156 PyObject* initVideoTexture(void) 
157 {
158         // initialize GL extensions
159         //bgl::InitExtensions(0);
160
161         // prepare classes
162         registerAllTypes();
163     registerAllExceptions();
164
165         if (!pyImageTypes.ready()) 
166                 return NULL;
167         if (!pyFilterTypes.ready()) 
168                 return NULL;
169         if (PyType_Ready(&TextureType) < 0) 
170                 return NULL;
171
172         PyObject * m = Py_InitModule4("VideoTexture", moduleMethods,
173                 "Module that allows to play video files on textures in GameBlender.",
174                 (PyObject*)NULL,PYTHON_API_VERSION);
175         if (m == NULL) 
176                 return NULL;
177
178         // initialize classes
179         pyImageTypes.reg(m);
180         pyFilterTypes.reg(m);
181
182         Py_INCREF(&TextureType);
183         PyModule_AddObject(m, (char*)"Texture", (PyObject*)&TextureType);
184
185         // init last error description
186         Exception::m_lastError[0] = '\0';
187         return m;
188 }
189
190 // registration to Image types, put here because of silly linker bug