[Bf-blender-cvs] [98a620707f3] soc-2018-cycles-volumes: Cleanup; fix some bugs causing crashes.
Geraldine Chua
noreply at git.blender.org
Thu Jul 26 15:10:29 CEST 2018
Commit: 98a620707f3f57189d96b2b4abdb645c9e179ea5
Author: Geraldine Chua
Date: Thu Jul 26 21:03:58 2018 +0800
Branches: soc-2018-cycles-volumes
https://developer.blender.org/rB98a620707f3f57189d96b2b4abdb645c9e179ea5
Cleanup; fix some bugs causing crashes.
===================================================================
M intern/cycles/blender/blender_mesh.cpp
M intern/cycles/render/image.cpp
M intern/cycles/render/image.h
M intern/cycles/render/openvdb.cpp
M intern/cycles/render/openvdb.h
M intern/cycles/util/util_image_impl.h
M intern/cycles/util/util_sparse_grid.h
M intern/openvdb/openvdb_capi.cc
===================================================================
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index d8261d7d86d..8ed0e5232dc 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -324,29 +324,55 @@ static void mikk_compute_tangents(const BL::Mesh& b_mesh,
/* Create Volume Attribute */
-static void create_mesh_volume_attribute(BL::BlendData& b_data,
- BL::Object& b_ob,
- Mesh *mesh,
+static void create_mesh_volume_attribute(Mesh *mesh,
ImageManager *image_manager,
AttributeStandard std,
+ string filename,
+ void *builtin_data,
float frame)
{
- BL::SmokeDomainSettings b_domain = object_smoke_domain_find(b_ob);
-
- if(!b_domain)
- return;
+ ImageMetaData metadata;
- mesh->volume_isovalue = b_domain.clipping();
+ if(filename.empty()) {
+ /* Built-in smoke. */
+ filename = Attribute::standard_name(std);
+ }
+ else {
+ /* External VDB. */
+ metadata.grid_name = Attribute::standard_name(std);
+ }
Attribute *attr = mesh->attributes.add(std);
VoxelAttribute *volume_data = attr->data_voxel();
- bool animated = false;
- bool use_alpha = true;
- bool make_sparse = true;
+
+ volume_data->manager = image_manager;
+ volume_data->slot = image_manager->add_image(
+ filename,
+ builtin_data,
+ false,
+ frame,
+ INTERPOLATION_LINEAR,
+ EXTENSION_CLIP,
+ true,
+ true,
+ mesh->volume_isovalue,
+ metadata);
+}
+
+static void create_mesh_volume_attributes(Scene *scene,
+ BL::BlendData& b_data,
+ BL::Object& b_ob,
+ Mesh *mesh,
+ float frame)
+{
+ /* for smoke volume rendering */
+ BL::SmokeDomainSettings b_domain = object_smoke_domain_find(b_ob);
+
+ if(!b_domain)
+ return;
string filename;
void *builtin_data;
- ImageMetaData metadata;
if(b_domain.is_openvdb()) {
BL::ID b_id = b_ob.data();
@@ -354,46 +380,25 @@ static void create_mesh_volume_attribute(BL::BlendData& b_data,
b_id,
b_domain.openvdb_filepath());
builtin_data = NULL;
- metadata.grid_name = Attribute::standard_name(std);
}
else {
- filename = Attribute::standard_name(std);
builtin_data = b_ob.ptr.data;
}
- volume_data->manager = image_manager;
- volume_data->slot = image_manager->add_image(
- filename,
- builtin_data,
- animated,
- frame,
- INTERPOLATION_LINEAR,
- EXTENSION_CLIP,
- use_alpha,
- make_sparse,
- mesh->volume_isovalue,
- metadata);
-}
+ mesh->volume_isovalue = b_domain.clipping();
-static void create_mesh_volume_attributes(Scene *scene,
- BL::BlendData& b_data,
- BL::Object& b_ob,
- Mesh *mesh,
- float frame)
-{
- /* for smoke volume rendering */
if(mesh->need_attribute(scene, ATTR_STD_VOLUME_DENSITY))
- create_mesh_volume_attribute(b_data, b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_DENSITY, frame);
+ create_mesh_volume_attribute(mesh, scene->image_manager, ATTR_STD_VOLUME_DENSITY, filename, builtin_data, frame);
if(mesh->need_attribute(scene, ATTR_STD_VOLUME_COLOR))
- create_mesh_volume_attribute(b_data, b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_COLOR, frame);
+ create_mesh_volume_attribute(mesh, scene->image_manager, ATTR_STD_VOLUME_COLOR, filename, builtin_data, frame);
if(mesh->need_attribute(scene, ATTR_STD_VOLUME_FLAME))
- create_mesh_volume_attribute(b_data, b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_FLAME, frame);
+ create_mesh_volume_attribute(mesh, scene->image_manager, ATTR_STD_VOLUME_FLAME, filename, builtin_data, frame);
if(mesh->need_attribute(scene, ATTR_STD_VOLUME_HEAT))
- create_mesh_volume_attribute(b_data, b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_HEAT, frame);
+ create_mesh_volume_attribute(mesh, scene->image_manager, ATTR_STD_VOLUME_HEAT, filename, builtin_data, frame);
if(mesh->need_attribute(scene, ATTR_STD_VOLUME_TEMPERATURE))
- create_mesh_volume_attribute(b_data, b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_TEMPERATURE, frame);
+ create_mesh_volume_attribute(mesh, scene->image_manager, ATTR_STD_VOLUME_TEMPERATURE, filename, builtin_data, frame);
if(mesh->need_attribute(scene, ATTR_STD_VOLUME_VELOCITY))
- create_mesh_volume_attribute(b_data, b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_VELOCITY, frame);
+ create_mesh_volume_attribute(mesh, scene->image_manager, ATTR_STD_VOLUME_VELOCITY, filename, builtin_data, frame);
}
/* Create vertex color attributes. */
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 60f2f815c9f..13892db1364 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -275,6 +275,16 @@ string ImageManager::name_from_type(int type)
return "byte4";
}
+string ImageManager::name_from_grid_type(int type)
+{
+ if(type == IMAGE_GRID_TYPE_SPARSE)
+ return "sparse";
+ else if(type == IMAGE_GRID_TYPE_OPENVDB)
+ return "OpenVDB";
+ else
+ return "default";
+}
+
static bool image_equals(ImageManager::Image *image,
const string& filename,
void *builtin_data,
@@ -298,7 +308,7 @@ int ImageManager::add_image(const string& filename,
InterpolationType interpolation,
ExtensionType extension,
bool use_alpha,
- bool make_sparse,
+ bool is_volume,
float isovalue,
ImageMetaData& metadata)
{
@@ -379,7 +389,7 @@ int ImageManager::add_image(const string& filename,
img->extension = extension;
img->users = 1;
img->use_alpha = use_alpha;
- img->make_sparse = make_sparse;
+ img->is_volume = is_volume;
img->isovalue = isovalue;
img->mem = NULL;
@@ -622,35 +632,51 @@ void ImageManager::file_load_image(Device *device,
MEM_TEXTURE);
tex_img->grid_type = IMAGE_GRID_TYPE_DEFAULT;
- /* Try to retrieve an ImageInput for reading the image (or just get metadata). */
- const StorageType alpha_one = (FileFormat == TypeDesc::UINT8)? 255 : 1;
+ /* Try to retrieve an ImageInput for reading the image.
+ * Otherwise, retrieve metadata. */
ImageInput *in = NULL;
int width, height, depth, components;
if(!file_load_image_generic(img, &in, width, height, depth, components)) {
+ /* Could not retrieve image. */
file_load_failed<StorageType, DeviceType>(img, type, tex_img);
return;
}
- bool is_openvdb = string_endswith(img->filename, ".vdb");
+ size_t max_size = max(max(width, height), depth);
+ size_t num_pixels = ((size_t)width) * height * depth;
+ if(max_size == 0) {
+ /* Don't bother with invalid images. */
+ file_load_failed<StorageType, DeviceType>(img, type, tex_img);
+ return;
+ }
+
+ const bool is_rgba = (type == IMAGE_DATA_TYPE_FLOAT4 ||
+ type == IMAGE_DATA_TYPE_HALF4 ||
+ type == IMAGE_DATA_TYPE_BYTE4);
+ const bool is_extern_vdb = string_endswith(img->filename, ".vdb");
#ifdef WITH_OPENVDB
/* Load pointer to OpenVDB grid into texture if using CPU. */
- if(is_openvdb && device->info.type == DEVICE_CPU) {
- VLOG(1) << "Loading " << img->filename << ", Grid: " << img->grid_name;
+ if(is_extern_vdb && device->info.type == DEVICE_CPU && 0) {
+ VLOG(1) << "Loading external VDB " << img->filename
+ << ", Grid: " << img->grid_name;
+
device_memory *tex_vdb = NULL;
{
thread_scoped_lock device_lock(device_mutex);
- tex_vdb = openvdb_load_device(device,
- img->filename,
- img->grid_name,
- img->mem_name,
- img->interpolation,
- img->extension,
- type == IMAGE_DATA_TYPE_FLOAT4);
+ tex_vdb = openvdb_load_device_extern(device,
+ img->filename,
+ img->grid_name,
+ img->mem_name,
+ img->interpolation,
+ img->extension,
+ is_rgba);
}
+
if(tex_vdb) {
img->mem = tex_vdb;
delete tex_img;
+ tex_img = NULL;
}
else {
file_load_failed<StorageType, DeviceType>(img, type, tex_img);
@@ -661,19 +687,9 @@ void ImageManager::file_load_image(Device *device,
}
#endif
- /* Read RGBA pixels. */
- const size_t max_size = max(max(width, height), depth);
- if(max_size == 0) {
- /* Don't bother with invalid images. */
- file_load_failed<StorageType, DeviceType>(img, type, tex_img);
- return;
- }
-
/* Allocate storage for the image. */
vector<StorageType> pixels_storage;
StorageType *pixels;
- const size_t num_pixels = ((size_t)width) * height * depth;
-
if(texture_limit > 0 && max_size > texture_limit) {
pixels_storage.resize(num_pixels * 4);
pixels = &pixels_storage[0];
@@ -689,8 +705,7 @@ void ImageManager::file_load_image(Device *device,
return;
}
- bool cmyk = (in ? strcmp(in->format_name(), "jpeg") == 0 && components == 4 : false);
-
+ /* Read RGBA pixels. */
if(in) {
StorageType *readpixels = pixels;
vector<StorageType> tmppixels;
@@ -723,8 +738,9 @@ void ImageManager::file_load_image(Device *device,
delete in;
}
#ifdef WITH_OPENVDB
- else if(is_openvdb) {
- VLOG(1) << "Loading " << img->filename << ", Grid: " << img->grid_name;
+ else if(is_extern_vdb) {
+ VLOG(1) << "Loading external VDB " << img->filename
+ << ", Grid: " << img->grid_name;
openvdb_load_dense(img->filename, img->grid_name, (float*)pixels, c
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list