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

Function deleteFaces

src/IECoreScene/MeshAlgoDeleteFaces.cpp:152–238  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

150
151template<typename T>
152MeshPrimitivePtr deleteFaces( const MeshPrimitive *meshPrimitive, PrimitiveVariable::IndexedView<T> &deleteFlagView, bool invert, const Canceller *canceller )
153{
154 // construct 3 functors for deleting (uniform, vertex & face varying) primvars
155 IECoreScene::PrimitiveVariableAlgos::DeleteFlaggedUniformFunctor<T> uniformFunctor( deleteFlagView, invert );
156 IECoreScene::PrimitiveVariableAlgos::DeleteFlaggedFaceVaryingFunctor<T> faceVaryingFunctor( deleteFlagView, meshPrimitive->verticesPerFace(), invert );
157 IECoreScene::PrimitiveVariableAlgos::DeleteFlaggedVertexFunctor<T> vertexFunctor(
158 meshPrimitive->variableSize( PrimitiveVariable::Vertex ), meshPrimitive->vertexIds(), meshPrimitive->verticesPerFace(), deleteFlagView, invert );
159
160 // filter verticesPerFace using DeleteFlaggedUniformFunctor
161 const IECore::Data *inputVerticesPerFace = IECore::runTimeCast<const IECore::Data>( meshPrimitive->verticesPerFace() );
162 uniformFunctor.setIndices( nullptr );
163 IECoreScene::PrimitiveVariableAlgos::IndexedData outputVerticesPerFace = dispatch( inputVerticesPerFace, uniformFunctor );
164 IntVectorDataPtr verticesPerFace = IECore::runTimeCast<IECore::IntVectorData>( outputVerticesPerFace.data );
165
166 // filter VertexIds using DeleteFlaggedFaceVaryingFunctor
167 const IECore::Data *inputVertexIds = IECore::runTimeCast<const IECore::Data>( meshPrimitive->vertexIds() );
168 faceVaryingFunctor.setIndices( nullptr );
169 IECoreScene::PrimitiveVariableAlgos::IndexedData outputVertexIds = dispatch( inputVertexIds, faceVaryingFunctor );
170
171 // remap the indices also
172 ConstIntVectorDataPtr remappingData = vertexFunctor.getRemapping();
173 const std::vector<int> &remapping = remappingData->readable();
174 IntVectorDataPtr vertexIdsData = IECore::runTimeCast<IECore::IntVectorData>( outputVertexIds.data );
175 IntVectorData::ValueType &vertexIds = vertexIdsData->writable();
176 for( size_t i = 0; i < vertexIds.size(); ++i )
177 {
178 if( i % 1000 == 0 )
179 {
180 Canceller::check( canceller );
181 }
182
183 vertexIds[i] = remapping[vertexIds[i]];
184 }
185
186 // construct mesh without positions as they'll be set when filtering the primvars
187 MeshPrimitivePtr outMeshPrimitive = new MeshPrimitive( verticesPerFace, vertexIdsData, meshPrimitive->interpolation() );
188
189 deleteCorners( outMeshPrimitive.get(), meshPrimitive, remapping, canceller );
190 deleteCreases( outMeshPrimitive.get(), meshPrimitive, remapping, canceller );
191
192 for( PrimitiveVariableMap::const_iterator it = meshPrimitive->variables.begin(), e = meshPrimitive->variables.end(); it != e; ++it )
193 {
194 Canceller::check( canceller );
195 if( !meshPrimitive->isPrimitiveVariableValid( it->second ) )
196 {
197 throw InvalidArgumentException(
198 boost::str ( boost::format( "MeshAlgo::deleteFaces cannot process invalid primitive variable \"%s\"" ) % it->first ) );
199 }
200
201 switch( it->second.interpolation )
202 {
203 case PrimitiveVariable::Uniform:
204 {
205 const IECore::Data *inputData = it->second.data.get();
206 uniformFunctor.setIndices( it->second.indices.get() );
207 IECoreScene::PrimitiveVariableAlgos::IndexedData outputData = dispatch( inputData, uniformFunctor );
208 outMeshPrimitive->variables[it->first] = PrimitiveVariable( it->second.interpolation, outputData.data, outputData.indices );
209 break;

Callers 2

deleteFacesMethod · 0.85
deleteFacesWrapperFunction · 0.85

Calls 15

deleteCornersFunction · 0.85
deleteCreasesFunction · 0.85
InvalidArgumentExceptionFunction · 0.85
PrimitiveVariableFunction · 0.85
verticesPerFaceMethod · 0.80
vertexIdsMethod · 0.80
setIndicesMethod · 0.80
getRemappingMethod · 0.80
readableMethod · 0.80
interpolationMethod · 0.80
strFunction · 0.50

Tested by

no test coverage detected