예제 #1
0
//----------------------------------------------------------------------------
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));
	}
}
예제 #2
0
//----------------------------------------------------------------------------
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;
}