123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466 |
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using UnityEngine.Scripting.APIUpdating;
- namespace UnityEngine.Experimental.Rendering.Universal
- {
- using Real = System.Single;
- namespace LibTessDotNet
- {
- internal struct Vec3
- {
- public readonly static Vec3 Zero = new Vec3();
- public Real X, Y, Z;
- public Real this[int index]
- {
- get
- {
- if (index == 0) return X;
- if (index == 1) return Y;
- if (index == 2) return Z;
- throw new IndexOutOfRangeException();
- }
- set
- {
- if (index == 0) X = value;
- else if (index == 1) Y = value;
- else if (index == 2) Z = value;
- else throw new IndexOutOfRangeException();
- }
- }
- public static void Sub(ref Vec3 lhs, ref Vec3 rhs, out Vec3 result)
- {
- result.X = lhs.X - rhs.X;
- result.Y = lhs.Y - rhs.Y;
- result.Z = lhs.Z - rhs.Z;
- }
- public static void Neg(ref Vec3 v)
- {
- v.X = -v.X;
- v.Y = -v.Y;
- v.Z = -v.Z;
- }
- public static void Dot(ref Vec3 u, ref Vec3 v, out Real dot)
- {
- dot = u.X * v.X + u.Y * v.Y + u.Z * v.Z;
- }
- public static void Normalize(ref Vec3 v)
- {
- var len = v.X * v.X + v.Y * v.Y + v.Z * v.Z;
- Debug.Assert(len >= 0.0f);
- len = 1.0f / (Real)Math.Sqrt(len);
- v.X *= len;
- v.Y *= len;
- v.Z *= len;
- }
- public static int LongAxis(ref Vec3 v)
- {
- int i = 0;
- if (Math.Abs(v.Y) > Math.Abs(v.X)) i = 1;
- if (Math.Abs(v.Z) > Math.Abs(i == 0 ? v.X : v.Y)) i = 2;
- return i;
- }
- public override string ToString()
- {
- return string.Format("{0}, {1}, {2}", X, Y, Z);
- }
- }
- internal static class MeshUtils
- {
- public const int Undef = ~0;
- public abstract class Pooled<T> where T : Pooled<T>, new()
- {
- private static Stack<T> _stack;
- public abstract void Reset();
- public virtual void OnFree() { }
- public static T Create()
- {
- if (_stack != null && _stack.Count > 0)
- {
- return _stack.Pop();
- }
- return new T();
- }
- public void Free()
- {
- OnFree();
- Reset();
- if (_stack == null)
- {
- _stack = new Stack<T>();
- }
- _stack.Push((T)this);
- }
- }
- public class Vertex : Pooled<Vertex>
- {
- internal Vertex _prev, _next;
- internal Edge _anEdge;
- internal Vec3 _coords;
- internal Real _s, _t;
- internal PQHandle _pqHandle;
- internal int _n;
- internal object _data;
- public override void Reset()
- {
- _prev = _next = null;
- _anEdge = null;
- _coords = Vec3.Zero;
- _s = 0;
- _t = 0;
- _pqHandle = new PQHandle();
- _n = 0;
- _data = null;
- }
- }
- public class Face : Pooled<Face>
- {
- internal Face _prev, _next;
- internal Edge _anEdge;
- internal Face _trail;
- internal int _n;
- internal bool _marked, _inside;
- internal int VertsCount
- {
- get
- {
- int n = 0;
- var eCur = _anEdge;
- do {
- n++;
- eCur = eCur._Lnext;
- } while (eCur != _anEdge);
- return n;
- }
- }
- public override void Reset()
- {
- _prev = _next = null;
- _anEdge = null;
- _trail = null;
- _n = 0;
- _marked = false;
- _inside = false;
- }
- }
- public struct EdgePair
- {
- internal Edge _e, _eSym;
- public static EdgePair Create()
- {
- var pair = new MeshUtils.EdgePair();
- pair._e = MeshUtils.Edge.Create();
- pair._e._pair = pair;
- pair._eSym = MeshUtils.Edge.Create();
- pair._eSym._pair = pair;
- return pair;
- }
- public void Reset()
- {
- _e = _eSym = null;
- }
- }
- public class Edge : Pooled<Edge>
- {
- internal EdgePair _pair;
- internal Edge _next, _Sym, _Onext, _Lnext;
- internal Vertex _Org;
- internal Face _Lface;
- internal Tess.ActiveRegion _activeRegion;
- internal int _winding;
- internal Face _Rface { get { return _Sym._Lface; } set { _Sym._Lface = value; } }
- internal Vertex _Dst { get { return _Sym._Org; } set { _Sym._Org = value; } }
- internal Edge _Oprev { get { return _Sym._Lnext; } set { _Sym._Lnext = value; } }
- internal Edge _Lprev { get { return _Onext._Sym; } set { _Onext._Sym = value; } }
- internal Edge _Dprev { get { return _Lnext._Sym; } set { _Lnext._Sym = value; } }
- internal Edge _Rprev { get { return _Sym._Onext; } set { _Sym._Onext = value; } }
- internal Edge _Dnext { get { return _Rprev._Sym; } set { _Rprev._Sym = value; } }
- internal Edge _Rnext { get { return _Oprev._Sym; } set { _Oprev._Sym = value; } }
- internal static void EnsureFirst(ref Edge e)
- {
- if (e == e._pair._eSym)
- {
- e = e._Sym;
- }
- }
- public override void Reset()
- {
- _pair.Reset();
- _next = _Sym = _Onext = _Lnext = null;
- _Org = null;
- _Lface = null;
- _activeRegion = null;
- _winding = 0;
- }
- }
-
-
-
-
-
- public static Edge MakeEdge(Edge eNext)
- {
- Debug.Assert(eNext != null);
- var pair = EdgePair.Create();
- var e = pair._e;
- var eSym = pair._eSym;
-
- Edge.EnsureFirst(ref eNext);
-
-
- var ePrev = eNext._Sym._next;
- eSym._next = ePrev;
- ePrev._Sym._next = e;
- e._next = eNext;
- eNext._Sym._next = eSym;
- e._Sym = eSym;
- e._Onext = e;
- e._Lnext = eSym;
- e._Org = null;
- e._Lface = null;
- e._winding = 0;
- e._activeRegion = null;
- eSym._Sym = e;
- eSym._Onext = eSym;
- eSym._Lnext = e;
- eSym._Org = null;
- eSym._Lface = null;
- eSym._winding = 0;
- eSym._activeRegion = null;
- return e;
- }
-
-
-
-
-
-
-
- public static void Splice(Edge a, Edge b)
- {
- var aOnext = a._Onext;
- var bOnext = b._Onext;
- aOnext._Sym._Lnext = b;
- bOnext._Sym._Lnext = a;
- a._Onext = bOnext;
- b._Onext = aOnext;
- }
-
-
-
-
-
-
-
- public static void MakeVertex(Edge eOrig, Vertex vNext)
- {
- var vNew = MeshUtils.Vertex.Create();
-
- var vPrev = vNext._prev;
- vNew._prev = vPrev;
- vPrev._next = vNew;
- vNew._next = vNext;
- vNext._prev = vNew;
- vNew._anEdge = eOrig;
-
-
- var e = eOrig;
- do {
- e._Org = vNew;
- e = e._Onext;
- } while (e != eOrig);
- }
-
-
-
-
-
-
-
- public static void MakeFace(Edge eOrig, Face fNext)
- {
- var fNew = MeshUtils.Face.Create();
-
- var fPrev = fNext._prev;
- fNew._prev = fPrev;
- fPrev._next = fNew;
- fNew._next = fNext;
- fNext._prev = fNew;
- fNew._anEdge = eOrig;
- fNew._trail = null;
- fNew._marked = false;
-
-
- fNew._inside = fNext._inside;
-
- var e = eOrig;
- do {
- e._Lface = fNew;
- e = e._Lnext;
- } while (e != eOrig);
- }
-
-
-
-
- public static void KillEdge(Edge eDel)
- {
-
- Edge.EnsureFirst(ref eDel);
-
- var eNext = eDel._next;
- var ePrev = eDel._Sym._next;
- eNext._Sym._next = ePrev;
- ePrev._Sym._next = eNext;
- eDel.Free();
- }
-
-
-
-
- public static void KillVertex(Vertex vDel, Vertex newOrg)
- {
- var eStart = vDel._anEdge;
-
- var e = eStart;
- do {
- e._Org = newOrg;
- e = e._Onext;
- } while (e != eStart);
-
- var vPrev = vDel._prev;
- var vNext = vDel._next;
- vNext._prev = vPrev;
- vPrev._next = vNext;
- vDel.Free();
- }
-
-
-
-
- public static void KillFace(Face fDel, Face newLFace)
- {
- var eStart = fDel._anEdge;
-
- var e = eStart;
- do {
- e._Lface = newLFace;
- e = e._Lnext;
- } while (e != eStart);
-
- var fPrev = fDel._prev;
- var fNext = fDel._next;
- fNext._prev = fPrev;
- fPrev._next = fNext;
- fDel.Free();
- }
-
-
-
- public static Real FaceArea(Face f)
- {
- Real area = 0;
- var e = f._anEdge;
- do
- {
- area += (e._Org._s - e._Dst._s) * (e._Org._t + e._Dst._t);
- e = e._Lnext;
- } while (e != f._anEdge);
- return area;
- }
- }
- }
- }
|