FBX SDK Programmer's Guide > Nodes and the Scene Graph >

# FBX Node Attributes

Creating a Node Attribute

A FbxNodeAttribute is paired with a FbxNode to define a scene element with a specific position, rotation and scale. Calling FbxNode::GetNodeAttribute() will return NULL if no node attribute was set for that node.

The following code sample (adapted from ExportScene04/main.cxx to fit the diagram above) illustrates how to create a simple spotlight within a scene. Here, FbxLight* light is the node attribute of FbxNode* lightNode. For more information on lights, see Lights.

    // Create a spotlight.
    FbxNode* CreateLight(FbxScene* pScene, char* pName)
    {
        FbxLight* light = FbxLight::Create(pScene,pName);

        light->LightType.Set(FbxLight::eSPOT);
        light->CastLight.Set(true);

        FbxNode* lightNode = FbxNode::Create(pScene,pName);

        lightNode->SetNodeAttribute(light);

        return lightNode;
    }

Node Attributes

The following table presents a set of basic scene elements and their related FbxNodeAttribute subclasses. These node attributes can be paired with a FbxNode using FbxNode::SetNodeAttribute(). Consult the C++ Reference guide for the full class hierarchy.

Scene Element | FbxNodeAttribute subclass
--- | ---
Camera | FbxCamera, FbxCameraStereo
Camera Switcher (custom camera definition in Autodesk MotionBuilder) | FbxCameraSwitcher
Light | FbxLight
Mesh | FbxMesh
Nurb | FbxNurbs, FbxNurbsCurve, FbxNurbsSurface, FbxTrimNurbsSurface
Patch / Parametric Surface | FbxPatch
Level of Detail Group | FbxLodGroup
Marker | FbxMarker
Skeleton | FbxSkeleton

NoteSome applications require a null node type in their scene graph. The FbxNull node attribute is used to define such a node type. Observe that an instance of FbxNull is not the same as the NULL value.

Node Attribute Type

The type (FbxNodeAttribute::EAttributeType) of a FbxNodeAttribute can be obtained by calling FbxNodeAttribute::GetAttributeType(). The EAttributeType is useful for downcasting the node attribute object to its appropriate subclass.

The following code sample (adapted from ImportScene/main.cxx and ImportScene/DisplayLight.cxx) illustrates how to use a switch to display a FbxLight contained in a FbxNode.

    //
    // Adapted from ImportScene/DisplayLight.cxx ...
    // Display the various properties of the FbxLight contained within the FbxNode.
    //
    void DisplayLight(FbxNode* pNode)
    {
        FbxLight* lLight = (FbxLight*) pNode->GetNodeAttribute();

        DisplayString("Light Name: ", (char *) pNode->GetName());
        // ...

        char* lLightTypes[] = { "Point", "Directional", "Spot" };

        DisplayString("    Type: ", lLightTypes[lLight->LightType.Get()]);
        DisplayBool("    Cast Light: ", lLight->CastLight.Get());

        if (!(lLight->FileName.Get().IsEmpty()))
        {
            DisplayString("    Gobo");

            DisplayString("        File Name: \"", lLight->FileName.Get().Buffer(), "\"");
            DisplayBool("        Ground Projection: ", lLight->DrawGroundProjection.Get());
            DisplayBool("        Volumetric Projection: ", lLight->DrawVolumetricLight.Get());
            DisplayBool("        Front Volumetric Projection: ", lLight->DrawFrontFacingVolumetricLight.Get());
        }

        // ...
    }

    //
    // Adapted from ImportScene/main.cxx ...
    // Display the contents of a node. Here, we are only interested in
    // looking  at the eLight attribute type, which coincides with the
    // FbxLight node attribute.
    //
    void DisplayContent(FbxNode* pNode)
    {
        FbxNodeAttribute::EAttributeType lAttributeType;
        int i;

        if(pNode->GetNodeAttribute() == NULL)
        {
            printf("NULL Node Attribute\n\n");
        }
        else
        {
            lAttributeType = (pNode->GetNodeAttribute()->GetAttributeType());

            switch (lAttributeType)
            {
                // ...

            case FbxNodeAttribute::eLIGHT:
                DisplayLight(pNode);
                break;

                // ...
            }
        }

        // ...

        for(i = 0; i < pNode->GetChildCount(); i++)
        {
            DisplayContent(pNode->GetChild(i));
        }
    }

#### Topics in this section

- Lights
- Cameras
- Geometry