private static IMeshBuilder <MaterialBuilder> ConvertMesh(PssgNode mpjnNode, ExportState state) { IEnumerable <PssgNode> primitives = mpjnNode.FindNodes("MATRIXPALETTERENDERINSTANCE"); // RD: Grid primitives = primitives.Concat(mpjnNode.FindNodes("MATRIXPALETTEJOINTRENDERINSTANCE")); // Dirt 2 and beyond var primitiveDatas = new List <PrimitiveData>(); var texCoordSets = 0; foreach (var prim in primitives) { var shaderName = ((string)prim.Attributes["shader"].Value).Substring(1); var material = CreateMaterialBuilder(shaderName, state, out var createdNew); string rdsId = ((string)prim.Attributes["indices"].Value).Substring(1); var rdsNode = prim.File.FindNodes("RENDERDATASOURCE", "id", rdsId).First(); var rds = new RenderDataSourceReader(rdsNode); texCoordSets = Math.Max(texCoordSets, rds.TexCoordSetCount); primitiveDatas.Add(new PrimitiveData(prim, material, createdNew, rds)); } string name = (string)mpjnNode.Attributes["id"].Value; var mb = CreateMeshBuilder(name, texCoordSets); foreach (var prim in primitiveDatas) { if (prim.CreatedNewMaterial) { ConvertMaterial(prim.Node.File, prim.Material, prim.Rds.TexCoordSetCount); } var pb = mb.UsePrimitive(prim.Material); var rds = prim.Rds; var indexOffset = prim.Node.Attributes["indexOffset"].GetValue <uint>(); var indexCount = prim.Node.Attributes["indicesCountFromOffset"].GetValue <uint>(); var triangles = rds.GetTriangles((int)indexOffset, (int)indexCount); foreach (var tri in triangles) { pb.AddTriangle( CreateVertexBuilder(rds, tri.A, state), CreateVertexBuilder(rds, tri.B, state), CreateVertexBuilder(rds, tri.C, state)); } } return(mb); }
protected record PrimitiveData(PssgNode Node, MaterialBuilder Material, bool CreatedNewMaterial, RenderDataSourceReader Rds);