Revision: 30519
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30519
Author:   jwilkins
Date:     2010-07-20 04:18:10 +0200 (Tue, 20 Jul 2010)

Log Message:
-----------
* Images for brush icons are now reloaded when they are needed from an external 
file
* First, try to load the file from the given filename.  This is either absolute 
or relative to the current .blend
* If file is found using the given filename directly then look for the file in 
the datafiles/brushicons directory (local, user, or system).

* Note: This commit does not update the .blend to reference the default icons
* Note: This commit does not make sure that the build system copies the default 
icons to the 2.52/datafiles/brushicons directory

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_view3d_toolbar.py
    trunk/blender/source/blender/blenkernel/BKE_brush.h
    trunk/blender/source/blender/blenkernel/intern/brush.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/interface/interface_icons.c
    trunk/blender/source/blender/makesdna/DNA_brush_types.h
    trunk/blender/source/blender/makesrna/intern/rna_brush.c
    trunk/blender/source/blender/makesrna/intern/rna_image.c

Modified: trunk/blender/release/scripts/ui/space_view3d_toolbar.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d_toolbar.py    2010-07-19 
23:56:21 UTC (rev 30518)
+++ trunk/blender/release/scripts/ui/space_view3d_toolbar.py    2010-07-20 
02:18:10 UTC (rev 30519)
@@ -567,10 +567,10 @@
             if edit.sculpt_paint_use_unified_size:
                 if edit.sculpt_paint_unified_lock_brush_size:
                     row.prop(edit, "sculpt_paint_unified_lock_brush_size", 
toggle=True, text="", icon='LOCKED')
-                    row.prop(edit, "sculpt_paint_unified_unprojected_radius", 
text="Unified Radius", slider=True)
+                    row.prop(edit, "sculpt_paint_unified_unprojected_radius", 
text="Radius", slider=True)
                 else:
                     row.prop(edit, "sculpt_paint_unified_lock_brush_size", 
toggle=True, text="", icon='UNLOCKED')
-                    row.prop(edit, "sculpt_paint_unified_size", text="Unified 
Radius", slider=True)
+                    row.prop(edit, "sculpt_paint_unified_size", text="Radius", 
slider=True)
 
             else:
                 if brush.lock_brush_size:
@@ -1122,9 +1122,12 @@
 
         col = layout.column()
         col.label(text="Icon:")
-        #col.template_ID_preview(brush, "image_icon", open="image.open", 
filter="is_image_icon", rows=3, cols=8)
-        col.template_ID_preview(brush, "image_icon", open="image.open", 
rows=3, cols=8)
 
+        row = col.row(align=True)
+        row.template_ID(brush, "image_icon")
+        row = col.row(align=True)
+        row.prop(brush, "image_icon_path", text="")
+
 # ********** default tools for weightpaint ****************
 
 

Modified: trunk/blender/source/blender/blenkernel/BKE_brush.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_brush.h 2010-07-19 23:56:21 UTC 
(rev 30518)
+++ trunk/blender/source/blender/blenkernel/BKE_brush.h 2010-07-20 02:18:10 UTC 
(rev 30519)
@@ -44,6 +44,9 @@
 void make_local_brush(struct Brush *brush);
 void free_brush(struct Brush *brush);
 
+/* image icon function */
+struct Image *get_brush_icon(struct Brush *brush);
+
 /* brush library operations used by different paint panels */
 int brush_set_nr(struct Brush **current_brush, int nr, const char *name);
 int brush_delete(struct Brush **current_brush);

Modified: trunk/blender/source/blender/blenkernel/intern/brush.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/brush.c      2010-07-19 
23:56:21 UTC (rev 30518)
+++ trunk/blender/source/blender/blenkernel/intern/brush.c      2010-07-20 
02:18:10 UTC (rev 30519)
@@ -132,8 +132,6 @@
 
        if(brush->mtex.tex) id_us_plus((ID*)brush->mtex.tex);
 
-       if(brush->image_icon) id_us_plus((ID*)brush->image_icon);
-
        brushn->curve= curvemapping_copy(brush->curve);
 
        /* enable fake user by default */
@@ -205,6 +203,37 @@
        }
 }
 
+/* image icon function */
+Image* get_brush_icon(Brush *brush)
+{
+
+       if (!(brush->image_icon) && brush->image_icon_path[0]) {
+               // first use the path directly to try and load the file
+               brush->image_icon= BKE_add_image_file(brush->image_icon_path, 
1);
+
+               // otherwise lets try to find it in other directories
+               if (!(brush->image_icon)) {
+                       char path[240];
+                       char *folder;
+                       
+                       folder= BLI_get_folder(BLENDER_DATAFILES, "brushicons");
+
+                       path[0] = 0;
+
+                       BLI_make_file_string(G.sce, path, folder, 
brush->image_icon_path);
+
+                       if (path[0])
+                               brush->image_icon= BKE_add_image_file(path, 1);
+               }
+
+               // remove user count so image isn't saved on exit
+               if (brush->image_icon)
+                       id_us_min((ID*)(brush->image_icon));
+       }
+
+       return brush->image_icon;
+}
+
 /* Library Operations */
 
 int brush_set_nr(Brush **current_brush, int nr, const char *name)

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2010-07-19 
23:56:21 UTC (rev 30518)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2010-07-20 
02:18:10 UTC (rev 30519)
@@ -1539,8 +1539,11 @@
                        brush->id.flag -= LIB_NEEDLINK;
 
                        brush->mtex.tex= newlibadr_us(fd, brush->id.lib, 
brush->mtex.tex);
+                       brush->clone.image= newlibadr_us(fd, brush->id.lib, 
brush->clone.image);
+
+                       // Image icons not saved if only used as an icon,
+                       // but if it used elsewhere in the file it will have 
been saved
                        brush->image_icon= newlibadr_us(fd, brush->id.lib, 
brush->image_icon);
-                       brush->clone.image= newlibadr_us(fd, brush->id.lib, 
brush->clone.image);
                }
        }
 }
@@ -10981,6 +10984,10 @@
                for (brush= main->brush.first; brush; brush= brush->id.next) {
                        /* Sanity Check */
 
+                       // brush icon loaded but not the path
+                       //if (brush->image_icon && !(brush->image_icon_path[0]))
+                       //      BLI_strncpy(brush->image_icon_path, 
brush->image_icon->name, sizeof(brush->image_icon_path));
+
                        // infinite number of dabs
                        if (brush->spacing == 0)
                                brush->spacing = 10;

Modified: trunk/blender/source/blender/editors/interface/interface_icons.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_icons.c    
2010-07-19 23:56:21 UTC (rev 30518)
+++ trunk/blender/source/blender/editors/interface/interface_icons.c    
2010-07-20 02:18:10 UTC (rev 30519)
@@ -981,7 +981,7 @@
                case ID_BR:
                        { /* use the image in the brush as the icon */
                          /* XXX redundancy here can be reduced be rewriting 
this switch as an if */
-                               ID* ima_id = (ID*)((Brush*)id)->image_icon;
+                               ID* ima_id = (ID*)get_brush_icon((Brush*)id);
                                id = ima_id ? ima_id : id;
                                iconid= BKE_icon_getid(id);
                                /* checks if not exists, or changed */

Modified: trunk/blender/source/blender/makesdna/DNA_brush_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_brush_types.h     2010-07-19 
23:56:21 UTC (rev 30518)
+++ trunk/blender/source/blender/makesdna/DNA_brush_types.h     2010-07-20 
02:18:10 UTC (rev 30519)
@@ -54,6 +54,7 @@
        struct CurveMapping *curve;     /* falloff curve */
        struct MTex mtex;
        struct Image *image_icon;
+       char image_icon_path[240];
 
        float normal_weight;
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_brush.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_brush.c    2010-07-19 
23:56:21 UTC (rev 30518)
+++ trunk/blender/source/blender/makesrna/intern/rna_brush.c    2010-07-20 
02:18:10 UTC (rev 30519)
@@ -104,6 +104,36 @@
        return 0;
 }
 
+static void rna_Brush_image_icon_update(Main *bmain, Scene *scene, PointerRNA 
*ptr)
+{
+       Brush *br= (Brush*)ptr->data;
+
+       if (br->image_icon) {
+               // store path to external image so it can be reloaded later
+               BLI_strncpy(br->image_icon_path, br->image_icon->name, 
sizeof(br->image_icon_path));
+
+               // setting or loading image_icon bumps its user count
+               // we do not want writefile to save the image if a brush is the 
only user,
+               // so decrement the user count by one
+               id_us_min((ID*)(br->image_icon));
+       }
+       else {
+               memset(br->image_icon_path, 0, sizeof(br->image_icon_path));
+       }
+
+       WM_main_add_notifier(NC_BRUSH|NA_EDITED, br);
+}
+
+static void rna_Brush_image_icon_path_update(Main *bmain, Scene *scene, 
PointerRNA *ptr)
+{
+       Brush *br= (Brush*)ptr->data;
+
+       if (br->image_icon)
+               br->image_icon = NULL;
+
+       WM_main_add_notifier(NC_BRUSH|NA_EDITED, br);
+}
+
 #else
 
 static void rna_def_brush_texture_slot(BlenderRNA *brna)
@@ -642,8 +672,13 @@
        RNA_def_property_struct_type(prop, "Image");
        RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Image Icon", "");
-       RNA_def_property_update(prop, 0, "rna_Brush_update");
+       RNA_def_property_update(prop, 0, "rna_Brush_image_icon_update");
 
+       prop= RNA_def_property(srna, "image_icon_path", PROP_STRING, 
PROP_FILEPATH);
+       RNA_def_property_string_sdna(prop, NULL, "image_icon_path");
+       RNA_def_property_ui_text(prop, "Image Icon Filepath", "File path for 
brush icon");
+       RNA_def_property_update(prop, 0, "rna_Brush_image_icon_path_update");
+
        /* clone tool */
        prop= RNA_def_property(srna, "clone_image", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "clone.image");

Modified: trunk/blender/source/blender/makesrna/intern/rna_image.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_image.c    2010-07-19 
23:56:21 UTC (rev 30518)
+++ trunk/blender/source/blender/makesrna/intern/rna_image.c    2010-07-20 
02:18:10 UTC (rev 30519)
@@ -213,12 +213,6 @@
        return depth;
 }
 
-static int rna_Image_is_image_icon(Image *me, bContext *C)
-{
-       const char prefix[] = ".imageicon.";
-       return strncmp(me->id.name+2, prefix, sizeof(prefix)-1) == 0;
-}
-
 #else
 
 static void rna_def_imageuser(BlenderRNA *brna)
@@ -298,9 +292,6 @@
                {IMA_STD_FIELD, "ODD", 0, "Lower First", "Lower field first"},
                {0, NULL, 0, NULL, NULL}};
 
-       FunctionRNA *func;
-       PropertyRNA *parm;
-
        srna= RNA_def_struct(brna, "Image", "ID");
        RNA_def_struct_ui_text(srna, "Image", "Image datablock referencing an 
external or packed image");
        RNA_def_struct_ui_icon(srna, ICON_IMAGE_DATA);
@@ -342,14 +333,6 @@
        RNA_def_property_ui_text(prop, "Field Order", "Order of video fields. 
Select which lines are displayed first");
        RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
        
-       /* functions */
-       func= RNA_def_function(srna, "is_image_icon", 
"rna_Image_is_image_icon");
-       RNA_def_function_ui_description(func, "Returns true if Image name is 
prefixed with .imageicon.");
-       parm= RNA_def_pointer(func, "context", "Context", "", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm= RNA_def_boolean(func, "ret", 0, "", "");
-       RNA_def_function_return(func, parm);
-
        /* booleans */
        prop= RNA_def_property(srna, "fields", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_FIELDS);


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to