void TerrainConvex::getFeatures(const MatrixF& mat,const VectorF& n, ConvexFeature* cf) { U32 i; cf->material = 0; cf->object = mObject; // Plane is normal n + support point PlaneF plane; plane.set(support(n),n); S32 vertexCount = cf->mVertexList.size(); // Emit vertices on the plane S32* vertexListPointer; if (halfA) vertexListPointer = square ? sVertexList[(split45 << 1) | 1]: sVertexList[4]; else vertexListPointer = square ? sVertexList[(split45 << 1)] : sVertexList[4]; S32 pm = 0; S32 numVerts = *vertexListPointer; vertexListPointer += 1; for (i = 0; i < numVerts; i++) { Point3F& cp = point[vertexListPointer[i]]; cf->mVertexList.increment(); mat.mulP(cp,&cf->mVertexList.last()); pm |= 1 << vertexListPointer[i]; } // Emit Edges S32* ep = (square && halfA)? (split45 ? sEdgeList45A[pm]: sEdgeList135A[pm]): (split45 ? sEdgeList45[pm]: sEdgeList135[pm]); S32 numEdges = *ep; S32 edgeListStart = cf->mEdgeList.size(); cf->mEdgeList.increment(numEdges); ep += 1; for (i = 0; i < numEdges; i++) { cf->mEdgeList[edgeListStart + i].vertex[0] = vertexCount + ep[i * 2 + 0]; cf->mEdgeList[edgeListStart + i].vertex[1] = vertexCount + ep[i * 2 + 1]; } // Emit faces S32* fp = split45 ? sFaceList45[pm]: sFaceList135[pm]; S32 numFaces = *fp; fp += 1; S32 faceListStart = cf->mFaceList.size(); cf->mFaceList.increment(numFaces); for (i = 0; i < numFaces; i++) { cf->mFaceList[faceListStart + i].normal = normal[fp[i * 4 + 0]]; cf->mFaceList[faceListStart + i].vertex[0] = vertexCount + fp[i * 4 + 1]; cf->mFaceList[faceListStart + i].vertex[1] = vertexCount + fp[i * 4 + 2]; cf->mFaceList[faceListStart + i].vertex[2] = vertexCount + fp[i * 4 + 3]; } }
void BoxConvex::getFeatures(const MatrixF& mat,const VectorF& n, ConvexFeature* cf) { cf->material = 0; cf->object = mObject; S32 v = 0; v += (n.x >= 0)? 1: 0; v += (n.y >= 0)? 2: 0; v += (n.z >= 0)? 4: 0; PlaneF plane; plane.set(getVertex(v),n); // Emit vertex and edge S32 mask = 0; Corner& corner = sCorner[v]; mask |= isOnPlane(getVertex(corner.a),plane)? 1: 0; mask |= isOnPlane(getVertex(corner.b),plane)? 2: 0; mask |= isOnPlane(getVertex(corner.c),plane)? 4: 0; switch(mask) { case 0: { cf->mVertexList.increment(); mat.mulP(getVertex(v),&cf->mVertexList.last()); break; } case 1: emitEdge(v,corner.a,mat,cf); break; case 2: emitEdge(v,corner.b,mat,cf); break; case 4: emitEdge(v,corner.c,mat,cf); break; case 1 | 2: emitFace(corner.ab,mat,cf); break; case 2 | 4: emitFace(corner.bc,mat,cf); break; case 1 | 4: emitFace(corner.ac,mat,cf); break; } }
void WaterPlane::_getWaterPlane( const Point3F &camPos, PlaneF &outPlane, Point3F &outPos ) { outPos = getPosition(); outPlane.set( outPos, Point3F(0,0,1) ); }