bool FillControllerSkin(FULogFile& fileOut, FCDSkinController* controller) { FailIf(controller == NULL); // Create two joints. FCDSceneNode* visualScene = controller->GetDocument()->GetVisualSceneLibrary()->AddEntity(); PassIf(visualScene != NULL); FCDSceneNode* joint1 = visualScene->AddChildNode(); PassIf(joint1 != NULL); FCDSceneNode* joint2 = joint1->AddChildNode(); PassIf(joint2 != NULL); // In the standard course of operations, we would either load a file // with subId Info, or link it in when loading the instance. Here we have no instance fm::string jid1("joint1"); fm::string jid2("joint2"); joint1->SetSubId(jid1); joint2->SetSubId(jid2); jointId1 = joint1->GetSubId(); jointId2 = joint2->GetSubId(); FailIf(jointId1.empty() || jointId2.empty()); controller->AddJoint(joint1->GetSubId(), FMMatrix44::Identity); controller->AddJoint(joint2->GetSubId(), FMMatrix44(sampleBindPose1).Inverted()); controller->SetBindShapeTransform(FMMatrix44(sampleBindPose2)); PassIf(controller->GetJointCount() == 2); // Retrieve and assign the base target FCDGeometry* geometricTarget = controller->GetDocument()->FindGeometry(meshId); controller->SetTarget(geometricTarget); // Set some influences PassIf(controller->GetInfluenceCount() == 4); FCDSkinControllerVertex* influence = controller->GetVertexInfluence(0); FailIf(influence == NULL); influence->AddPair(0, 0.5f); influence->AddPair(1, 0.5f); influence = controller->GetVertexInfluence(3); FailIf(influence == NULL); influence->AddPair(1, 1.0f); influence = controller->GetVertexInfluence(2); FailIf(influence == NULL); influence->AddPair(0, 0.1f); return true; }
bool FArchiveXML::LoadSceneNode(FCDObject* object, xmlNode* node) { if (!FArchiveXML::LoadEntity(object, node)) return false; bool status = true; FCDSceneNode* sceneNode = (FCDSceneNode*)object; if (!IsEquivalent(node->name, DAE_VSCENE_ELEMENT) && !IsEquivalent(node->name, DAE_NODE_ELEMENT)) { FUError::Error(FUError::ERROR_LEVEL, FUError::ERROR_UNKNOWN_ELEMENT, node->line); } // Read a subid if we gots one fm::string nodeSubId = ReadNodeProperty(node, DAE_SID_ATTRIBUTE); sceneNode->SetSubId(nodeSubId); // Read in the <node> element's type fm::string nodeType = ReadNodeProperty(node, DAE_TYPE_ATTRIBUTE); if (nodeType == DAE_JOINT_NODE_TYPE) sceneNode->SetJointFlag(true); else if (nodeType.length() == 0 || nodeType == DAE_NODE_NODE_TYPE) {} // No special consideration else { FUError::Error(FUError::WARNING_LEVEL, FUError::WARNING_UNKNOW_NODE_ELEMENT_TYPE, node->line); } // The scene node has ordered elements, so process them directly and in order. for (xmlNode* child = node->children; child != NULL; child = child->next) { if (child->type != XML_ELEMENT_NODE) continue; if (IsEquivalent(child->name, DAE_NODE_ELEMENT)) { // Load the child scene node FCDSceneNode* node = sceneNode->AddChildNode(); status = FArchiveXML::LoadSceneNode(node, child); if (!status) break; } // Although this case can be handled by FCDEntityInstanceFactory, // we can do some special case handling here. else if (IsEquivalent(child->name, DAE_INSTANCE_NODE_ELEMENT)) { FUUri url = ReadNodeUrl(child); if (!url.IsFile()) { // cannot find the node FCDSceneNode* node = sceneNode->GetDocument()->FindSceneNode(TO_STRING(url.GetFragment())); if (node != NULL) { if (!sceneNode->AddChildNode(node)) { FUError::Error(FUError::WARNING_LEVEL, FUError::WARNING_CYCLE_DETECTED, child->line); } } else { FUError::Error(FUError::WARNING_LEVEL, FUError::WARNING_INVALID_NODE_INST, child->line); } } else { FCDEntityInstance* reference = sceneNode->AddInstance(FCDEntity::SCENE_NODE); FArchiveXML::LoadEntityInstance(reference, child); } } else if (IsEquivalent(child->name, DAE_EXTRA_ELEMENT)) {} // Handled by FCDEntity. else if (IsEquivalent(child->name, DAE_ASSET_ELEMENT)) {} // Handled by FCDEntity. else { uint32 transformType = FArchiveXML::GetTransformType(child); if (transformType != (uint32) ~0) { FCDTransform* transform = sceneNode->AddTransform((FCDTransform::Type) transformType); fm::string childSubId = ReadNodeProperty(child, DAE_SID_ATTRIBUTE); transform->SetSubId(childSubId); status &= (FArchiveXML::LoadSwitch(transform, &transform->GetObjectType(), child)); } else { uint32 instanceType = FArchiveXML::GetEntityInstanceType(child); if (instanceType != (uint32) ~0) { FCDEntityInstance* instance = sceneNode->AddInstance((FCDEntity::Type) instanceType); status &= (FArchiveXML::LoadSwitch(instance, &instance->GetObjectType(), child)); } else { FUError::Error(FUError::WARNING_LEVEL, FUError::WARNING_INVALID_TRANSFORM, child->line); } } } } status &= FArchiveXML::LoadFromExtraSceneNode(sceneNode); sceneNode->SetTransformsDirtyFlag(); sceneNode->SetDirtyFlag(); return status; }