void
LinearTransformAttributes::SetFromNode(DataNode *parentNode)
{
    if(parentNode == 0)
        return;

    DataNode *searchNode = parentNode->GetNode("LinearTransformAttributes");
    if(searchNode == 0)
        return;

    DataNode *node;
    if((node = searchNode->GetNode("m00")) != 0)
        SetM00(node->AsDouble());
    if((node = searchNode->GetNode("m01")) != 0)
        SetM01(node->AsDouble());
    if((node = searchNode->GetNode("m02")) != 0)
        SetM02(node->AsDouble());
    if((node = searchNode->GetNode("m03")) != 0)
        SetM03(node->AsDouble());
    if((node = searchNode->GetNode("m10")) != 0)
        SetM10(node->AsDouble());
    if((node = searchNode->GetNode("m11")) != 0)
        SetM11(node->AsDouble());
    if((node = searchNode->GetNode("m12")) != 0)
        SetM12(node->AsDouble());
    if((node = searchNode->GetNode("m13")) != 0)
        SetM13(node->AsDouble());
    if((node = searchNode->GetNode("m20")) != 0)
        SetM20(node->AsDouble());
    if((node = searchNode->GetNode("m21")) != 0)
        SetM21(node->AsDouble());
    if((node = searchNode->GetNode("m22")) != 0)
        SetM22(node->AsDouble());
    if((node = searchNode->GetNode("m23")) != 0)
        SetM23(node->AsDouble());
    if((node = searchNode->GetNode("m30")) != 0)
        SetM30(node->AsDouble());
    if((node = searchNode->GetNode("m31")) != 0)
        SetM31(node->AsDouble());
    if((node = searchNode->GetNode("m32")) != 0)
        SetM32(node->AsDouble());
    if((node = searchNode->GetNode("m33")) != 0)
        SetM33(node->AsDouble());
    if((node = searchNode->GetNode("invertLinearTransform")) != 0)
        SetInvertLinearTransform(node->AsBool());
    if((node = searchNode->GetNode("transformVectors")) != 0)
        SetTransformVectors(node->AsBool());
}
void
SimilarityTransformAttributes::SetFromNode(DataNode *parentNode)
{
    if(parentNode == 0)
        return;

    DataNode *searchNode = parentNode->GetNode("SimilarityTransformAttributes");
    if(searchNode == 0)
        return;

    DataNode *node;
    if((node = searchNode->GetNode("doRotate")) != 0)
        SetDoRotate(node->AsBool());
    if((node = searchNode->GetNode("rotateOrigin")) != 0)
    {
        if(node->GetNodeType() == DOUBLE_ARRAY_NODE)
        {
            SetRotateOrigin(node->AsDoubleArray());
        }
        else if(node->GetNodeType() == FLOAT_ARRAY_NODE)
        {
            const float *fa = node->AsFloatArray();
            double da[3] = {fa[0], fa[1], fa[2]};
            SetRotateOrigin(da);
        }
    }
    if((node = searchNode->GetNode("rotateAxis")) != 0)
    {
        if(node->GetNodeType() == DOUBLE_ARRAY_NODE)
        {
            SetRotateAxis(node->AsDoubleArray());
        }
        else if(node->GetNodeType() == FLOAT_ARRAY_NODE)
        {
            const float *fa = node->AsFloatArray();
            double da[3] = {fa[0], fa[1], fa[2]};
            SetRotateAxis(da);
        }
    }
    if((node = searchNode->GetNode("rotateAmount")) != 0)
    {
        if(node->GetNodeType() == DOUBLE_NODE)
            SetRotateAmount(node->AsDouble());
        else if(node->GetNodeType() == FLOAT_NODE)
            SetRotateAmount((double)node->AsFloat());
    }
    if((node = searchNode->GetNode("rotateType")) != 0)
    {
        // Allow enums to be int or string in the config file
        if(node->GetNodeType() == INT_NODE)
        {
            int ival = node->AsInt();
            if(ival >= 0 && ival < 2)
                SetRotateType(AngleType(ival));
        }
        else if(node->GetNodeType() == STRING_NODE)
        {
            AngleType value;
            if(AngleType_FromString(node->AsString(), value))
                SetRotateType(value);
        }
    }
    if((node = searchNode->GetNode("doScale")) != 0)
        SetDoScale(node->AsBool());
    if((node = searchNode->GetNode("scaleOrigin")) != 0)
    {
        if(node->GetNodeType() == DOUBLE_ARRAY_NODE)
        {
            SetScaleOrigin(node->AsDoubleArray());
        }
        else if(node->GetNodeType() == FLOAT_ARRAY_NODE)
        {
            const float *fa = node->AsFloatArray();
            double da[3] = {fa[0], fa[1], fa[2]};
            SetScaleOrigin(da);
        }
    }
    if((node = searchNode->GetNode("scaleX")) != 0)
    {
        if(node->GetNodeType() == DOUBLE_NODE)
            SetScaleX(node->AsDouble());
        else if(node->GetNodeType() == FLOAT_NODE)
            SetScaleX((double)node->AsFloat());
    }
    if((node = searchNode->GetNode("scaleY")) != 0)
    {
        if(node->GetNodeType() == DOUBLE_NODE)
            SetScaleY(node->AsDouble());
        else if(node->GetNodeType() == FLOAT_NODE)
            SetScaleY((double)node->AsFloat());
    }
    if((node = searchNode->GetNode("scaleZ")) != 0)
    {
        if(node->GetNodeType() == DOUBLE_NODE)
            SetScaleZ(node->AsDouble());
        else if(node->GetNodeType() == FLOAT_NODE)
            SetScaleZ((double)node->AsFloat());
    }
    if((node = searchNode->GetNode("doTranslate")) != 0)
        SetDoTranslate(node->AsBool());
    if((node = searchNode->GetNode("translateX")) != 0)
    {
        if(node->GetNodeType() == DOUBLE_NODE)
            SetTranslateX(node->AsDouble());
        else if(node->GetNodeType() == FLOAT_NODE)
            SetTranslateX((double)node->AsFloat());
    }
    if((node = searchNode->GetNode("translateY")) != 0)
    {
        if(node->GetNodeType() == DOUBLE_NODE)
            SetTranslateY(node->AsDouble());
        else if(node->GetNodeType() == FLOAT_NODE)
            SetTranslateY((double)node->AsFloat());
    }
    if((node = searchNode->GetNode("translateZ")) != 0)
    {
        if(node->GetNodeType() == DOUBLE_NODE)
            SetTranslateZ(node->AsDouble());
        else if(node->GetNodeType() == FLOAT_NODE)
            SetTranslateZ((double)node->AsFloat());
    }
    if((node = searchNode->GetNode("transformVectors")) != 0)
        SetTransformVectors(node->AsBool());
}