UVBarycentricMapping.cpp dnacalib/types/UVBarycentricMapping.h dnac //CopyrightEpicGames,Inc.AllRightsReserved. #include"dnacalib/types/UVBarycentricMapping.h" namespacednac{ UVBarycentricMapping::UVBarycentricMapping(conststd::function<ConstArrayView<std::uint32_t>(std::uint32_t)>&faceGetter, ConstArrayView<std::uint32_t>vertexPositionIndices, ConstArrayView<std::uint32_t>textureCoordinateUVIndices, ConstArrayView<float>Us, ConstArrayView<float>Vs, std::uint32_tfaceCount, MemoryResource*memRes): triangles{memRes}, bBoxes{memRes}{ autoestimatedTriangleCount=static_cast<std::size_t>(static_cast<float>(faceCount)*2.5f); triangles.reserve(estimatedTriangleCount); bBoxes.reserve(estimatedTriangleCount); for(std::uint32_ti=0u;i<faceCount;i++){ autoface=faceGetter(i); while(face.size()>2){ constautovertexLayoutIndex0=face[0]; constautovertexLayoutIndex1=face[1]; constautovertexLayoutIndex2=face[face.size()-1u]; conststd::array<std::uint32_t,3>positionIndices{vertexPositionIndices[vertexLayoutIndex0], vertexPositionIndices[vertexLayoutIndex1], vertexPositionIndices[vertexLayoutIndex2]}; constautouvIndex0=textureCoordinateUVIndices[vertexLayoutIndex0]; constautouvIndex1=textureCoordinateUVIndices[vertexLayoutIndex1]; constautouvIndex2=textureCoordinateUVIndices[vertexLayoutIndex2]; conststd::array<fvec2,3>UVs={fvec2{Us[uvIndex0],Vs[uvIndex0]}, fvec2{Us[uvIndex1],Vs[uvIndex1]}, fvec2{Us[uvIndex2],Vs[uvIndex2]}}; triangles.emplace_back(Triangle{UVs},positionIndices); bBoxes.emplace_back(BoundingBox{UVs}); face=face.last(face.size()-1u); } } triangles.shrink_to_fit(); bBoxes.shrink_to_fit(); } UVBarycentricMapping::UVBarycentricMapping(constdna::Reader*reader,std::uint16_tmeshIndex,MemoryResource*memRes): UVBarycentricMapping(std::bind(&dna::Reader::getFaceVertexLayoutIndices,reader,meshIndex,std::placeholders::_1), reader->getVertexLayoutPositionIndices(meshIndex), reader->getVertexLayoutTextureCoordinateIndices(meshIndex), reader->getVertexTextureCoordinateUs(meshIndex), reader->getVertexTextureCoordinateVs(meshIndex), reader->getFaceCount(meshIndex), memRes){ } ConstArrayView<UVBarycentricMapping::TrianglePositionIndicesPair>UVBarycentricMapping::getTriangles()const{ return{triangles.data(),triangles.size()}; } ConstArrayView<BoundingBox>UVBarycentricMapping::getBoundingBoxes()const{ return{bBoxes.data(),bBoxes.size()}; } UVBarycentricMapping::BarycentricPositionIndicesPairUVBarycentricMapping::getBarycentric(constfvec2&uv)const{ BarycentricPositionIndicesPairbarycentricPositionsPair; for(std::uint32_ti=0u;i<bBoxes.size();i++){ if(bBoxes[i].contains(uv)){ constautobarycentricWeights=triangles[i].first.getBarycentricCoords(uv); //Ifwedon'thitanytriangle,wewilluseonewhoseboundingboxwehit barycentricPositionsPair={barycentricWeights,ConstArrayView<std::uint32_t>{triangles[i].second}}; if((barycentricWeights[0]>=0.0f)&&(barycentricWeights[0]<=1.0f)&& (barycentricWeights[1]>=0.0f)&&(barycentricWeights[1]<=1.0f)&& (barycentricWeights[2]>=0.0f)&&(barycentricWeights[2]<=1.0f)){ returnbarycentricPositionsPair; } } } returnbarycentricPositionsPair; } }//namespacednac