示例#1
0
        public static List <Data.Mesh> Generate(GBODChunk gbodChunk, DX dx)
        {
            List <Data.Mesh> meshes = new List <Data.Mesh>();

            foreach (var child in gbodChunk.Children)
            {
                if (child is GSKNChunk)
                {
                    GPCEChunk gpceChunk = (child as GSKNChunk).Geometry;

                    // Tabula Rasa uses 'LOD'. Auto Assault uses 'LODLevel'
                    var lods = gpceChunk.USDA.Values.Where(kv => kv.Item1 == "LOD" || kv.Item1 == "LODLevel").ToList();
                    if (lods.Count > 0 && lods[0].Item2 != "0")
                    {
                        continue;
                    }

                    Data.Mesh mesh = Generate((GSKNChunk)child, dx);
                    meshes.Add(mesh);
                }

                if (child is GPCEChunk)
                {
                    GPCEChunk gpceChunk = child as GPCEChunk;

                    // Tabula Rasa uses 'LOD'. Auto Assault uses 'LODLevel'
                    var lods = gpceChunk.USDA.Values.Where(kv => kv.Item1 == "LOD" || kv.Item1 == "LODLevel").ToList();
                    if (lods.Count > 0 && lods[0].Item2 != "0")
                    {
                        continue;
                    }

                    Data.Mesh mesh = Generate(gpceChunk, dx);
                    meshes.Add(mesh);
                }
            }

            return(meshes);
        }
示例#2
0
        public static Data.Mesh Generate(GPCEChunk gpceChunk, DX dx)
        {
            var faces    = gpceChunk.IndexBuffer.Faces;
            var vertices = gpceChunk.VertexBuffer.Vertices;
            var normals  = gpceChunk.VertexBuffer.Normals;
            var uvs      = gpceChunk.VertexBuffer.UVs;
            var colors   = gpceChunk.VertexBuffer.Colors;
            //Vertex origin = gpceChunk.BoundingBox.Origin;
            //Vertex vMin = gpceChunk.BoundingBox.VertexMin;
            //Vertex vMax = gpceChunk.BoundingBox.VertexMax;

            List <Vector3> vertices3 = vertices.Select(v => new Vector3(v.X, v.Y, v.Z)).ToList();
            List <Vector3> normals3  = normals == null ? null : normals.Select(n => new Vector3(n.X, n.Y, n.Z)).ToList();
            List <Vector2> uvs2      = uvs.Select(uv => new Vector2(uv.U, uv.V)).ToList();
            List <Color>   colors1   = colors.Select(c => new Color(c)).ToList();

            // Auto Assault Hack
            if (colors1.Count == 0)
            {
                vertices.ForEach(f => colors1.Add(Color.White));
            }
            if (uvs2.Count == 0)
            {
                vertices.ForEach(f => uvs2.Add(new Vector2(0.0f, 0.0f)));
            }

            PARMChunk param = gpceChunk.Effect.parms.Where(p => p.Key == "DiffuseTexture").FirstOrDefault();

            byte[] textureData;
            try
            {
                string textureName = param.Values[0].ToString();
                Console.WriteLine("loading texture {0}", textureName);
                // assuming it exists
                textureData = trData.Filesystem[textureName].GetContents();
            }
            catch (Exception)
            {
                // no texture, go with the flow
                // Tabula Rasa
                if (trData.Filesystem.ContainsKey("default.dds"))
                {
                    textureData = trData.Filesystem["default.dds"].GetContents();
                }
                // Auto Assault
                else if (trData.Filesystem.ContainsKey("black_dif.dds"))
                {
                    textureData = trData.Filesystem["black_dif.dds"].GetContents();
                }
                else
                {
                    textureData = null;
                    Debugger.Break();
                }
            }

            Data.Mesh mesh = new Viewer.Data.Mesh(dx);
            mesh.Create(vertices3, faces, uvs2, colors1, normals3);
            mesh.LoadDiffuseTexture(textureData);
            mesh.BoundingBox = new Data.BoundingBox(vertices3);
            //mesh.BoundingBox = new Data.BoundingBox()
            //{
            //    VMin = new Vector3( vMin.X, vMin.Y, vMin.Z ),
            //    VMax = new Vector3( vMax.X, vMax.Y, vMax.Z )
            //};
            //mesh.CreateBoundingBox( vMin, vMax, origin );
            //mesh.BoundingBox.Origin = new Vector3( -origin.X, -origin.Y, -origin.Z );

            return(mesh);
        }