svn merge ^/trunk/blender -r41226:41227 .
[blender.git] / source / gameengine / VideoTexture / BlendType.h
1 -----------------------------------------------------------------------------
2 This source file is part of VideoTexture library
3
4 Copyright (c) 2006 The Zdeno Ash Miklas
5
6 This program is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the Free Software
8 Foundation; either version 2 of the License, or (at your option) any later
9 version.
10
11 This program is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along with
16 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
17 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
18 http://www.gnu.org/copyleft/lesser.txt.
19 -----------------------------------------------------------------------------
20 */
21
22 /** \file BlendType.h
23  *  \ingroup bgevideotex
24  */
25  
26 #if !defined BLENDTYPE_H
27 #define BLENDTYPE_H
28
29
30 /// class allows check type of blender python object and access its contained object
31 /// MUST ONLY BE USED FOR KX classes that are descendent of PyObjectPlus
32 template <class PyObj> class BlendType
33 {
34 public:
35         /// constructor
36         BlendType (const char * name) : m_name(name) {}
37
38         /// check blender type and return pointer to contained object or NULL (if type is not valid)
39         PyObj * checkType (PyObject * obj)
40         {
41                 // if pointer to type isn't set 
42                 if (m_objType == NULL)
43                 {
44                         // compare names of type
45                         if (strcmp(obj->ob_type->tp_name, m_name) == 0)
46                                 // if name of type match, save pointer to type
47                                 m_objType = obj->ob_type;
48                         else
49                                 // if names of type don't match, return NULL
50                                 return NULL;
51                 }
52                 // if pointer to type is set and don't match to type of provided object, return NULL
53                 else if (obj->ob_type != m_objType) 
54                         return NULL;
55                 // return pointer to object, this class can only be used for KX object =>
56                 // the Py object is actually a proxy
57                 return (PyObj*)BGE_PROXY_REF(obj);
58         }
59
60         /// parse arguments to get object
61         PyObj * parseArg (PyObject * args)
62         {
63                 // parse arguments
64                 PyObject * obj;
65                 if (PyArg_ParseTuple(args, "O", &obj))
66                         // if successfully parsed, return pointer to object
67                         return checkType(obj);
68                 // otherwise return NULL
69                 return NULL;
70         }
71
72 protected:
73         /// name of Python type
74         const char * m_name;
75         /// pointer to Python type
76         PyTypeObject * m_objType;
77 };
78
79
80 #endif