1.3.7
by Kevin Roy
Import upstream version 2.61 |
1 |
/*
|
1.2.8
by Cyril Brulebois
Import upstream version 2.46+dfsg |
2 |
* ***** BEGIN GPL LICENSE BLOCK *****
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
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
|
|
1.2.8
by Cyril Brulebois
Import upstream version 2.46+dfsg |
7 |
* of the License, or (at your option) any later version.
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
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,
|
|
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
16 |
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
17 |
*
|
18 |
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
19 |
* All rights reserved.
|
|
20 |
*
|
|
21 |
* The Original Code is: all of this file.
|
|
22 |
*
|
|
23 |
* Contributor(s): none yet.
|
|
24 |
*
|
|
1.2.8
by Cyril Brulebois
Import upstream version 2.46+dfsg |
25 |
* ***** END GPL LICENSE BLOCK *****
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
26 |
*/
|
27 |
||
1.3.3
by Kevin Roy
Import upstream version 2.57-svn36147 |
28 |
/** \file blender/blenkernel/intern/blender.c
|
29 |
* \ingroup bke
|
|
30 |
*/
|
|
31 |
||
32 |
||
1.2.10
by Chris Coulson
Import upstream version 2.49a+dfsg |
33 |
#ifndef _WIN32
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
34 |
# include <unistd.h> // for read close |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
35 |
#else
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
36 |
# include <io.h> // for open close read |
37 |
# define open _open
|
|
38 |
# define read _read
|
|
39 |
# define close _close
|
|
40 |
# define write _write
|
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
41 |
#endif
|
42 |
||
43 |
#include <stdlib.h> |
|
44 |
#include <stdio.h> |
|
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
45 |
#include <stddef.h> |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
46 |
#include <string.h> |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
47 |
#include <fcntl.h> /* for open */ |
48 |
#include <errno.h> |
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
49 |
|
50 |
#include "MEM_guardedalloc.h" |
|
1.2.4
by Lukas Fittl
Import upstream version 2.42a |
51 |
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
52 |
#include "DNA_userdef_types.h" |
1.2.4
by Lukas Fittl
Import upstream version 2.42a |
53 |
#include "DNA_scene_types.h" |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
54 |
#include "DNA_screen_types.h" |
55 |
#include "DNA_sequence_types.h" |
|
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
56 |
#include "DNA_sound_types.h" |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
57 |
#include "DNA_windowmanager_types.h" |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
58 |
|
59 |
#include "BLI_blenlib.h" |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
60 |
#include "BLI_dynstr.h" |
1.3.3
by Kevin Roy
Import upstream version 2.57-svn36147 |
61 |
#include "BLI_utildefines.h" |
1.3.6
by Kevin Roy
Import upstream version 2.59 |
62 |
#include "BLI_callbacks.h" |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
63 |
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
64 |
#include "IMB_imbuf.h" |
1.3.7
by Kevin Roy
Import upstream version 2.61 |
65 |
#include "IMB_moviecache.h" |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
66 |
|
67 |
#include "BKE_blender.h" |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
68 |
#include "BKE_bpath.h" |
1.5.2
by Matteo F. Vescovi
Import upstream version 2.67b |
69 |
#include "BKE_brush.h" |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
70 |
#include "BKE_context.h" |
1.2.4
by Lukas Fittl
Import upstream version 2.42a |
71 |
#include "BKE_depsgraph.h" |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
72 |
#include "BKE_displist.h" |
73 |
#include "BKE_global.h" |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
74 |
#include "BKE_idprop.h" |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
75 |
#include "BKE_image.h" |
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
76 |
#include "BKE_ipo.h" |
1.2.4
by Lukas Fittl
Import upstream version 2.42a |
77 |
#include "BKE_library.h" |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
78 |
#include "BKE_main.h" |
1.2.6
by Florian Ernst
Import upstream version 2.44 |
79 |
#include "BKE_node.h" |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
80 |
#include "BKE_report.h" |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
81 |
#include "BKE_scene.h" |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
82 |
#include "BKE_screen.h" |
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
83 |
#include "BKE_sequencer.h" |
1.3.7
by Kevin Roy
Import upstream version 2.61 |
84 |
#include "BKE_sound.h" |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
85 |
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
86 |
#include "RE_pipeline.h" |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
87 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
88 |
#include "BLF_api.h" |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
89 |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
90 |
#include "BLO_undofile.h" |
91 |
#include "BLO_readfile.h" |
|
92 |
#include "BLO_writefile.h" |
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
93 |
|
1.3.7
by Kevin Roy
Import upstream version 2.61 |
94 |
#include "RNA_access.h" |
95 |
||
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
96 |
#include "WM_api.h" // XXXXX BAD, very BAD dependency (bad level call) - remove asap, elubie |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
97 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
98 |
#include "IMB_colormanagement.h" |
99 |
||
100 |
#ifdef WITH_PYTHON
|
|
101 |
# include "BPY_extern.h"
|
|
102 |
#endif
|
|
103 |
||
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
104 |
Global G; |
105 |
UserDef U; |
|
1.3.3
by Kevin Roy
Import upstream version 2.57-svn36147 |
106 |
/* ListBase = {NULL, NULL}; */
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
107 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
108 |
char versionstr[48] = ""; |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
109 |
|
110 |
/* ********** free ********** */
|
|
111 |
||
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
112 |
/* only to be called on exit blender */
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
113 |
void free_blender(void) |
114 |
{
|
|
1.2.5
by Lukas Fittl
Import upstream version 2.43 |
115 |
/* samples are in a global list..., also sets G.main->sound->sample NULL */
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
116 |
free_main(G.main); |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
117 |
G.main = NULL; |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
118 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
119 |
BKE_spacetypes_free(); /* after free main, it uses space callbacks */ |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
120 |
|
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
121 |
IMB_exit(); |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
122 |
BKE_images_exit(); |
123 |
||
1.5.2
by Matteo F. Vescovi
Import upstream version 2.67b |
124 |
BKE_brush_system_exit(); |
125 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
126 |
BLI_callback_global_finalize(); |
127 |
||
128 |
BKE_sequencer_cache_destruct(); |
|
1.3.7
by Kevin Roy
Import upstream version 2.61 |
129 |
IMB_moviecache_destruct(); |
1.2.5
by Lukas Fittl
Import upstream version 2.43 |
130 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
131 |
free_nodesystem(); |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
132 |
}
|
133 |
||
134 |
void initglobals(void) |
|
135 |
{
|
|
136 |
memset(&G, 0, sizeof(Global)); |
|
137 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
138 |
U.savetime = 1; |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
139 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
140 |
G.main = MEM_callocN(sizeof(Main), "initglobals"); |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
141 |
|
142 |
strcpy(G.ima, "//"); |
|
143 |
||
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
144 |
if (BLENDER_SUBVERSION) |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
145 |
BLI_snprintf(versionstr, sizeof(versionstr), "v%d.%02d.%d", BLENDER_VERSION / 100, BLENDER_VERSION % 100, BLENDER_SUBVERSION); |
1.2.5
by Lukas Fittl
Import upstream version 2.43 |
146 |
else
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
147 |
BLI_snprintf(versionstr, sizeof(versionstr), "v%d.%02d", BLENDER_VERSION / 100, BLENDER_VERSION % 100); |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
148 |
|
1.5.3
by Matteo F. Vescovi
Import upstream version 2.68a |
149 |
#ifdef _WIN32
|
150 |
G.windowstate = 0; |
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
151 |
#endif
|
152 |
||
1.3.5
by Kevin Roy
Import upstream version 2.58-svn37702 |
153 |
#ifndef WITH_PYTHON_SECURITY /* default */ |
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
154 |
G.f |= G_SCRIPT_AUTOEXEC; |
1.3.5
by Kevin Roy
Import upstream version 2.58-svn37702 |
155 |
#else
|
156 |
G.f &= ~G_SCRIPT_AUTOEXEC; |
|
157 |
#endif
|
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
158 |
}
|
159 |
||
160 |
/***/
|
|
161 |
||
1.1.2
by Martin Pitt
Import upstream version 2.37a |
162 |
static void clear_global(void) |
163 |
{
|
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
164 |
// extern short winqueue_break; /* screen.c */
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
165 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
166 |
free_main(G.main); /* free all lib data */ |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
167 |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
168 |
// free_vertexpaint();
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
169 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
170 |
G.main = NULL; |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
171 |
}
|
172 |
||
1.5.3
by Matteo F. Vescovi
Import upstream version 2.68a |
173 |
static bool clean_paths_visit_cb(void *UNUSED(userdata), char *path_dst, const char *path_src) |
1.3.7
by Kevin Roy
Import upstream version 2.61 |
174 |
{
|
175 |
strcpy(path_dst, path_src); |
|
176 |
BLI_clean(path_dst); |
|
1.5.3
by Matteo F. Vescovi
Import upstream version 2.68a |
177 |
return !STREQ(path_dst, path_src); |
1.3.7
by Kevin Roy
Import upstream version 2.61 |
178 |
}
|
179 |
||
1.1.2
by Martin Pitt
Import upstream version 2.37a |
180 |
/* make sure path names are correct for OS */
|
181 |
static void clean_paths(Main *main) |
|
182 |
{
|
|
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
183 |
Scene *scene; |
184 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
185 |
BKE_bpath_traverse_main(main, clean_paths_visit_cb, BKE_BPATH_TRAVERSE_SKIP_MULTIFILE, NULL); |
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
186 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
187 |
for (scene = main->scene.first; scene; scene = scene->id.next) { |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
188 |
BLI_clean(scene->r.pic); |
189 |
}
|
|
190 |
}
|
|
191 |
||
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
192 |
/* context matching */
|
193 |
/* handle no-ui case */
|
|
194 |
||
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
195 |
/* note, this is called on Undo so any slow conversion functions here
|
196 |
* should be avoided or check (mode!='u') */
|
|
197 |
||
1.3.5
by Kevin Roy
Import upstream version 2.58-svn37702 |
198 |
static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filepath) |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
199 |
{
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
200 |
bScreen *curscreen = NULL; |
201 |
Scene *curscene = NULL; |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
202 |
int recover; |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
203 |
char mode; |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
204 |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
205 |
/* 'u' = undo save, 'n' = no UI load */
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
206 |
if (bfd->main->screen.first == NULL) mode = 'u'; |
207 |
else if (G.fileflags & G_FILE_NO_UI) mode = 'n'; |
|
208 |
else mode = 0; |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
209 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
210 |
recover = (G.fileflags & G_FILE_RECOVER); |
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
211 |
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
212 |
/* Free all render results, without this stale data gets displayed after loading files */
|
213 |
if (mode != 'u') { |
|
214 |
RE_FreeAllRenderResults(); |
|
215 |
}
|
|
216 |
||
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
217 |
/* Only make filepaths compatible when loading for real (not undo) */
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
218 |
if (mode != 'u') { |
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
219 |
clean_paths(bfd->main); |
220 |
}
|
|
221 |
||
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
222 |
/* XXX here the complex windowmanager matching */
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
223 |
|
224 |
/* no load screens? */
|
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
225 |
if (mode) { |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
226 |
/* comes from readfile.c */
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
227 |
SWAP(ListBase, G.main->wm, bfd->main->wm); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
228 |
SWAP(ListBase, G.main->screen, bfd->main->screen); |
1.2.8
by Cyril Brulebois
Import upstream version 2.46+dfsg |
229 |
SWAP(ListBase, G.main->script, bfd->main->script); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
230 |
|
231 |
/* we re-use current screen */
|
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
232 |
curscreen = CTX_wm_screen(C); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
233 |
/* but use new Scene pointer */
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
234 |
curscene = bfd->curscene; |
235 |
if (curscene == NULL) curscene = bfd->main->scene.first; |
|
236 |
/* empty file, we add a scene to make Blender work */
|
|
237 |
if (curscene == NULL) curscene = BKE_scene_add(bfd->main, "Empty"); |
|
238 |
||
1.1.2
by Martin Pitt
Import upstream version 2.37a |
239 |
/* and we enforce curscene to be in current screen */
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
240 |
if (curscreen) curscreen->scene = curscene; /* can run in bgmode */ |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
241 |
|
242 |
/* clear_global will free G.main, here we can still restore pointers */
|
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
243 |
blo_lib_link_screen_restore(bfd->main, curscreen, curscene); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
244 |
}
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
245 |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
246 |
/* free G.main Main database */
|
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
247 |
// CTX_wm_manager_set(C, NULL);
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
248 |
clear_global(); |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
249 |
|
1.3.7
by Kevin Roy
Import upstream version 2.61 |
250 |
/* clear old property update cache, in case some old references are left dangling */
|
251 |
RNA_property_update_cache_free(); |
|
252 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
253 |
G.main = bfd->main; |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
254 |
|
255 |
CTX_data_main_set(C, G.main); |
|
1.3.7
by Kevin Roy
Import upstream version 2.61 |
256 |
|
257 |
sound_init_main(G.main); |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
258 |
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
259 |
if (bfd->user) { |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
260 |
|
261 |
/* only here free userdef themes... */
|
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
262 |
BKE_userdef_free(); |
263 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
264 |
U = *bfd->user; |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
265 |
MEM_freeN(bfd->user); |
266 |
}
|
|
267 |
||
1.1.2
by Martin Pitt
Import upstream version 2.37a |
268 |
/* case G_FILE_NO_UI or no screens in file */
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
269 |
if (mode) { |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
270 |
/* leave entire context further unaltered? */
|
271 |
CTX_data_scene_set(C, curscene); |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
272 |
}
|
273 |
else { |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
274 |
G.winpos = bfd->winpos; |
275 |
G.displaymode = bfd->displaymode; |
|
276 |
G.fileflags = bfd->fileflags; |
|
277 |
CTX_wm_manager_set(C, G.main->wm.first); |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
278 |
CTX_wm_screen_set(C, bfd->curscreen); |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
279 |
CTX_data_scene_set(C, bfd->curscene); |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
280 |
CTX_wm_area_set(C, NULL); |
281 |
CTX_wm_region_set(C, NULL); |
|
282 |
CTX_wm_menu_set(C, NULL); |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
283 |
}
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
284 |
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
285 |
/* this can happen when active scene was lib-linked, and doesn't exist anymore */
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
286 |
if (CTX_data_scene(C) == NULL) { |
287 |
/* in case we don't even have a local scene, add one */
|
|
288 |
if (!G.main->scene.first) |
|
289 |
BKE_scene_add(G.main, "Scene"); |
|
290 |
||
291 |
CTX_data_scene_set(C, G.main->scene.first); |
|
292 |
CTX_wm_screen(C)->scene = CTX_data_scene(C); |
|
293 |
curscene = CTX_data_scene(C); |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
294 |
}
|
295 |
||
296 |
/* special cases, override loaded flags: */
|
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
297 |
if (G.f != bfd->globalf) { |
298 |
const int flags_keep = (G_SWAP_EXCHANGE | G_SCRIPT_AUTOEXEC | G_SCRIPT_OVERRIDE_PREF); |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
299 |
bfd->globalf = (bfd->globalf & ~flags_keep) | (G.f & flags_keep); |
1.3.3
by Kevin Roy
Import upstream version 2.57-svn36147 |
300 |
}
|
301 |
||
1.1.2
by Martin Pitt
Import upstream version 2.37a |
302 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
303 |
G.f = bfd->globalf; |
304 |
||
305 |
#ifdef WITH_PYTHON
|
|
306 |
/* let python know about new main */
|
|
307 |
BPY_context_update(C); |
|
308 |
#endif
|
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
309 |
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
310 |
if (!G.background) { |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
311 |
//setscreen(G.curscreen);
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
312 |
}
|
1.2.4
by Lukas Fittl
Import upstream version 2.42a |
313 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
314 |
/* FIXME: this version patching should really be part of the file-reading code,
|
315 |
* but we still get too many unrelated data-corruption crashes otherwise... */
|
|
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
316 |
if (G.main->versionfile < 250) |
317 |
do_versions_ipos_to_animato(G.main); |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
318 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
319 |
G.main->recovered = 0; |
320 |
||
321 |
/* startup.blend or recovered startup */
|
|
322 |
if (bfd->filename[0] == 0) { |
|
323 |
G.main->name[0] = 0; |
|
324 |
}
|
|
325 |
else if (recover && G.relbase_valid) { |
|
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
326 |
/* in case of autosave or quit.blend, use original filename instead
|
327 |
* use relbase_valid to make sure the file is saved, else we get <memory2> in the filename */
|
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
328 |
filepath = bfd->filename; |
329 |
G.main->recovered = 1; |
|
330 |
||
331 |
/* these are the same at times, should never copy to the same location */
|
|
332 |
if (G.main->name != filepath) |
|
333 |
BLI_strncpy(G.main->name, filepath, FILE_MAX); |
|
334 |
}
|
|
335 |
||
1.2.4
by Lukas Fittl
Import upstream version 2.42a |
336 |
/* baseflags, groups, make depsgraph, etc */
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
337 |
/* first handle case if other windows have different scenes visible */
|
338 |
if (mode == 0) { |
|
339 |
wmWindowManager *wm = G.main->wm.first; |
|
340 |
||
341 |
if (wm) { |
|
342 |
wmWindow *win; |
|
343 |
||
344 |
for (win = wm->windows.first; win; win = win->next) { |
|
345 |
if (win->screen && win->screen->scene) /* zealous check... */ |
|
346 |
if (win->screen->scene != CTX_data_scene(C)) |
|
347 |
BKE_scene_set_background(G.main, win->screen->scene); |
|
348 |
}
|
|
349 |
}
|
|
350 |
}
|
|
351 |
BKE_scene_set_background(G.main, CTX_data_scene(C)); |
|
352 |
||
353 |
if (mode != 'u') { |
|
354 |
IMB_colormanagement_check_file_config(G.main); |
|
355 |
}
|
|
356 |
||
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
357 |
MEM_freeN(bfd); |
1.3.7
by Kevin Roy
Import upstream version 2.61 |
358 |
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
359 |
}
|
360 |
||
1.3.7
by Kevin Roy
Import upstream version 2.61 |
361 |
static int handle_subversion_warning(Main *main, ReportList *reports) |
1.2.5
by Lukas Fittl
Import upstream version 2.43 |
362 |
{
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
363 |
if (main->minversionfile > BLENDER_VERSION || |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
364 |
(main->minversionfile == BLENDER_VERSION && |
365 |
main->minsubversionfile > BLENDER_SUBVERSION)) |
|
366 |
{
|
|
367 |
BKE_reportf(reports, RPT_ERROR, "File written by newer Blender binary (%d.%d), expect loss of data!", |
|
368 |
main->minversionfile, main->minsubversionfile); |
|
1.2.5
by Lukas Fittl
Import upstream version 2.43 |
369 |
}
|
1.3.7
by Kevin Roy
Import upstream version 2.61 |
370 |
|
1.2.10
by Chris Coulson
Import upstream version 2.49a+dfsg |
371 |
return 1; |
1.2.5
by Lukas Fittl
Import upstream version 2.43 |
372 |
}
|
373 |
||
1.3.6
by Kevin Roy
Import upstream version 2.59 |
374 |
static void keymap_item_free(wmKeyMapItem *kmi) |
375 |
{
|
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
376 |
if (kmi->properties) { |
1.3.6
by Kevin Roy
Import upstream version 2.59 |
377 |
IDP_FreeProperty(kmi->properties); |
378 |
MEM_freeN(kmi->properties); |
|
379 |
}
|
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
380 |
if (kmi->ptr) |
1.3.6
by Kevin Roy
Import upstream version 2.59 |
381 |
MEM_freeN(kmi->ptr); |
382 |
}
|
|
383 |
||
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
384 |
void BKE_userdef_free(void) |
385 |
{
|
|
386 |
wmKeyMap *km; |
|
387 |
wmKeyMapItem *kmi; |
|
1.3.6
by Kevin Roy
Import upstream version 2.59 |
388 |
wmKeyMapDiffItem *kmdi; |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
389 |
bAddon *addon, *addon_next; |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
390 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
391 |
for (km = U.user_keymaps.first; km; km = km->next) { |
392 |
for (kmdi = km->diff_items.first; kmdi; kmdi = kmdi->next) { |
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
393 |
if (kmdi->add_item) { |
1.3.6
by Kevin Roy
Import upstream version 2.59 |
394 |
keymap_item_free(kmdi->add_item); |
395 |
MEM_freeN(kmdi->add_item); |
|
396 |
}
|
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
397 |
if (kmdi->remove_item) { |
1.3.6
by Kevin Roy
Import upstream version 2.59 |
398 |
keymap_item_free(kmdi->remove_item); |
399 |
MEM_freeN(kmdi->remove_item); |
|
400 |
}
|
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
401 |
}
|
402 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
403 |
for (kmi = km->items.first; kmi; kmi = kmi->next) |
1.3.6
by Kevin Roy
Import upstream version 2.59 |
404 |
keymap_item_free(kmi); |
405 |
||
406 |
BLI_freelistN(&km->diff_items); |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
407 |
BLI_freelistN(&km->items); |
408 |
}
|
|
409 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
410 |
for (addon = U.addons.first; addon; addon = addon_next) { |
411 |
addon_next = addon->next; |
|
412 |
if (addon->prop) { |
|
413 |
IDP_FreeProperty(addon->prop); |
|
414 |
MEM_freeN(addon->prop); |
|
415 |
}
|
|
416 |
MEM_freeN(addon); |
|
417 |
}
|
|
418 |
||
1.5.3
by Matteo F. Vescovi
Import upstream version 2.68a |
419 |
BLI_freelistN(&U.autoexec_paths); |
420 |
||
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
421 |
BLI_freelistN(&U.uistyles); |
422 |
BLI_freelistN(&U.uifonts); |
|
423 |
BLI_freelistN(&U.themes); |
|
1.3.6
by Kevin Roy
Import upstream version 2.59 |
424 |
BLI_freelistN(&U.user_keymaps); |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
425 |
}
|
426 |
||
427 |
/* handle changes in settings that need recalc */
|
|
428 |
void BKE_userdef_state(void) |
|
429 |
{
|
|
1.3.12
by Matteo F. Vescovi
Import upstream version 2.66 |
430 |
/* prevent accidents */
|
431 |
if (U.pixelsize == 0) U.pixelsize = 1; |
|
432 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
433 |
BLF_default_dpi(U.pixelsize * U.dpi); |
434 |
U.widget_unit = (U.pixelsize * U.dpi * 20 + 36) / 72; |
|
435 |
||
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
436 |
}
|
437 |
||
1.3.5
by Kevin Roy
Import upstream version 2.58-svn37702 |
438 |
int BKE_read_file(bContext *C, const char *filepath, ReportList *reports) |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
439 |
{
|
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
440 |
BlendFileData *bfd; |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
441 |
int retval = BKE_READ_FILE_OK; |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
442 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
443 |
if (strstr(filepath, BLENDER_STARTUP_FILE) == NULL) /* don't print user-pref loading */ |
1.3.5
by Kevin Roy
Import upstream version 2.58-svn37702 |
444 |
printf("read blend: %s\n", filepath); |
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
445 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
446 |
bfd = BLO_read_from_file(filepath, reports); |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
447 |
if (bfd) { |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
448 |
if (bfd->user) retval = BKE_READ_FILE_OK_USERPREFS; |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
449 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
450 |
if (0 == handle_subversion_warning(bfd->main, reports)) { |
1.2.10
by Chris Coulson
Import upstream version 2.49a+dfsg |
451 |
free_main(bfd->main); |
452 |
MEM_freeN(bfd); |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
453 |
bfd = NULL; |
454 |
retval = BKE_READ_FILE_FAIL; |
|
1.2.10
by Chris Coulson
Import upstream version 2.49a+dfsg |
455 |
}
|
456 |
else
|
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
457 |
setup_app_data(C, bfd, filepath); // frees BFD |
458 |
}
|
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
459 |
else
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
460 |
BKE_reports_prependf(reports, "Loading '%s' failed: ", filepath); |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
461 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
462 |
return (bfd ? retval : BKE_READ_FILE_FAIL); |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
463 |
}
|
464 |
||
1.5.4
by Matteo F. Vescovi
Import upstream version 2.69 |
465 |
int BKE_read_file_from_memory(bContext *C, const void *filebuf, int filelength, ReportList *reports, int update_defaults) |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
466 |
{
|
467 |
BlendFileData *bfd; |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
468 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
469 |
bfd = BLO_read_from_memory(filebuf, filelength, reports); |
1.5.4
by Matteo F. Vescovi
Import upstream version 2.69 |
470 |
if (bfd) { |
471 |
if (update_defaults) |
|
472 |
BLO_update_defaults_startup_blend(bfd->main); |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
473 |
setup_app_data(C, bfd, "<memory2>"); |
1.5.4
by Matteo F. Vescovi
Import upstream version 2.69 |
474 |
}
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
475 |
else
|
476 |
BKE_reports_prepend(reports, "Loading failed: "); |
|
477 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
478 |
return (bfd ? 1 : 0); |
1.1.1
by Masayuki Hatta (mhatta)
Import upstream version 2.33a |
479 |
}
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
480 |
|
1.2.5
by Lukas Fittl
Import upstream version 2.43 |
481 |
/* memfile is the undo buffer */
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
482 |
int BKE_read_file_from_memfile(bContext *C, MemFile *memfile, ReportList *reports) |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
483 |
{
|
484 |
BlendFileData *bfd; |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
485 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
486 |
bfd = BLO_read_from_memfile(CTX_data_main(C), G.main->name, memfile, reports); |
487 |
if (bfd) { |
|
488 |
/* remove the unused screens and wm */
|
|
489 |
while (bfd->main->wm.first) |
|
490 |
BKE_libblock_free(&bfd->main->wm, bfd->main->wm.first); |
|
491 |
while (bfd->main->screen.first) |
|
492 |
BKE_libblock_free(&bfd->main->screen, bfd->main->screen.first); |
|
493 |
||
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
494 |
setup_app_data(C, bfd, "<memory1>"); |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
495 |
}
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
496 |
else
|
497 |
BKE_reports_prepend(reports, "Loading failed: "); |
|
498 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
499 |
return (bfd ? 1 : 0); |
500 |
}
|
|
501 |
||
502 |
/* only read the userdef from a .blend */
|
|
503 |
int BKE_read_file_userdef(const char *filepath, ReportList *reports) |
|
504 |
{
|
|
505 |
BlendFileData *bfd; |
|
506 |
int retval = 0; |
|
507 |
||
508 |
bfd = BLO_read_from_file(filepath, reports); |
|
509 |
if (bfd->user) { |
|
510 |
retval = BKE_READ_FILE_OK_USERPREFS; |
|
511 |
||
512 |
/* only here free userdef themes... */
|
|
513 |
BKE_userdef_free(); |
|
514 |
||
515 |
U = *bfd->user; |
|
516 |
MEM_freeN(bfd->user); |
|
517 |
}
|
|
518 |
free_main(bfd->main); |
|
519 |
MEM_freeN(bfd); |
|
520 |
||
521 |
return retval; |
|
522 |
}
|
|
523 |
||
524 |
/* only write the userdef in a .blend */
|
|
525 |
int BKE_write_file_userdef(const char *filepath, ReportList *reports) |
|
526 |
{
|
|
527 |
Main *mainb = MEM_callocN(sizeof(Main), "empty main"); |
|
528 |
int retval = 0; |
|
529 |
||
530 |
if (BLO_write_file(mainb, filepath, G_FILE_USERPREFS, reports, NULL)) { |
|
531 |
retval = 1; |
|
532 |
}
|
|
533 |
||
534 |
MEM_freeN(mainb); |
|
535 |
||
536 |
return retval; |
|
537 |
}
|
|
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
538 |
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
539 |
/* ***************** testing for break ************* */
|
540 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
541 |
static void (*blender_test_break_cb)(void) = NULL; |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
542 |
|
543 |
void set_blender_test_break_cb(void (*func)(void) ) |
|
544 |
{
|
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
545 |
blender_test_break_cb = func; |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
546 |
}
|
547 |
||
548 |
||
549 |
int blender_test_break(void) |
|
550 |
{
|
|
551 |
if (!G.background) { |
|
552 |
if (blender_test_break_cb) |
|
553 |
blender_test_break_cb(); |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
554 |
}
|
555 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
556 |
return (G.is_break == TRUE); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
557 |
}
|
558 |
||
559 |
||
560 |
/* ***************** GLOBAL UNDO *************** */
|
|
561 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
562 |
#define UNDO_DISK 0
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
563 |
|
564 |
typedef struct UndoElem { |
|
565 |
struct UndoElem *next, *prev; |
|
1.3.7
by Kevin Roy
Import upstream version 2.61 |
566 |
char str[FILE_MAX]; |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
567 |
char name[BKE_UNDO_STR_MAX]; |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
568 |
MemFile memfile; |
1.2.9
by Cyril Brulebois
Import upstream version 2.48a+dfsg |
569 |
uintptr_t undosize; |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
570 |
} UndoElem; |
571 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
572 |
static ListBase undobase = {NULL, NULL}; |
573 |
static UndoElem *curundo = NULL; |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
574 |
|
575 |
||
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
576 |
static int read_undosave(bContext *C, UndoElem *uel) |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
577 |
{
|
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
578 |
char mainstr[sizeof(G.main->name)]; |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
579 |
int success = 0, fileflags; |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
580 |
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
581 |
/* This is needed so undoing/redoing doesn't crash with threaded previews going */
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
582 |
WM_jobs_kill_all_except(CTX_wm_manager(C), CTX_wm_screen(C)); |
583 |
||
584 |
BLI_strncpy(mainstr, G.main->name, sizeof(mainstr)); /* temporal store */ |
|
585 |
||
586 |
fileflags = G.fileflags; |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
587 |
G.fileflags |= G_FILE_NO_UI; |
588 |
||
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
589 |
if (UNDO_DISK) |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
590 |
success = (BKE_read_file(C, uel->str, NULL) != BKE_READ_FILE_FAIL); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
591 |
else
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
592 |
success = BKE_read_file_from_memfile(C, &uel->memfile, NULL); |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
593 |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
594 |
/* restore */
|
1.3.3
by Kevin Roy
Import upstream version 2.57-svn36147 |
595 |
BLI_strncpy(G.main->name, mainstr, sizeof(G.main->name)); /* restore */ |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
596 |
G.fileflags = fileflags; |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
597 |
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
598 |
if (success) { |
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
599 |
/* important not to update time here, else non keyed tranforms are lost */
|
1.3.3
by Kevin Roy
Import upstream version 2.57-svn36147 |
600 |
DAG_on_visible_update(G.main, FALSE); |
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
601 |
}
|
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
602 |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
603 |
return success; |
604 |
}
|
|
605 |
||
606 |
/* name can be a dynamic string */
|
|
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
607 |
void BKE_write_undo(bContext *C, const char *name) |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
608 |
{
|
1.2.9
by Cyril Brulebois
Import upstream version 2.48a+dfsg |
609 |
uintptr_t maxmem, totmem, memused; |
1.3.7
by Kevin Roy
Import upstream version 2.61 |
610 |
int nr /*, success */ /* UNUSED */; |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
611 |
UndoElem *uel; |
612 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
613 |
if ((U.uiflag & USER_GLOBALUNDO) == 0) { |
614 |
return; |
|
615 |
}
|
|
616 |
||
617 |
if (U.undosteps == 0) { |
|
618 |
return; |
|
619 |
}
|
|
1.2.2
by Daniel Holbach
Import upstream version 2.40 |
620 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
621 |
/* remove all undos after (also when curundo == NULL) */
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
622 |
while (undobase.last != curundo) { |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
623 |
uel = undobase.last; |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
624 |
BLI_remlink(&undobase, uel); |
625 |
BLO_free_memfile(&uel->memfile); |
|
626 |
MEM_freeN(uel); |
|
627 |
}
|
|
628 |
||
629 |
/* make new */
|
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
630 |
curundo = uel = MEM_callocN(sizeof(UndoElem), "undo file"); |
1.3.7
by Kevin Roy
Import upstream version 2.61 |
631 |
BLI_strncpy(uel->name, name, sizeof(uel->name)); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
632 |
BLI_addtail(&undobase, uel); |
633 |
||
634 |
/* and limit amount to the maximum */
|
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
635 |
nr = 0; |
636 |
uel = undobase.last; |
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
637 |
while (uel) { |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
638 |
nr++; |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
639 |
if (nr == U.undosteps) break; |
640 |
uel = uel->prev; |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
641 |
}
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
642 |
if (uel) { |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
643 |
while (undobase.first != uel) { |
644 |
UndoElem *first = undobase.first; |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
645 |
BLI_remlink(&undobase, first); |
646 |
/* the merge is because of compression */
|
|
647 |
BLO_merge_memfile(&first->memfile, &first->next->memfile); |
|
648 |
MEM_freeN(first); |
|
649 |
}
|
|
650 |
}
|
|
651 |
||
652 |
||
653 |
/* disk save version */
|
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
654 |
if (UNDO_DISK) { |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
655 |
static int counter = 0; |
1.3.7
by Kevin Roy
Import upstream version 2.61 |
656 |
char filepath[FILE_MAX]; |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
657 |
char numstr[32]; |
1.3.5
by Kevin Roy
Import upstream version 2.58-svn37702 |
658 |
int fileflags = G.fileflags & ~(G_FILE_HISTORY); /* don't do file history on undo */ |
659 |
||
660 |
/* calculate current filepath */
|
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
661 |
counter++; |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
662 |
counter = counter % U.undosteps; |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
663 |
|
1.3.3
by Kevin Roy
Import upstream version 2.57-svn36147 |
664 |
BLI_snprintf(numstr, sizeof(numstr), "%d.blend", counter); |
1.3.7
by Kevin Roy
Import upstream version 2.61 |
665 |
BLI_make_file_string("/", filepath, BLI_temporary_dir(), numstr); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
666 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
667 |
/* success = */ /* UNUSED */ BLO_write_file(CTX_data_main(C), filepath, fileflags, NULL, NULL); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
668 |
|
1.3.5
by Kevin Roy
Import upstream version 2.58-svn37702 |
669 |
BLI_strncpy(curundo->str, filepath, sizeof(curundo->str)); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
670 |
}
|
671 |
else { |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
672 |
MemFile *prevfile = NULL; |
673 |
||
674 |
if (curundo->prev) prevfile = &(curundo->prev->memfile); |
|
675 |
||
676 |
memused = MEM_get_memory_in_use(); |
|
677 |
/* success = */ /* UNUSED */ BLO_write_file_mem(CTX_data_main(C), prevfile, &curundo->memfile, G.fileflags); |
|
678 |
curundo->undosize = MEM_get_memory_in_use() - memused; |
|
1.2.9
by Cyril Brulebois
Import upstream version 2.48a+dfsg |
679 |
}
|
680 |
||
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
681 |
if (U.undomemory != 0) { |
1.2.9
by Cyril Brulebois
Import upstream version 2.48a+dfsg |
682 |
/* limit to maximum memory (afterwards, we can't know in advance) */
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
683 |
totmem = 0; |
684 |
maxmem = ((uintptr_t)U.undomemory) * 1024 * 1024; |
|
1.2.9
by Cyril Brulebois
Import upstream version 2.48a+dfsg |
685 |
|
686 |
/* keep at least two (original + other) */
|
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
687 |
uel = undobase.last; |
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
688 |
while (uel && uel->prev) { |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
689 |
totmem += uel->undosize; |
690 |
if (totmem > maxmem) break; |
|
691 |
uel = uel->prev; |
|
1.2.9
by Cyril Brulebois
Import upstream version 2.48a+dfsg |
692 |
}
|
693 |
||
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
694 |
if (uel) { |
695 |
if (uel->prev && uel->prev->prev) |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
696 |
uel = uel->prev; |
1.2.9
by Cyril Brulebois
Import upstream version 2.48a+dfsg |
697 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
698 |
while (undobase.first != uel) { |
699 |
UndoElem *first = undobase.first; |
|
1.2.9
by Cyril Brulebois
Import upstream version 2.48a+dfsg |
700 |
BLI_remlink(&undobase, first); |
701 |
/* the merge is because of compression */
|
|
702 |
BLO_merge_memfile(&first->memfile, &first->next->memfile); |
|
703 |
MEM_freeN(first); |
|
704 |
}
|
|
705 |
}
|
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
706 |
}
|
707 |
}
|
|
708 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
709 |
/* 1 = an undo, -1 is a redo. we have to make sure 'curundo' remains at current situation */
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
710 |
void BKE_undo_step(bContext *C, int step) |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
711 |
{
|
712 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
713 |
if (step == 0) { |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
714 |
read_undosave(C, curundo); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
715 |
}
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
716 |
else if (step == 1) { |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
717 |
/* curundo should never be NULL, after restart or load file it should call undo_save */
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
718 |
if (curundo == NULL || curundo->prev == NULL) { |
719 |
// XXX error("No undo available");
|
|
720 |
}
|
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
721 |
else { |
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
722 |
if (G.debug & G_DEBUG) printf("undo %s\n", curundo->name); |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
723 |
curundo = curundo->prev; |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
724 |
read_undosave(C, curundo); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
725 |
}
|
726 |
}
|
|
727 |
else { |
|
728 |
/* curundo has to remain current situation! */
|
|
729 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
730 |
if (curundo == NULL || curundo->next == NULL) { |
731 |
// XXX error("No redo available");
|
|
732 |
}
|
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
733 |
else { |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
734 |
read_undosave(C, curundo->next); |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
735 |
curundo = curundo->next; |
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
736 |
if (G.debug & G_DEBUG) printf("redo %s\n", curundo->name); |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
737 |
}
|
738 |
}
|
|
739 |
}
|
|
740 |
||
741 |
void BKE_reset_undo(void) |
|
742 |
{
|
|
743 |
UndoElem *uel; |
|
744 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
745 |
uel = undobase.first; |
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
746 |
while (uel) { |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
747 |
BLO_free_memfile(&uel->memfile); |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
748 |
uel = uel->next; |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
749 |
}
|
750 |
||
751 |
BLI_freelistN(&undobase); |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
752 |
curundo = NULL; |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
753 |
}
|
754 |
||
755 |
/* based on index nr it does a restore */
|
|
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
756 |
void BKE_undo_number(bContext *C, int nr) |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
757 |
{
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
758 |
curundo = BLI_findlink(&undobase, nr); |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
759 |
BKE_undo_step(C, 0); |
760 |
}
|
|
761 |
||
762 |
/* go back to the last occurance of name in stack */
|
|
763 |
void BKE_undo_name(bContext *C, const char *name) |
|
764 |
{
|
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
765 |
UndoElem *uel = BLI_rfindstring(&undobase, name, offsetof(UndoElem, name)); |
1.3.2
by Kevin Roy
Import upstream version 2.56.1-beta-svn34076 |
766 |
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
767 |
if (uel && uel->prev) { |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
768 |
curundo = uel->prev; |
1.4.1
by Cyril Brulebois
Import upstream version 2.50~alpha~0~svn24834 |
769 |
BKE_undo_step(C, 0); |
770 |
}
|
|
771 |
}
|
|
772 |
||
1.3.3
by Kevin Roy
Import upstream version 2.57-svn36147 |
773 |
/* name optional */
|
774 |
int BKE_undo_valid(const char *name) |
|
775 |
{
|
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
776 |
if (name) { |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
777 |
UndoElem *uel = BLI_rfindstring(&undobase, name, offsetof(UndoElem, name)); |
1.3.3
by Kevin Roy
Import upstream version 2.57-svn36147 |
778 |
return uel && uel->prev; |
779 |
}
|
|
780 |
||
781 |
return undobase.last != undobase.first; |
|
782 |
}
|
|
783 |
||
1.3.5
by Kevin Roy
Import upstream version 2.58-svn37702 |
784 |
/* get name of undo item, return null if no item with this index */
|
785 |
/* if active pointer, set it to 1 if true */
|
|
1.3.7
by Kevin Roy
Import upstream version 2.61 |
786 |
const char *BKE_undo_get_name(int nr, int *active) |
1.3.5
by Kevin Roy
Import upstream version 2.58-svn37702 |
787 |
{
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
788 |
UndoElem *uel = BLI_findlink(&undobase, nr); |
1.3.5
by Kevin Roy
Import upstream version 2.58-svn37702 |
789 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
790 |
if (active) *active = 0; |
1.3.5
by Kevin Roy
Import upstream version 2.58-svn37702 |
791 |
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
792 |
if (uel) { |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
793 |
if (active && uel == curundo) |
794 |
*active = 1; |
|
1.3.5
by Kevin Roy
Import upstream version 2.58-svn37702 |
795 |
return uel->name; |
796 |
}
|
|
797 |
return NULL; |
|
798 |
}
|
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
799 |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
800 |
/* saves .blend using undo buffer, returns 1 == success */
|
801 |
int BKE_undo_save_file(const char *filename) |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
802 |
{
|
803 |
UndoElem *uel; |
|
804 |
MemFileChunk *chunk; |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
805 |
const int flag = O_BINARY + O_WRONLY + O_CREAT + O_TRUNC + O_EXCL; |
1.1.2
by Martin Pitt
Import upstream version 2.37a |
806 |
int file; |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
807 |
|
808 |
if ((U.uiflag & USER_GLOBALUNDO) == 0) { |
|
809 |
return 0; |
|
810 |
}
|
|
811 |
||
812 |
uel = curundo; |
|
813 |
if (uel == NULL) { |
|
814 |
fprintf(stderr, "No undo buffer to save recovery file\n"); |
|
815 |
return 0; |
|
816 |
}
|
|
817 |
||
818 |
/* first try create the file, if it exists call without 'O_CREAT',
|
|
819 |
* to avoid writing to a symlink - use 'O_EXCL' (CVE-2008-1103) */
|
|
820 |
errno = 0; |
|
821 |
file = BLI_open(filename, flag, 0666); |
|
1.5.4
by Matteo F. Vescovi
Import upstream version 2.69 |
822 |
if (file < 0) { |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
823 |
if (errno == EEXIST) { |
824 |
errno = 0; |
|
825 |
file = BLI_open(filename, flag & ~O_CREAT, 0666); |
|
826 |
}
|
|
827 |
}
|
|
828 |
||
829 |
if (file == -1) { |
|
830 |
fprintf(stderr, "Unable to save '%s': %s\n", |
|
831 |
filename, errno ? strerror(errno) : "Unknown error opening file"); |
|
832 |
return 0; |
|
833 |
}
|
|
834 |
||
835 |
for (chunk = uel->memfile.chunks.first; chunk; chunk = chunk->next) { |
|
836 |
if (write(file, chunk->buf, chunk->size) != chunk->size) { |
|
837 |
break; |
|
838 |
}
|
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
839 |
}
|
840 |
||
841 |
close(file); |
|
842 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
843 |
if (chunk) { |
844 |
fprintf(stderr, "Unable to save '%s': %s\n", |
|
845 |
filename, errno ? strerror(errno) : "Unknown error writing file"); |
|
846 |
return 0; |
|
847 |
}
|
|
848 |
return 1; |
|
1.1.2
by Martin Pitt
Import upstream version 2.37a |
849 |
}
|
850 |
||
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
851 |
/* sets curscene */
|
852 |
Main *BKE_undo_get_main(Scene **scene) |
|
853 |
{
|
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
854 |
Main *mainp = NULL; |
855 |
BlendFileData *bfd = BLO_read_from_memfile(G.main, G.main->name, &curundo->memfile, NULL); |
|
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
856 |
|
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
857 |
if (bfd) { |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
858 |
mainp = bfd->main; |
1.3.9
by Matteo F. Vescovi
Import upstream version 2.63 |
859 |
if (scene) |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
860 |
*scene = bfd->curscene; |
1.4.2
by Kevin Roy
Import upstream version 2.53-beta-svn30596 |
861 |
|
862 |
MEM_freeN(bfd); |
|
863 |
}
|
|
864 |
||
865 |
return mainp; |
|
866 |
}
|
|
867 |
||
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
868 |
/* ************** copy paste .blend, partial saves ********** */
|
869 |
||
870 |
/* assumes data is in G.main */
|
|
871 |
||
872 |
void BKE_copybuffer_begin(void) |
|
873 |
{
|
|
874 |
/* set all id flags to zero; */
|
|
875 |
flag_all_listbases_ids(LIB_NEED_EXPAND | LIB_DOIT, 0); |
|
876 |
}
|
|
877 |
||
878 |
void BKE_copybuffer_tag_ID(ID *id) |
|
879 |
{
|
|
880 |
id->flag |= LIB_NEED_EXPAND | LIB_DOIT; |
|
881 |
}
|
|
882 |
||
883 |
static void copybuffer_doit(void *UNUSED(handle), Main *UNUSED(bmain), void *vid) |
|
884 |
{
|
|
885 |
if (vid) { |
|
886 |
ID *id = vid; |
|
1.5.1
by Jeremy Bicha
Import upstream version 2.66a |
887 |
/* only tag for need-expand if not done, prevents eternal loops */
|
888 |
if ((id->flag & LIB_DOIT) == 0) |
|
889 |
id->flag |= LIB_NEED_EXPAND | LIB_DOIT; |
|
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
890 |
}
|
891 |
}
|
|
892 |
||
893 |
/* frees main in end */
|
|
1.5.2
by Matteo F. Vescovi
Import upstream version 2.67b |
894 |
int BKE_copybuffer_save(const char *filename, ReportList *reports) |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
895 |
{
|
896 |
Main *mainb = MEM_callocN(sizeof(Main), "copybuffer"); |
|
897 |
ListBase *lbarray[MAX_LIBARRAY], *fromarray[MAX_LIBARRAY]; |
|
898 |
int a, retval; |
|
899 |
||
900 |
BLO_main_expander(copybuffer_doit); |
|
901 |
BLO_expand_main(NULL, G.main); |
|
902 |
||
903 |
/* move over all tagged blocks */
|
|
904 |
set_listbasepointers(G.main, fromarray); |
|
905 |
a = set_listbasepointers(mainb, lbarray); |
|
906 |
while (a--) { |
|
907 |
ID *id, *nextid; |
|
908 |
ListBase *lb1 = lbarray[a], *lb2 = fromarray[a]; |
|
909 |
||
910 |
for (id = lb2->first; id; id = nextid) { |
|
911 |
nextid = id->next; |
|
912 |
if (id->flag & LIB_DOIT) { |
|
913 |
BLI_remlink(lb2, id); |
|
914 |
BLI_addtail(lb1, id); |
|
915 |
}
|
|
916 |
}
|
|
917 |
}
|
|
918 |
||
919 |
||
920 |
/* save the buffer */
|
|
921 |
retval = BLO_write_file(mainb, filename, 0, reports, NULL); |
|
922 |
||
923 |
/* move back the main, now sorted again */
|
|
924 |
set_listbasepointers(G.main, lbarray); |
|
925 |
a = set_listbasepointers(mainb, fromarray); |
|
926 |
while (a--) { |
|
927 |
ID *id; |
|
928 |
ListBase *lb1 = lbarray[a], *lb2 = fromarray[a]; |
|
929 |
||
1.5.4
by Matteo F. Vescovi
Import upstream version 2.69 |
930 |
while ((id = BLI_pophead(lb2))) { |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
931 |
BLI_addtail(lb1, id); |
932 |
id_sort_by_name(lb1, id); |
|
933 |
}
|
|
934 |
}
|
|
935 |
||
936 |
MEM_freeN(mainb); |
|
937 |
||
938 |
/* set id flag to zero; */
|
|
939 |
flag_all_listbases_ids(LIB_NEED_EXPAND | LIB_DOIT, 0); |
|
940 |
||
941 |
return retval; |
|
942 |
}
|
|
943 |
||
944 |
/* return success (1) */
|
|
1.5.2
by Matteo F. Vescovi
Import upstream version 2.67b |
945 |
int BKE_copybuffer_paste(bContext *C, const char *libname, ReportList *reports) |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
946 |
{
|
947 |
Main *bmain = CTX_data_main(C); |
|
948 |
Scene *scene = CTX_data_scene(C); |
|
949 |
Main *mainl = NULL; |
|
950 |
Library *lib; |
|
951 |
BlendHandle *bh; |
|
952 |
||
953 |
bh = BLO_blendhandle_from_file(libname, reports); |
|
954 |
||
955 |
if (bh == NULL) { |
|
956 |
/* error reports will have been made by BLO_blendhandle_from_file() */
|
|
957 |
return 0; |
|
958 |
}
|
|
959 |
||
960 |
BKE_scene_base_deselect_all(scene); |
|
961 |
||
962 |
/* tag everything, all untagged data can be made local
|
|
963 |
* its also generally useful to know what is new
|
|
964 |
*
|
|
965 |
* take extra care flag_all_listbases_ids(LIB_LINK_TAG, 0) is called after! */
|
|
966 |
flag_all_listbases_ids(LIB_PRE_EXISTING, 1); |
|
967 |
||
968 |
/* here appending/linking starts */
|
|
969 |
mainl = BLO_library_append_begin(bmain, &bh, libname); |
|
970 |
||
971 |
BLO_library_append_all(mainl, bh); |
|
972 |
||
973 |
BLO_library_append_end(C, mainl, &bh, 0, 0); |
|
974 |
||
975 |
/* mark all library linked objects to be updated */
|
|
976 |
recalc_all_library_objects(bmain); |
|
977 |
IMB_colormanagement_check_file_config(bmain); |
|
978 |
||
979 |
/* append, rather than linking */
|
|
980 |
lib = BLI_findstring(&bmain->library, libname, offsetof(Library, filepath)); |
|
1.5.2
by Matteo F. Vescovi
Import upstream version 2.67b |
981 |
BKE_library_make_local(bmain, lib, true); |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
982 |
|
983 |
/* important we unset, otherwise these object wont
|
|
984 |
* link into other scenes from this blend file */
|
|
985 |
flag_all_listbases_ids(LIB_PRE_EXISTING, 0); |
|
986 |
||
987 |
/* recreate dependency graph to include new objects */
|
|
1.5.2
by Matteo F. Vescovi
Import upstream version 2.67b |
988 |
DAG_relations_tag_update(bmain); |
1.3.11
by Matteo F. Vescovi
Import upstream version 2.65a+svn53743 |
989 |
|
990 |
BLO_blendhandle_close(bh); |
|
991 |
/* remove library... */
|
|
992 |
||
993 |
return 1; |
|
994 |
}
|