diff options
Diffstat (limited to 'source/blender/blenkernel/intern/mesh_tangent.cc')
-rw-r--r-- | source/blender/blenkernel/intern/mesh_tangent.cc | 75 |
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. */ |