diff options
Diffstat (limited to 'source/blender/editors/object')
-rw-r--r-- | source/blender/editors/object/CMakeLists.txt | 5 | ||||
-rw-r--r-- | source/blender/editors/object/object_add.c | 78 | ||||
-rw-r--r-- | source/blender/editors/object/object_intern.h | 6 | ||||
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 14 | ||||
-rw-r--r-- | source/blender/editors/object/object_ops.c | 6 | ||||
-rw-r--r-- | source/blender/editors/object/object_relations.c | 12 | ||||
-rw-r--r-- | source/blender/editors/object/object_volume.c | 193 |
7 files changed, 313 insertions, 1 deletions
diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt index 69abe475fed..a5b6fa55aa9 100644 --- a/source/blender/editors/object/CMakeLists.txt +++ b/source/blender/editors/object/CMakeLists.txt @@ -65,6 +65,7 @@ set(SRC object_transform.c object_utils.c object_vgroup.c + object_volume.c object_warp.c object_intern.h @@ -88,4 +89,8 @@ if(WITH_INTERNATIONAL) add_definitions(-DWITH_INTERNATIONAL) endif() +if(WITH_NEW_OBJECT_TYPES) + add_definitions(-DWITH_NEW_OBJECT_TYPES) +endif() + blender_add_lib(bf_editor_object "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 17b6bfdb956..832854ec4cc 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -65,6 +65,7 @@ #include "BKE_effect.h" #include "BKE_font.h" #include "BKE_gpencil.h" +#include "BKE_hair.h" #include "BKE_key.h" #include "BKE_light.h" #include "BKE_lattice.h" @@ -81,9 +82,11 @@ #include "BKE_nla.h" #include "BKE_object.h" #include "BKE_particle.h" +#include "BKE_pointcloud.h" #include "BKE_report.h" #include "BKE_scene.h" #include "BKE_speaker.h" +#include "BKE_volume.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" @@ -1459,9 +1462,82 @@ void OBJECT_OT_speaker_add(wmOperatorType *ot) /** \} */ /* -------------------------------------------------------------------- */ -/** \name Delete Object Operator +/** \name Add Hair Operator + * \{ */ + +static int object_hair_add_exec(bContext *C, wmOperator *op) +{ + ushort local_view_bits; + float loc[3], rot[3]; + + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &local_view_bits, NULL)) { + return OPERATOR_CANCELLED; + } + Object *object = ED_object_add_type(C, OB_HAIR, NULL, loc, rot, false, local_view_bits); + object->dtx |= OB_DRAWBOUNDOX; /* TODO: remove once there is actual drawing. */ + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_hair_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Add Hair"; + ot->description = "Add a hair object to the scene"; + ot->idname = "OBJECT_OT_hair_add"; + + /* api callbacks */ + ot->exec = object_hair_add_exec; + ot->poll = ED_operator_objectmode; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + ED_object_add_generic_props(ot, false); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Add Point Cloud Operator * \{ */ +static int object_pointcloud_add_exec(bContext *C, wmOperator *op) +{ + ushort local_view_bits; + float loc[3], rot[3]; + + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &local_view_bits, NULL)) { + return OPERATOR_CANCELLED; + } + Object *object = ED_object_add_type(C, OB_POINTCLOUD, NULL, loc, rot, false, local_view_bits); + object->dtx |= OB_DRAWBOUNDOX; /* TODO: remove once there is actual drawing. */ + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_pointcloud_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Add Point Cloud"; + ot->description = "Add a point cloud object to the scene"; + ot->idname = "OBJECT_OT_pointcloud_add"; + + /* api callbacks */ + ot->exec = object_pointcloud_add_exec; + ot->poll = ED_operator_objectmode; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + ED_object_add_generic_props(ot, false); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Delete Object Operator + * \{ */ /* remove base from a specific scene */ /* note: now unlinks constraints as well */ void ED_object_base_free_and_unlink(Main *bmain, Scene *scene, Object *ob) diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index 352ba744d92..c1cb0d6cef0 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -111,6 +111,8 @@ void OBJECT_OT_light_add(struct wmOperatorType *ot); void OBJECT_OT_effector_add(struct wmOperatorType *ot); void OBJECT_OT_camera_add(struct wmOperatorType *ot); void OBJECT_OT_speaker_add(struct wmOperatorType *ot); +void OBJECT_OT_hair_add(struct wmOperatorType *ot); +void OBJECT_OT_pointcloud_add(struct wmOperatorType *ot); void OBJECT_OT_collection_instance_add(struct wmOperatorType *ot); void OBJECT_OT_duplicates_make_real(struct wmOperatorType *ot); @@ -120,6 +122,10 @@ void OBJECT_OT_join(struct wmOperatorType *ot); void OBJECT_OT_join_shapes(struct wmOperatorType *ot); void OBJECT_OT_convert(struct wmOperatorType *ot); +/* object_volume.c */ +void OBJECT_OT_volume_add(struct wmOperatorType *ot); +void OBJECT_OT_volume_import(struct wmOperatorType *ot); + /* object_hook.c */ void OBJECT_OT_hook_add_selob(struct wmOperatorType *ot); void OBJECT_OT_hook_add_newob(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 31c4f96693c..7c74213608c 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -53,6 +53,7 @@ #include "BKE_effect.h" #include "BKE_global.h" #include "BKE_gpencil_modifier.h" +#include "BKE_hair.h" #include "BKE_key.h" #include "BKE_lattice.h" #include "BKE_lib_id.h" @@ -67,9 +68,11 @@ #include "BKE_ocean.h" #include "BKE_paint.h" #include "BKE_particle.h" +#include "BKE_pointcloud.h" #include "BKE_report.h" #include "BKE_scene.h" #include "BKE_softbody.h" +#include "BKE_volume.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" @@ -114,6 +117,15 @@ static void object_force_modifier_update_for_bind(Depsgraph *depsgraph, Object * else if (ob->type == OB_GPENCIL) { BKE_gpencil_modifiers_calc(depsgraph, scene_eval, ob_eval); } + else if (ob->type == OB_HAIR) { + BKE_hair_data_update(depsgraph, scene_eval, ob); + } + else if (ob->type == OB_POINTCLOUD) { + BKE_pointcloud_data_update(depsgraph, scene_eval, ob); + } + else if (ob->type == OB_VOLUME) { + BKE_volume_data_update(depsgraph, scene_eval, ob); + } } static void object_force_modifier_bind_simple_options(Depsgraph *depsgraph, @@ -654,6 +666,7 @@ static int modifier_apply_shape(Main *bmain, BKE_id_free(NULL, mesh_applied); } else { + /* TODO: implement for hair, pointclouds and volumes. */ BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type"); return 0; } @@ -732,6 +745,7 @@ static int modifier_apply_obdata( DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); } else { + /* TODO: implement for hair, pointclouds and volumes. */ BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type"); return 0; } diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index f6b08b953a4..52273b887dd 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -109,6 +109,12 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_light_add); WM_operatortype_append(OBJECT_OT_camera_add); WM_operatortype_append(OBJECT_OT_speaker_add); +#ifdef WITH_NEW_OBJECT_TYPES + WM_operatortype_append(OBJECT_OT_hair_add); + WM_operatortype_append(OBJECT_OT_pointcloud_add); +#endif + WM_operatortype_append(OBJECT_OT_volume_add); + WM_operatortype_append(OBJECT_OT_volume_import); WM_operatortype_append(OBJECT_OT_add); WM_operatortype_append(OBJECT_OT_add_named); WM_operatortype_append(OBJECT_OT_effector_add); diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 29bf9e88853..836e3bf7a44 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -66,6 +66,7 @@ #include "BKE_editmesh.h" #include "BKE_gpencil.h" #include "BKE_fcurve.h" +#include "BKE_hair.h" #include "BKE_idprop.h" #include "BKE_light.h" #include "BKE_lattice.h" @@ -82,10 +83,12 @@ #include "BKE_modifier.h" #include "BKE_node.h" #include "BKE_object.h" +#include "BKE_pointcloud.h" #include "BKE_report.h" #include "BKE_scene.h" #include "BKE_speaker.h" #include "BKE_texture.h" +#include "BKE_volume.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" @@ -1900,6 +1903,15 @@ static void single_obdata_users( case OB_GPENCIL: ob->data = ID_NEW_SET(ob->data, BKE_gpencil_copy(bmain, ob->data)); break; + case OB_HAIR: + ob->data = ID_NEW_SET(ob->data, BKE_hair_copy(bmain, ob->data)); + break; + case OB_POINTCLOUD: + ob->data = ID_NEW_SET(ob->data, BKE_pointcloud_copy(bmain, ob->data)); + break; + case OB_VOLUME: + ob->data = ID_NEW_SET(ob->data, BKE_volume_copy(bmain, ob->data)); + break; default: printf("ERROR %s: can't copy %s\n", __func__, id->name); BLI_assert(!"This should never happen."); diff --git a/source/blender/editors/object/object_volume.c b/source/blender/editors/object/object_volume.c new file mode 100644 index 00000000000..64482a0bcf6 --- /dev/null +++ b/source/blender/editors/object/object_volume.c @@ -0,0 +1,193 @@ +/* + * 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. + * + * The Original Code is Copyright (C) 2008 Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup edobj + */ + +#include <string.h> + +#include "MEM_guardedalloc.h" + +#include "BLI_fileops.h" +#include "BLI_listbase.h" +#include "BLI_math_base.h" +#include "BLI_path_util.h" +#include "BLI_string.h" + +#include "DNA_object_types.h" +#include "DNA_volume_types.h" + +#include "RNA_access.h" +#include "RNA_define.h" + +#include "BKE_context.h" +#include "BKE_lib_id.h" +#include "BKE_main.h" +#include "BKE_report.h" +#include "BKE_volume.h" + +#include "WM_types.h" +#include "WM_api.h" + +#include "ED_image.h" +#include "ED_object.h" +#include "ED_screen.h" + +#include "object_intern.h" + +/* Volume Add */ + +static Object *object_volume_add(bContext *C, wmOperator *op, const char *name) +{ + ushort local_view_bits; + float loc[3], rot[3]; + + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &local_view_bits, NULL)) { + return false; + } + return ED_object_add_type(C, OB_VOLUME, name, loc, rot, false, local_view_bits); +} + +static int object_volume_add_exec(bContext *C, wmOperator *op) +{ + return (object_volume_add(C, op, NULL) != NULL) ? OPERATOR_FINISHED : OPERATOR_CANCELLED; +} + +void OBJECT_OT_volume_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Add Volume"; + ot->description = "Add a volume object to the scene"; + ot->idname = "OBJECT_OT_volume_add"; + + /* api callbacks */ + ot->exec = object_volume_add_exec; + ot->poll = ED_operator_objectmode; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + ED_object_add_generic_props(ot, false); +} + +/* Volume Import */ + +static int volume_import_exec(bContext *C, wmOperator *op) +{ + Main *bmain = CTX_data_main(C); + const bool is_relative_path = RNA_boolean_get(op->ptr, "relative_path"); + bool imported = false; + + ListBase ranges = ED_image_filesel_detect_sequences(bmain, op, false); + for (ImageFrameRange *range = ranges.first; range; range = range->next) { + char filename[FILE_MAX]; + BLI_split_file_part(range->filepath, filename, sizeof(filename)); + BLI_path_extension_replace(filename, sizeof(filename), ""); + + Object *object = object_volume_add(C, op, filename); + Volume *volume = (Volume *)object->data; + + STRNCPY(volume->filepath, range->filepath); + if (is_relative_path) { + BLI_path_rel(volume->filepath, BKE_main_blendfile_path(bmain)); + } + + volume->is_sequence = (range->length > 1); + volume->frame_duration = (volume->is_sequence) ? range->length : 0; + volume->frame_start = 1; + volume->frame_offset = (volume->is_sequence) ? range->offset - 1 : 0; + + if (!BKE_volume_load(volume, bmain)) { + BKE_reportf(op->reports, + RPT_WARNING, + "Volume \"%s\" failed to load: %s", + filename, + BKE_volume_grids_error_msg(volume)); + BKE_id_delete(bmain, &object->id); + BKE_id_delete(bmain, &volume->id); + continue; + } + else if (BKE_volume_is_points_only(volume)) { + BKE_reportf(op->reports, + RPT_WARNING, + "Volume \"%s\" contains points, only voxel grids are supported", + filename); + BKE_id_delete(bmain, &object->id); + BKE_id_delete(bmain, &volume->id); + continue; + } + + if (BKE_volume_is_y_up(volume)) { + object->rot[0] += M_PI_2; + } + + imported = true; + } + BLI_freelistN(&ranges); + + return (imported) ? OPERATOR_FINISHED : OPERATOR_CANCELLED; +} + +static int volume_import_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) +{ + if (RNA_struct_property_is_set(op->ptr, "filepath")) { + return volume_import_exec(C, op); + } + + RNA_string_set(op->ptr, "filepath", U.textudir); + WM_event_add_fileselect(C, op); + + return OPERATOR_RUNNING_MODAL; +} + +/* called by other space types too */ +void OBJECT_OT_volume_import(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Import OpenVDB Volume"; + ot->description = "Import OpenVDB volume file"; + ot->idname = "OBJECT_OT_volume_import"; + + /* api callbacks */ + ot->exec = volume_import_exec; + ot->invoke = volume_import_invoke; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* properties */ + WM_operator_properties_filesel(ot, + FILE_TYPE_FOLDER | FILE_TYPE_VOLUME, + FILE_SPECIAL, + FILE_OPENFILE, + WM_FILESEL_FILEPATH | WM_FILESEL_DIRECTORY | WM_FILESEL_FILES | + WM_FILESEL_RELPATH, + FILE_DEFAULTDISPLAY, + FILE_SORT_ALPHA); + + RNA_def_boolean( + ot->srna, + "use_sequence_detection", + true, + "Detect Sequences", + "Automatically detect animated sequences in selected volume files (based on file names)"); + + ED_object_add_generic_props(ot, false); +} |