void
ColladaInstanceController::read(void)
{
    OSG_COLLADA_LOG(("ColladaInstanceController::read\n"));

    ColladaControllerRefPtr colCont = getTargetElem();

    if(colCont == NULL)
    {
        colCont = dynamic_pointer_cast<ColladaController>(
            ColladaElementFactory::the()->create(
                getTargetDOMElem(), getGlobal()));

        colCont->read();
    }

	domInstance_controllerRef instCont = getDOMElementAs<domInstance_controller>();
	
	_joints = instCont->getSkeleton_array();

    domBind_materialRef     bindMat = instCont->getBind_material            ();

    if(bindMat == NULL)
    {
        SWARNING << "ColladaInstanceController::read: No <bind_material> found."
                 << std::endl;
        return;
    }

    domBind_material::domTechnique_commonRef  techCom      =
        bindMat->getTechnique_common();
    const domInstance_material_Array         &instMatArray =
        techCom->getInstance_material_array();

    for(UInt32 i = 0; i < instMatArray.getCount(); ++i)
    {
        ColladaInstanceMaterialRefPtr colInstMat =
            getUserDataAs<ColladaInstanceMaterial>(instMatArray[i]);

        if(colInstMat == NULL)
        {
            colInstMat = dynamic_pointer_cast<ColladaInstanceMaterial>(
                ColladaElementFactory::the()->create(
                    instMatArray[i], getGlobal()));

            colInstMat->read();
        }

        _matMap[colInstMat->getSymbol()] = colInstMat;

        OSG_COLLADA_LOG(("ColladaInstanceController::read: binding symbol [%s] "
                         "to target [%s]\n",
                         colInstMat->getSymbol().c_str(),
                         instMatArray[i]->getTarget().getURI()));
    }
}
void
ColladaInstanceGeometry::readBindMaterial(domBind_material *bindMat)
{
    domBind_material::domTechnique_commonRef  techCom      =
        bindMat->getTechnique_common();
    const domInstance_material_Array         &instMatArray =
        techCom->getInstance_material_array();

    for(UInt32 i = 0; i < instMatArray.getCount(); ++i)
    {
        ColladaInstanceMaterialRefPtr colInstMat =
            getUserDataAs<ColladaInstanceMaterial>(instMatArray[i]);

        if(colInstMat == NULL)
        {
            colInstMat = dynamic_pointer_cast<ColladaInstanceMaterial>(
                ColladaElementFactory::the()->create(
                    instMatArray[i], getGlobal()));

            colInstMat->read(this);
        }

        _matMap[colInstMat->getSymbol()] = colInstMat;

        OSG_COLLADA_LOG(("ColladaInstanceGeometry::readBindMaterial: "
                         "binding symbol [%s] to target [%s]\n",
                         colInstMat->getSymbol().c_str(),
                         instMatArray[i]->getTarget().getURI()));
    }

    const domParam_Array &params = bindMat->getParam_array();

    if(params.getCount() > 0)
    {
        SWARNING << "ColladaInstanceGeometry::readBindMaterial: "
                 << "Ignoring [" << params.getCount()
                 << "] <param> elements." << std::endl;
    }
}