SetBlendShapeTargetDeltasCommand.cpp dnacalib/commands/SetBlendShapeTargetDeltasCommand.h dnacalib/CommandImplBase.h dnacalib/commands/SupportFactories.h dnacalib/dna/DNA.h dnacalib/dna/DNACalibDNAReaderImpl.h dnacalib/types/Aliases.h dnac::SetBlendShapeTargetDeltasCommand::Impl dnac //CopyrightEpicGames,Inc.AllRightsReserved. #include"dnacalib/commands/SetBlendShapeTargetDeltasCommand.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" namespacednac{ classSetBlendShapeTargetDeltasCommand::Impl:publicCommandImplBase<Impl>{ private: usingSuper=CommandImplBase<Impl>; public: explicitImpl(MemoryResource*memRes_): Super{memRes_}, deltas{memRes_}, masks{memRes_}, operation{VectorOperation::Interpolate}, meshIndex{}, blendShapeTargetIndex{}{ } voidsetMeshIndex(std::uint16_tmeshIndex_){ meshIndex=meshIndex_; } voidsetBlendShapeTargetIndex(std::uint16_tblendShapeTargetIndex_){ blendShapeTargetIndex=blendShapeTargetIndex_; } voidsetDeltas(ConstArrayView<Vector3>deltas_){ deltas.assign(deltas_.begin(),deltas_.end()); } voidsetDeltas(ConstArrayView<float>xs,ConstArrayView<float>ys,ConstArrayView<float>zs){ deltas.xs.assign(xs.begin(),xs.end()); deltas.ys.assign(ys.begin(),ys.end()); deltas.zs.assign(zs.begin(),zs.end()); } voidsetMasks(ConstArrayView<float>masks_){ masks.assign(masks_.begin(),masks_.end()); } voidsetOperation(VectorOperationoperation_){ operation=operation_; } voidrun(DNACalibDNAReaderImpl*output){ autogetWeight=WeightGetterFactory::create(masks); autoop=OperationFactory::create(operation); computeBlendShapeTargetDeltas(op,getWeight,output); } private: template<typenameFOperation,typenameFWeightGetter> voidcomputeBlendShapeTargetDeltas(FOperationop,FWeightGettergetWeight,DNACalibDNAReaderImpl*output){ constautoxs=output->getBlendShapeTargetDeltaXs(meshIndex,blendShapeTargetIndex); constautoys=output->getBlendShapeTargetDeltaYs(meshIndex,blendShapeTargetIndex); constautozs=output->getBlendShapeTargetDeltaZs(meshIndex,blendShapeTargetIndex); assert((xs.size()==ys.size())&&(ys.size()==zs.size())); RawVector3Vectorresult{xs,ys,zs,output->getMemoryResource()}; //Thisaccountsforthecasewhenoutputisempty result.resize(deltas.size(),0.0f); assert(masks.empty()||(deltas.size()==masks.size())); for(std::uint32_ti=0u;i<deltas.size();++i){ constfloatweight=getWeight(masks.data(),i); result.xs[i]=op(result.xs[i],deltas.xs[i],weight); result.ys[i]=op(result.ys[i],deltas.ys[i],weight); result.zs[i]=op(result.zs[i],deltas.zs[i],weight); } output->setBlendShapeTargetDeltas(meshIndex,blendShapeTargetIndex,std::move(result)); } private: RawVector3Vectordeltas; Vector<float>masks; VectorOperationoperation; std::uint16_tmeshIndex; std::uint16_tblendShapeTargetIndex; }; SetBlendShapeTargetDeltasCommand::SetBlendShapeTargetDeltasCommand(MemoryResource*memRes):pImpl{makeScoped<Impl>(memRes)}{ } SetBlendShapeTargetDeltasCommand::SetBlendShapeTargetDeltasCommand(std::uint16_tmeshIndex, std::uint16_tblendShapeTargetIndex, ConstArrayView<Vector3>deltas, VectorOperationoperation, MemoryResource*memRes): pImpl{makeScoped<Impl>(memRes)}{ pImpl->setMeshIndex(meshIndex); pImpl->setBlendShapeTargetIndex(blendShapeTargetIndex); pImpl->setDeltas(deltas); pImpl->setOperation(operation); } SetBlendShapeTargetDeltasCommand::SetBlendShapeTargetDeltasCommand(std::uint16_tmeshIndex, std::uint16_tblendShapeTargetIndex, ConstArrayView<float>xs, ConstArrayView<float>ys, ConstArrayView<float>zs, VectorOperationoperation, MemoryResource*memRes): pImpl{makeScoped<Impl>(memRes)}{ pImpl->setMeshIndex(meshIndex); pImpl->setBlendShapeTargetIndex(blendShapeTargetIndex); pImpl->setDeltas(xs,ys,zs); pImpl->setOperation(operation); } SetBlendShapeTargetDeltasCommand::SetBlendShapeTargetDeltasCommand(std::uint16_tmeshIndex, std::uint16_tblendShapeTargetIndex, ConstArrayView<Vector3>deltas, ConstArrayView<float>masks, VectorOperationoperation, MemoryResource*memRes): pImpl{makeScoped<Impl>(memRes)}{ pImpl->setMeshIndex(meshIndex); pImpl->setBlendShapeTargetIndex(blendShapeTargetIndex); pImpl->setDeltas(deltas); pImpl->setMasks(masks); pImpl->setOperation(operation); } SetBlendShapeTargetDeltasCommand::SetBlendShapeTargetDeltasCommand(std::uint16_tmeshIndex, std::uint16_tblendShapeTargetIndex, ConstArrayView<float>xs, ConstArrayView<float>ys, ConstArrayView<float>zs, ConstArrayView<float>masks, VectorOperationoperation, MemoryResource*memRes): pImpl{makeScoped<Impl>(memRes)}{ pImpl->setMeshIndex(meshIndex); pImpl->setBlendShapeTargetIndex(blendShapeTargetIndex); pImpl->setDeltas(xs,ys,zs); pImpl->setMasks(masks); pImpl->setOperation(operation); } SetBlendShapeTargetDeltasCommand::~SetBlendShapeTargetDeltasCommand()=default; SetBlendShapeTargetDeltasCommand::SetBlendShapeTargetDeltasCommand(SetBlendShapeTargetDeltasCommand&&)=default; SetBlendShapeTargetDeltasCommand&SetBlendShapeTargetDeltasCommand::operator=(SetBlendShapeTargetDeltasCommand&&)=default; voidSetBlendShapeTargetDeltasCommand::setMeshIndex(std::uint16_tmeshIndex){ pImpl->setMeshIndex(meshIndex); } voidSetBlendShapeTargetDeltasCommand::setBlendShapeTargetIndex(std::uint16_tblendShapeTargetIndex){ pImpl->setBlendShapeTargetIndex(blendShapeTargetIndex); } voidSetBlendShapeTargetDeltasCommand::setDeltas(ConstArrayView<Vector3>deltas){ pImpl->setDeltas(deltas); } voidSetBlendShapeTargetDeltasCommand::setDeltas(ConstArrayView<float>xs,ConstArrayView<float>ys,ConstArrayView<float>zs){ pImpl->setDeltas(xs,ys,zs); } voidSetBlendShapeTargetDeltasCommand::setMasks(ConstArrayView<float>masks){ pImpl->setMasks(masks); } voidSetBlendShapeTargetDeltasCommand::setOperation(VectorOperationoperation){ pImpl->setOperation(operation); } voidSetBlendShapeTargetDeltasCommand::run(DNACalibDNAReader*output){ pImpl->run(static_cast<DNACalibDNAReaderImpl*>(output)); } }//namespacednac