geosetmanagerwindow.cpp

来自「骨骼动画....把魔兽模型解出的代码..」· C++ 代码 · 共 586 行 · 第 1/2 页

CPP
586
字号
		delete Geoset;
		return FALSE;
	}

	MainWindow.MakeModelUnsaved();

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Exports an existing geoset to a geo file
//+-----------------------------------------------------------------------------
BOOL GEOSET_MANAGER_WINDOW::Export()
{
	INT Index;
	MODEL_GEOSET* Geoset;
	std::string FileName;
	std::stringstream Stream;
	WINDOW_FILE_DIALOG FileDialog;

	Index = ListBox.GetCurrentSelection();
	if(Index == INVALID_INDEX) return TRUE;

	Geoset = reinterpret_cast<MODEL_GEOSET*>(ListBox.GetData(Index));
	if(Geoset == NULL) return TRUE;

	Stream << "Geoset" << Geoset << ".geo";
	FileName = Stream.str();

	FileDialog.SetTitle("Export Geoset");
	FileDialog.SetFilter(FILTER_GEOSET);
	if(!FileDialog.SaveFile(Window, FileName)) return TRUE;

	if(!ExportGeoset(*Geoset, FileName)) return FALSE;

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Edits an existing geoset
//+-----------------------------------------------------------------------------
BOOL GEOSET_MANAGER_WINDOW::Edit()
{
	INT Index;
	MODEL_GEOSET_DATA Data;
	MODEL_GEOSET* Geoset;
	MODEL_MATERIAL* Material;

	Index = ListBox.GetCurrentSelection();
	if(Index == INVALID_INDEX) return TRUE;

	Geoset = reinterpret_cast<MODEL_GEOSET*>(ListBox.GetData(Index));
	if(Geoset == NULL) return TRUE;

	Data = Geoset->Data();
	Material = Geoset->MaterialNode.IsAttached() ? Geoset->MaterialNode.GetObjectData() : NULL;

	if(!GeosetDialog.Display(Window, Geoset, Data, Material)) return TRUE;

	Geoset->Data() = Data;
	if(Material != NULL)
	{
		Geoset->MaterialNode.Attach(Material->GeosetNodes);
	}
	else
	{
		Geoset->MaterialNode.Detach();
	}

	MainWindow.MakeModelUnsaved();

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Imports a geoset from a geo file
//+-----------------------------------------------------------------------------
BOOL GEOSET_MANAGER_WINDOW::ImportGeoset(MODEL_GEOSET& Geoset, CONST std::string& FileName, MODEL_BASE* Node)
{
	INT i;
	DWORD TempDWord;
	DWORD TempDWord2;
	MODEL_GEOSET_VERTEX* Vertex;
	MODEL_GEOSET_FACE* Face;
	MODEL_GEOSET_GROUP* Group;
	MODEL_GEOSET_GROUP_NODE* GroupNode;
	EXTENT* Extent;
	std::ifstream File;

	File.open(FileName.c_str(), std::ios::in | std::ios::binary);
	if(File.fail())
	{
		Error.SetMessage("Unable to open \"" + FileName + "\"!");
		return FALSE;
	}

	TempDWord = 0;
	File.read(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));
	if(TempDWord != 'XOEG')
	{
		Error.SetMessage("The file is not a geoset file!");
		return FALSE;
	}

	TempDWord = 0;
	File.read(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));
	Geoset.Data().SelectionGroup = TempDWord;

	TempDWord = 0;
	File.read(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));
	Geoset.Data().Unselectable = (TempDWord == 1);

	File.read(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Radius), sizeof(FLOAT));
	File.read(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Min.x), sizeof(FLOAT));
	File.read(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Min.y), sizeof(FLOAT));
	File.read(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Min.z), sizeof(FLOAT));
	File.read(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Max.x), sizeof(FLOAT));
	File.read(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Max.y), sizeof(FLOAT));
	File.read(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Max.z), sizeof(FLOAT));

	TempDWord = 0;
	File.read(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));

	Geoset.Data().VertexContainer.Reserve(TempDWord);
	for(i = 0; i < static_cast<INT>(TempDWord); i++)
	{
		Vertex = new MODEL_GEOSET_VERTEX();
		if(Vertex == NULL)
		{
			Error.SetMessage("Unable to create a new vertex!");
			return FALSE;
		}

		File.read(reinterpret_cast<CHAR*>(&Vertex->Position.x), sizeof(FLOAT));
		File.read(reinterpret_cast<CHAR*>(&Vertex->Position.y), sizeof(FLOAT));
		File.read(reinterpret_cast<CHAR*>(&Vertex->Position.z), sizeof(FLOAT));
		File.read(reinterpret_cast<CHAR*>(&Vertex->Normal.x), sizeof(FLOAT));
		File.read(reinterpret_cast<CHAR*>(&Vertex->Normal.y), sizeof(FLOAT));
		File.read(reinterpret_cast<CHAR*>(&Vertex->Normal.z), sizeof(FLOAT));
		File.read(reinterpret_cast<CHAR*>(&Vertex->TexturePosition.x), sizeof(FLOAT));
		File.read(reinterpret_cast<CHAR*>(&Vertex->TexturePosition.y), sizeof(FLOAT));

		Vertex->VertexGroup = 0;

		if(!Geoset.AddVertex(Vertex)) return FALSE;
	}

	TempDWord = 0;
	File.read(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));

	Geoset.Data().FaceContainer.Reserve(TempDWord);
	for(i = 0; i < static_cast<INT>(TempDWord); i++)
	{
		Face = new MODEL_GEOSET_FACE();
		if(Face == NULL)
		{
			Error.SetMessage("Unable to create a new face!");
			return FALSE;
		}

		File.read(reinterpret_cast<CHAR*>(&TempDWord2), sizeof(DWORD));
		Face->Index1 = TempDWord2;
		File.read(reinterpret_cast<CHAR*>(&TempDWord2), sizeof(DWORD));
		Face->Index2 = TempDWord2;
		File.read(reinterpret_cast<CHAR*>(&TempDWord2), sizeof(DWORD));
		Face->Index3 = TempDWord2;

		if(!Geoset.AddFace(Face)) return FALSE;
	}

	Group = new MODEL_GEOSET_GROUP();
	if(Group == NULL)
	{
		Error.SetMessage("Unable to create a new matrix group!");
		return FALSE;
	}

	GroupNode = new MODEL_GEOSET_GROUP_NODE();
	if(GroupNode == NULL)
	{
		Error.SetMessage("Unable to create a new matrix group node!");
		return FALSE;
	}

	if(Node != NULL)
	{
		GroupNode->Node.Attach(Node->MatrixListNodes);
	}
	else
	{
		GroupNode->Node.Detach();
	}

	Group->MatrixListSize = 1;
	Group->MatrixList.Add(GroupNode);

	if(!Geoset.AddGroup(Group)) return FALSE;

	for(i = 0; i < Model.Data().SequenceContainer.GetSize(); i++)
	{
		Extent = new EXTENT(Geoset.Data().Extent);
		if(Extent == NULL)
		{
			Error.SetMessage("Unable to create a new extent!");
			return FALSE;
		}

		if(!Geoset.AddExtent(Extent)) return FALSE;
	}

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Exports a geoset to a geo file
//+-----------------------------------------------------------------------------
BOOL GEOSET_MANAGER_WINDOW::ExportGeoset(MODEL_GEOSET& Geoset, CONST std::string& FileName)
{
	INT i;
	DWORD TempDWord;
	MODEL_GEOSET_VERTEX* Vertex;
	MODEL_GEOSET_FACE* Face;
	std::ofstream File;

	File.open(FileName.c_str(), std::ios::out | std::ios::binary);
	if(File.fail())
	{
		Error.SetMessage("Unable to open \"" + FileName + "\"!");
		return FALSE;
	}

	TempDWord = 'XOEG';
	File.write(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));

	TempDWord = Geoset.Data().SelectionGroup;
	File.write(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));

	TempDWord = Geoset.Data().Unselectable ? 1 : 0;
	File.write(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));

	File.write(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Radius), sizeof(FLOAT));
	File.write(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Min.x), sizeof(FLOAT));
	File.write(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Min.y), sizeof(FLOAT));
	File.write(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Min.z), sizeof(FLOAT));
	File.write(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Max.x), sizeof(FLOAT));
	File.write(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Max.y), sizeof(FLOAT));
	File.write(reinterpret_cast<CHAR*>(&Geoset.Data().Extent.Max.z), sizeof(FLOAT));

	TempDWord = Geoset.Data().VertexContainer.GetSize();
	File.write(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));

	for(i = 0; i < Geoset.Data().VertexContainer.GetTotalSize(); i++)
	{
		if(Geoset.Data().VertexContainer.ValidIndex(i))
		{
			Vertex = Geoset.Data().VertexContainer[i];

			File.write(reinterpret_cast<CHAR*>(&Vertex->Position.x), sizeof(FLOAT));
			File.write(reinterpret_cast<CHAR*>(&Vertex->Position.y), sizeof(FLOAT));
			File.write(reinterpret_cast<CHAR*>(&Vertex->Position.z), sizeof(FLOAT));
			File.write(reinterpret_cast<CHAR*>(&Vertex->Normal.x), sizeof(FLOAT));
			File.write(reinterpret_cast<CHAR*>(&Vertex->Normal.y), sizeof(FLOAT));
			File.write(reinterpret_cast<CHAR*>(&Vertex->Normal.z), sizeof(FLOAT));
			File.write(reinterpret_cast<CHAR*>(&Vertex->TexturePosition.x), sizeof(FLOAT));
			File.write(reinterpret_cast<CHAR*>(&Vertex->TexturePosition.y), sizeof(FLOAT));
		}
	}

	TempDWord = Geoset.Data().FaceContainer.GetSize();
	File.write(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));

	for(i = 0; i < Geoset.Data().FaceContainer.GetTotalSize(); i++)
	{
		if(Geoset.Data().FaceContainer.ValidIndex(i))
		{
			Face = Geoset.Data().FaceContainer[i];

			TempDWord = Face->Index1;
			File.write(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));
			TempDWord = Face->Index2;
			File.write(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));
			TempDWord = Face->Index3;
			File.write(reinterpret_cast<CHAR*>(&TempDWord), sizeof(DWORD));
		}
	}

	return TRUE;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?