private void RemoveFaceInternal(FaceEntry faceEntry) { foreach (var v in faceEntry.Vertices) { v.Faces.Remove(faceEntry); } foreach (var e in faceEntry.Edges) { e.Faces.Remove(faceEntry); } }
private void Update(EvaluationContext context) { var resourceManager = ResourceManager.Instance(); string path = Path.GetValue(context); var mesh = ObjMesh.LoadFromFile(path); if (mesh == null) { Log.Warning($"Could not load {path}"); return; } float areaSum = 0.0f; int numVertexEntries = mesh.Faces.Count; var faceBufferData = new FaceEntry[numVertexEntries]; for (int i = 0, faceIndex = 0; faceIndex < mesh.Faces.Count; faceIndex++) { var face = mesh.Faces[faceIndex]; // calc area of triangle Vector3 v0 = mesh.Positions[face.V0]; Vector3 v1 = mesh.Positions[face.V1]; Vector3 v2 = mesh.Positions[face.V2]; Vector3 baseDir = (v1 - v0); float a = baseDir.Length(); baseDir.Normalize(); Vector3 heightStart = v0 + Vector3.Dot(v2 - v0, baseDir) * baseDir; float b = (v2 - heightStart).Length(); float faceArea = a * b * 0.5f; areaSum += faceArea; faceBufferData[i].Pos0 = v0; faceBufferData[i].Pos1 = v1; faceBufferData[i].Pos2 = v2; faceBufferData[i].Normal0 = mesh.Normals[face.V0n]; faceBufferData[i].Normal1 = mesh.Normals[face.V1n]; faceBufferData[i].Normal2 = mesh.Normals[face.V2n]; faceBufferData[i].TexCoord0 = mesh.TexCoords[face.V0t]; faceBufferData[i].TexCoord1 = mesh.TexCoords[face.V1t]; faceBufferData[i].TexCoord2 = mesh.TexCoords[face.V2t]; faceBufferData[i].FaceArea = faceArea; i++; } // normalize face area to 1 float sumReci = 1.0f / areaSum; float cdf = 0.0f; for (int i = 0; i < faceBufferData.Length; i++) { cdf += faceBufferData[i].FaceArea * sumReci; faceBufferData[i].Cdf = cdf; } int stride = 108; resourceManager.SetupStructuredBuffer(faceBufferData, stride * numVertexEntries, stride, ref Buffer); Buffer.DebugName = nameof(PointCloudFromObj); resourceManager.CreateStructuredBufferSrv(Buffer, ref PointCloudSrv.Value); }