Commit: 6bae0159856a0a4e6c41f7ff0a292e113e0e5a92
Author: Bastien Montagne
Date:   Tue May 24 14:44:13 2016 +0200
Branches: asset-engine
https://developer.blender.org/rB6bae0159856a0a4e6c41f7ff0a292e113e0e5a92

Merge branch 'master' into asset-engine

===================================================================



===================================================================

diff --cc source/blender/blenkernel/BKE_library.h
index 405728f,2215fbf..c604c2b
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@@ -121,22 -119,9 +121,23 @@@ void BKE_main_lib_objects_recalc_all(st
  /* (MAX_ID_NAME - 2) + 3 */
  void BKE_id_ui_prefix(char name[66 + 1], const struct ID *id);
  
- void BKE_library_make_local(struct Main *bmain, struct Library *lib, bool 
untagged_only, bool set_fake);
+ void BKE_library_make_local(
+         struct Main *bmain, const struct Library *lib, const bool 
untagged_only, const bool set_fake);
  
 +void BKE_library_asset_repository_init(struct Library *lib, const struct 
AssetEngineType *aet, const char *repo_root);
 +void BKE_library_asset_repository_clear(struct Library *lib);
 +void BKE_library_asset_repository_free(struct Library *lib);
 +struct AssetRef *BKE_library_asset_repository_asset_add(struct Library *lib, 
const void *idv);
 +void BKE_library_asset_repository_asset_remove(struct Library *lib, const 
void *idv);
 +struct AssetRef *BKE_library_asset_repository_asset_find(struct Library *lib, 
const void *idv);
 +void BKE_library_asset_repository_subdata_add(struct AssetRef *aref, const 
void *idv);
 +void BKE_library_asset_repository_subdata_remove(struct AssetRef *aref, const 
void *idv);
 +
 +void BKE_libraries_asset_subdata_remove(struct Main *bmain, const void *idv);
 +void BKE_libraries_asset_repositories_clear(struct Main *bmain);
 +void BKE_libraries_asset_repositories_rebuild(struct Main *bmain);
 +struct AssetRef *BKE_libraries_asset_repository_uuid_find(struct Main *bmain, 
const struct AssetUUID *uuid);
 +
  typedef void (*BKE_library_free_window_manager_cb)(struct bContext *, struct 
wmWindowManager *);
  typedef void (*BKE_library_free_notifier_reference_cb)(const void *);
  typedef void (*BKE_library_free_editor_id_reference_cb)(const struct ID *);
diff --cc source/blender/editors/space_file/filelist.c
index 26762cd,8e1f781..3d0270e
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@@ -1513,50 -1419,39 +1513,50 @@@ bool filelist_pending(struct FileList *
   * Limited version of full update done by space_file's file_refresh(), to be 
used by operators and such.
   * Ensures given filelist is ready to be used (i.e. it is filtered and 
sorted), unless it is tagged for a full refresh.
   */
 -int filelist_files_ensure(FileList *filelist)
 +int filelist_files_ensure(FileList *filelist, FileSelectParams *params)
  {
        if (!filelist_force_reset(filelist) || !filelist_empty(filelist)) {
 -              filelist_sort(filelist);
 -              filelist_filter(filelist);
 +              filelist_sort_filter(filelist, params);
        }
  
-       return filelist->filelist.nbr_entries_filtered;;
+       return filelist->filelist.nbr_entries_filtered;
  }
  
 +
 +static FileDirEntry *filelist_file_create_entries_block(FileList *filelist, 
const int index, const int size);
 +
  static FileDirEntry *filelist_file_create_entry(FileList *filelist, const int 
index)
  {
 -      FileListInternEntry *entry = filelist->filelist_intern.filtered[index];
        FileListEntryCache *cache = &filelist->filelist_cache;
        FileDirEntry *ret;
 -      FileDirEntryRevision *rev;
  
 -      ret = MEM_callocN(sizeof(*ret), __func__);
 -      rev = MEM_callocN(sizeof(*rev), __func__);
 +      if (filelist->ae) {
 +              ret = filelist_file_create_entries_block(filelist, index, 1);
  
 -      rev->size = (uint64_t)entry->st.st_size;
 +              BLI_assert(!ret || !ret->next);
 +      }
 +      else {
 +              FileListInternEntry *entry = 
filelist->filelist_intern.filtered[index];
 +              FileDirEntryRevision *rev;
 +
 +              ret = MEM_callocN(sizeof(*ret), __func__);
 +              rev = MEM_callocN(sizeof(*rev), __func__);
  
 -      rev->time = (int64_t)entry->st.st_mtime;
 +              rev->size = (uint64_t)entry->st.st_size;
  
 -      ret->entry = rev;
 -      ret->relpath = BLI_strdup(entry->relpath);
 -      ret->name = BLI_strdup(entry->name);
 -      ret->description = BLI_strdupcat(filelist->filelist.root, 
entry->relpath);
 -      memcpy(ret->uuid, entry->uuid, sizeof(ret->uuid));
 -      ret->blentype = entry->blentype;
 -      ret->typeflag = entry->typeflag;
 +              rev->time = (int64_t)entry->st.st_mtime;
 +
 +              ret->entry = rev;
 +              ret->relpath = BLI_strdup(entry->relpath);
 +              ret->name = BLI_strdup(entry->name);
 +              ret->description = BLI_strdupcat(filelist->filelist.root, 
entry->relpath);
 +              memcpy(ret->uuid, entry->uuid, sizeof(ret->uuid));
 +              ret->blentype = entry->blentype;
 +              ret->typeflag = entry->typeflag;
 +
 +              BLI_addtail(&cache->cached_entries, ret);
 +      }
  
 -      BLI_addtail(&cache->cached_entries, ret);
        return ret;
  }
  
diff --cc source/blender/windowmanager/intern/wm_files_link.c
index 5e97a63,2e4a4b6..1dbd230
--- a/source/blender/windowmanager/intern/wm_files_link.c
+++ b/source/blender/windowmanager/intern/wm_files_link.c
@@@ -525,325 -513,8 +545,328 @@@ void WM_OT_append(wmOperatorType *ot
                FILE_DEFAULTDISPLAY, FILE_SORT_ALPHA);
  
        wm_link_append_properties_common(ot, false);
-       RNA_def_boolean(ot->srna, "set_fake", false, "Fake User", "Set Fake 
User for appended items (except Objects and Groups)");
+       RNA_def_boolean(ot->srna, "set_fake", false, "Fake User",
+                       "Set Fake User for appended items (except Objects and 
Groups)");
+       RNA_def_boolean(ot->srna, "use_recursive", true, "Localize All",
+                       "Localize all appended data, including those indirectly 
linked from other libraries");
  }
 +
 +
 +/** \name Asset-related operators.
 + *
 + * \{ */
 +
 +typedef struct AssetUpdateCheckEngine {
 +      struct AssetUpdateCheckEngine *next, *prev;
 +      AssetEngine *ae;
 +
 +      /* Note: We cannot store IDs themselves in non-locking async task... so 
we'll have to check again for
 +       *       UUID/IDs mapping on each update call... Not ideal, but don't 
think it will be that big of an override
 +       *       in practice. */
 +      AssetUUIDList uuids;
 +      int ae_job_id;
 +      short status;
 +} AssetUpdateCheckEngine;
 +
 +typedef struct AssetUpdateCheckJob {
 +      ListBase engines;
 +      short flag;
 +
 +      float *progress;
 +      short *stop;
 +} AssetUpdateCheckJob;
 +
 +/* AssetUpdateCheckEngine.status */
 +enum {
 +      AUCE_UPDATE_CHECK_DONE  = 1 << 0,  /* Update check is finished for this 
engine. */
 +      AUCE_ENSURE_ASSETS_DONE = 1 << 1,  /* Asset ensure is finished for this 
engine (if applicable). */
 +};
 +
 +/* AssetUpdateCheckJob.flag */
 +enum {
 +      AUCJ_ENSURE_ASSETS = 1 << 0,  /* Try to perform the 'ensure' task too. 
*/
 +};
 +
 +/* Helper to fetch a set of assets to handle, regrouped by asset engine. */
 +static void asset_update_engines_uuids_fetch(
 +        ListBase *engines,
 +        Main *bmain, AssetUUIDList *uuids, const short uuid_tags,
 +        const bool do_reset_tags)
 +{
 +      for (Library *lib = bmain->library.first; lib; lib = lib->id.next) {
 +              if (lib->asset_repository) {
 +                      printf("Checking lib file %s (engine %s, ver. %d)\n", 
lib->filepath,
 +                             lib->asset_repository->asset_engine, 
lib->asset_repository->asset_engine_version);
 +
 +                      AssetUpdateCheckEngine *auce = NULL;
 +                      AssetEngineType *ae_type = 
BKE_asset_engines_find(lib->asset_repository->asset_engine);
 +                      bool copy_engine = false;
 +
 +                      if (ae_type == NULL) {
 +                              printf("ERROR! Unknown asset engine!\n");
 +                      }
 +
 +                      for (AssetRef *aref = 
lib->asset_repository->assets.first; aref; aref = aref->next) {
 +                              ID *id = ((LinkData 
*)aref->id_list.first)->data;
 +                              BLI_assert(id->uuid);
 +
 +                              if (uuid_tags && !(id->uuid->tag & uuid_tags)) {
 +                                      continue;
 +                              }
 +
 +                              if (uuids) {
 +                                      int i = uuids->nbr_uuids;
 +                                      bool skip = true;
 +                                      for (AssetUUID *uuid = uuids->uuids; 
i--; uuid++) {
 +                                              if (ASSETUUID_COMPARE(id->uuid, 
uuid)) {
 +                                                      skip = false;
 +                                                      break;
 +                                              }
 +                                      }
 +                                      if (skip) {
 +                                              continue;
 +                                      }
 +                              }
 +
 +                              if (ae_type == NULL) {
 +                                      if (do_reset_tags) {
 +                                              id->uuid->tag = 
UUID_TAG_ENGINE_MISSING;
 +                                      }
 +                                      else {
 +                                              id->uuid->tag |= 
UUID_TAG_ENGINE_MISSING;
 +                                      }
 +                                      G.f |= G_ASSETS_FAIL;
 +                                      continue;
 +                              }
 +
 +                              if (auce == NULL) {
 +                                      for (auce = engines->first; auce; auce 
= auce->next) {
 +                                              if (auce->ae->type == ae_type) {
 +                                                      /* In case we have 
several engine versions for the same engine, we create several
 +                                                       * 
AssetUpdateCheckEngine structs (since an uuid list can only handle one ae 
version), using
 +                                                       * the same (shallow) 
copy of the actual asset engine. */
 +                                                      copy_engine = 
(auce->uuids.asset_engine_version != 
lib->asset_repository->asset_engine_version);
 +                                                      break;
 +                                              }
 +                                      }
 +                                      if (copy_engine || auce == NULL) {
 +                                              AssetUpdateCheckEngine 
*auce_prev = auce;
 +                                              auce = 
MEM_callocN(sizeof(*auce), __func__);
 +                                              auce->ae = copy_engine ? 
BKE_asset_engine_copy(auce_prev->ae) :
 +                                                                       
BKE_asset_engine_create(ae_type, NULL);
 +                                              auce->ae_job_id = 
AE_JOB_ID_UNSET;
 +                                              
auce->uuids.asset_engine_version = lib->asset_repository->asset_engine_version;
 +                                              BLI_addtail(engines, auce);
 +                                      }
 +                              }
 +
 +                              printf("\tWe need to check for updated asset 
%s...\n", id->name);
 +                              if (do_reset_tags) {
 +                                      id->uuid->tag = (id->tag & 
LIB_TAG_MISSING) ? UUID_TAG_ASSET_MISSING : 0;
 +                              }
 +
 +                              /* XXX horrible, need to use some mempool, 
stack or something :) */
 +                              auce->uuids.nbr_uuids++;
 +                              if (auce->uuids.uuids) {
 +                                      auce->uuids.uuids = 
MEM_reallocN_id(auce->uuids.uuids, sizeof(*auce->uuids.uuids) * 
(size_t)auce->uuids.nbr_uuids, __func__);
 +                              }
 +                              else {
 +                                      auce->uuids.uuids = 
MEM_mallocN(sizeof(*auce->uuids.uuids) * (size_t)auce->uuids.nbr_uuids, 
__func__);
 +                              }
 +                              auce->uuids.uuids[auce->uuids.nbr_uuids - 1] = 
*id->uuid;
 +                      }
 +              }
 +      }
 +}
 +
 +static void asset_updatecheck_startjob(void *aucjv, short *stop, short 
*do_update, float *progress)
 +{
 +      AssetUpdateCheckJob *aucj = aucjv;
 +
 +      aucj->progress = progress;
 +      aucj->stop = stop;
 +      /* Using AE engine, worker thread here is just sleeping! */
 +      while (!*stop) {
 +              *do_update = true;
 +              PIL_sleep_ms(100);
 +      }
 +}
 +
 +static void asset_updatecheck_update(void *aucjv)
 +{
 +      AssetUpdateCheckJob *aucj = aucjv;
 +      Main *bmain = G.main;
 +
 +      const bool do_ensure = ((aucj->flag & AUCJ_ENSURE_AS

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to