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