* Use `float3x3` and `float3` for the resulting tangent matrix and constituent derivatives, respectively. Pull Request: https://projects.blender.org/blender/blender/pulls/140442
46 lines
1.4 KiB
C++
46 lines
1.4 KiB
C++
/* SPDX-FileCopyrightText: 2018 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup bke
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "BKE_multires.hh"
|
|
#include "BLI_math_matrix_types.hh"
|
|
#include "BLI_math_vector.hh"
|
|
#include "BLI_math_vector_types.hh"
|
|
|
|
BLI_INLINE void BKE_multires_construct_tangent_matrix(blender::float3x3 &tangent_matrix,
|
|
const blender::float3 &dPdu,
|
|
const blender::float3 &dPdv,
|
|
const int corner)
|
|
{
|
|
if (corner == 0) {
|
|
tangent_matrix.x_axis() = dPdv * -1.0f;
|
|
tangent_matrix.y_axis() = dPdu * -1.0f;
|
|
}
|
|
else if (corner == 1) {
|
|
tangent_matrix.x_axis() = dPdu;
|
|
tangent_matrix.y_axis() = dPdv * -1.0f;
|
|
}
|
|
else if (corner == 2) {
|
|
tangent_matrix.x_axis() = dPdv;
|
|
tangent_matrix.y_axis() = dPdu;
|
|
}
|
|
else if (corner == 3) {
|
|
tangent_matrix.x_axis() = dPdu * -1.0f;
|
|
tangent_matrix.y_axis() = dPdv;
|
|
}
|
|
else {
|
|
BLI_assert_msg(0, "Unhandled corner index");
|
|
}
|
|
tangent_matrix.z_axis() = blender::math::cross(dPdu, dPdv);
|
|
|
|
tangent_matrix.x_axis() = blender::math::normalize(tangent_matrix.x_axis());
|
|
tangent_matrix.y_axis() = blender::math::normalize(tangent_matrix.y_axis());
|
|
tangent_matrix.z_axis() = blender::math::normalize(tangent_matrix.z_axis());
|
|
}
|