##############################################
Enumerating a Material Controller's Properties
##############################################

Enumerating the properties of a controller is simple. First, one needs to get the controller from a given material:

.. code:: cpp 

    // iresmgr is the resource manager.
    // mat is a material.

    // Get the material controller from the material.
    RED::Object* matctrl = iresmgr->GetMaterialController( mat );
    RED::IMaterialController* imatctrl = matctrl->As< RED::IMaterialController >();

Then, the controller property gives access to its number of properties via the ``RED::IMaterialController::GetPropertiesCount`` method and to its properties by index or by name with the ``RED::IMaterialController::GetProperty`` function:

.. code:: cpp

    // Get the number of properties.
    unsigned int count = imatctrl->GetPropertiesCount();

    // Loop through the properties.
    for( unsigned int i = 0; i < count; ++i )
    {
        // Get the property.
        RED::Object* prop = imatctrl->GetProperty( i );
        RED::IMaterialControllerProperty* iprop = prop->As< RED::IMaterialControllerProperty >();

        // Get the type of the property.
        RED::PROPERTY_TYPE type = iprop->GetType();

        // Do something according to the property type.
        switch( type )
        {
            case RED::PYT_FLOAT:
            {
                float value = iprop->GetFloatValue();
            // Do something...
            RC_TEST( iprop->SetFloatValue( value, iresmgr->GetState() ) );
            break;
            }
            case RED::PYT_COLOR:
            {
                RED::Color color = iprop->GetColor();
                // Do something...
                RC_TEST( iprop->SetColor( color, iresmgr->GetState() ) );
                break;
            }
            case RED::PYT_TEXTURE2D:
            {
                const RED::Object* texture = iprop->GetTexture();
                const RED::IImage2D* itexture = texture->As< RED::IImage2D >();
                // Do something...
                break;
            }
            // etc.
        }
    } 