diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-01-25 18:11:06 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-01-26 10:41:19 +0300 |
commit | 848f0c5b5b3ca4d747e00a66182c3d0edd8cc99b (patch) | |
tree | f91aae611773332639f8ff290597312c17382b38 /intern | |
parent | 22afe88882e88b15df06a2b5ce3c596d31dd6365 (diff) |
Code cleanup: simpler and faster detection of BVH refit.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/blender/blender_mesh.cpp | 40 | ||||
-rw-r--r-- | intern/cycles/util/util_vector.h | 5 |
2 files changed, 20 insertions, 25 deletions
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index cfbc868938e..3b07464cd96 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -1138,12 +1138,19 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob, mesh_synced.insert(mesh); /* create derived mesh */ - array<int> oldtriangle = mesh->triangles; + array<int> oldtriangles; + array<Mesh::SubdFace> oldsubd_faces; + array<int> oldsubd_face_corners; + oldtriangles.steal_data(mesh->triangles); + oldsubd_faces.steal_data(mesh->subd_faces); + oldsubd_face_corners.steal_data(mesh->subd_face_corners); /* compares curve_keys rather than strands in order to handle quick hair * adjustments in dynamic BVH - other methods could probably do this better*/ - array<float3> oldcurve_keys = mesh->curve_keys; - array<float> oldcurve_radius = mesh->curve_radius; + array<float3> oldcurve_keys; + array<float> oldcurve_radius; + oldcurve_keys.steal_data(mesh->curve_keys); + oldcurve_radius.steal_data(mesh->curve_radius); mesh->clear(); mesh->used_shaders = used_shaders; @@ -1206,28 +1213,11 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob, sync_mesh_fluid_motion(b_ob, scene, mesh); /* tag update */ - bool rebuild = false; - - if(oldtriangle.size() != mesh->triangles.size()) - rebuild = true; - else if(oldtriangle.size()) { - if(memcmp(&oldtriangle[0], &mesh->triangles[0], sizeof(int)*oldtriangle.size()) != 0) - rebuild = true; - } - - if(oldcurve_keys.size() != mesh->curve_keys.size()) - rebuild = true; - else if(oldcurve_keys.size()) { - if(memcmp(&oldcurve_keys[0], &mesh->curve_keys[0], sizeof(float3)*oldcurve_keys.size()) != 0) - rebuild = true; - } - - if(oldcurve_radius.size() != mesh->curve_radius.size()) - rebuild = true; - else if(oldcurve_radius.size()) { - if(memcmp(&oldcurve_radius[0], &mesh->curve_radius[0], sizeof(float)*oldcurve_radius.size()) != 0) - rebuild = true; - } + bool rebuild = (oldtriangles != mesh->triangles) || + (oldsubd_faces != mesh->subd_faces) || + (oldsubd_face_corners != mesh->subd_face_corners) || + (oldcurve_keys != mesh->curve_keys) || + (oldcurve_radius != mesh->curve_radius); mesh->tag_update(scene, rebuild); diff --git a/intern/cycles/util/util_vector.h b/intern/cycles/util/util_vector.h index 67bf82b47a5..625c19c7c46 100644 --- a/intern/cycles/util/util_vector.h +++ b/intern/cycles/util/util_vector.h @@ -162,6 +162,11 @@ public: return memcmp(data_, other.data_, datasize_*sizeof(T)) == 0; } + bool operator!=(const array<T>& other) const + { + return !(*this == other); + } + void steal_data(array& from) { if(this != &from) { |