1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
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.
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.
20#include <osg/Drawable>
21#include <osg/StateAttribute>
22#include <osg/ArgumentParser>
24#include <osgDB/ReaderWriter>
25#include <osgDB/Options>
32/** basic structure for custom runtime inheritance checking */
33struct basic_type_wrapper {
34 virtual ~basic_type_wrapper() {}
35 virtual bool matches(const osg::Object *proto) const = 0;
38/** a class template that checks inheritance between a given
39 Object's class and a class defined at compile time through
40 the template parameter T.
41 This is used in conjunction with readObjectOfType() to
42 specify an abstract class as reference type.
45struct type_wrapper: basic_type_wrapper {
46 bool matches(const osg::Object *proto) const
48 return dynamic_cast<const T*>(proto) != 0;
53class OSGDB_EXPORT Field
62 Field(const Field& field);
65 virtual Field& operator = (const Field& ic);
69 int getNoCharacters() const { return _fieldCacheSize; }
71 void setWithinQuotes(bool withinQuotes=true);
72 bool getWithinQuotes();
74 void setNoNestedBrackets(int no);
75 int getNoNestedBrackets();
89 FieldType getFieldType() const;
93 bool isOpenBracket() const;
94 bool isCloseBracket() const;
97 bool matchWord(const char* str) const;
98 bool matchWord(const char* str,int noCharacters) const;
100 bool isString() const;
101 bool matchString(const char* str) const;
102 bool matchString(const char* str,int noCharacters) const;
103 bool isQuotedString() const;
105 const char* getStr() const;
109 bool matchInt(int i) const;
110 bool getInt(int& i) const;
113 bool matchUInt(unsigned int i) const;
114 bool getUInt(unsigned int& i) const;
116 bool isFloat() const;
117 bool matchFloat(float f) const;
118 bool getFloat(float& f) const;
119 bool getFloat(double& f) const;
121 static FieldType calculateFieldType(const char* str,bool withinQuotes=false);
127 void _copy(const Field& ic);
129 int _fieldCacheCapacity;
133 mutable FieldType _fieldType;
137 int _noNestedBrackets;
142class OSGDB_EXPORT FieldReader
147 FieldReader(const FieldReader& ic);
148 virtual ~FieldReader();
150 virtual FieldReader& operator = (const FieldReader& ic);
152 void attach(std::istream* input);
155 virtual bool eof() const;
157 bool readField(Field& fieldPtr);
160 /** no of unmatched `{' encountered so far in file*/
161 int getNoNestedBrackets() const;
165 bool _readField(Field* fieldPtr);
169 void _copy(const FieldReader& ic);
174 bool findStartOfNextField();
176 int _noNestedBrackets;
178 bool _delimiterEatLookUp[256];
179 bool _delimiterKeepLookUp[256];
184class OSGDB_EXPORT FieldReaderIterator
189 MINIMUM_FIELD_READER_QUEUE_SIZE = 10
192 FieldReaderIterator();
193 FieldReaderIterator(const FieldReaderIterator& ic);
194 virtual ~FieldReaderIterator();
196 FieldReaderIterator& operator = (const FieldReaderIterator& ic);
198 void attach(std::istream* input);
201 virtual bool eof() const;
203 FieldReader& getFieldReader() { return _reader; }
205 void insert(int pos,Field* field);
206 void insert(int pos,const char* str);
208 Field& operator [] (int pos);
209 Field& field (int pos);
211 FieldReaderIterator& operator ++ ();
212 FieldReaderIterator& operator += (int no);
214 /** increments the iterator of the next simple field or
215 * whole block if the current field[0] is an open bracket */
216 void advanceOverCurrentFieldOrBlock();
217 void advanceToEndOfCurrentBlock();
218 void advanceToEndOfBlock(int noNestBrackets);
220 bool matchSequence(const char* str);
222 bool readSequence(const char* keyword,std::string& value);
223 bool readSequence(const char* keyword,unsigned int& value);
224 bool readSequence(const char* keyword,int& value);
225 bool readSequence(const char* keyword,float& value);
226 bool readSequence(const char* keyword,osg::Vec2f& value);
227 bool readSequence(const char* keyword,osg::Vec3f& value);
228 bool readSequence(const char* keyword,osg::Vec4f& value);
229 bool readSequence(const char* keyword,osg::Vec2d& value);
230 bool readSequence(const char* keyword,osg::Vec3d& value);
231 bool readSequence(const char* keyword,osg::Vec4d& value);
233 bool readSequence(std::string& value);
234 bool readSequence(unsigned int& value);
235 bool readSequence(int& value);
236 bool readSequence(float& value);
237 bool readSequence(osg::Vec2f& value);
238 bool readSequence(osg::Vec3f& value);
239 bool readSequence(osg::Vec4f& value);
240 bool readSequence(osg::Vec2d& value);
241 bool readSequence(osg::Vec3d& value);
242 bool readSequence(osg::Vec4d& value);
248 void _copy(const FieldReaderIterator& ic);
254 Field* _previousField;
258 int _fieldQueueCapacity;
263class OSGDB_EXPORT Input : public FieldReaderIterator
270 void setOptions(const Options* options) { _options = options; }
271 const Options* getOptions() const { return _options.get(); }
273 virtual osg::Object* readObjectOfType(const osg::Object& compObj);
274 virtual osg::Object* readObjectOfType(const basic_type_wrapper &btw);
278 inline T* readObjectOfType()
280 return dynamic_cast<T*>(readObjectOfType(osgDB::type_wrapper<T>()));
283 virtual osg::Object* readObject();
284 virtual osg::Image* readImage();
285 virtual osg::Drawable* readDrawable();
286 virtual osg::StateAttribute* readStateAttribute();
287 virtual osg::Uniform* readUniform();
288 virtual osg::Node* readNode();
289 virtual osg::Shader* readShader();
291 virtual osg::ref_ptr<osg::Object> readObject(const std::string& fileName);
292 virtual osg::ref_ptr<osg::Image> readImage(const std::string& fileName);
293 virtual osg::ref_ptr<osg::Node> readNode(const std::string& fileName);
294 virtual osg::ref_ptr<osg::Shader> readShader(const std::string& fileName);
296 virtual osg::Object* getObjectForUniqueID(const std::string& uniqueID);
297 virtual void registerUniqueIDForObject(const std::string& uniqueID,osg::Object* obj);
299 typedef osg::ArgumentParser::Parameter Parameter;
301 bool read(Parameter value1);
302 bool read(Parameter value1, Parameter value2);
303 bool read(Parameter value1, Parameter value2, Parameter value3);
304 bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4);
305 bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5);
306 bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6);
307 bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7);
308 bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7, Parameter value8);
310 bool read(const char* str);
311 bool read(const char* str, Parameter value1);
312 bool read(const char* str, Parameter value1, Parameter value2);
313 bool read(const char* str, Parameter value1, Parameter value2, Parameter value3);
314 bool read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4);
315 bool read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5);
316 bool read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6);
317 bool read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7);
318 bool read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7, Parameter value8);
322 typedef std::map< std::string, osg::ref_ptr<osg::Object> > UniqueIDToObjectMapping;
323 UniqueIDToObjectMapping _uniqueIDToObjectMap;
325 osg::ref_ptr<const Options> _options;
331#endif // __SG_INPUT_H