/*---------------------------------------------------------------------------*/ NiNodeRef NifConvertUtility::convertNiNode(NiNodeRef pSrcNode, NiTriShapeRef pTmplNode, NiNodeRef pRootNode, NiAlphaPropertyRef pTmplAlphaProp) { NiNodeRef pDstNode (pSrcNode); vector<NiAVObjectRef> srcShapeList(pDstNode->GetChildren()); // find NiAlphaProperty and use as template in sub-nodes if (DynamicCast<NiAlphaProperty>(pDstNode->GetPropertyByType(NiAlphaProperty::TYPE)) != NULL) { pTmplAlphaProp = DynamicCast<NiAlphaProperty>(pDstNode->GetPropertyByType(NiAlphaProperty::TYPE)); } // unlink protperties -> not used in new format pDstNode->ClearProperties(); // shift extra data to new version pDstNode->ShiftExtraData(VER_20_2_0_7); // unlink children pDstNode->ClearChildren(); // iterate over source nodes and convert using template for (vector<NiAVObjectRef>::iterator ppIter = srcShapeList.begin(); ppIter != srcShapeList.end(); ppIter++) { // NiTriShape //Type t = (*ppIter)->GetType(); if (DynamicCast<NiTriShape>(*ppIter) != NULL) { pDstNode->AddChild(&(*convertNiTriShape(DynamicCast<NiTriShape>(*ppIter), pTmplNode, pTmplAlphaProp))); } // NiNode (and derived classes?) else if (DynamicCast<NiNode>(*ppIter) != NULL) { pDstNode->AddChild(&(*convertNiNode(DynamicCast<NiNode>(*ppIter), pTmplNode, pRootNode, pTmplAlphaProp))); } } return pDstNode; }
NiNodeRef NifConvertUtility::convertNiNode(NiNodeRef pSrcNode, NiTriShapeRef pTmplNode, NiNodeRef pRootNode, NiAlphaPropertyRef pTmplAlphaProp) { NiNodeRef pDstNode (pSrcNode); //pDstNode->SetName(pDstNode->GetName().replace( string node_name_in = pDstNode->GetName(); string node_name_out = ""; for (int i = 0; i < node_name_in.length(); i++) { if (node_name_in[i] != '.' && node_name_in[i] != '_' && node_name_in[i] != ' ') { node_name_out = node_name_out + node_name_in[i]; } } pDstNode->SetName(node_name_out); node_name_in = node_name_out; if (node_name_in.compare("AttachLight") == 0) { Vector3 tr = pDstNode->GetLocalTranslation(); tr.z += 10.0f; pDstNode->SetLocalTranslation(tr); } if (node_name_in.compare("ShadowBox") == 0) { cout << "Removing ShadowBox" << endl; pDstNode->ClearChildren(); } if (toLower(node_name_in).find("fireemit") != -1) { NiExtraDataRef ed = root_bsafade->GetExtraData().front(); NiIntegerExtraDataRef iref = DynamicCast<NiIntegerExtraData>(ed); iref->SetData(147); cout << "Adding TorchFlame Addon" << endl; BSValueNodeRef candle_flame = new BSValueNode(); candle_flame->SetName("AddOnNode"); candle_flame->value = 46; pDstNode->AddChild(DynamicCast<NiAVObject>(candle_flame)); } else if (node_name_in.find("CandleFlame") != -1) { NiExtraDataRef ed = root_bsafade->GetExtraData().front(); NiIntegerExtraDataRef iref = DynamicCast<NiIntegerExtraData>(ed); iref->SetData(147); cout << "Adding CandleFlame Addon" << endl; BSValueNodeRef candle_flame = new BSValueNode(); candle_flame->SetName("AddOnNode"); candle_flame->value = 49; pDstNode->AddChild(DynamicCast<NiAVObject>(candle_flame)); } vector<NiAVObjectRef> srcShapeList(pDstNode->GetChildren()); //if (!pDstNode->GetType().IsSameType(NiNode::TYPE) && !pDstNode->GetType().IsSameType(BSFadeNode::TYPE) && !pDstNode->GetType().IsSameType(NiTriShape::TYPE) && !pDstNode->GetType().IsSameType(NiTriStrips::TYPE)) { } // find NiAlphaProperty and use as template in sub-nodes if (DynamicCast<NiAlphaProperty>(pDstNode->GetPropertyByType(NiAlphaProperty::TYPE)) != NULL) { pTmplAlphaProp = DynamicCast<NiAlphaProperty>(pDstNode->GetPropertyByType(NiAlphaProperty::TYPE)); } // unlink protperties -> not used in new format pDstNode->ClearProperties(); // shift extra data to new version pDstNode->ShiftExtraData(VER_20_2_0_7); // unlink children pDstNode->ClearChildren(); pDstNode->ClearEffects(); pDstNode->ClearControllers(); if (!pDstNode->GetType().IsSameType(BSFadeNode::TYPE)) { pDstNode->ClearExtraData(); } // iterate over source nodes and convert using template for (auto ppIter=srcShapeList.begin(), pEnd=srcShapeList.end(); ppIter != pEnd; ppIter++) { //DynamicCast<NiTriShape>(*ppIter) == NULL && DynamicCast<NiTriStrips>(*ppIter) == NULL ** DynamicCast<NiTriStrips>(*ppIter) != NULL // NiTriShape if (DynamicCast<NiTriShape>(*ppIter) != NULL) { pDstNode->AddChild(&(*convertNiTriShape(DynamicCast<NiTriShape>(*ppIter), pTmplNode, pTmplAlphaProp))); } // NiTriStrips else if (DynamicCast<NiTriStrips>(*ppIter) != NULL) { pDstNode->AddChild(&(*convertNiTriStrips(DynamicCast<NiTriStrips>(*ppIter), pTmplNode, pTmplAlphaProp))); } // RootCollisionNode else if ((DynamicCast<RootCollisionNode>(*ppIter) != NULL) && _cleanTreeCollision) { // ignore node } // NiNode (and derived classes?) else if (DynamicCast<NiNode>(*ppIter) != NULL) { NiNode* node_hashmi = DynamicCast<NiNode>(*ppIter); if (node_hashmi->GetType().IsSameType(NiNode::TYPE) || node_hashmi->GetType().IsSameType(BSFadeNode::TYPE) || node_hashmi->GetType().IsSameType(BSValueNode::TYPE)) { pDstNode->AddChild(&(*convertNiNode(DynamicCast<NiNode>(*ppIter), pTmplNode, pRootNode, pTmplAlphaProp))); } } } // remove collision object (newer version) if (_cleanTreeCollision) { pDstNode->SetCollisionObject(NULL); } else if (DynamicCast<bhkCollisionObject>(pDstNode->GetCollisionObject()) != NULL) { bhkRigidBodyRef pBody(DynamicCast<bhkRigidBody>((DynamicCast<bhkCollisionObject>(pDstNode->GetCollisionObject()))->GetBody())); if (pBody != NULL) { parseCollisionTree(pBody->GetShape()); } } return pDstNode; }