[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46114] trunk/blender: Cycles: support for motion vector and UV passes.

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Apr 30 14:49:26 CEST 2012


Revision: 46114
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46114
Author:   blendix
Date:     2012-04-30 12:49:26 +0000 (Mon, 30 Apr 2012)
Log Message:
-----------
Cycles: support for motion vector and UV passes.

Most of the changes are related to adding support for motion data throughout
the code. There's some code for actual camera/object motion blur raytracing
but it's unfinished (it badly slows down the raytracing kernel even when the
option is turned off), so that code it disabled still.

Motion vector export from Blender tries to avoid computing derived meshes
when the mesh does not have a deforming modifier, and it also won't store
motion vectors for every vertex if only the object or camera is moving.

Modified Paths:
--------------
    trunk/blender/CMakeLists.txt
    trunk/blender/intern/cycles/app/cycles_xml.cpp
    trunk/blender/intern/cycles/blender/addon/ui.py
    trunk/blender/intern/cycles/blender/blender_camera.cpp
    trunk/blender/intern/cycles/blender/blender_mesh.cpp
    trunk/blender/intern/cycles/blender/blender_object.cpp
    trunk/blender/intern/cycles/blender/blender_session.cpp
    trunk/blender/intern/cycles/blender/blender_sync.cpp
    trunk/blender/intern/cycles/blender/blender_sync.h
    trunk/blender/intern/cycles/blender/blender_util.h
    trunk/blender/intern/cycles/kernel/kernel_bvh.h
    trunk/blender/intern/cycles/kernel/kernel_camera.h
    trunk/blender/intern/cycles/kernel/kernel_emission.h
    trunk/blender/intern/cycles/kernel/kernel_light.h
    trunk/blender/intern/cycles/kernel/kernel_object.h
    trunk/blender/intern/cycles/kernel/kernel_passes.h
    trunk/blender/intern/cycles/kernel/kernel_path.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/kernel/svm/svm_tex_coord.h
    trunk/blender/intern/cycles/render/CMakeLists.txt
    trunk/blender/intern/cycles/render/attribute.cpp
    trunk/blender/intern/cycles/render/attribute.h
    trunk/blender/intern/cycles/render/buffers.cpp
    trunk/blender/intern/cycles/render/camera.cpp
    trunk/blender/intern/cycles/render/camera.h
    trunk/blender/intern/cycles/render/film.cpp
    trunk/blender/intern/cycles/render/film.h
    trunk/blender/intern/cycles/render/graph.cpp
    trunk/blender/intern/cycles/render/integrator.cpp
    trunk/blender/intern/cycles/render/integrator.h
    trunk/blender/intern/cycles/render/mesh.cpp
    trunk/blender/intern/cycles/render/mesh.h
    trunk/blender/intern/cycles/render/mesh_displace.cpp
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/render/object.cpp
    trunk/blender/intern/cycles/render/object.h
    trunk/blender/intern/cycles/render/scene.cpp
    trunk/blender/intern/cycles/render/scene.h
    trunk/blender/intern/cycles/render/shader.cpp
    trunk/blender/intern/cycles/render/shader.h
    trunk/blender/intern/cycles/render/svm.cpp
    trunk/blender/intern/cycles/render/svm.h
    trunk/blender/intern/cycles/subd/subd_dice.cpp
    trunk/blender/intern/cycles/util/util_math.h
    trunk/blender/intern/cycles/util/util_transform.cpp
    trunk/blender/intern/cycles/util/util_transform.h
    trunk/blender/source/blender/blenkernel/BKE_object.h
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/makesrna/intern/rna_object_api.c
    trunk/blender/source/blender/makesrna/intern/rna_scene_api.c

Modified: trunk/blender/CMakeLists.txt
===================================================================
--- trunk/blender/CMakeLists.txt	2012-04-30 12:44:43 UTC (rev 46113)
+++ trunk/blender/CMakeLists.txt	2012-04-30 12:49:26 UTC (rev 46114)
@@ -304,7 +304,7 @@
 #-----------------------------------------------------------------------------
 # Check for conflicting/unsupported configurations
 
-if(NOT WITH_BLENDER AND NOT WITH_PLAYER)
+if(NOT WITH_BLENDER AND NOT WITH_PLAYER AND NOT WITH_CYCLES_TEST)
 	message(FATAL_ERROR "At least one of WITH_BLENDER or WITH_PLAYER must be enabled, nothing to do!")
 endif()
 

Modified: trunk/blender/intern/cycles/app/cycles_xml.cpp
===================================================================
--- trunk/blender/intern/cycles/app/cycles_xml.cpp	2012-04-30 12:44:43 UTC (rev 46113)
+++ trunk/blender/intern/cycles/app/cycles_xml.cpp	2012-04-30 12:49:26 UTC (rev 46114)
@@ -284,8 +284,7 @@
 	xml_read_float(&cam->farclip, node, "farclip");
 	xml_read_float(&cam->aperturesize, node, "aperturesize"); // 0.5*focallength/fstop
 	xml_read_float(&cam->focaldistance, node, "focaldistance");
-	xml_read_float(&cam->shutteropen, node, "shutteropen");
-	xml_read_float(&cam->shutterclose, node, "shutterclose");
+	xml_read_float(&cam->shuttertime, node, "shuttertime");
 
 	if(xml_equal_string(node, "type", "orthographic"))
 		cam->type = CAMERA_ORTHOGRAPHIC;
@@ -705,7 +704,7 @@
 	}
 
 	/* temporary for test compatibility */
-	mesh->attributes.remove(Attribute::STD_VERTEX_NORMAL);
+	mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
 }
 
 /* Patch */
@@ -766,7 +765,7 @@
 		delete patch;
 
 		/* temporary for test compatibility */
-		mesh->attributes.remove(Attribute::STD_VERTEX_NORMAL);
+		mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
 	}
 }
 

Modified: trunk/blender/intern/cycles/blender/addon/ui.py
===================================================================
--- trunk/blender/intern/cycles/blender/addon/ui.py	2012-04-30 12:44:43 UTC (rev 46113)
+++ trunk/blender/intern/cycles/blender/addon/ui.py	2012-04-30 12:49:26 UTC (rev 46114)
@@ -94,6 +94,29 @@
         col.prop(cscene, "blur_glossy")
 
 
+class CyclesRender_PT_motion_blur(CyclesButtonsPanel, Panel):
+    bl_label = "Motion Blur"
+    bl_options = {'DEFAULT_CLOSED'}
+
+    @classmethod
+    def poll(cls, context):
+        return False
+
+    def draw_header(self, context):
+        rd = context.scene.render
+
+        self.layout.prop(rd, "use_motion_blur", text="")
+
+    def draw(self, context):
+        layout = self.layout
+
+        rd = context.scene.render
+        layout.active = rd.use_motion_blur
+
+        row = layout.row()
+        row.prop(rd, "motion_blur_shutter")
+
+
 class CyclesRender_PT_film(CyclesButtonsPanel, Panel):
     bl_label = "Film"
 
@@ -202,10 +225,10 @@
         col.prop(rl, "use_pass_combined")
         col.prop(rl, "use_pass_z")
         col.prop(rl, "use_pass_normal")
+        col.prop(rl, "use_pass_vector")
+        col.prop(rl, "use_pass_uv")
         col.prop(rl, "use_pass_object_index")
         col.prop(rl, "use_pass_material_index")
-        col.prop(rl, "use_pass_emit")
-        col.prop(rl, "use_pass_environment")
         col.prop(rl, "use_pass_ambient_occlusion")
         col.prop(rl, "use_pass_shadow")
 
@@ -227,7 +250,10 @@
         row.prop(rl, "use_pass_transmission_indirect", text="Indirect", toggle=True)
         row.prop(rl, "use_pass_transmission_color", text="Color", toggle=True)
 
+        col.prop(rl, "use_pass_emit", text="Emission")
+        col.prop(rl, "use_pass_environment")
 
+
 class Cycles_PT_post_processing(CyclesButtonsPanel, Panel):
     bl_label = "Post Processing"
     bl_options = {'DEFAULT_CLOSED'}

Modified: trunk/blender/intern/cycles/blender/blender_camera.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_camera.cpp	2012-04-30 12:44:43 UTC (rev 46113)
+++ trunk/blender/intern/cycles/blender/blender_camera.cpp	2012-04-30 12:49:26 UTC (rev 46114)
@@ -35,6 +35,7 @@
 	float ortho_scale;
 
 	float lens;
+	float shuttertime;
 
 	float aperturesize;
 	uint apertureblades;
@@ -64,6 +65,7 @@
 	bcam->sensor_width = 32.0f;
 	bcam->sensor_height = 18.0f;
 	bcam->sensor_fit = BlenderCamera::AUTO;
+	bcam->shuttertime = 1.0f;
 }
 
 static float blender_camera_focal_distance(BL::Object b_ob, BL::Camera b_camera)
@@ -132,6 +134,28 @@
 	}
 }
 
+static Transform blender_camera_matrix(const Transform& tfm, CameraType type)
+{
+	Transform result;
+
+	if(type == CAMERA_ENVIRONMENT) {
+		/* make it so environment camera needs to be pointed in the direction
+		   of the positive x-axis to match an environment texture, this way
+		   it is looking at the center of the texture */
+		result = tfm *
+			make_transform( 0.0f, -1.0f, 0.0f, 0.0f,
+			                0.0f,  0.0f, 1.0f, 0.0f,
+			               -1.0f,  0.0f, 0.0f, 0.0f,
+			                0.0f,  0.0f, 0.0f, 1.0f);
+	}
+	else {
+		/* note the blender camera points along the negative z-axis */
+		result = tfm * transform_scale(1.0f, 1.0f, -1.0f);
+	}
+
+	return transform_clear_scale(result);
+}
+
 static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int height)
 {
 	/* copy camera to compare later */
@@ -224,25 +248,12 @@
 	cam->bladesrotation = bcam->aperturerotation;
 
 	/* transform */
-	cam->matrix = bcam->matrix;
+	cam->matrix = blender_camera_matrix(bcam->matrix, bcam->type);
+	cam->motion.pre = cam->matrix;
+	cam->motion.post = cam->matrix;
+	cam->use_motion = false;
+	cam->shuttertime = bcam->shuttertime;
 
-	if(bcam->type == CAMERA_ENVIRONMENT) {
-		/* make it so environment camera needs to be pointed in the direction
-		   of the positive x-axis to match an environment texture, this way
-		   it is looking at the center of the texture */
-		cam->matrix = cam->matrix *
-			make_transform( 0.0f, -1.0f, 0.0f, 0.0f,
-			                0.0f,  0.0f, 1.0f, 0.0f,
-			               -1.0f,  0.0f, 0.0f, 0.0f,
-			                0.0f,  0.0f, 0.0f, 1.0f);
-	}
-	else {
-		/* note the blender camera points along the negative z-axis */
-		cam->matrix = cam->matrix * transform_scale(1.0f, 1.0f, -1.0f);
-	}
-
-	cam->matrix = transform_clear_scale(cam->matrix);
-
 	/* set update flag */
 	if(cam->modified(prevcam))
 		cam->tag_update();
@@ -260,6 +271,7 @@
 
 	bcam.pixelaspect.x = r.pixel_aspect_x();
 	bcam.pixelaspect.y = r.pixel_aspect_y();
+	bcam.shuttertime = r.motion_blur_shutter();
 
 	/* camera object */
 	BL::Object b_ob = b_scene.camera();
@@ -277,6 +289,23 @@
 	blender_camera_sync(cam, &bcam, width, height);
 }
 
+void BlenderSync::sync_camera_motion(BL::Object b_ob, int motion)
+{
+	Camera *cam = scene->camera;
+
+	Transform tfm = get_transform(b_ob.matrix_world());
+	tfm = blender_camera_matrix(tfm, cam->type);
+
+	if(tfm != cam->matrix) {
+		if(motion == -1)
+			cam->motion.pre = tfm;
+		else
+			cam->motion.post = tfm;
+
+		cam->use_motion = true;
+	}
+}
+
 /* Sync 3D View Camera */
 
 void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height)
@@ -288,6 +317,7 @@
 	bcam.nearclip = b_v3d.clip_start();
 	bcam.farclip = b_v3d.clip_end();
 	bcam.lens = b_v3d.lens();
+	bcam.shuttertime = b_scene.render().motion_blur_shutter();
 
 	if(b_rv3d.view_perspective() == BL::RegionView3D::view_perspective_CAMERA) {
 		/* camera view */

Modified: trunk/blender/intern/cycles/blender/blender_mesh.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_mesh.cpp	2012-04-30 12:44:43 UTC (rev 46113)
+++ trunk/blender/intern/cycles/blender/blender_mesh.cpp	2012-04-30 12:49:26 UTC (rev 46114)
@@ -33,30 +33,6 @@
 
 /* Find/Add */
 
-static bool mesh_need_attribute(Scene *scene, Mesh *mesh, Attribute::Standard std)
-{
-	if(std == Attribute::STD_NONE)
-		return false;
-
-	foreach(uint shader, mesh->used_shaders)
-		if(scene->shaders[shader]->attributes.find(std))
-			return true;
-	
-	return false;
-}
-
-static bool mesh_need_attribute(Scene *scene, Mesh *mesh, ustring name)
-{
-	if(name == ustring())
-		return false;
-
-	foreach(uint shader, mesh->used_shaders)
-		if(scene->shaders[shader]->attributes.find(name))
-			return true;
-	
-	return false;
-}
-
 static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<uint>& used_shaders)
 {
 	/* create vertices */
@@ -66,7 +42,7 @@
 		mesh->verts.push_back(get_float3(v->co()));
 
 	/* create vertex normals */
-	Attribute *attr_N = mesh->attributes.add(Attribute::STD_VERTEX_NORMAL);
+	Attribute *attr_N = mesh->attributes.add(ATTR_STD_VERTEX_NORMAL);
 	float3 *N = attr_N->data_float3();
 
 	for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v, ++N)
@@ -94,8 +70,8 @@
 	/* create generated coordinates. todo: we should actually get the orco
 	   coordinates from modifiers, for now we use texspace loc/size which
 	   is available in the api. */
-	if(mesh_need_attribute(scene, mesh, Attribute::STD_GENERATED)) {
-		Attribute *attr = mesh->attributes.add(Attribute::STD_GENERATED);
+	if(mesh->need_attribute(scene, ATTR_STD_GENERATED)) {
+		Attribute *attr = mesh->attributes.add(ATTR_STD_GENERATED);
 		float3 loc = get_float3(b_mesh.texspace_location());
 		float3 size = get_float3(b_mesh.texspace_size());
 
@@ -118,7 +94,7 @@
 		BL::Mesh::tessface_vertex_colors_iterator l;
 
 		for(b_mesh.tessface_vertex_colors.begin(l); l != b_mesh.tessface_vertex_colors.end(); ++l) {
-			if(!mesh_need_attribute(scene, mesh, ustring(l->name().c_str())))
+			if(!mesh->need_attribute(scene, ustring(l->name().c_str())))
 				continue;
 
 			Attribute *attr = mesh->attributes.add(
@@ -150,10 +126,10 @@
 		BL::Mesh::tessface_uv_textures_iterator l;
 
 		for(b_mesh.tessface_uv_textures.begin(l); l != b_mesh.tessface_uv_textures.end(); ++l) {
-			Attribute::Standard std = (l->active_render())? Attribute::STD_UV: Attribute::STD_NONE;
+			AttributeStandard std = (l->active_render())? ATTR_STD_UV: ATTR_STD_NONE;
 			ustring name = ustring(l->name().c_str());
 
-			if(!(mesh_need_attribute(scene, mesh, name) || mesh_need_attribute(scene, mesh, std)))
+			if(!(mesh->need_attribute(scene, name) || mesh->need_attribute(scene, std)))
 				continue;
 
 			Attribute *attr;
@@ -329,5 +305,38 @@
 	return mesh;
 }
 
+void BlenderSync::sync_mesh_motion(BL::Object b_ob, Mesh *mesh, int motion)
+{
+	/* todo: displacement, subdivision */
+	BL::ID b_ob_data = b_ob.data();
+	size_t size = mesh->verts.size();
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list