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); }
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); }