BaryPatch Class Reference

BaryPatch class. More...

#include <BaryPatch.h>

Inheritance diagram for BaryPatch:

SelectableThing List of all members.

1 PATCH ATTRIBUTES AND FUNCTIONS

This composes the essential data of the patches used in the program

bool IsAPoint ()
bool IsAPatch ()
PointGetPoint ()
BaryPatchGetPatch ()
 BaryPatch (int ThingName, int DimU, int DimV, int DimW, int UCnx1, int UCnx2, int VCnx1, int VCnx2, int WCnx1, int WCnx2, SSMatrix TransfoMat, int Level, int *LvlZeroPointsIndices, Point **LvlZeroPointsTable, BaryPatch *Parent, BaryPatch *Root, SubdivScheme *NextSubdiv)
 BaryPatch (int ThingName, SSMatrix TransfoMat, BaryPatch *Parent)
 ~BaryPatch ()
void ClearChild (BaryPatch *Child)
void UpdateProjectedTransfoMatrix ()
void ApplySchemeToLevelSelected (int Level, SubdivScheme *Scheme)
void SubDivideLevel (int Level)
void SubDivideLevelSelected (int Level)
void RSubDivideLevel (int Level, int &NextName, bool IfSelected)
void SubDivide (int &NextName)
SSMatrix BuildCumulatedMatrix ()
void BuildPerturbations (int Level)
void RBuildPerturbations (int Level, stack< BaryCoord * > &CreatedPoints)
void DeletePerturbations (int Level)
PointFindPerturbation (int Level, int Name)
int CountPerturbationOccurences (Point *Perturbation)
void BuildLevelPerturbationTable (int Level, bool OnlyOnSelectedPatches, bool OnlySelectedPerturbations, int &NbPerturbFound, Point **&Table)
void RBuildLevelPerturbationTable (int Level, bool OnlyOnSelectedPatches, bool OnlySelectedPerturbations, stack< Point * > &FoundStack)
void BuildLevelPatchesTable (int Level, bool OnlyOnSelectedPatches, int &NbPatchesFound, BaryPatch **&Table)
void RBuildLevelPatchesTable (int Level, bool OnlyOnSelectedPatches, stack< BaryPatch * > &FoundStack)
void BuildLevelQuadTable (int Level, bool OnlyOnSelectedPatches, int &NbQuadsFound, Point ***&Table)
void RBuildLevelQuadTable (int Level, bool OnlyOnSelectedPatches, stack< Point ** > &FoundStack)
bool DeletePerturbation (Point *Perturbation, bool &AlreadyDeleted)
int GetSubTreeDepth ()
int GetLowestPatchName ()
int RGetLowestPatchName (int CurrentLowest)
void FindNeighbour (stack< BaryPatch * > &Neighbours)
void FindNeighbourFromPoints (Point **TabPnts, int NbPnts, int Level, int Name, stack< BaryPatch * > &Neighbours)
void BuildEdges (stack< Point * > &EdgeTable)
void BuildPerturbQuads (stack< Point ** > &QuadTable)
void SavePoints (int Level, stack< Point * > &SaveTable)
void SavePatches (int Level, stack< BaryPatch * > &SaveTable)
int WritePatch (FILE *file, int NbPntsLvlZero)
int ReadPatch (FILE *file, int NbPntsLvlZero)
BaryPatchFindPatch (int Level, int Name)
BaryPatchFindPatchFromParameter (float CoordToFind_U, float CoordToFind_V, float CoordToFind_W)
Vec * FindElementFromParameter (int &Dim, float CoordToFind_U, float CoordToFind_V, float CoordToFind_W, float &Limit_U1, float &Limit_U2, float &Limit_V1, float &Limit_V2, float &Limit_W1, float &Limit_W2)
void SelectAll (int Level)
void SelectAllSelected (int Level)
void LevelUnSelectAllPerturbations (int Level)
void LevelSelectAllPatches (int Level)
void LevelUnSelectAllPatches (int Level)
void LevelDeleteSelected (int Level)
void LevelCutSubtreeSelected (int Level)
Vec LevelSelectedCenterOfGravity (int Level)
Vec RLevelSelectedCenterOfGravity (int Level, Vec &CurrentCenter, int &CurrentNbPoints, stack< Point * > &AlreadyCounted)
void ChangedPerturbationSelection (int Level, ManipulatedFrame *MF)
void RChangedPerturbationSelection (int Level, ManipulatedFrame *MF, stack< Point * > &AlreadyCounted)
void ResetPerturbations ()
void ResetLevelPerturbations (int Level)
void ResetSelectedPerturbations (int Level)
void InversePatchSelection (int Level)
void draw (int Level, ManipulatedFrame *MF)
void draw (ManipulatedFrame *MF, bool Selectable=true)
void draw (ManipulatedFrame *MF)
int drawToFile (int Level, FILE *file, int counting, int TypePrint)
int drawFacesToFile (int Level, int counting)
int _DimU
int _DimV
int _DimW
int _UCnx1
int _UCnx2
int _VCnx1
int _VCnx2
int _WCnx1
int _WCnx2
SSMatrix _TransfoMatrix
int * _LvlZeroPointsIndices
Point ** _LvlZeroPointsTable
int _Level
BaryPatch_Parent
BaryPatch_Root
int _NbChildren
BaryPatch ** _Children
float _CoordPatch_U1
float _CoordPatch_U2
float _CoordPatch_V1
float _CoordPatch_V2
float _CoordPatch_W1
float _CoordPatch_W2
SSMatrix _ProjectedTransfoMatrix
Point ** _Perturbations
SubdivScheme_NextSubdiv

2 PLANARITY

Attributes and functions used for planarity

double QuadPlanarity (Vec P1, Vec P2, Vec P3, Vec P4, bool DegMode)
void SurfacePlanarityFactor (double &Worst, double &Average, bool DegMode)
void UpdatePlanarities (int Level, bool DegMode)
void UpdatePlanaritiesIfContains (int Level, int PerturbName, bool DegMode)
void LevelWorstAndAveragePlanarity (int Level, bool OnlySelectedPatches, double &worst, double &average, double averageOffset, int &NbPatches, bool DegMode)
void RLevelWorstAndAveragePlanarity (int Level, bool OnlySelectedPatches, double &worst, double &average, double averageOffset, int &NbPatches, bool DegMode)
void SelectPatchesWorstPlanarityAbove (float bound, int Level, bool DegMode)
float AveragePlanarityOfPatchesContainingPerturb (int Level, int PerturbName, int &NbPatchesFound, bool DegMode)
void RAveragePlanarityOfPatchesContainingPerturb (int Level, int PerturbName, int &NbPatchesFound, float &AveragePlanarity, bool DegMode)
void ViewAverageOrWorstPatchPlanarity (int Level, float Min, bool Average, bool DegMode)
void ResetColor (int Level)
double _SavedMinPlanarity
double _SavedAvgPlanarity

Public Member Functions

3 TOOLS
Little tools frequently used in the program

int UUnSilentDim ()
int VUnSilentDim ()
int WUnSilentDim ()
int PointIndice (int u, int v, int w)
void UpdateNameTag ()
void drawQuad (Vec P1, Vec P2, Vec P3, Vec P4)
void fastDrawQuad (Vec P1, Vec P2, Vec P3, Vec P4)

Detailed Description

BaryPatch class.


Constructor & Destructor Documentation

BaryPatch::BaryPatch ( int  ThingName,
int  DimU,
int  DimV,
int  DimW,
int  UCnx1,
int  UCnx2,
int  VCnx1,
int  VCnx2,
int  WCnx1,
int  WCnx2,
SSMatrix  TransfoMat,
int  Level,
int *  LvlZeroPointsIndices,
Point **  LvlZeroPointsTable,
BaryPatch Parent,
BaryPatch Root,
SubdivScheme NextSubdiv 
)

Basic constructor

BaryPatch::BaryPatch ( int  ThingName,
SSMatrix  TransfoMat,
BaryPatch Parent 
)

Subdivision constructor that builds the children

BaryPatch::~BaryPatch (  ) 

Destructor


Member Function Documentation

void BaryPatch::ApplySchemeToLevelSelected ( int  Level,
SubdivScheme Scheme 
)

The selected patches will use the given SubdivScheme on next subdivision

float BaryPatch::AveragePlanarityOfPatchesContainingPerturb ( int  Level,
int  PerturbName,
int &  NbPatchesFound,
bool  DegMode 
)

Returns the average planarity of all the patches containing this perturbation it supposes the _SavedMinPlanarity and _SavedAvgPlanarity are up to date

SSMatrix BaryPatch::BuildCumulatedMatrix (  ) 

Goes up to the root building a matrix which is the composition of all transformations leading to this patch

void BaryPatch::BuildEdges ( stack< Point * > &  EdgeTable  ) 

Builds the edge of a patch and puts them in the table called as parameter.Each edge is represented by 1,2 or 4 points

void BaryPatch::BuildLevelPatchesTable ( int  Level,
bool  OnlyOnSelectedPatches,
int &  NbPatchesFound,
BaryPatch **&  Table 
)

Build the table that contains all the patches of a given level

void BaryPatch::BuildLevelPerturbationTable ( int  Level,
bool  OnlyOnSelectedPatches,
bool  OnlySelectedPerturbations,
int &  NbPerturbFound,
Point **&  Table 
)

Builds the table that contains every pertubations of a given level

void BaryPatch::BuildLevelQuadTable ( int  Level,
bool  OnlyOnSelectedPatches,
int &  NbQuadsFound,
Point ***&  Table 
)

Builds the table that contains every quad of the patches of a same level

void BaryPatch::BuildPerturbations ( int  Level  ) 

Creates a perturbation point for every different point of a given level of patches connected patches share perturbation points the easy callable version

void BaryPatch::BuildPerturbQuads ( stack< Point ** > &  QuadTable  ) 

Returns a stack of quads represented by 4 perturbations. Perturbations should be built remember to delete quads after use

void BaryPatch::ChangedPerturbationSelection ( int  Level,
ManipulatedFrame *  MF 
)

When selection changed, point positions relatively to manipulated frame must be updated

void BaryPatch::ClearChild ( BaryPatch Child  ) 

Deletes a child patch

int BaryPatch::CountPerturbationOccurences ( Point Perturbation  ) 

By how many patches is a pertubation point shared ?

bool BaryPatch::DeletePerturbation ( Point Perturbation,
bool &  AlreadyDeleted 
)

Deletes all perturbation occurrences

void BaryPatch::DeletePerturbations ( int  Level  ) 

Deletes all the perturbation points of a given level

void BaryPatch::draw ( ManipulatedFrame *  MF  )  [inline, virtual]

Draws not selectable patch

Implements SelectableThing.

void BaryPatch::draw ( ManipulatedFrame *  MF,
bool  Selectable = true 
)

Draws patch and perturbations

void BaryPatch::draw ( int  Level,
ManipulatedFrame *  MF 
)

Draws perturbations and patches of a given level, going down the patch tree

int BaryPatch::drawFacesToFile ( int  Level,
int  counting 
)

Saves each patch of the previous level and its neighbours face after face ; only for UV surfaces

void BaryPatch::drawQuad ( Vec  P1,
Vec  P2,
Vec  P3,
Vec  P4 
)

Draws quadrilateral faces with nice normals

int BaryPatch::drawToFile ( int  Level,
FILE *  file,
int  counting,
int  TypePrint 
)

Saves drawn objects to an obj file

void BaryPatch::fastDrawQuad ( Vec  P1,
Vec  P2,
Vec  P3,
Vec  P4 
)

Draws quadrilateral faces faster

Vec * BaryPatch::FindElementFromParameter ( int &  Dim,
float  CoordToFind_U,
float  CoordToFind_V,
float  CoordToFind_W,
float &  Limit_U1,
float &  Limit_U2,
float &  Limit_V1,
float &  Limit_V2,
float &  Limit_W1,
float &  Limit_W2 
)

Returns the patch element (segment, quad, cube) that contains the parametric point CoordToFind_U, CoordToFind_V, CoordToFind_W also returns the dimension and the parametric bounds on U,V and W of the element

void BaryPatch::FindNeighbour ( stack< BaryPatch * > &  Neighbours  ) 

Building the neighbourhoood for every patch by selecting the points to compare.Neighbours is the list of the neighbours

void BaryPatch::FindNeighbourFromPoints ( Point **  TabPnts,
int  NbPnts,
int  Level,
int  Name,
stack< BaryPatch * > &  Neighbours 
)

Is called by FindNeighbour,compares the points and fills Neighbours if possible

BaryPatch * BaryPatch::FindPatch ( int  Level,
int  Name 
)

Looks for patch with given name down the tree and returns a pointer to it

BaryPatch * BaryPatch::FindPatchFromParameter ( float  CoordToFind_U,
float  CoordToFind_V,
float  CoordToFind_W 
)

Returns the patch that contains the parametric point CoordToFind_U, CoordToFind_V, CoordToFind_W

Point * BaryPatch::FindPerturbation ( int  Level,
int  Name 
)

Returns a pointer to a perturbation with the given name on a given tree level this perturbation should be unique if none are found returns NULL

int BaryPatch::GetLowestPatchName (  ) 

Returns the lowest patch name, searching from root down the tree

BaryPatch* BaryPatch::GetPatch (  )  [inline, virtual]

Selectable thing inherited

See also:
SelectableThing

Implements SelectableThing.

Point* BaryPatch::GetPoint (  )  [inline, virtual]

Selectable thing inherited

See also:
SelectableThing

Implements SelectableThing.

int BaryPatch::GetSubTreeDepth (  ) 

Returns the depth of the subtree below this patch

void BaryPatch::InversePatchSelection ( int  Level  ) 

Unselects the selected patches and selects the others

bool BaryPatch::IsAPatch (  )  [inline, virtual]

Selectable thing inherited

See also:
SelectableThing

Implements SelectableThing.

bool BaryPatch::IsAPoint (  )  [inline, virtual]

Selectable thing inherited

See also:
SelectableThing

Implements SelectableThing.

void BaryPatch::LevelCutSubtreeSelected ( int  Level  ) 

Makes all selected patches of a given level leaves. Deletes their children

void BaryPatch::LevelDeleteSelected ( int  Level  ) 

Deletes all selected patches of a given level

void BaryPatch::LevelSelectAllPatches ( int  Level  ) 

Selects every patch of the selected level

Vec BaryPatch::LevelSelectedCenterOfGravity ( int  Level  ) 

Calculates the center of gravity of the selected perturbated points of a given level

void BaryPatch::LevelUnSelectAllPatches ( int  Level  ) 

Unselects every patch of the selected level

void BaryPatch::LevelUnSelectAllPerturbations ( int  Level  ) 

Unselects all perturbation or patches of a given level in the tree

void BaryPatch::LevelWorstAndAveragePlanarity ( int  Level,
bool  OnlySelectedPatches,
double &  worst,
double &  average,
double  averageOffset,
int &  NbPatches,
bool  DegMode 
)

Returns the min of the SurfacePlanarityFactors on selected patches of a given level it supposes the _SavedMinPlanarity and _SavedAvgPlanarity are up to date

int BaryPatch::PointIndice ( int  u,
int  v,
int  w 
) [inline]

Changes the 3 dimensional (u,v,w) indices to real indices (from 1 to NbPoints)

double BaryPatch::QuadPlanarity ( Vec  P1,
Vec  P2,
Vec  P3,
Vec  P4,
bool  DegMode 
)

Returns the maximum of the cosines of the angles between a pair of triangles "equivalent" to the quad

void BaryPatch::RAveragePlanarityOfPatchesContainingPerturb ( int  Level,
int  PerturbName,
int &  NbPatchesFound,
float &  AveragePlanarity,
bool  DegMode 
)

Recursive version, not to be called outside AveragePlanarityOfPatchesContainingPerturb it supposes the _SavedMinPlanarity and _SavedAvgPlanarity are up to date

void BaryPatch::RBuildLevelPatchesTable ( int  Level,
bool  OnlyOnSelectedPatches,
stack< BaryPatch * > &  FoundStack 
)

The recursive version

void BaryPatch::RBuildLevelPerturbationTable ( int  Level,
bool  OnlyOnSelectedPatches,
bool  OnlySelectedPerturbations,
stack< Point * > &  FoundStack 
)

The recursive version, not to be called outside BuildLevelPerturbationTable

void BaryPatch::RBuildLevelQuadTable ( int  Level,
bool  OnlyOnSelectedPatches,
stack< Point ** > &  FoundStack 
)

The recursive version

void BaryPatch::RBuildPerturbations ( int  Level,
stack< BaryCoord * > &  CreatedPoints 
)

The recursive version, not to be called outside BuildPerturbations

void BaryPatch::RChangedPerturbationSelection ( int  Level,
ManipulatedFrame *  MF,
stack< Point * > &  AlreadyCounted 
)

The recursive version, not to be called outside ChangedPerturbationSelection

int BaryPatch::ReadPatch ( FILE *  file,
int  NbPntsLvlZero 
)

Reads the BaryPatch's data from the text file

void BaryPatch::ResetColor ( int  Level  ) 

Resets colors to the classic ones

void BaryPatch::ResetLevelPerturbations ( int  Level  ) 

Resets all perturbations of a given level to 0 going down the tree

void BaryPatch::ResetPerturbations (  ) 

Resets all perturbation of this patch to 0

void BaryPatch::ResetSelectedPerturbations ( int  Level  ) 

Resets perturbations of the selected points at the selected level

int BaryPatch::RGetLowestPatchName ( int  CurrentLowest  ) 

The recursive version, must not be called outside GetLowestPatchName()

Vec BaryPatch::RLevelSelectedCenterOfGravity ( int  Level,
Vec &  CurrentCenter,
int &  CurrentNbPoints,
stack< Point * > &  AlreadyCounted 
)

The recursive version, not to be called outside LevelSelectedCenterOfGravity

void BaryPatch::RLevelWorstAndAveragePlanarity ( int  Level,
bool  OnlySelectedPatches,
double &  worst,
double &  average,
double  averageOffset,
int &  NbPatches,
bool  DegMode 
)

Recursive version, not to be called outside AveragePlanarityOfPatchesContainingPerturb it supposes the _SavedMinPlanarity and _SavedAvgPlanarity are up to date

void BaryPatch::RSubDivideLevel ( int  Level,
int &  NextName,
bool  IfSelected 
)

The recursive version, not to be called outside Subdivide

void BaryPatch::SavePatches ( int  Level,
stack< BaryPatch * > &  SaveTable 
)

Saves the selected patches into a stack

void BaryPatch::SavePoints ( int  Level,
stack< Point * > &  SaveTable 
)

Saves the selected points into a stack

void BaryPatch::SelectAll ( int  Level  ) 

Selects all perturbation points of the level

void BaryPatch::SelectAllSelected ( int  Level  ) 

Selects all the points of selected patches of a given level

void BaryPatch::SelectPatchesWorstPlanarityAbove ( float  bound,
int  Level,
bool  DegMode 
)

Selects patches with planarity better than bound it supposes the _SavedMinPlanarity and _SavedAvgPlanarity are up to date

void BaryPatch::SubDivide ( int &  NextName  ) 

The easy callable version, not to be called outside Subdivide

void BaryPatch::SubDivideLevel ( int  Level  ) 

Calls subdivision on a given level

void BaryPatch::SubDivideLevelSelected ( int  Level  ) 

SubdivideSelected subdivides only selected patches of the given level

void BaryPatch::SurfacePlanarityFactor ( double &  Worst,
double &  Average,
bool  DegMode 
)

Returns the maximum on all drawn quads of the minima on a quad's 2 triangles of the angle between triangle planes

void BaryPatch::UpdateNameTag (  )  [inline, virtual]

Updates the name of each patch

Implements SelectableThing.

void BaryPatch::UpdatePlanarities ( int  Level,
bool  DegMode 
)

Updates planarities of this level's patches

void BaryPatch::UpdatePlanaritiesIfContains ( int  Level,
int  PerturbName,
bool  DegMode 
)

Updates planarities of this level's patches that contain this perturbation

void BaryPatch::UpdateProjectedTransfoMatrix (  ) 

Rebuilds _ProjectedTransfoMatrix projecting the barycentric coordinates of my points (columns of cumulated TransfoMatrices) according to level 0 reference point position and previous level perturbations we suppose this patch's parent _ProjectedTransfoMatrix is already updated we propagate the _ProjectedTransfoMatrix updating to children patches

int BaryPatch::UUnSilentDim (  )  [inline]

Returns 1 when dimension on axis U is > 1, 0 else

void BaryPatch::ViewAverageOrWorstPatchPlanarity ( int  Level,
float  Min,
bool  Average,
bool  DegMode 
)

Sets the colours whether you want to compare the acerage or the worst planarities of the patches it supposes the _SavedMinPlanarity and _SavedAvgPlanarity are up to date

int BaryPatch::VUnSilentDim (  )  [inline]

Returns 1 when dimension on axis V is > 1, 0 else

int BaryPatch::WritePatch ( FILE *  file,
int  NbPntsLvlZero 
)

Writes the BaryPatch's data in the text file

int BaryPatch::WUnSilentDim (  )  [inline]

Returns 1 when dimension on axis W is > 1, 0 else


Member Data Documentation

BaryPatch** BaryPatch::_Children

The table of all the children of the patch,created when a subdivision is made

float BaryPatch::_CoordPatch_U1

Parametric domain of the patch on U(between 0.0 and 1.0) the lower bound is number 1, the upper bound is number 2

float BaryPatch::_CoordPatch_U2

Parametric domain of the patch on U(between 0.0 and 1.0) the lower bound is number 1, the upper bound is number 2

float BaryPatch::_CoordPatch_V1

Parametric domain of the patch on V(between 0.0 and 1.0) the lower bound is number 1, the upper bound is number 2

float BaryPatch::_CoordPatch_V2

Parametric domain of the patch on V(between 0.0 and 1.0) the lower bound is number 1, the upper bound is number 2

float BaryPatch::_CoordPatch_W1

Parametric domain of the patch on W(between 0.0 and 1.0) the lower bound is number 1, the upper bound is number 2

float BaryPatch::_CoordPatch_W2

Parametric domain of the patch on W(between 0.0 and 1.0) the lower bound is number 1, the upper bound is number 2

int BaryPatch::_DimU

Dimension of the patch (how many points on the axis U)

int BaryPatch::_DimV

Dimension of the patch (how many points on the axis V)

int BaryPatch::_DimW

Dimension of the patch (how many points on the axis W)

int BaryPatch::_Level

a patch belongs to a tree hierarchy the roots of this tree are the level zero patches if the user defines more than one patch at the beginning, a level -1 patch is created, and its children are the level 0 patches the points of which are level 0 points (_TransfoMatrix=identity)

int* BaryPatch::_LvlZeroPointsIndices

The level zero points are identified by indices in a table containing all level 0 points

Point** BaryPatch::_LvlZeroPointsTable

The level zero points are identified by indices in a table containing all level 0 points

int BaryPatch::_NbChildren

The number of children of the patch

SubdivScheme* BaryPatch::_NextSubdiv

A pointer to the subdivision scheme which will be used to build my children in a call to Subdivide

BaryPatch* BaryPatch::_Parent

The parent of the patch

Point** BaryPatch::_Perturbations

Each point of the patch has a position which results from a transformation (_TransfoMatrix) applied to the points of the parent patches + a perturbation in R3 some perturbations are potentially shared by multiple connected patches _Perturbations is a 1D table of pointers to points

SSMatrix BaryPatch::_ProjectedTransfoMatrix

The projection of the barycentric points in R3 space / size : (3,NbPoints) each column of _ProjectedTransfoMatrix is the position in R3 of a patch point

BaryPatch* BaryPatch::_Root

The rootpatch (level -1 patch)._Root==NULL signifies I am a root patch

double BaryPatch::_SavedAvgPlanarity

The average planarity of the patch

double BaryPatch::_SavedMinPlanarity

The worst planarity of the patch

SSMatrix BaryPatch::_TransfoMatrix

Each point of the patch has a position which is determined by the coordinates of a cumulated TransfoMatrix column in the barycentric space related to some of the level zero points with previous level perturbations coming into account too _TransfoMatrix is the last transformation applied in the tree branch of transformation leading to this patch. This patch's points' positions in 3d space are the result of applying _TransfoMatrix to my parent's points and adding my perturbation.

int BaryPatch::_UCnx1

The connection patterns of the patch on this axis : what point does the connexion begin at?

int BaryPatch::_UCnx2

The connection patterns of the patch on this axis : what point does the connexion end at?

int BaryPatch::_VCnx1

The connection patterns of the patch on this axis : what point does the connexion begin at?

int BaryPatch::_VCnx2

The connection patterns of the patch on this axis : what point does the connexion end at?

int BaryPatch::_WCnx1

The connection patterns of the patch on this axis : what point does the connexion begin at?

int BaryPatch::_WCnx2

The connection patterns of the patch on this axis : what point does the connexion end at?


The documentation for this class was generated from the following files:
Generated on Thu Sep 28 09:38:08 2006 by  doxygen 1.4.7