//------------------------------ bool SceneGraphCreator::recursivelyCloneINode( ImpNode* parentImportNode, INode* nodeToClone ) { ImpNode* newImportNode = getMaxImportInterface()->CreateNode(); getMaxImportInterface()->AddNodeToScene(newImportNode); INode* newNode = newImportNode->GetINode(); Object* object = nodeToClone->GetObjectRef(); newImportNode->Reference(object); newNode->SetTMController(nodeToClone->GetTMController()); newImportNode->SetName(nodeToClone->GetName()); //used to assign material addClonedINodeOriginalINodePair(newNode, nodeToClone); INode* parentNode = parentImportNode->GetINode(); parentNode->AttachChild(newNode, TRUE); /* If the node to clone references an object, the cloned one must references the same object.*/ COLLADAFW::UniqueId id = getUniqueIdByObjectINode(nodeToClone); if ( id.isValid() ) { addUniqueIdObjectINodePair(id, newNode); addObjectINodeUniqueIdPair(newNode, id); } // Clone the children for ( int i = 0, count = nodeToClone->NumberOfChildren(); i < count; ++i) recursivelyCloneINode(newImportNode, nodeToClone->GetChildNode(i)); return true; }
//------------------------------ bool MaterialCreator::createAndAssingMaxMaterial( const DocumentImporter::NodeMaterialBindingsPair& materialBindingPair ) { const DocumentImporter::MaterialBindingVector& materialBindings = materialBindingPair.materialBindings; INode* maxNode = materialBindingPair.maxNode; if ( materialBindings.size() == 0 ) return true; const COLLADAFW::UniqueId& geometryUniqueId = getUniqueIdByObjectINode( maxNode ); assert( geometryUniqueId.isValid() ); // calculate largest material id int largestMaterialId = 0; DocumentImporter::MaterialBindingVector::const_iterator it = materialBindings.begin(); for ( ; it != materialBindings.end(); ++it) { int materialId = (int)it->getMaterialId(); largestMaterialId = materialId; } if ( !materialBindings.empty() ) { if ( materialBindings.size() == 1 ) { const COLLADAFW::MaterialBinding& materialBinding = materialBindings[0]; const COLLADAFW::Effect* effect = getEffect(materialBinding); if ( !effect ) return true; Mtl* newMaterial = getMaxMaterial(*effect, materialBinding, geometryUniqueId); maxNode->SetMtl( newMaterial ); } else { MultiMtl * multiMaterial = NewDefaultMultiMtl(); multiMaterial->SetNumSubMtls( largestMaterialId + 1 ); String multiMaterialName = String(maxNode->GetName()) + "-MultiMaterial"; multiMaterial->SetName(multiMaterialName.c_str()); it = materialBindings.begin(); for ( ; it != materialBindings.end(); ++it) { const COLLADAFW::MaterialBinding& materialBinding = *it; const COLLADAFW::Effect* effect = getEffect(materialBinding); if ( !effect ) continue; Mtl* newMaterial = getMaxMaterial(*effect, materialBinding, geometryUniqueId); multiMaterial->SetSubMtl( materialBinding.getMaterialId(), newMaterial); } maxNode->SetMtl( multiMaterial ); } } return true; }