Coin Logo Coin3D is Free Software,
published under the BSD 3-clause license.
https://bitbucket.org/Coin3D/
http://www.kongsberg.com/kogt/
SoSubKit.h
1#ifndef COIN_SOSUBKIT_H
2#define COIN_SOSUBKIT_H
3
4/**************************************************************************\
5 * Copyright (c) Kongsberg Oil & Gas Technologies AS
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are
10 * met:
11 *
12 * Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
14 *
15 * Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * Neither the name of the copyright holder nor the names of its
20 * contributors may be used to endorse or promote products derived from
21 * this software without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34\**************************************************************************/
35
36#include <Inventor/nodes/SoSubNode.h>
37#include <Inventor/fields/SoSFNode.h>
38#include <Inventor/nodekits/SoNodekitCatalog.h>
39#include <Inventor/C/tidbits.h>
40
41#ifndef COIN_INTERNAL
42// Include this header file for better Open Inventor compatibility.
43#include <Inventor/nodekits/SoNodeKitListPart.h>
44#endif // !COIN_INTERNAL
45
46
47// FIXME: document all the macros, as they are part of the public
48// API. 20011024 mortene.
49
50#define PRIVATE_KIT_HEADER(_kitclass_) \
51public: \
52 static const SoNodekitCatalog * getClassNodekitCatalog(void); \
53 virtual const SoNodekitCatalog * getNodekitCatalog(void) const; \
54 \
55protected: \
56 static const SoNodekitCatalog ** getClassNodekitCatalogPtr(void); \
57 \
58private: \
59 static SoNodekitCatalog * classcatalog; \
60 static const SoNodekitCatalog ** parentcatalogptr; \
61 static void atexit_cleanupkit(void)
62
63#define SO_KIT_HEADER(_kitclass_) \
64 SO_NODE_HEADER(_kitclass_); \
65 PRIVATE_KIT_HEADER(_kitclass_)
66
67#define SO_KIT_ABSTRACT_HEADER(_kitclass_) \
68 SO_NODE_ABSTRACT_HEADER(_kitclass_); \
69 PRIVATE_KIT_HEADER(_kitclass_)
70
71#define SO_KIT_CATALOG_ENTRY_HEADER(_entry_) \
72protected: SoSFNode _entry_
73
74
75#define PRIVATE_KIT_SOURCE(_class_) \
76SoNodekitCatalog * _class_::classcatalog = NULL; \
77const SoNodekitCatalog ** _class_::parentcatalogptr = NULL; \
78 \
79const SoNodekitCatalog * \
80_class_::getClassNodekitCatalog(void) \
81{ \
82 return _class_::classcatalog; \
83} \
84 \
85const SoNodekitCatalog * \
86_class_::getNodekitCatalog(void) const \
87{ \
88 return _class_::classcatalog; \
89} \
90 \
91const SoNodekitCatalog ** \
92_class_::getClassNodekitCatalogPtr(void) \
93{ \
94 return const_cast<const class SoNodekitCatalog **>(&_class_::classcatalog); \
95} \
96 \
97void \
98_class_::atexit_cleanupkit(void) \
99{ \
100 delete _class_::classcatalog; \
101 _class_::classcatalog = NULL; \
102 _class_::parentcatalogptr = NULL; \
103}
104
105#define SO_KIT_SOURCE(_class_) \
106SO_NODE_SOURCE(_class_) \
107PRIVATE_KIT_SOURCE(_class_)
108
109#define SO_KIT_ABSTRACT_SOURCE(_class_) \
110SO_NODE_ABSTRACT_SOURCE(_class_); \
111PRIVATE_KIT_SOURCE(_class_)
112
113#define SO_KIT_IS_FIRST_INSTANCE() \
114 SO_NODE_IS_FIRST_INSTANCE()
115
116#define SO_KIT_INIT_CLASS(_class_, _parentclass_, _parentname_) \
117 do { \
118 SO_NODE_INIT_CLASS(_class_, _parentclass_, _parentname_); \
119 _class_::parentcatalogptr = _parentclass_::getClassNodekitCatalogPtr(); \
120 } WHILE_0
121
122#define SO_KIT_INIT_ABSTRACT_CLASS(_class_, _parentclass_, _parentname_) \
123 do { \
124 SO_NODE_INIT_ABSTRACT_CLASS(_class_, _parentclass_, _parentname_); \
125 _class_::parentcatalogptr = _parentclass_::getClassNodekitCatalogPtr(); \
126 } WHILE_0
127
128
129#define SO_KIT_CONSTRUCTOR(_class_) \
130 do { \
131 SO_NODE_CONSTRUCTOR(_class_); \
132 SoBase::staticDataLock(); \
133 if (_class_::classcatalog == NULL) { \
134 SoType mytype = SoType::fromName(SO__QUOTE(_class_)); \
135 _class_::classcatalog = (*_class_::parentcatalogptr)->clone(mytype); \
136 cc_coin_atexit_static_internal(_class_::atexit_cleanupkit); \
137 } \
138 SoBase::staticDataUnlock(); \
139 } WHILE_0
140
141
142
143#define SO_KIT_ADD_CATALOG_ENTRY(_part_, _partclass_, _isdefnull_ , _parent_, _sibling_, _ispublic_) \
144 do { \
145 classcatalog->addEntry(SO__QUOTE(_part_), \
146 SoType::fromName(SO__QUOTE(_partclass_)), \
147 SoType::fromName(SO__QUOTE(_partclass_)), \
148 _isdefnull_, \
149 SO__QUOTE(_parent_), \
150 SO__QUOTE(_sibling_), \
151 FALSE, \
152 SoType::badType(), \
153 SoType::badType(), \
154 _ispublic_); \
155 SO_NODE_ADD_FIELD(_part_,(NULL)); \
156 } WHILE_0
157
158
159
160#define SO_KIT_ADD_CATALOG_LIST_ENTRY(_part_, _containertype_, _isdefnull_, _parent_, _sibling_, _itemtype_, _ispublic_) \
161 do { \
162 classcatalog->addEntry(SO__QUOTE(_part_), \
163 SoNodeKitListPart::getClassTypeId(), \
164 SoNodeKitListPart::getClassTypeId(), \
165 _isdefnull_, \
166 SO__QUOTE(_parent_), \
167 SO__QUOTE(_sibling_), \
168 TRUE, \
169 _containertype_::getClassTypeId(), \
170 _itemtype_::getClassTypeId(), \
171 _ispublic_); \
172 SO_NODE_ADD_FIELD(_part_,(NULL)); \
173 } WHILE_0
174
175
176
177#define SO_KIT_ADD_CATALOG_ABSTRACT_ENTRY(_part_, _class_, _defaultclass_, _isdefnull_, _parent_, _sibling_, _ispublic_) \
178 do { \
179 classcatalog->addEntry(SO__QUOTE(_part_), \
180 _class_::getClassTypeId(), \
181 _defaultclass_::getClassTypeId(), \
182 _isdefnull_, \
183 SO__QUOTE(_parent_), \
184 SO__QUOTE(_sibling_), \
185 FALSE, \
186 SoType::badType(), \
187 SoType::badType(), \
188 _ispublic_); \
189 SO_NODE_ADD_FIELD(_part_,(NULL)); \
190 } WHILE_0
191
192
193
194#define SO_KIT_ADD_LIST_ITEM_TYPE(_part_, _listitemtype_) \
195 do { \
196 classcatalog->addListItemType(SO__QUOTE(_part_), \
197 _listitemtype_::getClassTypeId()); \
198 } WHILE_0
199
200
201#define SO_KIT_INIT_INSTANCE() \
202 this->createFieldList(); \
203 this->createDefaultParts()
204
205#define SO_KIT_ADD_FIELD(_fieldname_, _defvalue_) \
206 SO_NODE_ADD_FIELD(_fieldname_, _defvalue_)
207
208// New for Coin-3
209#define SO_KIT_ADD_EMPTY_MFIELD(_fieldname_) \
210 SO_NODE_ADD_EMPTY_MFIELD(_fieldname_)
211
212#define SO_KIT_DEFINE_ENUM_VALUE(_enumtype_, _enumvalue_) \
213 SO_NODE_DEFINE_ENUM_VALUE(_enumtype_, _enumvalue_)
214
215#define SO_KIT_SET_MF_ENUM_TYPE(_fieldname_, _enumtype_) \
216 SO_NODE_SET_MF_ENUM_TYPE(_fieldname_, _enumtype_)
217
218#define SO_KIT_SET_SF_ENUM_TYPE(_fieldname_, _enumtype_) \
219 SO_NODE_SET_SF_ENUM_TYPE(_fieldname_, _enumtype_)
220
221#define SO_KIT_CHANGE_ENTRY_TYPE(_part_, _newpartclassname_, _newdefaultpartclassname_) \
222 do { \
223 classcatalog->narrowTypes(SO__QUOTE(_part_), \
224 SoType::fromName(SO__QUOTE(_newpartclassname_)), \
225 SoType::fromName(SO__QUOTE(_newdefaultpartclassname_))); \
226 } WHILE_0
227
228
229#define SO_KIT_CHANGE_NULL_BY_DEFAULT(_part_, _newnullbydefault_) \
230 do { \
231 classcatalog->setNullByDefault(SO__QUOTE(_part_), _newnullbydefault_); \
232 } WHILE_0
233
234#endif // !COIN_SOSUBKIT_H