[Bf-blender-cvs] [5d732dd] asset-engine: Add some asset engine-aware stuff in filebrowser.

Bastien Montagne noreply at git.blender.org
Thu Mar 5 10:10:45 CET 2015


Commit: 5d732ddcaea6c1ca54e3b8e87280dafd4bc6a2dd
Author: Bastien Montagne
Date:   Thu Feb 19 19:52:44 2015 +0100
Branches: asset-engine
https://developer.blender.org/rB5d732ddcaea6c1ca54e3b8e87280dafd4bc6a2dd

Add some asset engine-aware stuff in filebrowser.

Basically, filelisting code in space_file becomes default, internal 'asset engine',
and user can switch to any other available engine instead.

Note filelisting with asset engines is fully main-thread from C code PoV,
parallelization/asynchronism is responsability of the py code!

Also, added a basic (dummy currently) AssetEngine py implementation.
Not much there, but helps checking things works as expected before
writing whole interface!

All this is very basic early code yet, much much to do before we get anything really usable...

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

M	release/scripts/startup/bl_operators/__init__.py
A	release/scripts/startup/bl_operators/flame.py
M	release/scripts/startup/bl_ui/space_filebrowser.py
M	source/blender/blenkernel/BKE_asset.h
M	source/blender/blenkernel/intern/asset.c
M	source/blender/editors/space_file/filelist.c
M	source/blender/editors/space_file/filelist.h
M	source/blender/editors/space_file/space_file.c
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/intern/rna_asset.c
M	source/blender/makesrna/intern/rna_space.c

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

diff --git a/release/scripts/startup/bl_operators/__init__.py b/release/scripts/startup/bl_operators/__init__.py
index 65f7bde..a623689 100644
--- a/release/scripts/startup/bl_operators/__init__.py
+++ b/release/scripts/startup/bl_operators/__init__.py
@@ -48,6 +48,8 @@ _modules = [
     "wm",
 ]
 
+_modules.append("flame")
+
 import bpy
 
 if bpy.app.build_options.freestyle:
diff --git a/release/scripts/startup/bl_operators/flame.py b/release/scripts/startup/bl_operators/flame.py
new file mode 100644
index 0000000..703b0b0
--- /dev/null
+++ b/release/scripts/startup/bl_operators/flame.py
@@ -0,0 +1,69 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+# Note: This will be a simple addon later, but until it gets to master, it's simpler to have it
+#       as a startup module!
+
+import bpy
+from bpy.types import AssetEngine
+from bpy.props import (
+        StringProperty,
+        BoolProperty,
+        IntProperty,
+        FloatProperty,
+        EnumProperty,
+        CollectionProperty,
+        )
+
+class AssetEngineFlame(AssetEngine):
+    bl_label = "Flame"
+
+    def __init__(self):
+        self.jobs = {}
+
+    def status(self, job_id):
+        if job_id:
+            job = self.jobs.get(job_id, None)
+            #~ if job is not None:
+                #~ return {'VALID'}
+            return set()
+        else:
+            return {'VALID'}
+
+    def progress(self, job_id):
+        return 0.5
+
+    def kill(self, job_id):
+        pass
+
+    def list_dir(self, job_id, entries):
+        if len(entries.entries) == 0:
+            entry = entries.entries.add()
+            entry.type = {'BLENDER'}
+            entry.relpath="foobar"
+            variant = entry.variants.add()
+            entry.variants.active = variant
+            rev = variant.revisions.add()
+            variant.revisions.active = rev
+        return 1
+
+if __name__ == "__main__":  # only for live edit.
+    bpy.utils.register_module(__name__)
+    bpy.utils.register_class(AssetEngineFlame)
diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py
index a99f915..2cf2e8e 100644
--- a/release/scripts/startup/bl_ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -34,6 +34,7 @@ class FILEBROWSER_HT_header(Header):
         layout.template_header()
 
         row = layout.row()
+        row.prop(st, "asset_engine", text="")
         row.separator()
 
         row = layout.row(align=True)
diff --git a/source/blender/blenkernel/BKE_asset.h b/source/blender/blenkernel/BKE_asset.h
index 34255a4..9c43561 100644
--- a/source/blender/blenkernel/BKE_asset.h
+++ b/source/blender/blenkernel/BKE_asset.h
@@ -95,12 +95,17 @@ enum {
 	AE_STATUS_RUNNING = 1 << 1,  /* Asset engine is performing some background tasks... */
 };
 
+#define AE_FAKE_ENGINE_ID "none"
+
 extern ListBase asset_engines;
 
-/* AE instance is valid, is running, is idle, etc. */
+/* AE instance/job is valid, is running, is idle, etc. */
 typedef int (*ae_status)(struct AssetEngine *engine, const int job_id);
 typedef float (*ae_progress)(struct AssetEngine *engine, const int job_id);
 
+/* To force end of given job (e.g. because it was cancelled by user...). */
+typedef void (*ae_kill)(struct AssetEngine *engine, const int job_id);
+
 /* ***** All callbacks below shall be non-blocking (i.e. return immediately). ***** */
 /* Those callbacks will be called from a 'fake-job' start *and* update functions (i.e. main thread, working one will
  * just sleep).
@@ -140,6 +145,8 @@ typedef struct AssetEngineType {
 	ae_status status;
 	ae_progress progress;
 
+	ae_kill kill;
+
 	ae_list_dir list_dir;
 	ae_ensure_entries ensure_entries;
 
diff --git a/source/blender/blenkernel/intern/asset.c b/source/blender/blenkernel/intern/asset.c
index e37a2e5..cc93a4f 100644
--- a/source/blender/blenkernel/intern/asset.c
+++ b/source/blender/blenkernel/intern/asset.c
@@ -59,6 +59,13 @@ ListBase asset_engines = {NULL, NULL};
 
 void BKE_asset_engines_init(void)
 {
+	/* We just add a dummy engine, which 'is' our intern filelisting code from space_file! */
+	AssetEngineType *aet = MEM_callocN(sizeof(*aet), __func__);
+
+	BLI_strncpy(aet->idname, AE_FAKE_ENGINE_ID, sizeof(aet->idname));
+	BLI_strncpy(aet->name, "None", sizeof(aet->name));
+
+	BLI_addhead(&asset_engines, aet);
 }
 
 void BKE_asset_engines_exit(void)
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 3eaf712..4ead05f 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -58,6 +58,9 @@
 #  include "BLI_winstuff.h"
 #endif
 
+#include "RNA_types.h"
+
+#include "BKE_asset.h"
 #include "BKE_context.h"
 #include "BKE_global.h"
 #include "BKE_library.h"
@@ -87,7 +90,6 @@
 
 #include "filelist.h"
 
-
 /* ----------------- FOLDERLIST (previous/next) -------------- */
 
 typedef struct FolderList {
@@ -213,6 +215,8 @@ typedef struct FileListFilter {
 typedef struct FileList {
 	FileDirEntryArr filelist;
 
+	AssetEngine *ae;
+
 	short prv_w;
 	short prv_h;
 
@@ -1036,6 +1040,11 @@ void filelist_free(struct FileList *filelist)
 	
 	filelist_clear(filelist);
 
+	if (filelist->ae) {
+		BKE_asset_engine_free(filelist->ae);
+		filelist->ae = NULL;
+	}
+
 	memset(&filelist->filter_data, 0, sizeof(filelist->filter_data));
 
 	filelist->need_sorting = false;
@@ -1086,6 +1095,25 @@ static const char *fileentry_uiname(const char *root, const FileDirEntry *entry,
 	return name;
 }
 
+void filelist_assetengine_set(struct FileList *filelist, struct AssetEngineType *aet)
+{
+	if (filelist->ae) {
+		if (filelist->ae->type == aet) {
+			return;
+		}
+		BKE_asset_engine_free(filelist->ae);
+		filelist->ae = NULL;
+	}
+	else if (!aet) {
+		return;
+	}
+
+	if (aet) {
+		filelist->ae = BKE_asset_engine_create(aet);
+	}
+	filelist->force_reset = true;
+}
+
 const char *filelist_dir(struct FileList *filelist)
 {
 	return filelist->filelist.root;
@@ -1821,6 +1849,10 @@ typedef struct FileListReadJob {
 	char main_name[FILE_MAX];
 	struct FileList *filelist;
 	struct FileList *tmp_filelist;
+
+	int ae_job_id;
+	float *progress;
+	short *stop;
 	//~ ReportList reports;
 } FileListReadJob;
 
@@ -1828,62 +1860,105 @@ static void filelist_readjob_startjob(void *flrjv, short *stop, short *do_update
 {
 	FileListReadJob *flrj = flrjv;
 
-	printf("START filelist reading (%d files, main thread: %d)\n",
-	       flrj->filelist->filelist.nbr_entries, BLI_thread_is_main());
+	if (flrj->filelist->ae) {
+		flrj->progress = progress;
+		flrj->stop = stop;
+		/* When using AE engine, worker thread here is just sleeping! */
+		while (flrj->filelist->filelist_pending && !*stop) {
+			PIL_sleep_ms(10);
+			*do_update = true;
+		}
+	}
+	else {
+		printf("START filelist reading (%d files, main thread: %d)\n",
+			   flrj->filelist->filelist.nbr_entries, BLI_thread_is_main());
 
-	BLI_mutex_lock(&flrj->lock);
+		BLI_mutex_lock(&flrj->lock);
 
-	BLI_assert((flrj->tmp_filelist == NULL) && flrj->filelist);
+		BLI_assert((flrj->tmp_filelist == NULL) && flrj->filelist);
 
-	flrj->tmp_filelist = MEM_dupallocN(flrj->filelist);
+		flrj->tmp_filelist = MEM_dupallocN(flrj->filelist);
 
-	BLI_mutex_unlock(&flrj->lock);
+		BLI_mutex_unlock(&flrj->lock);
 
-	BLI_listbase_clear(&flrj->tmp_filelist->filelist.entries);
-	flrj->tmp_filelist->filelist.nbr_entries = 0;
-	flrj->tmp_filelist->filtered = NULL;
-	flrj->tmp_filelist->numfiltered = 0;
-	flrj->tmp_filelist->libfiledata = NULL;
+		BLI_listbase_clear(&flrj->tmp_filelist->filelist.entries);
+		flrj->tmp_filelist->filelist.nbr_entries = 0;
+		flrj->tmp_filelist->filtered = NULL;
+		flrj->tmp_filelist->numfiltered = 0;
+		flrj->tmp_filelist->libfiledata = NULL;
 
-	flrj->tmp_filelist->read_jobf(flrj->tmp_filelist, flrj->main_name, stop, do_update, progress, &flrj->lock);
+		flrj->tmp_filelist->read_jobf(flrj->tmp_filelist, flrj->main_name, stop, do_update, progress, &flrj->lock);
 
-	printf("END filelist reading (%d files, STOPPED: %d, DO_UPDATE: %d)\n",
-	       flrj->filelist->filelist.nbr_entries, *stop, *do_update);
+		printf("END filelist reading (%d files, STOPPED: %d, DO_UPDATE: %d)\n",
+			   flrj->filelist->filelist.nbr_entries, *stop, *do_update);
+	}
 }
 
 static void filelist_readjob_update(void *flrjv)
 {
 	FileListReadJob *flrj = flrjv;
-	ListBase new_entries = {NULL};
-	int nbr_entries, new_nbr_entries = 0;
-
-	BLI_movelisttolist(&new_entries, &flrj->filelist->filelist.entries);
-	nbr_entries = flrj->filelist->filelist.nbr_entries;
-
-	BLI_mutex_lock(&flrj->lock);
 
-	if (flrj->tmp_filelist->filelist.nbr_entries) {
-		/* We just move everything out of 'thread context' into final list. */
-		new_nbr_entries = flrj->tmp_filelist->filelist.nbr_entries;
-		BLI_movelisttolist(&new_entries, &flrj->tmp_filelist->filelist.entries);
-		flrj->tmp_filelist->filelist.nbr_entries = 0;
-	}
-
-	BLI_mutex_unlock(&flrj->lock);
-
-	if (new_nbr_entries) {
-		filelist_clear(flrj->filelist);
+	if (flrj->filelist->ae) {
+		/* We only communicate with asset engine from main thread! */
+		AssetEngine *ae = flrj->filelist->ae;
+		FileDirEntry *entry;
 
+		flrj->ae_job_id = ae->type->list_dir(ae, flrj->ae_job_id, &flrj->filelist->filelist);
 		flrj->filelist->need_sorting = true;
 		flrj->filelist->force_refresh = true;
 		/* Better be explicit here, since we overwrite filelist->filelist on each run of this update fun

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list