Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-07-23 15:59:37 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2014-07-23 16:01:35 +0400
commiteb8f85d8be8a14cbb8e97ba3b91c02cfd0ebbe42 (patch)
treebd197e4fcaeeb00e13ac69426f77cc8907039beb
parent82f16f81fd0e70872b759caa501a116f815bb3f6 (diff)
Fix T41116: Motion Blur causes random black surfaces on rigged models
Fix T41115: Motion Blur renders Objects Black - But not in Viewport Preview This actually extends previous fix to normals and makes it all much nicer now. Worth doing some intense testing, quick one worked just fine but there always could be some corner cases.
-rw-r--r--intern/cycles/kernel/geom/geom_triangle.h5
-rw-r--r--intern/cycles/kernel/kernel_types.h1
-rw-r--r--intern/cycles/render/mesh.cpp15
-rw-r--r--intern/cycles/render/object.cpp2
4 files changed, 16 insertions, 7 deletions
diff --git a/intern/cycles/kernel/geom/geom_triangle.h b/intern/cycles/kernel/geom/geom_triangle.h
index f4e53be5429..6fffbc7f782 100644
--- a/intern/cycles/kernel/geom/geom_triangle.h
+++ b/intern/cycles/kernel/geom/geom_triangle.h
@@ -127,10 +127,7 @@ ccl_device_inline float3 triangle_normal(KernelGlobals *kg, ShaderData *sd)
float3 v2 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.z)));
/* return normal */
- if(sd->flag & SD_NEGATIVE_SCALE_APPLIED)
- return normalize(cross(v2 - v0, v1 - v0));
- else
- return normalize(cross(v1 - v0, v2 - v0));
+ return normalize(cross(v1 - v0, v2 - v0));
}
/* point and normal on triangle */
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index cfd72e1476b..164df41fc09 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -593,7 +593,6 @@ enum ShaderDataFlag {
SD_HOLDOUT_MASK = 524288, /* holdout for camera rays */
SD_OBJECT_MOTION = 1048576, /* has object motion blur */
SD_TRANSFORM_APPLIED = 2097152, /* vertices have transform applied */
- SD_NEGATIVE_SCALE_APPLIED = 4194304, /* vertices have negative scale applied */
SD_OBJECT_FLAGS = (SD_HOLDOUT_MASK|SD_OBJECT_MOTION|SD_TRANSFORM_APPLIED)
};
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 273443034c5..295c934537a 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -341,6 +341,13 @@ void Mesh::add_vertex_normals()
vN[i] = -vN[i];
}
}
+ else if(flip) {
+ Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL);
+ float3 *vN = attr_vN->data_float3();
+ for(size_t i = 0; i < verts_size; i++) {
+ vN[i] = -vN[i];
+ }
+ }
/* motion vertex normals */
Attribute *attr_mP = attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
@@ -375,6 +382,14 @@ void Mesh::add_vertex_normals()
}
}
}
+ else if(has_motion_blur() && attr_mN && flip) {
+ for(int step = 0; step < motion_steps - 1; step++) {
+ float3 *mN = attr_mN->data_float3() + step*verts.size();
+ for(size_t i = 0; i < verts_size; i++) {
+ mN[i] = -mN[i];
+ }
+ }
+ }
}
void Mesh::pack_normals(Scene *scene, float *tri_shader, float4 *vnormal)
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index 1f148d34ea6..027bfd71931 100644
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@ -449,8 +449,6 @@ void ObjectManager::apply_static_transforms(DeviceScene *dscene, Scene *scene, u
}
object_flag[i] |= SD_TRANSFORM_APPLIED;
- if(object->mesh->transform_negative_scaled)
- object_flag[i] |= SD_NEGATIVE_SCALE_APPLIED;
}
else
have_instancing = true;