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); }