func Check() { var clnk; if(GetAction()S="Falling") return(Falling()); while(clnk=FindObject(0,-25,0,50,100,OCF_CrewMember(),0,0,0,clnk)) if(GetAlive(clnk) && !Random(2)) { Sound("Earthquake"); SetAction("Falling"); SetPhase(phase); RemoveVertex(0); RemoveVertex(0); } }
//---------------------------------------------------------------------------- bool CIsoSurface::VETable::Remove (TriangleKey& rkTri) { for (int i = 0; i < 18; i++) { Vertex& rkV = m_akVertex[i]; if ( rkV.Valid && rkV.AdjQuantity == 2 ) { rkTri.V[0] = i; rkTri.V[1] = rkV.Adj[0]; rkTri.V[2] = rkV.Adj[1]; RemoveVertex(i); return true; } } return false; }
//---------------------------------------------------------------------------- bool VETable::Remove (Triangle3& rkTri) { for (int i = 0; i < 18; i++) { Vertex& rkV = m_akVertex[i]; if ( rkV.m_bValid && rkV.m_iAdjQuantity == 2 ) { rkTri.i0 = i; rkTri.i1 = rkV.m_aiAdj[0]; rkTri.i2 = rkV.m_aiAdj[1]; RemoveVertex(i); return true; } } return false; }
//---------------------------------------------------------------------------- bool MTMesh::Remove (int label0, int label1, int label2) { TIter iter = mTMap.find(MTITriangle(label0, label1, label2)); if (iter == mTMap.end()) { // The triangle does not exist. return false; } int t = iter->second; MTTriangle& triangle = mTriangles[t]; // Detach triangle from edges. int e0 = triangle.Edge(0); int e1 = triangle.Edge(1); int e2 = triangle.Edge(2); MTEdge& edge0 = mEdges[e0]; MTEdge& edge1 = mEdges[e1]; MTEdge& edge2 = mEdges[e2]; DetachTriangleFromEdge(t, triangle, 0, e0, edge0); DetachTriangleFromEdge(t, triangle, 1, e1, edge1); DetachTriangleFromEdge(t, triangle, 2, e2, edge2); // Detach triangle from vertices. int v0 = triangle.Vertex(0); MTVertex& vertex0 = mVertices[v0]; vertex0.RemoveTriangle(t); int v1 = triangle.Vertex(1); MTVertex& vertex1 = mVertices[v1]; vertex1.RemoveTriangle(t); int v2 = triangle.Vertex(2); MTVertex& vertex2 = mVertices[v2]; vertex2.RemoveTriangle(t); // Detach edges from vertices (only if last edge to reference vertex). bool e0Destroy = (edge0.Triangle(0) == -1); if (e0Destroy) { vertex0.RemoveEdge(e0); vertex1.RemoveEdge(e0); } bool e1Destroy = (edge1.Triangle(0) == -1); if (e1Destroy) { vertex1.RemoveEdge(e1); vertex2.RemoveEdge(e1); } bool e2Destroy = (edge2.Triangle(0) == -1); if (e2Destroy) { vertex0.RemoveEdge(e2); vertex2.RemoveEdge(e2); } // Removal of components from the sets and maps starts here. Be careful // using set indices, component references, and map iterators since // deletion has side effects. Deletion of a component might cause another // component to be moved within the corresponding set or map. bool v0Destroy = (vertex0.GetNumEdges() == 0); bool v1Destroy = (vertex1.GetNumEdges() == 0); bool v2Destroy = (vertex2.GetNumEdges() == 0); // Remove edges if no longer used. if (e0Destroy) { RemoveEdge(label0, label1); } if (e1Destroy) { RemoveEdge(label1, label2); } if (e2Destroy) { RemoveEdge(label2, label0); } // Remove vertices if no longer used. if (v0Destroy) { RemoveVertex(label0); } if (v1Destroy) { RemoveVertex(label1); } if (v2Destroy) { RemoveVertex(label2); } // Remove triangle (definitely no longer used). RemoveTriangle(label0, label1, label2); return true; }