Commit: 1f50beb9f28edd2fe54d97647222ad6ee5808c1c Author: Jacques Lucke Date: Wed Oct 7 18:03:07 2020 +0200 Branches: master https://developer.blender.org/rB1f50beb9f28edd2fe54d97647222ad6ee5808c1c
Volumes: new Volume Displace modifier This modifier uses a 3D texture to displace a volume. For now, this can only use the previously existing texture system, because we do not have a better alternative yet. Still, the results can be quite good and interesting. See D9075 for some examples. Reviewers: brecht, simonthommes Differential Revision: https://developer.blender.org/D9075 =================================================================== M source/blender/makesdna/DNA_modifier_types.h M source/blender/makesrna/RNA_access.h M source/blender/makesrna/intern/rna_modifier.c M source/blender/modifiers/CMakeLists.txt M source/blender/modifiers/MOD_modifiertypes.h M source/blender/modifiers/intern/MOD_util.c A source/blender/modifiers/intern/MOD_volume_displace.cc =================================================================== diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index fa2f54c7aa0..3a3aa106dc0 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -96,6 +96,7 @@ typedef enum ModifierType { eModifierType_Fluid = 56, eModifierType_Simulation = 57, eModifierType_MeshToVolume = 58, + eModifierType_VolumeDisplace = 59, NUM_MODIFIER_TYPES, } ModifierType; @@ -2255,6 +2256,25 @@ typedef enum MeshToVolumeModifierResolutionMode { MESH_TO_VOLUME_RESOLUTION_MODE_VOXEL_SIZE = 1, } MeshToVolumeModifierResolutionMode; +typedef struct VolumeDisplaceModifierData { + ModifierData modifier; + + struct Tex *texture; + struct Object *texture_map_object; + int texture_map_mode; + + float strength; + float texture_mid_level[3]; + float texture_sample_radius; +} VolumeDisplaceModifierData; + +/* VolumeDisplaceModifierData->texture_map_mode */ +enum { + MOD_VOLUME_DISPLACE_MAP_LOCAL = 0, + MOD_VOLUME_DISPLACE_MAP_GLOBAL = 1, + MOD_VOLUME_DISPLACE_MAP_OBJECT = 2, +}; + #ifdef __cplusplus } #endif diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 1c2db53b12c..0b882742839 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -709,6 +709,7 @@ extern StructRNA RNA_View3DShading; extern StructRNA RNA_ViewLayer; extern StructRNA RNA_ViewLayerEEVEE; extern StructRNA RNA_Volume; +extern StructRNA RNA_VolumeDisplaceModifier; extern StructRNA RNA_VoronoiTexture; extern StructRNA RNA_WalkNavigation; extern StructRNA RNA_WarpModifier; diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 3fff2feb10d..766497d53c1 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -272,6 +272,11 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = { ICON_MOD_WAVE, "Wave", "Adds a ripple-like motion to an object’s geometry"}, + {eModifierType_VolumeDisplace, + "VOLUME_DISPLACE", + ICON_VOLUME_DATA, + "Volume Displace", + "Deform volume based on noise or other vector fields"}, /* TODO: Use correct icon. */ {0, "", 0, N_("Physics"), ""}, {eModifierType_Cloth, "CLOTH", ICON_MOD_CLOTH, "Cloth", ""}, {eModifierType_Collision, "COLLISION", ICON_MOD_PHYSICS, "Collision", ""}, @@ -7057,6 +7062,75 @@ static void rna_def_modifier_mesh_to_volume(BlenderRNA *brna) RNA_define_lib_overridable(false); } +static void rna_def_modifier_volume_displace(BlenderRNA *brna) +{ + static const EnumPropertyItem prop_texture_map_mode_items[] = { + {MOD_VOLUME_DISPLACE_MAP_LOCAL, + "LOCAL", + 0, + "Local", + "Use the local coordinate system for the texture coordinates"}, + {MOD_VOLUME_DISPLACE_MAP_GLOBAL, + "GLOBAL", + 0, + "Global", + "Use the global coordinate system for the texture coordinates"}, + {MOD_VOLUME_DISPLACE_MAP_OBJECT, + "OBJECT", + 0, + "Object", + "Use the linked object's local coordinate system for the texture coordinates"}, + {0, NULL, 0, NULL, NULL}, + }; + + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "VolumeDisplaceModifier", "Modifier"); + RNA_def_struct_ui_text(srna, "Volume Displace Modifier", ""); + RNA_def_struct_sdna(srna, "VolumeDisplaceModifierData"); + RNA_def_struct_ui_icon(srna, ICON_VOLUME_DATA); /* TODO: Use correct icon. */ + + RNA_define_lib_overridable(true); + + prop = RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_text(prop, "Strength", "Strength of the displacement"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop = RNA_def_property(srna, "texture", PROP_POINTER, PROP_NONE); + RNA_def_property_ui_text(prop, "Texture", ""); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); + + prop = RNA_def_property(srna, "texture_map_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, prop_texture_map_mode_items); + RNA_def_property_ui_text(prop, "Texture Mapping Mode", ""); + RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); + + prop = RNA_def_property(srna, "texture_map_object", PROP_POINTER, PROP_NONE); + RNA_def_property_ui_text(prop, "Object", "Object to use for texture mapping"); + RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); + RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); + + prop = RNA_def_property(srna, "texture_mid_level", PROP_FLOAT, PROP_XYZ); + RNA_def_property_ui_text( + prop, "Texture Mid Level", "Subtracted from the texture color to get a displacement vector"); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1f, 5); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop = RNA_def_property(srna, "texture_sample_radius", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_ui_text( + prop, + "Texture Sample Radius", + "Smaller values result in better performance but might cut off the volume"); + RNA_def_property_range(prop, 0.0f, FLT_MAX); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1f, 5); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + RNA_define_lib_overridable(false); +} + void RNA_def_modifier(BlenderRNA *brna) { StructRNA *srna; @@ -7189,6 +7263,7 @@ void RNA_def_modifier(BlenderRNA *brna) rna_def_modifier_simulation(brna); # endif rna_def_modifier_mesh_to_volume(brna); + rna_def_modifier_volume_displace(brna); } #endif diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index 37656ed7b60..f5786dc0701 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -101,6 +101,7 @@ set(SRC intern/MOD_util.c intern/MOD_uvproject.c intern/MOD_uvwarp.c + intern/MOD_volume_displace.cc intern/MOD_warp.c intern/MOD_wave.c intern/MOD_weighted_normal.c diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h index e12f91ff99b..6dc50e1b47d 100644 --- a/source/blender/modifiers/MOD_modifiertypes.h +++ b/source/blender/modifiers/MOD_modifiertypes.h @@ -87,6 +87,7 @@ extern ModifierTypeInfo modifierType_SurfaceDeform; extern ModifierTypeInfo modifierType_WeightedNormal; extern ModifierTypeInfo modifierType_Simulation; extern ModifierTypeInfo modifierType_MeshToVolume; +extern ModifierTypeInfo modifierType_VolumeDisplace; /* MOD_util.c */ void modifier_type_init(ModifierTypeInfo *types[]); diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c index 75436435e97..c1fdaa487b5 100644 --- a/source/blender/modifiers/intern/MOD_util.c +++ b/source/blender/modifiers/intern/MOD_util.c @@ -344,5 +344,6 @@ void modifier_type_init(ModifierTypeInfo *types[]) INIT_TYPE(WeightedNormal); INIT_TYPE(Simulation); INIT_TYPE(MeshToVolume); + INIT_TYPE(VolumeDisplace); #undef INIT_TYPE } diff --git a/source/blender/modifiers/intern/MOD_volume_displace.cc b/source/blender/modifiers/intern/MOD_volume_displace.cc new file mode 100644 index 00000000000..89b5a604d58 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_volume_displace.cc @@ -0,0 +1,345 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** \file + * \ingroup modifiers + */ + +#include "BKE_lib_query.h" +#include "BKE_mesh_runtime.h" +#include "BKE_modifier.h" +#include "BKE_object.h" +#include "BKE_texture.h" +#include "BKE_volume.h" + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" +#include "DNA_screen_types.h" +#include "DNA_texture_types.h" +#include "DNA_volume_types.h" + +#include "DEG_depsgraph_build.h" + +#include "UI_interface.h" +#include "UI_resources.h" + +#include "BLO_read_write.h" + +#include "MEM_guardedalloc.h" + +#include "MOD_modifiertypes.h" +#include "MOD_ui_common.h" + +#include "RE_shader_ext.h" + +#include "RNA_access.h" + +#include "BLI_math_vector.h" + +#ifdef WITH_OPENVDB +# include <openvdb/openvdb.h> +# include <openvdb/tools/Interpolation.h> +# include <openvdb/tools/Morphology.h> +# include <openvdb/tools/Prune.h> +# include <openvdb/tools/ValueTransformer.h> +#endif + +static void initData(ModifierData *md) +{ + VolumeDisplaceModifierData *vdmd = reinterpret_cast<VolumeDisplaceModifierData *>(md); + vdmd->texture = NULL; + vdmd->strength = 1.0f; + copy_v3_fl(vdmd->texture_mid_level, 0.5f); + vdmd->texture_sample_radius = 1.0f; +} + +static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) +{ + VolumeDisplaceModifierData *vdmd = reinterpret_cast<VolumeDisplaceModifierData *>(md); + if (vdmd->texture != NULL) { + DEG_add_generic_id_relation(ctx->node, &vdmd->texture->id, "Volume Displace Modifier"); + } + if (vdmd->texture_map_mode == MOD_VOLUME_DISPLACE_MAP_OBJECT) { + if (vdmd->texture_map_object != NULL) { + DEG_add_object_relation( + ctx->node, vdmd->texture_map_object, DEG_OB_COMP_TRANSFORM, "Volume Displace Modifier"); + } + } +} + +static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData) +{ + VolumeDisplaceModifierData *vdmd = reinterpret_cast<VolumeDisplaceModifierData *>(md); + walk(userData, ob, (ID **)&vdmd-> @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
