Coin Logo Coin3D is Free Software,
published under the BSD 3-clause license.
https://coin3d.github.io
https://www.kongsberg.com/en/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_) \
51 public: \
52  static const SoNodekitCatalog * getClassNodekitCatalog(void); \
53  virtual const SoNodekitCatalog * getNodekitCatalog(void) const; \
54  \
55 protected: \
56  static const SoNodekitCatalog ** getClassNodekitCatalogPtr(void); \
57  \
58 private: \
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_) \
72 protected: SoSFNode _entry_
73 
74 
75 #define PRIVATE_KIT_SOURCE(_class_) \
76 SoNodekitCatalog * _class_::classcatalog = NULL; \
77 const SoNodekitCatalog ** _class_::parentcatalogptr = NULL; \
78  \
79  \
83 const SoNodekitCatalog * \
84 _class_::getClassNodekitCatalog(void) \
85 { \
86  return _class_::classcatalog; \
87 } \
88  \
89  \
93 const SoNodekitCatalog * \
94 _class_::getNodekitCatalog(void) const \
95 { \
96  return _class_::classcatalog; \
97 } \
98  \
99  \
103 const SoNodekitCatalog ** \
104 _class_::getClassNodekitCatalogPtr(void) \
105 { \
106  return const_cast<const class SoNodekitCatalog **>(&_class_::classcatalog); \
107 } \
108  \
109 void \
110 _class_::atexit_cleanupkit(void) \
111 { \
112  delete _class_::classcatalog; \
113  _class_::classcatalog = NULL; \
114  _class_::parentcatalogptr = NULL; \
115 }
116 
117 #define SO_KIT_SOURCE(_class_) \
118 SO_NODE_SOURCE(_class_) \
119 PRIVATE_KIT_SOURCE(_class_)
120 
121 #define SO_KIT_ABSTRACT_SOURCE(_class_) \
122 SO_NODE_ABSTRACT_SOURCE(_class_); \
123 PRIVATE_KIT_SOURCE(_class_)
124 
125 #define SO_KIT_IS_FIRST_INSTANCE() \
126  SO_NODE_IS_FIRST_INSTANCE()
127 
128 #define SO_KIT_INIT_CLASS(_class_, _parentclass_, _parentname_) \
129  do { \
130  SO_NODE_INIT_CLASS(_class_, _parentclass_, _parentname_); \
131  _class_::parentcatalogptr = _parentclass_::getClassNodekitCatalogPtr(); \
132  } WHILE_0
133 
134 #define SO_KIT_INIT_ABSTRACT_CLASS(_class_, _parentclass_, _parentname_) \
135  do { \
136  SO_NODE_INIT_ABSTRACT_CLASS(_class_, _parentclass_, _parentname_); \
137  _class_::parentcatalogptr = _parentclass_::getClassNodekitCatalogPtr(); \
138  } WHILE_0
139 
140 
141 #define SO_KIT_CONSTRUCTOR(_class_) \
142  do { \
143  SO_NODE_CONSTRUCTOR(_class_); \
144  SoBase::staticDataLock(); \
145  if (_class_::classcatalog == NULL) { \
146  SoType mytype = SoType::fromName(SO__QUOTE(_class_)); \
147  _class_::classcatalog = (*_class_::parentcatalogptr)->clone(mytype); \
148  cc_coin_atexit_static_internal(_class_::atexit_cleanupkit); \
149  } \
150  SoBase::staticDataUnlock(); \
151  } WHILE_0
152 
153 
154 
155 #define SO_KIT_ADD_CATALOG_ENTRY(_part_, _partclass_, _isdefnull_ , _parent_, _sibling_, _ispublic_) \
156  do { \
157  classcatalog->addEntry(SO__QUOTE(_part_), \
158  SoType::fromName(SO__QUOTE(_partclass_)), \
159  SoType::fromName(SO__QUOTE(_partclass_)), \
160  _isdefnull_, \
161  SO__QUOTE(_parent_), \
162  SO__QUOTE(_sibling_), \
163  FALSE, \
164  SoType::badType(), \
165  SoType::badType(), \
166  _ispublic_); \
167  SO_NODE_ADD_FIELD(_part_,(NULL)); \
168  } WHILE_0
169 
170 
171 
172 #define SO_KIT_ADD_CATALOG_LIST_ENTRY(_part_, _containertype_, _isdefnull_, _parent_, _sibling_, _itemtype_, _ispublic_) \
173  do { \
174  classcatalog->addEntry(SO__QUOTE(_part_), \
175  SoNodeKitListPart::getClassTypeId(), \
176  SoNodeKitListPart::getClassTypeId(), \
177  _isdefnull_, \
178  SO__QUOTE(_parent_), \
179  SO__QUOTE(_sibling_), \
180  TRUE, \
181  _containertype_::getClassTypeId(), \
182  _itemtype_::getClassTypeId(), \
183  _ispublic_); \
184  SO_NODE_ADD_FIELD(_part_,(NULL)); \
185  } WHILE_0
186 
187 
188 
189 #define SO_KIT_ADD_CATALOG_ABSTRACT_ENTRY(_part_, _class_, _defaultclass_, _isdefnull_, _parent_, _sibling_, _ispublic_) \
190  do { \
191  classcatalog->addEntry(SO__QUOTE(_part_), \
192  _class_::getClassTypeId(), \
193  _defaultclass_::getClassTypeId(), \
194  _isdefnull_, \
195  SO__QUOTE(_parent_), \
196  SO__QUOTE(_sibling_), \
197  FALSE, \
198  SoType::badType(), \
199  SoType::badType(), \
200  _ispublic_); \
201  SO_NODE_ADD_FIELD(_part_,(NULL)); \
202  } WHILE_0
203 
204 
205 
206 #define SO_KIT_ADD_LIST_ITEM_TYPE(_part_, _listitemtype_) \
207  do { \
208  classcatalog->addListItemType(SO__QUOTE(_part_), \
209  _listitemtype_::getClassTypeId()); \
210  } WHILE_0
211 
212 
213 #define SO_KIT_INIT_INSTANCE() \
214  this->createFieldList(); \
215  this->createDefaultParts()
216 
217 #define SO_KIT_ADD_FIELD(_fieldname_, _defvalue_) \
218  SO_NODE_ADD_FIELD(_fieldname_, _defvalue_)
219 
220 // New for Coin-3
221 #define SO_KIT_ADD_EMPTY_MFIELD(_fieldname_) \
222  SO_NODE_ADD_EMPTY_MFIELD(_fieldname_)
223 
224 #define SO_KIT_DEFINE_ENUM_VALUE(_enumtype_, _enumvalue_) \
225  SO_NODE_DEFINE_ENUM_VALUE(_enumtype_, _enumvalue_)
226 
227 #define SO_KIT_SET_MF_ENUM_TYPE(_fieldname_, _enumtype_) \
228  SO_NODE_SET_MF_ENUM_TYPE(_fieldname_, _enumtype_)
229 
230 #define SO_KIT_SET_SF_ENUM_TYPE(_fieldname_, _enumtype_) \
231  SO_NODE_SET_SF_ENUM_TYPE(_fieldname_, _enumtype_)
232 
233 #define SO_KIT_CHANGE_ENTRY_TYPE(_part_, _newpartclassname_, _newdefaultpartclassname_) \
234  do { \
235  classcatalog->narrowTypes(SO__QUOTE(_part_), \
236  SoType::fromName(SO__QUOTE(_newpartclassname_)), \
237  SoType::fromName(SO__QUOTE(_newdefaultpartclassname_))); \
238  } WHILE_0
239 
240 
241 #define SO_KIT_CHANGE_NULL_BY_DEFAULT(_part_, _newnullbydefault_) \
242  do { \
243  classcatalog->setNullByDefault(SO__QUOTE(_part_), _newnullbydefault_); \
244  } WHILE_0
245 
246 #endif // !COIN_SOSUBKIT_H