[osg-users] Develop a scalable binary file format for native OSG scenes?
suky0001 at free.fr
Sun Nov 22 08:43:40 PST 2009
Just a little thing to say: I love your idea! I don't have time to look at it right now, but I'm sure I'll use that format later.
PVLE - Lightweight cross-platform game engine - http://pvle.sourceforge.net/
Le Sun, 22 Nov 2009 12:10:21 +0100, Wang Rui <wangray84 at gmail.com> a écrit:
> Hi Robert and all,
> I'd like to introduce my work of developing a new scalable binary
> reader/writer plugin in the past a few weeks. It took me more than
> half a month coding and doing some simple tests. And I really wish it
> be a good supplement of current native osg scene formats (.osg and
> .ive), or furthermore, a possible replacement of the .ive format in
> As we know before, the popular used .ive format has been not
> extensible from the very beginning. So core developers should always
> update osgdb_ive itself to add new classes and features. And
> user-defined nodes and objects can only be stored in a customized file
> format, or using the .osg plugin supporting a DotOsgWrapper mechanism
> instead, which is scalable.
> I decided to mimic this DotOsgWrapper mechanism and try to implement a
> binary file format (.osg is text format and seems to be hardly to work
> And I finally created a preliminary version. Because of the size
> limitation of our mail list, I have to put the source code tarball on
> my project site and provide the download link here:
> Copy the extracted directory to your osgPlugins location and edit
> osgPlugins/CMakeLists.txt and add: ADD_SUBDIRECTORY(bin)
> In the ObjectWrapper header file, I have the ObjectWrapper class mimic
> osgDB::DotOsgWrapper, and the ObjectRegistry class which work like
> osgDB::Registry and maintains the wrapper map. The
> REGISTER_OBJECT_WRAPPER macro is used to declare a new object wrapper,
> which acts similar with REGISTER_DOTOSGWRAPPER.
> The InputStream and OutputStream class are use for read/write the OSG
> scene, which support different read*()/write*() methods. They also
> both have a shared object-id map, to avoid rereading/rewriting shared
> nodes and statesets. readObject()/writeObject() is the core function
> for reading/writing osg native subgraphs.
> The basic structure of this file format is:
> | offset |type | contents
> | 00h | uint | OSG verity value, low
> | 04h | uint | OSG verity value, high
> | 08h | uint | Plugin version
> | 0ch | uint | File attribtues
> | 10h | uint | Size of author information text
> | 14h | str | n-sized author information text
> |14h+n | uint | Size of root node wrapper name
> |18h+n | str | Root node wrapper name, e.g. "osg::Group"
> | ... | uint | node id, non-zero value for shared objects
> | ... | int | Size of written contents, used to vertify data
> | ... | ... | Attributes of this object and its parent classes.
> | ... | ... | ...
> The second step is to write wrappers for every osg core class. An example is:
> REGISTER_OBJECT_WRAPPER( Geode )
> new osg::Geode,
> "osg::Object osg::Node osg::Geode",
> &readGeode, &writeGeode
> Hope you already find that there are few differences between it and
> the .osg wrappers. You will need to declare the proto, the wrapper's
> name, its associates (parent wrappers path) and reader/writer
> Wrappers may be added to meet the extensibility requirements. To
> update existent wrappers, just append to the read/write functions. It
> should still be recognized by the old plugin, because of the vertify
> bits (see the format table).
> I also developed some initial options for writing with this plugin:
> - IncludeImageData: Set to save data of osg::Image objects directly.
> - IncludeImageFile: Set to save image files into this binary file.
> - UseExternalImage: Set to keep a reference of the image file name only.
> - WriteImageToFile: Set to write the image data on disk while saving.
> - AuthorInformation=... : Write author information into the binary file.
> The core OSG library classes are already finished and included in the
> wrapper_osg directory, but still not tested enough at present.
> These are on the TODO list right now, any advices and thoughts will be
> - Decide the extension name: At present I just name it ".bin", short
> for "binary". A little naive and too common, isn't it? :D
> - Finish all wrappers of other core libraries, osgAnimation, osgText,
> osgWidgets and so on. These may be defined inside this plugin or use
> external dynamic libraries (like the osgwrapper_* files).
> - Automatically load external wrapper libraries: It would be easy to
> finish if we merge ObjectRegistry and osgDB::Registry and rewrite the
> findWrapper() function.
> - Packing algorithms for vectices and double values, which will be of
> high performance with geometries and heightfields.
> - Compression of the entire file, maybe zlib would still be the first choice?
> - COMPLETELY tests and bug fixes of the plugin, if it is ready to be
> merged into the osg trunk and be put into use.
> I'm looking forward to suggestions and testing replies, keeping my
> fingers crossed. :)
> Wang Rui
> osg-users mailing list
> osg-users at lists.openscenegraph.org
More information about the osg-users