source: osgVisual/src/dataIO/visual_dataIO.cpp @ 81

Last change on this file since 81 was 75, checked in by Torben Dannhauer, 14 years ago
File size: 10.0 KB
RevLine 
[31]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 "visual_dataIO.h"
18
19using namespace osgVisual;
20
21visual_dataIO::visual_dataIO()
22{
23        OSG_NOTIFY( osg::ALWAYS ) << "visual_dataIO constructed" << std::endl;
24
25        initialized = false;
26}
27
28visual_dataIO::~visual_dataIO()
29{
30        OSG_NOTIFY( osg::ALWAYS ) << "visual_dataIO destructed" << std::endl;
31}
32
33visual_dataIO* visual_dataIO::getInstance()
34{
35        static visual_dataIO instance; 
36        return &instance; 
37};
38
39void visual_dataIO::init(osgViewer::Viewer* viewer_, osg::ArgumentParser& arguments_)
40{
41        OSG_NOTIFY( osg::ALWAYS ) << "visual_dataIO init()" << std::endl;
42
43        // Init variables
44        viewer = viewer_;
45
46        // Parse operating Mode
47    if (arguments_.read("-m"))
48        {
49                OSG_NOTIFY( osg::ALWAYS ) << "Configure osgVisual as MASTER" << std::endl;
50                clusterMode = osgVisual::dataIO_cluster::MASTER;
51                // Create Container:
52                slotContainer = new osgVisual::dataIO_transportContainer();
53        }
54        else if (arguments_.read("-s"))
55        {
56                OSG_NOTIFY( osg::ALWAYS ) << "Configure osgVisual as SLAVE" << std::endl;
57                clusterMode = osgVisual::dataIO_cluster::SLAVE;
[67]58                slotContainer = NULL;   // Slave only recieves container, therefor set this Pointer null.
[31]59        }
60        else
61        {
62                OSG_NOTIFY( osg::ALWAYS ) << "Configure osgVisual as STANDALONE" << std::endl;
63                clusterMode = osgVisual::dataIO_cluster::STANDALONE;
64                // Create Container:
65                slotContainer = new osgVisual::dataIO_transportContainer();
66        }
67
68        // Create Cluster.
69        #ifdef USE_CLUSTER_DUMMY
70                cluster = new dataIO_clusterDummy();
71        #endif
[58]72        #ifdef USE_CLUSTER_ASIO_TCP_IOSTREAM
73                cluster = new dataIO_clusterAsioTcpIostream();
74        #endif
[31]75        #ifdef USE_CLUSTER_UDP
76                cluster = new dataIO_clusterUDP();
77        #endif
[65]78        #ifdef USE_CLUSTER_ENET
79                cluster = new dataIO_clusterENet();
[69]80                cluster->enableHardSync( false );       /** \todo : rebuild this structure in cluster.h and move it this way to a general implementation. */
[65]81        #endif
82        if(cluster.valid())
[69]83                //cluster->init(arguments_, clusterMode, slotContainer, true, false);
[75]84                cluster->init(arguments_, viewer_, clusterMode, slotContainer, false, false);
[31]85
86        // Create extLink.
87        #ifdef USE_EXTLINK_DUMMY
88                extLink = new dataIO_extLinkDummy( dataSlots );
89        #endif
90        #ifdef USE_EXTLINK_VCL
91                extLink = new dataIO_extLinkVCL( dataSlots );
92        #endif
93        extLink->init();
94
95       
96
97        // Install callbacks to perform DataIO activities every frame:
98        //// EventCallback at the absolute beginning of the frame
99        eventCallback = new dataIO_eventCallback(this);
100        viewer->getCamera()->setEventCallback( eventCallback );
101        //// FinalDrawCallback at the end of event and update handling, but BEFORE rendering the frame
102        finalDrawCallback = new dataIO_finalDrawCallback(this);
103        viewer->getCamera()->setFinalDrawCallback( finalDrawCallback );
104
105        initialized = true;
106}
107
108void visual_dataIO::shutdown()
109{
110        if(initialized)
111        {
112                OSG_NOTIFY( osg::ALWAYS ) << "Shutdown visual_dataIO..." << std::endl;
113
[70]114                viewer->getCamera()->removeEventCallback( eventCallback );
[31]115                eventCallback = NULL;
116                viewer->getCamera()->setFinalDrawCallback( NULL );
117                finalDrawCallback = NULL;
[70]118               
[31]119                viewer = NULL;
[70]120               
[31]121
[65]122                if(cluster.valid())
123                        cluster->shutdown();
124                if(extLink.valid())
[31]125                extLink->shutdown();
126        }
127}
128
129void visual_dataIO::dataIO_eventCallback::operator()(osg::Node* node, osg::NodeVisitor* nv)
130{
131        // perform all actions for the eventDrawCallback.
132        OSG_NOTIFY( osg::INFO ) << "---- Executing EventCallback.." <<  std::endl;
133
134        switch( dataIO->clusterMode )
135        {
136                case osgVisual::dataIO_cluster::MASTER : 
137                        {
138                                dataIO->extLink->readTO_OBJvalues();
139                                dataIO->cluster->sendTO_OBJvaluesToSlaves();
140                        }
141                        break;
142                case osgVisual::dataIO_cluster::SLAVE : 
143                        {
144                                dataIO->cluster->readTO_OBJvaluesFromMaster();
145                        }
146                        break;
147                case osgVisual::dataIO_cluster::STANDALONE : 
148                        {
149                                dataIO->extLink->readTO_OBJvalues();
150                        }
151                        break;
152                default:
153                        OSG_NOTIFY( osg::FATAL ) << "ERROR: Unkown clustermode!" <<  std::endl;
154                        break;
155        };
[73]156        traverse(node, nv);
[31]157}
158
159void visual_dataIO::dataIO_finalDrawCallback::operator() (const osg::Camera& camera) const
160{
161        // perform all actions for the initialDrawCallback.
162        OSG_NOTIFY( osg::INFO ) << "---- Executing InitialDrawCallback.." << std::endl;
163
164        switch( dataIO->clusterMode )
165        {
166                case osgVisual::dataIO_cluster::MASTER : 
167                        {
168                                dataIO->extLink->writebackFROM_OBJvalues();
169                                dataIO->cluster->waitForAllReadyToSwap();
170                                dataIO->cluster->sendSwapCommand();
171                        }
172                        break;
173                case osgVisual::dataIO_cluster::SLAVE : 
174                        {
175                                dataIO->cluster->reportAsReadyToSwap();
176                                dataIO->cluster->waitForSwap();
177                        }
178                        break;
179                case osgVisual::dataIO_cluster::STANDALONE : 
180                        {
181                                dataIO->extLink->writebackFROM_OBJvalues();
182                        }
183                        break;
184                default:
185                        OSG_NOTIFY( osg::FATAL ) << "ERROR: visual_dataIO::dataIO_finalDrawCallback::operator() - Unkown clustermode!" <<  std::endl;
186                        break;
187        };
188}
189
190void* visual_dataIO::getSlotPointer(std::string variableName_, osgVisual::dataIO_slot::dataDirection direction_, osgVisual::dataIO_slot::varType variableTyp_ )
191{
192        // iterate through slotlist. If found, return pointer, else add slot to list and return pointer
193        for (unsigned int i=0; i<dataSlots.size(); i++)
194        {
195                // Check if this variable name&-type already exists
196                if( dataSlots[i].variableName == variableName_ && dataSlots[i].direction == direction_  && dataSlots[i].variableType ==  variableTyp_)
197                {
198                        //OSG_NOTIFY( osg::INFO ) << "visual_dataIO::getSlotPointer() - Slot found at position " << i << std::endl;
199                        // Return pointer to the value
200                        if (variableTyp_ == osgVisual::dataIO_slot::STRING )
201                                return &(dataSlots[i].sValue);
202                        else
203                                return &(dataSlots[i].value);
204                }
205        }
206
207        // Slot does not exist -> add it to slot list
208        //OSG_NOTIFY( osg::INFO ) << "visual_dataIO::getSlotPointer() - Slot not found, will add as new slot " << std::endl;
209        dataIO_slot newSlot;
210        newSlot.variableName = variableName_;
211        newSlot.variableType = variableTyp_;
212        newSlot.value = 0;
213        newSlot.sValue = "";
214        dataSlots.push_back( newSlot );
215        if (variableTyp_ == osgVisual::dataIO_slot::STRING )
216                return &(dataSlots.back().sValue);
217        else
218        {
219                return &(dataSlots.back().value);
220        }
221}
222
223double visual_dataIO::getSlotDataAsDouble(std::string variableName_, osgVisual::dataIO_slot::dataDirection direction_ )
224{
225        // iterate through slotlist. If found, return value
226        for (unsigned int i=0; i<dataSlots.size(); i++)
227        {
228                // Check if this variable name&-type already exists
229                if( dataSlots[i].variableName == variableName_ && dataSlots[i].direction == direction_  && dataSlots[i].variableType == osgVisual::dataIO_slot::DOUBLE )
230                {
231                        //OSG_NOTIFY( osg::INFO ) << "visual_dataIO::getSlotDataAsDouble() - Slot found at position " << i << std::endl;
232                        return dataSlots[i].value;
233                }
234        }
235        return 0;
236}
237
238std::string visual_dataIO::getSlotDataAsString(std::string variableName_, osgVisual::dataIO_slot::dataDirection direction_ )
239{
240        // iterate through slotlist. If found, return value
241        for (unsigned int i=0; i<dataSlots.size(); i++)
242        {
243                // Check if this variable name&-type already exists
244                if( dataSlots[i].variableName == variableName_ && dataSlots[i].direction == direction_  && dataSlots[i].variableType == osgVisual::dataIO_slot::STRING )
245                {
246                        //OSG_NOTIFY( osg::INFO ) << "visual_dataIO::getSlotDataAsDouble() - Slot found at position " << i << std::endl;
247                        return dataSlots[i].sValue;
248                }
249        }
250        return "";
251}
252
253void visual_dataIO::setSlotData(std::string variableName_, osgVisual::dataIO_slot::dataDirection direction_, std::string sValue_ )
254{
255        bool slotFound = false;
256        // iterate through slotlist. If found, return pointer, else add slot to list
257        for (unsigned int i=0; i<dataSlots.size(); i++)
258        {
259                // Check if this variable name&-type already exists
260                if( dataSlots[i].variableName == variableName_ && dataSlots[i].direction == direction_ && dataSlots[i].variableType ==  osgVisual::dataIO_slot::STRING)
261                {
262                        // Update value
263                        dataSlots[i].sValue = sValue_;
264                        slotFound = true;
265                }
266               
267        }
268
269        if (!slotFound)
270        {
271                // Slot does not exist -> add it to slot list
272                dataIO_slot newSlot;
273                newSlot.variableName = variableName_;
274                newSlot.direction = direction_;
275                newSlot.variableType = osgVisual::dataIO_slot::STRING;
276                newSlot.value = 0;
277                newSlot.sValue = sValue_;
278                dataSlots.push_back( newSlot );
279        }
280}
281
282void visual_dataIO::setSlotData(std::string variableName_, osgVisual::dataIO_slot::dataDirection direction_, double value_ )
283{
284        // iterate through slotlist. If found, return pointer, else add slot to list
285        bool slotFound = false;
286        for (unsigned int i=0; i<dataSlots.size(); i++)
287        {
288                // Check if this variableName & -type already exists
289                if( dataSlots[i].variableName == variableName_ && dataSlots[i].direction == direction_ && dataSlots[i].variableType ==  osgVisual::dataIO_slot::DOUBLE)
290                {
291                        // Update value
292                        //OSG_NOTIFY( osg::ALWAYS ) << "setSlotData: " << variableName_ << " - value: " << value_ << std::endl;
293                        dataSlots[i].value = value_;
294                        slotFound = true;
295                }       
296        }
297
298        if (!slotFound)
299        {
300                // Slot does not exist -> add it to slot list
301                dataIO_slot newSlot;
302                newSlot.variableName = variableName_;
303                newSlot.direction = direction_;
304                newSlot.variableType = osgVisual::dataIO_slot::DOUBLE;
305                newSlot.value = value_;
306                newSlot.sValue = "";
307                dataSlots.push_back( newSlot );
308        }
309}
Note: See TracBrowser for help on using the repository browser.