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);
        }
Exemplo n.º 2
0
 protected record PrimitiveData(PssgNode Node, MaterialBuilder Material, bool CreatedNewMaterial, RenderDataSourceReader Rds);