Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

OSGDVRLookupTable.cpp

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------------*\
00002  *                                OpenSG                                     *
00003  *                                                                           *
00004  *                                                                           *
00005  *             Copyright (C) 2000,2001 by the OpenSG Forum                   *
00006  *                                                                           *
00007  *                            www.opensg.org                                 *
00008  *                                                                           *
00009  *   contact: dirk@opensg.org, gerrit.voss@vossg.org, jbehr@zgdv.de          *
00010  *                                                                           *
00011 \*---------------------------------------------------------------------------*/
00012 /*---------------------------------------------------------------------------*\
00013  *                                License                                    *
00014  *                                                                           *
00015  * This library is free software; you can redistribute it and/or modify it   *
00016  * under the terms of the GNU Library General Public License as published    *
00017  * by the Free Software Foundation, version 2.                               *
00018  *                                                                           *
00019  * This library is distributed in the hope that it will be useful, but       *
00020  * WITHOUT ANY WARRANTY; without even the implied warranty of                *
00021  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
00022  * Library General Public License for more details.                          *
00023  *                                                                           *
00024  * You should have received a copy of the GNU Library General Public         *
00025  * License along with this library; if not, write to the Free Software       *
00026  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                 *
00027  *                                                                           *
00028 \*---------------------------------------------------------------------------*/
00029 /*---------------------------------------------------------------------------*\
00030  *                                Changes                                    *
00031  *                                                                           *
00032  *                                                                           *
00033  *                                                                           *
00034  *                                                                           *
00035  *                                                                           *
00036  *                                                                           *
00037 \*---------------------------------------------------------------------------*/
00038 
00039 //---------------------------------------------------------------------------
00040 //  Includes
00041 //---------------------------------------------------------------------------
00042 
00043 #include <stdlib.h>
00044 #include <stdio.h>
00045 #include <iomanip>
00046 
00047 #include <OSGConfig.h>
00048 
00049 #include "OSGDVRLookupTable.h"
00050 
00051 OSG_USING_NAMESPACE
00052 
00057 /*----------------------- constructors & destructors ----------------------*/
00058 
00060 DVRLookupTable::DVRLookupTable(void) :
00061     Inherited()
00062 {
00063 #if 0
00064     commonConstructor();
00065 #endif
00066 }
00067 
00069 DVRLookupTable::DVRLookupTable(const DVRLookupTable &source) :
00070     Inherited(source)
00071 {
00072 #if 0
00073     commonConstructor();
00074 #endif
00075 }
00076 
00078 DVRLookupTable::~DVRLookupTable(void)
00079 {
00080 }
00081 
00082 /*----------------------------- class specific ----------------------------*/
00083 
00085 void DVRLookupTable::initMethod(void)
00086 {
00087 }
00088 
00090 void DVRLookupTable::changed(BitVector whichField, UInt32 origin)
00091 {
00092     SINFO << "DVRLookupTable::changed" << std::endl;
00093 
00094     if(whichField & DataFieldMask) 
00095     {
00096         // copy data from interleaved field to single fields
00097         UInt32 iter = 0;
00098 
00099         for(UInt32 i = 0; i < _sfDimension.getValue(); i++) 
00100         {
00101             for(UInt32 j = 0; j < _mfSize[i]; j++) 
00102             {
00103                 for (UInt32 k = 0; k < _sfChannel.getValue(); k++) 
00104                 {
00105 
00106 #if 1
00107 
00108                     if(_mfDataR.size() < _mfData.size() / 4) 
00109                     {
00110                         int size = _mfData.size() / 4;
00111 
00112                         _mfDataR.resize(size);
00113                         _mfDataG.resize(size);
00114                         _mfDataB.resize(size);
00115                         _mfDataA.resize(size);
00116                     }
00117 #endif
00118         
00120                     if(k == 0)
00121                     {
00122                         _mfDataR[j] = 
00123                             (Real32) _mfData[iter++] / 
00124                             (Real32) TypeTraits<UInt8>::getMax();
00125                     }
00126                     else if(k == 1)
00127                     {
00128                         _mfDataG[j] =
00129                             (Real32) _mfData[iter++] / 
00130                             (Real32) TypeTraits<UInt8>::getMax();
00131                     }
00132                     else if(k == 2)
00133                     {
00134                         _mfDataB[j] = 
00135                             (Real32) _mfData[iter++] / 
00136                             (Real32) TypeTraits<UInt8>::getMax();
00137                     }
00138                     else if(k == 3)
00139                     {
00140                         _mfDataA[j] =
00141                             (Real32) _mfData[iter++] / 
00142                             (Real32) TypeTraits<UInt8>::getMax();
00143                     }
00144                 }
00145             }
00146         }
00147     }
00148 
00149 
00150     if(whichField & DataRFieldMask) 
00151     {
00152         // copy data from R field to channel 0 of interleaved field
00153         UInt32 iter        = 0;
00154         UInt32 numChannels = _sfChannel.getValue();
00155 
00156         for(UInt32 i = 0; i < _sfDimension.getValue(); i++) 
00157         {
00158             for(UInt32 j = 0; j < _mfSize[i]; j++) 
00159             {
00161                 
00162                 _mfData[iter] = 
00163                     UInt8(Real32(_mfDataR[j]) * 
00164                           Real32(TypeTraits<UInt8>::getMax()));
00165 
00166                 iter += numChannels;
00167             }
00168         }
00169     }
00170 
00171     
00172     if(whichField & DataGFieldMask) 
00173     {
00174         // copy data from G field to channel 1 of interleaved field
00175         UInt32 iter        = 1;
00176         UInt32 numChannels = _sfChannel.getValue();
00177 
00178         for(UInt32 i = 0; i < _sfDimension.getValue(); i++) 
00179         {
00180             for(UInt32 j = 0; j < _mfSize[i]; j++) 
00181             {
00183                 _mfData[iter] = 
00184                     UInt8(Real32(_mfDataG[j]) * 
00185                           Real32(TypeTraits<UInt8>::getMax()));
00186 
00187                 iter += numChannels;
00188             }
00189         }
00190     }
00191 
00192     if(whichField & DataBFieldMask) 
00193     {
00194         // copy data from B field to channel 2 of interleaved field
00195         UInt32 iter        = 2;
00196         UInt32 numChannels = _sfChannel.getValue();
00197         
00198         for(UInt32 i = 0; i < _sfDimension.getValue(); i++) 
00199         {
00200             for(UInt32 j = 0; j < _mfSize[i]; j++) 
00201             {
00203                 _mfData[iter] =
00204                     UInt8(Real32(_mfDataB[j]) * 
00205                           Real32(TypeTraits<UInt8>::getMax()));
00206 
00207                 iter += numChannels;
00208             }
00209         }
00210     }
00211 
00212     
00213     if(whichField & DataAFieldMask) 
00214     {
00215         // copy data from A field to to channel 3 interleaved field
00216         UInt32 iter        = 3;
00217         UInt32 numChannels = _sfChannel.getValue();
00218         
00219         for(UInt32 i = 0; i < _sfDimension.getValue(); i++) 
00220         {
00221             for(UInt32 j = 0; j < _mfSize[i]; j++) 
00222             {
00224                 _mfData[iter] = 
00225                     UInt8(Real32(_mfDataA[j]) * 
00226                           Real32(TypeTraits<UInt8>::getMax()));
00227 
00228                 iter += numChannels;
00229             }
00230         }
00231     }
00232 
00233     
00234     if(whichField & (DimensionFieldMask | SizeFieldMask | ChannelFieldMask)) 
00235     {
00236         SINFO << "DVRLookupTable::changed - DimensionFieldMask | "
00237               << "SizeFieldMask | ChannelFieldMask " 
00238               << std::endl;
00239 
00240         if(whichField & DimensionFieldMask) 
00241         {
00242             SINFO << "DVRLookupTable::changed - dimension " 
00243                   << _sfDimension.getValue() 
00244                   << std::endl;
00245         }
00246 
00247         if(whichField & SizeFieldMask) 
00248         {
00249             SINFO << "DVRLookupTable::changed - size " 
00250                   << _mfSize[0] 
00251                   << std::endl;
00252         }
00253 
00254         if(whichField & ChannelFieldMask) 
00255         {
00256             SINFO << "DVRLookupTable::changed - channel " 
00257                   << _sfChannel.getValue() 
00258                   << std::endl;
00259         }
00260 
00261 #if 0
00262         commonConstructor();
00263 #endif
00264     }
00265 
00266     if(whichField & TouchedFieldMask) 
00267     {
00268         SINFO << "DVRLookupTable::changed - touched " << std::endl;
00269     }
00270 
00271 #if 0
00272     // mark table as being changed
00273     setTouched( true );
00274 #endif
00275     
00276 
00277     // notify parent if appearance 
00278     // CHECK
00279 #if 0
00280     MFFieldContainerPtr *par = getMFParents();
00281 
00282     for(UInt32 i = 0; i < par->size(); i++) 
00283     {
00284     }
00285 #endif
00286 
00287     Inherited::changed(whichField, origin);
00288 }
00289 
00290 
00292 void DVRLookupTable::dump(      UInt32    uiIndent, 
00293                           const BitVector         ) const
00294 {
00295     UInt32 col = 8; // print 8 values in each row
00296     UInt32   i = 0;
00297 
00298     DVRLookupTablePtr thisP(*this);
00299     thisP.dump(uiIndent, FCDumpFlags::RefCount);
00300 
00301     indentLog(uiIndent, PLOG);
00302     PLOG << "DVRLookupTable at " << this << std::endl;
00303 
00304     indentLog(uiIndent, PLOG);
00305     PLOG << "dim: " 
00306          << (int) getDimension() 
00307          << " channel: "
00308          << (int) getChannel() 
00309          << std::endl;
00310 
00311     indentLog(uiIndent, PLOG);
00312     PLOG << "sizes: ";
00313 
00314     for(MFUInt32::const_iterator   it  = _mfSize.begin(); 
00315                                    it != _mfSize.end  (); 
00316                                  ++it)
00317     {
00318         PLOG << std::dec << (int) *it << " ";
00319     }
00320 
00321     PLOG << std::endl;
00322 
00323     // Data
00324     indentLog(uiIndent, PLOG);
00325     PLOG << "Data:" << std::endl; 
00326 
00327     uiIndent += 4;
00328 
00329     indentLog(uiIndent, PLOG);
00330     for(i = 0; i < _mfData.size(); i++) 
00331     {
00332         PLOG << std::setw(9) << std::left << (int) _mfData[i] << " ";
00333 
00334         if((i + 1) % getChannel() == 0) 
00335         {
00336             PLOG << std::endl; indentLog(uiIndent, PLOG); 
00337         }
00338     }
00339 
00340     uiIndent -= 4;
00341     
00342     // DataR
00343     PLOG << std::endl;
00344 
00345     indentLog(uiIndent, PLOG);
00346     PLOG << "DataR:" << std::endl; 
00347     
00348     uiIndent += 4;
00349 
00350     indentLog(uiIndent, PLOG);
00351 
00352     for(i = 0; i < _mfDataR.size(); i++) 
00353     {
00354         PLOG << std::setw(9) << std::left <<_mfDataR[i] << " ";
00355 
00356         if((i + 1) % col == 0) 
00357         {
00358             PLOG << std::endl; indentLog(uiIndent, PLOG); 
00359         }
00360     }
00361 
00362     uiIndent -= 4;
00363 
00364     // DataG
00365     PLOG << std::endl;
00366 
00367     indentLog(uiIndent, PLOG);
00368     PLOG << "DataG:" << std::endl; 
00369 
00370     uiIndent += 4;
00371 
00372     indentLog(uiIndent, PLOG);
00373     
00374     for(i = 0; i < _mfDataG.size(); i++) 
00375     {
00376         PLOG << std::setw(9) << std::left << _mfDataG[i] << " ";
00377 
00378         if((i + 1) % col == 0) 
00379         {
00380             PLOG << std::endl; indentLog(uiIndent, PLOG); 
00381         }
00382     }
00383 
00384     uiIndent -= 4;
00385 
00386     // DataB
00387     PLOG << std::endl;
00388 
00389     indentLog(uiIndent, PLOG);
00390     PLOG << "DataB:" << std::endl; 
00391     
00392     uiIndent += 4;
00393 
00394     indentLog(uiIndent, PLOG);
00395 
00396     for(i = 0; i < _mfDataB.size(); i++) 
00397     {
00398         PLOG << std::setw(9) << std::left << _mfDataB[i] << " ";
00399 
00400         if((i + 1) % col == 0)
00401         {
00402             PLOG << std::endl; indentLog(uiIndent, PLOG); 
00403         }
00404     }
00405 
00406     uiIndent -= 4;
00407     
00408     // DataA
00409     PLOG << std::endl;
00410 
00411     indentLog(uiIndent, PLOG);
00412     PLOG << "DataA:" << std::endl; 
00413 
00414     uiIndent += 4;
00415 
00416     indentLog(uiIndent, PLOG);
00417 
00418     for(i = 0; i < _mfDataA.size(); i++) 
00419     {
00420         PLOG << std::setw(9) << std::left << _mfDataA[i] << " ";
00421 
00422         if((i + 1) % col == 0) 
00423         {
00424             PLOG << std::endl; indentLog(uiIndent, PLOG); 
00425         }
00426     }
00427 
00428     uiIndent -= 4;
00429 
00430     PLOG << std::endl;
00431 }
00432 
00433 
00435 void DVRLookupTable::commonConstructor(void)
00436 {
00437     SLOG << "DVRLookupTable::commonConstructor" << std::endl;
00438     
00439     UInt32 size = _sfDimension.getValue();
00440   
00441     // set default size for every dimension
00442     _mfSize.resize(_sfDimension.getValue());
00443 
00444     for(UInt32 j = 0; j < _sfDimension.getValue(); j++) 
00445     {
00446         _mfSize[j] = 256;
00447 
00448         size *= _mfSize[j];
00449     }
00450 
00451     // allocate data field
00452     _mfData .resize(size * _sfChannel.getValue());
00453     _mfDataR.resize(size                        );
00454     _mfDataG.resize(size                        );
00455     _mfDataB.resize(size                        );
00456     _mfDataA.resize(size                        );
00457 
00458     // store default ramp
00459     UInt32 iter       = 0;
00460     UInt32 singleIter = 0;
00461 
00462     for(UInt32 i = 0; i < _sfDimension.getValue(); i++) 
00463     {
00464         for(UInt32 j = 0; j < _mfSize[i]; j++) 
00465         {
00467 
00468             _mfDataR[singleIter] = 
00469                 (Real32) j / 
00470                 (Real32) TypeTraits<UInt8>::getMax();
00471 
00472             _mfDataG[singleIter] = 
00473                 (Real32) j / 
00474                 (Real32) TypeTraits<UInt8>::getMax();
00475 
00476             _mfDataB[singleIter] = 
00477                 (Real32) j / 
00478                 (Real32) TypeTraits<UInt8>::getMax();
00479 
00480             _mfDataA[singleIter] = 
00481                 (Real32) j / 
00482                 (Real32) TypeTraits<UInt8>::getMax();
00483             
00484             singleIter++;
00485             
00486             for(UInt32 k = 0; k < _sfChannel.getValue(); k++) 
00487             {
00488                 _mfData[iter++] = j;
00489             }
00490         }
00491     }
00492 }
00493 
00494 
00495 /*-------------------------------------------------------------------------*/
00496 /*                              cvs id's                                   */
00497 
00498 #ifdef __sgi
00499 #pragma set woff 1174
00500 #endif
00501 
00502 #ifdef OSG_LINUX_ICC
00503 #pragma warning( disable : 177 )
00504 #endif
00505 
00506 namespace
00507 {
00508     static char cvsid_cpp[] = "@(#)$Id: $";
00509     static char cvsid_hpp[] = OSGDVRLOOKUPTABLE_HEADER_CVSID;
00510     static char cvsid_inl[] = OSGDVRLOOKUPTABLE_INLINE_CVSID;
00511 }
00512 

Generated on Thu Aug 25 04:03:50 2005 for OpenSG by  doxygen 1.4.3