MCPcopy Create free account
hub / github.com/TorqueGameEngines/Torque3D / extrudeFace

Method extrudeFace

Engine/source/collision/polytope.cpp:283–365  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

281//----------------------------------------------------------------------------
282
283void Polytope::extrudeFace(S32 faceIdx,const VectorF& vec,Polytope* out)
284{
285 // Assumes the face belongs to the first volume.
286 out->mVertexList.clear();
287 out->mFaceList.clear();
288 out->mEdgeList.clear();
289 out->mVolumeList.clear();
290 sideCount++;
291
292 // Front & end faces
293 Face nface;
294 nface.original = true;
295 nface.vertex = 0;
296 nface.plane = mFaceList[faceIdx].plane;
297 out->mFaceList.setSize(2);
298 out->mFaceList[0] = out->mFaceList[1] = nface;
299 out->mFaceList[0].plane.invert();
300
301 for (S32 e = mVolumeList[0].edgeList; e >= 0; e = mEdgeList[e].next) {
302 Edge& edge = mEdgeList[e];
303 if (edge.face[0] == faceIdx || edge.face[1] == faceIdx) {
304
305 // Build face for this edge
306 // Should think about calulating the plane
307 S32 fi = out->mFaceList.size();
308 out->mFaceList.push_back(nface);
309
310 // Reserve 4 entries to make sure the ve[] pointers
311 // into the list don't get invalidated.
312 out->mEdgeList.reserve(out->mEdgeList.size() + 4);
313 Edge* ve[2];
314
315 // Build edges for each vertex
316 for (S32 v = 0; v < 2; v++) {
317 if (mVertexList[edge.vertex[v]].side < sideCount) {
318 mVertexList[edge.vertex[v]].side = sideCount + out->mEdgeList.size();
319
320 out->mVertexList.increment(2);
321 out->mVertexList.end()[-1] =
322 out->mVertexList.end()[-2] =
323 mVertexList[edge.vertex[v]];
324 out->mVertexList.last().point += vec;
325
326 out->mEdgeList.increment();
327 Edge& ne = out->mEdgeList.last();
328 ne.next = out->mEdgeList.size();
329 ne.vertex[1] = out->mVertexList.size() - 1;
330 ne.vertex[0] = ne.vertex[1] - 1;
331 ne.face[0] = ne.face[1] = -1;
332 ve[v] = &ne;
333 }
334 else {
335 S32 ei = mVertexList[edge.vertex[v]].side - sideCount;
336 ve[v] = &out->mEdgeList[ei];
337 }
338
339 // Edge should share this face
340 if (ve[v]->face[0] == -1)

Callers

nothing calls this directly

Calls 9

incrementMethod · 0.80
clearMethod · 0.45
setSizeMethod · 0.45
invertMethod · 0.45
sizeMethod · 0.45
push_backMethod · 0.45
reserveMethod · 0.45
endMethod · 0.45
lastMethod · 0.45

Tested by

no test coverage detected