diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-03-29 16:03:46 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-03-29 16:03:46 +0400 |
commit | 8f33538fabe9b2485478b7ce0167c15396bdb355 (patch) | |
tree | 2ad971354ba58047cfbab6d9c23749a475d42df1 /intern/cycles/render/mesh.cpp | |
parent | 99f59930885ed69890967f8864a3aa0626249d86 (diff) |
Cycles code refactor: add motion sampled normals attribute.
Diffstat (limited to 'intern/cycles/render/mesh.cpp')
-rw-r--r-- | intern/cycles/render/mesh.cpp | 106 |
1 files changed, 72 insertions, 34 deletions
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 0d09328119c..8e2cc97eba0 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -242,6 +242,21 @@ void Mesh::compute_bounds() bounds = bnds; } +static float3 compute_face_normal(const Mesh::Triangle& t, float3 *verts) +{ + float3 v0 = verts[t.v[0]]; + float3 v1 = verts[t.v[1]]; + float3 v2 = verts[t.v[2]]; + + float3 norm = cross(v1 - v0, v2 - v0); + float normlen = len(norm); + + if(normlen == 0.0f) + return make_float3(0.0f, 0.0f, 0.0f); + + return norm / normlen; +} + void Mesh::add_face_normals() { /* don't compute if already there */ @@ -261,17 +276,7 @@ void Mesh::add_face_normals() Triangle *triangles_ptr = &triangles[0]; for(size_t i = 0; i < triangles_size; i++) { - Triangle t = triangles_ptr[i]; - float3 v0 = verts_ptr[t.v[0]]; - float3 v1 = verts_ptr[t.v[1]]; - float3 v2 = verts_ptr[t.v[2]]; - - float3 norm = cross(v1 - v0, v2 - v0); - float normlen = len(norm); - if(normlen == 0.0f) - fN[i] = make_float3(0.0f, 0.0f, 0.0f); - else - fN[i] = norm / normlen; + fN[i] = compute_face_normal(triangles_ptr[i], verts_ptr); if(flip) fN[i] = -fN[i]; @@ -289,36 +294,69 @@ void Mesh::add_face_normals() void Mesh::add_vertex_normals() { - /* don't compute if already there */ - if(attributes.find(ATTR_STD_VERTEX_NORMAL)) - return; - - /* get attributes */ - Attribute *attr_fN = attributes.find(ATTR_STD_FACE_NORMAL); - Attribute *attr_vN = attributes.add(ATTR_STD_VERTEX_NORMAL); + bool flip = transform_negative_scaled; + size_t verts_size = verts.size(); + size_t triangles_size = triangles.size(); - float3 *fN = attr_fN->data_float3(); - float3 *vN = attr_vN->data_float3(); + /* static vertex normals */ + if(!attributes.find(ATTR_STD_VERTEX_NORMAL)) { + /* get attributes */ + Attribute *attr_fN = attributes.find(ATTR_STD_FACE_NORMAL); + Attribute *attr_vN = attributes.add(ATTR_STD_VERTEX_NORMAL); - /* compute vertex normals */ - memset(vN, 0, verts.size()*sizeof(float3)); + float3 *fN = attr_fN->data_float3(); + float3 *vN = attr_vN->data_float3(); - size_t verts_size = verts.size(); - size_t triangles_size = triangles.size(); - bool flip = transform_negative_scaled; + /* compute vertex normals */ + memset(vN, 0, verts.size()*sizeof(float3)); - if(triangles_size) { - Triangle *triangles_ptr = &triangles[0]; + if(triangles_size) { + Triangle *triangles_ptr = &triangles[0]; - for(size_t i = 0; i < triangles_size; i++) - for(size_t j = 0; j < 3; j++) - vN[triangles_ptr[i].v[j]] += fN[i]; + for(size_t i = 0; i < triangles_size; i++) + for(size_t j = 0; j < 3; j++) + vN[triangles_ptr[i].v[j]] += fN[i]; + } + + for(size_t i = 0; i < verts_size; i++) { + vN[i] = normalize(vN[i]); + if(flip) + vN[i] = -vN[i]; + } } - for(size_t i = 0; i < verts_size; i++) { - vN[i] = normalize(vN[i]); - if(flip) - vN[i] = -vN[i]; + /* motion vertex normals */ + Attribute *attr_mP = attributes.find(ATTR_STD_MOTION_VERTEX_POSITION); + Attribute *attr_mN = attributes.find(ATTR_STD_MOTION_VERTEX_NORMAL); + + if(false && !attr_mN) { + /* create attribute */ + attr_mN = attributes.add(ATTR_STD_MOTION_VERTEX_NORMAL); + + for(int step = 0; step < motion_steps - 1; step++) { + float3 *mP = attr_mP->data_float3() + step*verts.size(); + float3 *mN = attr_mN->data_float3() + step*verts.size(); + + /* compute */ + memset(mN, 0, verts.size()*sizeof(float3)); + + if(triangles_size) { + Triangle *triangles_ptr = &triangles[0]; + + for(size_t i = 0; i < triangles_size; i++) { + for(size_t j = 0; j < 3; j++) { + float3 fN = compute_face_normal(triangles_ptr[i], mP); + mN[triangles_ptr[i].v[j]] += fN; + } + } + } + + for(size_t i = 0; i < verts_size; i++) { + mN[i] = normalize(mN[i]); + if(flip) + mN[i] = -mN[i]; + } + } } } |