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
00046 #include <OSGConfig.h>
00047 #include <OSGCamera.h>
00048
00049 #include "OSGImageComposer.h"
00050
00051 OSG_USING_NAMESPACE
00052
00064
00065
00066
00067 void ImageComposer::initMethod (void)
00068 {
00069 }
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 ImageComposer::ImageComposer(void) :
00083 Inherited()
00084 {
00085 }
00086
00087 ImageComposer::ImageComposer(const ImageComposer &source) :
00088 Inherited(source)
00089 {
00090 }
00091
00092 ImageComposer::~ImageComposer(void)
00093 {
00094 }
00095
00096
00097
00098 void ImageComposer::changed(BitVector whichField, UInt32 origin)
00099 {
00100 Inherited::changed(whichField, origin);
00101 }
00102
00103 void ImageComposer::dump( UInt32 ,
00104 const BitVector ) const
00105 {
00106 SLOG << "Dump ImageComposer NI" << std::endl;
00107 }
00108
00109
00110
00113 void ImageComposer::setup(bool isClient,
00114 UInt32 clusterId,
00115 WindowPtr localWindow,
00116 ClusterWindowPtr clusterWindow)
00117 {
00118 _isClient = isClient;
00119 _clusterId = clusterId;
00120 _localWindow = localWindow;
00121 _clusterWindow = clusterWindow;
00122 _clusterSize = clusterWindow->getServers().size()+1;
00123 _serverCount = clusterWindow->getServers().size();
00124 }
00125
00126
00127
00130 void ImageComposer::open( void )
00131 {
00132 }
00133
00136 void ImageComposer::startFrame( void )
00137 {
00138 }
00139
00143 void ImageComposer::startViewport( ViewportPtr )
00144 {
00145 }
00146
00149 void ImageComposer::composeViewport( ViewportPtr )
00150 {
00151 }
00152
00155 void ImageComposer::composeWindow( void )
00156 {
00157 }
00158
00161 void ImageComposer::close( void )
00162 {
00163 }
00164
00165
00166
00171 bool ImageComposer::getClientRendering()
00172 {
00173 return true;
00174 }
00175
00178 UInt32 ImageComposer::getUsableServers()
00179 {
00180 return serverCount();
00181 }
00182
00183
00184
00189 bool ImageComposer::getScreenAlignedBBox(NodePtr node,ViewportPtr vp,
00190 UInt32 &l,UInt32 &b,
00191 UInt32 &r,UInt32 &t,
00192 UInt32 &front,UInt32 &back)
00193 {
00194 UInt32 width = vp->getPixelWidth();
00195 UInt32 height = vp->getPixelHeight();
00196 Matrix viewing;
00197 Matrix projection;
00198 Real32 rNear = vp->getCamera()->getNear();
00199 Vec3f vol[2];
00200 Pnt3f pnt;
00201 Real32 minx=0,miny=0,minz=0;
00202 Real32 maxx=0,maxy=0,maxz=0;
00203 Matrix *p;
00204
00205 vp->getCamera()->getViewing(viewing,width,height);
00206 vp->getCamera()->getProjection(projection,width,height);
00207
00208
00209 l=b=r=t=0;
00210
00211 Matrix m=node->getToWorld();
00212 m.multLeft(viewing);
00213
00214 node->updateVolume();
00215 DynamicVolume volume=node->getVolume();
00216
00217
00218
00219
00220
00221
00222
00223
00224 volume.transform(m);
00225
00226 volume.getBounds(vol[0], vol[1]);
00227
00228 if(vol[0][2] > -rNear)
00229 return false;
00230 if(vol[1][2] > -rNear)
00231 {
00232
00233 vol[1][2] = -rNear;
00234 p=&projection;
00235 }
00236 else
00237 {
00238
00239 node->getVolume().getBounds(vol[0], vol[1]);
00240 m.multLeft(projection);
00241 p=&m;
00242 }
00243
00244 for(int i=0;i<8;++i)
00245 {
00246 p->multFullMatrixPnt(Pnt3f( vol[ (i )&1 ][0] ,
00247 vol[ (i>>1)&1 ][1] ,
00248 vol[ (i>>2)&1 ][2]) , pnt);
00249 if(i>0)
00250 {
00251 if(minx > pnt[0]) minx = pnt[0];
00252 if(miny > pnt[1]) miny = pnt[1];
00253 if(minz > pnt[2]) minz = pnt[2];
00254 if(maxx < pnt[0]) maxx = pnt[0];
00255 if(maxy < pnt[1]) maxy = pnt[1];
00256 if(maxz < pnt[2]) maxz = pnt[2];
00257 }
00258 else
00259 {
00260 maxx = minx = pnt[0];
00261 maxy = miny = pnt[1];
00262 maxz = minz = pnt[2];
00263 }
00264 }
00265
00266
00267 if(maxx<-1 || maxy<-1 ||
00268 minx> 1 || miny> 1)
00269 {
00270 return false;
00271 }
00272 else
00273 {
00274 minx=width * ( minx + 1.0 ) / 2.0 - .5;
00275 maxx=width * ( maxx + 1.0 ) / 2.0 + .5;
00276 miny=height * ( miny + 1.0 ) / 2.0 - .5;
00277 maxy=height * ( maxy + 1.0 ) / 2.0 + .5;
00278
00279 if(minx < 0 ) minx = 0;
00280 if(maxx >= width ) maxx = width-1;
00281
00282 if(miny < 0 ) miny = 0;
00283 if(maxy >= height) maxy = height-1;
00284
00285 l=(Int32)minx;
00286 b=(Int32)miny;
00287 r=(Int32)maxx;
00288 t=(Int32)maxy;
00289
00290
00291
00292
00293
00294
00295 front = (UInt32)( (double)(((UInt64)1)<<32) * (minz+1) / 2);
00296 back = (UInt32)( (double)(((UInt64)1)<<32) * (maxz+1) / 2);
00297 }
00298
00299 #if 0
00300 glPushMatrix();
00301 glLoadIdentity();
00302 glMatrixMode(GL_PROJECTION);
00303 glPushMatrix();
00304 glLoadIdentity();
00305 glOrtho(0,width,
00306 0,height,
00307 -1,1);
00308 glDisable(GL_DEPTH_TEST);
00309 glEnable(GL_COLOR_MATERIAL);
00310 glBegin(GL_LINE_LOOP);
00311 glColor3f(1, 1, 0);
00312 glVertex2f(l,b);
00313 glVertex2f(r,b);
00314 glVertex2f(r,t);
00315 glVertex2f(l,t);
00316 glEnd();
00317 glDisable(GL_COLOR_MATERIAL);
00318 glEnable(GL_DEPTH_TEST);
00319 glPopMatrix();
00320 glMatrixMode(GL_MODELVIEW);
00321 glPopMatrix();
00322 glPopAttrib();
00323 #endif
00324
00325 return true;
00326 }
00327
00328
00329
00330
00331 #ifdef OSG_SGI_CC
00332 #pragma set woff 1174
00333 #endif
00334
00335 #ifdef OSG_LINUX_ICC
00336 #pragma warning( disable : 177 )
00337 #endif
00338
00339 namespace
00340 {
00341 static Char8 cvsid_cpp [] = "@(#)$Id: $";
00342 static Char8 cvsid_hpp [] = OSGIMAGECOMPOSERBASE_HEADER_CVSID;
00343 static Char8 cvsid_inl [] = OSGIMAGECOMPOSERBASE_INLINE_CVSID;
00344
00345 static Char8 cvsid_fields_hpp[] = OSGIMAGECOMPOSERFIELDS_HEADER_CVSID;
00346 }
00347
00348 #ifdef __sgi
00349 #pragma reset woff 1174
00350 #endif
00351