public unsafe void CalcNormals(ref GeometryLinePosition result) { fixed(GeometryLinePosition *tempPtr = &result) { float *vertPtr = (float *)tempPtr; for (int i = 0; i < 3; i++) { var Vert0 = new Vector3(vertPtr[i * 3], vertPtr[i * 3 + 1], vertPtr[i * 3 + 2]); var Vert1 = new Vector3(vertPtr[(i + 1) * 3], vertPtr[(i + 1) * 3 + 1], vertPtr[(i + 1) * 3 + 2]); var Vert2 = new Vector3(vertPtr[(i + 2) * 3], vertPtr[(i + 2) * 3 + 1], vertPtr[(i + 2) * 3 + 2]); var v2 = Vert2 - Vert0; var v1 = Vert1 - Vert0; if (v1 == Vector3.Zero) { Vert0 = Vector3.UnitZ; } else { Vert0 = Vector3.Cross(v2, v1); Vert0.Normalize(); } vertPtr[(i + 1) * 3] = Vert0.X; vertPtr[(i + 1) * 3 + 1] = Vert0.Y; vertPtr[(i + 1) * 3 + 2] = Vert0.Z; vertPtr[(i + 2) * 3] = Vert0.X; vertPtr[(i + 2) * 3 + 1] = Vert0.Y; vertPtr[(i + 2) * 3 + 2] = Vert0.Z; vertPtr[(i + 3) * 3] = Vert0.X; vertPtr[(i + 3) * 3 + 1] = Vert0.Y; vertPtr[(i + 3) * 3 + 2] = Vert0.Z; vertPtr[(i + 4) * 3] = Vert0.X; vertPtr[(i + 4) * 3 + 1] = Vert0.Y; vertPtr[(i + 4) * 3 + 2] = Vert0.Z; vertPtr[(i + 5) * 3] = Vert0.X; vertPtr[(i + 5) * 3 + 1] = Vert0.Y; vertPtr[(i + 5) * 3 + 2] = Vert0.Z; } } }
public void BuildGraph(Support.NativeList <GeometryLinePosition> position, Support.NativeList <GeometryLineUV> uv, float halfWidth) { BeforeGraph(position); var rectUV = new GeometryLineUV(); rectUV.SetUV(); Vector3 cur, tar; bool drawing = true; float remainLength = GetSegment(position); bool isContinued = false; do { var normal = GetNormalDir(); NextStartPoint(out cur); isContinued = NextEndPoint(out tar); //NextStartPoint(out tar); float dist = Vector3.Distance(ref cur, ref tar); var dir = tar - cur; dir.Normalize(); Vector3 extDir = Vector3.Cross(dir, normal); extDir.Normalize(); while (dist >= remainLength) { if (drawing) { var end = cur + dir * remainLength; var l = new GeometryLinePosition(); l.SetLine(ref cur, ref end, ref extDir, halfWidth); //position.Add(l); //uv.Add(rectUV); unsafe { position.Add(l); uv.Add(rectUV); } drawing = false; dist -= remainLength; remainLength = GetInterval(position); cur = end; } else { drawing = true; dist -= remainLength; cur = cur + dir * remainLength; remainLength = GetSegment(position); extDir = Vector3.Cross(dir, normal); extDir.Normalize(); } } if (drawing) { var end = cur + dir * dist; var l = new GeometryLinePosition(); l.SetLine(ref cur, ref end, ref extDir, halfWidth); remainLength = remainLength - dist; //position.Add(l); //uv.Add(rectUV); unsafe { position.Add(l); uv.Add(rectUV); } dist = 0; } else { remainLength = remainLength - dist; dist = 0; } } while (isContinued); }