BlueRoseNote/02-Note/DAWA/MUTools/MUTools笔记.md
2023-06-29 11:55:02 +08:00

2.5 KiB
Raw Blame History

MUTools Maya部分笔记

  1. AddMesh()
  2. SendCommand()

导入Maya文件命令Mel

file -f -o "C:/Users/admin/Desktop/test.mb";

Maya插件获取场景数据

DBU_ScenePrimitiveCollector::AssembleData具有2个分支UpdateOutline与CollectFeedback同时负责序列化

  1. AdditionalMessage
  2. 写入文件头虽然这个写入步骤在UpdateOutline之后但在写Outline数据时偏移了sizeof(UPDATEMSG)
  3. UpdateOutline
    1. OutlineEntityList
      1. NameStream中每个节点名称字符串的偏移
      2. ChildNode数目
    2. UPDATEMSG MSGHEAD 文件头信息。
    3. NameStream 存储每个节点名称的流
  4. CollectFeedback
    1. UpdateEntityList
    2. MeshStream->AddrList
    3. MeshStream->ByteStream

UE中的反序列化根据文件头信息的HasOutline与HasFeedbackData有以下两个分支

  1. 读取文件头信息
  2. HasOutline
    1. OutlineRootData
    2. OutlineData
    3. NamesData 节点名称流
  3. HasFeedbackData
    1. NamesData
    2. UpdateEntities
    3. AddrList

更新大纲Mesh数据

UpdateOutline只有Maya大纲的名称与当前节点的子节点数目数据。其他模型信息集中在CollectFeedback阶段。

DBU_AddMesh来管理列表监视每个Mesh状态如果entity的meshDirty=true则将其加入vector<MeshAndID> MeshList。最后使用

MeshStream = new AssembleMeshStream(MeshList);

来生成这个MeshStream。来进行顶点、UV、法线、顶点处理

bool DBU_ScenePrimitiveCollector::AssembleData(MString& Result,vector<char> &ByteStream, bool CollectFeedback,bool UpdateOutline, MString AdditionalMessage)
{
	MStatus status;
	//if (DBU_AddMesh::First == nullptr)
	//	CollectFeedback = false;
	if (CollectFeedback)
	{
		std::chrono::steady_clock::time_point _start_time = std::chrono::steady_clock::now();
		DBU_AddMesh::LastSentUpdateList.clear();
		DBU_AddMesh* curr = DBU_AddMesh::First;
		while (curr)
		{
			curr->CollectEntity();
			auto Next = curr->Next;
			curr = Next;
		}

DBU_AddMesh::CollectEntity()

DBU_AddMesh节点在连接时候将srcPlug的DAG路径加入NodeRegisteredDAGPaths。

MPlug & srcPlug->MObject FromWhat->MFnDagNode FromNode->MDagPath dagPath

MUTools UE

通过MeshList的Index进行同步。

点击Outline Import后的逻辑 为发送遍历Entiry 并且发送Mel

$indices = { XXXX };

{ int $i; for($i=0;$i<size($indices);$i++) { DBU_AddSynchronize(DBU_GetSentOutlinerEntityPath $indices[$i]); } } print lsType "DBU_AddMesh";

调用DBU_AddSynchronize(DBU_GetSentOutlinerEntityPath)节点