diff options
-rw-r--r-- | intern/openvdb/intern/openvdb_dense_convert.cc | 24 | ||||
-rw-r--r-- | intern/openvdb/intern/openvdb_dense_convert.h | 45 | ||||
-rw-r--r-- | intern/openvdb/openvdb_capi.cc | 18 | ||||
-rw-r--r-- | intern/openvdb/openvdb_capi.h | 24 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/properties_physics_smoke.py | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pointcache.c | 54 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/smoke.c | 2 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_270.c | 18 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_smoke_types.h | 3 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_smoke.c | 8 |
10 files changed, 128 insertions, 70 deletions
diff --git a/intern/openvdb/intern/openvdb_dense_convert.cc b/intern/openvdb/intern/openvdb_dense_convert.cc index ef52408bd93..76fbbf88079 100644 --- a/intern/openvdb/intern/openvdb_dense_convert.cc +++ b/intern/openvdb/intern/openvdb_dense_convert.cc @@ -79,7 +79,8 @@ openvdb::GridBase *OpenVDB_export_vector_grid( const int res[3], float fluid_mat[4][4], openvdb::VecType vec_type, - const bool is_color, + const bool is_color, + const float clipping, const openvdb::FloatGrid *mask) { using namespace openvdb; @@ -92,15 +93,15 @@ openvdb::GridBase *OpenVDB_export_vector_grid( grid[0] = FloatGrid::create(0.0f); tools::Dense<const float, tools::LayoutXYZ> dense_grid_x(bbox, data_x); - tools::copyFromDense(dense_grid_x, grid[0]->tree(), TOLERANCE); + tools::copyFromDense(dense_grid_x, grid[0]->tree(), clipping); grid[1] = FloatGrid::create(0.0f); tools::Dense<const float, tools::LayoutXYZ> dense_grid_y(bbox, data_y); - tools::copyFromDense(dense_grid_y, grid[1]->tree(), TOLERANCE); + tools::copyFromDense(dense_grid_y, grid[1]->tree(), clipping); grid[2] = FloatGrid::create(0.0f); tools::Dense<const float, tools::LayoutXYZ> dense_grid_z(bbox, data_z); - tools::copyFromDense(dense_grid_z, grid[2]->tree(), TOLERANCE); + tools::copyFromDense(dense_grid_z, grid[2]->tree(), clipping); Vec3SGrid::Ptr vecgrid = Vec3SGrid::create(Vec3s(0.0f)); @@ -165,4 +166,19 @@ void OpenVDB_import_grid_vector( } } +openvdb::Name do_name_versionning(const openvdb::Name &name) +{ + openvdb::Name temp_name = name; + + if (temp_name.find("_low", temp_name.size() - 4, 4) == temp_name.size() - 4) { + return temp_name.replace(temp_name.size() - 4, 4, " low"); + } + + if (temp_name.find("_old", temp_name.size() - 4, 4) == temp_name.size() - 4) { + return temp_name.replace(temp_name.size() - 4, 4, " old"); + } + + return temp_name; +} + } /* namespace internal */ diff --git a/intern/openvdb/intern/openvdb_dense_convert.h b/intern/openvdb/intern/openvdb_dense_convert.h index 284fd1ceeae..e5e2965e708 100644 --- a/intern/openvdb/intern/openvdb_dense_convert.h +++ b/intern/openvdb/intern/openvdb_dense_convert.h @@ -36,10 +36,12 @@ #include <cstdio> -#define TOLERANCE 1e-3f - namespace internal { +/* Verify that the name does not correspond to the old format, in which case we + * need to replace the '_low' ending with ' low'. See T53802. */ +openvdb::Name do_name_versionning(const openvdb::Name &name); + openvdb::Mat4R convertMatrix(const float mat[4][4]); template <typename GridType, typename T> @@ -48,7 +50,8 @@ GridType *OpenVDB_export_grid( const openvdb::Name &name, const T *data, const int res[3], - float fluid_mat[4][4], + float fluid_mat[4][4], + const float clipping, const openvdb::FloatGrid *mask) { using namespace openvdb; @@ -60,7 +63,7 @@ GridType *OpenVDB_export_grid( typename GridType::Ptr grid = GridType::create(T(0)); tools::Dense<const T, openvdb::tools::LayoutXYZ> dense_grid(bbox, data); - tools::copyFromDense(dense_grid, grid->tree(), (T)TOLERANCE); + tools::copyFromDense(dense_grid, grid->tree(), static_cast<T>(clipping)); grid->setTransform(transform); @@ -87,13 +90,19 @@ void OpenVDB_import_grid( { using namespace openvdb; - if (!reader->hasGrid(name)) { - std::fprintf(stderr, "OpenVDB grid %s not found in file!\n", name.c_str()); - memset(*data, 0, sizeof(T) * res[0] * res[1] * res[2]); - return; + openvdb::Name temp_name = name; + + if (!reader->hasGrid(temp_name)) { + temp_name = do_name_versionning(temp_name); + + if (!reader->hasGrid(temp_name)) { + std::fprintf(stderr, "OpenVDB grid %s not found in file!\n", temp_name.c_str()); + memset(*data, 0, sizeof(T) * res[0] * res[1] * res[2]); + return; + } } - typename GridType::Ptr grid = gridPtrCast<GridType>(reader->getGrid(name)); + typename GridType::Ptr grid = gridPtrCast<GridType>(reader->getGrid(temp_name)); typename GridType::ConstAccessor acc = grid->getConstAccessor(); math::Coord xyz; @@ -109,15 +118,15 @@ void OpenVDB_import_grid( } } -openvdb::GridBase *OpenVDB_export_vector_grid( - OpenVDBWriter *writer, - const openvdb::Name &name, - const float *data_x, const float *data_y, const float *data_z, - const int res[3], - float fluid_mat[4][4], - openvdb::VecType vec_type, - const bool is_color, - const openvdb::FloatGrid *mask); +openvdb::GridBase *OpenVDB_export_vector_grid(OpenVDBWriter *writer, + const openvdb::Name &name, + const float *data_x, const float *data_y, const float *data_z, + const int res[3], + float fluid_mat[4][4], + openvdb::VecType vec_type, + const bool is_color, + const float clipping, + const openvdb::FloatGrid *mask); void OpenVDB_import_grid_vector( diff --git a/intern/openvdb/openvdb_capi.cc b/intern/openvdb/openvdb_capi.cc index ef4f8c8820f..1c8b51a23c4 100644 --- a/intern/openvdb/openvdb_capi.cc +++ b/intern/openvdb/openvdb_capi.cc @@ -39,7 +39,7 @@ int OpenVDB_getVersionHex() OpenVDBFloatGrid *OpenVDB_export_grid_fl( OpenVDBWriter *writer, const char *name, float *data, - const int res[3], float matrix[4][4], + const int res[3], float matrix[4][4], const float clipping, OpenVDBFloatGrid *mask) { Timer(__func__); @@ -53,6 +53,7 @@ OpenVDBFloatGrid *OpenVDB_export_grid_fl( data, res, matrix, + clipping, mask_grid); return reinterpret_cast<OpenVDBFloatGrid *>(grid); @@ -61,7 +62,7 @@ OpenVDBFloatGrid *OpenVDB_export_grid_fl( OpenVDBIntGrid *OpenVDB_export_grid_ch( OpenVDBWriter *writer, const char *name, unsigned char *data, - const int res[3], float matrix[4][4], + const int res[3], float matrix[4][4], const float clipping, OpenVDBFloatGrid *mask) { Timer(__func__); @@ -76,17 +77,17 @@ OpenVDBIntGrid *OpenVDB_export_grid_ch( data, res, matrix, + clipping, mask_grid); return reinterpret_cast<OpenVDBIntGrid *>(grid); } -OpenVDBVectorGrid *OpenVDB_export_grid_vec( - struct OpenVDBWriter *writer, - const char *name, - const float *data_x, const float *data_y, const float *data_z, - const int res[3], float matrix[4][4], short vec_type, - const bool is_color, OpenVDBFloatGrid *mask) +OpenVDBVectorGrid *OpenVDB_export_grid_vec(struct OpenVDBWriter *writer, + const char *name, + const float *data_x, const float *data_y, const float *data_z, + const int res[3], float matrix[4][4], short vec_type, const float clipping, + const bool is_color, OpenVDBFloatGrid *mask) { Timer(__func__); @@ -105,6 +106,7 @@ OpenVDBVectorGrid *OpenVDB_export_grid_vec( matrix, static_cast<VecType>(vec_type), is_color, + clipping, mask_grid); return reinterpret_cast<OpenVDBVectorGrid *>(grid); diff --git a/intern/openvdb/openvdb_capi.h b/intern/openvdb/openvdb_capi.h index 2d2feeadcf1..fe7af82769b 100644 --- a/intern/openvdb/openvdb_capi.h +++ b/intern/openvdb/openvdb_capi.h @@ -49,22 +49,20 @@ enum { struct OpenVDBFloatGrid *OpenVDB_export_grid_fl( struct OpenVDBWriter *writer, const char *name, float *data, - const int res[3], float matrix[4][4], + const int res[3], float matrix[4][4], const float clipping, struct OpenVDBFloatGrid *mask); -struct OpenVDBIntGrid *OpenVDB_export_grid_ch( - struct OpenVDBWriter *writer, - const char *name, unsigned char *data, - const int res[3], float matrix[4][4], - struct OpenVDBFloatGrid *mask); +struct OpenVDBIntGrid *OpenVDB_export_grid_ch(struct OpenVDBWriter *writer, + const char *name, unsigned char *data, + const int res[3], float matrix[4][4], const float clipping, + struct OpenVDBFloatGrid *mask); -struct OpenVDBVectorGrid *OpenVDB_export_grid_vec( - struct OpenVDBWriter *writer, - const char *name, - const float *data_x, const float *data_y, const float *data_z, - const int res[3], float matrix[4][4], short vec_type, - const bool is_color, - struct OpenVDBFloatGrid *mask); +struct OpenVDBVectorGrid *OpenVDB_export_grid_vec(struct OpenVDBWriter *writer, + const char *name, + const float *data_x, const float *data_y, const float *data_z, + const int res[3], float matrix[4][4], short vec_type, const float clipping, + const bool is_color, + struct OpenVDBFloatGrid *mask); void OpenVDB_import_grid_fl( struct OpenVDBReader *reader, diff --git a/release/scripts/startup/bl_ui/properties_physics_smoke.py b/release/scripts/startup/bl_ui/properties_physics_smoke.py index 5cf89df63ab..d02bee3a0fa 100644 --- a/release/scripts/startup/bl_ui/properties_physics_smoke.py +++ b/release/scripts/startup/bl_ui/properties_physics_smoke.py @@ -68,6 +68,8 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel, Panel): col.prop(domain, "time_scale", text="Scale") col.label(text="Border Collisions:") col.prop(domain, "collision_extents", text="") + col.label(text="Empty Space:") + col.prop(domain, "clipping") col = split.column() col.label(text="Behavior:") diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index 169b1b10024..c8a2a8b5542 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -972,20 +972,20 @@ static int ptcache_smoke_openvdb_write(struct OpenVDBWriter *writer, void *smoke smoke_turbulence_export(sds->wt, &dens, &react, &flame, &fuel, &r, &g, &b, &tcu, &tcv, &tcw); - wt_density_grid = OpenVDB_export_grid_fl(writer, "density", dens, sds->res_wt, sds->fluidmat_wt, NULL); + wt_density_grid = OpenVDB_export_grid_fl(writer, "density", dens, sds->res_wt, sds->fluidmat_wt, sds->clipping, NULL); clip_grid = wt_density_grid; if (fluid_fields & SM_ACTIVE_FIRE) { - OpenVDB_export_grid_fl(writer, "flame", flame, sds->res_wt, sds->fluidmat_wt, wt_density_grid); - OpenVDB_export_grid_fl(writer, "fuel", fuel, sds->res_wt, sds->fluidmat_wt, wt_density_grid); - OpenVDB_export_grid_fl(writer, "react", react, sds->res_wt, sds->fluidmat_wt, wt_density_grid); + OpenVDB_export_grid_fl(writer, "flame", flame, sds->res_wt, sds->fluidmat_wt, sds->clipping, wt_density_grid); + OpenVDB_export_grid_fl(writer, "fuel", fuel, sds->res_wt, sds->fluidmat_wt, sds->clipping, wt_density_grid); + OpenVDB_export_grid_fl(writer, "react", react, sds->res_wt, sds->fluidmat_wt, sds->clipping, wt_density_grid); } if (fluid_fields & SM_ACTIVE_COLORS) { - OpenVDB_export_grid_vec(writer, "color", r, g, b, sds->res_wt, sds->fluidmat_wt, VEC_INVARIANT, true, wt_density_grid); + OpenVDB_export_grid_vec(writer, "color", r, g, b, sds->res_wt, sds->fluidmat_wt, VEC_INVARIANT, true, sds->clipping, wt_density_grid); } - OpenVDB_export_grid_vec(writer, "texture coordinates", tcu, tcv, tcw, sds->res, sds->fluidmat, VEC_INVARIANT, false, wt_density_grid); + OpenVDB_export_grid_vec(writer, "texture coordinates", tcu, tcv, tcw, sds->res, sds->fluidmat, VEC_INVARIANT, false, sds->clipping, wt_density_grid); } if (sds->fluid) { @@ -999,33 +999,33 @@ static int ptcache_smoke_openvdb_write(struct OpenVDBWriter *writer, void *smoke OpenVDBWriter_add_meta_fl(writer, "blender/smoke/dx", dx); OpenVDBWriter_add_meta_fl(writer, "blender/smoke/dt", dt); - const char *name = (!sds->wt) ? "density" : "density low"; - density_grid = OpenVDB_export_grid_fl(writer, name, dens, sds->res, sds->fluidmat, NULL); + const char *name = (!sds->wt) ? "density" : "density_low"; + density_grid = OpenVDB_export_grid_fl(writer, name, dens, sds->res, sds->fluidmat, sds->clipping, NULL); clip_grid = sds->wt ? clip_grid : density_grid; - OpenVDB_export_grid_fl(writer, "shadow", sds->shadow, sds->res, sds->fluidmat, NULL); + OpenVDB_export_grid_fl(writer, "shadow", sds->shadow, sds->res, sds->fluidmat, sds->clipping, NULL); if (fluid_fields & SM_ACTIVE_HEAT) { - OpenVDB_export_grid_fl(writer, "heat", heat, sds->res, sds->fluidmat, clip_grid); - OpenVDB_export_grid_fl(writer, "heat old", heatold, sds->res, sds->fluidmat, clip_grid); + OpenVDB_export_grid_fl(writer, "heat", heat, sds->res, sds->fluidmat, sds->clipping, clip_grid); + OpenVDB_export_grid_fl(writer, "heat_old", heatold, sds->res, sds->fluidmat, sds->clipping, clip_grid); } if (fluid_fields & SM_ACTIVE_FIRE) { - name = (!sds->wt) ? "flame" : "flame low"; - OpenVDB_export_grid_fl(writer, name, flame, sds->res, sds->fluidmat, density_grid); - name = (!sds->wt) ? "fuel" : "fuel low"; - OpenVDB_export_grid_fl(writer, name, fuel, sds->res, sds->fluidmat, density_grid); - name = (!sds->wt) ? "react" : "react low"; - OpenVDB_export_grid_fl(writer, name, react, sds->res, sds->fluidmat, density_grid); + name = (!sds->wt) ? "flame" : "flame_low"; + OpenVDB_export_grid_fl(writer, name, flame, sds->res, sds->fluidmat, sds->clipping, density_grid); + name = (!sds->wt) ? "fuel" : "fuel_low"; + OpenVDB_export_grid_fl(writer, name, fuel, sds->res, sds->fluidmat, sds->clipping, density_grid); + name = (!sds->wt) ? "react" : "react_low"; + OpenVDB_export_grid_fl(writer, name, react, sds->res, sds->fluidmat, sds->clipping, density_grid); } if (fluid_fields & SM_ACTIVE_COLORS) { - name = (!sds->wt) ? "color" : "color low"; - OpenVDB_export_grid_vec(writer, name, r, g, b, sds->res, sds->fluidmat, VEC_INVARIANT, true, density_grid); + name = (!sds->wt) ? "color" : "color_low"; + OpenVDB_export_grid_vec(writer, name, r, g, b, sds->res, sds->fluidmat, VEC_INVARIANT, true, sds->clipping, density_grid); } - OpenVDB_export_grid_vec(writer, "velocity", vx, vy, vz, sds->res, sds->fluidmat, VEC_CONTRAVARIANT_RELATIVE, false, clip_grid); - OpenVDB_export_grid_ch(writer, "obstacles", obstacles, sds->res, sds->fluidmat, NULL); + OpenVDB_export_grid_vec(writer, "velocity", vx, vy, vz, sds->res, sds->fluidmat, VEC_CONTRAVARIANT_RELATIVE, false, sds->clipping, clip_grid); + OpenVDB_export_grid_ch(writer, "obstacles", obstacles, sds->res, sds->fluidmat, sds->clipping, NULL); } return 1; @@ -1104,25 +1104,25 @@ static int ptcache_smoke_openvdb_read(struct OpenVDBReader *reader, void *smoke_ OpenVDB_import_grid_fl(reader, "shadow", &sds->shadow, sds->res); - const char *name = (!sds->wt) ? "density" : "density low"; + const char *name = (!sds->wt) ? "density" : "density_low"; OpenVDB_import_grid_fl(reader, name, &dens, sds->res); if (cache_fields & SM_ACTIVE_HEAT) { OpenVDB_import_grid_fl(reader, "heat", &heat, sds->res); - OpenVDB_import_grid_fl(reader, "heat old", &heatold, sds->res); + OpenVDB_import_grid_fl(reader, "heat_old", &heatold, sds->res); } if (cache_fields & SM_ACTIVE_FIRE) { - name = (!sds->wt) ? "flame" : "flame low"; + name = (!sds->wt) ? "flame" : "flame_low"; OpenVDB_import_grid_fl(reader, name, &flame, sds->res); - name = (!sds->wt) ? "fuel" : "fuel low"; + name = (!sds->wt) ? "fuel" : "fuel_low"; OpenVDB_import_grid_fl(reader, name, &fuel, sds->res); - name = (!sds->wt) ? "react" : "react low"; + name = (!sds->wt) ? "react" : "react_low"; OpenVDB_import_grid_fl(reader, name, &react, sds->res); } if (cache_fields & SM_ACTIVE_COLORS) { - name = (!sds->wt) ? "color" : "color low"; + name = (!sds->wt) ? "color" : "color_low"; OpenVDB_import_grid_vec(reader, name, &r, &g, &b, sds->res); } diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index d170459844d..6fec55200d6 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -553,6 +553,8 @@ void smokeModifier_createType(struct SmokeModifierData *smd) smd->domain->coba = NULL; smd->domain->coba_field = FLUID_FIELD_DENSITY; + + smd->domain->clipping = 1e-3f; } else if (smd->type & MOD_SMOKE_TYPE_FLOW) { diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c index 044c47847be..bd4e4c2e35c 100644 --- a/source/blender/blenloader/intern/versioning_270.c +++ b/source/blender/blenloader/intern/versioning_270.c @@ -1756,6 +1756,24 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main) } } + if (!MAIN_VERSION_ATLEAST(main, 279, 3)) { + if (!DNA_struct_elem_find(fd->filesdna, "SmokeDomainSettings", "float", "clipping")) { + Object *ob; + ModifierData *md; + + for (ob = main->object.first; ob; ob = ob->id.next) { + for (md = ob->modifiers.first; md; md = md->next) { + if (md->type == eModifierType_Smoke) { + SmokeModifierData *smd = (SmokeModifierData *)md; + if (smd->domain) { + smd->domain->clipping = 1e-3f; + } + } + } + } + } + } + { /* Fix for invalid state of screen due to bug in older versions. */ for (bScreen *sc = main->screen.first; sc; sc = sc->id.next) { diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h index 9932e16e988..c1565bde882 100644 --- a/source/blender/makesdna/DNA_smoke_types.h +++ b/source/blender/makesdna/DNA_smoke_types.h @@ -217,6 +217,9 @@ typedef struct SmokeDomainSettings { char use_coba; char coba_field; /* simulation field used for the color mapping */ char pad2; + + float clipping; + float pad3; } SmokeDomainSettings; diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c index 92c0ef6fa19..a49c71fc54b 100644 --- a/source/blender/makesrna/intern/rna_smoke.c +++ b/source/blender/makesrna/intern/rna_smoke.c @@ -900,6 +900,14 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna) RNA_def_property_struct_type(prop, "ColorRamp"); RNA_def_property_ui_text(prop, "Color Ramp", ""); RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL); + + prop = RNA_def_property(srna, "clipping", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "clipping"); + RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_ui_range(prop, 0.0, 1.0, 0.1, 3); + RNA_def_property_ui_text(prop, "Clipping", + "Value under which voxels are considered empty space to optimize caching or rendering"); + RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL); } static void rna_def_smoke_flow_settings(BlenderRNA *brna) |