Mesh: Replace auto smooth with node group #108014

Merged
Hans Goudey merged 149 commits from HooglyBoogly/blender:refactor-mesh-corner-normals-lazy into main 2023-10-20 16:54:20 +02:00
5 changed files with 18 additions and 24 deletions
Showing only changes of commit f159645eae - Show all commits

View File

@ -27,7 +27,7 @@ extern "C" {
/* Blender file format version. */
#define BLENDER_FILE_VERSION BLENDER_VERSION
#define BLENDER_FILE_SUBVERSION 7
#define BLENDER_FILE_SUBVERSION 8
/* Minimum Blender version that supports reading file written with the current
* version. Older Blender versions will test this and show a warning if the file

View File

@ -323,12 +323,6 @@ const float (*BKE_mesh_vert_normals_ensure(const struct Mesh *mesh))[3];
*/
const float (*BKE_mesh_poly_normals_ensure(const struct Mesh *mesh))[3];
/**
* See #Mesh::corner_normals().
* \warning May return null if the mesh is empty or has no polygons.
*/
const float (*BKE_mesh_corner_normals_ensure(const struct Mesh *mesh))[3];
/**
* Retrieve write access to the cached vertex normals, ensuring that they are allocated but *not*
* that they are calculated. The provided vertex normals should be the same as if they were

View File

@ -478,11 +478,6 @@ blender::Span<blender::float3> Mesh::corner_normals() const
return this->runtime->corner_normals;
}
const float (*BKE_mesh_corner_normals_ensure(const Mesh *mesh))[3]
{
return reinterpret_cast<const float(*)[3]>(mesh->corner_normals().data());
}
void BKE_lnor_spacearr_init(MLoopNorSpaceArray *lnors_spacearr,
const int numLoops,
const char data_type)

View File

@ -154,8 +154,12 @@ static void version_mesh_objects_replace_auto_smooth(Main &bmain)
}
}
void do_versions_after_linking_400(FileData * /*fd*/, Main * /*bmain*/)
void do_versions_after_linking_400(FileData * /*fd*/, Main *bmain)
{
if (!MAIN_VERSION_ATLEAST(bmain, 400, 8)) {
version_mesh_objects_replace_auto_smooth(*bmain);
}
/**
* Versioning code until next subversion bump goes here.
*
@ -170,7 +174,6 @@ void do_versions_after_linking_400(FileData * /*fd*/, Main * /*bmain*/)
*/
{
/* Keep this block, even when empty. */
version_mesh_objects_replace_auto_smooth(*bmain);
}
}

View File

@ -478,7 +478,7 @@ static void rna_MeshLoop_normal_get(PointerRNA *ptr, float *values)
{
Mesh *me = rna_mesh(ptr);
const int index = rna_MeshLoop_index_get(ptr);
const float(*loop_normals)[3] = BKE_mesh_corner_normals_ensure(me);
const blender::Span<blender::float3> loop_normals = me->corner_normals();
copy_v3_v3(values, loop_normals[index]);
}
@ -511,8 +511,9 @@ static void rna_MeshLoop_bitangent_get(PointerRNA *ptr, float *values)
{
Mesh *me = rna_mesh(ptr);
const int index = rna_MeshLoop_index_get(ptr);
const float(*loop_normals)[3] = BKE_mesh_corner_normals_ensure(me);
const float(*vec)[4] = CustomData_get_layer(&me->ldata, CD_MLOOPTANGENT);
const blender::Span<blender::float3> loop_normals = me->corner_normals();
const float(*vec)[4] = static_cast<const float(*)[4]>(
CustomData_get_layer(&me->ldata, CD_MLOOPTANGENT));
if (vec) {
cross_v3_v3v3(values, loop_normals[index], vec[index]);
@ -686,7 +687,7 @@ static void rna_MeshLoopTriangle_normal_get(PointerRNA *ptr, float *values)
static void rna_MeshLoopTriangle_split_normals_get(PointerRNA *ptr, float *values)
{
Mesh *me = rna_mesh(ptr);
const float(*loop_normals)[3] = BKE_mesh_corner_normals_ensure(me);
const blender::Span<blender::float3> loop_normals = me->corner_normals();
const MLoopTri *lt = (const MLoopTri *)ptr->data;
copy_v3_v3(values + 0, loop_normals[lt->tri[0]]);
copy_v3_v3(values + 3, loop_normals[lt->tri[1]]);
@ -1675,12 +1676,13 @@ int rna_Mesh_poly_normals_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_p
static void rna_Mesh_corner_normals_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
const Mesh *mesh = rna_mesh(ptr);
const float(*normals)[3] = BKE_mesh_corner_normals_ensure(mesh);
if (!normals) {
const blender::Span<blender::float3> normals = mesh->corner_normals();
if (normals.is_empty()) {
iter->valid = false;
return;
}
rna_iterator_array_begin(iter, (void *)normals, sizeof(float[3]), mesh->totloop, false, nullptr);
rna_iterator_array_begin(
iter, (void *)normals.data(), sizeof(float[3]), mesh->totloop, false, nullptr);
}
static int rna_Mesh_corner_normals_length(PointerRNA *ptr)
@ -1692,14 +1694,14 @@ static int rna_Mesh_corner_normals_length(PointerRNA *ptr)
int rna_Mesh_corner_normals_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
{
const Mesh *mesh = rna_mesh(ptr);
const float(*normals)[3] = BKE_mesh_corner_normals_ensure(mesh);
if (index < 0 || index >= mesh->totloop || !normals) {
const blender::Span<blender::float3> normals = mesh->corner_normals();
if (index < 0 || index >= mesh->totloop || normals.is_empty()) {
return false;
}
/* Casting away const is okay because this RNA type doesn't allow changing the value. */
r_ptr->owner_id = (ID *)&mesh->id;
r_ptr->type = &RNA_MeshNormalValue;
r_ptr->data = (float *)normals[index];
r_ptr->data = (float *)&normals[index];
return true;
}