void Foam::layerAdditionRemoval::addCellLayer ( polyTopoChange& ref ) const { // Insert the layer addition instructions into the topological change // Algorithm: // 1. For every point in the master zone add a new point // 2. For every face in the master zone add a cell // 3. Go through all the edges of the master zone. For all internal // edges, add a face with the correct orientation and make it internal. // For all boundary edges, find the patch it belongs to and add the // face to this patch // 4. Create a set of new faces on the patch image and assign them to be // between the old master cells and the newly created cells // 5. Modify all the faces in the patch such that they are located // between the old slave cells and newly created cells if (debug) { Pout<< "void layerAdditionRemoval::addCellLayer(" << "polyTopoChange& ref) const for object " << name() << " : " << "Adding cell layer" << endl; } // Create the points const polyMesh& mesh = topoChanger().mesh(); const primitiveFacePatch& masterFaceLayer = mesh.faceZones()[faceZoneID_.index()](); const pointField& points = mesh.points(); const labelList& mp = masterFaceLayer.meshPoints(); // Calculation of point normals, using point pairing vectorField extrusionDir(mp.size()); if (setLayerPairing()) { if (debug) { Pout<< "void layerAdditionRemoval::addCellLayer(" << "polyTopoChange& ref) const " << " for object " << name() << " : " << "Using edges for point insertion" << endl; } // Detected a valid layer. Grab the point and face collapse mapping const labelList& ptc = pointsPairing(); forAll (extrusionDir, mpI) { extrusionDir[mpI] = points[ptc[mpI]] - points[mp[mpI]]; } extrusionDir *= addDelta_*maxLayerThickness_; }
//--------------------------------------------------------------------- void OptimisedUtilGeneral::extrudeVertices( const Vector4& lightPos, Real extrudeDist, const float* pSrcPos, float* pDestPos, size_t numVertices) { if (lightPos.w == 0.0f) { // Directional light, extrusion is along light direction Vector3 extrusionDir( -lightPos.x, -lightPos.y, -lightPos.z); extrusionDir.normalise(); extrusionDir *= extrudeDist; for (size_t vert = 0; vert < numVertices; ++vert) { *pDestPos++ = *pSrcPos++ + extrusionDir.x; *pDestPos++ = *pSrcPos++ + extrusionDir.y; *pDestPos++ = *pSrcPos++ + extrusionDir.z; } } else { // Point light, calculate extrusionDir for every vertex assert(lightPos.w == 1.0f); for (size_t vert = 0; vert < numVertices; ++vert) { Vector3 extrusionDir( pSrcPos[0] - lightPos.x, pSrcPos[1] - lightPos.y, pSrcPos[2] - lightPos.z); extrusionDir.normalise(); extrusionDir *= extrudeDist; *pDestPos++ = *pSrcPos++ + extrusionDir.x; *pDestPos++ = *pSrcPos++ + extrusionDir.y; *pDestPos++ = *pSrcPos++ + extrusionDir.z; } } }