Commit: dfca3522942944cb7fd3943696fb06a118df3ba2
Author: Jeroen Bakker
Date:   Fri Jun 22 14:48:23 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBdfca3522942944cb7fd3943696fb06a118df3ba2

StudioLight: Better API

In stead of a single refresh function that re-init the whole system. The
API now supports adding and removing. Which will be much faster and less
flickering of missing icons when adding/removing lights

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

M       release/scripts/startup/bl_operators/wm.py
M       source/blender/blenkernel/BKE_studiolight.h
M       source/blender/blenkernel/intern/studiolight.c
M       source/blender/makesrna/intern/rna_userdef.c

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

diff --git a/release/scripts/startup/bl_operators/wm.py 
b/release/scripts/startup/bl_operators/wm.py
index 4108487b6f5..b6f77505410 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -2456,7 +2456,7 @@ class WM_OT_studiolight_install(Operator):
 
         for filepath in filepaths:
             shutil.copy(str(filepath), str(path_studiolights))
-        userpref.studio_lights_refresh()
+            
userpref.studio_lights.new(str(path_studiolights.joinpath(filepath.name)), 
self.orientation)
 
         # print message
         msg = (
@@ -2490,26 +2490,11 @@ class WM_OT_studiolight_uninstall(Operator):
                 self._remove_path(pathlib.Path(studio_light.path))
                 self._remove_path(pathlib.Path(studio_light.path_irr_cache))
                 self._remove_path(pathlib.Path(studio_light.path_sh_cache))
-                userpref.studio_lights_refresh()
+                userpref.studio_lights.remove(studio_light)
                 return {'FINISHED'}
         return {'CANCELLED'}
 
 
-class WM_OT_studiolight_expand(Operator):
-    bl_idname = "wm.studiolight_expand"
-    bl_label = "Expand Studio Light"
-    index = bpy.props.IntProperty()
-
-    def execute(self, context):
-        userpref = context.user_preferences
-        for studio_light in userpref.studio_lights:
-            if studio_light.index == self.index:
-                studio_light.show_expanded = not studio_light.show_expanded
-                break
-
-        return {'FINISHED'}
-
-
 class WM_OT_studiolight_userpref_show(Operator):
     """Show light user preferences"""
     bl_idname = "wm.studiolight_userpref_show"
@@ -2576,7 +2561,6 @@ classes = (
     WM_OT_owner_disable,
     WM_OT_owner_enable,
     WM_OT_url_open,
-    WM_OT_studiolight_expand,
     WM_OT_studiolight_install,
     WM_OT_studiolight_uninstall,
     WM_OT_studiolight_userpref_show,
diff --git a/source/blender/blenkernel/BKE_studiolight.h 
b/source/blender/blenkernel/BKE_studiolight.h
index 3873ad288f5..faa48717210 100644
--- a/source/blender/blenkernel/BKE_studiolight.h
+++ b/source/blender/blenkernel/BKE_studiolight.h
@@ -145,6 +145,8 @@ void BKE_studiolight_preview(uint* icon_buffer, StudioLight 
*sl, int icon_id_typ
 struct ListBase *BKE_studiolight_listbase(void);
 void BKE_studiolight_ensure_flag(StudioLight *sl, int flag);
 void BKE_studiolight_refresh(void);
+StudioLight *BKE_studiolight_new(const char* path, int orientation);
+void BKE_studiolight_remove(StudioLight *sl);
 void BKE_studiolight_set_free_function(StudioLight *sl, 
StudioLightFreeFunction *free_function, void *data);
 void BKE_studiolight_unset_icon_id(StudioLight *sl, int icon_id);
 
diff --git a/source/blender/blenkernel/intern/studiolight.c 
b/source/blender/blenkernel/intern/studiolight.c
index e561db3c141..a371f89e0b2 100644
--- a/source/blender/blenkernel/intern/studiolight.c
+++ b/source/blender/blenkernel/intern/studiolight.c
@@ -57,6 +57,7 @@
 
 /* Statics */
 static ListBase studiolights;
+static int last_studiolight_id = 0;
 #define STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE 128
 #define STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT 32
 #define STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_WIDTH 
(STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT * 2)
@@ -141,7 +142,7 @@ static struct StudioLight *studiolight_create(int flag)
        sl->path_sh_cache = NULL;
        sl->free_function = NULL;
        sl->flag = flag;
-       sl->index = BLI_listbase_count(&studiolights);
+       sl->index = ++last_studiolight_id;
        if (flag & STUDIOLIGHT_ORIENTATION_VIEWNORMAL) {
                sl->icon_id_matcap = BKE_icon_ensure_studio_light(sl, 
STUDIOLIGHT_ICON_ID_TYPE_MATCAP);
                sl->icon_id_matcap_flipped = BKE_icon_ensure_studio_light(sl, 
STUDIOLIGHT_ICON_ID_TYPE_MATCAP_FLIPPED);
@@ -822,9 +823,24 @@ static void 
studiolight_calculate_light_direction(StudioLight *sl)
        sl->flag |= STUDIOLIGHT_LIGHT_DIRECTION_CALCULATED;
 }
 
+static StudioLight* studiolight_add_file(const char *path, int flag)
+{
+       char filename[FILE_MAXFILE];
+       BLI_split_file_part(path, filename, FILE_MAXFILE);
+       if (BLI_path_extension_check_array(filename, imb_ext_image)) {
+               StudioLight *sl = studiolight_create(STUDIOLIGHT_EXTERNAL_FILE 
| flag);
+               BLI_strncpy(sl->name, filename, FILE_MAXFILE);
+               BLI_strncpy(sl->path, path, FILE_MAXFILE);
+               sl->path_irr_cache = BLI_string_joinN(path, ".irr");
+               sl->path_sh_cache = BLI_string_joinN(path, ".sh2");
+               BLI_addtail(&studiolights, sl);
+               return sl;
+       }
+       return NULL;
+}
+
 static void studiolight_add_files_from_datafolder(const int folder_id, const 
char *subfolder, int flag)
 {
-       StudioLight *sl;
        struct direntry *dir;
        const char *folder = BKE_appdir_folder_id(folder_id, subfolder);
        if (folder) {
@@ -832,16 +848,7 @@ static void studiolight_add_files_from_datafolder(const 
int folder_id, const cha
                int i;
                for (i = 0; i < totfile; i++) {
                        if ((dir[i].type & S_IFREG)) {
-                               const char *filename = dir[i].relname;
-                               const char *path = dir[i].path;
-                               if (BLI_path_extension_check_array(filename, 
imb_ext_image)) {
-                                       sl = 
studiolight_create(STUDIOLIGHT_EXTERNAL_FILE | flag);
-                                       BLI_strncpy(sl->name, filename, 
FILE_MAXFILE);
-                                       BLI_strncpy(sl->path, path, 
FILE_MAXFILE);
-                                       sl->path_irr_cache = 
BLI_string_joinN(path, ".irr");
-                                       sl->path_sh_cache = 
BLI_string_joinN(path, ".sh2");
-                                       BLI_addtail(&studiolights, sl);
-                               }
+                               studiolight_add_file(dir[i].path, flag);
                        }
                }
                BLI_filelist_free(dir, totfile);
@@ -1158,6 +1165,24 @@ void BKE_studiolight_ensure_flag(StudioLight *sl, int 
flag)
        }
 }
 
+/*
+ * Python API Functions
+ */
+void BKE_studiolight_remove(StudioLight *sl)
+{
+       if (sl->flag & STUDIOLIGHT_USER_DEFINED)
+       {
+               BLI_remlink(&studiolights, sl);
+               studiolight_free(sl);
+       }
+}
+
+StudioLight *BKE_studiolight_new(const char* path, int orientation)
+{
+       StudioLight * sl = studiolight_add_file(path, orientation | 
STUDIOLIGHT_USER_DEFINED);
+       return sl;
+}
+
 void BKE_studiolight_refresh(void)
 {
        BKE_studiolight_free();
diff --git a/source/blender/makesrna/intern/rna_userdef.c 
b/source/blender/makesrna/intern/rna_userdef.c
index b617d1ba9be..033e7bee72c 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -86,6 +86,14 @@ static const EnumPropertyItem 
rna_enum_language_default_items[] = {
 };
 #endif
 
+static const EnumPropertyItem rna_enum_studio_light_orientation_items[] = {
+       {STUDIOLIGHT_ORIENTATION_CAMERA,     "CAMERA", 0, "Camera", ""},
+       {STUDIOLIGHT_ORIENTATION_WORLD,      "WORLD",  0, "World",  ""},
+       {STUDIOLIGHT_ORIENTATION_VIEWNORMAL, "MATCAP", 0, "MatCap", ""},
+       {0, NULL, 0, NULL, NULL}
+};
+
+
 #ifdef RNA_RUNTIME
 
 #include "DNA_object_types.h"
@@ -661,11 +669,21 @@ static void 
rna_UserDef_studiolight_begin(CollectionPropertyIterator *iter, Poin
        rna_iterator_listbase_begin(iter, BKE_studiolight_listbase(), NULL);
 }
 
-static void rna_UserDef_studiolight_refresh(UserDef *UNUSED(userdef))
+static void rna_StudioLights_refresh(UserDef *UNUSED(userdef))
 {
        BKE_studiolight_refresh();
 }
 
+static void rna_StudioLights_remove(UserDef *UNUSED(userdef), StudioLight 
*studio_light)
+{
+       BKE_studiolight_remove(studio_light);
+}
+
+static StudioLight* rna_StudioLights_new(UserDef *UNUSED(userdef), const char* 
path, int orientation)
+{
+       return BKE_studiolight_new(path, orientation);
+}
+
 /* StudioLight.name */
 static void rna_UserDef_studiolight_name_get(PointerRNA *ptr, char *value)
 {
@@ -3253,18 +3271,39 @@ static void rna_def_userdef_addon(BlenderRNA *brna)
        RNA_def_property_pointer_funcs(prop, "rna_Addon_preferences_get", NULL, 
NULL, NULL);
 }
 
+static void rna_def_userdef_studiolights(BlenderRNA *brna)
+{
+       StructRNA *srna;
+       FunctionRNA *func;
+       PropertyRNA *parm;
+
+       srna = RNA_def_struct(brna, "StudioLights", NULL);
+       RNA_def_struct_sdna(srna, "UserDef");
+       RNA_def_struct_ui_text(srna, "Studio Lights", "Collection of studio 
lights");
+
+       func = RNA_def_function(srna, "new", "rna_StudioLights_new");
+       RNA_def_function_ui_description(func, "Create a new studiolight");
+       parm = RNA_def_string(func, "path", NULL, 0, "File Path", "File path 
where the studio light file can be found");
+       RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+       parm = RNA_def_enum(func, "orientation", 
rna_enum_studio_light_orientation_items, STUDIOLIGHT_ORIENTATION_WORLD, 
"Orientation", "The orientation for the new studio light");
+       RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+       parm = RNA_def_pointer(func, "studio_light", "StudioLight", "", "Newly 
created StudioLight");
+       RNA_def_function_return(func, parm);
+
+       func = RNA_def_function(srna, "remove", "rna_StudioLights_remove");
+       RNA_def_function_ui_description(func, "Remove a studio light");
+       parm = RNA_def_pointer(func, "studio_light", "StudioLight", "", "The 
studio light to remove");
+       RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+
+       func = RNA_def_function(srna, "refresh", "rna_StudioLights_refresh");
+       RNA_def_function_ui_description(func, "Refresh Studio Lights from 
disk");
+}
+
 static void rna_def_userdef_studiolight(BlenderRNA *brna)
 {
        StructRNA *srna;
        PropertyRNA *prop;
 
-       static const EnumPropertyItem rna_enum_studio_light_orientation_items[] 
= {
-               {STUDIOLIGHT_ORIENTATION_CAMERA,     "CAMERA", 0, "Camera", ""},
-               {STUDIOLIGHT_ORIENTATION_WORLD,      "WORLD",  0, "World",  ""},
-               {STUDIOLIGHT_ORIENTATION_VIEWNORMAL, "MATCAP", 0, "MatCap", ""},
-               {0, NULL, 0, NULL, NULL}
-       };
-
        RNA_define_verify_sdna(false);
        srna = RNA_def_struct(brna, "StudioLight", NULL);
        RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
@@ -4833,7 +4872,6 @@ void RNA_def_userdef(BlenderRNA *brna)
 {
        StructRNA *srna;
        PropertyRNA *prop;
-       FunctionRNA *func;
 
        static const EnumPropertyItem user_pref_sections[] = {
                {USER_SECTION_INTERFACE, "INTERFACE", 0, "Interface", ""},
@@ -4927,16 +4965,14 @@ void RNA_def_userdef(BlenderRNA *brna)
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_flag(prop, PROP_THICK_WRAP);
 
+       /* StudioLight Collection */
        prop = RNA_def_property(srna, "studio_lights", PROP_COLLECTION, 
PROP_NONE);
        RNA_def_property_struct_type(prop, "StudioLight");
+       RNA_def_property_srna(prop, "StudioLights");
        RNA_d

@@ 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