Blender V4.5
object_volume.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2008 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <cstring>
10
11#include "BLI_listbase.h"
12#include "BLI_path_utils.hh"
13#include "BLI_string.h"
14
15#include "DNA_object_types.h"
16#include "DNA_volume_types.h"
17
18#include "RNA_access.hh"
19#include "RNA_define.hh"
20
21#include "BKE_context.hh"
22#include "BKE_lib_id.hh"
23#include "BKE_main.hh"
24#include "BKE_report.hh"
25#include "BKE_volume.hh"
26
27#include "WM_api.hh"
28#include "WM_types.hh"
29
30#include "ED_image.hh"
31#include "ED_object.hh"
32#include "ED_screen.hh"
33
34#include "object_intern.hh"
35
36namespace blender::ed::object {
37
38/* Volume Add */
39
40static Object *object_volume_add(bContext *C, wmOperator *op, const char *name)
41{
42 ushort local_view_bits;
43 float loc[3], rot[3];
44
45 add_generic_get_opts(C, op, 'Z', loc, rot, nullptr, nullptr, &local_view_bits, nullptr);
46
47 return add_type(C, OB_VOLUME, name, loc, rot, false, local_view_bits);
48}
49
54
56{
57 /* identifiers */
58 ot->name = "Add Volume";
59 ot->description = "Add a volume object to the scene";
60 ot->idname = "OBJECT_OT_volume_add";
61
62 /* API callbacks. */
65
66 /* flags */
68
69 add_generic_props(ot, false);
70}
71
72/* Volume Import */
73
75{
76 Main *bmain = CTX_data_main(C);
77 const bool is_relative_path = RNA_boolean_get(op->ptr, "relative_path");
78 bool imported = false;
79
81 LISTBASE_FOREACH (ImageFrameRange *, range, &ranges) {
82 char filepath[FILE_MAX];
83 BLI_path_split_file_part(range->filepath, filepath, sizeof(filepath));
85
86 Object *object = object_volume_add(C, op, filepath);
87 Volume *volume = (Volume *)object->data;
88
89 STRNCPY(volume->filepath, range->filepath);
90 if (is_relative_path) {
92 }
93
94 if (!BKE_volume_load(volume, bmain)) {
97 "Volume \"%s\" failed to load: %s",
98 filepath,
100 BKE_id_delete(bmain, &object->id);
101 BKE_id_delete(bmain, &volume->id);
102 continue;
103 }
104 if (BKE_volume_is_points_only(volume)) {
107 "Volume \"%s\" contains points, only voxel grids are supported",
108 filepath);
109 BKE_id_delete(bmain, &object->id);
110 BKE_id_delete(bmain, &volume->id);
111 continue;
112 }
113
114 /* Set sequence parameters after trying to load the first frame, for file validation we want
115 * to use a consistent frame rather than whatever corresponds to the current scene frame. */
116 volume->is_sequence = (range->length > 1);
117 volume->frame_duration = (volume->is_sequence) ? range->length : 0;
118 volume->frame_start = 1;
119 volume->frame_offset = (volume->is_sequence) ? range->offset - 1 : 0;
120
121 if (BKE_volume_is_y_up(volume)) {
122 object->rot[0] += M_PI_2;
123 }
124
125 BKE_volume_unload(volume);
126
127 imported = true;
128 }
129 BLI_freelistN(&ranges);
130
131 return (imported) ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
132}
133
135 wmOperator *op,
136 const wmEvent * /*event*/)
137{
138 if (RNA_struct_property_is_set(op->ptr, "filepath")) {
139 return volume_import_exec(C, op);
140 }
141
142 RNA_string_set(op->ptr, "filepath", U.textudir);
144
146}
147
149{
150 /* identifiers */
151 ot->name = "Import OpenVDB Volume";
152 ot->description = "Import OpenVDB volume file";
153 ot->idname = "OBJECT_OT_volume_import";
154
155 /* API callbacks. */
156 ot->exec = volume_import_exec;
157 ot->invoke = volume_import_invoke;
158
159 /* flags */
161
162 /* properties */
171
173 ot->srna,
174 "use_sequence_detection",
175 true,
176 "Detect Sequences",
177 "Automatically detect animated sequences in selected volume files (based on file names)");
178
179 add_generic_props(ot, false);
180}
181
182} // namespace blender::ed::object
Main * CTX_data_main(const bContext *C)
void BKE_id_delete(Main *bmain, void *idv) ATTR_NONNULL()
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
Definition main.cc:872
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
Volume data-block.
bool BKE_volume_is_y_up(const Volume *volume)
bool BKE_volume_load(const Volume *volume, const Main *bmain)
bool BKE_volume_is_points_only(const Volume *volume)
void BKE_volume_unload(Volume *volume)
const char * BKE_volume_grids_error_msg(const Volume *volume)
#define LISTBASE_FOREACH(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:497
#define M_PI_2
bool bool BLI_path_extension_strip(char *path) ATTR_NONNULL(1)
#define FILE_MAX
void void void BLI_path_split_file_part(const char *filepath, char *file, size_t file_maxncpy) ATTR_NONNULL(1
bool void BLI_path_rel(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1)
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:688
unsigned short ushort
Object is a sort of wrapper for general info.
@ OB_VOLUME
@ FILE_SORT_DEFAULT
@ FILE_SPECIAL
@ FILE_TYPE_VOLUME
@ FILE_TYPE_FOLDER
@ FILE_DEFAULTDISPLAY
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
@ OPERATOR_RUNNING_MODAL
ListBase ED_image_filesel_detect_sequences(blender::StringRefNull root_path, wmOperator *op, bool detect_udim)
bool ED_operator_objectmode(bContext *C)
#define C
Definition RandGen.cpp:29
@ WM_FILESEL_FILES
Definition WM_api.hh:1076
@ WM_FILESEL_DIRECTORY
Definition WM_api.hh:1073
@ WM_FILESEL_RELPATH
Definition WM_api.hh:1072
@ WM_FILESEL_FILEPATH
Definition WM_api.hh:1075
@ FILE_OPENFILE
Definition WM_api.hh:1084
@ OPTYPE_UNDO
Definition WM_types.hh:182
@ OPTYPE_REGISTER
Definition WM_types.hh:180
#define U
#define rot(x, k)
static wmOperatorStatus volume_import_invoke(bContext *C, wmOperator *op, const wmEvent *)
Object * add_type(bContext *C, int type, const char *name, const float loc[3], const float rot[3], bool enter_editmode, unsigned short local_view_bits) ATTR_NONNULL(1) ATTR_RETURNS_NONNULL
static wmOperatorStatus volume_import_exec(bContext *C, wmOperator *op)
static Object * object_volume_add(bContext *C, wmOperator *op, const char *name)
void OBJECT_OT_volume_add(wmOperatorType *ot)
void OBJECT_OT_volume_import(wmOperatorType *ot)
static wmOperatorStatus object_volume_add_exec(bContext *C, wmOperator *op)
void add_generic_props(wmOperatorType *ot, bool do_editmode)
void add_generic_get_opts(bContext *C, wmOperator *op, char view_align_axis, float r_loc[3], float r_rot[3], float r_scale[3], bool *r_enter_editmode, unsigned short *r_local_view_bits, bool *r_is_view_aligned)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
int frame_duration
char filepath[1024]
char is_sequence
struct ReportList * reports
struct PointerRNA * ptr
void WM_event_add_fileselect(bContext *C, wmOperator *op)
wmOperatorType * ot
Definition wm_files.cc:4225
void WM_operator_properties_filesel(wmOperatorType *ot, const int filter, const short type, const eFileSel_Action action, const eFileSel_Flag flag, const short display, const short sort)