3232*/
3333
3434using System ;
35+ using System . Collections . Generic ;
3536using System . Diagnostics ;
3637
3738#if DOUBLE
@@ -46,12 +47,14 @@ internal class Mesh : MeshUtils.Pooled<Mesh>
4647 internal MeshUtils . Face _fHead ;
4748 internal MeshUtils . Edge _eHead , _eHeadSym ;
4849
49- public Mesh ( )
50+ private readonly List < MeshUtils . EdgePair > _allEdgePairs = new List < MeshUtils . EdgePair > ( 20000 ) ;
51+
52+ public void Init ( )
5053 {
5154 var v = _vHead = MeshUtils . Vertex . Create ( ) ;
5255 var f = _fHead = MeshUtils . Face . Create ( ) ;
5356
54- var pair = MeshUtils . EdgePair . Create ( ) ;
57+ var pair = CreateEdgePair ( ) ;
5558 var e = _eHead = pair . _e ;
5659 var eSym = _eHeadSym = pair . _eSym ;
5760
@@ -85,28 +88,58 @@ public Mesh()
8588
8689 public override void Reset ( )
8790 {
88- _vHead = null ;
89- _fHead = null ;
90- _eHead = _eHeadSym = null ;
91- }
92-
93- public override void OnFree ( )
94- {
95- for ( MeshUtils . Face f = _fHead . _next , fNext = _fHead ; f != _fHead ; f = fNext )
91+ MeshUtils . Face f = _fHead . _next ;
92+ while ( true )
9693 {
97- fNext = f . _next ;
94+ MeshUtils . Face fNext = f . _next ;
9895 f . Free ( ) ;
96+ if ( f == _fHead ) break ;
97+ f = fNext ;
9998 }
100- for ( MeshUtils . Vertex v = _vHead . _next , vNext = _vHead ; v != _vHead ; v = vNext )
99+
100+ MeshUtils . Vertex v = _vHead . _next ;
101+ while ( true )
101102 {
102- vNext = v . _next ;
103+ MeshUtils . Vertex vNext = v . _next ;
103104 v . Free ( ) ;
105+ if ( v == _vHead ) break ;
106+ v = vNext ;
104107 }
105- for ( MeshUtils . Edge e = _eHead . _next , eNext = _eHead ; e != _eHead ; e = eNext )
108+
109+ for ( int i = 0 ; i < _allEdgePairs . Count ; i ++ )
106110 {
107- eNext = e . _next ;
108- e . Free ( ) ;
111+ MeshUtils . EdgePair pair = _allEdgePairs [ i ] ;
112+
113+ MeshUtils . Edge e = pair . _e ;
114+ if ( ! e . IsReturnedToPool ( ) ) // (can be Free in KillEdge)
115+ {
116+ e . Free ( ) ;
117+ }
118+
119+ MeshUtils . Edge eSym = pair . _eSym ;
120+ if ( ! eSym . IsReturnedToPool ( ) ) // (can be Free in KillEdge)
121+ {
122+ eSym . Free ( ) ;
123+ }
124+
125+ pair . Free ( ) ;
109126 }
127+ _allEdgePairs . Clear ( ) ;
128+
129+ _vHead = null ;
130+ _fHead = null ;
131+ _eHead = _eHeadSym = null ;
132+ }
133+
134+ private MeshUtils . EdgePair CreateEdgePair ( )
135+ {
136+ var pair = MeshUtils . EdgePair . Create ( ) ;
137+ pair . _e = MeshUtils . Edge . Create ( ) ;
138+ pair . _e . _pair = pair ;
139+ pair . _eSym = MeshUtils . Edge . Create ( ) ;
140+ pair . _eSym . _pair = pair ;
141+ _allEdgePairs . Add ( pair ) ;
142+ return pair ;
110143 }
111144
112145 /// <summary>
@@ -115,7 +148,7 @@ public override void OnFree()
115148 /// </summary>
116149 public MeshUtils . Edge MakeEdge ( )
117150 {
118- var e = MeshUtils . MakeEdge ( _eHead ) ;
151+ var e = MakeEdge ( _eHead ) ;
119152
120153 MeshUtils . MakeVertex ( e , _vHead ) ;
121154 MeshUtils . MakeVertex ( e . _Sym , _vHead ) ;
@@ -124,6 +157,49 @@ public MeshUtils.Edge MakeEdge()
124157 return e ;
125158 }
126159
160+ /// <summary>
161+ /// MakeEdge creates a new pair of half-edges which form their own loop.
162+ /// No vertex or face structures are allocated, but these must be assigned
163+ /// before the current edge operation is completed.
164+ /// </summary>
165+ private MeshUtils . Edge MakeEdge ( MeshUtils . Edge eNext )
166+ {
167+ Debug . Assert ( eNext != null ) ;
168+
169+ var pair = CreateEdgePair ( ) ;
170+ var e = pair . _e ;
171+ var eSym = pair . _eSym ;
172+
173+ // Make sure eNext points to the first edge of the edge pair
174+ MeshUtils . Edge . EnsureFirst ( ref eNext ) ;
175+
176+ // Insert in circular doubly-linked list before eNext.
177+ // Note that the prev pointer is stored in Sym->next.
178+ var ePrev = eNext . _Sym . _next ;
179+ eSym . _next = ePrev ;
180+ ePrev . _Sym . _next = e ;
181+ e . _next = eNext ;
182+ eNext . _Sym . _next = eSym ;
183+
184+ e . _Sym = eSym ;
185+ e . _Onext = e ;
186+ e . _Lnext = eSym ;
187+ e . _Org = null ;
188+ e . _Lface = null ;
189+ e . _winding = 0 ;
190+ e . _activeRegion = null ;
191+
192+ eSym . _Sym = e ;
193+ eSym . _Onext = eSym ;
194+ eSym . _Lnext = e ;
195+ eSym . _Org = null ;
196+ eSym . _Lface = null ;
197+ eSym . _winding = 0 ;
198+ eSym . _activeRegion = null ;
199+
200+ return e ;
201+ }
202+
127203 /// <summary>
128204 /// Splice is the basic operation for changing the
129205 /// mesh connectivity and topology. It changes the mesh so that
@@ -256,7 +332,7 @@ public void Delete(MeshUtils.Edge eDel)
256332 /// </summary>
257333 public MeshUtils . Edge AddEdgeVertex ( MeshUtils . Edge eOrg )
258334 {
259- var eNew = MeshUtils . MakeEdge ( eOrg ) ;
335+ var eNew = MakeEdge ( eOrg ) ;
260336 var eNewSym = eNew . _Sym ;
261337
262338 // Connect the new edge appropriately
@@ -306,7 +382,7 @@ public MeshUtils.Edge SplitEdge(MeshUtils.Edge eOrg)
306382 /// </summary>
307383 public MeshUtils . Edge Connect ( MeshUtils . Edge eOrg , MeshUtils . Edge eDst )
308384 {
309- var eNew = MeshUtils . MakeEdge ( eOrg ) ;
385+ var eNew = MakeEdge ( eOrg ) ;
310386 var eNewSym = eNew . _Sym ;
311387
312388 bool joiningLoops = false ;
0 commit comments