#########################################
Change a Shape Visibility using Layersets
#########################################

The code below illustrates the effects of changing the layerset at the camera level to modify the entire scene graph visibility:


.. figure:: instanced_shape.png
    :align: center

    **A simple scene graph and the effect of changing the camera layerset**

.. code:: cpp

    // Access our current transaction:
    RED::Object* resmgr = RED::Factory::CreateInstance( CID_REDResourceManager );
    RED::IResourceManager* iresmgr = resmgr->As< RED::IResourceManager >();

    // Create our example layersets
    RED::LayerSet layersetA, layersetB, layersetAB;
    RC_TEST( layersetA.AddLayer( RED::Object::GetIDFromString( "layerA" ) ) );
    RC_TEST( layersetB.AddLayer( RED::Object::GetIDFromString( "layerB" ) ) );
    RC_TEST( layersetAB.AddLayer( RED::Object::GetIDFromString( "layerA" ) ) );
    RC_TEST( layersetAB.AddLayer( RED::Object::GetIDFromString( "layerB" ) ) );

    // Create a basic shape hierarchy:
    RED::Object* camera = RED::Factory::CreateInstance( CID_REDViewpoint );
    RED::Object* shape1 = RED::Factory::CreateInstance( CID_REDLineShape );
    RED::Object* shape2 = RED::Factory::CreateInstance( CID_REDLineShape );

    RED::IViewpoint* icamera = camera->As< RED::IViewpoint >();
    RC_TEST( icamera->AddShape( shape1, iresmgr->GetState() ) );
    RC_TEST( icamera->AddShape( shape2, iresmgr->GetState() ) );

    // Assign layersets:
    RED::IShape* ishape1 = shape1->As< RED::IShape >();
    RC_TEST( ishape1->ApplyLayerSet( &layersetA, iresmgr->GetState() ) );

    RED::IShape* ishape2 = shape2->As< RED::IShape >();
    RC_TEST( ishape2->ApplyLayerSet( &layersetB, iresmgr->GetState() ) );

    // If the camera uses 'layersetAB', both A and B are seen:
    RC_TEST( icamera->ApplyLayerSet( layersetAB, iresmgr->GetState() ) );

    // If the camera uses 'layersetA', only A is visible:
    RC_TEST( icamera->ApplyLayerSet( layersetA, iresmgr->GetState() ) ); 