Serializer 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934
  1. /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2010 Robert Osfield
  2. *
  3. * This library is open source and may be redistributed and/or modified under
  4. * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
  5. * (at your option) any later version. The full license is in LICENSE file
  6. * included with this distribution, and on the openscenegraph.org website.
  7. *
  8. * This library is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * OpenSceneGraph Public License for more details.
  12. */
  13. // Written by Wang Rui, (C) 2010
  14. #ifndef OSGDB__SERIALIZER
  15. #define OSGDB__SERIALIZER
  16. #include <osg/ref_ptr>
  17. #include <osg/Notify>
  18. #include <osg/Object>
  19. #include <osgDB/InputStream>
  20. #include <osgDB/OutputStream>
  21. #include <string>
  22. #include <sstream>
  23. #include <limits.h>
  24. namespace osgDB
  25. {
  26. typedef std::vector<std::string> StringList;
  27. extern OSGDB_EXPORT void split( const std::string& src, StringList& list, char separator=' ' );
  28. #ifndef OBJECT_CAST
  29. #define OBJECT_CAST static_cast
  30. #endif
  31. class IntLookup
  32. {
  33. public:
  34. typedef int Value;
  35. typedef std::map<std::string, Value> StringToValue;
  36. typedef std::map<Value, std::string> ValueToString;
  37. IntLookup() {}
  38. unsigned int size() const { return static_cast<unsigned int>(_stringToValue.size()); }
  39. void add( const char* str, Value value )
  40. {
  41. if ( _valueToString.find(value)!=_valueToString.end() )
  42. {
  43. osg::notify(osg::INFO) << "Duplicate enum value " << value
  44. << " with old string: " << _valueToString[value]
  45. << " and new string: " << str << std::endl;
  46. }
  47. _valueToString[value] = str;
  48. _stringToValue[str] = value;
  49. }
  50. void add2(const char* str, const char* newStr, Value value) {
  51. if (_valueToString.find(value) != _valueToString.end())
  52. {
  53. osg::notify(osg::INFO) << "Duplicate enum value " << value
  54. << " with old string: " << _valueToString[value]
  55. << " and new strings: " << str << " and " << newStr << std::endl;
  56. }
  57. _valueToString[value] = newStr;
  58. _stringToValue[newStr] = value;
  59. _stringToValue[str] = value;
  60. }
  61. Value getValue( const char* str )
  62. {
  63. StringToValue::iterator itr = _stringToValue.find(str);
  64. if ( itr==_stringToValue.end() )
  65. {
  66. Value value;
  67. std::stringstream stream;
  68. stream << str; stream >> value;
  69. _stringToValue[str] = value;
  70. return value;
  71. }
  72. return itr->second;
  73. }
  74. const std::string& getString( Value value )
  75. {
  76. ValueToString::iterator itr = _valueToString.find(value);
  77. if ( itr==_valueToString.end() )
  78. {
  79. std::string str;
  80. std::stringstream stream;
  81. stream << value; stream >> str;
  82. _valueToString[value] = str;
  83. return _valueToString[value];
  84. }
  85. return itr->second;
  86. }
  87. StringToValue& getStringToValue() { return _stringToValue; }
  88. const StringToValue& getStringToValue() const { return _stringToValue; }
  89. ValueToString& getValueToString() { return _valueToString; }
  90. const ValueToString& getValueToString() const { return _valueToString; }
  91. protected:
  92. StringToValue _stringToValue;
  93. ValueToString _valueToString;
  94. };
  95. class UserLookupTableProxy
  96. {
  97. public:
  98. typedef void (*AddValueFunc)( IntLookup* lookup );
  99. UserLookupTableProxy( AddValueFunc func ) { if ( func ) (*func)(&_lookup); }
  100. IntLookup _lookup;
  101. };
  102. #define BEGIN_USER_TABLE(NAME, CLASS) \
  103. static void add_user_value_func_##NAME(osgDB::IntLookup*); \
  104. static osgDB::UserLookupTableProxy s_user_lookup_table_##NAME(&add_user_value_func_##NAME); \
  105. static void add_user_value_func_##NAME(osgDB::IntLookup* lookup) { typedef CLASS MyClass
  106. #define ADD_USER_VALUE(VALUE) lookup->add(#VALUE, MyClass::VALUE)
  107. #define END_USER_TABLE() }
  108. #define USER_READ_FUNC(NAME, FUNCNAME) \
  109. static int FUNCNAME(osgDB::InputStream& is) { \
  110. int value; if (is.isBinary()) is >> value; \
  111. else { std::string str; is >> str; \
  112. value = (s_user_lookup_table_##NAME)._lookup.getValue(str.c_str()); } \
  113. return value; }
  114. #define USER_WRITE_FUNC(NAME, FUNCNAME) \
  115. static void FUNCNAME(osgDB::OutputStream& os, int value) { \
  116. if (os.isBinary()) os << value; \
  117. else os << (s_user_lookup_table_##NAME)._lookup.getString(value); } \
  118. class BaseSerializer : public osg::Referenced
  119. {
  120. friend class ObjectWrapper;
  121. public:
  122. enum Type
  123. {
  124. RW_UNDEFINED = 0, RW_USER, RW_OBJECT, RW_IMAGE, RW_LIST,
  125. RW_BOOL, RW_CHAR, RW_UCHAR, RW_SHORT, RW_USHORT, RW_INT, RW_UINT, RW_FLOAT, RW_DOUBLE,
  126. RW_VEC2F, RW_VEC2D, RW_VEC3F, RW_VEC3D, RW_VEC4F, RW_VEC4D, RW_QUAT, RW_PLANE,
  127. RW_MATRIXF, RW_MATRIXD, RW_MATRIX, RW_GLENUM, RW_STRING, RW_ENUM,
  128. RW_VEC2B, RW_VEC2UB, RW_VEC2S, RW_VEC2US, RW_VEC2I, RW_VEC2UI,
  129. RW_VEC3B, RW_VEC3UB, RW_VEC3S, RW_VEC3US, RW_VEC3I, RW_VEC3UI,
  130. RW_VEC4B, RW_VEC4UB, RW_VEC4S, RW_VEC4US, RW_VEC4I, RW_VEC4UI,
  131. RW_BOUNDINGBOXF, RW_BOUNDINGBOXD,
  132. RW_BOUNDINGSPHEREF, RW_BOUNDINGSPHERED,
  133. RW_VECTOR, RW_MAP
  134. };
  135. enum Usage
  136. {
  137. READ_WRITE_PROPERTY = 1,
  138. GET_PROPERTY = 2,
  139. SET_PROPERTY = 4,
  140. GET_SET_PROPERTY = GET_PROPERTY | SET_PROPERTY
  141. };
  142. BaseSerializer(int usage) : _firstVersion(0), _lastVersion(INT_MAX), _usage(usage) {}
  143. virtual bool set(osg::Object& /*object*/, void* /*value*/) { return false; }
  144. virtual bool get(const osg::Object& /*object*/, void* /*value*/) { return false; }
  145. virtual bool read( InputStream&, osg::Object& ) = 0;
  146. virtual bool write( OutputStream&, const osg::Object& ) = 0;
  147. virtual const std::string& getName() const = 0;
  148. virtual IntLookup* getIntLookup() { return 0; }
  149. void setUsage(int usage) { _usage = usage; }
  150. int getUsage() const { return _usage; }
  151. void setUsage(bool hasGetter, bool hasSetter)
  152. {
  153. setUsage( ((hasGetter && hasSetter) ? BaseSerializer::READ_WRITE_PROPERTY : 0) |
  154. ((hasGetter) ? BaseSerializer::GET_PROPERTY : 0) |
  155. ((hasSetter) ? BaseSerializer::SET_PROPERTY : 0) );
  156. }
  157. bool supportsReadWrite() const { return (_usage & READ_WRITE_PROPERTY)!=0; }
  158. bool supportsGetSet() const { return (_usage & GET_SET_PROPERTY)!=0; }
  159. bool supportsGet() const { return (_usage & GET_PROPERTY)!=0; }
  160. bool supportsSet() const { return (_usage & SET_PROPERTY)!=0; }
  161. protected:
  162. int _firstVersion; // Library version when the serializer is first introduced
  163. int _lastVersion; // Library version when the serializer is last required.
  164. int _usage; // How the Serializer can be used.
  165. };
  166. template<typename C>
  167. class UserSerializer : public BaseSerializer
  168. {
  169. public:
  170. typedef bool (*Checker)( const C& );
  171. typedef bool (*Reader)( InputStream&, C& );
  172. typedef bool (*Writer)( OutputStream&, const C& );
  173. UserSerializer( const char* name, Checker cf, Reader rf, Writer wf )
  174. : BaseSerializer(READ_WRITE_PROPERTY), _name(name), _checker(cf), _reader(rf), _writer(wf) {}
  175. virtual bool read( InputStream& is, osg::Object& obj )
  176. {
  177. C& object = OBJECT_CAST<C&>(obj);
  178. if ( is.isBinary() )
  179. {
  180. bool ok = false; is >> ok;
  181. if ( !ok ) return true;
  182. }
  183. else
  184. {
  185. if ( !is.matchString(_name) )
  186. return true;
  187. }
  188. return (*_reader)(is, object);
  189. }
  190. virtual bool write( OutputStream& os, const osg::Object& obj )
  191. {
  192. const C& object = OBJECT_CAST<const C&>(obj);
  193. bool ok = (*_checker)(object);
  194. if ( os.isBinary() )
  195. {
  196. os << ok;
  197. if ( !ok ) return true;
  198. }
  199. else
  200. {
  201. if ( !ok ) return true;
  202. os << os.PROPERTY(_name.c_str());
  203. }
  204. return (*_writer)(os, object);
  205. }
  206. virtual const std::string& getName() const { return _name; }
  207. protected:
  208. std::string _name;
  209. Checker _checker;
  210. public:
  211. Reader _reader;
  212. Writer _writer;
  213. };
  214. template<typename P>
  215. class TemplateSerializer : public BaseSerializer
  216. {
  217. public:
  218. TemplateSerializer( const char* name, P def)
  219. : BaseSerializer(READ_WRITE_PROPERTY), _name(name), _defaultValue(def) {}
  220. virtual bool read( InputStream& is, osg::Object& obj ) = 0;
  221. virtual bool write( OutputStream& os, const osg::Object& obj ) = 0;
  222. virtual const std::string& getName() const { return _name; }
  223. protected:
  224. std::string _name;
  225. P _defaultValue;
  226. };
  227. template<typename C, typename P>
  228. class PropByValSerializer : public TemplateSerializer<P>
  229. {
  230. public:
  231. typedef TemplateSerializer<P> ParentType;
  232. typedef P (C::*Getter)() const;
  233. typedef void (C::*Setter)( P );
  234. PropByValSerializer( const char* name, P def, Getter gf, Setter sf, bool useHex=false ) : ParentType(name, def), _getter(gf), _setter(sf), _useHex(useHex)
  235. {
  236. ParentType::setUsage( _getter!=0, _setter!=0);
  237. }
  238. virtual bool read( InputStream& is, osg::Object& obj )
  239. {
  240. C& object = OBJECT_CAST<C&>(obj);
  241. P value;
  242. if ( is.isBinary() )
  243. {
  244. is >> value;
  245. (object.*_setter)( value );
  246. }
  247. else if ( is.matchString(ParentType::_name) )
  248. {
  249. if ( _useHex ) is >> std::hex;
  250. is >> value;
  251. if ( _useHex ) is >> std::dec;
  252. (object.*_setter)( value );
  253. }
  254. return true;
  255. }
  256. virtual bool write( OutputStream& os, const osg::Object& obj )
  257. {
  258. const C& object = OBJECT_CAST<const C&>(obj);
  259. P value = (object.*_getter)();
  260. if ( os.isBinary() )
  261. {
  262. os << value;
  263. }
  264. else if ( ParentType::_defaultValue!=value )
  265. {
  266. os << os.PROPERTY((ParentType::_name).c_str());
  267. if ( _useHex ) { os << std::hex << std::showbase; }
  268. os << value;
  269. if ( _useHex ) os << std::dec << std::noshowbase;
  270. os << std::endl;
  271. }
  272. return true;
  273. }
  274. public:
  275. Getter _getter;
  276. Setter _setter;
  277. protected:
  278. bool _useHex;
  279. };
  280. template<typename C, typename P>
  281. class PropByRefSerializer : public TemplateSerializer<P>
  282. {
  283. public:
  284. typedef TemplateSerializer<P> ParentType;
  285. typedef const P& CP;
  286. typedef CP (C::*Getter)() const;
  287. typedef void (C::*Setter)( CP );
  288. PropByRefSerializer( const char* name, CP def, Getter gf, Setter sf ) : ParentType(name, def), _getter(gf), _setter(sf)
  289. {
  290. ParentType::setUsage( _getter!=0, _setter!=0);
  291. }
  292. virtual bool read( InputStream& is, osg::Object& obj )
  293. {
  294. C& object = OBJECT_CAST<C&>(obj);
  295. P value;
  296. if ( is.isBinary() )
  297. {
  298. is >> value;
  299. (object.*_setter)( value );
  300. }
  301. else if ( is.matchString(ParentType::_name) )
  302. {
  303. is >> value;
  304. (object.*_setter)( value );
  305. }
  306. return true;
  307. }
  308. virtual bool write( OutputStream& os, const osg::Object& obj )
  309. {
  310. const C& object = OBJECT_CAST<const C&>(obj);
  311. CP value = (object.*_getter)();
  312. if ( os.isBinary() )
  313. {
  314. os << value;
  315. }
  316. else if ( ParentType::_defaultValue!=value )
  317. {
  318. os << os.PROPERTY((ParentType::_name).c_str()) << value << std::endl;
  319. }
  320. return true;
  321. }
  322. public:
  323. Getter _getter;
  324. Setter _setter;
  325. };
  326. template<typename C>
  327. class MatrixSerializer : public TemplateSerializer<osg::Matrix>
  328. {
  329. public:
  330. typedef TemplateSerializer<osg::Matrix> ParentType;
  331. typedef const osg::Matrix& (C::*Getter)() const;
  332. typedef void (C::*Setter)( const osg::Matrix& );
  333. MatrixSerializer( const char* name, const osg::Matrix& def, Getter gf, Setter sf ) : ParentType(name, def), _getter(gf), _setter(sf)
  334. {
  335. ParentType::setUsage( _getter!=0, _setter!=0);
  336. }
  337. virtual bool read( InputStream& is, osg::Object& obj )
  338. {
  339. C& object = OBJECT_CAST<C&>(obj);
  340. osg::Matrix value;
  341. if ( is.isBinary() )
  342. {
  343. readMatrixImplementation( is, value );
  344. (object.*_setter)( value );
  345. }
  346. else if ( is.matchString(ParentType::_name) )
  347. {
  348. readMatrixImplementation( is, value );
  349. (object.*_setter)( value );
  350. }
  351. return true;
  352. }
  353. virtual bool write( OutputStream& os, const osg::Object& obj )
  354. {
  355. const C& object = OBJECT_CAST<const C&>(obj);
  356. const osg::Matrix& value = (object.*_getter)();
  357. if ( os.isBinary() )
  358. {
  359. os << value;
  360. }
  361. else if ( ParentType::_defaultValue!=value )
  362. {
  363. os << os.PROPERTY((ParentType::_name).c_str()) << value << std::endl;
  364. }
  365. return true;
  366. }
  367. protected:
  368. void readMatrixImplementation( InputStream& is, osg::Matrix& matrix )
  369. {
  370. #if 1
  371. is >> matrix;
  372. #else
  373. if ( is.getUseFloatMatrix() )
  374. {
  375. osg::Matrixf realValue; is >> realValue;
  376. matrix = realValue;
  377. }
  378. else
  379. {
  380. osg::Matrixd realValue; is >> realValue;
  381. matrix = realValue;
  382. }
  383. #endif
  384. }
  385. public:
  386. Getter _getter;
  387. Setter _setter;
  388. };
  389. template<typename C, typename P>
  390. class GLenumSerializer : public TemplateSerializer<P>
  391. {
  392. public:
  393. typedef TemplateSerializer<P> ParentType;
  394. typedef P (C::*Getter)() const;
  395. typedef void (C::*Setter)( P );
  396. GLenumSerializer( const char* name, P def, Getter gf, Setter sf ) : ParentType(name, def), _getter(gf), _setter(sf)
  397. {
  398. ParentType::setUsage( _getter!=0, _setter!=0);
  399. }
  400. virtual bool read( InputStream& is, osg::Object& obj )
  401. {
  402. C& object = OBJECT_CAST<C&>(obj);
  403. if ( is.isBinary() )
  404. {
  405. GLenum value; is >> value;
  406. (object.*_setter)( static_cast<P>(value) );
  407. }
  408. else if ( is.matchString(ParentType::_name) )
  409. {
  410. DEF_GLENUM(value); is >> value;
  411. (object.*_setter)( static_cast<P>(value.get()) );
  412. }
  413. return true;
  414. }
  415. virtual bool write( OutputStream& os, const osg::Object& obj )
  416. {
  417. const C& object = OBJECT_CAST<const C&>(obj);
  418. const P value = (object.*_getter)();
  419. if ( os.isBinary() )
  420. {
  421. os << static_cast<GLenum>(value);
  422. }
  423. else if ( ParentType::_defaultValue!=value )
  424. {
  425. os << os.PROPERTY((ParentType::_name).c_str()) << GLENUM(value) << std::endl;
  426. }
  427. return true;
  428. }
  429. public:
  430. Getter _getter;
  431. Setter _setter;
  432. };
  433. template<typename C>
  434. class StringSerializer : public TemplateSerializer<std::string>
  435. {
  436. public:
  437. typedef TemplateSerializer<std::string> ParentType;
  438. typedef const std::string& (C::*Getter)() const;
  439. typedef void (C::*Setter)( const std::string& );
  440. StringSerializer( const char* name, const std::string& def, Getter gf, Setter sf ) : ParentType(name, def), _getter(gf), _setter(sf)
  441. {
  442. ParentType::setUsage( _getter!=0, _setter!=0);
  443. }
  444. virtual bool read( InputStream& is, osg::Object& obj )
  445. {
  446. C& object = OBJECT_CAST<C&>(obj);
  447. std::string value;
  448. if ( is.isBinary() )
  449. {
  450. is >> value;
  451. (object.*_setter)( value );
  452. }
  453. else if ( is.matchString(ParentType::_name) )
  454. {
  455. is.readWrappedString( value );
  456. if ( !value.empty() && (_setter!=0) )
  457. (object.*_setter)( value );
  458. }
  459. return true;
  460. }
  461. virtual bool write( OutputStream& os, const osg::Object& obj )
  462. {
  463. const C& object = OBJECT_CAST<const C&>(obj);
  464. const std::string& value = (object.*_getter)();
  465. if ( os.isBinary() )
  466. {
  467. os << value;
  468. }
  469. else if ( ParentType::_defaultValue!=value )
  470. {
  471. os << os.PROPERTY((ParentType::_name).c_str());
  472. os.writeWrappedString( value );
  473. os << std::endl;
  474. }
  475. return true;
  476. }
  477. public:
  478. Getter _getter;
  479. Setter _setter;
  480. };
  481. template<typename C, typename P>
  482. class ObjectSerializer : public BaseSerializer
  483. {
  484. public:
  485. typedef const P* (C::*Getter)() const;
  486. typedef void (C::*Setter)( P* );
  487. ObjectSerializer( const char* name, P* def, Getter gf, Setter sf ) :
  488. BaseSerializer(READ_WRITE_PROPERTY),
  489. _name(name), _defaultValue(def), _getter(gf), _setter(sf)
  490. {
  491. setUsage( _getter!=0, _setter!=0);
  492. }
  493. virtual bool set(osg::Object& obj, void* value) { C& object = OBJECT_CAST<C&>(obj); (object.*_setter)( dynamic_cast<P*>(*(reinterpret_cast<osg::Object**>(value))) ); return true; }
  494. virtual bool get(const osg::Object& obj, void* value) { const C& object = OBJECT_CAST<const C&>(obj);*(reinterpret_cast<const osg::Object**>(value )) = dynamic_cast<const osg::Object*>((object.*_getter)()); return true; }
  495. virtual const std::string& getName() const { return _name; }
  496. virtual bool read( InputStream& is, osg::Object& obj )
  497. {
  498. C& object = OBJECT_CAST<C&>(obj);
  499. bool hasObject = false;
  500. if ( is.isBinary() )
  501. {
  502. is >> hasObject;
  503. if ( hasObject )
  504. {
  505. osg::ref_ptr<P> value = is.readObjectOfType<P>();
  506. (object.*_setter)( value.get() );
  507. }
  508. }
  509. else if ( is.matchString(_name) )
  510. {
  511. is >> hasObject;
  512. if ( hasObject )
  513. {
  514. is >> is.BEGIN_BRACKET;
  515. osg::ref_ptr<P> value = is.readObjectOfType<P>();
  516. (object.*_setter)( value.get() );
  517. is >> is.END_BRACKET;
  518. }
  519. }
  520. return true;
  521. }
  522. virtual bool write( OutputStream& os, const osg::Object& obj )
  523. {
  524. const C& object = OBJECT_CAST<const C&>(obj);
  525. const P* value = (object.*_getter)();
  526. bool hasObject = (value!=NULL);
  527. if ( os.isBinary() )
  528. {
  529. os << hasObject;
  530. if (hasObject)
  531. {
  532. os.writeObject( value );
  533. }
  534. }
  535. else if ( _defaultValue!=value )
  536. {
  537. os << os.PROPERTY(_name.c_str()) << hasObject;
  538. if ( hasObject )
  539. {
  540. os << os.BEGIN_BRACKET << std::endl;
  541. os.writeObject( value );
  542. os << os.END_BRACKET;
  543. }
  544. os << std::endl;
  545. }
  546. return true;
  547. }
  548. public:
  549. std::string _name;
  550. osg::ref_ptr<P> _defaultValue;
  551. Getter _getter;
  552. Setter _setter;
  553. };
  554. template<typename C, typename P>
  555. class ImageSerializer : public TemplateSerializer<P*>
  556. {
  557. public:
  558. typedef TemplateSerializer<P*> ParentType;
  559. typedef const P* (C::*Getter)() const;
  560. typedef void (C::*Setter)( P* );
  561. ImageSerializer( const char* name, P* def, Getter gf, Setter sf ):
  562. ParentType(name, def), _getter(gf), _setter(sf)
  563. {
  564. ParentType::setUsage( _getter!=0, _setter!=0);
  565. }
  566. virtual bool set(osg::Object& obj, void* value) { C& object = OBJECT_CAST<C&>(obj); (object.*_setter)( *(reinterpret_cast<P**>(value)) ); return true; }
  567. virtual bool get(const osg::Object& obj, void* value) { const C& object = OBJECT_CAST<const C&>(obj);*(reinterpret_cast<const P**>(value )) = (object.*_getter)(); return true; }
  568. virtual bool read( InputStream& is, osg::Object& obj )
  569. {
  570. C& object = OBJECT_CAST<C&>(obj);
  571. bool hasObject = false;
  572. if ( is.isBinary() )
  573. {
  574. is >> hasObject;
  575. if ( hasObject )
  576. {
  577. osg::ref_ptr<osg::Image> image = is.readImage();
  578. P* value = dynamic_cast<P*>( image.get() );
  579. (object.*_setter)( value );
  580. }
  581. }
  582. else if ( is.matchString(ParentType::_name) )
  583. {
  584. is >> hasObject;
  585. if ( hasObject )
  586. {
  587. is >> is.BEGIN_BRACKET;
  588. osg::ref_ptr<osg::Image> image = is.readImage();
  589. P* value = dynamic_cast<P*>( image.get() );
  590. (object.*_setter)( value );
  591. is >> is.END_BRACKET;
  592. }
  593. }
  594. return true;
  595. }
  596. virtual bool write( OutputStream& os, const osg::Object& obj )
  597. {
  598. const C& object = OBJECT_CAST<const C&>(obj);
  599. const P* value = (object.*_getter)();
  600. bool hasObject = (value!=NULL);
  601. if ( os.isBinary() )
  602. {
  603. os << hasObject;
  604. os.writeImage( value );
  605. }
  606. else if ( ParentType::_defaultValue!=value )
  607. {
  608. os << os.PROPERTY((ParentType::_name).c_str()) << hasObject;
  609. if ( hasObject )
  610. {
  611. os << os.BEGIN_BRACKET << std::endl;
  612. os.writeImage( value );
  613. os << os.END_BRACKET;
  614. }
  615. os << std::endl;
  616. }
  617. return true;
  618. }
  619. public:
  620. Getter _getter;
  621. Setter _setter;
  622. };
  623. template<typename C, typename P, typename B>
  624. class EnumSerializer : public TemplateSerializer<P>
  625. {
  626. public:
  627. typedef TemplateSerializer<P> ParentType;
  628. typedef P (C::*Getter)() const;
  629. typedef B (C::*Setter)( P );
  630. EnumSerializer( const char* name, P def, Getter gf, Setter sf ) : ParentType(name, def), _getter(gf), _setter(sf)
  631. {
  632. ParentType::setUsage( _getter!=0, _setter!=0);
  633. }
  634. virtual IntLookup* getIntLookup() { return &_lookup; }
  635. void add( const char* str, P value )
  636. { _lookup.add(str, static_cast<IntLookup::Value>(value)); }
  637. P getValue( const char* str )
  638. { return static_cast<P>(_lookup.getValue(str)); }
  639. const std::string& getString( P value )
  640. { return _lookup.getString(static_cast<IntLookup::Value>(value)); }
  641. virtual bool read( InputStream& is, osg::Object& obj )
  642. {
  643. C& object = OBJECT_CAST<C&>(obj);
  644. IntLookup::Value value;
  645. if ( is.isBinary() )
  646. {
  647. is >> value;
  648. (object.*_setter)( static_cast<P>(value) );
  649. }
  650. else if ( is.matchString(ParentType::_name) )
  651. {
  652. std::string str; is >> str;
  653. (object.*_setter)( getValue(str.c_str()) );
  654. }
  655. return true;
  656. }
  657. virtual bool write( osgDB::OutputStream& os, const osg::Object& obj )
  658. {
  659. const C& object = OBJECT_CAST<const C&>(obj);
  660. const P value = (object.*_getter)();
  661. if ( os.isBinary() )
  662. {
  663. os << (IntLookup::Value)value;
  664. }
  665. else if ( ParentType::_defaultValue!=value )
  666. {
  667. os << os.PROPERTY((ParentType::_name).c_str()) << getString(value) << std::endl;
  668. }
  669. return true;
  670. }
  671. public:
  672. Getter _getter;
  673. Setter _setter;
  674. protected:
  675. IntLookup _lookup;
  676. };
  677. template<typename C, typename P>
  678. class ListSerializer : public BaseSerializer
  679. {
  680. public:
  681. typedef typename P::value_type ValueType;
  682. typedef typename P::const_iterator ConstIterator;
  683. typedef const P& (C::*Getter)() const;
  684. typedef void (C::*Setter)( const P& );
  685. ListSerializer( const char* name, Getter gf, Setter sf ):
  686. BaseSerializer(READ_WRITE_PROPERTY),
  687. _name(name), _getter(gf), _setter(sf) {}
  688. virtual const std::string& getName() const { return _name; }
  689. virtual bool read( InputStream& is, osg::Object& obj )
  690. {
  691. C& object = OBJECT_CAST<C&>(obj);
  692. unsigned int size = 0;
  693. P list;
  694. if ( is.isBinary() )
  695. {
  696. is >> size;
  697. for ( unsigned int i=0; i<size; ++i )
  698. {
  699. ValueType value;
  700. is >> value;
  701. list.push_back( value );
  702. }
  703. if ( size>0 ) (object.*_setter)( list );
  704. }
  705. else if ( is.matchString(_name) )
  706. {
  707. is >> size;
  708. if ( size>0 ) is >> is.BEGIN_BRACKET;
  709. for ( unsigned int i=0; i<size; ++i )
  710. {
  711. ValueType value;
  712. is >> value;
  713. list.push_back( value );
  714. }
  715. if ( size>0 )
  716. {
  717. is >> is.END_BRACKET;
  718. (object.*_setter)( list );
  719. }
  720. }
  721. return true;
  722. }
  723. virtual bool write( OutputStream& os, const osg::Object& obj )
  724. {
  725. const C& object = OBJECT_CAST<const C&>(obj);
  726. const P& list = (object.*_getter)();
  727. unsigned int size = (unsigned int)list.size();
  728. if ( os.isBinary() )
  729. {
  730. os << size;
  731. for ( ConstIterator itr=list.begin();
  732. itr!=list.end(); ++itr )
  733. {
  734. os << (*itr);
  735. }
  736. }
  737. else if ( size>0 )
  738. {
  739. os << os.PROPERTY((_name).c_str()) << size << os.BEGIN_BRACKET << std::endl;
  740. for ( ConstIterator itr=list.begin();
  741. itr!=list.end(); ++itr )
  742. {
  743. os << (*itr);
  744. }
  745. os << std::endl;
  746. os << os.END_BRACKET << std::endl;
  747. }
  748. return true;
  749. }
  750. public:
  751. std::string _name;
  752. Getter _getter;
  753. Setter _setter;
  754. };
  755. class VectorBaseSerializer : public BaseSerializer
  756. {
  757. public:
  758. VectorBaseSerializer(BaseSerializer::Type elementType, unsigned int elementSize):
  759. BaseSerializer(READ_WRITE_PROPERTY|GET_SET_PROPERTY),
  760. _elementType(elementType),_elementSize(elementSize) {}
  761. Type getElementType() const { return _elementType; }
  762. unsigned int getElementSize() const { return _elementSize; }
  763. virtual unsigned int size(const osg::Object& /*obj*/) const { return 0; }
  764. virtual void resize(osg::Object& /*obj*/, unsigned int /*numElements*/) const {}
  765. virtual void reserve(osg::Object& /*obj*/, unsigned int /*numElements*/) const {}
  766. virtual void clear(osg::Object& /*obj*/) const {}
  767. virtual void addElement(osg::Object& /*obj*/, void* /*ptr*/) const {}
  768. virtual void insertElement(osg::Object& /*obj*/, unsigned int /*index*/, void* /*ptr*/) const {}
  769. virtual void setElement(osg::Object& /*obj*/, unsigned int /*index*/, void* /*ptr*/) const {}
  770. virtual void* getElement(osg::Object& /*obj*/, unsigned int /*index*/) const { return 0; }
  771. virtual const void* getElement(const osg::Object& /*obj*/, unsigned int /*index*/) const { return 0; }
  772. protected:
  773. Type _elementType;
  774. unsigned int _elementSize;
  775. };
  776. template<typename C, typename P>
  777. class VectorSerializer : public VectorBaseSerializer
  778. {
  779. public:
  780. typedef typename P::value_type ValueType;
  781. typedef typename P::const_iterator ConstIterator;
  782. typedef P& (C::*Getter)();
  783. typedef const P& (C::*ConstGetter)() const;
  784. typedef void (C::*Setter)( const P& );
  785. VectorSerializer( const char* name, ConstGetter cgf, Getter gf, Setter sf, BaseSerializer::Type elementType, unsigned int numElementsOnRow):
  786. VectorBaseSerializer(elementType, sizeof(ValueType)),
  787. _name(name),
  788. _constgetter(cgf), _getter(gf), _setter(sf),
  789. _numElementsOnRow(numElementsOnRow) {}
  790. virtual const std::string& getName() const { return _name; }
  791. virtual unsigned int size(const osg::Object& obj) const
  792. {
  793. const C& object = OBJECT_CAST<const C&>(obj);
  794. const P& list = (object.*_constgetter)();
  795. return static_cast<unsigned int>(list.size());
  796. }
  797. virtual void resize(osg::Object& obj, unsigned int numElements) const
  798. {
  799. C& object = OBJECT_CAST<C&>(obj);
  800. P& list = (object.*_getter)();
  801. list.resize(numElements);
  802. }
  803. virtual void reserve(osg::Object& obj, unsigned int numElements) const
  804. {
  805. C& object = OBJECT_CAST<C&>(obj);
  806. P& list = (object.*_getter)();
  807. list.reserve(numElements);
  808. }
  809. virtual void clear(osg::Object& obj) const
  810. {
  811. C& object = OBJECT_CAST<C&>(obj);
  812. P& list = (object.*_getter)();
  813. list.clear();
  814. }
  815. virtual void addElement(osg::Object& obj, void* ptr) const
  816. {
  817. C& object = OBJECT_CAST<C&>(obj);
  818. P& list = (object.*_getter)();
  819. list.push_back(*reinterpret_cast<ValueType*>(ptr));
  820. }
  821. virtual void insertElement(osg::Object& obj, unsigned int index, void* ptr) const
  822. {
  823. C& object = OBJECT_CAST<C&>(obj);
  824. P& list = (object.*_getter)();
  825. if (index>=list.size()) list.resize(index+1);
  826. list.insert(list.begin()+index, *reinterpret_cast<ValueType*>(ptr));
  827. }
  828. virtual void setElement(osg::Object& obj, unsigned int index, void* ptr) const
  829. {
  830. C& object = OBJECT_CAST<C&>(obj);
  831. P& list = (object.*_getter)();
  832. if (index>=list.size()) list.resize(index+1);
  833. list[index] = *reinterpret_cast<ValueType*>(ptr);
  834. }
  835. virtual void* getElement(osg::Object& obj, unsigned int index) const
  836. {
  837. C& object = OBJECT_CAST<C&>(obj);
  838. P& list = (object.*_getter)();
  839. if (index>=list.size()) return 0;
  840. else return &list[index];
  841. }
  842. virtual const void* getElement(const osg::Object& obj, unsigned int index) const
  843. {
  844. const C& object = OBJECT_CAST<const C&>(obj);
  845. const P& list = (object.*_constgetter)();
  846. if (index>=list.size()) return 0;
  847. else return &list[index];
  848. }
  849. virtual bool read( InputStream& is, osg::Object& obj )
  850. {
  851. C& object = OBJECT_CAST<C&>(obj);
  852. unsigned int size = 0;
  853. P list;
  854. if ( is.isBinary() )
  855. {
  856. is >> size;
  857. list.reserve(size);
  858. for ( unsigned int i=0; i<size; ++i )
  859. {
  860. ValueType value;
  861. is >> value;
  862. list.push_back( value );
  863. }
  864. if ( size>0 ) (object.*_setter)( list );
  865. }
  866. else if ( is.matchString(_name) )
  867. {
  868. is >> size;
  869. list.reserve(size);
  870. if ( size>0 ) is >> is.BEGIN_BRACKET;
  871. for ( unsigned int i=0; i<size; ++i )
  872. {
  873. ValueType value;
  874. is >> value;
  875. list.push_back( value );
  876. }
  877. if ( size>0 )
  878. {
  879. is >> is.END_BRACKET;
  880. (object.*_setter)( list );
  881. }
  882. }
  883. return true;
  884. }
  885. virtual bool write( OutputStream& os, const osg::Object& obj )
  886. {
  887. const C& object = OBJECT_CAST<const C&>(obj);
  888. const P& list = (object.*_constgetter)();
  889. unsigned int size = (unsigned int)list.size();
  890. if ( os.isBinary() )
  891. {
  892. os << size;
  893. for ( ConstIterator itr=list.begin();
  894. itr!=list.end(); ++itr )
  895. {
  896. os << (*itr);
  897. }
  898. }
  899. else if ( size>0 )
  900. {
  901. os << os.PROPERTY((_name).c_str()) << size << os.BEGIN_BRACKET << std::endl;
  902. if (_numElementsOnRow==0)
  903. {
  904. for ( ConstIterator itr=list.begin(); itr!=list.end(); ++itr )
  905. {
  906. os << (*itr);
  907. }
  908. }
  909. else if (_numElementsOnRow==1)
  910. {
  911. for ( ConstIterator itr=list.begin(); itr!=list.end(); ++itr )
  912. {
  913. os << (*itr); os << std::endl;
  914. }
  915. }
  916. else
  917. {
  918. unsigned int i = _numElementsOnRow-1;
  919. for (ConstIterator itr=list.begin(); itr!=list.end(); ++itr)
  920. {
  921. os << (*itr);
  922. if (i==0) { os << std::endl; i = _numElementsOnRow-1; }
  923. else --i;
  924. }
  925. if (i!=_numElementsOnRow) os << std::endl;
  926. }
  927. os << os.END_BRACKET << std::endl;
  928. }
  929. return true;
  930. }
  931. public:
  932. std::string _name;
  933. ConstGetter _constgetter;
  934. Getter _getter;
  935. Setter _setter;
  936. unsigned int _numElementsOnRow;
  937. };
  938. template<typename C>
  939. class IsAVectorSerializer : public VectorBaseSerializer
  940. {
  941. public:
  942. typedef typename C::value_type ValueType;
  943. typedef typename C::const_iterator ConstIterator;
  944. IsAVectorSerializer( const char* name, BaseSerializer::Type elementType, unsigned int numElementsOnRow) :
  945. VectorBaseSerializer(elementType, sizeof(ValueType)),
  946. _name(name),
  947. _numElementsOnRow(numElementsOnRow) {}
  948. virtual const std::string& getName() const { return _name; }
  949. virtual unsigned int size(const osg::Object& obj) const
  950. {
  951. const C& list = OBJECT_CAST<const C&>(obj);
  952. return static_cast<unsigned int>(list.size());
  953. }
  954. virtual void resize(osg::Object& obj, unsigned int numElements) const
  955. {
  956. C& list = OBJECT_CAST<C&>(obj);
  957. list.resize(numElements);
  958. }
  959. virtual void reserve(osg::Object& obj, unsigned int numElements) const
  960. {
  961. C& list = OBJECT_CAST<C&>(obj);
  962. list.reserve(numElements);
  963. }
  964. virtual void clear(osg::Object& obj) const
  965. {
  966. C& list = OBJECT_CAST<C&>(obj);
  967. list.clear();
  968. }
  969. virtual void addElement(osg::Object& obj, void* ptr) const
  970. {
  971. C& list = OBJECT_CAST<C&>(obj);
  972. list.push_back(*reinterpret_cast<ValueType*>(ptr));
  973. }
  974. virtual void insertElement(osg::Object& obj, unsigned int index, void* ptr) const
  975. {
  976. C& list = OBJECT_CAST<C&>(obj);
  977. if (index>=list.size()) list.resize(index+1);
  978. list.insert(list.begin()+index, *reinterpret_cast<ValueType*>(ptr));
  979. }
  980. virtual void setElement(osg::Object& obj, unsigned int index, void* ptr) const
  981. {
  982. C& list = OBJECT_CAST<C&>(obj);
  983. if (index>=list.size()) list.resize(index+1);
  984. list[index] = *reinterpret_cast<ValueType*>(ptr);
  985. }
  986. virtual void* getElement(osg::Object& obj, unsigned int index) const
  987. {
  988. C& list = OBJECT_CAST<C&>(obj);
  989. if (index>=list.size()) return 0;
  990. else return &list[index];
  991. }
  992. virtual const void* getElement(const osg::Object& obj, unsigned int index) const
  993. {
  994. const C& list = OBJECT_CAST<const C&>(obj);
  995. if (index>=list.size()) return 0;
  996. else return &list[index];
  997. }
  998. virtual bool read( InputStream& is, osg::Object& obj )
  999. {
  1000. C& list = OBJECT_CAST<C&>(obj);
  1001. unsigned int size = 0;
  1002. if ( is.isBinary() )
  1003. {
  1004. is >> size;
  1005. list.reserve(size);
  1006. for ( unsigned int i=0; i<size; ++i )
  1007. {
  1008. ValueType value;
  1009. is >> value;
  1010. list.push_back( value );
  1011. }
  1012. }
  1013. else if ( is.matchString(_name) )
  1014. {
  1015. is >> size;
  1016. list.reserve(size);
  1017. if ( size>0 ) is >> is.BEGIN_BRACKET;
  1018. for ( unsigned int i=0; i<size; ++i )
  1019. {
  1020. ValueType value;
  1021. is >> value;
  1022. list.push_back( value );
  1023. }
  1024. if ( size>0 )
  1025. {
  1026. is >> is.END_BRACKET;
  1027. }
  1028. }
  1029. return true;
  1030. }
  1031. virtual bool write( OutputStream& os, const osg::Object& obj )
  1032. {
  1033. const C& list = OBJECT_CAST<const C&>(obj);
  1034. unsigned int size = (unsigned int)list.size();
  1035. if ( os.isBinary() )
  1036. {
  1037. os << size;
  1038. for ( ConstIterator itr=list.begin();
  1039. itr!=list.end(); ++itr )
  1040. {
  1041. os << (*itr);
  1042. }
  1043. }
  1044. else if ( size>0 )
  1045. {
  1046. os << os.PROPERTY((_name).c_str()) << size << os.BEGIN_BRACKET << std::endl;
  1047. if (_numElementsOnRow==0)
  1048. {
  1049. for ( ConstIterator itr=list.begin(); itr!=list.end(); ++itr )
  1050. {
  1051. os << (*itr);
  1052. }
  1053. }
  1054. else if (_numElementsOnRow==1)
  1055. {
  1056. for ( ConstIterator itr=list.begin(); itr!=list.end(); ++itr )
  1057. {
  1058. os << (*itr); os << std::endl;
  1059. }
  1060. }
  1061. else
  1062. {
  1063. unsigned int i = _numElementsOnRow-1;
  1064. for (ConstIterator itr=list.begin(); itr!=list.end(); ++itr)
  1065. {
  1066. os << (*itr);
  1067. if (i==0) { os << std::endl; i = _numElementsOnRow-1; }
  1068. else --i;
  1069. }
  1070. if (i!=_numElementsOnRow) os << std::endl;
  1071. }
  1072. os << os.END_BRACKET << std::endl;
  1073. }
  1074. return true;
  1075. }
  1076. public:
  1077. std::string _name;
  1078. unsigned int _numElementsOnRow;
  1079. };
  1080. class MapIteratorObject : public osg::Object
  1081. {
  1082. public:
  1083. MapIteratorObject():
  1084. _keyType(BaseSerializer::RW_UNDEFINED), _keySize(0),
  1085. _elementType(BaseSerializer::RW_UNDEFINED),_elementSize(0) {}
  1086. MapIteratorObject(BaseSerializer::Type keyType, unsigned int keySize, BaseSerializer::Type elementType, unsigned int elementSize):
  1087. _keyType(keyType), _keySize(keySize),
  1088. _elementType(elementType),_elementSize(elementSize) {}
  1089. MapIteratorObject(const MapIteratorObject& rhs, const osg::CopyOp copyop=osg::CopyOp::SHALLOW_COPY):
  1090. osg::Object(rhs, copyop),
  1091. _keyType(rhs._keyType), _keySize(rhs._keySize),
  1092. _elementType(rhs._elementType),_elementSize(rhs._elementSize) {}
  1093. META_Object(osgDB, MapIteratorObject);
  1094. BaseSerializer::Type getKeyType() const { return _keyType; }
  1095. unsigned int getKeySize() const { return _keySize; }
  1096. BaseSerializer::Type getElementType() const { return _elementType; }
  1097. unsigned int getElementSize() const { return _elementSize; }
  1098. virtual bool advance() { return false; }
  1099. virtual bool valid() const { return false; }
  1100. virtual const void* getKey() const { return 0; }
  1101. virtual void* getElement() const { return 0; }
  1102. virtual void setElement(void* /*ptr*/) const {}
  1103. protected:
  1104. BaseSerializer::Type _keyType;
  1105. unsigned int _keySize;
  1106. BaseSerializer::Type _elementType;
  1107. unsigned int _elementSize;
  1108. };
  1109. class MapBaseSerializer : public BaseSerializer
  1110. {
  1111. public:
  1112. MapBaseSerializer(BaseSerializer::Type keyType, unsigned int keySize, BaseSerializer::Type elementType, unsigned int elementSize):
  1113. BaseSerializer(READ_WRITE_PROPERTY|GET_SET_PROPERTY),
  1114. _keyType(keyType), _keySize(keySize),
  1115. _elementType(elementType),_elementSize(elementSize) {}
  1116. Type getKeyType() const { return _keyType; }
  1117. unsigned int getKeySize() const { return _keySize; }
  1118. Type getElementType() const { return _elementType; }
  1119. unsigned int getElementSize() const { return _elementSize; }
  1120. virtual void clear(osg::Object& /*obj*/) const {}
  1121. virtual void setElement(osg::Object& /*obj*/, void* /*ptrKey*/, void* /*ptrValue*/) const {}
  1122. virtual void* getElement(osg::Object& /*obj*/, void* /*ptrKey*/) const { return 0; }
  1123. virtual const void* getElement(const osg::Object& /*obj*/, void* /*ptrKey*/) const { return 0; }
  1124. virtual unsigned int size(const osg::Object& /*obj*/) const { return 0; }
  1125. virtual MapIteratorObject* createIterator(osg::Object& /*obj*/) const { return 0; }
  1126. virtual MapIteratorObject* createReverseIterator(osg::Object& /*obj*/) const { return 0; }
  1127. protected:
  1128. Type _keyType;
  1129. unsigned int _keySize;
  1130. Type _elementType;
  1131. unsigned int _elementSize;
  1132. };
  1133. template<typename C, typename P>
  1134. class MapSerializer : public MapBaseSerializer
  1135. {
  1136. public:
  1137. typedef typename P::value_type ValueType;
  1138. typedef typename P::key_type KeyType;
  1139. typedef typename P::mapped_type ElementType;
  1140. typedef typename P::iterator Iterator;
  1141. typedef typename P::reverse_iterator ReverseIterator;
  1142. typedef typename P::const_iterator ConstIterator;
  1143. typedef P& (C::*Getter)();
  1144. typedef const P& (C::*ConstGetter)() const;
  1145. typedef void (C::*Setter)( const P& );
  1146. MapSerializer( const char* name, ConstGetter cgf, Getter gf, Setter sf, BaseSerializer::Type keyType, BaseSerializer::Type elementType):
  1147. MapBaseSerializer(keyType, sizeof(KeyType), elementType, sizeof(ElementType)),
  1148. _name(name),
  1149. _constgetter(cgf), _getter(gf), _setter(sf) {}
  1150. virtual const std::string& getName() const { return _name; }
  1151. virtual void clear(osg::Object& obj) const
  1152. {
  1153. C& object = OBJECT_CAST<C&>(obj);
  1154. P& map = (object.*_getter)();
  1155. map.clear();
  1156. }
  1157. virtual void setElement(osg::Object& obj, void* ptrKey, void* ptrValue) const
  1158. {
  1159. C& object = OBJECT_CAST<C&>(obj);
  1160. P& map = (object.*_getter)();
  1161. map[*reinterpret_cast<KeyType*>(ptrKey)] = *reinterpret_cast<ElementType*>(ptrValue);
  1162. }
  1163. virtual void* getElement(osg::Object& obj, void* ptrKey) const
  1164. {
  1165. C& object = OBJECT_CAST<C&>(obj);
  1166. P& map = (object.*_getter)();
  1167. return &(map[*reinterpret_cast<KeyType*>(ptrKey)]);
  1168. }
  1169. virtual const void* getElement(const osg::Object& obj, void* ptrKey) const
  1170. {
  1171. const C& object = OBJECT_CAST<const C&>(obj);
  1172. const P& map = (object.*_constgetter)();
  1173. ConstIterator itr = map.find(*reinterpret_cast<KeyType*>(ptrKey));
  1174. if (itr==map.end()) return 0;
  1175. else return &(itr->second);
  1176. }
  1177. virtual unsigned int size(const osg::Object& obj) const
  1178. {
  1179. const C& object = OBJECT_CAST<const C&>(obj);
  1180. const P& map = (object.*_constgetter)();
  1181. return map.size();
  1182. }
  1183. struct MapIterator : public MapIteratorObject
  1184. {
  1185. MapIterator(BaseSerializer::Type keyType, unsigned int keySize, BaseSerializer::Type elementType, unsigned int elementSize,
  1186. Iterator itr, Iterator endItr):
  1187. MapIteratorObject(keyType, keySize, elementType, elementSize),
  1188. _itr(itr),_endItr(endItr) {}
  1189. Iterator _itr;
  1190. Iterator _endItr;
  1191. virtual bool advance() { if (valid()) ++_itr; return valid(); }
  1192. virtual bool valid() const { return _itr!=_endItr; }
  1193. virtual const void* getKey() const { return valid() ? &(_itr->first) : 0; }
  1194. virtual void* getElement() const { return valid() ? &(_itr->second) : 0; }
  1195. virtual void setElement(void* ptr) const { if (valid()) _itr->second = *reinterpret_cast<ElementType*>(ptr); }
  1196. };
  1197. struct ReverseMapIterator : public MapIteratorObject
  1198. {
  1199. ReverseMapIterator(BaseSerializer::Type keyType, unsigned int keySize, BaseSerializer::Type elementType, unsigned int elementSize,
  1200. ReverseIterator itr, ReverseIterator endItr):
  1201. MapIteratorObject(keyType, keySize, elementType, elementSize),
  1202. _itr(itr),_endItr(endItr) {}
  1203. ReverseIterator _itr;
  1204. ReverseIterator _endItr;
  1205. virtual bool advance() { if (valid()) ++_itr; return valid(); }
  1206. virtual bool valid() const { return _itr!=_endItr; }
  1207. virtual const void* getKey() const { return valid() ? &(_itr->first) : 0; }
  1208. virtual void* getElement() const { return valid() ? &(_itr->second) : 0; }
  1209. virtual void setElement(void* ptr) const { if (valid()) _itr->second = *reinterpret_cast<ElementType*>(ptr); }
  1210. };
  1211. virtual MapIteratorObject* createIterator(osg::Object& obj) const
  1212. {
  1213. C& object = OBJECT_CAST<C&>(obj);
  1214. P& map = (object.*_getter)();
  1215. return new MapIterator(_keyType, _keySize, _elementType, _elementSize, map.begin(), map.end());
  1216. }
  1217. virtual MapIteratorObject* createReverseIterator(osg::Object& obj) const
  1218. {
  1219. C& object = OBJECT_CAST<C&>(obj);
  1220. P& map = (object.*_getter)();
  1221. return new ReverseMapIterator(_keyType, _keySize, _elementType, _elementSize, map.rbegin(), map.rend());
  1222. }
  1223. virtual bool read( InputStream& is, osg::Object& obj )
  1224. {
  1225. C& object = OBJECT_CAST<C&>(obj);
  1226. unsigned int size = 0;
  1227. P map;
  1228. if ( is.isBinary() )
  1229. {
  1230. is >> size;
  1231. for ( unsigned int i=0; i<size; ++i )
  1232. {
  1233. KeyType key;
  1234. ElementType value;
  1235. is >> key >> value;
  1236. map[key] = value;
  1237. }
  1238. (object.*_setter)( map );
  1239. }
  1240. else if ( is.matchString(_name) )
  1241. {
  1242. is >> size;
  1243. if ( size>0 )
  1244. {
  1245. is >> is.BEGIN_BRACKET;
  1246. for ( unsigned int i=0; i<size; ++i )
  1247. {
  1248. KeyType key;
  1249. ElementType value;
  1250. is >> key >> value;
  1251. map[key] = value;
  1252. }
  1253. is >> is.END_BRACKET;
  1254. }
  1255. (object.*_setter)( map );
  1256. }
  1257. return true;
  1258. }
  1259. virtual bool write( OutputStream& os, const osg::Object& obj )
  1260. {
  1261. const C& object = OBJECT_CAST<const C&>(obj);
  1262. const P& map = (object.*_constgetter)();
  1263. unsigned int size = (unsigned int)map.size();
  1264. if ( os.isBinary() )
  1265. {
  1266. os << size;
  1267. for ( ConstIterator itr=map.begin();
  1268. itr!=map.end(); ++itr )
  1269. {
  1270. os << itr->first << itr->second;
  1271. }
  1272. }
  1273. else if ( size>0 )
  1274. {
  1275. os << os.PROPERTY((_name).c_str()) << size << os.BEGIN_BRACKET << std::endl;
  1276. for ( ConstIterator itr=map.begin(); itr!=map.end(); ++itr )
  1277. {
  1278. os << itr->first << itr->second; os << std::endl;
  1279. }
  1280. os << os.END_BRACKET << std::endl;
  1281. }
  1282. return true;
  1283. }
  1284. public:
  1285. std::string _name;
  1286. ConstGetter _constgetter;
  1287. Getter _getter;
  1288. Setter _setter;
  1289. };
  1290. template<typename C, typename P=unsigned int>
  1291. class BitFlagsSerializer : public osgDB::TemplateSerializer<P>
  1292. {
  1293. public:
  1294. typedef TemplateSerializer<P> ParentType;
  1295. typedef P (C::*Getter)() const;
  1296. typedef void (C::*Setter)( P );
  1297. BitFlagsSerializer( const char* name, P def, Getter gf, Setter sf )
  1298. : ParentType(name, def), _getter(gf), _setter(sf) {}
  1299. void add( const char* str, P value )
  1300. {
  1301. _lookup.add(str, static_cast<osgDB::IntLookup::Value>(value));
  1302. }
  1303. P getValue( const char* str )
  1304. { return static_cast<P>(_lookup.getValue(str)); }
  1305. const std::string& getString( P value )
  1306. { return _lookup.getString(static_cast<osgDB::IntLookup::Value>(value)); }
  1307. virtual bool read( osgDB::InputStream& is, osg::Object& obj )
  1308. {
  1309. C& object = OBJECT_CAST<C&>(obj);
  1310. if ( is.isBinary() )
  1311. {
  1312. if (is.getFileVersion()<123)
  1313. {
  1314. bool ok = false; is >> ok; //code from user serialized ensuring backwards-compatibility
  1315. if ( !ok ) return true;
  1316. }
  1317. P mask;
  1318. is >> mask;
  1319. (object.*_setter)( mask );
  1320. }
  1321. else
  1322. {
  1323. if ( !is.matchString(ParentType::_name) ) //code from user serialized ensuring backwards-compatibility
  1324. return true;
  1325. P mask=P();
  1326. std::string maskSetString;
  1327. is >> maskSetString;
  1328. osgDB::StringList maskList;
  1329. osgDB::split( maskSetString, maskList, '|' );
  1330. for ( unsigned int i=0; i<maskList.size(); ++i )
  1331. mask |= _lookup.getValue( maskList[i].c_str());
  1332. (object.*_setter)( mask );
  1333. }
  1334. return true;
  1335. }
  1336. virtual bool write( osgDB::OutputStream& os, const osg::Object& obj )
  1337. {
  1338. const C& object = OBJECT_CAST<const C&>(obj);
  1339. const P mask = (object.*_getter)();
  1340. bool ok = ParentType::_defaultValue!=static_cast<P>(mask);
  1341. if ( os.isBinary() )
  1342. {
  1343. if (os.getFileVersion()<123)
  1344. {
  1345. os << ok;
  1346. if ( !ok )
  1347. return true;
  1348. }
  1349. os << (int)mask; //just write int value in binary case
  1350. }
  1351. else
  1352. {
  1353. if ( !ok )
  1354. return true;
  1355. os << os.PROPERTY(ParentType::_name.c_str());
  1356. std::string maskString;
  1357. const osgDB::IntLookup::ValueToString& v2sm = _lookup.getValueToString();
  1358. for( osgDB::IntLookup::ValueToString::const_iterator itr = v2sm.begin() ; itr != v2sm.end() ; itr++)
  1359. if( (mask & itr->first) != 0 )
  1360. maskString += std::string(itr->second + "|");
  1361. if ( !maskString.size() )
  1362. maskString = std::string("NONE|");
  1363. maskString.erase(maskString.size()-1,1);
  1364. os << maskString << std::endl; //remove last "|"
  1365. }
  1366. return true;
  1367. }
  1368. public:
  1369. Getter _getter;
  1370. Setter _setter;
  1371. protected:
  1372. osgDB::IntLookup _lookup;
  1373. };
  1374. // ADDING MANIPULATORS
  1375. #define ADD_SERIALIZER(S) \
  1376. wrapper->addSerializer( (S) )
  1377. #define ADD_USER_SERIALIZER(PROP) \
  1378. wrapper->addSerializer( new osgDB::UserSerializer<MyClass>( \
  1379. #PROP, &check##PROP, &read##PROP, &write##PROP), osgDB::BaseSerializer::RW_USER )
  1380. #define ADD_BOOL_SERIALIZER(PROP, DEF) \
  1381. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, bool >( \
  1382. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_BOOL )
  1383. #define ADD_CHAR_SERIALIZER(PROP, DEF) \
  1384. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, char >( \
  1385. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_CHAR )
  1386. #define ADD_UCHAR_SERIALIZER(PROP, DEF) \
  1387. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, unsigned char >( \
  1388. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_UCHAR )
  1389. #define ADD_SHORT_SERIALIZER(PROP, DEF) \
  1390. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, short >( \
  1391. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_SHORT )
  1392. #define ADD_USHORT_SERIALIZER(PROP, DEF) \
  1393. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, unsigned short >( \
  1394. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_USHORT )
  1395. #define ADD_HEXSHORT_SERIALIZER(PROP, DEF) \
  1396. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, unsigned short >( \
  1397. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP, true), osgDB::BaseSerializer::RW_USHORT )
  1398. #define ADD_INT_SERIALIZER(PROP, DEF) \
  1399. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, int >( \
  1400. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_INT )
  1401. #define ADD_INT_SERIALIZER_NO_SET(PROP, DEF) \
  1402. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, int >( \
  1403. #PROP, DEF, &MyClass::get##PROP, 0), osgDB::BaseSerializer::RW_INT )
  1404. #define ADD_UINT_SERIALIZER(PROP, DEF) \
  1405. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, unsigned int >( \
  1406. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_UINT )
  1407. #define ADD_UINT_SERIALIZER_NO_SET(PROP, DEF) \
  1408. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, unsigned int >( \
  1409. #PROP, DEF, &MyClass::get##PROP, 0), osgDB::BaseSerializer::RW_UINT )
  1410. #define ADD_GLINT_SERIALIZER(PROP, DEF) \
  1411. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, GLint >( \
  1412. #PROP, ((int)(DEF)), &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_INT )
  1413. #define ADD_HEXINT_SERIALIZER(PROP, DEF) \
  1414. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, unsigned int >( \
  1415. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP, true), osgDB::BaseSerializer::RW_UINT )
  1416. #define ADD_FLOAT_SERIALIZER(PROP, DEF) \
  1417. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, float >( \
  1418. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_FLOAT )
  1419. #define ADD_DOUBLE_SERIALIZER(PROP, DEF) \
  1420. wrapper->addSerializer( new osgDB::PropByValSerializer< MyClass, double >( \
  1421. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_DOUBLE )
  1422. #define ADD_REF_BOOL_SERIALIZER(PROP, DEF) \
  1423. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, bool >( \
  1424. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_BOOL )
  1425. #define ADD_REF_CHAR_SERIALIZER(PROP, DEF) \
  1426. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, char >( \
  1427. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_CHAR )
  1428. #define ADD_REF_UCHAR_SERIALIZER(PROP, DEF) \
  1429. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, unsigned char >( \
  1430. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_UCHAR )
  1431. #define ADD_REF_SHORT_SERIALIZER(PROP, DEF) \
  1432. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, short >( \
  1433. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_SHORT )
  1434. #define ADD_REF_USHORT_SERIALIZER(PROP, DEF) \
  1435. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, unsigned short >( \
  1436. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_USHORT )
  1437. #define ADD_REF_HEXSHORT_SERIALIZER(PROP, DEF) \
  1438. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, unsigned short >( \
  1439. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP, true), osgDB::BaseSerializer::RW_USHORT )
  1440. #define ADD_REF_INT_SERIALIZER(PROP, DEF) \
  1441. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, int >( \
  1442. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_INT )
  1443. #define ADD_REF_UINT_SERIALIZER(PROP, DEF) \
  1444. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, unsigned int >( \
  1445. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_UINT )
  1446. #define ADD_REF_GLINT_SERIALIZER(PROP, DEF) \
  1447. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, GLint >( \
  1448. #PROP, ((int)(DEF)), &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_INT )
  1449. #define ADD_REF_HEXINT_SERIALIZER(PROP, DEF) \
  1450. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, unsigned int >( \
  1451. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP, true), osgDB::BaseSerializer::RW_UINT )
  1452. #define ADD_REF_FLOAT_SERIALIZER(PROP, DEF) \
  1453. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, float >( \
  1454. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_FLOAT )
  1455. #define ADD_REF_DOUBLE_SERIALIZER(PROP, DEF) \
  1456. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, double >( \
  1457. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_DOUBLE )
  1458. #define ADD_VEC2B_SERIALIZER(PROP, DEF) \
  1459. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec2b >( \
  1460. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC2B )
  1461. #define ADD_VEC2UB_SERIALIZER(PROP, DEF) \
  1462. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec2ub >( \
  1463. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC2UB )
  1464. #define ADD_VEC2S_SERIALIZER(PROP, DEF) \
  1465. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec2s >( \
  1466. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC2S )
  1467. #define ADD_VEC2US_SERIALIZER(PROP, DEF) \
  1468. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec2us >( \
  1469. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC2US )
  1470. #define ADD_VEC2I_SERIALIZER(PROP, DEF) \
  1471. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec2i >( \
  1472. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC2I )
  1473. #define ADD_VEC2UI_SERIALIZER(PROP, DEF) \
  1474. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec2ui >( \
  1475. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC2UI )
  1476. #define ADD_VEC2F_SERIALIZER(PROP, DEF) \
  1477. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec2f >( \
  1478. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC2F )
  1479. #define ADD_VEC2D_SERIALIZER(PROP, DEF) \
  1480. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec2d >( \
  1481. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC2D )
  1482. #define ADD_VEC2_SERIALIZER(PROP, DEF) ADD_VEC2F_SERIALIZER(PROP, DEF)
  1483. #define ADD_VEC3B_SERIALIZER(PROP, DEF) \
  1484. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec3b >( \
  1485. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC3B )
  1486. #define ADD_VEC3UB_SERIALIZER(PROP, DEF) \
  1487. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec3ub >( \
  1488. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC3UB )
  1489. #define ADD_VEC3S_SERIALIZER(PROP, DEF) \
  1490. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec3s >( \
  1491. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC3S )
  1492. #define ADD_VEC3US_SERIALIZER(PROP, DEF) \
  1493. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec3us >( \
  1494. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC3US )
  1495. #define ADD_VEC3I_SERIALIZER(PROP, DEF) \
  1496. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec3i >( \
  1497. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC3I )
  1498. #define ADD_VEC3UI_SERIALIZER(PROP, DEF) \
  1499. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec3ui >( \
  1500. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC3UI )
  1501. #define ADD_VEC3F_SERIALIZER(PROP, DEF) \
  1502. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec3f >( \
  1503. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC3F )
  1504. #define ADD_VEC3D_SERIALIZER(PROP, DEF) \
  1505. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec3d >( \
  1506. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC3D )
  1507. #define ADD_VEC3_SERIALIZER(PROP, DEF) ADD_VEC3F_SERIALIZER(PROP, DEF)
  1508. #define ADD_VEC4B_SERIALIZER(PROP, DEF) \
  1509. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec4b >( \
  1510. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC4B )
  1511. #define ADD_VEC4UB_SERIALIZER(PROP, DEF) \
  1512. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec4ub >( \
  1513. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC4UB )
  1514. #define ADD_VEC4S_SERIALIZER(PROP, DEF) \
  1515. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec4s >( \
  1516. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC4S )
  1517. #define ADD_VEC4US_SERIALIZER(PROP, DEF) \
  1518. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec4us >( \
  1519. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC4US )
  1520. #define ADD_VEC4I_SERIALIZER(PROP, DEF) \
  1521. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec4i >( \
  1522. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC4I )
  1523. #define ADD_VEC4UI_SERIALIZER(PROP, DEF) \
  1524. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec4ui >( \
  1525. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC4UI )
  1526. #define ADD_VEC4F_SERIALIZER(PROP, DEF) \
  1527. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec4f >( \
  1528. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC4F )
  1529. #define ADD_VEC4D_SERIALIZER(PROP, DEF) \
  1530. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Vec4d >( \
  1531. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_VEC4D )
  1532. #define ADD_VEC4_SERIALIZER(PROP, DEF) ADD_VEC4F_SERIALIZER(PROP, DEF)
  1533. #define ADD_QUAT_SERIALIZER(PROP, DEF) \
  1534. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Quat >( \
  1535. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_QUAT )
  1536. #define ADD_PLANE_SERIALIZER(PROP, DEF) \
  1537. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Plane >( \
  1538. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_PLANE )
  1539. #define ADD_MATRIXF_SERIALIZER(PROP, DEF) \
  1540. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Matrixf >( \
  1541. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_MATRIXF )
  1542. #define ADD_MATRIXD_SERIALIZER(PROP, DEF) \
  1543. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::Matrixd >( \
  1544. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_MATRIXD )
  1545. #define ADD_MATRIX_SERIALIZER(PROP, DEF) \
  1546. wrapper->addSerializer( new osgDB::MatrixSerializer< MyClass >( \
  1547. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_MATRIX )
  1548. #define ADD_BOUNDINGBOXF_SERIALIZER(PROP, DEF) \
  1549. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::BoundingBoxf >( \
  1550. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_BOUNDINGBOXF )
  1551. #define ADD_BOUNDINGBOXD_SERIALIZER(PROP, DEF) \
  1552. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::BoundingBoxd >( \
  1553. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_BOUNDINGBOXD )
  1554. #define ADD_BOUNDINGSPHEREF_SERIALIZER(PROP, DEF) \
  1555. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::BoundingSpheref >( \
  1556. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_BOUNDINGSPHEREF )
  1557. #define ADD_BOUNDINGSPHERED_SERIALIZER(PROP, DEF) \
  1558. wrapper->addSerializer( new osgDB::PropByRefSerializer< MyClass, osg::BoundingSphered >( \
  1559. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_BOUNDINGSPHERED )
  1560. #define ADD_GLENUM_SERIALIZER(PROP, TYPE, DEF) \
  1561. wrapper->addSerializer( new osgDB::GLenumSerializer< MyClass, TYPE >( \
  1562. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_GLENUM )
  1563. #define ADD_GLENUM_SERIALIZER_NO_SET(PROP, TYPE, DEF) \
  1564. wrapper->addSerializer( new osgDB::GLenumSerializer< MyClass, TYPE >( \
  1565. #PROP, DEF, &MyClass::get##PROP, 0), osgDB::BaseSerializer::RW_GLENUM )
  1566. #define ADD_STRING_SERIALIZER(PROP, DEF) \
  1567. wrapper->addSerializer( new osgDB::StringSerializer< MyClass >( \
  1568. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_STRING )
  1569. #define ADD_OBJECT_SERIALIZER(PROP, TYPE, DEF) \
  1570. wrapper->addSerializer( new osgDB::ObjectSerializer< MyClass, TYPE >( \
  1571. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_OBJECT )
  1572. #define ADD_OBJECT_SERIALIZER_NO_SET(PROP, TYPE, DEF) \
  1573. wrapper->addSerializer( new osgDB::ObjectSerializer< MyClass, TYPE >( \
  1574. #PROP, DEF, &MyClass::get##PROP, 0), osgDB::BaseSerializer::RW_OBJECT )
  1575. #define ADD_IMAGE_SERIALIZER(PROP, TYPE, DEF) \
  1576. wrapper->addSerializer( new osgDB::ImageSerializer< MyClass, TYPE >( \
  1577. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_IMAGE )
  1578. #define ADD_LIST_SERIALIZER(PROP, TYPE) \
  1579. wrapper->addSerializer( new osgDB::ListSerializer< MyClass, TYPE >( \
  1580. #PROP, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_LIST )
  1581. #define ADD_VECTOR_SERIALIZER(PROP, TYPE, ELEMENTTYPE, NUMELEMENTSONROW) \
  1582. wrapper->addSerializer( new osgDB::VectorSerializer< MyClass, TYPE >( \
  1583. #PROP, &MyClass::get##PROP, &MyClass::get##PROP, &MyClass::set##PROP, ELEMENTTYPE, NUMELEMENTSONROW), osgDB::BaseSerializer::RW_VECTOR )
  1584. #define ADD_ISAVECTOR_SERIALIZER(PROP, ELEMENTTYPE, NUMELEMENTSONROW) \
  1585. wrapper->addSerializer( new osgDB::IsAVectorSerializer< MyClass >( #PROP, ELEMENTTYPE, NUMELEMENTSONROW), osgDB::BaseSerializer::RW_VECTOR )
  1586. #define BEGIN_ENUM_SERIALIZER(PROP, DEF) \
  1587. { typedef osgDB::EnumSerializer<MyClass, MyClass::PROP, void> MySerializer; \
  1588. osg::ref_ptr<MySerializer> serializer = new MySerializer( \
  1589. #PROP, MyClass::DEF, &MyClass::get##PROP, &MyClass::set##PROP)
  1590. #define BEGIN_ENUM_SERIALIZER2(PROP, TYPE, DEF) \
  1591. { typedef osgDB::EnumSerializer<MyClass, TYPE, void> MySerializer; \
  1592. osg::ref_ptr<MySerializer> serializer = new MySerializer( \
  1593. #PROP, MyClass::DEF, &MyClass::get##PROP, &MyClass::set##PROP)
  1594. #define BEGIN_ENUM_SERIALIZER3(PROP, DEF) \
  1595. { typedef osgDB::EnumSerializer<MyClass, MyClass::PROP, bool> MySerializer; \
  1596. osg::ref_ptr<MySerializer> serializer = new MySerializer( \
  1597. #PROP, MyClass::DEF, &MyClass::get##PROP, &MyClass::set##PROP)
  1598. #define BEGIN_ENUM_SERIALIZER4(PROPERTIES_CLASS, PROP, DEF) \
  1599. { typedef osgDB::EnumSerializer<MyClass, PROPERTIES_CLASS::PROP, void> MySerializer; \
  1600. osg::ref_ptr<MySerializer> serializer = new MySerializer( \
  1601. #PROP, PROPERTIES_CLASS::DEF, &MyClass::get##PROP, &MyClass::set##PROP)
  1602. #define BEGIN_ENUM_SERIALIZER_NO_SET(PROP, DEF) \
  1603. { typedef osgDB::EnumSerializer<MyClass, MyClass::PROP, void> MySerializer; \
  1604. osg::ref_ptr<MySerializer> serializer = new MySerializer( \
  1605. #PROP, MyClass::DEF, &MyClass::get##PROP, 0)
  1606. #define ADD_ENUM_VALUE(VALUE) \
  1607. serializer->add(#VALUE, MyClass::VALUE)
  1608. #define ADD_ENUM_CLASS_VALUE(CLASS, VALUE) \
  1609. serializer->add(#VALUE, CLASS::VALUE)
  1610. #define END_ENUM_SERIALIZER() \
  1611. wrapper->addSerializer(serializer.get(), osgDB::BaseSerializer::RW_ENUM); }
  1612. /** defaults to uint bitfield type.*/
  1613. #define BEGIN_BITFLAGS_SERIALIZER(PROP, DEF) \
  1614. { typedef osgDB::BitFlagsSerializer<MyClass> MySerializer; \
  1615. osg::ref_ptr<MySerializer> serializer = new MySerializer( \
  1616. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP)
  1617. #define BEGIN_UINT_BITFLAGS_SERIALIZER(PROP, DEF) \
  1618. { typedef osgDB::BitFlagsSerializer<MyClass, unsigned int> MySerializer; \
  1619. osg::ref_ptr<MySerializer> serializer = new MySerializer( \
  1620. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP)
  1621. #define BEGIN_INT_BITFLAGS_SERIALIZER(PROP, DEF) \
  1622. { typedef osgDB::BitFlagsSerializer<MyClass, int> MySerializer; \
  1623. osg::ref_ptr<MySerializer> serializer = new MySerializer( \
  1624. #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP)
  1625. #define ADD_BITFLAG_VALUE(VALUE_NAME, VALUE) \
  1626. serializer->add(#VALUE_NAME, VALUE)
  1627. #define END_BITFLAGS_SERIALIZER() \
  1628. wrapper->addSerializer(serializer.get(), osgDB::BaseSerializer::RW_INT); }
  1629. // VERSION CONTROL OPERATORS
  1630. #define UPDATE_TO_VERSION(VER) \
  1631. wrapper->setUpdatedVersion( (VER) );
  1632. #define UPDATE_TO_VERSION_SCOPED(VER) \
  1633. osgDB::UpdateWrapperVersionProxy uwvp(wrapper, (VER));
  1634. #define ADDED_ASSOCIATE(STR) \
  1635. wrapper->markAssociateAsAdded( STR );
  1636. #define REMOVED_ASSOCIATE(STR) \
  1637. wrapper->markAssociateAsRemoved( STR );
  1638. #define REMOVE_SERIALIZER(PROP) \
  1639. wrapper->markSerializerAsRemoved( #PROP );
  1640. #define ADD_MAP_SERIALIZER(PROP, TYPE, KEYTYPE, ELEMENTTYPE) \
  1641. wrapper->addSerializer( new osgDB::MapSerializer< MyClass, TYPE >( \
  1642. #PROP, &MyClass::get##PROP, &MyClass::get##PROP, &MyClass::set##PROP, KEYTYPE, ELEMENTTYPE), osgDB::BaseSerializer::RW_MAP )
  1643. #define ADD_METHOD_OBJECT( METHODNAME, METHODOBJECTCLASS ) wrapper->addMethodObject(METHODNAME, new METHODOBJECTCLASS());
  1644. #define ADD_METHOD(METHODNAME) \
  1645. { \
  1646. struct MethodCaller : public osgDB::MethodObject \
  1647. { \
  1648. virtual bool run(void* objectPtr, osg::Parameters&, osg::Parameters&) const \
  1649. { \
  1650. MyClass* obj = reinterpret_cast<MyClass*>(objectPtr); \
  1651. obj->METHODNAME(); \
  1652. return true; \
  1653. } \
  1654. }; \
  1655. wrapper->addMethodObject(#METHODNAME, new MethodCaller()); \
  1656. }
  1657. #define SET_USAGE(VALUE) wrapper->getLastSerializer()->setUsage(VALUE)
  1658. }
  1659. #endif