Version 3 (modified by 15 years ago) (diff) | ,
---|
TracNav
Documentation
- Getting Started
BuildEnvironment...
- Terrain Data
- Architecture
Modules...
osgVisual Configuration via XML...
- SerializationNotes
- ExecuterNotes
- CameraControl
- Theories of Terrain Deformation
- Theories of Image Distortion
- Home
About...
- Screenshots
- Downloads
Projection Designer...
- Wiki Edit
- Website Credits/Impressum
Serialization
Wrapperaufbau
in jeder Klasse unten den Wrapper eintragen.
obne zusätzlich folgendes includieren: #include <osgDB/ObjectWrapper>
#include <osgDB/InputStream>
#include <osgDB/OutputStream>
Dann den wrapper definieren:
REGISTER_OBJECT_WRAPPER( Node, The unique wrapper name
new osg::Node, The proto osg::Node, The class typename "osg::Object osg::Node" ) The inheritance relations
{
Serializers for different members ADD_OBJECT_SERIALIZER( UpdateCallback?, osg::NodeCallback?, NULL ); ADD_BOOL_SERIALIZER( CullingActive?, true ); ADD_HEXINT_SERIALIZER( NodeMask?, 0xffffffff ); ...
}
Funktion des Serializers beim Lesen der Wrapper-Definition
Funktion des ADD_LIST_SERIALIZER(NAME, TYPE):
NAME: Name der public Funktion, unter der der Vector gelesen und geschrieben werden kann TYPE: Typ der Liste. Um es übersichtlich zu halten, muss ein public Typedef durchgeführt werden. dieser kann gemäss c++ syntax mit node::typedef genutzt werden.
Bsp: ADD_LIST_SERIALIZER( ClipPlaneList?, osg::ClipNode::ClipPlaneList? );
Name der Get/Set? Funktionen:
- getClipPlaneList();
- setClipPlaneList(..);
Typdefinition des vectors:
- typedef std::vector<ref_ptr<ClipPlane?> > ClipPlaneList?
zu finden ist dieser Typ gemäß c++ Syntax mit namespace::classname::type (daher muss der typedef public sein, sonst ist er ja von aussen nicht sichtbar)
->zu serialisierendes Element wäre dann im Beispiel: osg::Clipnode::ClipPlaneList?
Wichtig bei enums:
enum <typename> {VA1, VAL2, ...}
variable muss dann anders heißen als der type. Der wrapper NAME muss identisch lauten wie der enum Typ.
Zugriff auf die serialisierten Daten
osgDB::ReaderWriter?* rw = osgDB::Registry::instance()->getReaderWriterForExtension("osgb"); if ( rw ) {
osgDB::ReaderWriter::WriteResult? wr = rw->writeNode( *scene, ostream );
osgDB::ReaderWriter::ReadResult? rr = rw->readNode( istream ); return rr.takeNode(); Node mit takeNode entgegennehmen.
}
De-/Komprimieren des Datenstroms
Um die Nodes zu komprimieren, muss osgDB::ReaderWriter?->readNode(..) und osgDB::ReaderWriter?->writeNode(..) die entsprechende Option mitgegeben werden: "compressor=zlib"
Bsp: osgDB::ReaderWriter::WriteResult? wr = rw->writeNode( *scene, ostream, new osgDB::Options("WriteImageHint?=IncludeData? Compressor=zlib") ); osgDB::ReaderWriter::ReadResult? rr = rw->readNode( istream, new osgDB::Options("WriteImageHint?=IncludeData? Compressor=zlib") );