/*
* point_type implementation
*
* Copyright ( C ) Jan Elseberg , Dorit Borrmann .
*
* Released under the GPL version 3.
*
*/
/**
* @ file
* @ brief Representation of a 3 D point type
* @ author Jan Elsberg . Automation Group , Jacobs University Bremen gGmbH , Germany .
*/
# include "slam6d/point_type.h"
# include "slam6d/scan.h"
# include <string>
using std : : string ;
# include <iostream>
using std : : cout ;
using std : : cerr ;
using std : : endl ;
# include <fstream>
# include <string.h>
# include <stdexcept>
using std : : runtime_error ;
PointType : : PointType ( ) {
types = USE_NONE ;
pointdim = 3 ;
dimensionmap [ 1 ] = dimensionmap [ 2 ] = dimensionmap [ 3 ] = dimensionmap [ 4 ] = dimensionmap [ 5 ] = dimensionmap [ 6 ] = dimensionmap [ 7 ] = 1 ; // choose height per default
dimensionmap [ 8 ] = 1 ;
dimensionmap [ 0 ] = 1 ; // height
}
PointType : : PointType ( unsigned int _types ) : types ( _types ) {
dimensionmap [ 1 ] = dimensionmap [ 2 ] = dimensionmap [ 3 ] = dimensionmap [ 4 ] = dimensionmap [ 5 ] = dimensionmap [ 6 ] = dimensionmap [ 7 ] = dimensionmap [ 8 ] = 1 ; // choose height per default
dimensionmap [ 0 ] = 1 ; // height
pointdim = 3 ;
if ( types & PointType : : USE_REFLECTANCE ) dimensionmap [ 1 ] = pointdim + + ;
if ( types & PointType : : USE_NORMAL ) {
pointdim + = 3 ;
dimensionmap [ 2 ] = pointdim ;
}
if ( types & PointType : : USE_TEMPERATURE ) dimensionmap [ 3 ] = pointdim + + ;
if ( types & PointType : : USE_AMPLITUDE ) dimensionmap [ 4 ] = pointdim + + ;
if ( types & PointType : : USE_DEVIATION ) dimensionmap [ 5 ] = pointdim + + ;
if ( types & PointType : : USE_TYPE ) dimensionmap [ 6 ] = pointdim + + ;
if ( types & PointType : : USE_COLOR ) dimensionmap [ 7 ] = pointdim + + ;
if ( types & PointType : : USE_TIME ) dimensionmap [ 8 ] = pointdim + + ;
if ( types & PointType : : USE_INDEX ) dimensionmap [ 9 ] = pointdim + + ;
}
bool PointType : : hasReflectance ( ) {
return hasType ( USE_REFLECTANCE ) ;
}
bool PointType : : hasNormal ( ) {
return hasType ( USE_NORMAL ) ;
}
bool PointType : : hasTemperature ( ) {
return hasType ( USE_TEMPERATURE ) ;
}
bool PointType : : hasAmplitude ( ) {
return hasType ( USE_AMPLITUDE ) ;
}
bool PointType : : hasDeviation ( ) {
return hasType ( USE_DEVIATION ) ;
}
bool PointType : : hasType ( ) {
return hasType ( USE_TYPE ) ;
}
bool PointType : : hasColor ( ) {
return hasType ( USE_COLOR ) ;
}
bool PointType : : hasTime ( ) {
return hasType ( USE_TIME ) ;
}
bool PointType : : hasIndex ( ) {
return hasType ( USE_INDEX ) ;
}
unsigned int PointType : : getReflectance ( ) {
return dimensionmap [ 1 ] ;
}
unsigned int PointType : : getTemperature ( ) {
return dimensionmap [ 2 ] ;
}
unsigned int PointType : : getAmplitude ( ) {
return dimensionmap [ 3 ] ;
}
unsigned int PointType : : getDeviation ( ) {
return dimensionmap [ 4 ] ;
}
unsigned int PointType : : getTime ( ) {
return dimensionmap [ 7 ] ;
}
unsigned int PointType : : getIndex ( ) {
return dimensionmap [ 8 ] ;
}
unsigned int PointType : : getType ( ) {
return dimensionmap [ 5 ] ;
}
unsigned int PointType : : getType ( unsigned int type ) {
if ( type = = USE_NONE ) {
return dimensionmap [ 0 ] ;
} else if ( type = = USE_HEIGHT ) {
return dimensionmap [ 0 ] ;
} else if ( type = = USE_REFLECTANCE ) {
return dimensionmap [ 1 ] ;
} else if ( type = = USE_NORMAL ) {
return dimensionmap [ 2 ] ;
} else if ( type = = USE_TEMPERATURE ) {
return dimensionmap [ 3 ] ;
} else if ( type = = USE_AMPLITUDE ) {
return dimensionmap [ 4 ] ;
} else if ( type = = USE_DEVIATION ) {
return dimensionmap [ 5 ] ;
} else if ( type = = USE_TYPE ) {
return dimensionmap [ 6 ] ;
} else if ( type = = USE_COLOR ) {
return dimensionmap [ 7 ] ;
} else if ( type = = USE_TIME ) {
return dimensionmap [ 8 ] ;
} else {
return 0 ;
}
}
unsigned int PointType : : getPointDim ( ) { return pointdim ; }
PointType PointType : : deserialize ( std : : ifstream & f ) {
unsigned int types ;
f . read ( reinterpret_cast < char * > ( & types ) , sizeof ( unsigned int ) ) ;
return PointType ( types ) ;
}
void PointType : : serialize ( std : : ofstream & f ) {
f . write ( reinterpret_cast < char * > ( & types ) , sizeof ( unsigned int ) ) ;
}
unsigned int PointType : : toFlags ( ) const { return types ; }
bool PointType : : hasType ( unsigned int type ) {
return types & type ;
}
const unsigned int PointType : : USE_NONE = 0 ;
const unsigned int PointType : : USE_REFLECTANCE = 1 ;
const unsigned int PointType : : USE_NORMAL = 2 ;
const unsigned int PointType : : USE_TEMPERATURE = 4 ;
const unsigned int PointType : : USE_AMPLITUDE = 8 ;
const unsigned int PointType : : USE_DEVIATION = 16 ;
const unsigned int PointType : : USE_HEIGHT = 32 ;
const unsigned int PointType : : USE_TYPE = 64 ;
const unsigned int PointType : : USE_COLOR = 128 ;
const unsigned int PointType : : USE_TIME = 256 ;
const unsigned int PointType : : USE_INDEX = 512 ;
void PointType : : useScan ( Scan * scan )
{
// clear pointers first
m_xyz = 0 ; m_rgb = 0 ; m_reflectance = 0 ; m_temperature = 0 ; m_amplitude = 0 ; m_type = 0 ; m_deviation = 0 ;
// collectively load data to avoid unneccessary loading times due to split get("") calls
unsigned int types = DATA_XYZ ;
if ( hasColor ( ) ) types | = DATA_RGB ;
if ( hasReflectance ( ) ) types | = DATA_REFLECTANCE ;
if ( hasTemperature ( ) ) types | = DATA_TEMPERATURE ;
if ( hasAmplitude ( ) ) types | = DATA_AMPLITUDE ;
if ( hasType ( ) ) types | = DATA_TYPE ;
if ( hasDeviation ( ) ) types | = DATA_DEVIATION ;
scan - > get ( types ) ;
// access data
try {
m_xyz = new DataXYZ ( scan - > get ( " xyz " ) ) ;
if ( hasColor ( ) ) m_rgb = new DataRGB ( scan - > get ( " rgb " ) ) ;
if ( hasReflectance ( ) ) m_reflectance = new DataReflectance ( scan - > get ( " reflectance " ) ) ;
if ( hasTemperature ( ) ) m_temperature = new DataTemperature ( scan - > get ( " temperature " ) ) ;
if ( hasAmplitude ( ) ) m_amplitude = new DataAmplitude ( scan - > get ( " amplitude " ) ) ;
if ( hasType ( ) ) m_type = new DataType ( scan - > get ( " type " ) ) ;
if ( hasDeviation ( ) ) m_deviation = new DataDeviation ( scan - > get ( " deviation " ) ) ;
// check if data is available, otherwise reset pointer to indicate that the scan doesn't prove this value
if ( m_rgb & & ! m_rgb - > valid ( ) ) { delete m_rgb ; m_rgb = 0 ; }
if ( m_reflectance & & ! m_reflectance - > valid ( ) ) { delete m_reflectance ; m_reflectance = 0 ; }
if ( m_temperature & & ! m_temperature - > valid ( ) ) { delete m_temperature ; m_temperature = 0 ; }
if ( m_amplitude & & ! m_amplitude - > valid ( ) ) { delete m_amplitude ; m_amplitude = 0 ; }
if ( m_type & & ! m_type - > valid ( ) ) { delete m_type ; m_type = 0 ; }
if ( m_deviation & & ! m_deviation - > valid ( ) ) { delete m_deviation ; m_deviation = 0 ; }
} catch ( runtime_error & e ) {
// unlock everything again
clearScan ( ) ;
throw e ;
}
}
void PointType : : clearScan ( )
{
// unlock data access
if ( m_xyz ) delete m_xyz ;
if ( hasColor ( ) & & m_rgb ) delete m_rgb ;
if ( hasReflectance ( ) & & m_reflectance ) delete m_reflectance ;
if ( hasTemperature ( ) & & m_temperature ) delete m_temperature ;
if ( hasAmplitude ( ) & & m_amplitude ) delete m_amplitude ;
if ( hasType ( ) & & m_type ) delete m_type ;
if ( hasDeviation ( ) & & m_deviation ) delete m_deviation ;
// TODO: scan->clear() on all of these types
}
unsigned int PointType : : getScanSize ( Scan * scan )
{
return scan - > size < DataXYZ > ( " xyz " ) ;
}