1 #include <osg/ConvexPlanarOccluder>
2 #include <osgDB/ObjectWrapper>
3 #include <osgDB/InputStream>
4 #include <osgDB/OutputStream>
5 
readConvexPlanarPolygon(osgDB::InputStream & is,osg::ConvexPlanarPolygon & polygon)6 static void readConvexPlanarPolygon( osgDB::InputStream& is, osg::ConvexPlanarPolygon& polygon )
7 {
8     unsigned int size = is.readSize(); is >> is.BEGIN_BRACKET;
9     for ( unsigned int i=0; i<size; ++i )
10     {
11         osg::Vec3d vertex; is >> vertex;
12         polygon.add( vertex );
13     }
14     is >> is.END_BRACKET;
15 }
16 
writeConvexPlanarPolygon(osgDB::OutputStream & os,const osg::ConvexPlanarPolygon & polygon)17 static void writeConvexPlanarPolygon( osgDB::OutputStream& os, const osg::ConvexPlanarPolygon& polygon )
18 {
19     const osg::ConvexPlanarPolygon::VertexList& vertices = polygon.getVertexList();
20     os.writeSize(vertices.size()); os<< os.BEGIN_BRACKET << std::endl;
21     for ( osg::ConvexPlanarPolygon::VertexList::const_iterator itr=vertices.begin();
22           itr!=vertices.end(); ++itr )
23     {
24         os << osg::Vec3d(*itr) << std::endl;
25     }
26     os << os.END_BRACKET << std::endl;
27 }
28 
29 // _occluder
checkOccluder(const osg::ConvexPlanarOccluder & obj)30 static bool checkOccluder( const osg::ConvexPlanarOccluder& obj )
31 {
32     return obj.getOccluder().getVertexList().size()>0;
33 }
34 
readOccluder(osgDB::InputStream & is,osg::ConvexPlanarOccluder & obj)35 static bool readOccluder( osgDB::InputStream& is, osg::ConvexPlanarOccluder& obj )
36 {
37     osg::ConvexPlanarPolygon polygon;
38     readConvexPlanarPolygon( is, polygon );
39     obj.setOccluder( polygon );
40     return true;
41 }
42 
writeOccluder(osgDB::OutputStream & os,const osg::ConvexPlanarOccluder & obj)43 static bool writeOccluder( osgDB::OutputStream& os, const osg::ConvexPlanarOccluder& obj )
44 {
45     writeConvexPlanarPolygon( os, obj.getOccluder() );
46     return true;
47 }
48 
49 // _holeList
checkHoles(const osg::ConvexPlanarOccluder & obj)50 static bool checkHoles( const osg::ConvexPlanarOccluder& obj )
51 {
52     return obj.getHoleList().size()>0;
53 }
54 
readHoles(osgDB::InputStream & is,osg::ConvexPlanarOccluder & obj)55 static bool readHoles( osgDB::InputStream& is, osg::ConvexPlanarOccluder& obj )
56 {
57     unsigned int size = is.readSize(); is >> is.BEGIN_BRACKET;
58     for ( unsigned int i=0; i<size; ++i )
59     {
60         osg::ConvexPlanarPolygon polygon;
61         is >> is.PROPERTY("Polygon");
62         readConvexPlanarPolygon( is, polygon );
63         obj.addHole( polygon );
64     }
65     is >> is.END_BRACKET;
66     return true;
67 }
68 
writeHoles(osgDB::OutputStream & os,const osg::ConvexPlanarOccluder & obj)69 static bool writeHoles( osgDB::OutputStream& os, const osg::ConvexPlanarOccluder& obj )
70 {
71     const osg::ConvexPlanarOccluder::HoleList& holes = obj.getHoleList();
72     os.writeSize(holes.size()); os<< os.BEGIN_BRACKET << std::endl;
73     for ( osg::ConvexPlanarOccluder::HoleList::const_iterator itr=holes.begin();
74           itr!=holes.end(); ++itr )
75     {
76         os << os.PROPERTY("Polygon");
77         writeConvexPlanarPolygon( os, *itr );
78     }
79     os << os.END_BRACKET << std::endl;
80     return true;
81 }
82 
83 REGISTER_OBJECT_WRAPPER( ConvexPlanarOccluder,
84                          new osg::ConvexPlanarOccluder,
85                          osg::ConvexPlanarOccluder,
86                          "osg::Object osg::ConvexPlanarOccluder" )
87 {
88     ADD_USER_SERIALIZER( Occluder );  // _occluder
89     ADD_USER_SERIALIZER( Holes );  // _holeList
90 }
91