SurModel GetSurModel(LibreLancer.Physics.Sur.ConvexMesh[] meshes, Part part, Color4 color) { var mdl = new SurModel() { Part = part }; if (color != surPart) { mdl.Hardpoint = true; } var verts = new List <VertexPositionColor>(); var indices = new List <short>(); foreach (var m in meshes) { mdl.Draws.Add(new SurDrawCall() { BaseVertex = verts.Count, Start = indices.Count, Count = m.Indices.Length / 3 }); verts.AddRange(m.Vertices.Select(x => new VertexPositionColor(x, color))); indices.AddRange(m.Indices.Select(x => (short)x)); } mdl.Vertices = new VertexBuffer(typeof(VertexPositionColor), verts.Count); mdl.Vertices.SetData(verts.ToArray()); mdl.Elements = new ElementBuffer(indices.Count); mdl.Elements.SetData(indices.ToArray()); mdl.Vertices.SetElementBuffer(mdl.Elements); return(mdl); }
void ProcessSur(LibreLancer.Physics.Sur.SurFile surfile) { if (surs != null) { foreach (var mdl in surs) { mdl.Vertices.Dispose(); mdl.Elements.Dispose(); } } surs = new List <SurModel>(); if ((drawable is ModelFile)) { surs.Add(GetSurModel(surfile.GetMesh(0, false), null, surPart)); foreach (var hpid in surfile.HardpointIds) { surs.Add(GetSurModel(surfile.GetMesh(hpid, true), null, surHardpoint)); } } else { Dictionary <Part, SurPart> surParts; var surHierarchy = ((CmpFile)drawable).ToSurHierarchy(out surParts); surfile.FillMeshHierarchy(surHierarchy); foreach (var kv in surParts) { var mdl = new SurModel() { Part = kv.Key }; foreach (var hp in kv.Key.Model.Hardpoints) { var crc = CrcTool.FLModelCrc(hp.Name); if (surfile.HardpointIds.Contains(crc)) { surs.Add(GetSurModel(surfile.GetMesh(crc, true), kv.Key, surHardpoint)); } } if (kv.Value.DisplayMeshes != null) { foreach (var msh in kv.Value.DisplayMeshes) { AddVertices(mdl, msh); } } mdl.Vertices = new VertexBuffer(typeof(VertexPositionColor), mdl.BuildVertices.Count); mdl.Vertices.SetData(mdl.BuildVertices.ToArray()); mdl.BuildVertices = null; mdl.Elements = new ElementBuffer(mdl.BuildIndices.Count); mdl.Elements.SetData(mdl.BuildIndices.ToArray()); mdl.Vertices.SetElementBuffer(mdl.Elements); mdl.BuildIndices = null; surs.Add(mdl); } } }
void AddVertices(SurModel mdl, LibreLancer.Physics.Sur.ConvexMesh mesh) { var baseVertex = mdl.BuildVertices.Count; var index = mdl.BuildIndices.Count; mdl.BuildVertices.AddRange(mesh.Vertices.Select(x => new VertexPositionColor(x, surPart))); mdl.BuildIndices.AddRange(mesh.Indices.Select(x => (short)x)); mdl.Draws.Add(new SurDrawCall() { BaseVertex = baseVertex, Start = index, Count = mesh.Indices.Length / 3 }); }