[Bf-blender-cvs] [f4ec58f] openvdb: Merge branch 'master' into cvdb_ray_isect

Lukas Tönne noreply at git.blender.org
Sun Nov 13 21:44:43 CET 2016


Commit: f4ec58f465aa2a655270fa8d0a3fcc8d13e72dfb
Author: Lukas Tönne
Date:   Wed Nov 9 12:01:30 2016 +0100
Branches: openvdb
https://developer.blender.org/rBf4ec58f465aa2a655270fa8d0a3fcc8d13e72dfb

Merge branch 'master' into cvdb_ray_isect

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



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

diff --cc intern/cycles/CMakeLists.txt
index f8a4563,97854a8..cf0248b
--- a/intern/cycles/CMakeLists.txt
+++ b/intern/cycles/CMakeLists.txt
@@@ -146,15 -146,14 +146,23 @@@ if(WITH_CYCLES_OSL
  	)
  endif()
  
+ if(WITH_CYCLES_OPENSUBDIV)
+ 	add_definitions(-DWITH_OPENSUBDIV)
+ 	include_directories(
+ 		SYSTEM
+ 		${OPENSUBDIV_INCLUDE_DIR}
+ 	)
+ endif()
+ 
 +if(WITH_OPENVDB)
 +	add_definitions(-DWITH_OPENVDB)
 +	add_definitions(-DDWREAL_IS_DOUBLE=0)
 +	add_definitions(-DTBB_USE_EXCEPTIONS=0)
 +	include_directories(
 +		${OPENVDB_INCLUDE_DIRS}
 +	)
 +endif()
 +
  set(WITH_CYCLES_DEVICE_OPENCL TRUE)
  set(WITH_CYCLES_DEVICE_CUDA TRUE)
  set(WITH_CYCLES_DEVICE_MULTI TRUE)
diff --cc intern/cycles/blender/blender_mesh.cpp
index 3ff447f,fab03c7..b95365d
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@@ -821,16 -965,16 +965,16 @@@ 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"))
- 					create_subd_mesh(scene, mesh, b_ob, b_mesh, &cmesh, used_shaders,
+ 				if(mesh->subdivision_type != Mesh::SUBDIVISION_NONE)
+ 					create_subd_mesh(scene, mesh, b_ob, b_mesh, used_shaders,
  					                 dicing_rate, max_subdivisions);
  				else
- 					create_mesh(scene, mesh, b_mesh, used_shaders);
+ 					create_mesh(scene, mesh, b_mesh, used_shaders, false);
  
 -				create_mesh_volume_attributes(scene, b_ob, mesh, b_scene.frame_current());
 +				//create_mesh_volume_attributes(scene, b_ob, mesh, b_scene.frame_current());
  			}
  
- 			if(render_layer.use_hair)
+ 			if(render_layer.use_hair && mesh->subdivision_type == Mesh::SUBDIVISION_NONE)
  				sync_curves(mesh, b_mesh, b_ob, false);
  
  			if(can_free_caches) {
diff --cc intern/cycles/blender/blender_shader.cpp
index 6b7456b,f63f94a..ecabd40
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@@ -836,37 -845,11 +845,39 @@@ static ShaderNode *add_node(Scene *scen
  			        transform_inverse(get_transform(b_ob.matrix_world()));
  		}
  	}
 +	else if(b_node.is_a(&RNA_ShaderNodeOpenVDB)) {
 +		BL::ShaderNodeOpenVDB b_vdb_node(b_node);
 +		OpenVDBNode *vdb_node = new OpenVDBNode();
 +		vdb_node->filename = b_vdb_node.filename();
 +		vdb_node->sampling = b_vdb_node.sampling();
 +
 +		/* TODO(kevin) */
 +		if(b_vdb_node.source() == BL::ShaderNodeOpenVDB::source_SEQUENCE) {
 +			string filename = b_vdb_node.filename();
 +			string basename = filename.substr(0, filename.size() - 8);
 +			stringstream ss;
 +			ss << b_scene.frame_current();
 +			string frame = ss.str();
 +			frame.insert(frame.begin(), 4 - frame.size(), '0');
 +
 +			vdb_node->filename = ustring::format("%s%s.vdb", basename, frame);
 +		}
 +
 +		BL::Node::outputs_iterator b_output;
 +
 +		for(b_vdb_node.outputs.begin(b_output); b_output != b_vdb_node.outputs.end(); ++b_output) {
 +			vdb_node->output_names.push_back(ustring(b_output->name()));
 +			vdb_node->add_output(vdb_node->output_names.back(),
 +			                     convert_socket_type(*b_output));
 +		}
 +
 +		node = vdb_node;
 +	}
  
- 	if(node)
+ 	if(node) {
+ 		node->name = b_node.name();
  		graph->add(node);
+ 	}
  
  	return node;
  }
diff --cc intern/cycles/kernel/CMakeLists.txt
index 74ed36e,694f19a..7a9b828
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@@ -139,8 -143,8 +143,9 @@@ set(SRC_SVM_HEADER
  	svm/svm_noise.h
  	svm/svm_noisetex.h
  	svm/svm_normal.h
 +	svm/svm_openvdb.h
  	svm/svm_ramp.h
+ 	svm/svm_ramp_util.h
  	svm/svm_sepcomb_hsv.h
  	svm/svm_sepcomb_vector.h
  	svm/svm_sky.h
diff --cc intern/cycles/kernel/bvh/bvh_volume_all.h
index 5cf00b3,529848e..c5a3bf3
--- a/intern/cycles/kernel/bvh/bvh_volume_all.h
+++ b/intern/cycles/kernel/bvh/bvh_volume_all.h
@@@ -94,35 -99,8 +99,35 @@@ uint BVH_FUNCTION_FULL_NAME(BVH)(Kernel
  	ssef tsplat(0.0f, 0.0f, -isect_t, -isect_t);
  
  	gen_idirsplat_swap(pn, shuf_identity, shuf_swap, idir, idirsplat, shufflexyz);
- #endif
+ #endif  /* __KERNEL_SSE2__ */
  
 +#if 1
 +	/* try to intersect with VDB volumes */
 +	int num_volumes = kernel_data.tables.num_volumes;
 +
 +	for(int i = 0; i < num_volumes; i++) {
 +		float t;
 +
 +		if(kg->float_volumes[i]->intersect(ray, &t)) {
 +			isect_array->type = PRIMITIVE_VOLUME;
 +			isect_array->prim = i;
 +			isect_array->t = t;
 +			isect_array->u = 1.0f;
 +			isect_array->v = 1.0f;
 +			isect_array++;
 +			num_hits++;
 +
 +			if(num_hits == max_hits) {
 +				return num_hits;
 +			}
 +		}
 +	}
 +
 +	if(num_hits > 0) {
 +		return num_hits;
 +	}
 +#endif
 +
  	IsectPrecalc isect_precalc;
  	triangle_intersect_precalc(dir, &isect_precalc);
  
diff --cc intern/cycles/kernel/geom/geom_volume.h
index 165fc12,03724c95..8274d19
--- a/intern/cycles/kernel/geom/geom_volume.h
+++ b/intern/cycles/kernel/geom/geom_volume.h
@@@ -61,25 -62,25 +62,27 @@@ ccl_device_inline float3 volume_normali
  	return P;
  }
  
- ccl_device float volume_attribute_float(KernelGlobals *kg, const ShaderData *sd, AttributeElement elem, int id, float *dx, float *dy)
+ ccl_device float volume_attribute_float(KernelGlobals *kg, const ShaderData *sd, const AttributeDescriptor desc, float *dx, float *dy)
  {
- 	float3 P = volume_normalized_position(kg, sd, sd->P);
- #ifdef __KERNEL_GPU__
+ 	float3 P = volume_normalized_position(kg, sd, ccl_fetch(sd, P));
+ #ifdef __KERNEL_CUDA__
  #  if __CUDA_ARCH__ >= 300
- 	CUtexObject tex = kernel_tex_fetch(__bindless_mapping, id);
+ 	CUtexObject tex = kernel_tex_fetch(__bindless_mapping, desc.offset);
  	float f = kernel_tex_image_interp_3d_float(tex, P.x, P.y, P.z);
- 	float4 r = make_float4(f, f, f, 1.0);
+ 	float4 r = make_float4(f, f, f, 1.0f);
  #  else
- 	float4 r = volume_image_texture_3d(id, P.x, P.y, P.z);
+ 	float4 r = volume_image_texture_3d(desc.offset, P.x, P.y, P.z);
  #  endif
+ #elif defined(__KERNEL_OPENCL__)
+ 	float4 r = kernel_tex_image_interp_3d(kg, desc.offset, P.x, P.y, P.z);
  #else
  	float4 r;
 -	if(sd->flag & SD_VOLUME_CUBIC)
 -		r = kernel_tex_image_interp_3d_ex(desc.offset, P.x, P.y, P.z, INTERPOLATION_CUBIC);
 -	else
 -		r = kernel_tex_image_interp_3d(desc.offset, P.x, P.y, P.z);
 +//	if(sd->flag & SD_VOLUME_CUBIC)
- //		r = kernel_tex_image_interp_3d_ex(id, P.x, P.y, P.z, INTERPOLATION_CUBIC);
++//		r = kernel_tex_image_interp_3d_ex(desc.offset, P.x, P.y, P.z, INTERPOLATION_CUBIC);
 +//	else
- //		r = kernel_tex_image_interp_3d(id, P.x, P.y, P.z);
++//		r = kernel_tex_image_interp_3d(desc.offset, P.x, P.y, P.z);
 +
- 	return kernel_tex_voxel_float(id, P.x, P.y, P.z, OPENVDB_SAMPLE_POINT);
++	return kernel_tex_voxel_float(desc.offset, P.x, P.y, P.z, OPENVDB_SAMPLE_POINT);
  #endif
  
  	if(dx) *dx = 0.0f;
diff --cc intern/cycles/kernel/kernel_types.h
index fe4de64,91b8661..ad5b138
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@@ -559,7 -552,8 +555,9 @@@ typedef enum PrimitiveType 
  	PRIMITIVE_MOTION_TRIANGLE = 2,
  	PRIMITIVE_CURVE = 4,
  	PRIMITIVE_MOTION_CURVE = 8,
- 	PRIMITIVE_VOLUME = 16,
+ 	/* Lamp primitive is not included below on purpose, since it is no real traceable primitive */
+ 	PRIMITIVE_LAMP = 16,
++	PRIMITIVE_VOLUME = 32,
  
  	PRIMITIVE_ALL_TRIANGLE = (PRIMITIVE_TRIANGLE|PRIMITIVE_MOTION_TRIANGLE),
  	PRIMITIVE_ALL_CURVE = (PRIMITIVE_CURVE|PRIMITIVE_MOTION_CURVE),
@@@ -1148,9 -1162,9 +1167,10 @@@ static_assert_align(KernelCurves, 16)
  
  typedef struct KernelTables {
  	int beckmann_offset;
 -	int pad1, pad2, pad3;
 +	int num_volumes;
 +	int density_index, pad2;
  } KernelTables;
+ static_assert_align(KernelTables, 16);
  
  typedef struct KernelData {
  	KernelCamera cam;
diff --cc intern/cycles/kernel/svm/svm_types.h
index f4f1a81,5adf7d3..9867390
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@@ -127,7 -130,8 +130,9 @@@ typedef enum ShaderNodeType 
  	NODE_HAIR_INFO,
  	NODE_UVMAP,
  	NODE_TEX_VOXEL,
+ 	NODE_ENTER_BUMP_EVAL,
+ 	NODE_LEAVE_BUMP_EVAL,
 +	NODE_OPENVDB,
  } ShaderNodeType;
  
  typedef enum NodeAttributeType {
diff --cc intern/cycles/render/attribute.cpp
index cbe1bb4,c0d429a..e2d09fd
--- a/intern/cycles/render/attribute.cpp
+++ b/intern/cycles/render/attribute.cpp
@@@ -291,12 -343,12 +343,12 @@@ Attribute *AttributeSet::add(ustring na
  
  	/* this is weak .. */
  	if(triangle_mesh)
- 		attr->resize(triangle_mesh->verts.size(), triangle_mesh->num_triangles(), triangle_mesh->motion_steps, 0, 0, false);
+ 		attr->resize(triangle_mesh, ATTR_PRIM_TRIANGLE, false);
 -	if(curve_mesh)
 +	else if(curve_mesh)
- 		attr->resize(0, 0, curve_mesh->motion_steps, curve_mesh->num_curves(), curve_mesh->curve_keys.size(), false);
- 	else
- 		attr->resize(0, 0, 0, 0, 0, false);
- 	
+ 		attr->resize(curve_mesh, ATTR_PRIM_CURVE, false);
 -	if(subd_mesh)
++	else if(subd_mesh)
+ 		attr->resize(subd_mesh, ATTR_PRIM_SUBD, false);
+ 
  	return attr;
  }
  
diff --cc intern/cycles/render/scene.h
index 4762d2b,8fec171..b55240a
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@@ -120,11 -123,10 +124,13 @@@ public
  	/* opencl images */
  	device_vector<uchar4> tex_image_byte4_packed;
  	device_vector<float4> tex_image_float4_packed;
+ 	device_vector<uchar> tex_image_byte_packed;
+ 	device_vector<float> tex_image_float_packed;
  	device_vector<uint4> tex_image_packed_info;
  
 +	/* volume */
 +	device_vector<uint> vol_shader;
 +
  	KernelData data;
  };
  
diff --cc intern/cycles/render/session.cpp
index bfa1add,9d8c9fe..6ea902f
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@@ -630,12 -630,16 +630,17 @@@ DeviceRequestedFeatures Session::get_re
  	requested_features.use_camera_motion = scene->camera->use_motion;
  	foreach(Object *object, scene->objects) {
  		Mesh *mesh = object->mesh;
 -		if(mesh->num_curves()) {
 -			requested_features.use_hair = true;
 +		if(mesh) {
 +			if(mesh->num_curves()) {
 +				requested_features.use_hair = true;
 +			}
  		}
 -		requested_features.use_object_motion |= object->use_motion | mesh->use_motion_blur;
 -		requested_features.use_camera_motion |= mesh->use_motion_blur;
 +		requested_features.use_object_motion |= object->use_m

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list