| 731 | } |
| 732 | |
| 733 | BF_EXPORT StringView BF_CALLTYPE Res_SerializeModel(ModelDef* modelDef) |
| 734 | { |
| 735 | DynMemStream ms; |
| 736 | ms.Write((int)0xBEEF0001); |
| 737 | |
| 738 | for (auto& mesh : modelDef->mMeshes) |
| 739 | { |
| 740 | for (auto& prims : mesh.mPrimitives) |
| 741 | { |
| 742 | ms.Write((int)prims.mFlags); |
| 743 | ms.Write(prims.mTexPaths.mSize); |
| 744 | for (auto& path : prims.mTexPaths) |
| 745 | ms.Write(path); |
| 746 | |
| 747 | ms.Write((int)prims.mIndices.mSize); |
| 748 | ms.Write(prims.mIndices.mVals, prims.mIndices.mSize * 2); |
| 749 | |
| 750 | ms.Write((int)prims.mVertices.mSize); |
| 751 | |
| 752 | for (int i = 0; i < prims.mVertices.mSize; i++) |
| 753 | { |
| 754 | auto& vtx = prims.mVertices[i]; |
| 755 | if ((prims.mFlags & ModelPrimitives::Flags_Vertex_Position) != 0) |
| 756 | ms.WriteT(vtx.mPosition); |
| 757 | if ((prims.mFlags & ModelPrimitives::Flags_Vertex_Tex0) != 0) |
| 758 | ms.WriteT(vtx.mTexCoords); |
| 759 | if ((prims.mFlags & ModelPrimitives::Flags_Vertex_Tex1) != 0) |
| 760 | ms.WriteT(vtx.mBumpTexCoords); |
| 761 | if ((prims.mFlags & ModelPrimitives::Flags_Vertex_Color) != 0) |
| 762 | ms.WriteT(vtx.mColor); |
| 763 | if ((prims.mFlags & ModelPrimitives::Flags_Vertex_Normal) != 0) |
| 764 | ms.WriteT(vtx.mNormal); |
| 765 | if ((prims.mFlags & ModelPrimitives::Flags_Vertex_Tangent) != 0) |
| 766 | ms.WriteT(vtx.mTangent); |
| 767 | } |
| 768 | } |
| 769 | } |
| 770 | |
| 771 | String& outString = *gModelDef_TLStrReturn.Get(); |
| 772 | outString.Clear(); |
| 773 | outString.Append((char*)ms.GetPtr(), ms.GetSize()); |
| 774 | return outString; |
| 775 | } |