00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include <stdlib.h>
00044 #include <stdio.h>
00045 #include <OSGConfig.h>
00046 #include <OSGGL.h>
00047 #include <OSGNodePtr.h>
00048 #include <OSGTileCameraDecorator.h>
00049 #include <OSGViewport.h>
00050 #include <OSGGeometry.h>
00051 #include <OSGStereoBufferViewport.h>
00052 #include <OSGRenderAction.h>
00053 #include "OSGSortFirstWindow.h"
00054 #include "OSGClusterViewBuffer.h"
00055 #include "OSGConnection.h"
00056 #include "OSGRenderNode.h"
00057 #include "OSGTileGeometryLoad.h"
00058
00059 OSG_USING_NAMESPACE
00060
00061 ClusterViewBuffer SortFirstWindow::_bufferHandler;
00062
00063
00064
00070
00071
00073
00074 SortFirstWindow::SortFirstWindow(void) :
00075 Inherited(),
00076 _tileLoadBalancer(NULL),
00077 _renderNode(NULL)
00078 {
00079 }
00080
00082
00083 SortFirstWindow::SortFirstWindow(const SortFirstWindow &source) :
00084 Inherited(source),
00085 _tileLoadBalancer(NULL),
00086 _renderNode(NULL)
00087 {
00088 }
00089
00091
00092 SortFirstWindow::~SortFirstWindow(void)
00093 {
00094 if(_tileLoadBalancer)
00095 delete _tileLoadBalancer;
00096 if(_renderNode)
00097 delete _renderNode;
00098 }
00099
00100
00101
00103
00104 void SortFirstWindow::initMethod (void)
00105 {
00106 }
00107
00109
00110 void SortFirstWindow::changed(BitVector whichField, UInt32 origin)
00111 {
00112 Inherited::changed(whichField, origin);
00113 }
00114
00116
00117 void SortFirstWindow::dump( UInt32 ,
00118 const BitVector ) const
00119 {
00120 SLOG << "Dump SortFirstWindow NI" << std::endl;
00121 }
00122
00123
00124
00128 void SortFirstWindow::serverInit( WindowPtr serverWindow,
00129 UInt32 id)
00130 {
00131 #if USE_VPORT_SLICES
00132
00133 #else
00134 UInt32 sync;
00135 RenderNode renderNode;
00136 Connection *connection=getNetwork()->getMainConnection();
00137
00138
00139
00140 renderNode.determinePerformance(serverWindow);
00141 renderNode.dump();
00142
00143 connection->putValue(id);
00144 renderNode.copyToBin(*connection);
00145 connection->flush();
00146 connection->selectChannel();
00147 connection->getValue(sync);
00148 #endif
00149 }
00150
00155 void SortFirstWindow::serverRender( WindowPtr serverWindow,
00156 UInt32 id,
00157 RenderActionBase *action )
00158 {
00159 TileCameraDecoratorPtr deco;
00160 ViewportPtr serverPort;
00161 ViewportPtr clientPort;
00162 UInt32 sv,cv,regionStart;
00163 UInt32 vpWidth;
00164 UInt32 vpHeight;
00165
00166
00167 for(cv=0,sv=0;cv<getPort().size();cv++)
00168 {
00169 clientPort = getPort()[cv];
00170 if(serverWindow->getPort().size() <= sv)
00171 {
00172
00173
00174 serverPort = ViewportPtr::dcast(clientPort->shallowCopy());
00175 deco=TileCameraDecorator::create();
00176 beginEditCP(serverWindow);
00177 serverWindow->addPort(serverPort);
00178 serverPort->setCamera(deco);
00179 endEditCP(serverWindow);
00180 }
00181 else
00182 {
00183 serverPort = serverWindow->getPort()[sv];
00184 deco=TileCameraDecoratorPtr::dcast(serverPort->getCamera());
00185 if(serverWindow->getPort()[sv]->getType() !=
00186 clientPort->getType())
00187 {
00188
00189 subRefCP(serverWindow->getPort()[sv]);
00190 serverPort = ViewportPtr::dcast(clientPort->shallowCopy());
00191 beginEditCP(serverWindow);
00192 serverWindow->getPort()[sv] = serverPort;
00193 serverPort->setCamera(deco);
00194 endEditCP(serverWindow);
00195 }
00196 else
00197 {
00198 deco=TileCameraDecoratorPtr::dcast(serverPort->getCamera());
00199 }
00200
00201
00202 }
00203
00204
00205 beginEditCP(serverPort);
00206 regionStart=cv * getServers().size() * 4 + id * 4;
00207 serverPort->setSize(
00208 Real32(getRegion()[regionStart+0] + clientPort->getPixelLeft()),
00209 Real32(getRegion()[regionStart+1] + clientPort->getPixelBottom()),
00210 Real32(getRegion()[regionStart+2] + clientPort->getPixelLeft()),
00211 Real32(getRegion()[regionStart+3] + clientPort->getPixelBottom()));
00212
00213 serverPort->setRoot ( clientPort->getRoot() );
00214 serverPort->setBackground( clientPort->getBackground() );
00215 serverPort->getMFForegrounds()->setValues( clientPort->getForegrounds() );
00216 serverPort->setTravMask ( clientPort->getTravMask() );
00217 endEditCP(serverPort);
00218
00219
00220 vpWidth =clientPort->getPixelWidth();
00221 vpHeight=clientPort->getPixelHeight();
00222 beginEditCP(deco);
00223 deco->setFullWidth ( vpWidth );
00224 deco->setFullHeight( vpHeight );
00225 deco->setSize( getRegion()[ regionStart+0 ]/(float)vpWidth,
00226 getRegion()[ regionStart+1 ]/(float)vpHeight,
00227 getRegion()[ regionStart+2 ]/(float)vpWidth,
00228 getRegion()[ regionStart+3 ]/(float)vpHeight );
00229 deco->setDecoratee( clientPort->getCamera() );
00230 endEditCP(deco);
00231 sv++;
00232 }
00233
00234 while(serverWindow->getPort().size()>sv)
00235 {
00236 serverWindow->subPort(sv);
00237 }
00238
00239 Inherited::serverRender(serverWindow,id,action);
00240
00241
00242 if(getCompose())
00243 {
00244 if(getCompression().empty())
00245 {
00246 _bufferHandler.setImgTransType(NULL);
00247 }
00248 else
00249 {
00250 _bufferHandler.setImgTransType(getCompression().c_str());
00251 }
00252 if(getSubtileSize())
00253 {
00254 _bufferHandler.setSubtileSize(getSubtileSize());
00255 }
00256 }
00257
00258 #if 1
00259 glDisable(GL_SCISSOR_TEST);
00260 glClearColor(0,0,0,0);
00261 glClear(GL_COLOR_BUFFER_BIT);
00262 #endif
00263
00264
00265 serverWindow->activate();
00266 serverWindow->frameInit();
00267 action->setWindow( serverWindow.getCPtr() );
00268 for(sv=0;sv<serverWindow->getPort().size();++sv)
00269 {
00270 ViewportPtr vp=serverWindow->getPort()[sv];
00271 vp->render( action );
00272
00273
00274 if(getCompose())
00275 {
00276
00277 vp->activate();
00278
00279
00280 _bufferHandler.send(
00281 *getNetwork()->getMainPointConnection(),
00282 ClusterViewBuffer::RGB,
00283 vp->getPixelLeft(),
00284 vp->getPixelBottom(),
00285 vp->getPixelRight(),
00286 vp->getPixelTop(),
00287 0,0);
00288
00289
00290 vp->deactivate();
00291 }
00292 }
00293 }
00294
00297 void SortFirstWindow::serverSwap( WindowPtr window,
00298 UInt32 )
00299 {
00300 if(!getCompose())
00301 {
00302 Connection *connection=getNetwork()->getMainConnection();
00303 connection->signal();
00304 connection->wait();
00305 }
00306 window->swap();
00307 }
00308
00309
00310
00314 void SortFirstWindow::clientInit( void )
00315 {
00316 #if USE_VPORT_SLICES
00317
00318 #else
00319 UInt32 id;
00320 RenderNode renderNode;
00321 GroupConnection *connection = getNetwork()->getMainGroupConnection();
00322 Connection::Channel channel;
00323
00324 _tileLoadBalancer=new TileLoadBalancer(getUseFaceDistribution());
00325
00326 for(UInt32 i=0;i<connection->getChannelCount();++i)
00327 {
00328 printf("%d\n",i);
00329 channel = connection->selectChannel();
00330 connection->subSelection(channel);
00331 connection->getValue(id);
00332 renderNode.copyFromBin(*connection);
00333 renderNode.dump();
00334 _tileLoadBalancer->addRenderNode(renderNode,id);
00335 }
00336 connection->resetSelection();
00337 printf("end\n");
00338
00339 connection->putValue(id);
00340 connection->flush();
00341 #endif
00342
00343 Inherited::clientInit();
00344 }
00345
00349 void SortFirstWindow::clientPreSync( void )
00350 {
00351 SortFirstWindowPtr ptr=SortFirstWindowPtr(this);
00352 if(getCompose())
00353 {
00354
00355 if(getClientWindow() != NullFC)
00356 {
00357 if(getWidth() != getClientWindow()->getWidth() ||
00358 getHeight() != getClientWindow()->getHeight())
00359 {
00360 beginEditCP(ptr,
00361 Window::WidthFieldMask|
00362 Window::HeightFieldMask);
00363 {
00364 setSize(getClientWindow()->getWidth(),
00365 getClientWindow()->getHeight());
00366 }
00367 endEditCP(ptr,
00368 Window::WidthFieldMask|
00369 Window::HeightFieldMask);
00370 }
00371 }
00372 }
00373 #if 0
00374 else
00375 {
00376 beginEditCP(ptr,
00377 Window::WidthFieldMask|
00378 Window::HeightFieldMask);
00379 {
00380 setSize(1280,
00381 1024);
00382 }
00383 endEditCP(ptr,
00384 Window::WidthFieldMask|
00385 Window::HeightFieldMask);
00386 }
00387 #endif
00388 UInt32 i;
00389 UInt32 cv;
00390 TileLoadBalancer::ResultT region;
00391
00392 beginEditCP(ptr,SortFirstWindow::RegionFieldMask);
00393 getRegion().clear();
00394 #if USE_VPORT_SLICES
00395 for(cv=0;cv<getPort().size();cv++)
00396 {
00397 int s=getServers().size();
00398 for(i=0;i<s;i++)
00399 {
00400 getRegion().push_back(i/float(s)*getWidth());
00401 getRegion().push_back(0);
00402 getRegion().push_back((i+1)/float(s)*getWidth());
00403 getRegion().push_back(1*getHeight());
00404 }
00405 }
00406 #else
00407 for(cv=0;cv<getPort().size();cv++)
00408 {
00409 _tileLoadBalancer->update( getPort()[cv]->getRoot() );
00410 _tileLoadBalancer->balance(getPort()[cv],
00411 false,
00412 region);
00413 for(i=0;i<getServers().size();i++)
00414 {
00415 getRegion().push_back(region[i].x1);
00416 getRegion().push_back(region[i].y1);
00417 getRegion().push_back(region[i].x2);
00418 getRegion().push_back(region[i].y2);
00419 }
00420 }
00421 #endif
00422
00423 endEditCP(ptr,SortFirstWindow::RegionFieldMask);
00424
00425 Inherited::clientPreSync();
00426 }
00427
00433 void SortFirstWindow::clientRender( RenderActionBase * )
00434 {
00435
00436 }
00437
00441 void SortFirstWindow::clientSwap( void )
00442 {
00443 UInt32 cv;
00444 GroupConnection *connection=getNetwork()->getMainGroupConnection();
00445 if(getCompose())
00446 {
00447 if(getClientWindow()!=NullFC)
00448 {
00449
00450 for(cv=0;cv<getPort().size();++cv)
00451 {
00452 ViewportPtr vp=getPort()[cv];
00453
00454
00455 vp->activate();
00456
00457
00458 _bufferHandler.recv(*connection);
00459
00460
00461 vp->deactivate();
00462 }
00463 Inherited::clientSwap();
00464 }
00465 }
00466 else
00467 {
00468 connection->wait();
00469 connection->signal();
00470 }
00471 }
00472
00473
00474
00475
00476
00477 #ifdef __sgi
00478 #pragma set woff 1174
00479 #endif
00480
00481 #ifdef OSG_LINUX_ICC
00482 #pragma warning( disable : 177 )
00483 #endif
00484
00485 namespace
00486 {
00487 static char cvsid_cpp[] = "@(#)$Id:$";
00488 static char cvsid_hpp[] = OSGSORTFIRSTWINDOW_HEADER_CVSID;
00489 static char cvsid_inl[] = OSGSORTFIRSTWINDOW_INLINE_CVSID;
00490 }