Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
        }