[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51352] trunk/blender: Cycles: fix some update issues with camera motion blur, and do some more work

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Oct 15 23:13:01 CEST 2012


Revision: 51352
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51352
Author:   blendix
Date:     2012-10-15 21:12:58 +0000 (Mon, 15 Oct 2012)
Log Message:
-----------
Cycles: fix some update issues with camera motion blur, and do some more work
for getting object motion blur ready.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_object.cpp
    trunk/blender/intern/cycles/blender/blender_sync.cpp
    trunk/blender/intern/cycles/kernel/CMakeLists.txt
    trunk/blender/intern/cycles/kernel/kernel_bvh.h
    trunk/blender/intern/cycles/kernel/kernel_light.h
    trunk/blender/intern/cycles/kernel/kernel_object.h
    trunk/blender/intern/cycles/kernel/kernel_shader.h
    trunk/blender/intern/cycles/kernel/kernel_triangle.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/render/camera.cpp
    trunk/blender/intern/cycles/render/camera.h
    trunk/blender/intern/cycles/render/mesh.cpp
    trunk/blender/intern/cycles/render/object.cpp
    trunk/blender/intern/cycles/render/scene.cpp
    trunk/blender/intern/cycles/render/scene.h
    trunk/blender/source/blender/editors/render/render_update.c
    trunk/blender/source/blender/makesrna/intern/rna_scene.c

Removed Paths:
-------------
    trunk/blender/intern/cycles/kernel/kernel_mbvh.h
    trunk/blender/intern/cycles/kernel/kernel_qbvh.h

Modified: trunk/blender/intern/cycles/blender/blender_object.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_object.cpp	2012-10-15 19:57:18 UTC (rev 51351)
+++ trunk/blender/intern/cycles/blender/blender_object.cpp	2012-10-15 21:12:58 UTC (rev 51352)
@@ -396,6 +396,8 @@
 	if(b_override)
 		b_cam = b_override;
 
+	Camera prevcam = *(scene->camera);
+	
 	/* go back and forth one frame */
 	int frame = b_scene.frame_current();
 
@@ -411,6 +413,10 @@
 	}
 
 	scene_frame_set(b_scene, frame);
+
+	/* tag camera for motion update */
+	if(scene->camera->motion_modified(prevcam))
+		scene->camera->tag_update();
 }
 
 CCL_NAMESPACE_END

Modified: trunk/blender/intern/cycles/blender/blender_sync.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.cpp	2012-10-15 19:57:18 UTC (rev 51351)
+++ trunk/blender/intern/cycles/blender/blender_sync.cpp	2012-10-15 21:12:58 UTC (rev 51352)
@@ -17,6 +17,7 @@
  */
 
 #include "background.h"
+#include "camera.h"
 #include "film.h"
 #include "../render/filter.h"
 #include "graph.h"
@@ -179,6 +180,11 @@
 
 	integrator->sample_clamp = get_float(cscene, "sample_clamp");
 #ifdef __CAMERA_MOTION__
+	if(integrator->motion_blur != r.use_motion_blur()) {
+		scene->object_manager->tag_update(scene);
+		scene->camera->tag_update();
+	}
+
 	integrator->motion_blur = (!preview && r.use_motion_blur());
 #endif
 

Modified: trunk/blender/intern/cycles/kernel/CMakeLists.txt
===================================================================
--- trunk/blender/intern/cycles/kernel/CMakeLists.txt	2012-10-15 19:57:18 UTC (rev 51351)
+++ trunk/blender/intern/cycles/kernel/CMakeLists.txt	2012-10-15 21:12:58 UTC (rev 51352)
@@ -31,13 +31,11 @@
 	kernel_globals.h
 	kernel_light.h
 	kernel_math.h
-	kernel_mbvh.h
 	kernel_montecarlo.h
 	kernel_object.h
 	kernel_passes.h
 	kernel_path.h
 	kernel_projection.h
-	kernel_qbvh.h
 	kernel_random.h
 	kernel_shader.h
 	kernel_textures.h

Modified: trunk/blender/intern/cycles/kernel/kernel_bvh.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_bvh.h	2012-10-15 19:57:18 UTC (rev 51351)
+++ trunk/blender/intern/cycles/kernel/kernel_bvh.h	2012-10-15 21:12:58 UTC (rev 51352)
@@ -57,7 +57,7 @@
 
 __device_inline void bvh_instance_push(KernelGlobals *kg, int object, const Ray *ray, float3 *P, float3 *idir, float *t, const float tmax)
 {
-	Transform tfm = object_fetch_transform(kg, object, ray->time, OBJECT_INVERSE_TRANSFORM);
+	Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
 
 	*P = transform_point(&tfm, ray->P);
 
@@ -75,7 +75,7 @@
 __device_inline void bvh_instance_pop(KernelGlobals *kg, int object, const Ray *ray, float3 *P, float3 *idir, float *t, const float tmax)
 {
 	if(*t != FLT_MAX) {
-		Transform tfm = object_fetch_transform(kg, object, ray->time, OBJECT_TRANSFORM);
+		Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
 		*t *= len(transform_direction(&tfm, 1.0f/(*idir)));
 	}
 
@@ -83,6 +83,36 @@
 	*idir = bvh_inverse_direction(ray->D);
 }
 
+#ifdef __OBJECT_MOTION__
+__device_inline void bvh_instance_motion_push(KernelGlobals *kg, int object, const Ray *ray, float3 *P, float3 *idir, float *t, Transform *tfm, const float tmax)
+{
+	Transform itfm;
+	*tfm = object_fetch_transform_motion(kg, object, ray->time, &itfm);
+
+	*P = transform_point(&itfm, ray->P);
+
+	float3 dir = transform_direction(&itfm, ray->D);
+
+	float len;
+	dir = normalize_len(dir, &len);
+
+	*idir = bvh_inverse_direction(dir);
+
+	if(*t != FLT_MAX)
+		*t *= len;
+}
+
+__device_inline void bvh_instance_motion_pop(KernelGlobals *kg, int object, const Ray *ray, float3 *P, float3 *idir, float *t, Transform *tfm, const float tmax)
+{
+	if(*t != FLT_MAX) {
+		*t *= len(transform_direction(tfm, 1.0f/(*idir)));
+	}
+
+	*P = ray->P;
+	*idir = bvh_inverse_direction(ray->D);
+}
+#endif
+
 /* intersect two bounding boxes */
 __device_inline void bvh_node_intersect(KernelGlobals *kg,
 	bool *traverseChild0, bool *traverseChild1,
@@ -133,7 +163,7 @@
 
 /* Sven Woop's algorithm */
 __device_inline void bvh_triangle_intersect(KernelGlobals *kg, Intersection *isect,
-	float3 P, float3 idir, uint visibility, int object, int triAddr)
+	float3 P, float3 idir, uint visibility, int object, int triAddr, Transform *tfm)
 {
 	/* compute and check intersection t-value */
 	float4 v00 = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+0);
@@ -176,7 +206,7 @@
 	}
 }
 
-__device_inline bool scene_intersect(KernelGlobals *kg, const Ray *ray, const uint visibility, Intersection *isect)
+__device_inline bool bvh_intersect(KernelGlobals *kg, const Ray *ray, const uint visibility, Intersection *isect)
 {
 	/* traversal stack in CUDA thread-local memory */
 	int traversalStack[BVH_STACK_SIZE];
@@ -255,7 +285,7 @@
 					/* triangle intersection */
 					while(primAddr < primAddr2) {
 						/* intersect ray against triangle */
-						bvh_triangle_intersect(kg, isect, P, idir, visibility, object, primAddr);
+						bvh_triangle_intersect(kg, isect, P, idir, visibility, object, primAddr, NULL);
 
 						/* shadow ray early termination */
 						if(visibility == PATH_RAY_SHADOW_OPAQUE && isect->prim != ~0)
@@ -268,7 +298,6 @@
 				else {
 					/* instance push */
 					object = kernel_tex_fetch(__prim_object, -primAddr-1);
-
 					bvh_instance_push(kg, object, ray, &P, &idir, &isect->t, tmax);
 
 					++stackPtr;
@@ -296,6 +325,133 @@
 	return (isect->prim != ~0);
 }
 
+#ifdef __OBJECT_MOTION__
+__device_inline bool bvh_intersect_motion(KernelGlobals *kg, const Ray *ray, const uint visibility, Intersection *isect)
+{
+	/* traversal stack in CUDA thread-local memory */
+	int traversalStack[BVH_STACK_SIZE];
+	traversalStack[0] = ENTRYPOINT_SENTINEL;
+
+	/* traversal variables in registers */
+	int stackPtr = 0;
+	int nodeAddr = kernel_data.bvh.root;
+
+	/* ray parameters in registers */
+	const float tmax = ray->t;
+	float3 P = ray->P;
+	float3 idir = bvh_inverse_direction(ray->D);
+	int object = ~0;
+
+	Transform ob_tfm;
+
+	isect->t = tmax;
+	isect->object = ~0;
+	isect->prim = ~0;
+	isect->u = 0.0f;
+	isect->v = 0.0f;
+
+	/* traversal loop */
+	do {
+		do
+		{
+			/* traverse internal nodes */
+			while(nodeAddr >= 0 && nodeAddr != ENTRYPOINT_SENTINEL)
+			{
+				bool traverseChild0, traverseChild1, closestChild1;
+				int nodeAddrChild1;
+
+				bvh_node_intersect(kg, &traverseChild0, &traverseChild1,
+					&closestChild1, &nodeAddr, &nodeAddrChild1,
+					P, idir, isect->t, visibility, nodeAddr);
+
+				if(traverseChild0 != traverseChild1) {
+					/* one child was intersected */
+					if(traverseChild1) {
+						nodeAddr = nodeAddrChild1;
+					}
+				}
+				else {
+					if(!traverseChild0) {
+						/* neither child was intersected */
+						nodeAddr = traversalStack[stackPtr];
+						--stackPtr;
+					}
+					else {
+						/* both children were intersected, push the farther one */
+						if(closestChild1) {
+							int tmp = nodeAddr;
+							nodeAddr = nodeAddrChild1;
+							nodeAddrChild1 = tmp;
+						}
+
+						++stackPtr;
+						traversalStack[stackPtr] = nodeAddrChild1;
+					}
+				}
+			}
+
+			/* if node is leaf, fetch triangle list */
+			if(nodeAddr < 0) {
+				float4 leaf = kernel_tex_fetch(__bvh_nodes, (-nodeAddr-1)*BVH_NODE_SIZE+(BVH_NODE_SIZE-1));
+				int primAddr = __float_as_int(leaf.x);
+
+				if(primAddr >= 0) {
+					int primAddr2 = __float_as_int(leaf.y);
+
+					/* pop */
+					nodeAddr = traversalStack[stackPtr];
+					--stackPtr;
+
+					/* triangle intersection */
+					while(primAddr < primAddr2) {
+						/* intersect ray against triangle */
+						bvh_triangle_intersect(kg, isect, P, idir, visibility, object, primAddr, &ob_tfm);
+
+						/* shadow ray early termination */
+						if(visibility == PATH_RAY_SHADOW_OPAQUE && isect->prim != ~0)
+							return true;
+
+						primAddr++;
+					}
+				}
+				else {
+					/* instance push */
+					object = kernel_tex_fetch(__prim_object, -primAddr-1);
+					bvh_instance_motion_push(kg, object, ray, &P, &idir, &isect->t, &ob_tfm, tmax);
+
+					++stackPtr;
+					traversalStack[stackPtr] = ENTRYPOINT_SENTINEL;
+
+					nodeAddr = kernel_tex_fetch(__object_node, object);
+				}
+			}
+		} while(nodeAddr != ENTRYPOINT_SENTINEL);
+
+		if(stackPtr >= 0) {
+			kernel_assert(object != ~0);
+
+			/* instance pop */
+			bvh_instance_motion_pop(kg, object, ray, &P, &idir, &isect->t, &ob_tfm, tmax);
+			object = ~0;
+			nodeAddr = traversalStack[stackPtr];
+			--stackPtr;
+		}
+	} while(nodeAddr != ENTRYPOINT_SENTINEL);
+
+	return (isect->prim != ~0);
+}
+#endif
+
+__device_inline bool scene_intersect(KernelGlobals *kg, const Ray *ray, const uint visibility, Intersection *isect)
+{
+#ifdef __OBJECT_MOTION__
+	if(kernel_data.bvh.have_motion)
+		return bvh_intersect_motion(kg, ray, visibility, isect);
+	else
+#endif
+		return bvh_intersect(kg, ray, visibility, isect);
+}
+
 __device_inline float3 ray_offset(float3 P, float3 Ng)
 {
 #ifdef __INTERSECTION_REFINE__
@@ -352,7 +508,7 @@
 #ifdef __OBJECT_MOTION__
 		Transform tfm = sd->ob_itfm;
 #else
-		Transform tfm = object_fetch_transform(kg, isect->object, ray->time, OBJECT_INVERSE_TRANSFORM);
+		Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_INVERSE_TRANSFORM);
 #endif
 
 		P = transform_point(&tfm, P);
@@ -373,7 +529,7 @@
 #ifdef __OBJECT_MOTION__
 		Transform tfm = sd->ob_tfm;
 #else
-		Transform tfm = object_fetch_transform(kg, isect->object, ray->time, OBJECT_TRANSFORM);
+		Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_TRANSFORM);
 #endif
 
 		P = transform_point(&tfm, P);

Modified: trunk/blender/intern/cycles/kernel/kernel_light.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_light.h	2012-10-15 19:57:18 UTC (rev 51351)
+++ trunk/blender/intern/cycles/kernel/kernel_light.h	2012-10-15 21:12:58 UTC (rev 51352)
@@ -301,8 +301,13 @@
 #ifdef __INSTANCING__
 	/* instance transform */
 	if(ls->object >= 0) {
-		Transform tfm = object_fetch_transform(kg, ls->object, time, OBJECT_TRANSFORM);
-		Transform itfm = object_fetch_transform(kg, ls->object, time, OBJECT_INVERSE_TRANSFORM);
+#ifdef __OBJECT_MOTION__
+		Transform itfm;
+		Transform tfm = object_fetch_transform_motion(kg, ls->object, time, &itfm);
+#else
+		Transform tfm = object_fetch_transform(kg, ls->object, OBJECT_TRANSFORM);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list