2.5 KiB
MUTools Maya部分笔记
- AddMesh()
- SendCommand()
导入Maya文件命令Mel
file -f -o "C:/Users/admin/Desktop/test.mb";
Maya插件获取场景数据
DBU_ScenePrimitiveCollector::AssembleData,具有2个分支UpdateOutline与CollectFeedback同时负责序列化:
- AdditionalMessage
- 写入文件头(虽然这个写入步骤在UpdateOutline之后,但在写Outline数据时偏移了sizeof(UPDATEMSG))
- UpdateOutline
- OutlineEntityList
- NameStream中每个节点名称字符串的偏移
- ChildNode数目
- UPDATEMSG MSGHEAD 文件头信息。
- NameStream 存储每个节点名称的流
- OutlineEntityList
- CollectFeedback
- UpdateEntityList
- MeshStream->AddrList
- MeshStream->ByteStream
UE中的反序列化,根据文件头信息的HasOutline与HasFeedbackData,有以下两个分支:
- 读取文件头信息
- HasOutline
- OutlineRootData
- OutlineData
- NamesData 节点名称流
- HasFeedbackData
- NamesData
- UpdateEntities
- 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)节点