[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