[Bf-blender-cvs] [de65131] openvdb: Fix/workarounds for a couple of crashes.

Kévin Dietrich noreply at git.blender.org
Sun Nov 13 21:44:10 CET 2016


Commit: de651318e60560dbf083ce0768ada3bd9cb0c119
Author: Kévin Dietrich
Date:   Sun Feb 21 08:35:20 2016 +0100
Branches: openvdb
https://developer.blender.org/rBde651318e60560dbf083ce0768ada3bd9cb0c119

Fix/workarounds for a couple of crashes.

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

M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/blender/blender_object.cpp
M	intern/cycles/blender/blender_volume.cpp
M	intern/cycles/kernel/kernel_volume.h
M	intern/cycles/render/attribute.cpp
M	intern/cycles/render/session.cpp

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

diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 9eb4626..d857067 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -809,7 +809,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
 				else
 					create_mesh(scene, mesh, b_mesh, used_shaders);
 
-				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)
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index 42def9c..2e1c0c0 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -382,7 +382,7 @@ Object *BlenderSync::sync_object(BL::Object& b_parent,
 		printf("object has sparse volume\n");
 		sync_volume(b_ob);
 	}
-	else {
+	/*else*/ {
 		/* mesh sync */
 		object->mesh = sync_mesh(b_ob, object_updated, hide_tris);
 	}
diff --git a/intern/cycles/blender/blender_volume.cpp b/intern/cycles/blender/blender_volume.cpp
index 889906e..ba21216 100644
--- a/intern/cycles/blender/blender_volume.cpp
+++ b/intern/cycles/blender/blender_volume.cpp
@@ -40,13 +40,16 @@ static Attribute *get_openvdb_attribute(Volume *volume, const string& filename,
 
 	if(value_type == "float") {
 		attr = volume->attributes.add(name, TypeDesc::TypeFloat, ATTR_ELEMENT_VOXEL);
+		fprintf(stderr, "Adding volume attribute: %s\n", name.string().c_str());
 	}
 	else if(value_type == "vec3s") {
 		if (grid->getMetadata< openvdb::TypedMetadata<bool> >("is_color")) {
 			attr = volume->attributes.add(name, TypeDesc::TypeColor, ATTR_ELEMENT_VOXEL);
+			fprintf(stderr, "Adding volume attribute: %s\n", name.string().c_str());
 		}
 		else {
 			attr = volume->attributes.add(name, TypeDesc::TypeVector, ATTR_ELEMENT_VOXEL);
+			fprintf(stderr, "Adding volume attribute: %s\n", name.string().c_str());
 		}
 	}
 
@@ -73,10 +76,15 @@ static void create_volume_attribute(BL::Object& b_ob,
 
 	Attribute *attr = get_openvdb_attribute(volume, filename, name);
 	VoxelAttribute *volume_data = attr->data_voxel();
+	int slot = volume_manager->add_volume(volume, filename, name.string());
+
+	if (!volume_data) {
+		fprintf(stderr, "Failed to create volume data!\n");
+	}
 
 	// TODO(kevin): add volume fields to the Volume*
 //	volume_data->manager = volume_manager;
-	volume_data->slot = volume_manager->add_volume(volume, filename, name.string());
+	volume_data->slot = slot;
 }
 
 static void create_volume_attributes(Scene *scene,
diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h
index 2e50d8d..054ccf6 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -219,14 +219,13 @@ ccl_device void kernel_volume_shadow_heterogeneous(KernelGlobals *kg, PathState
 	int v = 0;
 	float_volume *volume = kg->float_volumes[0];
 
-	for(; v < num_volumes; v++) {
+	for(; v < num_volumes; v++, volume++) {
 		if(volume->intersect(ray, NULL)) {
 			break;
 		}
-		volume++;
 	}
 
-	if(has_vdb_volume && /*v < num_volumes &&*/ volume->has_uniform_voxels()) {
+	if(has_vdb_volume && v < num_volumes && kg->float_volumes[v]->has_uniform_voxels()) {
 		/* TODO(kevin): this call should be moved out of here, all it does is
 		 * checking if we have an intersection with the boundbox of the volumue
 		 * which in most cases corresponds to the boundbox of the object that has
@@ -239,7 +238,7 @@ ccl_device void kernel_volume_shadow_heterogeneous(KernelGlobals *kg, PathState
 		 * containing active voxels. If we don't have any active node in the current
 		 * ray path (i.e. empty space) the ray march loop is not executed,
 		 * otherwise we loop through all leaves until the end of the volume. */
-		while(volume->march(&t, &t1)) {
+		while(kg->float_volumes[v]->march(&t, &t1)) {
 			int i = 0;
 
 			/* Perform small steps through the current leaf or tile. */
diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp
index b7de83d..4b2cd74 100644
--- a/intern/cycles/render/attribute.cpp
+++ b/intern/cycles/render/attribute.cpp
@@ -292,8 +292,10 @@ Attribute *AttributeSet::add(ustring name, TypeDesc type, AttributeElement eleme
 	/* this is weak .. */
 	if(triangle_mesh)
 		attr->reserve(triangle_mesh->verts.size(), triangle_mesh->triangles.size(), triangle_mesh->motion_steps, 0, 0, resize);
-	if(curve_mesh)
+	else if(curve_mesh)
 		attr->reserve(0, 0, curve_mesh->motion_steps, curve_mesh->curves.size(), curve_mesh->curve_keys.size(), resize);
+	else
+		attr->reserve(0, 0, 0, 0, 0, resize);
 	
 	return attr;
 }
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 762e49a..33b4079 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -630,11 +630,14 @@ DeviceRequestedFeatures Session::get_requested_device_features()
 	requested_features.use_camera_motion = scene->camera->use_motion;
 	foreach(Object *object, scene->objects) {
 		Mesh *mesh = object->mesh;
-		if(mesh->curves.size() > 0) {
-			requested_features.use_hair = true;
+		if(mesh) {
+			if(mesh->curves.size() > 0) {
+				requested_features.use_hair = true;
+			}
+			requested_features.use_object_motion |= mesh->use_motion_blur;
+			requested_features.use_camera_motion |= mesh->use_motion_blur;
 		}
-		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_motion;
 	}
 
 	BakeManager *bake_manager = scene->bake_manager;




More information about the Bf-blender-cvs mailing list