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