-
Notifications
You must be signed in to change notification settings - Fork 71
/
Copy pathMRIntersectionContour.cs
119 lines (103 loc) · 4.32 KB
/
MRIntersectionContour.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Runtime.InteropServices;
using static MR.DotNet;
namespace MR
{
using ContinousContour = List<VariableEdgeTri>;
public partial class DotNet
{
[StructLayout(LayoutKind.Sequential)]
public struct VariableEdgeTri
{
public EdgeId edge = new EdgeId();
public FaceId tri = new FaceId();
public bool isEdgeATriB = false;
public VariableEdgeTri() { }
};
public class ContinousContours : IDisposable
{
[StructLayout(LayoutKind.Sequential)]
internal struct MRContinuousContour
{
public IntPtr data = IntPtr.Zero;
public ulong size = 0;
public IntPtr reserved = IntPtr.Zero;
public MRContinuousContour() { }
}
[DllImport("MRMeshC", CharSet = CharSet.Auto)]
private static extern MRContinuousContour mrContinuousContoursGet(IntPtr contours, ulong index);
[DllImport("MRMeshC", CharSet = CharSet.Auto)]
private static extern ulong mrContinuousContoursSize(IntPtr contours);
[DllImport("MRMeshC", CharSet = CharSet.Auto)]
private static extern void mrContinuousContoursFree(IntPtr contours);
internal ContinousContours(IntPtr mrContours)
{
mrContours_ = mrContours;
}
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (mrContours_ != IntPtr.Zero)
{
mrContinuousContoursFree(mrContours_);
}
disposed = true;
}
}
~ContinousContours()
{
Dispose(false);
}
public ReadOnlyCollection<ContinousContour> Contours
{
get
{
if (contours_ is null)
{
int contoursSize = (int)mrContinuousContoursSize(mrContours_);
contours_ = new List<ContinousContour>();
for (int i = 0; i < contoursSize; i++)
{
var mrContour = mrContinuousContoursGet(mrContours_, (ulong)i);
var contour = new ContinousContour();
int sizeOfVariableEdgeTri = Marshal.SizeOf(typeof(VariableEdgeTri));
for (int j = 0; j < (int)mrContour.size; j++)
{
var vetPtr = IntPtr.Add(mrContour.data, j * sizeOfVariableEdgeTri);
var vet = Marshal.PtrToStructure<VariableEdgeTri>(vetPtr);
contour.Add(vet);
}
contours_.Add(contour);
}
}
return contours_.AsReadOnly();
}
}
private List<ContinousContour>? contours_;
internal IntPtr mrContours_;
}
public class IntersectionContour
{
[DllImport("MRMeshC", CharSet = CharSet.Auto)]
private static extern IntPtr mrOrderIntersectionContours(IntPtr topologyA, IntPtr topologyB, IntPtr intersections);
/// combines individual intersections into ordered contours with the properties:
/// a. left of contours on mesh A is inside of mesh B,
/// b. right of contours on mesh B is inside of mesh A,
/// c. each intersected edge has origin inside meshes intersection and destination outside of it
public static ContinousContours OrderIntersectionContours(Mesh meshA, Mesh meshB, PreciseCollisionResult intersections)
{
var mrContours = mrOrderIntersectionContours(meshA.meshTopology_, meshB.meshTopology_, intersections.nativeResult_);
return new ContinousContours(mrContours);
}
}
}
}