style cleanup
[blender.git] / source / gameengine / SceneGraph / SG_ParentRelation.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  * 
27  */
28
29 /** \file SG_ParentRelation.h
30  *  \ingroup bgesg
31  * \page SG_ParentRelationPage SG_ParentRelation   
32
33  * \section SG_ParentRelationSection SG_ParentRelation
34  * 
35  * This is an abstract interface class to the Scene Graph library. 
36  * It allows you to specify how child nodes react to parent nodes.
37  * Normally a child will use it's parent's transforms to compute
38  * it's own global transforms. How this is performed depends on
39  * the type of relation. For example if the parent is a vertex 
40  * parent to this child then the child should not inherit any 
41  * rotation information from the parent. Or if the parent is a
42  * 'slow parent' to this child then the child should react 
43  * slowly to changes in the parent's position. The exact relation
44  * is left for you to implement by filling out this interface 
45  * with concrete examples. 
46  * 
47  * There is exactly one SG_ParentRelation per SG_Node. Subclasses
48  * should not be value types and should be allocated on the heap.
49  *
50  */
51  
52 #ifndef __SG_PARENTRELATION_H__
53 #define __SG_PARENTRELATION_H__
54
55 class SG_Spatial;
56
57 class SG_ParentRelation {
58
59 public :
60         /**
61          * Update the childs local and global coordinates
62          * based upon the parents global coordinates. 
63          * You must also handle the case when this node has no
64          * parent (parent == NULL). Usually you should just 
65          * copy the local coordinates of the child to the 
66          * world coordinates.
67          */ 
68         
69         virtual
70                 bool
71         UpdateChildCoordinates(
72                 SG_Spatial * child,
73                 const SG_Spatial * parent,
74                 bool& parentUpdated
75         ) = 0;
76
77         virtual 
78         ~SG_ParentRelation(
79         ) {};
80
81         /** 
82          * You must provide a way of duplicating an
83          * instance of an SG_ParentRelation. This should
84          * return a pointer to a new duplicate allocated
85          * on the heap. Responsibilty for deleting the 
86          * duplicate resides with the caller of this method.
87          */
88
89         virtual 
90                 SG_ParentRelation *
91         NewCopy(
92         ) = 0;
93
94         /**
95          * Vertex Parent Relation are special: they don't propagate rotation
96          */
97         virtual
98                 bool
99         IsVertexRelation(
100         ) { 
101                 return false;
102         }
103         
104         /**
105          * Need this to see if we are able to adjust time-offset from the python api
106          */
107         virtual
108                 bool
109         IsSlowRelation(
110         ) { 
111                 return false;
112         }
113 protected :
114
115         /** 
116          * Protected constructors 
117          * this class is not meant to be instantiated.
118          */
119
120         SG_ParentRelation(
121         ) {     
122         };
123
124         /**
125          * Copy construction should not be implemented
126          */
127
128         SG_ParentRelation(
129                 const SG_ParentRelation &
130         ); 
131         
132         
133 #ifdef WITH_CXX_GUARDEDALLOC
134 public:
135         void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_ParentRelation"); }
136         void operator delete( void *mem ) { MEM_freeN(mem); }
137 #endif
138 };
139
140 #endif
141