コード例 #1
0
ファイル: Util.cpp プロジェクト: Anchoys1/max_nif_plugin
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;
}
コード例 #2
0
ファイル: Util.cpp プロジェクト: Doommarine23/max_nif_plugin
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);
	}
}