Fix: Geometry Nodes Subdiv Surface Crash
[blender.git] / source / blender / blenloader / intern / readfile.h
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) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  * blenloader readfile private function prototypes
19  */
20
21 /** \file
22  * \ingroup blenloader
23  */
24
25 #pragma once
26
27 #ifdef WIN32
28 #  include "BLI_winstuff.h"
29 #endif
30
31 #include "BLI_filereader.h"
32 #include "DNA_sdna_types.h"
33 #include "DNA_space_types.h"
34 #include "DNA_windowmanager_types.h" /* for ReportType */
35
36 struct BLI_mmap_file;
37 struct BLOCacheStorage;
38 struct IDNameLib_Map;
39 struct Key;
40 struct MemFile;
41 struct Object;
42 struct OldNewMap;
43 struct ReportList;
44 struct UserDef;
45
46 typedef struct IDNameLib_Map IDNameLib_Map;
47
48 enum eFileDataFlag {
49   FD_FLAGS_SWITCH_ENDIAN = 1 << 0,
50   FD_FLAGS_FILE_POINTSIZE_IS_4 = 1 << 1,
51   FD_FLAGS_POINTSIZE_DIFFERS = 1 << 2,
52   FD_FLAGS_FILE_OK = 1 << 3,
53   FD_FLAGS_IS_MEMFILE = 1 << 4,
54   /* XXX Unused in practice (checked once but never set). */
55   FD_FLAGS_NOT_MY_LIBMAP = 1 << 5,
56 };
57
58 /* Disallow since it's 32bit on ms-windows. */
59 #ifdef __GNUC__
60 #  pragma GCC poison off_t
61 #endif
62
63 typedef struct FileData {
64   /** Linked list of BHeadN's. */
65   ListBase bhead_list;
66   enum eFileDataFlag flags;
67   bool is_eof;
68
69   FileReader *file;
70
71   /** Whether we are undoing (< 0) or redoing (> 0), used to choose which 'unchanged' flag to use
72    * to detect unchanged data from memfile. */
73   int undo_direction; /* eUndoStepDir */
74
75   /** Now only in use for library appending. */
76   char relabase[FILE_MAX];
77
78   /** General reading variables. */
79   struct SDNA *filesdna;
80   const struct SDNA *memsdna;
81   /** Array of #eSDNA_StructCompare. */
82   const char *compflags;
83   struct DNA_ReconstructInfo *reconstruct_info;
84
85   int fileversion;
86   /** Used to retrieve ID names from (bhead+1). */
87   int id_name_offset;
88   /** Used to retrieve asset data from (bhead+1). NOTE: This may not be available in old files,
89    * will be -1 then! */
90   int id_asset_data_offset;
91   /** For do_versions patching. */
92   int globalf, fileflags;
93
94   /** Optionally skip some data-blocks when they're not needed. */
95   eBLOReadSkip skip_flags;
96
97   /**
98    * Tag to apply to all loaded ID data-blocks.
99    *
100    * \note This is initialized from #LibraryLink_Params.id_tag_extra since passing it as an
101    * argument would need an additional argument to be passed around when expanding library data.
102    */
103   int id_tag_extra;
104
105   struct OldNewMap *datamap;
106   struct OldNewMap *globmap;
107   struct OldNewMap *libmap;
108   struct OldNewMap *packedmap;
109   struct BLOCacheStorage *cache_storage;
110
111   struct BHeadSort *bheadmap;
112   int tot_bheadmap;
113
114   /** See: #USE_GHASH_BHEAD. */
115   struct GHash *bhead_idname_hash;
116
117   ListBase *mainlist;
118   /** Used for undo. */
119   ListBase *old_mainlist;
120   struct IDNameLib_Map *old_idmap;
121
122   struct BlendFileReadReport *reports;
123 } FileData;
124
125 #define SIZEOFBLENDERHEADER 12
126
127 /***/
128 struct Main;
129 void blo_join_main(ListBase *mainlist);
130 void blo_split_main(ListBase *mainlist, struct Main *main);
131
132 BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath);
133
134 FileData *blo_filedata_from_file(const char *filepath, struct BlendFileReadReport *reports);
135 FileData *blo_filedata_from_memory(const void *mem,
136                                    int memsize,
137                                    struct BlendFileReadReport *reports);
138 FileData *blo_filedata_from_memfile(struct MemFile *memfile,
139                                     const struct BlendFileReadParams *params,
140                                     struct BlendFileReadReport *reports);
141
142 void blo_clear_proxy_pointers_from_lib(struct Main *oldmain);
143 void blo_make_packed_pointer_map(FileData *fd, struct Main *oldmain);
144 void blo_end_packed_pointer_map(FileData *fd, struct Main *oldmain);
145 void blo_add_library_pointer_map(ListBase *old_mainlist, FileData *fd);
146 void blo_make_old_idmap_from_main(FileData *fd, struct Main *bmain);
147
148 BHead *blo_read_asset_data_block(FileData *fd, BHead *bhead, struct AssetMetaData **r_asset_data);
149
150 void blo_cache_storage_init(FileData *fd, struct Main *bmain);
151 void blo_cache_storage_old_bmain_clear(FileData *fd, struct Main *bmain_old);
152 void blo_cache_storage_end(FileData *fd);
153
154 void blo_filedata_free(FileData *fd);
155
156 BHead *blo_bhead_first(FileData *fd);
157 BHead *blo_bhead_next(FileData *fd, BHead *thisblock);
158 BHead *blo_bhead_prev(FileData *fd, BHead *thisblock);
159
160 const char *blo_bhead_id_name(const FileData *fd, const BHead *bhead);
161 struct AssetMetaData *blo_bhead_id_asset_data_address(const FileData *fd, const BHead *bhead);
162
163 /* do versions stuff */
164
165 void blo_do_versions_dna(struct SDNA *sdna, const int versionfile, const int subversionfile);
166
167 void blo_do_versions_oldnewmap_insert(struct OldNewMap *onm,
168                                       const void *oldaddr,
169                                       void *newaddr,
170                                       int nr);
171 void *blo_do_versions_newlibadr(struct FileData *fd, const void *lib, const void *adr);
172 void *blo_do_versions_newlibadr_us(struct FileData *fd, const void *lib, const void *adr);
173
174 void blo_do_version_old_trackto_to_constraints(struct Object *ob);
175 void blo_do_versions_key_uidgen(struct Key *key);
176
177 void blo_do_versions_userdef(struct UserDef *userdef);
178
179 void blo_do_versions_pre250(struct FileData *fd, struct Library *lib, struct Main *bmain);
180 void blo_do_versions_250(struct FileData *fd, struct Library *lib, struct Main *bmain);
181 void blo_do_versions_260(struct FileData *fd, struct Library *lib, struct Main *bmain);
182 void blo_do_versions_270(struct FileData *fd, struct Library *lib, struct Main *bmain);
183 void blo_do_versions_280(struct FileData *fd, struct Library *lib, struct Main *bmain);
184 void blo_do_versions_290(struct FileData *fd, struct Library *lib, struct Main *bmain);
185 void blo_do_versions_300(struct FileData *fd, struct Library *lib, struct Main *bmain);
186 void blo_do_versions_cycles(struct FileData *fd, struct Library *lib, struct Main *bmain);
187
188 void do_versions_after_linking_250(struct Main *bmain);
189 void do_versions_after_linking_260(struct Main *bmain);
190 void do_versions_after_linking_270(struct Main *bmain);
191 void do_versions_after_linking_280(struct Main *bmain, struct ReportList *reports);
192 void do_versions_after_linking_290(struct Main *bmain, struct ReportList *reports);
193 void do_versions_after_linking_300(struct Main *bmain, struct ReportList *reports);
194 void do_versions_after_linking_cycles(struct Main *bmain);
195
196 /* This is rather unfortunate to have to expose this here, but better use that nasty hack in
197  * do_version than readfile itself. */
198 void *blo_read_get_new_globaldata_address(struct FileData *fd, const void *adr);