.TH "SoGetBoundingBoxAction" 3 "Tue Dec 26 2023 17:59:22" "Version 4.0.2" "Coin" \" -*- nroff -*- .ad l .nh .SH NAME SoGetBoundingBoxAction \- The \fBSoGetBoundingBoxAction\fP class calculates bounding boxes for nodes and subgraphs\&. .SH SYNOPSIS .br .PP .PP \fC#include \fP .PP Inherits \fBSoAction\fP\&. .SS "Public Types" .in +1c .ti -1c .RI "enum \fBResetType\fP { \fBTRANSFORM\fP = 0x1, \fBBBOX\fP = 0x2, \fBALL\fP = TRANSFORM | BBOX }" .br .in -1c Public Types inherited from \fBSoAction\fP .in +1c .ti -1c .RI "enum \fBAppliedCode\fP { \fBNODE\fP = 0, \fBPATH\fP = 1, \fBPATH_LIST\fP = 2 }" .br .ti -1c .RI "enum \fBPathCode\fP { \fBNO_PATH\fP = 0, \fBIN_PATH\fP = 1, \fBBELOW_PATH\fP = 2, \fBOFF_PATH\fP = 3 }" .br .in -1c .SS "Public Member Functions" .in +1c .ti -1c .RI "\fBvirtual\fP \fBSoType\fP \fBgetTypeId\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBSoGetBoundingBoxAction\fP (\fBconst\fP \fBSbViewportRegion\fP &\fBvp\fP)" .br .ti -1c .RI "\fBvirtual\fP \fB~SoGetBoundingBoxAction\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBvoid\fP \fBsetViewportRegion\fP (\fBconst\fP \fBSbViewportRegion\fP &\fBnewregion\fP)" .br .ti -1c .RI "\fBconst\fP \fBSbViewportRegion\fP & \fBgetViewportRegion\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBSbBox3f\fP \fBgetBoundingBox\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBSbXfBox3f\fP & \fBgetXfBoundingBox\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBconst\fP \fBSbVec3f\fP & \fBgetCenter\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBvoid\fP \fBsetInCameraSpace\fP (\fBconst\fP SbBool \fBflag\fP)" .br .ti -1c .RI "SbBool \fBisInCameraSpace\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBvoid\fP \fBsetResetPath\fP (\fBconst\fP \fBSoPath\fP *path, \fBconst\fP SbBool \fBresetbefore\fP=TRUE, \fBconst\fP \fBResetType\fP \fBwhat\fP=ALL)" .br .ti -1c .RI "\fBconst\fP \fBSoPath\fP * \fBgetResetPath\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "SbBool \fBisResetPath\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "SbBool \fBisResetBefore\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBSoGetBoundingBoxAction::ResetType\fP \fBgetWhatReset\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBvoid\fP \fBcheckResetBefore\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBvoid\fP \fBcheckResetAfter\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBvoid\fP \fBextendBy\fP (\fBconst\fP \fBSbBox3f\fP &\fBbox\fP)" .br .ti -1c .RI "\fBvoid\fP \fBextendBy\fP (\fBconst\fP \fBSbXfBox3f\fP &\fBbox\fP)" .br .ti -1c .RI "\fBvoid\fP \fBsetCenter\fP (\fBconst\fP \fBSbVec3f\fP ¢er, \fBconst\fP SbBool \fBtransformcenter\fP)" .br .ti -1c .RI "SbBool \fBisCenterSet\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBvoid\fP \fBresetCenter\fP (\fBvoid\fP)" .br .in -1c Public Member Functions inherited from \fBSoAction\fP .in +1c .ti -1c .RI "\fBvirtual\fP \fB~SoAction\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBvirtual\fP SbBool \fBisOfType\fP (\fBSoType\fP type) \fBconst\fP" .br .ti -1c .RI "\fBvirtual\fP \fBvoid\fP \fBapply\fP (\fBSoNode\fP *root)" .br .ti -1c .RI "\fBvirtual\fP \fBvoid\fP \fBapply\fP (\fBSoPath\fP *path)" .br .ti -1c .RI "\fBvirtual\fP \fBvoid\fP \fBapply\fP (\fBconst\fP \fBSoPathList\fP &\fBpathlist\fP, SbBool \fBobeysrules\fP=FALSE)" .br .ti -1c .RI "\fBvoid\fP \fBapply\fP (\fBSoAction\fP *\fBbeingApplied\fP)" .br .ti -1c .RI "\fBvirtual\fP \fBvoid\fP \fBinvalidateState\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBAppliedCode\fP \fBgetWhatAppliedTo\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBSoNode\fP * \fBgetNodeAppliedTo\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBSoPath\fP * \fBgetPathAppliedTo\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBconst\fP \fBSoPathList\fP * \fBgetPathListAppliedTo\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBconst\fP \fBSoPathList\fP * \fBgetOriginalPathListAppliedTo\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "SbBool \fBisLastPathListAppliedTo\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBPathCode\fP \fBgetPathCode\fP (int &\fBnumindices\fP, \fBconst\fP int *&indices)" .br .ti -1c .RI "\fBvoid\fP \fBtraverse\fP (\fBSoNode\fP *\fBconst\fP node)" .br .ti -1c .RI "SbBool \fBhasTerminated\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBconst\fP \fBSoPath\fP * \fBgetCurPath\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBSoState\fP * \fBgetState\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBPathCode\fP \fBgetCurPathCode\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBvirtual\fP \fBSoNode\fP * \fBgetCurPathTail\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBvoid\fP \fBusePathCode\fP (int &\fBnumindices\fP, \fBconst\fP int *&indices)" .br .ti -1c .RI "\fBvoid\fP \fBpushCurPath\fP (\fBconst\fP int \fBchildindex\fP, \fBSoNode\fP *node=\fBNULL\fP)" .br .ti -1c .RI "\fBvoid\fP \fBpopCurPath\fP (\fBconst\fP \fBPathCode\fP \fBprevpathcode\fP)" .br .ti -1c .RI "\fBvoid\fP \fBpushCurPath\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBvoid\fP \fBpopPushCurPath\fP (\fBconst\fP int \fBchildindex\fP, \fBSoNode\fP *node=\fBNULL\fP)" .br .ti -1c .RI "\fBvoid\fP \fBpopCurPath\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBvoid\fP \fBswitchToPathTraversal\fP (\fBSoPath\fP *path)" .br .ti -1c .RI "\fBvoid\fP \fBswitchToNodeTraversal\fP (\fBSoNode\fP *node)" .br .in -1c .SS "Static Public Member Functions" .in +1c .ti -1c .RI "\fBstatic\fP \fBSoType\fP \fBgetClassTypeId\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBstatic\fP \fBvoid\fP \fBaddMethod\fP (\fBconst\fP \fBSoType\fP type, SoActionMethod method)" .br .ti -1c .RI "\fBstatic\fP \fBvoid\fP \fBenableElement\fP (\fBconst\fP \fBSoType\fP type, \fBconst\fP int \fBstackindex\fP)" .br .ti -1c .RI "\fBstatic\fP \fBvoid\fP \fBinitClass\fP (\fBvoid\fP)" .br .in -1c Static Public Member Functions inherited from \fBSoAction\fP .in +1c .ti -1c .RI "\fBstatic\fP \fBvoid\fP \fBinitClass\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBstatic\fP \fBvoid\fP \fBinitClasses\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBstatic\fP \fBSoType\fP \fBgetClassTypeId\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBstatic\fP \fBvoid\fP \fBnullAction\fP (\fBSoAction\fP *action, \fBSoNode\fP *node)" .br .in -1c .SS "Protected Member Functions" .in +1c .ti -1c .RI "\fBvirtual\fP \fBconst\fP \fBSoEnabledElementsList\fP & \fBgetEnabledElements\fP (\fBvoid\fP) \fBconst\fP" .br .ti -1c .RI "\fBvirtual\fP \fBvoid\fP \fBbeginTraversal\fP (\fBSoNode\fP *node)" .br .in -1c Protected Member Functions inherited from \fBSoAction\fP .in +1c .ti -1c .RI "\fBSoAction\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBvirtual\fP \fBvoid\fP \fBendTraversal\fP (\fBSoNode\fP *node)" .br .ti -1c .RI "\fBvoid\fP \fBsetTerminated\fP (\fBconst\fP SbBool \fBflag\fP)" .br .ti -1c .RI "\fBvirtual\fP SbBool \fBshouldCompactPathList\fP (\fBvoid\fP) \fBconst\fP" .br .in -1c .SS "Static Protected Member Functions" .in +1c .ti -1c .RI "\fBstatic\fP \fBSoEnabledElementsList\fP * \fBgetClassEnabledElements\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBstatic\fP \fBSoActionMethodList\fP * \fBgetClassActionMethods\fP (\fBvoid\fP)" .br .in -1c Static Protected Member Functions inherited from \fBSoAction\fP .in +1c .ti -1c .RI "\fBstatic\fP \fBSoEnabledElementsList\fP * \fBgetClassEnabledElements\fP (\fBvoid\fP)" .br .ti -1c .RI "\fBstatic\fP \fBSoActionMethodList\fP * \fBgetClassActionMethods\fP (\fBvoid\fP)" .br .in -1c .SS "Additional Inherited Members" Protected Attributes inherited from \fBSoAction\fP .in +1c .ti -1c .RI "\fBSoState\fP * \fBstate\fP" .br .ti -1c .RI "\fBSoActionMethodList\fP * \fBtraversalMethods\fP" .br .in -1c .SH "Detailed Description" .PP The \fBSoGetBoundingBoxAction\fP class calculates bounding boxes for nodes and subgraphs\&. If this action is applied to a path or scene graph root, it will calculate the bounding box and the center point of the geometry contained within the scene\&. .PP You don't have to apply an \fBSoGetBoundingBoxAction\fP to the \fIroot\fP of a scene\&. When using the action, you will get the bounding box of the node you are applying it to and that node's subtree in the scene graph (if any)\&. .PP The calculated bounding box will be in the local coordinates of that subtree\&. If applying it to a scene graph root node, the calculated bounding box will be in global coordinates\&. .PP The use of bounding boxes is ubiquitous within the Coin library\&. It is needed for the correct execution of and for performance enhancements during rendering, picking, caching, culling, etc\&. .PP \fBSoSeparator\fP nodes are aggressively caching the results of bounding box calculations, so that they are really only recalculated whenever the scene graph rooted below any \fBSoSeparator\fP node has been modified\&. This means that applying this action to scene graphs, or parts of scene graphs, should be very quick on successive runs for 'static' parts of the scene\&. .PP Note that the algorithm used is not guaranteed to always give an exact bounding box: it combines bounding boxes in pairs and extends one of them to contain the other\&. Since the boxes need not be parallel to the principal axes the new box might not be a perfect fit for the box not extended (its coordinate system has been changed)\&. .PP Note also that what is returned from \fBgetBoundingBox()\fP will be projected so as to be oriented along the principal axes, which can often cause it to become quite a lot larger than what it was before projection\&. For client code to obtain the best bounding box that Coin can calculate (and which will usually be exact), you need to use the \fBgetXfBoundingBox()\fP method after having applied the \fBSoGetBoundingBoxAction\fP\&. .PP \fBSee also\fP .RS 4 \fBSoSeparator::boundingBoxCaching\fP .RE .PP .SH "Member Enumeration Documentation" .PP .SS "\fBenum\fP \fBSoGetBoundingBoxAction::ResetType\fP" \fIThis API member is considered internal to the library, as it is not likely to be of interest to the application programmer\&.\fP .br .br .SH "Constructor & Destructor Documentation" .PP .SS "SoGetBoundingBoxAction::SoGetBoundingBoxAction (\fBconst\fP \fBSbViewportRegion\fP & vp)" Constructor\&. .PP It might seem unnecessary to have to pass in a viewport region argument to calculate bounding boxes, but there is a good reason for this: a few shape nodes needs to know the viewport region to calculate their bounding box -- these include \fBSoText2\fP and \fBSoImage\fP, among others\&. .PP What is particular about these shapes is that they are fundamentally 2D shapes, but they are being rendered on the screen 'surface' as if they were in a 3D scene\&. (This is possible because we can match each pixel's depth value against the 3D shapes in the scene\&.) .PP To compute an accurate 3D bounding box of a shape rendered in 2D on the screen 'surface', you need to 'de-project' the screen space area it occupies to a 2D rectangle placed at some depth in the scene\&. This 'de-projecting' operation needs to know about the dimensions of the viewport\&. .PP Also, some 3D shapes like for instance \fBSoNurbsSurface\fP, get slightly distorted if there's an \fBSoComplexity\fP node in the scene graph with the \fBSoComplexity::value\fP field set to SCREEN_SPACE\&. Then it is also necessary to know the viewport region to find out how to accurately calculate the bounding box of those shapes\&. .PP You would usually want to pass in a viewport region equal to the layout of the current render area canvas\&. If you have a viewer or So@Gui@RenderArea available, you can get hold of the viewport region data simply by doing .PP .PP .nf const SbViewportRegion & vpreg = viewer\->getViewportRegion(); .fi .PP .PP (If you don't have a viewer or render area available in your application at the point where you want to get the bounding box, it probably doesn't matter much what you set it to\&. The accuracy of the bounding box calculation might be slightly wrong versus the actual rendered appearance of the scene, but this is usually not noticeable\&.) .SS "SoGetBoundingBoxAction::~SoGetBoundingBoxAction (\fBvoid\fP)\fC [virtual]\fP" Destructor\&. .SH "Member Function Documentation" .PP .SS "\fBSoType\fP SoGetBoundingBoxAction::getTypeId (\fBvoid\fP) const\fC [virtual]\fP" Returns the type identification of an object derived from a class inheriting \fBSoAction\fP\&. This is used for runtime type checking and 'downward' casting\&. .br .PP Implements \fBSoAction\fP\&. .SS "\fBSoType\fP SoGetBoundingBoxAction::getClassTypeId (\fBvoid\fP)\fC [static]\fP" This static method returns the \fBSoType\fP object associated with objects of this class\&. .br .SS "\fBvoid\fP SoGetBoundingBoxAction::addMethod (\fBconst\fP \fBSoType\fP type, SoActionMethod method)\fC [static]\fP" \fIThis API member is considered internal to the library, as it is not likely to be of interest to the application programmer\&.\fP .br .br .SS "\fBvoid\fP SoGetBoundingBoxAction::enableElement (\fBconst\fP \fBSoType\fP type, \fBconst\fP int stackindex)\fC [static]\fP" \fIThis API member is considered internal to the library, as it is not likely to be of interest to the application programmer\&.\fP .br .br .SS "\fBconst\fP \fBSoEnabledElementsList\fP & SoGetBoundingBoxAction::getEnabledElements (\fBvoid\fP) const\fC [protected]\fP, \fC [virtual]\fP" Returns list of enabled elements\&. .br .PP Reimplemented from \fBSoAction\fP\&. .SS "\fBSoEnabledElementsList\fP * SoGetBoundingBoxAction::getClassEnabledElements (\fBvoid\fP)\fC [static]\fP, \fC [protected]\fP" Returns list of enabled elements for this class\&. The enabledElements and methods variables are protected in the original OIV API\&. This is not such a good idea, since exposed static class member variables is a major grievance with regard to Win32 DLLs\&. This function is an extension for Coin, and it is not available in the original SGI Open Inventor \fBv2\&.1\fP API\&. .br .br .SS "\fBSoActionMethodList\fP * SoGetBoundingBoxAction::getClassActionMethods (\fBvoid\fP)\fC [static]\fP, \fC [protected]\fP" Returns list of action methods for this class\&. The enabledElements and methods variables are protected in the original OIV API\&. This is not such a good idea, since exposed static class member variables is a major grievance with regard to Win32 DLLs\&. This function is an extension for Coin, and it is not available in the original SGI Open Inventor \fBv2\&.1\fP API\&. .br .br .SS "\fBvoid\fP SoGetBoundingBoxAction::initClass (\fBvoid\fP)\fC [static]\fP" Initializes the runtime type system for this class, and sets up the enabled elements and action method list\&. .SS "\fBvoid\fP SoGetBoundingBoxAction::setViewportRegion (\fBconst\fP \fBSbViewportRegion\fP & newregion)" Set a new viewport region with this method, if it has changed from the one passed in with the constructor\&. .SS "\fBconst\fP \fBSbViewportRegion\fP & SoGetBoundingBoxAction::getViewportRegion (\fBvoid\fP) const" Returns the viewport region used by the action instance\&. .SS "\fBSbBox3f\fP SoGetBoundingBoxAction::getBoundingBox (\fBvoid\fP) const" Returns the projected bounding box after (or during) traversal\&. .SS "\fBSbXfBox3f\fP & SoGetBoundingBoxAction::getXfBoundingBox (\fBvoid\fP)" Returns the bounding box and transformation matrix to global coordinates\&. Use after (or during) traversal\&. .SS "\fBconst\fP \fBSbVec3f\fP & SoGetBoundingBoxAction::getCenter (\fBvoid\fP) const" Returns center point of scene after the action has been applied\&. .PP This might differ from the geometric center of the bounding box, as shape nodes may 'weight' the center point according to various criteria (i\&.e\&. a faceset could for instance weight the center point according to the area within its bounding box where there are more polygons)\&. .SS "\fBvoid\fP SoGetBoundingBoxAction::setInCameraSpace (\fBconst\fP SbBool on)" Sets whether the returned bounding box should be calculated in the coordinate system of the camera space or not\&. .SS "SbBool SoGetBoundingBoxAction::isInCameraSpace (\fBvoid\fP) const" Returns whether the bounding box returned is to be in camera space\&. .SS "\fBvoid\fP SoGetBoundingBoxAction::setResetPath (\fBconst\fP \fBSoPath\fP * path, \fBconst\fP SbBool resetbefore = \fCTRUE\fP, \fBconst\fP \fBResetType\fP what = \fCALL\fP)" Forces the computed bounding box to be reset and the transformation to be identity before or after the tail node of \fIpath\fP, depending on the \fIresetbefore\fP argument\&. \fCNULL\fP can be specified for the \fIpath\fP argument to disable this behavior\&. .PP \fBSee also\fP .RS 4 \fBgetResetPath()\fP, \fBisResetPath()\fP, \fBisResetBefore()\fP, \fBgetWhatReset()\fP .RE .PP .SS "\fBconst\fP \fBSoPath\fP * SoGetBoundingBoxAction::getResetPath (\fBvoid\fP) const" Returns the reset path (or \fCNULL\fP)\&. .PP \fBSee also\fP .RS 4 \fBsetResetPath()\fP, \fBisResetPath()\fP, \fBisResetBefore()\fP, \fBgetWhatReset()\fP .RE .PP .SS "SbBool SoGetBoundingBoxAction::isResetPath (\fBvoid\fP) const" Returns whether a reset path is set or not\&. .PP \fBSee also\fP .RS 4 \fBsetResetPath()\fP, \fBgetResetPath()\fP, \fBisResetBefore()\fP, \fBgetWhatReset()\fP .RE .PP .SS "SbBool SoGetBoundingBoxAction::isResetBefore (\fBvoid\fP) const" Returns whether the bounding box and transformation is reset before or after the tail node of the reset path\&. .PP \fBSee also\fP .RS 4 \fBsetResetPath()\fP, \fBgetResetPath()\fP, \fBisResetPath()\fP, \fBgetWhatReset()\fP .RE .PP .SS "\fBSoGetBoundingBoxAction::ResetType\fP SoGetBoundingBoxAction::getWhatReset (\fBvoid\fP) const" Returns what type of reset has been specified for the reset path\&. .PP \fBSee also\fP .RS 4 \fBsetResetPath()\fP, \fBgetResetPath()\fP, \fBisResetPath()\fP, \fBisResetBefore()\fP .RE .PP .SS "\fBvoid\fP SoGetBoundingBoxAction::checkResetBefore (\fBvoid\fP)" \fIThis API member is considered internal to the library, as it is not likely to be of interest to the application programmer\&.\fP .br .br Called before node traversal of each node (from \fBSoNode\fP action method)\&. .SS "\fBvoid\fP SoGetBoundingBoxAction::checkResetAfter (\fBvoid\fP)" \fIThis API member is considered internal to the library, as it is not likely to be of interest to the application programmer\&.\fP .br .br Called after node traversal of each node (from \fBSoNode\fP action method)\&. .SS "\fBvoid\fP SoGetBoundingBoxAction::extendBy (\fBconst\fP \fBSbBox3f\fP & box)" Extend bounding box by the given \fIbox\fP\&. Called from nodes during traversal\&. .PP Should usually not be of interest to application programmers, unless you're extending Coin with your own shapenode extension classes\&. .SS "\fBvoid\fP SoGetBoundingBoxAction::extendBy (\fBconst\fP \fBSbXfBox3f\fP & box)" This is an overloaded member function, provided for convenience\&. It differs from the above function only in what argument(s) it accepts\&. .SS "\fBvoid\fP SoGetBoundingBoxAction::setCenter (\fBconst\fP \fBSbVec3f\fP & centerarg, \fBconst\fP SbBool transformcenter)" \fIThis API member is considered internal to the library, as it is not likely to be of interest to the application programmer\&.\fP .br .br Set a new center point during traversal\&. .SS "SbBool SoGetBoundingBoxAction::isCenterSet (\fBvoid\fP) const" \fIThis API member is considered internal to the library, as it is not likely to be of interest to the application programmer\&.\fP .br .br Query about the center point during traversal\&. .SS "\fBvoid\fP SoGetBoundingBoxAction::resetCenter (\fBvoid\fP)" \fIThis API member is considered internal to the library, as it is not likely to be of interest to the application programmer\&.\fP .br .br Reset the scene center point during traversal\&. .SS "\fBvoid\fP SoGetBoundingBoxAction::beginTraversal (\fBSoNode\fP * node)\fC [protected]\fP, \fC [virtual]\fP" This virtual method is called from \fBSoAction::apply()\fP, and is the entry point for the actual scene graph traversal\&. .PP It can be overridden to initialize the action at traversal start, for specific initializations in the action subclasses inheriting \fBSoAction\fP\&. .PP Default method just calls \fBtraverse()\fP, which any overridden implementation of the method must do too (or call \fBSoAction::beginTraversal()\fP) to trigger the scene graph traversal\&. .PP Reimplemented from \fBSoAction\fP\&. .SH "Author" .PP Generated automatically by Doxygen for Coin from the source code\&.