MCPcopy Create free account
hub / github.com/ImageEngine/cortex / merge

Function merge

src/IECoreScene/MeshAlgoMerge.cpp:245–366  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

243};
244
245void merge( MeshPrimitive *a, const MeshPrimitive *b, const Canceller *canceller )
246{
247 const auto &vertexIdsA = a->vertexIds()->readable();
248 const auto &verticesPerFaceA = a->verticesPerFace()->readable();
249
250 const auto &vertexIdsB = b->vertexIds()->readable();
251 const auto &verticesPerFaceB = b->verticesPerFace()->readable();
252
253 IntVectorDataPtr verticesPerFaceData = new IntVectorData;
254 auto &verticesPerFace = verticesPerFaceData->writable();
255 Canceller::check( canceller );
256 verticesPerFace.resize( verticesPerFaceA.size() + verticesPerFaceB.size() );
257 Canceller::check( canceller );
258 auto it = std::copy( verticesPerFaceA.begin(), verticesPerFaceA.end(), verticesPerFace.begin() );
259 Canceller::check( canceller );
260 std::copy( verticesPerFaceB.begin(), verticesPerFaceB.end(), it );
261
262 IntVectorDataPtr vertexIdsData = new IntVectorData;
263 auto &vertexIds = vertexIdsData->writable();
264 Canceller::check( canceller );
265 vertexIds.resize( vertexIdsA.size() + vertexIdsB.size() );
266 Canceller::check( canceller );
267 it = std::copy( vertexIdsA.begin(), vertexIdsA.end(), vertexIds.begin() );
268 int vertexIdOffset = a->variableSize( PrimitiveVariable::Vertex );
269 auto idShift = [vertexIdOffset]( int id ){ return id + vertexIdOffset; };
270 Canceller::check( canceller );
271 std::transform( vertexIdsB.begin(), vertexIdsB.end(), it, idShift );
272
273 Canceller::check( canceller );
274 a->setTopologyUnchecked( verticesPerFaceData, vertexIdsData, a->variableSize( PrimitiveVariable::Vertex ) + b->variableSize( PrimitiveVariable::Vertex ), a->interpolation() );
275
276 const auto &bCornerIds = b->cornerIds()->readable();
277 if( !bCornerIds.empty() )
278 {
279 const auto &aCornerIds = a->cornerIds()->readable();
280 IntVectorDataPtr idData = new IntVectorData;
281 auto &ids = idData->writable();
282 Canceller::check( canceller );
283 ids.resize( aCornerIds.size() + bCornerIds.size() );
284 Canceller::check( canceller );
285 it = std::copy( aCornerIds.begin(), aCornerIds.end(), ids.begin() );
286 Canceller::check( canceller );
287 std::transform( bCornerIds.begin(), bCornerIds.end(), it, idShift );
288
289 const auto &aSharpnesses = a->cornerSharpnesses()->readable();
290 const auto &bSharpnesses = b->cornerSharpnesses()->readable();
291 FloatVectorDataPtr sharpnessData = new FloatVectorData;
292 auto &sharpnesses = sharpnessData->writable();
293 Canceller::check( canceller );
294 sharpnesses.resize( aSharpnesses.size() + bSharpnesses.size() );
295 Canceller::check( canceller );
296 auto fIt = std::copy( aSharpnesses.begin(), aSharpnesses.end(), sharpnesses.begin() );
297 Canceller::check( canceller );
298 std::copy( bSharpnesses.begin(), bSharpnesses.end(), fIt );
299
300 a->setCorners( idData.get(), sharpnessData.get() );
301 }
302

Callers 4

modifyTypedPrimitiveMethod · 0.70
meshMethod · 0.70
mergeMethod · 0.70
mergeWrapperFunction · 0.50

Calls 15

readableMethod · 0.80
vertexIdsMethod · 0.80
verticesPerFaceMethod · 0.80
setTopologyUncheckedMethod · 0.80
interpolationMethod · 0.80
cornerIdsMethod · 0.80
cornerSharpnessesMethod · 0.80
setCornersMethod · 0.80
creaseIdsMethod · 0.80
creaseLengthsMethod · 0.80
creaseSharpnessesMethod · 0.80
setCreasesMethod · 0.80

Tested by

no test coverage detected