Merge branch 'master' into blender2.8
[blender.git] / source / blender / makesrna / intern / rna_cachefile.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2016 Blender Foundation.
19  * All rights reserved.
20  *
21  * Contributor(s): Kevin Dietrich.
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  */
25
26 #include "DNA_cachefile_types.h"
27 #include "DNA_scene_types.h"
28
29 #include "RNA_access.h"
30 #include "RNA_define.h"
31 #include "RNA_enum_types.h"
32
33 #include "rna_internal.h"
34
35 #ifdef RNA_RUNTIME
36
37 #include "BKE_cachefile.h"
38
39 #include "BLI_string.h"
40
41 #include "DEG_depsgraph.h"
42
43 #include "WM_api.h"
44 #include "WM_types.h"
45
46 #ifdef WITH_ALEMBIC
47 #  include "../../../alembic/ABC_alembic.h"
48 #endif
49
50 static void rna_CacheFile_update(Main *bmain, Scene *scene, PointerRNA *ptr)
51 {
52         CacheFile *cache_file = (CacheFile *)ptr->data;
53
54         DEG_id_tag_update(&cache_file->id, 0);
55         WM_main_add_notifier(NC_OBJECT | ND_DRAW, NULL);
56
57         UNUSED_VARS(bmain, scene);
58 }
59
60 static void rna_CacheFile_update_handle(Main *bmain, Scene *scene, PointerRNA *ptr)
61 {
62         CacheFile *cache_file = ptr->data;
63
64         if ((cache_file->flag & CACHEFILE_DIRTY) != 0) {
65                 BKE_cachefile_clean(bmain, cache_file);
66                 BLI_freelistN(&cache_file->object_paths);
67                 cache_file->flag &= ~CACHEFILE_DIRTY;
68         }
69
70         BKE_cachefile_reload(bmain, cache_file);
71
72         rna_CacheFile_update(bmain, scene, ptr);
73 }
74
75 static void rna_CacheFile_object_paths_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
76 {
77         CacheFile *cache_file = (CacheFile *)ptr->data;
78         rna_iterator_listbase_begin(iter, &cache_file->object_paths, NULL);
79 }
80
81 static void rna_CacheFile_filename_set(PointerRNA *ptr, const char *value)
82 {
83         CacheFile *cache_file = ptr->data;
84
85         if (STREQ(cache_file->filepath, value)) {
86                 return;
87         }
88
89         /* Different file is opened, close all readers. */
90         cache_file->flag |= CACHEFILE_DIRTY;
91
92         BLI_strncpy(cache_file->filepath, value, sizeof(cache_file->filepath));
93 }
94
95 #else
96
97 /* cachefile.object_paths */
98 static void rna_def_alembic_object_path(BlenderRNA *brna)
99 {
100         StructRNA *srna = RNA_def_struct(brna, "AlembicObjectPath", NULL);
101         RNA_def_struct_sdna(srna, "AlembicObjectPath");
102         RNA_def_struct_ui_text(srna, "Object Path", "Path of an object inside of an Alembic archive");
103         RNA_def_struct_ui_icon(srna, ICON_NONE);
104
105         PropertyRNA *prop = RNA_def_property(srna, "path", PROP_STRING, PROP_NONE);
106         RNA_def_property_ui_text(prop, "Path", "Object path");
107         RNA_def_struct_name_property(srna, prop);
108 }
109
110 /* cachefile.object_paths */
111 static void rna_def_cachefile_object_paths(BlenderRNA *brna, PropertyRNA *cprop)
112 {
113         RNA_def_property_srna(cprop, "AlembicObjectPaths");
114         StructRNA *srna = RNA_def_struct(brna, "AlembicObjectPaths", NULL);
115         RNA_def_struct_sdna(srna, "CacheFile");
116         RNA_def_struct_ui_text(srna, "Object Paths", "Collection of object paths");
117 }
118
119 static void rna_def_cachefile(BlenderRNA *brna)
120 {
121         StructRNA *srna = RNA_def_struct(brna, "CacheFile", "ID");
122         RNA_def_struct_sdna(srna, "CacheFile");
123         RNA_def_struct_ui_text(srna, "CacheFile", "");
124         RNA_def_struct_ui_icon(srna, ICON_FILE);
125
126         PropertyRNA *prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
127         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_CacheFile_filename_set");
128         RNA_def_property_ui_text(prop, "File Path", "Path to external displacements file");
129         RNA_def_property_update(prop, 0, "rna_CacheFile_update_handle");
130
131         prop = RNA_def_property(srna, "is_sequence", PROP_BOOLEAN, PROP_NONE);
132         RNA_def_property_ui_text(prop, "Sequence", "Whether the cache is separated in a series of files");
133         RNA_def_property_update(prop, 0, "rna_CacheFile_update");
134
135         /* ----------------- For Scene time ------------------- */
136
137         prop = RNA_def_property(srna, "override_frame", PROP_BOOLEAN, PROP_NONE);
138         RNA_def_property_ui_text(prop, "Override Frame",
139                                  "Whether to use a custom frame for looking up data in the cache file,"
140                                  " instead of using the current scene frame");
141         RNA_def_property_update(prop, 0, "rna_CacheFile_update");
142
143         prop = RNA_def_property(srna, "frame", PROP_FLOAT, PROP_NONE);
144         RNA_def_property_float_sdna(prop, NULL, "frame");
145         RNA_def_property_range(prop, -MAXFRAME, MAXFRAME);
146         RNA_def_property_ui_text(prop, "Frame", "The time to use for looking up the data in the cache file,"
147                                                 " or to determine which file to use in a file sequence");
148         RNA_def_property_update(prop, 0, "rna_CacheFile_update");
149
150         /* ----------------- Axis Conversion ----------------- */
151
152         prop = RNA_def_property(srna, "forward_axis", PROP_ENUM, PROP_NONE);
153         RNA_def_property_enum_sdna(prop, NULL, "forward_axis");
154         RNA_def_property_enum_items(prop, rna_enum_object_axis_items);
155         RNA_def_property_ui_text(prop, "Forward", "");
156         RNA_def_property_update(prop, 0, "rna_CacheFile_update");
157
158         prop = RNA_def_property(srna, "up_axis", PROP_ENUM, PROP_NONE);
159         RNA_def_property_enum_sdna(prop, NULL, "up_axis");
160         RNA_def_property_enum_items(prop, rna_enum_object_axis_items);
161         RNA_def_property_ui_text(prop, "Up", "");
162         RNA_def_property_update(prop, 0, "rna_CacheFile_update");
163
164         prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
165         RNA_def_property_float_sdna(prop, NULL, "scale");
166         RNA_def_property_range(prop, 0.0001f, 1000.0f);
167         RNA_def_property_ui_text(prop, "Scale", "Value by which to enlarge or shrink the object with respect to the world's origin"
168                                                 " (only applicable through a Transform Cache constraint)");
169         RNA_def_property_update(prop, 0, "rna_CacheFile_update");
170
171         /* object paths */
172         prop = RNA_def_property(srna, "object_paths", PROP_COLLECTION, PROP_NONE);
173         RNA_def_property_collection_sdna(prop, NULL, "object_paths", NULL);
174         RNA_def_property_collection_funcs(prop, "rna_CacheFile_object_paths_begin", "rna_iterator_listbase_next",
175                                           "rna_iterator_listbase_end", "rna_iterator_listbase_get",
176                                           NULL, NULL, NULL, NULL);
177         RNA_def_property_struct_type(prop, "AlembicObjectPath");
178         RNA_def_property_srna(prop, "AlembicObjectPaths");
179         RNA_def_property_ui_text(prop, "Object Paths", "Paths of the objects inside the Alembic archive");
180         rna_def_cachefile_object_paths(brna, prop);
181
182         rna_def_animdata_common(srna);
183 }
184
185 void RNA_def_cachefile(BlenderRNA *brna)
186 {
187         rna_def_cachefile(brna);
188         rna_def_alembic_object_path(brna);
189 }
190
191 #endif