DNA Calib 1.1
Project brief
Public Types | Public Member Functions | Private Attributes | List of all members
dnac::UVBarycentricMapping Class Reference

#include <UVBarycentricMapping.h>

Collaboration diagram for dnac::UVBarycentricMapping:
Collaboration graph

Public Types

using TrianglePositionIndicesPair = std::pair< Triangle, std::array< std::uint32_t, 3u > >
 
using BarycentricPositionIndicesPair = std::pair< fvec3, ConstArrayView< std::uint32_t > >
 

Public Member Functions

 UVBarycentricMapping (const std::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_t faceCount, MemoryResource *memRes)
 
 UVBarycentricMapping (const dna::Reader *reader, std::uint16_t meshIndex, MemoryResource *memRes)
 
ConstArrayView< TrianglePositionIndicesPairgetTriangles () const
 
ConstArrayView< BoundingBoxgetBoundingBoxes () const
 
BarycentricPositionIndicesPair getBarycentric (const fvec2 &uv) const
 

Private Attributes

Vector< TrianglePositionIndicesPairtriangles
 
Vector< BoundingBoxbBoxes
 

Member Typedef Documentation

◆ BarycentricPositionIndicesPair

◆ TrianglePositionIndicesPair

using dnac::UVBarycentricMapping::TrianglePositionIndicesPair = std::pair<Triangle, std::array<std::uint32_t, 3u> >

Constructor & Destructor Documentation

◆ UVBarycentricMapping() [1/2]

dnac::UVBarycentricMapping::UVBarycentricMapping ( const std::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_t  faceCount,
MemoryResource memRes 
)
13 :
14 triangles{memRes},
15 bBoxes{memRes} {
16
17 auto estimatedTriangleCount = static_cast<std::size_t>(static_cast<float>(faceCount) * 2.5f);
18 triangles.reserve(estimatedTriangleCount);
19 bBoxes.reserve(estimatedTriangleCount);
20 for (std::uint32_t i = 0u; i < faceCount; i++) {
21 auto face = faceGetter(i);
22 while (face.size() > 2) {
23 const auto vertexLayoutIndex0 = face[0];
24 const auto vertexLayoutIndex1 = face[1];
25 const auto vertexLayoutIndex2 = face[face.size() - 1u];
26
27 const std::array<std::uint32_t, 3> positionIndices {vertexPositionIndices[vertexLayoutIndex0],
28 vertexPositionIndices[vertexLayoutIndex1],
29 vertexPositionIndices[vertexLayoutIndex2]};
30
31 const auto uvIndex0 = textureCoordinateUVIndices[vertexLayoutIndex0];
32 const auto uvIndex1 = textureCoordinateUVIndices[vertexLayoutIndex1];
33 const auto uvIndex2 = textureCoordinateUVIndices[vertexLayoutIndex2];
34
35 const std::array<fvec2, 3> UVs = {fvec2{Us[uvIndex0], Vs[uvIndex0]},
36 fvec2{Us[uvIndex1], Vs[uvIndex1]},
37 fvec2{Us[uvIndex2], Vs[uvIndex2]}};
38
39 triangles.emplace_back(Triangle{UVs}, positionIndices);
40 bBoxes.emplace_back(BoundingBox{UVs});
41 face = face.last(face.size() - 1u);
42 }
43 }
44 triangles.shrink_to_fit();
45 bBoxes.shrink_to_fit();
46}
Vector< BoundingBox > bBoxes
Definition: UVBarycentricMapping.h:35
Vector< TrianglePositionIndicesPair > triangles
Definition: UVBarycentricMapping.h:34
fvec< 2 > fvec2
Definition: Types.h:50

References bBoxes, and triangles.

◆ UVBarycentricMapping() [2/2]

dnac::UVBarycentricMapping::UVBarycentricMapping ( const dna::Reader reader,
std::uint16_t  meshIndex,
MemoryResource memRes 
)
explicit
48 :
49 UVBarycentricMapping(std::bind(&dna::Reader::getFaceVertexLayoutIndices, reader, meshIndex, std::placeholders::_1),
50 reader->getVertexLayoutPositionIndices(meshIndex),
52 reader->getVertexTextureCoordinateUs(meshIndex),
53 reader->getVertexTextureCoordinateVs(meshIndex),
54 reader->getFaceCount(meshIndex),
55 memRes) {
56
57}
virtual ConstArrayView< float > getVertexTextureCoordinateVs(std::uint16_t meshIndex) const =0
List of all texture coordinate V values for the referenced mesh.
virtual ConstArrayView< std::uint32_t > getVertexLayoutPositionIndices(std::uint16_t meshIndex) const =0
Position indices for each vertex of the referenced mesh.
virtual ConstArrayView< std::uint32_t > getVertexLayoutTextureCoordinateIndices(std::uint16_t meshIndex) const =0
Texture coordinate indices for each vertex of the referenced mesh.
virtual ConstArrayView< std::uint32_t > getFaceVertexLayoutIndices(std::uint16_t meshIndex, std::uint32_t faceIndex) const =0
List of vertex layout indices the belong to a face on the specified mesh.
virtual std::uint32_t getFaceCount(std::uint16_t meshIndex) const =0
Number of faces that belong to the specified mesh.
virtual ConstArrayView< float > getVertexTextureCoordinateUs(std::uint16_t meshIndex) const =0
List of all texture coordinate U values for the referenced mesh.
UVBarycentricMapping(const std::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_t faceCount, MemoryResource *memRes)
Definition: UVBarycentricMapping.cpp:7

Member Function Documentation

◆ getBarycentric()

UVBarycentricMapping::BarycentricPositionIndicesPair dnac::UVBarycentricMapping::getBarycentric ( const fvec2 uv) const
67 {
68 BarycentricPositionIndicesPair barycentricPositionsPair;
69 for (std::uint32_t i = 0u; i < bBoxes.size(); i++) {
70 if (bBoxes[i].contains(uv)) {
71 const auto barycentricWeights = triangles[i].first.getBarycentricCoords(uv);
72 // If we don't hit any triangle, we will use one whose bounding box we hit
73 barycentricPositionsPair = {barycentricWeights, ConstArrayView<std::uint32_t>{triangles[i].second}};
74 if ((barycentricWeights[0] >= 0.0f) && (barycentricWeights[0] <= 1.0f) &&
75 (barycentricWeights[1] >= 0.0f) && (barycentricWeights[1] <= 1.0f) &&
76 (barycentricWeights[2] >= 0.0f) && (barycentricWeights[2] <= 1.0f)) {
77 return barycentricPositionsPair;
78 }
79 }
80 }
81 return barycentricPositionsPair;
82}
std::pair< fvec3, ConstArrayView< std::uint32_t > > BarycentricPositionIndicesPair
Definition: UVBarycentricMapping.h:15
std::enable_if< std::is_enum< TEnum >::value, bool >::type contains(TEnum lhs, TEnum rhs)
Definition: dnacalib/utils/ScopedEnumEx.h:57

References bBoxes, dnac::contains(), and triangles.

◆ getBoundingBoxes()

ConstArrayView< BoundingBox > dnac::UVBarycentricMapping::getBoundingBoxes ( ) const
63 {
64 return {bBoxes.data(), bBoxes.size()};
65}

References bBoxes.

◆ getTriangles()

ConstArrayView< UVBarycentricMapping::TrianglePositionIndicesPair > dnac::UVBarycentricMapping::getTriangles ( ) const
59 {
60 return {triangles.data(), triangles.size()};
61}

References triangles.

Member Data Documentation

◆ bBoxes

Vector<BoundingBox> dnac::UVBarycentricMapping::bBoxes
private

◆ triangles

Vector<TrianglePositionIndicesPair> dnac::UVBarycentricMapping::triangles
private

The documentation for this class was generated from the following files: