Page MenuHome
Paste P886

Fix T56545 (ensure tangents from orcos)
ActivePublic

Authored by Campbell Barton (campbellbarton) on Jan 8 2019, 2:58 PM.
diff --git a/source/blender/blenkernel/BKE_editmesh_tangent.h b/source/blender/blenkernel/BKE_editmesh_tangent.h
index 9553fbc1a5c..c9c962cad67 100644
--- a/source/blender/blenkernel/BKE_editmesh_tangent.h
+++ b/source/blender/blenkernel/BKE_editmesh_tangent.h
@@ -28,7 +28,8 @@
*/
void BKE_editmesh_loop_tangent_calc(
- BMEditMesh *em, bool calc_active_tangent,
+ BMEditMesh *em,
+ bool calc_active_tangent, bool calc_orco_tangent,
const char (*tangent_names)[MAX_NAME], int tangent_names_len,
const float (*poly_normals)[3],
const float (*loop_normals)[3],
diff --git a/source/blender/blenkernel/BKE_mesh_tangent.h b/source/blender/blenkernel/BKE_mesh_tangent.h
index 62d8f3ada84..8367b3a88fe 100644
--- a/source/blender/blenkernel/BKE_mesh_tangent.h
+++ b/source/blender/blenkernel/BKE_mesh_tangent.h
@@ -39,7 +39,7 @@ void BKE_mesh_calc_loop_tangent_ex(
const struct MLoopTri *looptri, const uint looptri_len,
struct CustomData *loopdata,
- bool calc_active_tangent,
+ bool calc_active_tangent, bool calc_orco_tangent,
const char (*tangent_names)[64], int tangent_names_len,
const float (*poly_normals)[3],
const float (*loop_normals)[3],
@@ -50,7 +50,8 @@ void BKE_mesh_calc_loop_tangent_ex(
short *tangent_mask_curr_p);
void BKE_mesh_calc_loop_tangents(
- struct Mesh *me_eval, bool calc_active_tangent,
+ struct Mesh *me_eval,
+ bool calc_active_tangent, bool calc_orco_tangent,
const char (*tangent_names)[MAX_NAME], int tangent_names_len);
/* Helpers */
@@ -60,7 +61,8 @@ void BKE_mesh_add_loop_tangent_named_layer_for_uv(
#define DM_TANGENT_MASK_ORCO (1 << 9)
void BKE_mesh_calc_loop_tangent_step_0(
- const struct CustomData *loopData, bool calc_active_tangent,
+ const struct CustomData *loopData,
+ bool calc_active_tangent, bool calc_orco_tangent,
const char (*tangent_names)[64], int tangent_names_count,
bool *rcalc_act, bool *rcalc_ren, int *ract_uv_n, int *rren_uv_n,
char *ract_uv_name, char *rren_uv_name, short *rtangent_mask);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index b2fe4ff742e..0b19d5bc4a0 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -2556,7 +2556,7 @@ void DM_calc_loop_tangents(
dm->getLoopArray(dm),
dm->getLoopTriArray(dm), dm->getNumLoopTri(dm),
&dm->loopData,
- calc_active_tangent,
+ calc_active_tangent, false,
tangent_names, tangent_names_len,
CustomData_get_layer(&dm->polyData, CD_NORMAL),
dm->getLoopDataArray(dm, CD_NORMAL),
diff --git a/source/blender/blenkernel/intern/editmesh_tangent.c b/source/blender/blenkernel/intern/editmesh_tangent.c
index 4231ad54ea8..b263a1df032 100644
--- a/source/blender/blenkernel/intern/editmesh_tangent.c
+++ b/source/blender/blenkernel/intern/editmesh_tangent.c
@@ -277,7 +277,8 @@ static void emDM_calc_loop_tangents_thread(TaskPool * __restrict UNUSED(pool), v
* This is done because #CD_TANGENT is cache data used only for drawing.
*/
void BKE_editmesh_loop_tangent_calc(
- BMEditMesh *em, bool calc_active_tangent,
+ BMEditMesh *em,
+ bool calc_active_tangent, bool calc_orco_tangent,
const char (*tangent_names)[MAX_NAME], int tangent_names_len,
const float (*poly_normals)[3],
const float (*loop_normals)[3],
@@ -299,7 +300,8 @@ void BKE_editmesh_loop_tangent_calc(
short tangent_mask_curr = *tangent_mask_curr_p;
BKE_mesh_calc_loop_tangent_step_0(
- &bm->ldata, calc_active_tangent, tangent_names, tangent_names_len,
+ &bm->ldata, calc_active_tangent, calc_orco_tangent,
+ tangent_names, tangent_names_len,
&calc_act, &calc_ren, &act_uv_n, &ren_uv_n, act_uv_name, ren_uv_name, &tangent_mask);
if ((tangent_mask_curr | tangent_mask) != tangent_mask_curr) {
diff --git a/source/blender/blenkernel/intern/mesh_tangent.c b/source/blender/blenkernel/intern/mesh_tangent.c
index a222c681a5e..39fd6575ad0 100644
--- a/source/blender/blenkernel/intern/mesh_tangent.c
+++ b/source/blender/blenkernel/intern/mesh_tangent.c
@@ -473,7 +473,8 @@ void BKE_mesh_add_loop_tangent_named_layer_for_uv(
* If tangent_mask has changed, then recalculate tangents.
*/
void BKE_mesh_calc_loop_tangent_step_0(
- const CustomData *loopData, bool calc_active_tangent,
+ const CustomData *loopData,
+ bool calc_active_tangent, bool calc_orco_tangent,
const char (*tangent_names)[MAX_NAME], int tangent_names_count,
bool *rcalc_act, bool *rcalc_ren, int *ract_uv_n, int *rren_uv_n,
char *ract_uv_name, char *rren_uv_name, short *rtangent_mask)
@@ -532,8 +533,9 @@ void BKE_mesh_calc_loop_tangent_step_0(
*rtangent_mask |= (short)(1 << n);
}
- if (uv_layer_num == 0)
+ if (calc_orco_tangent || uv_layer_num == 0) {
*rtangent_mask |= DM_TANGENT_MASK_ORCO;
+ }
}
/**
@@ -547,7 +549,7 @@ void BKE_mesh_calc_loop_tangent_ex(
const uint looptri_len,
CustomData *loopdata,
- bool calc_active_tangent,
+ bool calc_active_tangent, bool calc_orco_tangent,
const char (*tangent_names)[MAX_NAME], int tangent_names_len,
const float (*poly_normals)[3],
const float (*loop_normals)[3],
@@ -567,7 +569,7 @@ void BKE_mesh_calc_loop_tangent_ex(
short tangent_mask_curr = *tangent_mask_curr_p;
BKE_mesh_calc_loop_tangent_step_0(
- loopdata, calc_active_tangent, tangent_names, tangent_names_len,
+ loopdata, calc_active_tangent, calc_orco_tangent, tangent_names, tangent_names_len,
&calc_act, &calc_ren, &act_uv_n, &ren_uv_n, act_uv_name, ren_uv_name, &tangent_mask);
if ((tangent_mask_curr | tangent_mask) != tangent_mask_curr) {
/* Check we have all the needed layers */
@@ -693,7 +695,7 @@ void BKE_mesh_calc_loop_tangent_ex(
}
void BKE_mesh_calc_loop_tangents(
- Mesh *me_eval, bool calc_active_tangent,
+ Mesh *me_eval, bool calc_active_tangent, bool calc_orco_tangent,
const char (*tangent_names)[MAX_NAME], int tangent_names_len)
{
BKE_mesh_runtime_looptri_ensure(me_eval);
@@ -706,7 +708,7 @@ void BKE_mesh_calc_loop_tangents(
me_eval->mloop,
me_eval->runtime.looptris.array, (uint)me_eval->runtime.looptris.len,
&me_eval->ldata,
- calc_active_tangent,
+ calc_active_tangent, calc_orco_tangent,
tangent_names, tangent_names_len,
CustomData_get_layer(&me_eval->pdata, CD_NORMAL),
CustomData_get_layer(&me_eval->ldata, CD_NORMAL),
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 9d9f7c47b14..e651721d591 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -969,8 +969,15 @@ static MeshRenderData *mesh_render_data_create_ex(
}
/* If tangent from orco is requested, decrement tangent_len */
- int actual_tangent_len = (cd_lused[CD_TANGENT] & DM_TANGENT_MASK_ORCO) ?
- rdata->cd.layers.tangent_len - 1 : rdata->cd.layers.tangent_len;
+
+ int actual_tangent_len = rdata->cd.layers.tangent_len;
+ bool calc_orco_tangent = false;
+
+ if (cd_lused[CD_TANGENT] & DM_TANGENT_MASK_ORCO) {
+ actual_tangent_len -= 1;
+ calc_orco_tangent = true;
+ }
+
if (rdata->edit_bmesh) {
BMEditMesh *em = rdata->edit_bmesh;
BMesh *bm = em->bm;
@@ -985,7 +992,8 @@ static MeshRenderData *mesh_render_data_create_ex(
bool calc_active_tangent = false;
BKE_editmesh_loop_tangent_calc(
- em, calc_active_tangent,
+ em,
+ calc_active_tangent, calc_orco_tangent,
tangent_names, actual_tangent_len,
rdata->poly_normals, rdata->loop_normals,
rdata->orco,
@@ -1008,7 +1016,7 @@ static MeshRenderData *mesh_render_data_create_ex(
me->mloop,
rdata->mlooptri, rdata->tri_len,
cd_ldata,
- calc_active_tangent,
+ calc_active_tangent, calc_orco_tangent,
tangent_names, actual_tangent_len,
rdata->poly_normals, rdata->loop_normals,
rdata->orco,
diff --git a/source/blender/render/intern/source/bake_api.c b/source/blender/render/intern/source/bake_api.c
index 6aa888d9f90..6f62ef3aa63 100644
--- a/source/blender/render/intern/source/bake_api.c
+++ b/source/blender/render/intern/source/bake_api.c
@@ -420,7 +420,7 @@ static TriTessFace *mesh_calc_tri_tessface(
if (tangent) {
BKE_mesh_ensure_normals_for_display(me_eval);
- BKE_mesh_calc_loop_tangents(me_eval, true, NULL, 0);
+ BKE_mesh_calc_loop_tangents(me_eval, true, false, NULL, 0);
tspace = CustomData_get_layer(&me_eval->ldata, CD_TANGENT);
BLI_assert(tspace);

Event Timeline

Campbell Barton (campbellbarton) edited the content of this paste. (Show Details)
Campbell Barton (campbellbarton) changed the title of this paste from Fix T56545 option. to Fix T56545 (ensure tangents from orcos).