public ShapeCache Cache(ConvexShape shape) { ShapeCache sc = (ShapeCache)shape.GetUserPointer(); if (sc == null) { sc = new ShapeCache(shape); sc.m_shapehull.BuildHull(shape.GetMargin()); m_shapecaches.Add(sc); shape.SetUserPointer(sc); /* Build edges */ int ni = sc.m_shapehull.NumIndices(); int nv = sc.m_shapehull.NumVertices(); IList <int> pi = sc.m_shapehull.m_indices; IList <IndexedVector3> pv = sc.m_shapehull.m_vertices; IList <Edge> edges = new ObjectArray <Edge>(ni); for (int i = 0; i < ni; i += 3) { IndexedVector3 nrm = IndexedVector3.Normalize(IndexedVector3.Cross(pv[pi[i + 1]] - pv[pi[i]], pv[pi[i + 2]] - pv[pi[i]])); for (int j = 2, k = 0; k < 3; j = k++) { int a = pi[i + j]; int b = pi[i + k]; Edge e = edges[Math.Min(a, b) * nv + Math.Max(a, b)]; if (e != null) { sc.m_edges.Add(new Edge()); e = sc.m_edges[sc.m_edges.Count - 1]; e.n[0] = nrm; e.n[1] = -nrm; e.v[0] = a; e.v[1] = b; } else { e.n[1] = nrm; } } } } return(sc); }