| 840 | } |
| 841 | |
| 842 | bool MeshPrimitiveEvaluator::barycentricPosition( unsigned int triangleIndex, const Imath::V3f &barycentricCoordinates, PrimitiveEvaluator::Result *result ) const |
| 843 | { |
| 844 | if( triangleIndex >= m_triangles.size() ) |
| 845 | { |
| 846 | return false; |
| 847 | } |
| 848 | |
| 849 | Result *r = static_cast<Result *>( result ); |
| 850 | |
| 851 | r->m_triangleIdx = triangleIndex; |
| 852 | r->m_bary = barycentricCoordinates; |
| 853 | |
| 854 | size_t vertIdOffset = triangleIndex * 3; |
| 855 | r->m_vertexIds = Imath::V3i( (*m_meshVertexIds)[vertIdOffset], (*m_meshVertexIds)[vertIdOffset+1], (*m_meshVertexIds)[vertIdOffset+2] ); |
| 856 | |
| 857 | const Imath::V3f &p0 = m_verts->readable()[ r->m_vertexIds[0] ]; |
| 858 | const Imath::V3f &p1 = m_verts->readable()[ r->m_vertexIds[1] ]; |
| 859 | const Imath::V3f &p2 = m_verts->readable()[ r->m_vertexIds[2] ]; |
| 860 | |
| 861 | r->m_p = trianglePoint( p0, p1, p2, r->m_bary ); |
| 862 | |
| 863 | r->m_n = triangleNormal( p0, p1, p2 ); |
| 864 | |
| 865 | if( m_uv.interpolation != PrimitiveVariable::Invalid ) |
| 866 | { |
| 867 | r->m_uv = r->vec2PrimVar( m_uv ); |
| 868 | } |
| 869 | |
| 870 | return true; |
| 871 | } |
| 872 | |
| 873 | void MeshPrimitiveEvaluator::closestPointWalk( TriangleBoundTree::NodeIndex nodeIndex, const V3f &p, float &closestDistanceSqrd, Result *result ) const |
| 874 | { |
no test coverage detected