[Bf-blender-cvs] [08c20d8] temp-cycles-microdisplacement: Merge branch 'master' into microdisp

Mai Lavelle noreply at git.blender.org
Sun May 8 00:39:49 CEST 2016


Commit: 08c20d85158fdcd209651a1e596c67b5874d9f1f
Author: Mai Lavelle
Date:   Tue Apr 26 15:55:48 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB08c20d85158fdcd209651a1e596c67b5874d9f1f

Merge branch 'master' into microdisp

===================================================================



===================================================================

diff --cc intern/cycles/blender/blender_mesh.cpp
index cb8a362,1f0aa5e..081b315
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@@ -717,14 -661,15 +717,15 @@@ static void create_subd_mesh(Scene *sce
                               BL::Mesh& b_mesh,
                               PointerRNA *cmesh,
                               const vector<uint>& used_shaders,
-                              float dicing_rate)
+                              float dicing_rate,
+                              int max_subdivisions)
  {
 -	Mesh basemesh;
 -	create_mesh(scene, &basemesh, b_mesh, used_shaders);
 +	mesh->subdivision_type = (Mesh::SubdivisionType)RNA_enum_get(cmesh, "subdivision_type");
 +	create_mesh(scene, mesh, b_mesh, used_shaders, true);
  
 -	SubdParams sdparams(mesh, used_shaders[0], true, false);
 +	SubdParams sdparams;
  	sdparams.dicing_rate = max(0.1f, RNA_float_get(cmesh, "dicing_rate") * dicing_rate);
- 	sdparams.max_level = RNA_int_get(cmesh, "max_subdivision_level");
+ 	sdparams.max_level = max_subdivisions;
  
  	scene->camera->update();
  	sdparams.camera = scene->camera;
@@@ -842,10 -785,9 +843,11 @@@ Mesh *BlenderSync::sync_mesh(BL::Object
  
  		if(b_mesh) {
  			if(render_layer.use_surfaces && !hide_tris) {
 -				if(cmesh.data && experimental && RNA_enum_get(&cmesh, "subdivision_type"))
 +				mesh->displacement_scale = RNA_float_get(&cmesh, "displacement_scale");
 +
 +				if(cmesh.data && is_cpu && experimental && RNA_enum_get(&cmesh, "subdivision_type"))
- 					create_subd_mesh(scene, mesh, b_ob, b_mesh, &cmesh, used_shaders, dicing_rate);
+ 					create_subd_mesh(scene, mesh, b_ob, b_mesh, &cmesh, used_shaders,
+ 					                 dicing_rate, max_subdivisions);
  				else
  					create_mesh(scene, mesh, b_mesh, used_shaders);
  
diff --cc intern/cycles/render/mesh.cpp
index 82365b5,cc85192..2e852f0
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@@ -1350,12 -1235,8 +1350,12 @@@ void MeshManager::device_update(Device 
  	if(!need_update)
  		return;
  
+ 	VLOG(1) << "Total " << scene->meshes.size() << " meshes.";
+ 
 +	GeomCache* geom_cache = device->get_geom_cache();
 +	geom_cache_set_scene(geom_cache, scene);
 +	geom_cache_set_max_size(geom_cache, scene->params.geom_cache_max_size);
 +
  	/* update normals */
  	foreach(Mesh *mesh, scene->meshes) {
  		foreach(uint shader, mesh->used_shaders) {
diff --cc intern/cycles/render/object.cpp
index e2592b4,a7ea758..90409ca
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@@ -299,75 -278,194 +278,195 @@@ void ObjectManager::device_update_objec
  
  				surface_area += triangle_area(p1, p2, p3);
  			}
+ 
+ 			state->surface_area_lock.lock();
+ 			state->surface_area_map[mesh] = surface_area;
+ 			state->surface_area_lock.unlock();
+ 		}
+ 		else {
+ 			surface_area = it->second;
  		}
  
- 		/* pack in texture */
- 		int offset = i*OBJECT_SIZE;
- 
- 		/* OBJECT_TRANSFORM */
- 		memcpy(&objects[offset], &tfm, sizeof(float4)*3);
- 		/* OBJECT_INVERSE_TRANSFORM */
- 		memcpy(&objects[offset+4], &itfm, sizeof(float4)*3);
- 		/* OBJECT_PROPERTIES */
- 		objects[offset+8] = make_float4(surface_area, pass_id, random_number, __int_as_float(particle_index));
- 		objects[offset+9] = make_float4(mesh->displacement_scale, __int_as_float(mesh->displacement_method), 0, 0);
- 
- 		if(need_motion == Scene::MOTION_PASS) {
- 			/* motion transformations, is world/object space depending if mesh
- 			 * comes with deformed position in object space, or if we transform
- 			 * the shading point in world space */
- 			Transform mtfm_pre = ob->motion.pre;
- 			Transform mtfm_post = ob->motion.post;
- 
- 			if(!mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION)) {
- 				mtfm_pre = mtfm_pre * itfm;
- 				mtfm_post = mtfm_post * itfm;
- 			}
- 			else {
- 				flag |= SD_OBJECT_HAS_VERTEX_MOTION;
- 			}
+ 		surface_area *= uniform_scale;
+ 	}
+ 	else {
+ 		foreach(Mesh::Triangle& t, mesh->triangles) {
+ 			float3 p1 = transform_point(&tfm, mesh->verts[t.v[0]]);
+ 			float3 p2 = transform_point(&tfm, mesh->verts[t.v[1]]);
+ 			float3 p3 = transform_point(&tfm, mesh->verts[t.v[2]]);
+ 
+ 			surface_area += triangle_area(p1, p2, p3);
+ 		}
+ 	}
  
- 			memcpy(&objects_vector[i*OBJECT_VECTOR_SIZE+0], &mtfm_pre, sizeof(float4)*3);
- 			memcpy(&objects_vector[i*OBJECT_VECTOR_SIZE+3], &mtfm_post, sizeof(float4)*3);
+ 	/* Pack in texture. */
+ 	int offset = object_index*OBJECT_SIZE;
+ 
+ 	/* OBJECT_TRANSFORM */
+ 	memcpy(&objects[offset], &tfm, sizeof(float4)*3);
+ 	/* OBJECT_INVERSE_TRANSFORM */
+ 	memcpy(&objects[offset+4], &itfm, sizeof(float4)*3);
+ 	/* OBJECT_PROPERTIES */
+ 	objects[offset+8] = make_float4(surface_area, pass_id, random_number, __int_as_float(particle_index));
++	objects[offset+9] = make_float4(mesh->displacement_scale, __int_as_float(mesh->displacement_method), 0, 0);
+ 
+ 	if(state->need_motion == Scene::MOTION_PASS) {
+ 		/* Motion transformations, is world/object space depending if mesh
+ 		 * comes with deformed position in object space, or if we transform
+ 		 * the shading point in world space.
+ 		 */
+ 		Transform mtfm_pre = ob->motion.pre;
+ 		Transform mtfm_post = ob->motion.post;
+ 
+ 		if(!mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION)) {
+ 			mtfm_pre = mtfm_pre * itfm;
+ 			mtfm_post = mtfm_post * itfm;
  		}
+ 		else {
+ 			flag |= SD_OBJECT_HAS_VERTEX_MOTION;
+ 		}
+ 
+ 		memcpy(&objects_vector[object_index*OBJECT_VECTOR_SIZE+0], &mtfm_pre, sizeof(float4)*3);
+ 		memcpy(&objects_vector[object_index*OBJECT_VECTOR_SIZE+3], &mtfm_post, sizeof(float4)*3);
+ 	}
  #ifdef __OBJECT_MOTION__
- 		else if(need_motion == Scene::MOTION_BLUR) {
- 			if(ob->use_motion) {
- 				/* decompose transformations for interpolation */
- 				DecompMotionTransform decomp;
- 
- 				transform_motion_decompose(&decomp, &ob->motion, &ob->tfm);
- 				memcpy(&objects[offset], &decomp, sizeof(float4)*8);
- 				flag |= SD_OBJECT_MOTION;
- 				have_motion = true;
- 			}
+ 	else if(state->need_motion == Scene::MOTION_BLUR) {
+ 		if(ob->use_motion) {
+ 			/* decompose transformations for interpolation. */
+ 			DecompMotionTransform decomp;
+ 
+ 			transform_motion_decompose(&decomp, &ob->motion, &ob->tfm);
+ 			memcpy(&objects[offset], &decomp, sizeof(float4)*8);
+ 			flag |= SD_OBJECT_MOTION;
+ 			state->have_motion = true;
  		}
+ 	}
  #endif
  
- 		if(mesh->use_motion_blur)
- 			have_motion = true;
+ 	if(mesh->use_motion_blur) {
+ 		state->have_motion = true;
+ 	}
+ 
+ 	/* Dupli object coords and motion info. */
+ 	int totalsteps = mesh->motion_steps;
+ 	int numsteps = (totalsteps - 1)/2;
+ 	int numverts = mesh->verts.size();
+ 	int numkeys = mesh->curve_keys.size();
  
- 		/* dupli object coords and motion info */
- 		int totalsteps = mesh->motion_steps;
- 		int numsteps = (totalsteps - 1)/2;
- 		int numverts = mesh->verts.size();
- 		int numkeys = mesh->curve_keys.size();
 -	objects[offset+9] = make_float4(ob->dupli_generated[0], ob->dupli_generated[1], ob->dupli_generated[2], __int_as_float(numkeys));
 -	objects[offset+10] = make_float4(ob->dupli_uv[0], ob->dupli_uv[1], __int_as_float(numsteps), __int_as_float(numverts));
++	objects[offset+10] = make_float4(ob->dupli_generated[0], ob->dupli_generated[1], ob->dupli_generated[2], __int_as_float(numkeys));
++	objects[offset+11] = make_float4(ob->dupli_uv[0], ob->dupli_uv[1], __int_as_float(numsteps), __int_as_float(numverts));
+ 
+ 	/* Object flag. */
+ 	if(ob->use_holdout) {
+ 		flag |= SD_HOLDOUT_MASK;
+ 	}
+ 	state->object_flag[object_index] = flag;
+ 
+ 	/* Have curves. */
+ 	if(mesh->curves.size()) {
+ 		state->have_curves = true;
+ 	}
+ }
  
- 		objects[offset+10] = make_float4(ob->dupli_generated[0], ob->dupli_generated[1], ob->dupli_generated[2], __int_as_float(numkeys));
- 		objects[offset+11] = make_float4(ob->dupli_uv[0], ob->dupli_uv[1], __int_as_float(numsteps), __int_as_float(numverts));
+ bool ObjectManager::device_update_object_transform_pop_work(
+         UpdateObejctTransformState *state,
+         int *start_index,
+         int *num_objects)
+ {
+ 	/* Tweakable parameter, number of objects per chunk.
+ 	 * Too small value will cause some extra overhead due to spin lock,
+ 	 * too big value might not use all threads nicely.
+ 	 */
+ 	static const int OBJECTS_PER_TASK = 32;
+ 	bool have_work = false;
+ 	state->queue_lock.lock();
+ 	int num_scene_objects = state->scene->objects.size();
+ 	if(state->queue_start_object < num_scene_objects) {
+ 		int count = min(OBJECTS_PER_TASK,
+ 		                num_scene_objects - state->queue_start_object);
+ 		*start_index = state->queue_start_object;
+ 		*num_objects = count;
+ 		state->queue_start_object += count;
+ 		have_work = true;
+ 	}
+ 	state->queue_lock.unlock();
+ 	return have_work;
+ }
  
- 		/* object flag */
- 		if(ob->use_holdout)
- 			flag |= SD_HOLDOUT_MASK;
- 		object_flag[i] = flag;
+ void ObjectManager::device_update_object_transform_task(
+         UpdateObejctTransformState *state)
+ {
+ 	int start_index, num_objects;
+ 	while(device_update_object_transform_pop_work(state,
+ 	                                              &start_index,
+ 	                                              &num_objects))
+ 	{
+ 		for(int i = 0; i < num_objects; ++i) {
+ 			const int object_index = start_index + i;
+ 			Object *ob = state->scene->objects[object_index];
+ 			device_update_object_transform(state, ob, object_index);
+ 		}
+ 	}
+ }
  
- 		/* have curves */
- 		if(mesh->curves.size())
- 			have_curves = true;
+ void ObjectManager::device_update_transforms(Device *device,
+                                              DeviceScene *dscene,
+                                              Scene *scene,
+                                              uint *object_flag,
+                                              Progress& progress)
+ {
+ 	UpdateObejctTransformState state;
+ 	state.need_motion = scene->need_motion(device->info.advanced_shading);
+ 	state.have_motion = false;
+ 	state.have_curves = false;
+ 	state.scene = scene;
+ 	state.queue_start_object = 0;
+ 
+ 	state.object_flag = object_flag;
+ 	state.objects = dscene->objects.resize(OBJECT_SIZE*scene->objects.size());
+ 	if(state.need_motion =

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list