コード例 #1
0
        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);
        }