Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/mesh_tangent.cc')
-rw-r--r--source/blender/blenkernel/intern/mesh_tangent.cc75
1 files changed, 39 insertions, 36 deletions
diff --git a/source/blender/blenkernel/intern/mesh_tangent.cc b/source/blender/blenkernel/intern/mesh_tangent.cc
index 49ea23a1552..3e24cc9e39b 100644
--- a/source/blender/blenkernel/intern/mesh_tangent.cc
+++ b/source/blender/blenkernel/intern/mesh_tangent.cc
@@ -18,6 +18,7 @@
#include "BLI_task.h"
#include "BLI_utildefines.h"
+#include "BKE_attribute.hh"
#include "BKE_customdata.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
@@ -29,6 +30,8 @@
#include "atomic_ops.h"
#include "mikktspace.hh"
+using blender::float2;
+
/* -------------------------------------------------------------------- */
/** \name Mesh Tangent Calculations (Single Layer)
* \{ */
@@ -52,7 +55,7 @@ struct BKEMeshToTangent {
mikk::float3 GetTexCoord(const uint face_num, const uint vert_num)
{
- const float *uv = luvs[uint(mpolys[face_num].loopstart) + vert_num].uv;
+ const float *uv = luvs[uint(mpolys[face_num].loopstart) + vert_num];
return mikk::float3(uv[0], uv[1], 1.0f);
}
@@ -70,7 +73,7 @@ struct BKEMeshToTangent {
const MPoly *mpolys; /* faces */
const MLoop *mloops; /* faces vertices */
const MVert *mverts; /* vertices */
- const MLoopUV *luvs; /* texture coordinates */
+ const float2 *luvs; /* texture coordinates */
const float (*lnors)[3]; /* loops' normals */
float (*tangents)[4]; /* output tangents */
int num_polys; /* number of polygons */
@@ -81,8 +84,8 @@ void BKE_mesh_calc_loop_tangent_single_ex(const MVert *mverts,
const MLoop *mloops,
float (*r_looptangent)[4],
const float (*loopnors)[3],
- const MLoopUV *loopuvs,
- const int /*numLoops*/,
+ const float (*loopuvs)[2],
+ const int UNUSED(numLoops),
const MPoly *mpolys,
const int numPolys,
ReportList *reports)
@@ -92,7 +95,7 @@ void BKE_mesh_calc_loop_tangent_single_ex(const MVert *mverts,
mesh_to_tangent.mpolys = mpolys;
mesh_to_tangent.mloops = mloops;
mesh_to_tangent.mverts = mverts;
- mesh_to_tangent.luvs = loopuvs;
+ mesh_to_tangent.luvs = reinterpret_cast<const float2 *>(loopuvs);
mesh_to_tangent.lnors = loopnors;
mesh_to_tangent.tangents = r_looptangent;
mesh_to_tangent.num_polys = numPolys;
@@ -116,16 +119,16 @@ void BKE_mesh_calc_loop_tangent_single(Mesh *mesh,
float (*r_looptangents)[4],
ReportList *reports)
{
- const MLoopUV *loopuvs;
+ using namespace blender;
+ using namespace blender::bke;
- /* Check we have valid texture coordinates first! */
- if (uvmap) {
- loopuvs = static_cast<MLoopUV *>(CustomData_get_layer_named(&mesh->ldata, CD_MLOOPUV, uvmap));
- }
- else {
- loopuvs = static_cast<MLoopUV *>(CustomData_get_layer(&mesh->ldata, CD_MLOOPUV));
+ if (!uvmap) {
+ uvmap = CustomData_get_active_layer_name(&mesh->ldata, CD_PROP_FLOAT2);
}
- if (!loopuvs) {
+
+ const AttributeAccessor attributes = mesh->attributes();
+ const VArraySpan<float2> uv_map = attributes.lookup<float2>(uvmap, ATTR_DOMAIN_CORNER);
+ if (uv_map.is_empty()) {
BKE_reportf(reports,
RPT_ERROR,
"Tangent space computation needs a UV Map, \"%s\" not found, aborting",
@@ -146,7 +149,7 @@ void BKE_mesh_calc_loop_tangent_single(Mesh *mesh,
BKE_mesh_loops(mesh),
r_looptangents,
loopnors,
- loopuvs,
+ reinterpret_cast<const float(*)[2]>(uv_map.data()),
mesh->totloop,
BKE_mesh_polys(mesh),
mesh->totpoly,
@@ -221,7 +224,7 @@ struct SGLSLMeshToTangent {
const MLoopTri *lt;
uint loop_index = GetLoop(face_num, vert_num, lt);
if (mloopuv != nullptr) {
- const float *uv = mloopuv[loop_index].uv;
+ const float2 &uv = mloopuv[loop_index];
return mikk::float3(uv[0], uv[1], 1.0f);
}
const float *l_orco = orco[mloop[loop_index].v];
@@ -275,10 +278,10 @@ struct SGLSLMeshToTangent {
const float (*precomputedFaceNormals)[3];
const float (*precomputedLoopNormals)[3];
const MLoopTri *looptri;
- const MLoopUV *mloopuv; /* texture coordinates */
- const MPoly *mpoly; /* indices */
- const MLoop *mloop; /* indices */
- const MVert *mvert; /* vertex coordinates */
+ const float2 *mloopuv; /* texture coordinates */
+ const MPoly *mpoly; /* indices */
+ const MLoop *mloop; /* indices */
+ const MVert *mvert; /* vertex coordinates */
const float (*vert_normals)[3];
const float (*orco)[3];
float (*tangent)[4]; /* destination */
@@ -306,7 +309,7 @@ void BKE_mesh_add_loop_tangent_named_layer_for_uv(CustomData *uv_data,
const char *layer_name)
{
if (CustomData_get_named_layer_index(tan_data, CD_TANGENT, layer_name) == -1 &&
- CustomData_get_named_layer_index(uv_data, CD_MLOOPUV, layer_name) != -1) {
+ CustomData_get_named_layer_index(uv_data, CD_PROP_FLOAT2, layer_name) != -1) {
CustomData_add_layer_named(
tan_data, CD_TANGENT, CD_SET_DEFAULT, nullptr, numLoopData, layer_name);
}
@@ -314,7 +317,7 @@ void BKE_mesh_add_loop_tangent_named_layer_for_uv(CustomData *uv_data,
void BKE_mesh_calc_loop_tangent_step_0(const CustomData *loopData,
bool calc_active_tangent,
- const char (*tangent_names)[MAX_NAME],
+ const char (*tangent_names)[MAX_CUSTOMDATA_LAYER_NAME],
int tangent_names_count,
bool *rcalc_act,
bool *rcalc_ren,
@@ -325,15 +328,15 @@ void BKE_mesh_calc_loop_tangent_step_0(const CustomData *loopData,
short *rtangent_mask)
{
/* Active uv in viewport */
- int layer_index = CustomData_get_layer_index(loopData, CD_MLOOPUV);
- *ract_uv_n = CustomData_get_active_layer(loopData, CD_MLOOPUV);
+ int layer_index = CustomData_get_layer_index(loopData, CD_PROP_FLOAT2);
+ *ract_uv_n = CustomData_get_active_layer(loopData, CD_PROP_FLOAT2);
ract_uv_name[0] = 0;
if (*ract_uv_n != -1) {
strcpy(ract_uv_name, loopData->layers[*ract_uv_n + layer_index].name);
}
/* Active tangent in render */
- *rren_uv_n = CustomData_get_render_layer(loopData, CD_MLOOPUV);
+ *rren_uv_n = CustomData_get_render_layer(loopData, CD_PROP_FLOAT2);
rren_uv_name[0] = 0;
if (*rren_uv_n != -1) {
strcpy(rren_uv_name, loopData->layers[*rren_uv_n + layer_index].name);
@@ -361,9 +364,9 @@ void BKE_mesh_calc_loop_tangent_step_0(const CustomData *loopData,
}
*rtangent_mask = 0;
- const int uv_layer_num = CustomData_number_of_layers(loopData, CD_MLOOPUV);
+ const int uv_layer_num = CustomData_number_of_layers(loopData, CD_PROP_FLOAT2);
for (int n = 0; n < uv_layer_num; n++) {
- const char *name = CustomData_get_layer_name(loopData, CD_MLOOPUV, n);
+ const char *name = CustomData_get_layer_name(loopData, CD_PROP_FLOAT2, n);
bool add = false;
for (int i = 0; i < tangent_names_count; i++) {
if (tangent_names[i][0] && STREQ(tangent_names[i], name)) {
@@ -394,7 +397,7 @@ void BKE_mesh_calc_loop_tangent_ex(const MVert *mvert,
CustomData *loopdata,
bool calc_active_tangent,
- const char (*tangent_names)[MAX_NAME],
+ const char (*tangent_names)[MAX_CUSTOMDATA_LAYER_NAME],
int tangent_names_len,
const float (*vert_normals)[3],
const float (*poly_normals)[3],
@@ -409,8 +412,8 @@ void BKE_mesh_calc_loop_tangent_ex(const MVert *mvert,
int ren_uv_n = -1;
bool calc_act = false;
bool calc_ren = false;
- char act_uv_name[MAX_NAME];
- char ren_uv_name[MAX_NAME];
+ char act_uv_name[MAX_CUSTOMDATA_LAYER_NAME];
+ char ren_uv_name[MAX_CUSTOMDATA_LAYER_NAME];
short tangent_mask = 0;
short tangent_mask_curr = *tangent_mask_curr_p;
@@ -501,8 +504,8 @@ void BKE_mesh_calc_loop_tangent_ex(const MVert *mvert,
mesh2tangent->precomputedFaceNormals = poly_normals;
mesh2tangent->orco = nullptr;
- mesh2tangent->mloopuv = static_cast<const MLoopUV *>(
- CustomData_get_layer_named(loopdata, CD_MLOOPUV, loopdata_out->layers[index].name));
+ mesh2tangent->mloopuv = static_cast<const float2 *>(CustomData_get_layer_named(
+ loopdata, CD_PROP_FLOAT2, loopdata_out->layers[index].name));
/* Fill the resulting tangent_mask */
if (!mesh2tangent->mloopuv) {
@@ -515,8 +518,8 @@ void BKE_mesh_calc_loop_tangent_ex(const MVert *mvert,
}
else {
int uv_ind = CustomData_get_named_layer_index(
- loopdata, CD_MLOOPUV, loopdata_out->layers[index].name);
- int uv_start = CustomData_get_layer_index(loopdata, CD_MLOOPUV);
+ loopdata, CD_PROP_FLOAT2, loopdata_out->layers[index].name);
+ int uv_start = CustomData_get_layer_index(loopdata, CD_PROP_FLOAT2);
BLI_assert(uv_ind != -1 && uv_start != -1);
BLI_assert(uv_ind - uv_start < MAX_MTFACE);
tangent_mask_curr |= short(1 << (uv_ind - uv_start));
@@ -545,7 +548,7 @@ void BKE_mesh_calc_loop_tangent_ex(const MVert *mvert,
/* Update active layer index */
int act_uv_index = (act_uv_n != -1) ?
- CustomData_get_layer_index_n(loopdata, CD_MLOOPUV, act_uv_n) :
+ CustomData_get_layer_index_n(loopdata, CD_PROP_FLOAT2, act_uv_n) :
-1;
if (act_uv_index != -1) {
int tan_index = CustomData_get_named_layer_index(
@@ -555,7 +558,7 @@ void BKE_mesh_calc_loop_tangent_ex(const MVert *mvert,
/* Update render layer index */
int ren_uv_index = (ren_uv_n != -1) ?
- CustomData_get_layer_index_n(loopdata, CD_MLOOPUV, ren_uv_n) :
+ CustomData_get_layer_index_n(loopdata, CD_PROP_FLOAT2, ren_uv_n) :
-1;
if (ren_uv_index != -1) {
int tan_index = CustomData_get_named_layer_index(
@@ -567,7 +570,7 @@ void BKE_mesh_calc_loop_tangent_ex(const MVert *mvert,
void BKE_mesh_calc_loop_tangents(Mesh *me_eval,
bool calc_active_tangent,
- const char (*tangent_names)[MAX_NAME],
+ const char (*tangent_names)[MAX_CUSTOMDATA_LAYER_NAME],
int tangent_names_len)
{
/* TODO(@campbellbarton): store in Mesh.runtime to avoid recalculation. */