//---------------------------------------------------------------------------- void SceneBuilder::CollectMaterials(INode *node) { Mtl *mtl = node->GetMtl(); if (mtl) { mMtls.Add(mtl); } for (int i=0; i<node->NumberOfChildren(); i++) { CollectMaterials(node->GetChildNode(i)); } }
//---------------------------------------------------------------------------- SceneBuilder::SceneBuilder (const TCHAR *filename, BOOL exportSelected, ExportSettings *settings, ExpInterface *ept, Interface *max, INode *exportNode) { float time = (float)PX2::Time::GetTimeInSeconds(); const size_t size = _tcslen(filename)+1; mFileName = new1<TCHAR>((int)size); _tcscpy_s(mFileName, size, filename); mExportSelected = exportSelected; mSettings = settings; mExport = ept; mMax = max; mExportMaxNode = exportNode; mTicksPerFrame = GetTicksPerFrame(); if (mSettings->IncludeCurrentFrame) { mTimeStart = mMax->GetAnimRange().Start(); mTimeEnd = mTimeStart; } else { mTimeStart = mSettings->StartFrame * GetTicksPerFrame(); mTimeEnd = mSettings->EndFrame * GetTicksPerFrame(); if (mSettings->UseLocalTime) { mTimeOffset = mTimeStart; } else { mTimeOffset = 0; } } // 遍历场景3次。第1次处理materials,第2次遍历节点继承关系,第3次应用 modifiers mScene = new0 PX2::Node(); mScene->SetName("RootNode"); // 1 CollectMaterials(mExportMaxNode); ConvertMaterials(); // 2 if (!mExportSelected) { // entire scene if (mSettings->IncludeLights) { BuildAmbientLight(); } int numChildren = mExportMaxNode->NumberOfChildren(); for (int i=0; i<numChildren; i++) { Traverse(mExportMaxNode->GetChildNode(i), mScene); } } else { // selection only Traverse(mExportMaxNode, mScene); } mScene->Update(0.0f); // 3 if (mSettings->IncludeModifiers) { ApplyModifiers(); } PX2::OutStream stream; if (mExportSelected) { stream.Insert(mScene->GetChild(0)); } else { stream.Insert(mScene); } stream.Save(filename); mScene = 0; }