Commit: ec3eec1ac5d1d56ca21047d0d3b4dd78ada4b030
Author: Bastien Montagne
Date:   Thu Mar 12 19:41:12 2015 +0100
Branches: asset-experiments
https://developer.blender.org/rBec3eec1ac5d1d56ca21047d0d3b4dd78ada4b030

Add load_pre callback to RNA, and stupid dummy code in Amber to make quick test 
of it.

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

M       release/scripts/startup/bl_operators/amber.py
M       source/blender/blenkernel/BKE_asset.h
M       source/blender/blenkernel/intern/asset.c
M       source/blender/editors/space_file/file_ops.c
M       source/blender/makesdna/DNA_space_types.h
M       source/blender/makesrna/intern/rna_asset.c

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

diff --git a/release/scripts/startup/bl_operators/amber.py 
b/release/scripts/startup/bl_operators/amber.py
index 897a2a8..c42c01d 100644
--- a/release/scripts/startup/bl_operators/amber.py
+++ b/release/scripts/startup/bl_operators/amber.py
@@ -37,6 +37,7 @@ class AssetEngineAmber(AssetEngine):
 
     def __init__(self):
         self.jobs = {}
+        self.uuids = {}
 
     def status(self, job_id):
         if job_id:
@@ -57,13 +58,26 @@ class AssetEngineAmber(AssetEngine):
         if len(entries.entries) == 0:
             entry = entries.entries.add()
             entry.type = {'BLENDER'}
-            entry.relpath="foobar"
+            entry.relpath = "foobar.blend"
+            entry.name = "MyLittleTest"
+            entry.uuid = entry.relpath.encode()[:8] + b"|0000000001"
+            self.uuids[entry.uuid] = 
"/home/i74700deb64/Téléchargements/wall_UE_D_01.blend"
             variant = entry.variants.add()
             entry.variants.active = variant
             rev = variant.revisions.add()
             variant.revisions.active = rev
         return 1
 
+    def load_pre(self, uuids, entries):
+        # Not quite sure this engine will need it in the end, but for sake of 
testing...
+        entries.root_path = "/"
+        for uuid in uuids.uuids[:1]:
+            entry = entries.entries.add()
+            entry.type = {'BLENDER'}
+            entry.relpath = self.uuids[uuid.uuid_asset]
+        return True
+
+
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)
     bpy.utils.register_class(AssetEngineFlame)
diff --git a/source/blender/blenkernel/BKE_asset.h 
b/source/blender/blenkernel/BKE_asset.h
index c37a1b5..c26797d 100644
--- a/source/blender/blenkernel/BKE_asset.h
+++ b/source/blender/blenkernel/BKE_asset.h
@@ -40,6 +40,7 @@ extern "C" {
 
 struct AssetEngine;
 struct AssetEngineType;
+struct AssetUUIDList;
 struct FileDirEntryArr;
 struct FileDirEntry;
 struct FileDirEntryVariant;
@@ -75,8 +76,7 @@ typedef void (*ae_kill)(struct AssetEngine *engine, const int 
job_id);
 /* Return (list) everything available at given root path. */
 typedef int (*ae_list_dir)(struct AssetEngine *engine, const int job_id, 
struct FileDirEntryArr *entries_r);
 /* Ensure given direntries are really available for append/link (some kind of 
'anticipated loading'...). */
-typedef int (*ae_ensure_entries)(struct AssetEngine *engine, const int job_id,
-                                 char (*uuids)[3][ASSET_UUID_LENGTH], const 
int nbr_uuids);
+typedef int (*ae_ensure_entries)(struct AssetEngine *engine, const int job_id, 
struct AssetUUIDList *uuids);
 
 /* ***** All callbacks below are blocking. They shall be completed upon 
return. ***** */
 
@@ -88,7 +88,7 @@ typedef int (*ae_ensure_entries)(struct AssetEngine *engine, 
const int job_id,
  * active revision is used, no need to bother with variants, previews, etc.
  * This allows to present 'fake' entries to user, and then import actual data.
  */
-typedef bool (*ae_load_pre)(struct AssetEngine *engine, char 
(*uuids)[3][ASSET_UUID_LENGTH], const int nbr_uuids,
+typedef bool (*ae_load_pre)(struct AssetEngine *engine, struct AssetUUIDList 
*uuids,
                             struct FileDirEntryArr *entries_r);
 
 /* 'post-loading' hook, called after opening/appending/linking given entries.
diff --git a/source/blender/blenkernel/intern/asset.c 
b/source/blender/blenkernel/intern/asset.c
index 7cfae41..12b35ec 100644
--- a/source/blender/blenkernel/intern/asset.c
+++ b/source/blender/blenkernel/intern/asset.c
@@ -141,26 +141,33 @@ void BKE_asset_engine_free(AssetEngine *engine)
 void BKE_asset_engine_load_pre(AssetEngine *engine, FileDirEntryArr *r_entries)
 {
        if (engine->type->load_pre) {
+               AssetUUIDList *uuids = MEM_mallocN(sizeof(*uuids), __func__);
                FileDirEntry *en;
-               char (*uuids)[3][ASSET_UUID_LENGTH] = 
MEM_mallocN(sizeof(*uuids) * r_entries->nbr_entries, __func__);
-               int nbr_entries = r_entries->nbr_entries;
+               const int nbr_entries = r_entries->nbr_entries;
                int i;
 
+               uuids->uuids = MEM_mallocN(sizeof(*uuids->uuids) * nbr_entries, 
__func__);
+               uuids->nbr_uuids = nbr_entries;
+
                for (i = 0, en = r_entries->entries.first; en; i++, en = 
en->next) {
                        FileDirEntryVariant *var = BLI_findlink(&en->variants, 
en->act_variant);
-                       char (*uuid)[3][ASSET_UUID_LENGTH] = &uuids[i];
+                       AssetUUID *uuid = &uuids->uuids[i];
 
-                       memcpy(uuid[0], en->uuid, sizeof(*uuid[0]));
+                       memcpy(uuid->uuid_asset, en->uuid, 
sizeof(uuid->uuid_asset));
 
                        BLI_assert(var);
-                       memcpy(uuid[1], var, sizeof(*uuid[1]));
+                       memcpy(uuid->uuid_variant, var->uuid, 
sizeof(uuid->uuid_variant));
 
-                       memcpy(uuid[2], en->entry, sizeof(*uuid[2]));
+                       memcpy(uuid->uuid_revision, en->entry->uuid, 
sizeof(uuid->uuid_revision));
                }
 
                BKE_filedir_entryarr_clear(r_entries);
 
-               engine->type->load_pre(engine, uuids, nbr_entries, r_entries);
+               if (!engine->type->load_pre(engine, uuids, r_entries)) {
+                       /* If load_pre returns false (i.e. fails), clear all 
paths! */
+                       /* TODO: report!!! */
+                       BKE_filedir_entryarr_clear(r_entries);
+               }
 
                MEM_freeN(uuids);
        }
@@ -237,6 +244,7 @@ FileDirEntry *BKE_filedir_entry_copy(FileDirEntry *entry)
        }
        /* For now, consider FileDirEntryRevision::poin as not owned here, so 
no need to do anything about it */
 
+       entry_new->entry = NULL;
        if (!BLI_listbase_is_empty(&entry->variants)) {
                FileDirEntryVariant *var;
                int act_var;
@@ -263,7 +271,7 @@ FileDirEntry *BKE_filedir_entry_copy(FileDirEntry *entry)
                                BLI_addtail(&var_new->revisions, rev_new);
 
                                if (is_act_var && is_act_rev) {
-                                       entry->entry = rev_new;
+                                       entry_new->entry = rev_new;
                                }
                        }
 
@@ -275,6 +283,8 @@ FileDirEntry *BKE_filedir_entry_copy(FileDirEntry *entry)
                entry_new->entry = MEM_dupallocN(entry->entry);
        }
 
+       BLI_assert(entry_new->entry != NULL);
+
        /* TODO: tags! */
 
        return entry_new;
diff --git a/source/blender/editors/space_file/file_ops.c 
b/source/blender/editors/space_file/file_ops.c
index 9b3611f..59263f8 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -882,8 +882,6 @@ static void file_sfile_to_operator(wmOperator *op, 
SpaceFile *sfile, char filepa
                        RNA_property_string_set(op->ptr, prop, filepath);
                }
 
-               printf("%s, %s, %s, %lu\n", selection->root, filename, 
filepath, sizeof(filepath));
-
                /* some ops have multiple files to select */
                /* this is called on operators check() so clear collections 
first since
                 * they may be already set. */
diff --git a/source/blender/makesdna/DNA_space_types.h 
b/source/blender/makesdna/DNA_space_types.h
index 10b2246..5747e96 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -749,6 +749,18 @@ typedef enum eDirEntry_SelectFlag {
 
 /* ***** Related to file browser, but never saved in DNA, only here to help 
with RNA. ***** */
 
+/* For RNA only, used to communicate with asset engines outside of 'import' 
context. */
+typedef struct AssetUUID {
+       char uuid_asset[24];     /* ASSET_UUID_LENGTH */
+       char uuid_variant[24];   /* ASSET_UUID_LENGTH */
+       char uuid_revision[24];  /* ASSET_UUID_LENGTH */
+} AssetUUID;
+
+typedef struct AssetUUIDList {
+       AssetUUID *uuids;
+       int nbr_uuids, pad;
+} AssetUUIDList;
+
 /* Container for a revision, only relevant in asset context. */
 typedef struct FileDirEntryRevision {
        struct FileDirEntryRevision *next, *prev;
diff --git a/source/blender/makesrna/intern/rna_asset.c 
b/source/blender/makesrna/intern/rna_asset.c
index f44ff82..ad0e154 100644
--- a/source/blender/makesrna/intern/rna_asset.c
+++ b/source/blender/makesrna/intern/rna_asset.c
@@ -405,6 +405,34 @@ static int rna_ae_list_dir(AssetEngine *engine, const int 
id, FileDirEntryArr *e
        return ret_job_id;
 }
 
+static bool rna_ae_load_pre(AssetEngine *engine, AssetUUIDList *uuids, struct 
FileDirEntryArr *entries_r)
+{
+       extern FunctionRNA rna_AssetEngine_load_pre_func;
+       PointerRNA ptr;
+       PropertyRNA *parm;
+       ParameterList list;
+       FunctionRNA *func;
+
+       void *ret;
+       bool ret_success;
+
+       RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+       func = &rna_AssetEngine_load_pre_func;
+
+       RNA_parameter_list_create(&list, &ptr, func);
+       RNA_parameter_set_lookup(&list, "uuids", &uuids);
+       RNA_parameter_set_lookup(&list, "entries", &entries_r);
+       engine->type->ext.call(NULL, &ptr, func, &list);
+
+       parm = RNA_function_find_parameter(NULL, func, "success_return");
+       RNA_parameter_get(&list, parm, &ret);
+       ret_success = (bool)*(int *)ret;
+
+       RNA_parameter_list_free(&list);
+
+       return ret_success;
+}
+
 /* AssetEngine registration */
 
 static void rna_AssetEngine_unregister(Main *UNUSED(bmain), StructRNA *type)
@@ -426,7 +454,7 @@ static StructRNA *rna_AssetEngine_register(Main *bmain, 
ReportList *reports, voi
        AssetEngineType *aet, dummyaet = {NULL};
        AssetEngine dummyengine = {NULL};
        PointerRNA dummyptr;
-       int have_function[4];
+       int have_function[5];
 
        /* setup dummy engine & engine type to store static properties in */
        dummyengine.type = &dummyaet;
@@ -465,6 +493,8 @@ static StructRNA *rna_AssetEngine_register(Main *bmain, 
ReportList *reports, voi
 
        aet->list_dir = (have_function[3]) ? rna_ae_list_dir : NULL;
 
+       aet->load_pre = (have_function[4]) ? rna_ae_load_pre : NULL;
+
        BLI_addtail(&asset_engines, aet);
 
        return aet->ext.srna;
@@ -484,6 +514,43 @@ static StructRNA *rna_AssetEngine_refine(PointerRNA *ptr)
 
 #else /* RNA_RUNTIME */
 
+/* Much lighter version of asset/variant/revision identifier. */
+static void rna_def_asset_uuid(BlenderRNA *brna)
+{
+       StructRNA *srna;
+       PropertyRNA *prop;
+
+       srna = RNA_def_struct(brna, "AssetUUID", NULL);
+       RNA_def_struct_sdna(srna, "AssetUUID");
+       RNA_def_struct_ui_text(srna, "Asset UUID", "A unique identifier of an 
asset (asset engine dependent!)");
+
+       prop = RNA_def_property(srna, "uuid_asset", PROP_STRING, 
PROP_BYTESTRING);
+       RNA_def_property_ui_text(prop, "Asset UUID", "Unique identifier of this 
asset");
+
+       prop = RNA_def_property(srna, "uuid_variant", PROP_STRING, 
PROP_BYTESTRING);
+       RNA_def_property_ui_text(prop, "Variant UUID", "Unique identifier of 
this asset's variant");
+
+       prop = RNA_def_property(srna, "uuid_revision", P

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to