source: osgVisual/src/cluster/dataIO_clusterENet.cpp @ 74

Last change on this file since 74 was 74, checked in by Torben Dannhauer, 14 years ago
File size: 8.1 KB
Line 
1/* -*-c++-*- osgVisual - Copyright (C) 2009-2010 Torben Dannhauer
2 *
3 * This library is based on OpenSceneGraph, 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.
7 *
8 * osgVisual requires for some proprietary modules a license from the correspondig manufacturer.
9 * You have to aquire licenses for all used proprietary modules.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * OpenSceneGraph Public License for more details.
15*/
16
17#include "dataIO_clusterENet.h"
18
19using namespace osgVisual;
20
21dataIO_clusterENet::dataIO_clusterENet()
22{
23        OSG_NOTIFY( osg::ALWAYS ) << "clusterENet constructed" << std::endl;
24        serverToConnect = "unknown";
25        hardSync = false;       // integrate into init()
26        port = 12345;   // integrate into init()
27}
28
29
30dataIO_clusterENet::~dataIO_clusterENet(void)
31{
32        OSG_NOTIFY( osg::ALWAYS ) << "clusterENet destructed" << std::endl;
33}
34
35
36void dataIO_clusterENet::init( osg::ArgumentParser& arguments_, osgViewer::Viewer* viewer_, clustermode clusterMode_, osgVisual::dataIO_transportContainer* sendContainer_, bool compressionEnabled_, bool asAscii_ )
37{
38        OSG_NOTIFY( osg::ALWAYS ) << "clusterENet init();" << std::endl;
39       
40        // Store viewer
41        viewer = viewer_;
42
43        // Configure the clustermode
44        clusterMode = clusterMode_;
45
46        // store sendContainer
47        sendContainer = sendContainer_;
48
49        // Configure Compression and instantiate read/write-options
50        std::string readOptionString = "";
51        std::string writeOptionString = "";
52        if(asAscii_)
53        {
54                readOptionString = "Ascii";
55                writeOptionString = "Ascii";
56        }
57        if (compressionEnabled_)
58                writeOptionString+=" Compressor=zlib";
59        readOptions = new osgDB::Options( readOptionString.c_str() );
60        writeOptions = new osgDB::Options( writeOptionString.c_str() );
61
62        // Get ReaderWriter
63        rw = osgDB::Registry::instance()->getReaderWriterForExtension("osgb"); 
64       
65        // create ENet implementation object.
66        enet_impl = new osgVisual::dataIO_clusterENet_implementation(receivedTransportContainer);
67
68        // initialize ENet implementation
69        if(clusterMode == MASTER)
70        {
71                std::cout << "Init dataIO_cluster_ENet as Server on port " << port << std::endl;
72                enet_impl->init(dataIO_clusterENet_implementation::SERVER, port);
73
74                initialized = true;
75        }
76        if(clusterMode == SLAVE)
77        {
78                // Get the server IP
79                if(!arguments_.read("--server",serverToConnect, port))
80                {
81                        // try server discovery
82                        //discoverServer(serverToConnect,port);
83                        /* todo : implement a udp server discovery based on ASIO */
84                }
85
86                // Init ENet
87                enet_impl->init(dataIO_clusterENet_implementation::CLIENT, port);
88
89                // Connect to server with 5 retries:
90                bool connected = false;
91                for(int i=0; i<5; i++)
92                {
93                        std::cout << "Try to connect to server " << serverToConnect << std::endl;
94                        if( enet_impl->connectTo( serverToConnect.c_str(), 5000 ) )
95                        {
96                                // Connect successful.
97                                initialized = true;
98                                connected = true;
99                                break;
100                        }
101                }       // For END
102                if(!connected)
103                {
104                        initialized = false;
105                        std::cout << "Finally failed to establish connection to server " << serverToConnect << std::endl;
106                        exit(-1);
107                }
108        }       // IF SLAVE END
109}
110
111
112void dataIO_clusterENet::shutdown()
113{
114        OSG_NOTIFY( osg::ALWAYS ) << "clusterENet shutdown();" << std::endl;
115}
116
117
118bool dataIO_clusterENet::sendTO_OBJvaluesToSlaves()
119{
120        //OSG_NOTIFY( osg::ALWAYS ) << "clusterENet sendTO_OBJvaluesToSlaves()" << std::endl;
121
122        if(sendContainer.valid())
123        {
124                // Pack FrameID & Viewmatrix
125                sendContainer->setFrameID(viewer->getFrameStamp()->getFrameNumber());
126                sendContainer->setViewMatrix(viewer->getCamera()->getViewMatrix());
127                osg::Vec3d eye, center, up;
128                viewer->getCamera()->getViewMatrixAsLookAt(eye,center,up);
129                sendContainer->setEye(eye);
130                sendContainer->setCenter(center);
131                sendContainer->setUp(up);
132                //std::cout << "sending lookat: eye:"<<eye<<", center:"<<center<<", up:" << up << std::endl;
133
134                // Writing node to stream
135                std::stringstream myOstream;
136                if ( rw )
137                {
138                        osgDB::ReaderWriter::WriteResult wr = rw->writeObject( *sendContainer.get(), myOstream, writeOptions );
139                        if (wr.success() )                     
140                        {
141                                // Send Data via ENet:
142                                //OSG_NOTIFY( osg::ALWAYS ) << "dataIO_clusterUDP::sendTO_OBJvaluesToSlaves() - Bytes to send: " << myOstream.str().length() << std::endl;
143                                //OSG_NOTIFY( osg::ALWAYS ) << "Send: " << myOstream.str() << std::endl;
144                                OSG_NOTIFY( osg::ALWAYS ) << "Sent Framenumber: " << viewer->getFrameStamp()->getFrameNumber() << std::endl;
145                                ENetPacket * packet = enet_packet_create (myOstream.str().c_str(), 
146                                                                                                  myOstream.str().size(), 
147                                                                                                  ENET_PACKET_FLAG_RELIABLE);
148               
149                                // Send data
150                                enet_impl->sendPacket( packet, 0, 0, true);
151                        }
152                        else OSG_NOTIFY( osg::WARN ) << "ERROR: dataIO_clusterENet::sendTO_OBJvaluesToSlaves() :: Save failed: " << wr.message() << std::endl;
153                }
154                else OSG_NOTIFY( osg::WARN ) << "ERROR: dataIO_clusterENet::sendTO_OBJvaluesToSlaves() :: Unable to get readerWriter for osgb" << std::endl;
155        }
156        else OSG_NOTIFY( osg::WARN ) << "ERROR: dataIO_clusterENet::sendTO_OBJvaluesToSlaves() :: Invalid transportContainer" << std::endl;
157
158
159        enet_impl->processEvents();     // As Master: process events AFTER doing anything to have up to have the "sent" commands in queue.
160        return true;
161}
162
163
164bool dataIO_clusterENet::readTO_OBJvaluesFromMaster()
165{
166        //OSG_NOTIFY( osg::ALWAYS ) << "clusterENet readTO_OBJvaluesFromMaster()" << std::endl;
167        enet_impl->processEvents();     // As Slave: process events BEFORE doing anything to have up to date values.
168
169        int bytes_received = receivedTransportContainer.size();
170        if (bytes_received > 0 )
171        {
172                //OSG_NOTIFY( osg::ALWAYS ) << "dataIO_clusterENet::readTO_OBJvaluesFromMaster() - Bytes received: " << bytes_received << std::endl;
173                //OSG_NOTIFY( osg::ALWAYS ) << "Received: " << std::endl << receivedTransportContainer << std::endl;
174               
175
176                // Unserialize data
177                if ( rw )
178                {
179                        std::stringstream test;
180                        test << receivedTransportContainer;
181                        osgDB::ReaderWriter::ReadResult rr = rw->readObject( test, readOptions );
182                        if (rr.success())
183                        {
184                                sendContainer = dynamic_cast<osgVisual::dataIO_transportContainer*>(rr.takeObject());
185                                if (sendContainer)
186                                {
187                                        OSG_NOTIFY( osg::ALWAYS ) << "Received:: Settings Viewmatrix...FrameID is: " << sendContainer->getFrameID() << std::endl;
188                                        // Restore Viewmatrix
189                                        viewer->getCamera()->setViewMatrix(sendContainer->getViewMatrix());
190                                        //viewer->getCamera()->setViewMatrixAsLookAt(sendContainer->getEye(),sendContainer->getCenter(),sendContainer->getUp());
191                                        //std::cout << "receiving lookat: eye:"<<eye.x()<<", center:"<<center<<", up:" << up << std::endl;
192                                }
193                                else
194                                        OSG_NOTIFY( osg::WARN ) << "ERROR: dataIO_clusterENet::readTO_OBJvaluesFromMaster() - Unable to cast converted node to transportContainer" << std::endl;
195                        }
196                        else
197                                OSG_NOTIFY( osg::WARN ) << "ERROR: dataIO_clusterENet::readTO_OBJvaluesFromMaster() - Unable to convert stream to node" << std::endl;
198                }
199                else
200                        OSG_NOTIFY( osg::WARN ) << "ERROR: dataIO_clusterENet::readTO_OBJvaluesFromMaster() - Unable to get readerWriter for osgb" << std::endl;
201        }       // IF bytes recv > 0 END
202
203
204
205        return true;
206}
207
208
209void dataIO_clusterENet::reportAsReadyToSwap()
210{
211        if(!hardSync)
212                return;
213
214        OSG_NOTIFY( osg::ALWAYS ) << "clusterENet reportAsReadyToSwap()" << std::endl;
215}
216
217bool dataIO_clusterENet::waitForSwap()
218{
219        if(!hardSync)
220                return true;
221
222        OSG_NOTIFY( osg::ALWAYS ) << "clusterENet waitForSwap()" << std::endl;
223
224        return true;
225}
226
227
228bool dataIO_clusterENet::waitForAllReadyToSwap()
229{
230        if(!hardSync)
231                return true;
232
233        OSG_NOTIFY( osg::ALWAYS ) << "clusterENet waitForAllReadyToSwap()" << std::endl;
234
235        return true;
236}
237
238
239bool dataIO_clusterENet::sendSwapCommand()
240{
241        if(!hardSync)
242                return true;
243
244        OSG_NOTIFY( osg::ALWAYS ) << "clusterENet sendSwapCommand()" << std::endl;
245
246        return true;
247}
Note: See TracBrowser for help on using the repository browser.