modelloadermdl.cpp

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

CPP
2,345
字号
	}

	if(Texture.Data().WrapHeight)
	{
		TokenStream.WriteTab(2);
		TokenStream.WriteLine("WrapHeight,");
	}

	TokenStream.WriteTab();
	TokenStream.WriteLine("}");

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves the model materials
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDL::SaveMaterials(MODEL& Model, TOKEN_OUT_STREAM& TokenStream)
{
	INT i;

	if(Model.Data().MaterialContainer.GetSize() <= 0) return TRUE;

	TokenStream.WriteWord("Materials ");
	TokenStream.WriteInt(Model.Data().MaterialContainer.GetSize());
	TokenStream.WriteLine(" {");

	for(i = 0; i < Model.Data().MaterialContainer.GetTotalSize(); i++)
	{
		if(Model.Data().MaterialContainer.ValidIndex(i))
		{
			if(!SaveMaterial(*(Model.Data().MaterialContainer[i]), TokenStream)) return FALSE;
		}
	}

	TokenStream.WriteLine("}");

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves a model material
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDL::SaveMaterial(MODEL_MATERIAL& Material, TOKEN_OUT_STREAM& TokenStream)
{
	INT i;
	MODEL_MATERIAL_LAYER* Layer;

	TokenStream.WriteTab();
	TokenStream.WriteLine("Material {");

	if(Material.Data().ConstantColor)
	{
		TokenStream.WriteTab(2);
		TokenStream.WriteLine("ConstantColor,");
	}

	if(Material.Data().SortPrimitivesFarZ)
	{
		TokenStream.WriteTab(2);
		TokenStream.WriteLine("SortPrimsFarZ,");
	}

	if(Material.Data().FullResolution)
	{
		TokenStream.WriteTab(2);
		TokenStream.WriteLine("FullResolution,");
	}

	if(Material.Data().PriorityPlane != 0)
	{
		TokenStream.WriteTab(2);
		TokenStream.WriteWord("PriorityPlane ");
		TokenStream.WriteInt(Material.Data().PriorityPlane);
		TokenStream.WriteLine(",");
	}

	for(i = 0; i < Material.Data().LayerContainer.GetTotalSize(); i++)
	{
		if(Material.Data().LayerContainer.ValidIndex(i))
		{
			Layer = Material.Data().LayerContainer[i];

			TokenStream.WriteTab(2);
			TokenStream.WriteLine("Layer {");

			switch(Layer->Data().FilterMode)
			{
				case FILTER_MODE_NONE:
				{
					TokenStream.WriteTab(3);
					TokenStream.WriteLine("FilterMode None,");
					break;
				}

				case FILTER_MODE_TRANSPARENT:
				{
					TokenStream.WriteTab(3);
					TokenStream.WriteLine("FilterMode Transparent,");
					break;
				}

				case FILTER_MODE_BLEND:
				{
					TokenStream.WriteTab(3);
					TokenStream.WriteLine("FilterMode Blend,");
					break;
				}

				case FILTER_MODE_ADDITIVE:
				{
					TokenStream.WriteTab(3);
					TokenStream.WriteLine("FilterMode Additive,");
					break;
				}

				case FILTER_MODE_ADD_ALPHA:
				{
					TokenStream.WriteTab(3);
					TokenStream.WriteLine("FilterMode AddAlpha,");
					break;
				}

				case FILTER_MODE_MODULATE:
				{
					TokenStream.WriteTab(3);
					TokenStream.WriteLine("FilterMode Modulate,");
					break;
				}
			}

			while(TRUE)
			{
				if(Layer->Data().Alpha.IsStatic())
				{
					if(Layer->Data().Alpha.GetScalar() == 1.0f) break;
				}

				if(!Layer->Data().Alpha.Save(TokenStream, 3)) return FALSE;

				break;
			}

			if(!Layer->Data().AnimatedTextureId.Save(TokenStream, 3)) return FALSE;

			if(Layer->Data().TwoSided)
			{
				TokenStream.WriteTab(3);
				TokenStream.WriteLine("TwoSided,");
			}

			if(Layer->Data().Unshaded)
			{
				TokenStream.WriteTab(3);
				TokenStream.WriteLine("Unshaded,");
			}

			if(Layer->Data().Unfogged)
			{
				TokenStream.WriteTab(3);
				TokenStream.WriteLine("Unfogged,");
			}

			if(Layer->Data().SphereEnvironmentMap)
			{
				TokenStream.WriteTab(3);
				TokenStream.WriteLine("SphereEnvMap,");
			}

			if(Layer->Data().NoDepthTest)
			{
				TokenStream.WriteTab(3);
				TokenStream.WriteLine("NoDepthTest,");
			}

			if(Layer->Data().NoDepthSet)
			{
				TokenStream.WriteTab(3);
				TokenStream.WriteLine("NoDepthSet,");
			}

			if(Layer->Data().TextureAnimationId != INVALID_INDEX)
			{
				TokenStream.WriteTab(3);
				TokenStream.WriteWord("TVertexAnimId ");
				TokenStream.WriteInt(Layer->Data().TextureAnimationId);
				TokenStream.WriteLine(",");
			}

			TokenStream.WriteTab(2);
			TokenStream.WriteLine("}");
		}
	}

	TokenStream.WriteTab();
	TokenStream.WriteLine("}");

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves the model texture animations
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDL::SaveTextureAnimations(MODEL& Model, TOKEN_OUT_STREAM& TokenStream)
{
	INT i;

	if(Model.Data().TextureAnimationContainer.GetSize() <= 0) return TRUE;

	TokenStream.WriteWord("TextureAnims ");
	TokenStream.WriteInt(Model.Data().TextureAnimationContainer.GetSize());
	TokenStream.WriteLine(" {");

	for(i = 0; i < Model.Data().TextureAnimationContainer.GetTotalSize(); i++)
	{
		if(Model.Data().TextureAnimationContainer.ValidIndex(i))
		{
			if(!SaveTextureAnimation(*(Model.Data().TextureAnimationContainer[i]), TokenStream)) return FALSE;
		}
	}

	TokenStream.WriteLine("}");

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves a model texture animation
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDL::SaveTextureAnimation(MODEL_TEXTURE_ANIMATION& TextureAnimation, TOKEN_OUT_STREAM& TokenStream)
{
	TokenStream.WriteTab();
	TokenStream.WriteLine("TVertexAnim {");

	while(TRUE)
	{
		if(TextureAnimation.Data().Translation.IsStatic())
		{
			if(TextureAnimation.Data().Translation.GetVector3() == D3DXVECTOR3(0.0f, 0.0f, 0.0f)) break;
		}

		if(!TextureAnimation.Data().Translation.Save(TokenStream, 2)) return FALSE;

		break;
	}

	while(TRUE)
	{
		if(TextureAnimation.Data().Rotation.IsStatic())
		{
			if(TextureAnimation.Data().Rotation.GetVector4() == D3DXVECTOR4(0.0f, 0.0f, 0.0f, 1.0f)) break;
		}

		if(!TextureAnimation.Data().Rotation.Save(TokenStream, 2)) return FALSE;

		break;
	}

	while(TRUE)
	{
		if(TextureAnimation.Data().Scaling.IsStatic())
		{
			if(TextureAnimation.Data().Scaling.GetVector3() == D3DXVECTOR3(1.0f, 1.0f, 1.0f)) break;
		}

		if(!TextureAnimation.Data().Scaling.Save(TokenStream, 2)) return FALSE;

		break;
	}

	TokenStream.WriteTab();
	TokenStream.WriteLine("}");

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves the model geosets
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDL::SaveGeosets(MODEL& Model, TOKEN_OUT_STREAM& TokenStream)
{
	INT i;

	if(Model.Data().GeosetContainer.GetSize() <= 0) return TRUE;

	for(i = 0; i < Model.Data().GeosetContainer.GetTotalSize(); i++)
	{
		if(Model.Data().GeosetContainer.ValidIndex(i))
		{
			if(!SaveGeoset(*(Model.Data().GeosetContainer[i]), TokenStream)) return FALSE;
		}
	}

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves a model geoset
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDL::SaveGeoset(MODEL_GEOSET& Geoset, TOKEN_OUT_STREAM& TokenStream)
{
	INT i;
	INT j;
	INT Total;
	BOOL First;
	MODEL_GEOSET_GROUP* Group;

	TokenStream.WriteLine("Geoset {");

	TokenStream.WriteTab();
	TokenStream.WriteWord("Vertices ");
	TokenStream.WriteInt(Geoset.Data().VertexContainer.GetSize());
	TokenStream.WriteLine(" {");

	for(i = 0; i < Geoset.Data().VertexContainer.GetTotalSize(); i++)
	{
		if(Geoset.Data().VertexContainer.ValidIndex(i))
		{
			TokenStream.WriteTab(2);
			TokenStream.WriteVector3(Geoset.Data().VertexContainer[i]->Position);
			TokenStream.WriteLine(",");
		}
	}

	TokenStream.WriteTab();
	TokenStream.WriteLine("}");

	TokenStream.WriteTab();
	TokenStream.WriteWord("Normals ");
	TokenStream.WriteInt(Geoset.Data().VertexContainer.GetSize());
	TokenStream.WriteLine(" {");

	for(i = 0; i < Geoset.Data().VertexContainer.GetTotalSize(); i++)
	{
		if(Geoset.Data().VertexContainer.ValidIndex(i))
		{
			TokenStream.WriteTab(2);
			TokenStream.WriteVector3(Geoset.Data().VertexContainer[i]->Normal);
			TokenStream.WriteLine(",");
		}
	}

	TokenStream.WriteTab();
	TokenStream.WriteLine("}");

	TokenStream.WriteTab();
	TokenStream.WriteWord("TVertices ");
	TokenStream.WriteInt(Geoset.Data().VertexContainer.GetSize());
	TokenStream.WriteLine(" {");

	for(i = 0; i < Geoset.Data().VertexContainer.GetTotalSize(); i++)
	{
		if(Geoset.Data().VertexContainer.ValidIndex(i))
		{
			TokenStream.WriteTab(2);
			TokenStream.WriteVector2(Geoset.Data().VertexContainer[i]->TexturePosition);
			TokenStream.WriteLine(",");
		}
	}

	TokenStream.WriteTab();
	TokenStream.WriteLine("}");

	TokenStream.WriteTab();
	TokenStream.WriteWord("VertexGroup ");
	TokenStream.WriteLine(" {");

	for(i = 0; i < Geoset.Data().VertexContainer.GetTotalSize(); i++)
	{
		if(Geoset.Data().VertexContainer.ValidIndex(i))
		{
			TokenStream.WriteTab(2);
			TokenStream.WriteInt(Geoset.Data().VertexContainer[i]->VertexGroup);
			TokenStream.WriteLine(",");
		}
	}

	TokenStream.WriteTab();
	TokenStream.WriteLine("}");

	TokenStream.WriteTab();
	TokenStream.WriteWord("Faces 1 ");
	TokenStream.WriteInt(Geoset.Data().FaceContainer.GetSize() * 3);
	TokenStream.WriteLine(" {");
	TokenStream.WriteTab(2);
	TokenStream.WriteLine("Triangles {");
	TokenStream.WriteTab(3);
	TokenStream.WriteWord("{ ");

	First = TRUE;
	for(i = 0; i < Geoset.Data().FaceContainer.GetTotalSize(); i++)
	{
		if(Geoset.Data().FaceContainer.ValidIndex(i))
		{
			if(!First) TokenStream.WriteWord(", ");
			TokenStream.WriteInt(Geoset.Data().FaceContainer[i]->Index1);
			TokenStream.WriteWord(", ");
			TokenStream.WriteInt(Geoset.Data().FaceContainer[i]->Index2);
			TokenStream.WriteWord(", ");
			TokenStream.WriteInt(Geoset.Data().FaceContainer[i]->Index3);

			First = FALSE;
		}
	}

	TokenStream.WriteLine(" },");
	TokenStream.WriteTab(2);
	TokenStream.WriteLine("}");
	TokenStream.WriteTab();
	TokenStream.WriteLine("}");

	Total = 0;
	for(i = 0; i < Geoset.Data().GroupContainer.GetTotalSize(); i++)
	{
		if(Geoset.Data().GroupContainer.ValidIndex(i))
		{
			Total += Geoset.Data().GroupContainer[i]->MatrixListSize;
		}
	}

	TokenStream.WriteTab();
	TokenStream.WriteWord("Groups ");
	TokenStream.WriteInt(Geoset.Data().GroupContainer.GetSize());
	TokenStream.WriteWord(" ");
	TokenStream.WriteInt(Total);
	TokenStream.WriteLine(" {");

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

			TokenStream.WriteTab(2);
			TokenStream.WriteWord("Matrices { ");

			First = TRUE;
			for(j = 0; j < Group->MatrixList.GetTotalSize(); j++)
			{
				if(Group->MatrixList.ValidIndex(j))
				{
					if(!First) TokenStream.WriteWord(", ");
					TokenStream.WriteInt(Group->MatrixList[j]->NodeId);

					First = FALSE;
				}
			}

			TokenStream.WriteLine(" },");
		}
	}

	TokenStream.WriteTab();
	TokenStream.WriteLine("}");

	if(Geoset.Data().Extent.Min != D3DXVECTOR3(0.0f, 0.0f, 0.0f))
	{
		TokenStream.WriteTab();
		TokenStream.WriteWord("MinimumExtent ");
		TokenStream.WriteVector3(Geoset.Data().Extent.Min);
		TokenStream.WriteLine(",");
	}

⌨️ 快捷键说明

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