[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41768] trunk/blender/intern/cycles: Cycles:

Brecht Van Lommel brechtvanlommel at pandora.be
Sat Nov 12 15:29:53 CET 2011


Revision: 41768
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41768
Author:   blendix
Date:     2011-11-12 14:29:52 +0000 (Sat, 12 Nov 2011)
Log Message:
-----------
Cycles:
* Fix object scaling update issue with interactive rendering + static BVH.
* Fix negative scaling issue with static BVH.
* Fix #29217: excessive fireflies in first sample.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_object.cpp
    trunk/blender/intern/cycles/kernel/kernel_random.h
    trunk/blender/intern/cycles/render/mesh.cpp
    trunk/blender/intern/cycles/render/mesh.h
    trunk/blender/intern/cycles/render/object.cpp
    trunk/blender/intern/cycles/util/util_transform.h

Modified: trunk/blender/intern/cycles/blender/blender_object.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_object.cpp	2011-11-12 10:06:56 UTC (rev 41767)
+++ trunk/blender/intern/cycles/blender/blender_object.cpp	2011-11-12 14:29:52 UTC (rev 41768)
@@ -171,8 +171,14 @@
 	Object *object;
 	bool object_updated = false;
 
+	if(object_map.sync(&object, b_ob, b_parent, key))
+		object_updated = true;
+	
+	/* mesh sync */
+	object->mesh = sync_mesh(b_ob, object_updated);
+
 	/* object sync */
-	if(object_map.sync(&object, b_ob, b_parent, key)) {
+	if(object_updated || (object->mesh && object->mesh->need_update)) {
 		object->name = b_ob.name().c_str();
 		object->tfm = tfm;
 		
@@ -181,11 +187,7 @@
 			object->visibility &= object_ray_visibility(b_parent);
 
 		object->tag_update(scene);
-		object_updated = true;
 	}
-
-	/* mesh sync */
-	object->mesh = sync_mesh(b_ob, object_updated);
 }
 
 /* Object Loop */

Modified: trunk/blender/intern/cycles/kernel/kernel_random.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_random.h	2011-11-12 10:06:56 UTC (rev 41767)
+++ trunk/blender/intern/cycles/kernel/kernel_random.h	2011-11-12 14:29:52 UTC (rev 41768)
@@ -22,6 +22,11 @@
 
 #ifdef __SOBOL__
 
+/* skip initial numbers that are not as well distributed, especially the
+   first sequence is just 0 everywhere, which can be problematic for e.g.
+   path termination */
+#define SOBOL_SKIP 64
+
 /* High Dimensional Sobol */
 
 /* van der corput radical inverse */
@@ -103,7 +108,7 @@
 	return r;
 #else
 	/* compute sobol sequence value using direction vectors */
-	uint result = sobol_dimension(kg, sample, dimension);
+	uint result = sobol_dimension(kg, sample + SOBOL_SKIP, dimension);
 	float r = (float)result * (1.0f/(float)0xFFFFFFFF);
 
 	/* Cranly-Patterson rotation using rng seed */

Modified: trunk/blender/intern/cycles/render/mesh.cpp
===================================================================
--- trunk/blender/intern/cycles/render/mesh.cpp	2011-11-12 10:06:56 UTC (rev 41767)
+++ trunk/blender/intern/cycles/render/mesh.cpp	2011-11-12 14:29:52 UTC (rev 41768)
@@ -42,6 +42,7 @@
 {
 	need_update = true;
 	transform_applied = false;
+	transform_negative_scaled = false;
 	displacement_method = DISPLACE_BUMP;
 
 	bvh = NULL;
@@ -75,6 +76,9 @@
 
 	attributes.clear();
 	used_shaders.clear();
+
+	transform_applied = false;
+	transform_negative_scaled = false;
 }
 
 void Mesh::add_triangle(int v0, int v1, int v2, int shader_, bool smooth_)
@@ -116,6 +120,7 @@
 
 	/* compute face normals */
 	size_t triangles_size = triangles.size();
+	bool flip = transform_negative_scaled;
 
 	if(triangles_size) {
 		float3 *verts_ptr = &verts[0];
@@ -128,6 +133,9 @@
 			float3 v2 = verts_ptr[t.v[2]];
 
 			fN[i] = normalize(cross(v1 - v0, v2 - v0));
+
+			if(flip)
+				fN[i] = -fN[i];
 		}
 	}
 }
@@ -150,6 +158,7 @@
 
 	size_t verts_size = verts.size();
 	size_t triangles_size = triangles.size();
+	bool flip = transform_negative_scaled;
 
 	if(triangles_size) {
 		Triangle *triangles_ptr = &triangles[0];
@@ -159,8 +168,11 @@
 				vN[triangles_ptr[i].v[j]] += fN[i];
 	}
 
-	for(size_t i = 0; i < verts_size; i++)
+	for(size_t i = 0; i < verts_size; i++) {
 		vN[i] = normalize(vN[i]);
+		if(flip)
+			vN[i] = -vN[i];
+	}
 }
 
 void Mesh::pack_normals(Scene *scene, float4 *normal, float4 *vnormal)

Modified: trunk/blender/intern/cycles/render/mesh.h
===================================================================
--- trunk/blender/intern/cycles/render/mesh.h	2011-11-12 10:06:56 UTC (rev 41767)
+++ trunk/blender/intern/cycles/render/mesh.h	2011-11-12 14:29:52 UTC (rev 41768)
@@ -70,6 +70,7 @@
 
 	BoundBox bounds;
 	bool transform_applied;
+	bool transform_negative_scaled;
 	DisplacementMethod displacement_method;
 
 	/* Update Flags */

Modified: trunk/blender/intern/cycles/render/object.cpp
===================================================================
--- trunk/blender/intern/cycles/render/object.cpp	2011-11-12 10:06:56 UTC (rev 41767)
+++ trunk/blender/intern/cycles/render/object.cpp	2011-11-12 14:29:52 UTC (rev 41768)
@@ -60,6 +60,11 @@
 
 	Transform ntfm = transform_transpose(transform_inverse(tfm));
 
+	/* we keep normals pointing in same direction on negative scale, notify
+	   mesh about this in it (re)calculates normals */
+	if(transform_negative_scale(tfm))
+		mesh->transform_negative_scaled = true;
+
 	if(attr_fN) {
 		float3 *fN = attr_fN->data_float3();
 
@@ -232,8 +237,10 @@
 	/* apply transforms for objects with single user meshes */
 	foreach(Object *object, scene->objects) {
 		if(mesh_users[object->mesh] == 1) {
-			object->apply_transform();
-			object->mesh->transform_applied = true;
+			if(!object->mesh->transform_applied) {
+				object->apply_transform();
+				object->mesh->transform_applied = true;
+			}
 
 			if(progress.get_cancel()) return;
 		}

Modified: trunk/blender/intern/cycles/util/util_transform.h
===================================================================
--- trunk/blender/intern/cycles/util/util_transform.h	2011-11-12 10:06:56 UTC (rev 41767)
+++ trunk/blender/intern/cycles/util/util_transform.h	2011-11-12 14:29:52 UTC (rev 41768)
@@ -234,6 +234,15 @@
    return false;
 }
 
+__device_inline bool transform_negative_scale(const Transform& tfm)
+{
+	float3 c0 = transform_get_column(&tfm, 0);
+	float3 c1 = transform_get_column(&tfm, 1);
+	float3 c2 = transform_get_column(&tfm, 2);
+
+	return (dot(cross(c0, c1), c2) < 0.0f);
+}
+
 #endif
 
 CCL_NAMESPACE_END




More information about the Bf-blender-cvs mailing list