diff options
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/bake.c | 13 | ||||
-rw-r--r-- | source/blender/render/intern/multires_bake.c | 6 | ||||
-rw-r--r-- | source/blender/render/intern/texture_pointdensity.c | 17 |
3 files changed, 16 insertions, 20 deletions
diff --git a/source/blender/render/intern/bake.c b/source/blender/render/intern/bake.c index 6794a9cd1ad..2d7f964a968 100644 --- a/source/blender/render/intern/bake.c +++ b/source/blender/render/intern/bake.c @@ -107,6 +107,7 @@ typedef struct TSpace { typedef struct TriTessFace { const MVert *mverts[3]; + const float *vert_normals[3]; const TSpace *tspace[3]; float *loop_normal[3]; float normal[3]; /* for flat faces */ @@ -241,9 +242,9 @@ static void calc_point_from_barycentric_extrusion(TriTessFace *triangles, interp_barycentric_tri_v3(data, u, v, coord); if (is_smooth) { - normal_short_to_float_v3(data[0], triangle->mverts[0]->no); - normal_short_to_float_v3(data[1], triangle->mverts[1]->no); - normal_short_to_float_v3(data[2], triangle->mverts[2]->no); + copy_v3_v3(data[0], triangle->vert_normals[0]); + copy_v3_v3(data[1], triangle->vert_normals[1]); + copy_v3_v3(data[2], triangle->vert_normals[2]); interp_barycentric_tri_v3(data, u, v, dir); normalize_v3(dir); @@ -488,6 +489,7 @@ static TriTessFace *mesh_calc_tri_tessface(Mesh *me, bool tangent, Mesh *me_eval loop_normals = CustomData_get_layer(&me_eval->ldata, CD_NORMAL); } + const float(*vert_normals)[3] = BKE_mesh_vertex_normals_ensure(me); for (i = 0; i < tottri; i++) { const MLoopTri *lt = &looptri[i]; const MPoly *mp = &me->mpoly[lt->poly]; @@ -495,6 +497,9 @@ static TriTessFace *mesh_calc_tri_tessface(Mesh *me, bool tangent, Mesh *me_eval triangles[i].mverts[0] = &mvert[me->mloop[lt->tri[0]].v]; triangles[i].mverts[1] = &mvert[me->mloop[lt->tri[1]].v]; triangles[i].mverts[2] = &mvert[me->mloop[lt->tri[2]].v]; + triangles[i].vert_normals[0] = &vert_normals[me->mloop[lt->tri[0]].v][0]; + triangles[i].vert_normals[1] = &vert_normals[me->mloop[lt->tri[1]].v][1]; + triangles[i].vert_normals[2] = &vert_normals[me->mloop[lt->tri[2]].v][2]; triangles[i].is_smooth = (mp->flag & ME_SMOOTH) != 0; if (tangent) { @@ -878,7 +883,7 @@ void RE_bake_normal_world_to_tangent(const BakePixel pixel_array[], copy_v3_v3(normals[j], triangle->loop_normal[j]); } else { - normal_short_to_float_v3(normals[j], triangle->mverts[j]->no); + copy_v3_v3(normals[j], triangle->vert_normals[j]); } } diff --git a/source/blender/render/intern/multires_bake.c b/source/blender/render/intern/multires_bake.c index 930c7580f32..d3e7dca2035 100644 --- a/source/blender/render/intern/multires_bake.c +++ b/source/blender/render/intern/multires_bake.c @@ -72,6 +72,7 @@ typedef struct MultiresBakeResult { typedef struct { MVert *mvert; + const float (*vert_normals)[3]; MPoly *mpoly; MLoop *mloop; MLoopUV *mloopuv; @@ -135,10 +136,7 @@ static void multiresbake_get_normal(const MResolvePixelData *data, } else { const int vi = data->mloop[data->mlooptri[tri_num].tri[vert_index]].v; - const short *no = data->mvert[vi].no; - - normal_short_to_float_v3(norm, no); - normalize_v3(norm); + copy_v3_v3(norm, data->vert_normals[vi]); } } diff --git a/source/blender/render/intern/texture_pointdensity.c b/source/blender/render/intern/texture_pointdensity.c index 8ca1decdea7..683260f86cb 100644 --- a/source/blender/render/intern/texture_pointdensity.c +++ b/source/blender/render/intern/texture_pointdensity.c @@ -47,6 +47,7 @@ #include "BKE_customdata.h" #include "BKE_deform.h" #include "BKE_lattice.h" +#include "BKE_mesh.h" #include "BKE_object.h" #include "BKE_particle.h" #include "BKE_scene.h" @@ -368,19 +369,11 @@ static void pointdensity_cache_vertex_weight(PointDensity *pd, } } -static void pointdensity_cache_vertex_normal(PointDensity *pd, - Object *UNUSED(ob), - Mesh *mesh, - float *data_color) +static void pointdensity_cache_vertex_normal(Mesh *mesh, float *data_color) { - MVert *mvert = mesh->mvert, *mv; - int i; - BLI_assert(data_color); - - for (i = 0, mv = mvert; i < pd->totpoints; i++, mv++, data_color += 3) { - normal_short_to_float_v3(data_color, mv->no); - } + const float(*vert_normals)[3] = BKE_mesh_vertex_normals_ensure(mesh); + memcpy(data_color, vert_normals, sizeof(float[3]) * mesh->totvert); } static void pointdensity_cache_object(PointDensity *pd, Object *ob) @@ -442,7 +435,7 @@ static void pointdensity_cache_object(PointDensity *pd, Object *ob) pointdensity_cache_vertex_weight(pd, ob, mesh, data_color); break; case TEX_PD_COLOR_VERTNOR: - pointdensity_cache_vertex_normal(pd, ob, mesh, data_color); + pointdensity_cache_vertex_normal(mesh, data_color); break; } |