public static void DrawBasicHull(NativeHull hull1, RigidTransform t, Color?color = null, int duration = 1) { if (!hull1.IsValid) { throw new ArgumentException("Hull is not valid", nameof(hull1)); } if (!color.HasValue) { color = UnityColors.Blue; } foreach (var edge in hull1.GetEdges()) { var a = math.transform(t, hull1.GetVertex(edge.Origin)); var b = math.transform(t, hull1.GetVertex(hull1.GetEdge(edge.Twin).Origin)); Debug.DrawLine(a, b, color.Value); } }
public static void DrawDebugHull(NativeHull hull, RigidTransform t, DebugHullFlags options = DebugHullFlags.All, Color BaseColor = default) { if (!hull.IsValid) { throw new ArgumentException("Hull is not valid", nameof(hull)); } if (options == DebugHullFlags.None) { return; } if (BaseColor == default) { BaseColor = Color.yellow; } float faceExplosionDistance = (options & DebugHullFlags.ExplodeFaces) != 0 ? 0.3f : 0; // Iterate each twin pair at the same time. for (int j = 0; j < hull.EdgeCount; j = j + 2) { var edge = hull.GetEdge(j); var twin = hull.GetEdge(j + 1); var edgePlane = edge.Face != -1 ? hull.GetPlane(edge.Face) : new NativePlane(); var twinPlane = twin.Face != -1 ? hull.GetPlane(twin.Face) : new NativePlane(); var rotatedEdgeNormal = math.rotate(t, edgePlane.Normal); var rotatedTwinNormal = math.rotate(t, twinPlane.Normal); var edgeVertex1 = math.transform(t, hull.GetVertex(edge.Origin)); var twinVertex1 = math.transform(t, hull.GetVertex(twin.Origin)); var edgeVertex2 = math.transform(t, hull.GetVertex(edge.Origin)); var twinVertex2 = math.transform(t, hull.GetVertex(twin.Origin)); if ((options & DebugHullFlags.Outline) != 0) { Debug.DrawLine(edgeVertex1 + rotatedEdgeNormal * faceExplosionDistance, twinVertex1 + rotatedEdgeNormal * faceExplosionDistance, BaseColor); Debug.DrawLine(edgeVertex2 + rotatedTwinNormal * faceExplosionDistance, twinVertex2 + rotatedTwinNormal * faceExplosionDistance, BaseColor); } if ((options & DebugHullFlags.EdgeLinks) != 0) { Debug.DrawLine((edgeVertex1 + twinVertex1) / 2 + rotatedEdgeNormal * faceExplosionDistance, (edgeVertex2 + twinVertex2) / 2 + rotatedTwinNormal * faceExplosionDistance, Color.gray); } } if ((options & DebugHullFlags.PlaneNormals) != 0) { for (int i = 0; i < hull.FaceCount; i++) { var centroid = math.transform(t, hull.CalculateFaceCentroid(hull.GetFace(i))); var normal = math.rotate(t, hull.GetPlane(i).Normal); DebugDrawer.DrawArrow(centroid, normal * 0.2f, BaseColor); } } if ((options & DebugHullFlags.Indices) != 0) { var dupeCheck = new HashSet <Vector3>(); for (int i = 0; i < hull.VertexCount; i++) { // Offset the label if multiple verts are on the same position. var v = math.transform(t, hull.GetVertex(i)); var offset = dupeCheck.Contains(v) ? (float3)Vector3.forward * 0.05f : 0; DebugDrawer.DrawLabel(v + offset, i.ToString()); dupeCheck.Add(v); } } if ((options & DebugHullFlags.FaceWinding) != 0) { for (int i = 0; i < hull.FaceCount; i++) { var face = hull.GetFace(i); var plane = hull.GetPlane(i); var tPlane = t * plane; var edge = hull.GetEdge(face.Edge); var startOrigin = edge.Origin; do { var nextEdge = hull.GetEdge(edge.Next); var startVert = math.transform(t, hull.GetVertex(edge.Origin)); var endVert = math.transform(t, hull.GetVertex(nextEdge.Origin)); var center = (endVert + startVert) / 2; var dir = math.normalize(endVert - startVert); var insetDir = math.normalize(math.cross(tPlane.Normal, dir)); if ((options & DebugHullFlags.ExplodeFaces) != 0) { DebugDrawer.DrawArrow(center + tPlane.Normal * faceExplosionDistance, dir * 0.2f, Color.black); } else { DebugDrawer.DrawArrow(center + tPlane.Normal * faceExplosionDistance + insetDir * 0.1f, dir * 0.2f, Color.black); } edge = nextEdge; } while (edge.Origin != startOrigin); } } }