SetVertexPositionsCommand.cpp dnacalib/commands/SetVertexPositionsCommand.h dnacalib/TypeDefs.h dnacalib/CommandImplBase.h dnacalib/commands/SupportFactories.h dnacalib/dna/DNA.h dnacalib/dna/DNACalibDNAReaderImpl.h dnacalib/types/Aliases.h dnacalib/utils/FormatString.h dnac::SetVertexPositionsCommand::Impl dnac //CopyrightEpicGames,Inc.AllRightsReserved. #include"dnacalib/commands/SetVertexPositionsCommand.h" #include"dnacalib/TypeDefs.h" #include"dnacalib/CommandImplBase.h" #include"dnacalib/commands/SupportFactories.h" #include"dnacalib/dna/DNA.h" #include"dnacalib/dna/DNACalibDNAReaderImpl.h" #include"dnacalib/types/Aliases.h" #include"dnacalib/utils/FormatString.h" namespacednac{ classSetVertexPositionsCommand::Impl:publicCommandImplBase<Impl>{ private: usingSuper=CommandImplBase<Impl>; public: explicitImpl(MemoryResource*memRes_): Super{memRes_}, positions{memRes_}, masks{memRes_}, operation{VectorOperation::Interpolate}, meshIndex{}{ } voidsetMeshIndex(std::uint16_tmeshIndex_){ meshIndex=meshIndex_; } voidsetPositions(ConstArrayView<Vector3>positions_){ positions.assign(positions_.begin(),positions_.end()); } voidsetPositions(ConstArrayView<float>xs,ConstArrayView<float>ys,ConstArrayView<float>zs){ positions.xs.assign(xs.begin(),xs.end()); positions.ys.assign(ys.begin(),ys.end()); positions.zs.assign(zs.begin(),zs.end()); } voidsetMasks(ConstArrayView<float>masks_){ masks.assign(masks_.begin(),masks_.end()); } voidsetOperation(VectorOperationoperation_){ operation=operation_; } voidrun(DNACalibDNAReaderImpl*output){ status.reset(); autogetWeight=WeightGetterFactory::create(masks); autoop=OperationFactory::create(operation); computeVertexPositions(op,getWeight,output); } private: template<typenameFOperation,typenameFWeightGetter> voidcomputeVertexPositions(FOperationop,FWeightGettergetWeight,DNACalibDNAReaderImpl*output){ constautoxs=output->getVertexPositionXs(meshIndex); constautoys=output->getVertexPositionYs(meshIndex); constautozs=output->getVertexPositionZs(meshIndex); assert((xs.size()==ys.size())&&(ys.size()==zs.size())); RawVector3Vectorresult{xs,ys,zs,output->getMemoryResource()}; //Thisaccountsforthecasewhenoutputisempty result.resize(positions.size(),0.0f); if(!masks.empty()&&(positions.size()!=masks.size())){ constautomessage=formatString(output->getMemoryResource(), "Numberofsetpositions(%hu)differsfromnumberofsetmasks(%hu).", positions.size(), masks.size()); status.set(PositionsMasksCountMismatch,message.c_str()); return; } for(std::uint32_ti=0u;i<positions.size();++i){ constfloatweight=getWeight(masks.data(),i); result.xs[i]=op(result.xs[i],positions.xs[i],weight); result.ys[i]=op(result.ys[i],positions.ys[i],weight); result.zs[i]=op(result.zs[i],positions.zs[i],weight); } output->setVertexPositions(meshIndex,std::move(result)); } private: staticsc::StatusProviderstatus; RawVector3Vectorpositions; Vector<float>masks; VectorOperationoperation; std::uint16_tmeshIndex; }; constsc::StatusCodeSetVertexPositionsCommand::PositionsMasksCountMismatch{3201,"%s"}; #ifdef__clang__ #pragmaclangdiagnosticpush #pragmaclangdiagnosticignored"-Wglobal-constructors" #endif sc::StatusProviderSetVertexPositionsCommand::Impl::status{PositionsMasksCountMismatch}; #ifdef__clang__ #pragmaclangdiagnosticpop #endif SetVertexPositionsCommand::SetVertexPositionsCommand(MemoryResource*memRes):pImpl{makeScoped<Impl>(memRes)}{ } SetVertexPositionsCommand::SetVertexPositionsCommand(std::uint16_tmeshIndex, ConstArrayView<Vector3>positions, VectorOperationoperation, MemoryResource*memRes): pImpl{makeScoped<Impl>(memRes)}{ pImpl->setMeshIndex(meshIndex); pImpl->setPositions(positions); pImpl->setOperation(operation); } SetVertexPositionsCommand::SetVertexPositionsCommand(std::uint16_tmeshIndex, ConstArrayView<float>xs, ConstArrayView<float>ys, ConstArrayView<float>zs, VectorOperationoperation, MemoryResource*memRes): pImpl{makeScoped<Impl>(memRes)}{ pImpl->setMeshIndex(meshIndex); pImpl->setPositions(xs,ys,zs); pImpl->setOperation(operation); } SetVertexPositionsCommand::SetVertexPositionsCommand(std::uint16_tmeshIndex, ConstArrayView<Vector3>positions, ConstArrayView<float>masks, VectorOperationoperation, MemoryResource*memRes): pImpl{makeScoped<Impl>(memRes)}{ pImpl->setMeshIndex(meshIndex); pImpl->setPositions(positions); pImpl->setMasks(masks); pImpl->setOperation(operation); } SetVertexPositionsCommand::SetVertexPositionsCommand(std::uint16_tmeshIndex, ConstArrayView<float>xs, ConstArrayView<float>ys, ConstArrayView<float>zs, ConstArrayView<float>masks, VectorOperationoperation, MemoryResource*memRes): pImpl{makeScoped<Impl>(memRes)}{ pImpl->setMeshIndex(meshIndex); pImpl->setPositions(xs,ys,zs); pImpl->setMasks(masks); pImpl->setOperation(operation); } SetVertexPositionsCommand::~SetVertexPositionsCommand()=default; SetVertexPositionsCommand::SetVertexPositionsCommand(SetVertexPositionsCommand&&)=default; SetVertexPositionsCommand&SetVertexPositionsCommand::operator=(SetVertexPositionsCommand&&)=default; voidSetVertexPositionsCommand::setMeshIndex(std::uint16_tmeshIndex){ pImpl->setMeshIndex(meshIndex); } voidSetVertexPositionsCommand::setPositions(ConstArrayView<Vector3>positions){ pImpl->setPositions(positions); } voidSetVertexPositionsCommand::setPositions(ConstArrayView<float>xs,ConstArrayView<float>ys,ConstArrayView<float>zs){ pImpl->setPositions(xs,ys,zs); } voidSetVertexPositionsCommand::setMasks(ConstArrayView<float>masks){ pImpl->setMasks(masks); } voidSetVertexPositionsCommand::setOperation(VectorOperationoperation){ pImpl->setOperation(operation); } voidSetVertexPositionsCommand::run(DNACalibDNAReader*output){ pImpl->run(static_cast<DNACalibDNAReaderImpl*>(output)); } }//namespacednac