public void Render(Camera camera, MeshRenderMode renderMode) { var visibleMeshes = MeshModels.Where(x => x.Visible) .OrderByDescending(x => x.IsSelected).ToList(); if (!visibleMeshes.Any()) { return; } RenderHelper.ModelShader.Use(); RenderHelper.ModelShader.UseTexture.Set(renderMode != MeshRenderMode.Wireframe && Surface.SurfaceID > 0); bool useOutlineStencil = visibleMeshes.Any(x => x.IsSelected); if (useOutlineStencil) { RenderHelper.EnableStencilTest(); } foreach (var model in visibleMeshes) { if (model.IsSelected && !useOutlineStencil) { } RenderHelper.RenderWithStencil(model.IsSelected, () => { RenderPartialMesh(renderMode, model, Material); }, () => { DrawWireframeModel(model, RenderHelper.SelectionOutlineColor, 4f); } ); if (useOutlineStencil) { RenderHelper.ClearStencil(); } } if (useOutlineStencil) { RenderHelper.DisableStencilTest(); } //Draw selected models bounding boxes foreach (var model in visibleMeshes) { if (model.IsSelected) { var selectionBox = model.BoundingBox; selectionBox.Size += new Vector3(0.1f); RenderHelper.DrawBoundingBox(model.Transform, selectionBox, new Vector4(0f, 1f, 1f, 1f), 1.5f); } } }
private SurfaceModelMesh AddMeshGeometry(ModelMeshReference modelMesh, List <int> indexList, List <VertVNT> vertexList) { var geometry = modelMesh.GetGeometry(); int indexOffset = indexList.Count; int vertexOffset = vertexList.Count; var triangleIndices = geometry.GetTriangleIndices(); Vector3 minPos = new Vector3(9999f); Vector3 maxPos = new Vector3(-9999f); indexList.AddRange(triangleIndices); foreach (var vertex in geometry.Vertices) { var glVertex = new VertVNT() { Position = vertex.Position.ToGL(), Normal = vertex.Normal.ToGL(), TexCoord = geometry.IsTextured ? vertex.TexCoord.ToGL() : Vector2.Zero }; minPos = Vector3.ComponentMin(minPos, glVertex.Position); maxPos = Vector3.ComponentMax(maxPos, glVertex.Position); vertexList.Add(glVertex); } var model = new SurfaceModelMesh(this, modelMesh, indexOffset, geometry.IndexCount, vertexOffset); model.BoundingBox = BBox.FromMinMax(minPos, maxPos); MeshModels.Add(model); return(model); }
public void RebuildPartModels() { MeshModels.Clear(); VertexBuffer.ClearBuffers(); var indices = new List <int>(); var vertices = new List <VertVNT>(); var distinctMeshes = new List <ModelMesh>(); foreach (var surfComp in Surface.Components) { foreach (var meshRef in surfComp.Meshes) { if (!meshRef.ModelMesh.CheckFileExist()) { Debug.WriteLine($"Error: Could not load model: {meshRef.ModelMesh.FileName}"); continue; } var addedModel = AddMeshGeometry(meshRef, indices, vertices); if (!distinctMeshes.Contains(meshRef.ModelMesh)) { distinctMeshes.Add(meshRef.ModelMesh); } } if (surfComp is FemaleStudModel femaleStud) { foreach (var meshRef in femaleStud.ReplacementMeshes) { if (!meshRef.ModelMesh.CheckFileExist()) { Debug.WriteLine($"Error: Could not load model: {meshRef.ModelMesh.FileName}"); continue; } var addedModel = AddMeshGeometry(meshRef, indices, vertices); addedModel.IsReplacementModel = true; if (!distinctMeshes.Contains(meshRef.ModelMesh)) { distinctMeshes.Add(meshRef.ModelMesh); } } } } distinctMeshes.ForEach(x => x.UnloadModel()); Indices = indices.ToArray(); Vertices = vertices.ToArray(); VertexBuffer.SetIndices(indices); VertexBuffer.SetVertices(vertices); }
public void Dispose() { if (VertexBuffer != null) { VertexBuffer.Dispose(); } Vertices = new VertVNT[0]; Indices = new int[0]; MeshModels.Clear(); Surface = null; }
public void Dispose() { if (VertexBuffer != null) { VertexBuffer.Dispose(); VertexBuffer = null; } //if (BoneWeightBuffer != null) // BoneWeightBuffer.Dispose(); Vertices = new VertVNT[0]; Indices = new int[0]; MeshModels.Clear(); Surface = null; }