Image Panels

* The image panels in the image editor and texture buttons
  should be more complete now, with working new/open,
  refreshes, and using the layout engine.
* Paint panels in image editor are now consistent with the
  ones in the 3d view toolbar.
* Curves panel also uses layout engine, and doesn't look
  squashed anymore.
This commit is contained in:
Brecht Van Lommel 2009-09-16 19:27:08 +00:00
parent 5129b08064
commit f8abfce7ce
13 changed files with 507 additions and 618 deletions

@ -277,6 +277,24 @@ class IMAGE_HT_header(bpy.types.Header):
if show_uvedit or sima.image_painting:
layout.itemR(sima, "update_automatically", text="")
class IMAGE_PT_image_properties(bpy.types.Panel):
__space_type__ = 'IMAGE_EDITOR'
__region_type__ = 'UI'
__label__ = "Image"
def poll(self, context):
sima = context.space_data
return (sima.image)
def draw(self, context):
layout = self.layout
sima = context.space_data
ima = sima.image
iuser = sima.image_user
layout.template_image(sima, "image", iuser, compact=True)
class IMAGE_PT_game_properties(bpy.types.Panel):
__space_type__ = 'IMAGE_EDITOR'
__region_type__ = 'UI'
@ -368,6 +386,92 @@ class IMAGE_PT_view_properties(bpy.types.Panel):
#col.itemR(uvedit, "draw_edges")
#col.itemR(uvedit, "draw_faces")
class IMAGE_PT_paint(bpy.types.Panel):
__space_type__ = 'IMAGE_EDITOR'
__region_type__ = 'UI'
__label__ = "Paint"
def poll(self, context):
sima = context.space_data
return sima.show_paint
def draw(self, context):
layout = self.layout
settings = context.tool_settings.image_paint
brush = settings.brush
col = layout.split().column()
row = col.row()
row.template_list(settings, "brushes", settings, "active_brush_index", rows=2)
col.template_ID(settings, "brush", new="brush.add")
row = layout.row(align=True)
row.item_enumR(settings, "tool", 'DRAW')
row.item_enumR(settings, "tool", 'SOFTEN')
row.item_enumR(settings, "tool", 'CLONE')
row.item_enumR(settings, "tool", 'SMEAR')
col = layout.column()
col.itemR(brush, "color", text="")
row = col.row(align=True)
row.itemR(brush, "size", slider=True)
row.itemR(brush, "size_pressure", toggle=True, text="")
row = col.row(align=True)
row.itemR(brush, "strength", slider=True)
row.itemR(brush, "strength_pressure", toggle=True, text="")
col.itemR(brush, "blend", text="Blend")
class IMAGE_PT_paint_stroke(bpy.types.Panel):
__space_type__ = 'IMAGE_EDITOR'
__region_type__ = 'UI'
__label__ = "Paint Stroke"
__default_closed__ = True
def poll(self, context):
sima = context.space_data
return sima.show_paint
def draw(self, context):
layout = self.layout
settings = context.tool_settings.image_paint
brush = settings.brush
layout.itemR(brush, "airbrush")
col = layout.column()
col.active = brush.airbrush
col.itemR(brush, "rate", slider=True)
layout.itemR(brush, "space")
row = layout.row(align=True)
row.active = brush.space
row.itemR(brush, "spacing", text="Distance", slider=True)
row.itemR(brush, "spacing_pressure", toggle=True, text="")
class IMAGE_PT_paint_curve(bpy.types.Panel):
__space_type__ = 'IMAGE_EDITOR'
__region_type__ = 'UI'
__label__ = "Paint Curve"
__default_closed__ = True
def poll(self, context):
sima = context.space_data
return sima.show_paint
def draw(self, context):
layout = self.layout
settings = context.tool_settings.image_paint
brush = settings.brush
layout.template_curve_mapping(brush, "curve")
layout.item_menu_enumO("brush.curve_preset", property="shape")
bpy.types.register(IMAGE_MT_view)
bpy.types.register(IMAGE_MT_select)
bpy.types.register(IMAGE_MT_image)
@ -377,5 +481,10 @@ bpy.types.register(IMAGE_MT_uvs_mirror)
bpy.types.register(IMAGE_MT_uvs_weldalign)
bpy.types.register(IMAGE_MT_uvs)
bpy.types.register(IMAGE_HT_header)
bpy.types.register(IMAGE_PT_image_properties)
bpy.types.register(IMAGE_PT_paint)
bpy.types.register(IMAGE_PT_paint_stroke)
bpy.types.register(IMAGE_PT_paint_curve)
bpy.types.register(IMAGE_PT_game_properties)
bpy.types.register(IMAGE_PT_view_properties)

@ -277,7 +277,7 @@ static Image *image_alloc(const char *name, short source, short type)
ima->xrep= ima->yrep= 1;
ima->aspx= ima->aspy= 1.0;
ima->gen_x= 256; ima->gen_y= 256;
ima->gen_x= 1024; ima->gen_y= 1024;
ima->gen_type= 1; /* no defines yet? */
ima->source= source;
@ -1472,9 +1472,11 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
iuser->ok= 1;
break;
case IMA_SIGNAL_SRC_CHANGE:
if(ima->type==IMA_TYPE_MULTILAYER)
image_free_buffers(ima);
else if(ima->source==IMA_SRC_GENERATED) {
if(ima->type == IMA_TYPE_UV_TEST)
if(ima->source != IMA_SRC_GENERATED)
ima->type= IMA_TYPE_IMAGE;
if(ima->source==IMA_SRC_GENERATED) {
if(ima->gen_x==0 || ima->gen_y==0) {
ImBuf *ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0);
if(ibuf) {
@ -1483,6 +1485,9 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
}
}
}
image_free_buffers(ima);
ima->ok= 1;
if(iuser)
iuser->ok= 1;
@ -2090,8 +2095,8 @@ ImBuf *BKE_image_get_ibuf(Image *ima, ImageUser *iuser)
else if(ima->source == IMA_SRC_GENERATED) {
/* generated is: ibuf is allocated dynamically */
/* UV testgrid or black or solid etc */
if(ima->gen_x==0) ima->gen_x= 256;
if(ima->gen_y==0) ima->gen_y= 256;
if(ima->gen_x==0) ima->gen_x= 1024;
if(ima->gen_y==0) ima->gen_y= 1024;
ibuf= add_ibuf_size(ima->gen_x, ima->gen_y, ima->name, 0, ima->gen_type, color);
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
ima->ok= IMA_OK_LOADED;

@ -46,19 +46,24 @@ const char PAINT_CURSOR_TEXTURE_PAINT[3] = {255, 255, 255};
Paint *paint_get_active(Scene *sce)
{
if(sce && sce->basact && sce->basact->object) {
if(sce) {
ToolSettings *ts = sce->toolsettings;
switch(sce->basact->object->mode) {
case OB_MODE_SCULPT:
return &ts->sculpt->paint;
case OB_MODE_VERTEX_PAINT:
return &ts->vpaint->paint;
case OB_MODE_WEIGHT_PAINT:
return &ts->wpaint->paint;
case OB_MODE_TEXTURE_PAINT:
return &ts->imapaint.paint;
if(sce->basact && sce->basact->object) {
switch(sce->basact->object->mode) {
case OB_MODE_SCULPT:
return &ts->sculpt->paint;
case OB_MODE_VERTEX_PAINT:
return &ts->vpaint->paint;
case OB_MODE_WEIGHT_PAINT:
return &ts->wpaint->paint;
case OB_MODE_TEXTURE_PAINT:
return &ts->imapaint.paint;
}
}
/* default to image paint */
return &ts->imapaint.paint;
}
return NULL;

@ -53,9 +53,6 @@ int ED_space_image_show_paint(struct SpaceImage *sima);
int ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit);
int ED_space_image_show_uvshadow(struct SpaceImage *sima, struct Object *obedit);
void ED_image_uiblock_panel(const struct bContext *C, struct uiBlock *block, struct Image **ima_pp,
struct ImageUser *iuser, short redraw, short imagechanged);
/* image_render.c, export for screen_ops.c, render operator */
void ED_space_image_output(struct bContext *C);

@ -2125,17 +2125,4 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
uiDefIconTextBut(block, BUT, B_STOPANIM, ICON_REC, "Anim Player", 0,0,85,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop animation playback");
}
/************************* Image Template **************************/
#include "ED_image.h"
void uiTemplateTextureImage(uiLayout *layout, bContext *C, Tex *tex)
{
uiBlock *block;
if(tex) {
block= uiLayoutFreeBlock(layout);
ED_image_uiblock_panel(C, block, &tex->ima, &tex->iuser, 0, 0);
}
}

@ -100,8 +100,6 @@
#define B_FACESEL_PAINT_TEST 11
#define B_SIMA_RECORD 12
#define B_SIMA_PLAY 13
#define B_SIMARANGE 14
#define B_SIMACURVES 15
#define B_SIMANOTHING 16
#define B_SIMABRUSHCHANGE 17
@ -116,10 +114,8 @@
#define B_SIMACLONEDELETE 26
/* XXX */
static int okee() {return 0;}
static int simaFaceDraw_Check() {return 0;}
static int simaUVSel_Check() {return 0;}
static int is_uv_tface_editing_allowed_silent() {return 0;}
/* XXX */
/* proto */
@ -135,13 +131,6 @@ static void do_image_panel_events(bContext *C, void *arg, int event)
switch(event) {
case B_REDR:
break;
case B_SIMACURVES:
curvemapping_do_ibuf(sima->cumap, ED_space_image_buffer(sima));
break;
case B_SIMARANGE:
curvemapping_set_black_white(sima->cumap, NULL, NULL);
curvemapping_do_ibuf(sima->cumap, ED_space_image_buffer(sima));
break;
case B_TRANS_IMAGE:
image_editvertex_buts(C, NULL);
break;
@ -149,12 +138,11 @@ static void do_image_panel_events(bContext *C, void *arg, int event)
image_editcursor_buts(C, &ar->v2d, NULL);
break;
}
/* all events now */
WM_event_add_notifier(C, NC_IMAGE, sima->image);
}
static void image_info(Image *ima, ImBuf *ibuf, char *str)
{
int ofs= 0;
@ -168,12 +156,12 @@ static void image_info(Image *ima, ImBuf *ibuf, char *str)
}
if(ima->source==IMA_SRC_MOVIE) {
ofs= sprintf(str, "Movie ");
ofs= sprintf(str, "Movie");
if(ima->anim)
ofs+= sprintf(str+ofs, "%d frs", IMB_anim_get_duration(ima->anim));
}
else
ofs= sprintf(str, "Image ");
ofs= sprintf(str, "Image");
ofs+= sprintf(str+ofs, ": size %d x %d,", ibuf->x, ibuf->y);
@ -246,10 +234,6 @@ static void image_editvertex_buts(const bContext *C, uiBlock *block)
EditFace *efa;
MTFace *tf;
if(obedit==NULL || obedit->type!=OB_MESH) return;
if( is_uv_tface_editing_allowed_silent()==0 ) return;
image_transform_but_attr(sima, &imx, &imy, &step, &digits);
em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
@ -354,8 +338,6 @@ static void image_editcursor_buts(const bContext *C, View2D *v2d, uiBlock *block
int imx= 256, imy= 256;
int step, digits;
if( is_uv_tface_editing_allowed_silent()==0 ) return;
image_transform_but_attr(sima, &imx, &imy, &step, &digits);
if(block) { // do the buttons
@ -388,59 +370,6 @@ static void image_editcursor_buts(const bContext *C, View2D *v2d, uiBlock *block
#if 0
static void image_panel_view_properties(const bContext *C, Panel *pa)
{
SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
Object *obedit= CTX_data_edit_object(C);
uiBlock *block;
block= uiLayoutFreeBlock(pa->layout);
uiBlockSetHandleFunc(block, do_image_panel_events, NULL);
uiDefButBitI(block, TOG, SI_DRAW_TILE, B_REDR, "Repeat Image", 10,160,140,19, &sima->flag, 0, 0, 0, 0, "Repeat/Tile the image display");
uiDefButBitI(block, TOG, SI_COORDFLOATS, B_REDR, "Normalized Coords", 165,160,145,19, &sima->flag, 0, 0, 0, 0, "Display coords from 0.0 to 1.0 rather then in pixels");
if (sima->image) {
uiDefBut(block, LABEL, B_NOP, "Image Display:", 10,140,140,19, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_REDR, "AspX:", 10,120,140,19, &sima->image->aspx, 0.1, 5000.0, 100, 0, "X Display Aspect for this image, does not affect renderingm 0 disables.");
uiDefButF(block, NUM, B_REDR, "AspY:", 10,100,140,19, &sima->image->aspy, 0.1, 5000.0, 100, 0, "X Display Aspect for this image, does not affect rendering 0 disables.");
uiBlockEndAlign(block);
}
if (obedit && obedit->type==OB_MESH) {
Mesh *me= obedit->data;
EditMesh *em= BKE_mesh_get_editmesh(me);
if(EM_texFaceCheck(em)) {
uiDefBut(block, LABEL, B_NOP, "Draw Type:", 10, 80,120,19, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButC(block, ROW, B_REDR, "Outline", 10,60,58,19, &sima->dt_uv, 0.0, SI_UVDT_OUTLINE, 0, 0, "Outline Wire UV drawtype");
uiDefButC(block, ROW, B_REDR, "Dash", 68, 60,58,19, &sima->dt_uv, 0.0, SI_UVDT_DASH, 0, 0, "Dashed Wire UV drawtype");
uiDefButC(block, ROW, B_REDR, "Black", 126, 60,58,19, &sima->dt_uv, 0.0, SI_UVDT_BLACK, 0, 0, "Black Wire UV drawtype");
uiDefButC(block, ROW, B_REDR, "White", 184,60,58,19, &sima->dt_uv, 0.0, SI_UVDT_WHITE, 0, 0, "White Wire UV drawtype");
uiBlockEndAlign(block);
uiDefButBitI(block, TOG, SI_SMOOTH_UV, B_REDR, "Smooth", 250,60,60,19, &sima->flag, 0, 0, 0, 0, "Display smooth lines in the UV view");
uiDefButBitI(block, TOG, ME_DRAWFACES, B_REDR, "Faces", 10,30,60,19, &me->drawflag, 0, 0, 0, 0, "Displays all faces as shades in the 3d view and UV editor");
uiDefButBitI(block, TOG, ME_DRAWEDGES, B_REDR, "Edges", 70, 30,60,19, &me->drawflag, 0, 0, 0, 0, "Displays selected edges using hilights in the 3d view and UV editor");
uiDefButBitI(block, TOG, SI_DRAWSHADOW, B_REDR, "Final Shadow", 130, 30,110,19, &sima->flag, 0, 0, 0, 0, "Draw the final result from the objects modifiers");
uiDefButBitI(block, TOG, SI_DRAW_OTHER, B_REDR, "Other Objs", 230, 30, 80, 19, &sima->flag, 0, 0, 0, 0, "Also draw all 3d view selected mesh objects that use this image");
uiDefButBitI(block, TOG, SI_DRAW_STRETCH, B_REDR, "UV Stretch", 10,0,100,19, &sima->flag, 0, 0, 0, 0, "Difference between UV's and the 3D coords (blue for low distortion, red is high)");
if (sima->flag & SI_DRAW_STRETCH) {
uiBlockBeginAlign(block);
uiDefButC(block, ROW, B_REDR, "Area", 120,0,60,19, &sima->dt_uvstretch, 0.0, SI_UVDT_STRETCH_AREA, 0, 0, "Area distortion between UV's and 3D coords");
uiDefButC(block, ROW, B_REDR, "Angle", 180,0,60,19, &sima->dt_uvstretch, 0.0, SI_UVDT_STRETCH_ANGLE, 0, 0, "Angle distortion between UV's and 3D coords");
uiBlockEndAlign(block);
}
}
BKE_mesh_end_editmesh(me, em);
}
image_editcursor_buts(C, &ar->v2d, block);
}
#endif
@ -565,104 +494,33 @@ void brush_buttons(const bContext *C, uiBlock *block, short fromsima,
#endif
}
static int image_panel_paint_poll(const bContext *C, PanelType *pt)
static int image_panel_poll(const bContext *C, PanelType *pt)
{
SpaceImage *sima= CTX_wm_space_image(C);
ImBuf *ibuf= ED_space_image_buffer(sima);
return (sima->image && (sima->flag & SI_DRAWTOOL));
return (ibuf != NULL);
}
static void image_panel_paintcolor(const bContext *C, Panel *pa)
{
SpaceImage *sima= CTX_wm_space_image(C);
ToolSettings *settings= CTX_data_tool_settings(C);
Brush *brush= paint_brush(&settings->imapaint.paint);
uiBlock *block;
static float hsv[3], old[3]; // used as temp mem for picker
static char hexcol[128];
if(!sima->image || (sima->flag & SI_DRAWTOOL)==0)
return;
block= uiLayoutFreeBlock(pa->layout);
uiBlockSetHandleFunc(block, do_image_panel_events, NULL);
if(brush)
uiBlockPickerButtons(block, brush->rgb, hsv, old, hexcol, 'f', B_REDR);
}
static void image_panel_paint(const bContext *C, Panel *pa)
{
SpaceImage *sima= CTX_wm_space_image(C);
uiBlock *block;
if(!sima->image || (sima->flag & SI_DRAWTOOL)==0)
return;
block= uiLayoutFreeBlock(pa->layout);
uiBlockSetHandleFunc(block, do_image_panel_events, NULL);
brush_buttons(C, block, 1, B_SIMANOTHING, B_SIMABRUSHCHANGE, B_SIMABRUSHBROWSE, B_SIMABRUSHLOCAL, B_SIMABRUSHDELETE, B_KEEPDATA, B_SIMABTEXBROWSE, B_SIMABTEXDELETE);
}
static void image_panel_curves_reset(bContext *C, void *cumap_v, void *ibuf_v)
{
SpaceImage *sima= CTX_wm_space_image(C);
CurveMapping *cumap = cumap_v;
int a;
for(a=0; a<CM_TOT; a++)
curvemap_reset(cumap->cm+a, &cumap->clipr);
cumap->black[0]=cumap->black[1]=cumap->black[2]= 0.0f;
cumap->white[0]=cumap->white[1]=cumap->white[2]= 1.0f;
curvemapping_set_black_white(cumap, NULL, NULL);
curvemapping_changed(cumap, 0);
curvemapping_do_ibuf(cumap, ibuf_v);
WM_event_add_notifier(C, NC_IMAGE, sima->image);
}
static void image_panel_curves(const bContext *C, Panel *pa)
{
bScreen *sc= CTX_wm_screen(C);
SpaceImage *sima= CTX_wm_space_image(C);
ImBuf *ibuf;
uiBlock *block;
uiBut *bt;
PointerRNA simaptr;
int levels;
/* and we check for spare */
ibuf= ED_space_image_buffer(sima);
block= uiLayoutFreeBlock(pa->layout);
uiBlockSetHandleFunc(block, do_image_panel_events, NULL);
if (ibuf) {
rctf rect;
if(ibuf) {
if(sima->cumap==NULL)
sima->cumap= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
rect.xmin= 110; rect.xmax= 310;
rect.ymin= 10; rect.ymax= 200;
curvemap_buttons(block, sima->cumap, 'c', B_SIMACURVES, B_REDR, &rect);
/* curvemap min/max only works for RGBA */
if(ibuf->channels==4) {
bt=uiDefBut(block, BUT, B_SIMARANGE, "Reset", 10, 160, 90, 19, NULL, 0.0f, 0.0f, 0, 0, "Reset Black/White point and curves");
uiButSetFunc(bt, image_panel_curves_reset, sima->cumap, ibuf);
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_SIMARANGE, "Min R:", 10, 120, 90, 19, sima->cumap->black, -1000.0f, 1000.0f, 10, 2, "Black level");
uiDefButF(block, NUM, B_SIMARANGE, "Min G:", 10, 100, 90, 19, sima->cumap->black+1, -1000.0f, 1000.0f, 10, 2, "Black level");
uiDefButF(block, NUM, B_SIMARANGE, "Min B:", 10, 80, 90, 19, sima->cumap->black+2, -1000.0f, 1000.0f, 10, 2, "Black level");
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_SIMARANGE, "Max R:", 10, 50, 90, 19, sima->cumap->white, -1000.0f, 1000.0f, 10, 2, "White level");
uiDefButF(block, NUM, B_SIMARANGE, "Max G:", 10, 30, 90, 19, sima->cumap->white+1, -1000.0f, 1000.0f, 10, 2, "White level");
uiDefButF(block, NUM, B_SIMARANGE, "Max B:", 10, 10, 90, 19, sima->cumap->white+2, -1000.0f, 1000.0f, 10, 2, "White level");
}
/* curvemap black/white levels only works for RGBA */
levels= (ibuf->channels==4);
RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &simaptr);
uiTemplateCurveMapping(pa->layout, &simaptr, "curves", 'c', levels);
}
}
@ -799,81 +657,11 @@ static void image_panel_preview(ScrArea *sa, short cntrl) // IMAGE_HANDLER_PREVI
uiBlockSetDrawExtraFunc(block, preview_cb);
}
static void image_panel_gpencil(short cntrl) // IMAGE_HANDLER_GREASEPENCIL
{
uiBlock *block;
SpaceImage *sima;
sima= curarea->spacedata.first;
block= uiBeginBlock(C, ar, "image_panel_gpencil", UI_EMBOSS);
uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
uiSetPanelHandler(IMAGE_HANDLER_GREASEPENCIL); // for close and esc
if (uiNewPanel(C, ar, block, "Grease Pencil", "SpaceImage", 100, 30, 318, 204)==0) return;
/* allocate memory for gpd if drawing enabled (this must be done first or else we crash) */
if (sima->flag & SI_DISPGP) {
if (sima->gpd == NULL)
gpencil_data_setactive(curarea, gpencil_data_addnew());
}
if (sima->flag & SI_DISPGP) {
bGPdata *gpd= sima->gpd;
short newheight;
/* this is a variable height panel, newpanel doesnt force new size on existing panels */
/* so first we make it default height */
uiNewPanelHeight(block, 204);
/* draw button for showing gpencil settings and drawings */
uiDefButBitI(block, TOG, SI_DISPGP, B_REDR, "Use Grease Pencil", 10, 225, 150, 20, &sima->flag, 0, 0, 0, 0, "Display freehand annotations overlay over this Image/UV Editor (draw using Shift-LMB)");
/* extend the panel if the contents won't fit */
newheight= draw_gpencil_panel(block, gpd, curarea);
uiNewPanelHeight(block, newheight);
}
else {
uiDefButBitI(block, TOG, SI_DISPGP, B_REDR, "Use Grease Pencil", 10, 225, 150, 20, &sima->flag, 0, 0, 0, 0, "Display freehand annotations overlay over this Image/UV Editor");
uiDefBut(block, LABEL, 1, " ", 160, 180, 150, 20, NULL, 0.0, 0.0, 0, 0, "");
}
}
#endif
/* ********************* callbacks for standard image buttons *************** */
/* called from fileselect or button */
static void load_image_cb(bContext *C, char *str, void *ima_pp_v, void *iuser_v)
{
Image **ima_pp= (Image **)ima_pp_v;
Image *ima= NULL;
ima= BKE_add_image_file(str, 0);
if(ima) {
if(*ima_pp) {
(*ima_pp)->id.us--;
}
*ima_pp= ima;
BKE_image_signal(ima, iuser_v, IMA_SIGNAL_RELOAD);
WM_event_add_notifier(C, NC_IMAGE, ima);
/* button event gets lost when it goes via filewindow */
// if(G.buts && G.buts->lockpoin) {
// Tex *tex= G.buts->lockpoin;
// if(GS(tex->id.name)==ID_TE) {
// BIF_preview_changed(ID_TE);
// allqueue(REDRAWBUTSSHADING, 0);
// allqueue(REDRAWVIEW3D, 0);
// allqueue(REDRAWOOPS, 0);
// }
// }
}
ED_undo_push(C, "Load image");
}
static char *layer_menu(RenderResult *rr, short *curlay)
{
RenderLayer *rl;
@ -937,92 +725,6 @@ static void set_frames_cb(bContext *C, void *ima_v, void *iuser_v)
}
}
static void image_src_change_cb(bContext *C, void *ima_v, void *iuser_v)
{
BKE_image_signal(ima_v, iuser_v, IMA_SIGNAL_SRC_CHANGE);
}
/* buttons have 2 arg callbacks, filewindow has 3 args... so thats why the wrapper below */
static void image_browse_cb1(bContext *C, void *ima_pp_v, void *iuser_v)
{
Image **ima_pp= (Image **)ima_pp_v;
ImageUser *iuser= iuser_v;
if(ima_pp) {
Image *ima= *ima_pp;
if(iuser->menunr== -2) {
// XXX activate_databrowse_args(&ima->id, ID_IM, 0, &iuser->menunr, image_browse_cb1, ima_pp, iuser);
}
else if (iuser->menunr>0) {
Image *newima= (Image*) BLI_findlink(&CTX_data_main(C)->image, iuser->menunr-1);
if (newima && newima!=ima) {
*ima_pp= newima;
id_us_plus(&newima->id);
if(ima) ima->id.us--;
BKE_image_signal(newima, iuser, IMA_SIGNAL_USER_NEW_IMAGE);
ED_undo_push(C, "Browse image");
}
}
}
}
static void image_browse_cb(bContext *C, void *ima_pp_v, void *iuser_v)
{
image_browse_cb1(C, ima_pp_v, iuser_v);
}
static void image_reload_cb(bContext *C, void *ima_v, void *iuser_v)
{
if(ima_v) {
BKE_image_signal(ima_v, iuser_v, IMA_SIGNAL_RELOAD);
}
}
static void image_field_test(bContext *C, void *ima_v, void *iuser_v)
{
Image *ima= ima_v;
if(ima) {
ImBuf *ibuf= BKE_image_get_ibuf(ima, iuser_v);
if(ibuf) {
short nr= 0;
if( !(ima->flag & IMA_FIELDS) && (ibuf->flags & IB_fields) ) nr= 1;
if( (ima->flag & IMA_FIELDS) && !(ibuf->flags & IB_fields) ) nr= 1;
if(nr) {
BKE_image_signal(ima, iuser_v, IMA_SIGNAL_FREE);
}
}
}
}
static void image_unlink_cb(bContext *C, void *ima_pp_v, void *unused)
{
Image **ima_pp= (Image **)ima_pp_v;
if(ima_pp && *ima_pp) {
Image *ima= *ima_pp;
/* (for time being, texturefaces are no users, conflict in design...) */
if(ima->id.us>1)
ima->id.us--;
*ima_pp= NULL;
}
}
static void image_load_fs_cb(bContext *C, void *ima_pp_v, void *iuser_v)
{
ScrArea *sa= CTX_wm_area(C);
// Image **ima_pp= (Image **)ima_pp_v;
if(sa->spacetype==SPACE_IMAGE)
WM_operator_name_call(C, "IMAGE_OT_open", WM_OP_INVOKE_REGION_WIN, NULL);
else
printf("not supported yet\n");
}
/* 5 layer button callbacks... */
static void image_multi_cb(bContext *C, void *rr_v, void *iuser_v)
{
@ -1077,6 +779,7 @@ static void image_multi_decpass_cb(bContext *C, void *rr_v, void *iuser_v)
}
}
#if 0
static void image_pack_cb(bContext *C, void *ima_v, void *iuser_v)
{
if(ima_v) {
@ -1106,282 +809,270 @@ static void image_pack_cb(bContext *C, void *ima_v, void *iuser_v)
}
}
}
#endif
static void image_load_cb(bContext *C, void *ima_pp_v, void *iuser_v)
{
if(ima_pp_v) {
Image *ima= *((Image **)ima_pp_v);
ImBuf *ibuf= BKE_image_get_ibuf(ima, iuser_v);
char str[FILE_MAX];
/* name in ima has been changed by button! */
BLI_strncpy(str, ima->name, FILE_MAX);
if(ibuf) BLI_strncpy(ima->name, ibuf->name, FILE_MAX);
load_image_cb(C, str, ima_pp_v, iuser_v);
}
}
#if 0
static void image_freecache_cb(bContext *C, void *ima_v, void *unused)
{
Scene *scene= CTX_data_scene(C);
BKE_image_free_anim_ibufs(ima_v, scene->r.cfra);
WM_event_add_notifier(C, NC_IMAGE, ima_v);
}
#endif
static void image_generated_change_cb(bContext *C, void *ima_v, void *iuser_v)
{
BKE_image_signal(ima_v, iuser_v, IMA_SIGNAL_FREE);
}
#if 0
static void image_user_change(bContext *C, void *iuser_v, void *unused)
{
Scene *scene= CTX_data_scene(C);
BKE_image_user_calc_imanr(iuser_v, scene->r.cfra, 0);
}
#endif
static void uiblock_layer_pass_buttons(uiBlock *block, RenderResult *rr, ImageUser *iuser, int event, int x, int y, int w)
static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, int w)
{
uiBlock *block= uiLayoutGetBlock(layout);
uiBut *but;
RenderLayer *rl= NULL;
int wmenu1, wmenu2;
char *strp;
uiLayoutRow(layout, 1);
/* layer menu is 1/3 larger than pass */
wmenu1= (3*w)/5;
wmenu2= (2*w)/5;
/* menu buts */
strp= layer_menu(rr, &iuser->layer);
but= uiDefButS(block, MENU, event, strp, x, y, wmenu1, 20, &iuser->layer, 0,0,0,0, "Select Layer");
but= uiDefButS(block, MENU, 0, strp, 0, 0, wmenu1, 20, &iuser->layer, 0,0,0,0, "Select Layer");
uiButSetFunc(but, image_multi_cb, rr, iuser);
MEM_freeN(strp);
rl= BLI_findlink(&rr->layers, iuser->layer - (rr->rectf?1:0)); /* fake compo layer, return NULL is meant to be */
strp= pass_menu(rl, &iuser->pass);
but= uiDefButS(block, MENU, event, strp, x+wmenu1, y, wmenu2, 20, &iuser->pass, 0,0,0,0, "Select Pass");
but= uiDefButS(block, MENU, 0, strp, 0, 0, wmenu2, 20, &iuser->pass, 0,0,0,0, "Select Pass");
uiButSetFunc(but, image_multi_cb, rr, iuser);
MEM_freeN(strp);
}
static void uiblock_layer_pass_arrow_buttons(uiBlock *block, RenderResult *rr, ImageUser *iuser, int imagechanged)
static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser)
{
uiBlock *block= uiLayoutGetBlock(layout);
uiLayout *row;
uiBut *but;
row= uiLayoutRow(layout, 1);
if(rr==NULL || iuser==NULL)
return;
if(rr->layers.first==NULL) {
uiDefBut(block, LABEL, 0, "No Layers in Render Result,", 10, 107, 300, 20, NULL, 1, 0, 0, 0, "");
uiItemL(row, "No Layers in Render Result.", 0);
return;
}
uiBlockBeginAlign(block);
/* decrease, increase arrows */
but= uiDefIconBut(block, BUT, imagechanged, ICON_TRIA_LEFT, 10,107,17,20, NULL, 0, 0, 0, 0, "Previous Layer");
but= uiDefIconBut(block, BUT, 0, ICON_TRIA_LEFT, 0,0,17,20, NULL, 0, 0, 0, 0, "Previous Layer");
uiButSetFunc(but, image_multi_declay_cb, rr, iuser);
but= uiDefIconBut(block, BUT, imagechanged, ICON_TRIA_RIGHT, 27,107,18,20, NULL, 0, 0, 0, 0, "Next Layer");
but= uiDefIconBut(block, BUT, 0, ICON_TRIA_RIGHT, 0,0,18,20, NULL, 0, 0, 0, 0, "Next Layer");
uiButSetFunc(but, image_multi_inclay_cb, rr, iuser);
uiblock_layer_pass_buttons(block, rr, iuser, imagechanged, 45, 107, 230);
uiblock_layer_pass_buttons(row, rr, iuser, 230);
/* decrease, increase arrows */
but= uiDefIconBut(block, BUT, imagechanged, ICON_TRIA_LEFT, 275,107,17,20, NULL, 0, 0, 0, 0, "Previous Pass");
but= uiDefIconBut(block, BUT, 0, ICON_TRIA_LEFT, 0,0,17,20, NULL, 0, 0, 0, 0, "Previous Pass");
uiButSetFunc(but, image_multi_decpass_cb, rr, iuser);
but= uiDefIconBut(block, BUT, imagechanged, ICON_TRIA_RIGHT, 292,107,18,20, NULL, 0, 0, 0, 0, "Next Pass");
but= uiDefIconBut(block, BUT, 0, ICON_TRIA_RIGHT, 0,0,18,20, NULL, 0, 0, 0, 0, "Next Pass");
uiButSetFunc(but, image_multi_incpass_cb, rr, iuser);
uiBlockEndAlign(block);
}
// XXX HACK!
static int packdummy=0;
// static int packdummy=0;
/* The general Image panel with the loadsa callbacks! */
void ED_image_uiblock_panel(const bContext *C, uiBlock *block, Image **ima_pp, ImageUser *iuser,
short redraw, short imagechanged)
typedef struct RNAUpdateCb {
PointerRNA ptr;
PropertyRNA *prop;
ImageUser *iuser;
} RNAUpdateCb;
static void rna_update_cb(bContext *C, void *arg_cb, void *arg_unused)
{
RNAUpdateCb *cb= (RNAUpdateCb*)arg_cb;
/* ideally this would be done by RNA itself, but there we have
no image user available, so we just update this flag here */
cb->iuser->ok= 1;
/* we call update here on the pointer property, this way the
owner of the image pointer can still define it's own update
and notifier */
RNA_property_update(C, &cb->ptr, cb->prop);
}
void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, PointerRNA *userptr, int compact)
{
PropertyRNA *prop;
PointerRNA imaptr;
RNAUpdateCb *cb;
Image *ima;
ImageUser *iuser;
ImBuf *ibuf;
Scene *scene= CTX_data_scene(C);
SpaceImage *sima= CTX_wm_space_image(C);
Image *ima= *ima_pp;
uiLayout *row, *split, *col;
uiBlock *block;
uiBut *but;
char str[128], *strp;
char str[128];
if(!ptr->data)
return;
/* different stuff when we show viewer */
if(ima && ima->source==IMA_SRC_VIEWER) {
ImBuf *ibuf= BKE_image_get_ibuf(ima, iuser);
image_info(ima, ibuf, str);
uiDefBut(block, LABEL, 0, ima->id.name+2, 10, 180, 300, 20, NULL, 1, 0, 0, 0, "");
uiDefBut(block, LABEL, 0, str, 10, 160, 300, 20, NULL, 1, 0, 0, 0, "");
if(ima->type==IMA_TYPE_COMPOSITE) {
iuser= ntree_get_active_iuser(scene->nodetree);
if(iuser) {
uiBlockBeginAlign(block);
uiDefIconTextBut(block, BUT, B_SIMA_RECORD, ICON_REC, "Record", 10,120,100,20, 0, 0, 0, 0, 0, "");
uiDefIconTextBut(block, BUT, B_SIMA_PLAY, ICON_PLAY, "Play", 110,120,100,20, 0, 0, 0, 0, 0, "");
but= uiDefBut(block, BUT, B_NOP, "Free Cache", 210,120,100,20, 0, 0, 0, 0, 0, "");
uiButSetFunc(but, image_freecache_cb, ima, NULL);
if(iuser->frames)
sprintf(str, "(%d) Frames:", iuser->framenr);
else strcpy(str, "Frames:");
uiBlockBeginAlign(block);
uiDefButI(block, NUM, imagechanged, str, 10, 90,150, 20, &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Sets the number of images of a movie to use");
uiDefButI(block, NUM, imagechanged, "StartFr:", 160,90,150,20, &iuser->sfra, 1.0, MAXFRAMEF, 0, 0, "Sets the global starting frame of the movie");
}
}
else if(ima->type==IMA_TYPE_R_RESULT) {
/* browse layer/passes */
uiblock_layer_pass_arrow_buttons(block, RE_GetResult(RE_GetRender(scene->id.name)), iuser, imagechanged);
}
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
printf("uiTemplateImage: property not found: %s\n", propname);
return;
}
/* the main ima source types */
block= uiLayoutGetBlock(layout);
imaptr= RNA_property_pointer_get(ptr, prop);
ima= imaptr.data;
iuser= userptr->data;
cb= MEM_callocN(sizeof(RNAUpdateCb), "RNAUpdateCb");
cb->ptr= *ptr;
cb->prop= prop;
cb->iuser= iuser;
if(!compact)
uiTemplateID(layout, C, ptr, propname, "IMAGE_OT_new", "IMAGE_OT_open", NULL);
// XXX missing: reload, pack
if(ima) {
// XXX uiSetButLock(ima->id.lib!=NULL, ERROR_LIBDATA_MESSAGE);
uiBlockBeginAlign(block);
uiBlockSetFunc(block, image_src_change_cb, ima, iuser);
uiDefButS(block, ROW, imagechanged, "Still", 0, 180, 105, 20, &ima->source, 0.0, IMA_SRC_FILE, 0, 0, "Single Image file");
uiDefButS(block, ROW, imagechanged, "Movie", 105, 180, 105, 20, &ima->source, 0.0, IMA_SRC_MOVIE, 0, 0, "Movie file");
uiDefButS(block, ROW, imagechanged, "Sequence", 210, 180, 105, 20, &ima->source, 0.0, IMA_SRC_SEQUENCE, 0, 0, "Multiple Image files, as a sequence");
uiDefButS(block, ROW, imagechanged, "Generated", 315, 180, 105, 20, &ima->source, 0.0, IMA_SRC_GENERATED, 0, 0, "Generated Image");
uiBlockSetFunc(block, NULL, NULL, NULL);
}
else
uiDefBut(block, LABEL, 0, " ", 0, 180, 440, 20, 0, 0, 0, 0, 0, ""); /* for align in panel */
/* Browse */
IMAnames_to_pupstring(&strp, NULL, NULL, &(CTX_data_main(C)->image), NULL, &iuser->menunr);
uiBlockBeginAlign(block);
but= uiDefButS(block, MENU, imagechanged, strp, 0,155,40,20, &iuser->menunr, 0, 0, 0, 0, "Selects an existing Image or Movie");
uiButSetFunc(but, image_browse_cb, ima_pp, iuser);
MEM_freeN(strp);
/* name + options, or only load */
if(ima) {
int drawpack= (ima->source!=IMA_SRC_SEQUENCE && ima->source!=IMA_SRC_MOVIE && ima->ok);
uiBlockSetNFunc(block, rna_update_cb, MEM_dupallocN(cb), NULL);
but= uiDefBut(block, TEX, B_IDNAME, "IM:", 40, 155, 220, 20, ima->id.name+2, 0.0, 21.0, 0, 0, "Current Image Datablock name.");
uiButSetFunc(but, test_idbutton_cb, ima->id.name, NULL);
but= uiDefBut(block, BUT, imagechanged, "Reload", 260, 155, 70, 20, NULL, 0, 0, 0, 0, "Reloads Image or Movie");
uiButSetFunc(but, image_reload_cb, ima, iuser);
but= uiDefIconBut(block, BUT, imagechanged, ICON_X, 330, 155, 40, 20, 0, 0, 0, 0, 0, "Unlink Image block");
uiButSetFunc(but, image_unlink_cb, ima_pp, NULL);
sprintf(str, "%d", ima->id.us);
uiDefBut(block, BUT, B_NOP, str, 370, 155, 40, 20, 0, 0, 0, 0, 0, "Only displays number of users of Image block");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
but= uiDefIconBut(block, BUT, imagechanged, ICON_FILESEL, 0, 130, 40, 20, 0, 0, 0, 0, 0, "Open Fileselect to load new Image");
uiButSetFunc(but, image_load_fs_cb, ima_pp, iuser);
but= uiDefBut(block, TEX, imagechanged, "", 40,130, 340+(drawpack?0:20),20, ima->name, 0.0, 239.0, 0, 0, "Image/Movie file name, change to load new");
uiButSetFunc(but, image_load_cb, ima_pp, iuser);
uiBlockEndAlign(block);
if(drawpack) {
if (ima->packedfile) packdummy = 1;
else packdummy = 0;
but= uiDefIconButBitI(block, TOG, 1, redraw, ICON_PACKAGE, 380, 130, 40, 20, &packdummy, 0, 0, 0, 0, "Toggles Packed status of this Image");
uiButSetFunc(but, image_pack_cb, ima, iuser);
}
}
else {
but= uiDefBut(block, BUT, imagechanged, "Load", 33, 155, 200,20, NULL, 0, 0, 0, 0, "Load new Image of Movie");
uiButSetFunc(but, image_load_fs_cb, ima_pp, iuser);
}
uiBlockEndAlign(block);
if(ima) {
ImBuf *ibuf= BKE_image_get_ibuf(ima, iuser);
/* check for re-render, only buttons */
if(imagechanged==B_IMAGECHANGED) {
if(iuser->flag & IMA_ANIM_REFRESHED) {
iuser->flag &= ~IMA_ANIM_REFRESHED;
WM_event_add_notifier(C, NC_IMAGE, ima);
}
}
/* multilayer? */
if(ima->type==IMA_TYPE_MULTILAYER && ima->rr) {
uiblock_layer_pass_arrow_buttons(block, ima->rr, iuser, imagechanged);
}
else {
image_info(ima, ibuf, str);
uiDefBut(block, LABEL, 0, str, 10, 112, 300, 20, NULL, 1, 0, 0, 0, "");
}
/* exception, let's do because we only use this panel 3 times in blender... but not real good code! */
if( (paint_facesel_test(CTX_data_active_object(C))) && sima && &sima->iuser==iuser)
return;
/* left side default per-image options, right half the additional options */
/* fields */
but= uiDefButBitS(block, OPTION, IMA_FIELDS, imagechanged, "Fields", 0, 80, 200, 20, &ima->flag, 0, 0, 0, 0, "Click to enable use of fields in Image");
uiButSetFunc(but, image_field_test, ima, iuser);
uiDefButBitS(block, OPTION, IMA_STD_FIELD, B_NOP, "Odd", 0, 55, 200, 20, &ima->flag, 0, 0, 0, 0, "Standard Field Toggle");
if(ima->source == IMA_SRC_VIEWER) {
ibuf= BKE_image_get_ibuf(ima, iuser);
image_info(ima, ibuf, str);
uiItemL(layout, ima->id.name+2, 0);
uiItemL(layout, str, 0);
if(ima->type==IMA_TYPE_COMPOSITE) {
// XXX not working yet
#if 0
iuser= ntree_get_active_iuser(scene->nodetree);
if(iuser) {
uiBlockBeginAlign(block);
uiDefIconTextBut(block, BUT, B_SIMA_RECORD, ICON_REC, "Record", 10,120,100,20, 0, 0, 0, 0, 0, "");
uiDefIconTextBut(block, BUT, B_SIMA_PLAY, ICON_PLAY, "Play", 110,120,100,20, 0, 0, 0, 0, 0, "");
but= uiDefBut(block, BUT, B_NOP, "Free Cache", 210,120,100,20, 0, 0, 0, 0, 0, "");
uiButSetFunc(but, image_freecache_cb, ima, NULL);
if(iuser->frames)
sprintf(str, "(%d) Frames:", iuser->framenr);
else strcpy(str, "Frames:");
uiBlockBeginAlign(block);
uiDefButI(block, NUM, imagechanged, str, 10, 90,150, 20, &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Sets the number of images of a movie to use");
uiDefButI(block, NUM, imagechanged, "StartFr:", 160,90,150,20, &iuser->sfra, 1.0, MAXFRAMEF, 0, 0, "Sets the global starting frame of the movie");
}
#endif
}
else if(ima->type==IMA_TYPE_R_RESULT) {
/* browse layer/passes */
uiblock_layer_pass_arrow_buttons(layout, RE_GetResult(RE_GetRender(scene->id.name)), iuser);
}
}
else {
row= uiLayoutRow(layout, 0);
uiItemR(row, NULL, 0, &imaptr, "source", (compact)? 0: UI_ITEM_R_EXPAND);
if(ima->source != IMA_SRC_GENERATED) {
row= uiLayoutRow(layout, 0);
uiItemR(row, "", 0, &imaptr, "filename", 0);
//uiItemO(row, "Reload", 0, "image.reload");
}
// XXX what was this for?
#if 0
/* check for re-render, only buttons */
if(imagechanged==B_IMAGECHANGED) {
if(iuser->flag & IMA_ANIM_REFRESHED) {
iuser->flag &= ~IMA_ANIM_REFRESHED;
WM_event_add_notifier(C, NC_IMAGE, ima);
}
}
#endif
/* multilayer? */
if(ima->type==IMA_TYPE_MULTILAYER && ima->rr) {
uiblock_layer_pass_arrow_buttons(layout, ima->rr, iuser);
}
else if(ima->source != IMA_SRC_GENERATED) {
ibuf= BKE_image_get_ibuf(ima, iuser);
image_info(ima, ibuf, str);
uiItemL(layout, str, 0);
}
uiBlockSetFunc(block, image_reload_cb, ima, iuser);
uiDefButBitS(block, OPTION, IMA_ANTIALI, B_NOP, "Anti-Aliasing", 0, 5, 200, 20, &ima->flag, 0, 0, 0, 0, "Toggles Image anti-aliasing, only works with solid colors");
uiDefButBitS(block, OPTION, IMA_DO_PREMUL, imagechanged, "Premultiply", 0, -20, 200, 20, &ima->flag, 0, 0, 0, 0, "Toggles premultiplying alpha");
if( ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
sprintf(str, "(%d) Frames:", iuser->framenr);
//uiBlockBeginAlign(block);
uiBlockSetFunc(block, image_user_change, iuser, NULL);
if(ima->anim) {
uiBlockBeginAlign(block);
uiDefButI(block, NUM, imagechanged, str, 220, 80, 160, 20, &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Sets the number of images of a movie to use");
but= uiDefBut(block, BUT, redraw, "<", 380, 80, 40, 20, 0, 0, 0, 0, 0, "Copies number of frames in movie file to Frames: button");
uiButSetFunc(but, set_frames_cb, ima, iuser);
uiBlockEndAlign(block);
}
else
uiDefButI(block, NUM, imagechanged, str, 220, 80, 200, 20, &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Sets the number of images of a movie to use");
uiDefButI(block, NUM, imagechanged, "Start Frame:", 220, 55, 200, 20, &iuser->sfra, 1.0, MAXFRAMEF, 0, 0, "Sets the global starting frame of the movie");
uiDefButI(block, NUM, imagechanged, "Offset:", 220, 30, 200, 20, &iuser->offset, -MAXFRAMEF, MAXFRAMEF, 0, 0, "Offsets the number of the frame to use in the animation");
uiDefButS(block, NUM, imagechanged, "Fields:", 0, 30, 200, 20, &iuser->fie_ima, 1.0, 200.0, 0, 0, "The number of fields per rendered frame (2 fields is 1 image)");
uiDefButBitS(block, OPTION, IMA_ANIM_ALWAYS, B_NOP, "Auto Refresh", 220, 5, 200, 20, &iuser->flag, 0, 0, 0, 0, "Always refresh Image on frame changes");
if(ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
split= uiLayoutSplit(layout, 0);
uiDefButS(block, OPTION, imagechanged, "Cyclic", 220, -20, 200, 20, &iuser->cycl, 0.0, 1.0, 0, 0, "Cycle the images in the movie");
uiBlockSetFunc(block, NULL, iuser, NULL);
}
else if(ima->source==IMA_SRC_GENERATED) {
uiDefBut(block, LABEL, 0, "Size:", 220, 80, 200, 20, 0, 0, 0, 0, 0, "");
col= uiLayoutColumn(split, 0);
sprintf(str, "(%d) Frames:", iuser->framenr);
row= uiLayoutRow(col, 1);
uiItemR(col, str, 0, userptr, "frames", 0);
if(ima->anim) {
block= uiLayoutGetBlock(row);
but= uiDefBut(block, BUT, 0, "<", 0, 0, UI_UNIT_X*2, UI_UNIT_Y, 0, 0, 0, 0, 0, "Set the number of frames from the movie or sequence.");
uiButSetFunc(but, set_frames_cb, ima, iuser);
}
uiBlockBeginAlign(block);
uiBlockSetFunc(block, image_generated_change_cb, ima, iuser);
uiDefButS(block, NUM, imagechanged, "X:", 220, 55,200,20, &ima->gen_x, 1.0, 5000.0, 0, 0, "Image size x");
uiDefButS(block, NUM, imagechanged, "Y:", 220, 35,200,20, &ima->gen_y, 1.0, 5000.0, 0, 0, "Image size y");
uiBlockEndAlign(block);
uiDefButS(block, OPTION, imagechanged, "UV Test grid", 220,10,200,20, &ima->gen_type, 0.0, 1.0, 0, 0, "");
uiBlockSetFunc(block, NULL, NULL, NULL);
}
}
uiBlockEndAlign(block);
}
uiItemR(col, "Start", 0, userptr, "start_frame", 0);
uiItemR(col, NULL, 0, userptr, "offset", 0);
col= uiLayoutColumn(split, 0);
uiItemR(col, "Fields", 0, userptr, "fields_per_frame", 0);
uiItemR(col, NULL, 0, userptr, "auto_refresh", 0);
uiItemR(col, NULL, 0, userptr, "cyclic", 0);
}
else if(ima->source==IMA_SRC_GENERATED) {
split= uiLayoutSplit(layout, 0);
col= uiLayoutColumn(split, 1);
uiItemR(col, "X", 0, &imaptr, "generated_width", 0);
uiItemR(col, "Y", 0, &imaptr, "generated_height", 0);
col= uiLayoutColumn(split, 0);
uiItemR(col, NULL, 0, &imaptr, "generated_type", UI_ITEM_R_EXPAND);
}
if(ima->source != IMA_SRC_GENERATED) {
uiItemS(layout);
split= uiLayoutSplit(layout, 0);
col= uiLayoutColumn(split, 0);
uiItemR(col, NULL, 0, &imaptr, "fields", 0);
row= uiLayoutRow(col, 0);
uiItemR(row, "Odd", 0, &imaptr, "odd_fields", 0);
uiLayoutSetActive(row, RNA_boolean_get(&imaptr, "fields"));
col= uiLayoutColumn(split, 0);
uiItemR(col, NULL, 0, &imaptr, "antialias", 0);
uiItemR(col, NULL, 0, &imaptr, "premultiply", 0);
}
}
uiBlockSetNFunc(block, NULL, NULL, NULL);
}
MEM_freeN(cb);
}
void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser *iuser)
{
uiBlock *block= uiLayoutFreeBlock(layout);
Scene *scene= CTX_data_scene(C);
RenderResult *rr;
@ -1389,55 +1080,46 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser
if(ima && iuser) {
rr= BKE_image_get_renderresult(scene, ima);
if(rr) {
uiBlockBeginAlign(block);
uiblock_layer_pass_buttons(block, rr, iuser, 0, 0, 0, 160);
uiBlockEndAlign(block);
}
if(rr)
uiblock_layer_pass_buttons(layout, rr, iuser, 160);
}
}
static void image_panel_properties(const bContext *C, Panel *pa)
static int image_panel_uv_poll(const bContext *C, PanelType *pt)
{
SpaceImage *sima= CTX_wm_space_image(C);
Object *obedit= CTX_data_edit_object(C);
return ED_uvedit_test(obedit);
}
static void image_panel_uv(const bContext *C, Panel *pa)
{
ARegion *ar= CTX_wm_region(C);
uiBlock *block;
block= uiLayoutFreeBlock(pa->layout);
uiBlockSetHandleFunc(block, do_image_panel_events, NULL);
/* note, it draws no bottom half in facemode, for vertex buttons */
ED_image_uiblock_panel(C, block, &sima->image, &sima->iuser, B_REDR, B_REDR);
image_editvertex_buts(C, block);
image_editcursor_buts(C, &ar->v2d, block);
}
void image_buttons_register(ARegionType *art)
{
PanelType *pt;
pt= MEM_callocN(sizeof(PanelType), "spacetype image panel properties");
strcpy(pt->idname, "IMAGE_PT_properties");
strcpy(pt->label, "Image Properties");
pt->draw= image_panel_properties;
BLI_addtail(&art->paneltypes, pt);
pt= MEM_callocN(sizeof(PanelType), "spacetype image panel paint");
strcpy(pt->idname, "IMAGE_PT_paint");
strcpy(pt->label, "Paint");
pt->draw= image_panel_paint;
pt->poll= image_panel_paint_poll;
BLI_addtail(&art->paneltypes, pt);
pt= MEM_callocN(sizeof(PanelType), "spacetype image panel paint color");
strcpy(pt->idname, "IMAGE_PT_paint_color");
strcpy(pt->label, "Paint Color");
pt->draw= image_panel_paintcolor;
pt->poll= image_panel_paint_poll;
pt= MEM_callocN(sizeof(PanelType), "spacetype image panel uv");
strcpy(pt->idname, "IMAGE_PT_uv");
strcpy(pt->label, "UV");
pt->draw= image_panel_uv;
pt->poll= image_panel_uv_poll;
BLI_addtail(&art->paneltypes, pt);
pt= MEM_callocN(sizeof(PanelType), "spacetype image panel curves");
strcpy(pt->idname, "IMAGE_PT_curves");
strcpy(pt->label, "Curves");
pt->draw= image_panel_curves;
pt->poll= image_panel_poll;
pt->flag |= PNL_DEFAULT_CLOSED;
BLI_addtail(&art->paneltypes, pt);
pt= MEM_callocN(sizeof(PanelType), "spacetype image panel gpencil");

@ -628,9 +628,14 @@ static int open_exec(bContext *C, wmOperator *op)
if(!ima)
return OPERATOR_CANCELLED;
/* already set later */
ima->id.us--;
BKE_image_signal(ima, &sima->iuser, IMA_SIGNAL_RELOAD);
ED_space_image_set(C, sima, scene, obedit, ima);
// XXX other users?
BKE_image_signal(ima, (sima)? &sima->iuser: NULL, IMA_SIGNAL_RELOAD);
if(sima)
ED_space_image_set(C, sima, scene, obedit, ima);
return OPERATOR_FINISHED;
}
@ -651,13 +656,12 @@ static int open_invoke(bContext *C, wmOperator *op, wmEvent *event)
void IMAGE_OT_open(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Open Image";
ot->name= "Open";
ot->idname= "IMAGE_OT_open";
/* api callbacks */
ot->exec= open_exec;
ot->invoke= open_invoke;
ot->poll= ED_operator_image_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@ -1051,8 +1055,12 @@ static int new_exec(bContext *C, wmOperator *op)
color[3]= RNA_float_get(op->ptr, "alpha");
ima = BKE_add_image_size(width, height, name, floatbuf, uvtestgrid, color);
BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE);
ED_space_image_set(C, sima, scene, obedit, ima);
ima->id.us--; /* already set later */
if(sima) { // XXX other users?
BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE);
ED_space_image_set(C, sima, scene, obedit, ima);
}
return OPERATOR_FINISHED;
}
@ -1066,7 +1074,6 @@ void IMAGE_OT_new(wmOperatorType *ot)
/* api callbacks */
ot->exec= new_exec;
ot->invoke= WM_operator_props_popup;
ot->poll= ED_operator_image_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;

@ -77,7 +77,7 @@ int ED_uvedit_test(Object *obedit)
EditMesh *em;
int ret;
if(obedit->type != OB_MESH)
if(!obedit || obedit->type != OB_MESH)
return 0;
em = BKE_mesh_get_editmesh(obedit->data);

@ -216,13 +216,15 @@ static void rna_def_curvemapping(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "CurveMap");
RNA_def_property_ui_text(prop, "Curves", "");
prop= RNA_def_property(srna, "black_level", PROP_FLOAT, PROP_COLOR);
prop= RNA_def_property(srna, "black_level", PROP_FLOAT, PROP_RGB);
RNA_def_property_float_sdna(prop, NULL, "black");
RNA_def_property_range(prop, -1000.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Black Level", "For RGB curves, the color that black is mapped to");
RNA_def_property_float_funcs(prop, NULL, "rna_CurveMapping_black_level_set", NULL);
prop= RNA_def_property(srna, "white_level", PROP_FLOAT, PROP_COLOR);
prop= RNA_def_property(srna, "white_level", PROP_FLOAT, PROP_RGB);
RNA_def_property_float_sdna(prop, NULL, "white");
RNA_def_property_range(prop, -1000.0f, 1000.0f);
RNA_def_property_ui_text(prop, "White Level", "For RGB curves, the color that white is mapped to");
RNA_def_property_float_funcs(prop, NULL, "rna_CurveMapping_white_level_set", NULL);
}

@ -37,6 +37,14 @@
#include "WM_types.h"
static EnumPropertyItem image_source_items[]= {
{IMA_SRC_FILE, "FILE", 0, "File", "Single image file"},
{IMA_SRC_SEQUENCE, "SEQUENCE", 0, "Sequence", "Multiple image files, as a sequence"},
{IMA_SRC_MOVIE, "MOVIE", 0, "Movie", "Movie file"},
{IMA_SRC_GENERATED, "GENERATED", 0, "Generated", "Generated image"},
{IMA_SRC_VIEWER, "VIEWER", 0, "Viewer", "Compositing node viewer"},
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
#include "IMB_imbuf_types.h"
@ -66,6 +74,76 @@ static int rna_Image_dirty_get(PointerRNA *ptr)
return 0;
}
static void rna_Image_source_update(bContext *C, PointerRNA *ptr)
{
Image *ima= ptr->id.data;
BKE_image_signal(ima, NULL, IMA_SIGNAL_SRC_CHANGE);
}
static void rna_Image_fields_update(bContext *C, PointerRNA *ptr)
{
Image *ima= ptr->id.data;
ImBuf *ibuf;
ibuf= BKE_image_get_ibuf(ima, NULL);
if(ibuf) {
short nr= 0;
if(!(ima->flag & IMA_FIELDS) && (ibuf->flags & IB_fields)) nr= 1;
if((ima->flag & IMA_FIELDS) && !(ibuf->flags & IB_fields)) nr= 1;
if(nr)
BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE);
}
}
static void rna_Image_reload_update(bContext *C, PointerRNA *ptr)
{
Image *ima= ptr->id.data;
BKE_image_signal(ima, NULL, IMA_SIGNAL_RELOAD);
printf("reload %p\n", ima);
}
static void rna_Image_generated_update(bContext *C, PointerRNA *ptr)
{
Image *ima= ptr->id.data;
BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE);
}
static void rna_ImageUser_update(bContext *C, PointerRNA *ptr)
{
Scene *scene= CTX_data_scene(C);
ImageUser *iuser= ptr->data;
BKE_image_user_calc_imanr(iuser, scene->r.cfra, 0);
}
static EnumPropertyItem *rna_Image_source_itemf(bContext *C, PointerRNA *ptr, int *free)
{
Image *ima= (Image*)ptr->data;
EnumPropertyItem *item= NULL;
int totitem= 0;
if(C==NULL) /* needed for doc generation */
return image_source_items;
if(ima->source == IMA_SRC_VIEWER) {
RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_VIEWER);
}
else {
RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_FILE);
RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_SEQUENCE);
RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_MOVIE);
RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_GENERATED);
}
RNA_enum_item_end(&item, &totitem);
*free= 1;
return item;
}
#else
static void rna_def_imageuser(BlenderRNA *brna)
@ -79,29 +157,35 @@ static void rna_def_imageuser(BlenderRNA *brna)
prop= RNA_def_property(srna, "auto_refresh", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_ANIM_ALWAYS);
RNA_def_property_ui_text(prop, "Auto Refresh", "Always refresh image on frame changes.");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
/* animation */
prop= RNA_def_property(srna, "cyclic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "cycl", 0);
RNA_def_property_ui_text(prop, "Cyclic", "Cycle the images in the movie.");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
prop= RNA_def_property(srna, "frames", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 0, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Frames", "Sets the number of images of a movie to use.");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
prop= RNA_def_property(srna, "offset", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, -MAXFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Offset", "Offsets the number of the frame to use in the animation.");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "sfra");
RNA_def_property_range(prop, 1.0f, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Start Frame", "Sets the global starting frame of the movie.");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
prop= RNA_def_property(srna, "fields_per_frame", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "fie_ima");
RNA_def_property_range(prop, -MAXFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Fields per Frame", "The number of fields per rendered frame (2 fields is 1 image).");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
prop= RNA_def_property(srna, "multilayer_layer", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "layer");
@ -121,17 +205,10 @@ static void rna_def_image(BlenderRNA *brna)
static const EnumPropertyItem prop_type_items[]= {
{IMA_TYPE_IMAGE, "IMAGE", 0, "Image", ""},
{IMA_TYPE_MULTILAYER, "MULTILAYER", 0, "Multilayer", ""},
{IMA_TYPE_UV_TEST, "UVTEST", 0, "UV Test", ""},
{IMA_TYPE_R_RESULT, "RENDERRESULT", 0, "Render Result", ""},
{IMA_TYPE_UV_TEST, "UV_TEST", 0, "UV Test", ""},
{IMA_TYPE_R_RESULT, "RENDER_RESULT", 0, "Render Result", ""},
{IMA_TYPE_COMPOSITE, "COMPOSITING", 0, "Compositing", ""},
{0, NULL, 0, NULL, NULL}};
static const EnumPropertyItem prop_source_items[]= {
{IMA_SRC_FILE, "FILE", 0, "File", "Single image file"},
{IMA_SRC_SEQUENCE, "SEQUENCE", 0, "Sequence", "Multiple image files, as a sequence"},
{IMA_SRC_MOVIE, "MOVIE", 0, "Movie", "Movie file"},
{IMA_SRC_GENERATED, "GENERATED", 0, "Generated", "Generated image"},
{IMA_SRC_VIEWER, "VIEWER", 0, "Viewer", "Compositing node viewer"},
{0, NULL, 0, NULL, NULL}};
static const EnumPropertyItem prop_generated_type_items[]= {
{0, "BLANK", 0, "Blank", "Generate a blank image"},
{1, "UVTESTGRID", 0, "UV Test Grid", "Generated grid to test UV mappings"},
@ -147,19 +224,18 @@ static void rna_def_image(BlenderRNA *brna)
prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "name");
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* imagechanged */
RNA_def_property_ui_text(prop, "Filename", "Image/Movie file name.");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_reload_update");
prop= RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_source_items);
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* imagechanged */
RNA_def_property_enum_items(prop, image_source_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Image_source_itemf");
RNA_def_property_ui_text(prop, "Source", "Where the image comes from.");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_source_update");
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_type_items);
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* imagechanged */
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Type", "How to generate the image.");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
@ -171,12 +247,12 @@ static void rna_def_image(BlenderRNA *brna)
prop= RNA_def_property(srna, "fields", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_FIELDS);
RNA_def_property_ui_text(prop, "Fields", "Use fields of the image.");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_fields_update");
prop= RNA_def_property(srna, "odd_fields", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_STD_FIELD);
RNA_def_property_ui_text(prop, "Odd Fields", "Standard field toggle.");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_reload_update");
prop= RNA_def_property(srna, "antialias", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_ANTIALI);
@ -198,19 +274,19 @@ static void rna_def_image(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "gen_type");
RNA_def_property_enum_items(prop, prop_generated_type_items);
RNA_def_property_ui_text(prop, "Generated Type", "Generated image type.");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_generated_update");
prop= RNA_def_property(srna, "generated_width", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "gen_x");
RNA_def_property_range(prop, 1, 16384);
RNA_def_property_ui_text(prop, "Generated Width", "Generated image width.");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_generated_update");
prop= RNA_def_property(srna, "generated_height", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "gen_y");
RNA_def_property_range(prop, 1, 16384);
RNA_def_property_ui_text(prop, "Generated Height", "Generated image height.");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_generated_update");
/* realtime properties */
prop= RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE);

@ -212,6 +212,15 @@ static EnumPropertyItem *rna_SpaceImageEditor_draw_channels_itemf(bContext *C, P
return dc_rgb_items;
}
static void rna_SpaceImageEditor_curves_update(bContext *C, PointerRNA *ptr)
{
SpaceImage *sima= (SpaceImage*)ptr->data;
curvemapping_do_ibuf(sima->cumap, ED_space_image_buffer(sima));
WM_event_add_notifier(C, NC_IMAGE, sima->image);
}
/* Space Text Editor */
static void rna_SpaceTextEditor_word_wrap_set(PointerRNA *ptr, int value)
@ -809,7 +818,7 @@ static void rna_def_space_image(BlenderRNA *brna)
prop= RNA_def_property(srna, "curves", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "cumap");
RNA_def_property_ui_text(prop, "Curves", "Color curve mapping to use for displaying the image.");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_SpaceImageEditor_curves_update");
prop= RNA_def_property(srna, "image_pin", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "pin", 0);

@ -1073,6 +1073,11 @@ static void rna_def_texture_image(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Image", "");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "iuser");
RNA_def_property_ui_text(prop, "Image User", "Parameters defining which layer, pass and frame of the image is displayed.");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
/* filtering */
prop= RNA_def_property(srna, "filter", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "texfilter");
@ -1116,6 +1121,11 @@ static void rna_def_texture_environment_map(BlenderRNA *brna)
rna_def_environment_map_common(srna);
prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "iuser");
RNA_def_property_ui_text(prop, "Image User", "Parameters defining which layer, pass and frame of the image is displayed.");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "environment_map", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "env");
RNA_def_property_struct_type(prop, "EnvironmentMap");
@ -1641,9 +1651,7 @@ static void rna_def_texture(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Contrast", "");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
/* XXX: would be nicer to have this as a color selector?
but the values can go past [0,1]. */
prop= RNA_def_property(srna, "rgb_factor", PROP_FLOAT, PROP_NONE);
prop= RNA_def_property(srna, "rgb_factor", PROP_FLOAT, PROP_RGB);
RNA_def_property_float_sdna(prop, NULL, "rfac");
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, 0, 2);

@ -292,11 +292,18 @@ void RNA_api_ui_layout(StructRNA *srna)
parm= RNA_def_pointer(func, "image_user", "ImageUser", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
func= RNA_def_function(srna, "template_image", "uiTemplateImage");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
api_ui_item_rna_common(func);
parm= RNA_def_pointer(func, "image_user", "ImageUser", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
RNA_def_boolean(func, "compact", 0, "", "Use more compact layout.");
func= RNA_def_function(srna, "template_list", "uiTemplateList");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
api_ui_item_rna_common(func);
parm= RNA_def_pointer(func, "active_data", "AnyType", "", "Data from which to take property for the active element.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
parm= RNA_def_string(func, "active_property", "", 0, "", "Identifier of property in data, for the active element.");
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_int(func, "rows", 5, 0, INT_MAX, "", "Number of rows to display.", 0, INT_MAX);
@ -314,11 +321,6 @@ void RNA_api_ui_layout(StructRNA *srna)
func= RNA_def_function(srna, "view3d_select_faceselmenu", "uiTemplate_view3d_select_faceselmenu");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
func= RNA_def_function(srna, "template_texture_image", "uiTemplateTextureImage");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
parm= RNA_def_pointer(func, "texture", "Texture", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
}
#endif