bool Exporter::isMeshGroup(INode *maxNode, bool root) { if (root) { if (!maxNode->IsGroupHead()) return false; } else { if (!isCollision(maxNode)) { TimeValue t = 0; ObjectState os = maxNode->EvalWorldState(t); if (os.obj->SuperClassID() == GEOMOBJECT_CLASS_ID) return true; } } for (int i=0; i<maxNode->NumberOfChildren(); i++) { if (isMeshGroup(maxNode->GetChildNode(i), false)) return true; } return false; }
void Exporter::getChildNodes(INode *node, vector<NiNodeRef>& list) { for (int i = 0; i < node->NumberOfChildren(); i++) { INode * child = node->GetChildNode(i); ObjectState os = node->EvalWorldState(0); bool addBone = false; bool local = !mFlattenHierarchy; bool meshGroup = isMeshGroup(node); TSTR nodeName = node->GetName(); if (wildmatch(TEXT("Bip?? Footsteps"), nodeName)) { addBone = false; } else if (node->IsBoneShowing()) { addBone = true; } else if (os.obj && os.obj->SuperClassID() == GEOMOBJECT_CLASS_ID) { Class_ID clsid = os.obj->ClassID(); if (os.obj && (clsid == BONE_OBJ_CLASSID || clsid == Class_ID(BONE_CLASS_ID, 0) || clsid == Class_ID(0x00009125, 0) /* Biped Twist Helpers */ ) ) { // skip mesh groups in skeleton only situations if (!meshGroup || !local || !mSkeletonOnly) addBone = true; } else if (!mSkeletonOnly) { if (mExportType != NIF_WO_ANIM && isNodeTracked(node)) { addBone = true; } else if (mExportExtraNodes || (mExportType != NIF_WO_ANIM && isNodeKeyed(node))) { addBone = true; } } else if (mExportCameras && os.obj && os.obj->SuperClassID() == CAMERA_CLASS_ID) { addBone = true; } else if (meshGroup && local && !mSkeletonOnly) // only create node if local { addBone = true; } } if (addBone) { list.push_back(getNode(child)); } getChildNodes(child, list); } }