forked from bartvdbraak/blender
Grease Pencil: UI (i.e. Panel) for Settings
Restored the UI for access to the GP layers. There are still a few minor bugs here: * Wrong icons on the toggles - even when they're enabled, they only show a single state * The ID-template doesn't seem to be showing up. Dunno what's going wrong there...
This commit is contained in:
parent
f46f6dc7ba
commit
8930a4fd33
@ -47,11 +47,11 @@
|
|||||||
#include "BKE_gpencil.h"
|
#include "BKE_gpencil.h"
|
||||||
#include "BKE_utildefines.h"
|
#include "BKE_utildefines.h"
|
||||||
|
|
||||||
#include "PIL_time.h"
|
|
||||||
|
|
||||||
#include "WM_api.h"
|
#include "WM_api.h"
|
||||||
#include "WM_types.h"
|
#include "WM_types.h"
|
||||||
|
|
||||||
|
#include "RNA_access.h"
|
||||||
|
|
||||||
#include "BIF_gl.h"
|
#include "BIF_gl.h"
|
||||||
#include "BIF_glutil.h"
|
#include "BIF_glutil.h"
|
||||||
|
|
||||||
@ -76,259 +76,195 @@
|
|||||||
/* ------- Callbacks ----------- */
|
/* ------- Callbacks ----------- */
|
||||||
/* These are just 'dummy wrappers' around gpencil api calls */
|
/* These are just 'dummy wrappers' around gpencil api calls */
|
||||||
|
|
||||||
#if 0
|
|
||||||
// XXX
|
|
||||||
/* make layer active one after being clicked on */
|
/* make layer active one after being clicked on */
|
||||||
void gp_ui_activelayer_cb (void *gpd, void *gpl)
|
void gp_ui_activelayer_cb (bContext *C, void *gpd, void *gpl)
|
||||||
{
|
{
|
||||||
gpencil_layer_setactive(gpd, gpl);
|
gpencil_layer_setactive(gpd, gpl);
|
||||||
|
|
||||||
scrarea_queue_winredraw(curarea);
|
WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX please work!
|
||||||
allqueue(REDRAWACTION, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* rename layer and set active */
|
/* delete 'active' layer */
|
||||||
void gp_ui_renamelayer_cb (void *gpd_arg, void *gpl_arg)
|
void gp_ui_dellayer_cb (bContext *C, void *gpd, void *gpl)
|
||||||
{
|
{
|
||||||
bGPdata *gpd= (bGPdata *)gpd_arg;
|
/* make sure the layer we want to remove is the active one */
|
||||||
bGPDlayer *gpl= (bGPDlayer *)gpl_arg;
|
|
||||||
|
|
||||||
BLI_uniquename(&gpd->layers, gpl, "GP_Layer", '.', offsetof(bGPDlayer, info[0]), 128);
|
|
||||||
gpencil_layer_setactive(gpd, gpl);
|
gpencil_layer_setactive(gpd, gpl);
|
||||||
|
|
||||||
scrarea_queue_winredraw(curarea);
|
|
||||||
allqueue(REDRAWACTION, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* add a new layer */
|
|
||||||
void gp_ui_addlayer_cb (void *gpd, void *dummy)
|
|
||||||
{
|
|
||||||
gpencil_layer_addnew(gpd);
|
|
||||||
|
|
||||||
scrarea_queue_winredraw(curarea);
|
|
||||||
allqueue(REDRAWACTION, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* delete active layer */
|
|
||||||
void gp_ui_dellayer_cb (void *gpd, void *dummy)
|
|
||||||
{
|
|
||||||
gpencil_layer_delactive(gpd);
|
gpencil_layer_delactive(gpd);
|
||||||
|
|
||||||
scrarea_queue_winredraw(curarea);
|
WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX please work!
|
||||||
allqueue(REDRAWACTION, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* delete last stroke of active layer */
|
|
||||||
void gp_ui_delstroke_cb (void *gpd, void *gpl)
|
|
||||||
{
|
|
||||||
bGPDframe *gpf= gpencil_layer_getframe(gpl, CFRA, 0);
|
|
||||||
|
|
||||||
if (gpf) {
|
|
||||||
if (gpf->framenum != CFRA) return;
|
|
||||||
|
|
||||||
gpencil_layer_setactive(gpd, gpl);
|
|
||||||
gpencil_frame_delete_laststroke(gpl, gpf);
|
|
||||||
|
|
||||||
scrarea_queue_winredraw(curarea);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* delete active frame of active layer */
|
|
||||||
void gp_ui_delframe_cb (void *gpd, void *gpl)
|
|
||||||
{
|
|
||||||
bGPDframe *gpf= gpencil_layer_getframe(gpl, CFRA, 0);
|
|
||||||
|
|
||||||
gpencil_layer_setactive(gpd, gpl);
|
|
||||||
gpencil_layer_delframe(gpl, gpf);
|
|
||||||
|
|
||||||
scrarea_queue_winredraw(curarea);
|
|
||||||
allqueue(REDRAWACTION, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* convert the active layer to geometry */
|
|
||||||
void gp_ui_convertlayer_cb (void *gpd, void *gpl)
|
|
||||||
{
|
|
||||||
gpencil_layer_setactive(gpd, gpl);
|
|
||||||
gpencil_convert_menu();
|
|
||||||
|
|
||||||
scrarea_queue_winredraw(curarea);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ------- Drawing Code ------- */
|
/* ------- Drawing Code ------- */
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* XXX */
|
|
||||||
/* draw the controls for a given layer */
|
/* draw the controls for a given layer */
|
||||||
static void gp_drawui_layer (uiBlock *block, bGPdata *gpd, bGPDlayer *gpl, short *xco, short *yco)
|
static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
|
||||||
{
|
{
|
||||||
|
uiLayout *box=NULL, *split=NULL;
|
||||||
|
uiLayout *col=NULL, *subcol=NULL;
|
||||||
|
uiLayout *row=NULL, *subrow=NULL;
|
||||||
|
uiBlock *block;
|
||||||
uiBut *but;
|
uiBut *but;
|
||||||
short active= (gpl->flag & GP_LAYER_ACTIVE);
|
PointerRNA ptr;
|
||||||
short width= 314;
|
|
||||||
short height;
|
/* make pointer to layer data */
|
||||||
int rb_col;
|
RNA_pointer_create((ID *)gpd, &RNA_GPencilLayer, gpl, &ptr);
|
||||||
|
|
||||||
/* unless button has own callback, it adds this callback to button */
|
/* unless button has own callback, it adds this callback to button */
|
||||||
|
block= uiLayoutGetBlock(layout);
|
||||||
uiBlockSetFunc(block, gp_ui_activelayer_cb, gpd, gpl);
|
uiBlockSetFunc(block, gp_ui_activelayer_cb, gpd, gpl);
|
||||||
|
|
||||||
/* draw header */
|
/* draw header ---------------------------------- */
|
||||||
{
|
/* get layout-row + UI-block for header */
|
||||||
|
box= uiLayoutBox(layout);
|
||||||
|
|
||||||
|
row= uiLayoutRow(box, 0);
|
||||||
|
block= uiLayoutGetBlock(row); // err...
|
||||||
|
|
||||||
uiBlockSetEmboss(block, UI_EMBOSSN);
|
uiBlockSetEmboss(block, UI_EMBOSSN);
|
||||||
|
|
||||||
/* rounded header */
|
/* left-align ............................... */
|
||||||
if (active) uiBlockSetCol(block, TH_BUT_ACTION);
|
subrow= uiLayoutRow(row, 1);
|
||||||
rb_col= (active)?-20:20;
|
uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_LEFT);
|
||||||
uiDefBut(block, ROUNDBOX, B_REDR, "", *xco-8, *yco-2, width, 24, NULL, 5.0, 0.0, 15.0, (float)(rb_col-20), "");
|
|
||||||
if (active) uiBlockSetCol(block, TH_AUTO);
|
|
||||||
|
|
||||||
/* lock toggle */
|
/* active */
|
||||||
uiDefIconButBitI(block, ICONTOG, GP_LAYER_LOCKED, B_REDR, ICON_UNLOCKED, *xco-7, *yco-1, 20, 20, &gpl->flag, 0.0, 0.0, 0, 0, "Layer cannot be modified");
|
uiItemR(subrow, "", ICON_RADIOBUT_OFF, &ptr, "active", UI_ITEM_R_TOGGLE); // XXX we need to set it to toggle to get icon
|
||||||
}
|
|
||||||
|
/* locked */
|
||||||
|
uiItemR(subrow, "", ICON_UNLOCKED, &ptr, "locked", UI_ITEM_R_TOGGLE); // XXX we need to set it to toggle to get icon
|
||||||
|
|
||||||
/* when layer is locked or hidden, only draw header */
|
/* when layer is locked or hidden, only draw header */
|
||||||
if (gpl->flag & (GP_LAYER_LOCKED|GP_LAYER_HIDE)) {
|
if (gpl->flag & (GP_LAYER_LOCKED|GP_LAYER_HIDE)) {
|
||||||
char name[256]; /* gpl->info is 128, but we need space for 'locked/hidden' as well */
|
char name[256]; /* gpl->info is 128, but we need space for 'locked/hidden' as well */
|
||||||
|
|
||||||
height= 0;
|
|
||||||
|
|
||||||
/* visibility button (only if hidden but not locked!) */
|
/* visibility button (only if hidden but not locked!) */
|
||||||
if ((gpl->flag & GP_LAYER_HIDE) && !(gpl->flag & GP_LAYER_LOCKED))
|
if ((gpl->flag & GP_LAYER_HIDE) && !(gpl->flag & GP_LAYER_LOCKED))
|
||||||
uiDefIconButBitI(block, ICONTOG, GP_LAYER_HIDE, B_REDR, ICON_RESTRICT_VIEW_OFF, *xco+12, *yco-1, 20, 20, &gpl->flag, 0.0, 0.0, 0, 0, "Visibility of layer");
|
uiItemR(subrow, "", ICON_RESTRICT_VIEW_OFF, &ptr, "hide", UI_ITEM_R_TOGGLE); // XXX we need to set it to toggle to get icon
|
||||||
|
|
||||||
/* name */
|
/* name */
|
||||||
if (gpl->flag & GP_LAYER_HIDE)
|
if (gpl->flag & GP_LAYER_HIDE)
|
||||||
sprintf(name, "%s (Hidden)", gpl->info);
|
sprintf(name, "%s (Hidden)", gpl->info);
|
||||||
else
|
else
|
||||||
sprintf(name, "%s (Locked)", gpl->info);
|
sprintf(name, "%s (Locked)", gpl->info);
|
||||||
uiDefBut(block, LABEL, 1, name, *xco+35, *yco, 240, 20, NULL, 0.0, 0.0, 0, 0, "Short description of what this layer is for (optional)");
|
uiItemL(subrow, name, 0);
|
||||||
|
|
||||||
/* delete button (only if hidden but not locked!) */
|
/* delete button (only if hidden but not locked!) */
|
||||||
if ((gpl->flag & GP_LAYER_HIDE) & !(gpl->flag & GP_LAYER_LOCKED)) {
|
if ((gpl->flag & GP_LAYER_HIDE) & !(gpl->flag & GP_LAYER_LOCKED)) {
|
||||||
but= uiDefIconBut(block, BUT, B_REDR, ICON_X, *xco+(width-30), *yco, 19, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Delete layer");
|
/* right-align ............................... */
|
||||||
uiButSetFunc(but, gp_ui_dellayer_cb, gpd, NULL);
|
subrow= uiLayoutRow(row, 1);
|
||||||
|
uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_RIGHT);
|
||||||
|
block= uiLayoutGetBlock(subrow); // XXX... err...
|
||||||
|
|
||||||
|
but= uiDefIconBut(block, BUT, 0, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0.0, 0.0, "Delete layer");
|
||||||
|
uiButSetFunc(but, gp_ui_dellayer_cb, gpd, gpl);
|
||||||
}
|
}
|
||||||
uiBlockSetEmboss(block, UI_EMBOSS);
|
uiBlockSetEmboss(block, UI_EMBOSS);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
height= 97;
|
/* draw rest of header -------------------------------- */
|
||||||
|
|
||||||
/* draw rest of header */
|
|
||||||
{
|
|
||||||
/* visibility button */
|
/* visibility button */
|
||||||
uiDefIconButBitI(block, ICONTOG, GP_LAYER_HIDE, B_REDR, ICON_RESTRICT_VIEW_OFF, *xco+12, *yco-1, 20, 20, &gpl->flag, 0.0, 0.0, 0, 0, "Visibility of layer");
|
uiItemR(subrow, "", ICON_RESTRICT_VIEW_OFF, &ptr, "hide", UI_ITEM_R_TOGGLE); // XXX we need to set it to toggle to get icon
|
||||||
|
|
||||||
uiBlockSetEmboss(block, UI_EMBOSS);
|
uiBlockSetEmboss(block, UI_EMBOSS);
|
||||||
|
|
||||||
/* name */
|
/* name */
|
||||||
but= uiDefButC(block, TEX, B_REDR, "Info:", *xco+36, *yco, 240, 19, gpl->info, 0, 127, 0, 0, "Short description of what this layer is for (optional)");
|
uiItemR(subrow, "", 0, &ptr, "info", 0);
|
||||||
uiButSetFunc(but, gp_ui_renamelayer_cb, gpd, gpl);
|
|
||||||
|
|
||||||
/* delete 'button' */
|
/* delete 'button' */
|
||||||
uiBlockSetEmboss(block, UI_EMBOSSN);
|
uiBlockSetEmboss(block, UI_EMBOSSN);
|
||||||
|
/* right-align ............................... */
|
||||||
|
subrow= uiLayoutRow(row, 1);
|
||||||
|
uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_RIGHT);
|
||||||
|
block= uiLayoutGetBlock(subrow); // XXX... err...
|
||||||
|
|
||||||
but= uiDefIconBut(block, BUT, B_REDR, ICON_X, *xco+(width-30), *yco, 19, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Delete layer");
|
but= uiDefIconBut(block, BUT, 0, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0.0, 0.0, "Delete layer");
|
||||||
uiButSetFunc(but, gp_ui_dellayer_cb, gpd, NULL);
|
uiButSetFunc(but, gp_ui_dellayer_cb, gpd, gpl);
|
||||||
|
|
||||||
uiBlockSetEmboss(block, UI_EMBOSS);
|
uiBlockSetEmboss(block, UI_EMBOSS);
|
||||||
}
|
|
||||||
|
|
||||||
/* draw backdrop */
|
|
||||||
if (active) uiBlockSetCol(block, TH_BUT_ACTION);
|
|
||||||
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-8, *yco-height, width, height-1, NULL, 5.0, 0.0, 12.0, (float)rb_col, "");
|
|
||||||
if (active) uiBlockSetCol(block, TH_AUTO);
|
|
||||||
|
|
||||||
/* draw settings */
|
/* new backdrop ----------------------------------- */
|
||||||
{
|
box= uiLayoutBox(layout);
|
||||||
|
split= uiLayoutSplit(box, 0.5f);
|
||||||
|
|
||||||
|
|
||||||
|
/* draw settings ---------------------------------- */
|
||||||
|
/* left column ..................... */
|
||||||
|
col= uiLayoutColumn(split, 0);
|
||||||
|
|
||||||
/* color */
|
/* color */
|
||||||
uiBlockBeginAlign(block);
|
subcol= uiLayoutColumn(col, 1);
|
||||||
uiDefButF(block, COL, B_REDR, "", *xco, *yco-26, 150, 19, gpl->color, 0, 0, 0, 0, "Color to use for all strokes on this Grease Pencil Layer");
|
uiItemR(subcol, "", 0, &ptr, "color", 0);
|
||||||
uiDefButF(block, NUMSLI, B_REDR, "Opacity: ", *xco,*yco-45,150,19, &gpl->color[3], 0.3f, 1.0f, 0, 0, "Visibility of stroke (0.3 to 1.0)");
|
uiItemR(subcol, NULL, 0, &ptr, "opacity", UI_ITEM_R_SLIDER);
|
||||||
uiBlockEndAlign(block);
|
|
||||||
|
|
||||||
/* stroke thickness */
|
/* stroke thickness */
|
||||||
uiDefButS(block, NUMSLI, B_REDR, "Thickness:", *xco, *yco-75, 150, 20, &gpl->thickness, 1, 10, 0, 0, "Thickness of strokes (in pixels)");
|
subcol= uiLayoutColumn(col, 1);
|
||||||
|
uiItemR(subcol, NULL, 0, &ptr, "line_thickness", UI_ITEM_R_SLIDER);
|
||||||
|
|
||||||
/* debugging options */
|
/* debugging options */
|
||||||
if (G.f & G_DEBUG) {
|
if (G.f & G_DEBUG) {
|
||||||
uiDefButBitI(block, TOG, GP_LAYER_DRAWDEBUG, B_REDR, "Show Points", *xco, *yco-95, 150, 20, &gpl->flag, 0, 0, 0, 0, "Show points which form the strokes");
|
// XXX this option hasn't been wrapped yet... since it's just debug
|
||||||
|
//subcol= uiLayoutColumn(col, 1);
|
||||||
|
// uiItemR(subrow, NULL, 0, &ptr, "show_points", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* right column ................... */
|
||||||
|
col= uiLayoutColumn(split, 0);
|
||||||
|
|
||||||
/* onion-skinning */
|
/* onion-skinning */
|
||||||
uiBlockBeginAlign(block);
|
subcol= uiLayoutColumn(col, 1);
|
||||||
uiDefButBitI(block, TOG, GP_LAYER_ONIONSKIN, B_REDR, "Onion-Skin", *xco+160, *yco-26, 140, 20, &gpl->flag, 0, 0, 0, 0, "Ghost frames on either side of frame");
|
uiItemR(subcol, "Onion Skinning", 0, &ptr, "use_onion_skinning", 0);
|
||||||
uiDefButS(block, NUMSLI, B_REDR, "GStep:", *xco+160, *yco-46, 140, 20, &gpl->gstep, 0, 120, 0, 0, "Max number of frames on either side of active frame to show (0 = just 'first' available sketch on either side)");
|
uiItemR(subcol, "GStep", 0, &ptr, "max_ghost_range", 0); // XXX shorter name here? (i.e. GStep)
|
||||||
uiBlockEndAlign(block);
|
|
||||||
|
|
||||||
/* options */
|
/* additional options... */
|
||||||
uiBlockBeginAlign(block);
|
// None at the moment...
|
||||||
if (curarea->spacetype == SPACE_VIEW3D) {
|
|
||||||
but= uiDefBut(block, BUT, B_REDR, "Convert to...", *xco+160, *yco-75, 140, 20, NULL, 0, 0, 0, 0, "Converts this layer's strokes to geometry (Hotkey = Alt-Shift-C)");
|
|
||||||
uiButSetFunc(but, gp_ui_convertlayer_cb, gpd, gpl);
|
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
but= uiDefBut(block, BUT, B_REDR, "Del Active Frame", *xco+160, *yco-75, 140, 20, NULL, 0, 0, 0, 0, "Erases the the active frame for this layer (Hotkey = Alt-XKEY/DEL)");
|
|
||||||
uiButSetFunc(but, gp_ui_delframe_cb, gpd, gpl);
|
|
||||||
}
|
|
||||||
|
|
||||||
but= uiDefBut(block, BUT, B_REDR, "Del Last Stroke", *xco+160, *yco-95, 140, 20, NULL, 0, 0, 0, 0, "Erases the last stroke from the active frame (Hotkey = Alt-XKEY/DEL)");
|
|
||||||
uiButSetFunc(but, gp_ui_delstroke_cb, gpd, gpl);
|
|
||||||
uiBlockEndAlign(block);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* adjust height for new to start */
|
|
||||||
(*yco) -= (height + 27);
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
/* Draw the contents for a grease-pencil panel. This assumes several things:
|
/* Draw the contents for a grease-pencil panel*/
|
||||||
* - that panel has been created, is 318 x 204. max yco is 225
|
static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, PointerRNA *ctx_ptr)
|
||||||
* - that a toggle for turning on/off gpencil drawing is 150 x 20, starting from (10,225)
|
|
||||||
* which is basically the top left-hand corner
|
|
||||||
* It will return the amount of extra space to extend the panel by
|
|
||||||
*/
|
|
||||||
short draw_gpencil_panel (uiBlock *block, bGPdata *gpd, ScrArea *sa)
|
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
uiBut *but;
|
|
||||||
bGPDlayer *gpl;
|
bGPDlayer *gpl;
|
||||||
short xco= 10, yco= 170;
|
uiLayout *col;
|
||||||
|
|
||||||
/* draw gpd settings first */
|
/* draw gpd settings first ------------------------------------- */
|
||||||
{
|
col= uiLayoutColumn(layout, 1);
|
||||||
/* add new layer buttons */
|
/* current Grease Pencil block */
|
||||||
but= uiDefBut(block, BUT, B_REDR, "Add New Layer", 10,205,150,20, 0, 0, 0, 0, 0, "Adds a new Grease Pencil Layer");
|
// TODO: show some info about who owns this?
|
||||||
uiButSetFunc(but, gp_ui_addlayer_cb, gpd, NULL);
|
// XXX: this template doesn't show up!
|
||||||
|
uiTemplateID(col, C, ctx_ptr, "grease_pencil", "GPENCIL_OT_data_new", "GPENCIL_OT_data_unlink");
|
||||||
|
|
||||||
|
/* add new layer button */
|
||||||
/* show override lmb-clicks button + painting lock */
|
uiItemO(col, NULL, 0, "GPENCIL_OT_layer_add");
|
||||||
uiBlockBeginAlign(block);
|
|
||||||
if ((gpd->flag & GP_DATA_EDITPAINT)==0) {
|
|
||||||
uiDefButBitI(block, TOG, GP_DATA_EDITPAINT, B_REDR, "Draw Mode", 170, 225, 130, 20, &gpd->flag, 0, 0, 0, 0, "Interpret click-drag as new strokes");
|
|
||||||
|
|
||||||
uiBlockSetCol(block, TH_BUT_SETTING);
|
|
||||||
uiDefIconButBitI(block, ICONTOG, GP_DATA_LMBPLOCK, B_REDR, ICON_UNLOCKED, 300, 225, 20, 20, &gpd->flag, 0.0, 0.0, 0, 0, "Painting cannot occur with Shift-LMB (when making selections)");
|
|
||||||
uiBlockSetCol(block, TH_AUTO);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
uiDefButBitI(block, TOG, GP_DATA_EDITPAINT, B_REDR, "Draw Mode", 170, 225, 150, 20, &gpd->flag, 0, 0, 0, 0, "Interpret click-drag as new strokes");
|
|
||||||
uiBlockEndAlign(block);
|
|
||||||
|
|
||||||
/* 'view align' button (naming depends on context) */
|
/* 'view align' button (naming depends on context) */
|
||||||
|
#if 0 // XXX for now, this is enabled by default anyways
|
||||||
if (sa->spacetype == SPACE_VIEW3D)
|
if (sa->spacetype == SPACE_VIEW3D)
|
||||||
uiDefButBitI(block, TOG, GP_DATA_VIEWALIGN, B_REDR, "Sketch in 3D", 170, 205, 150, 20, &gpd->flag, 0, 0, 0, 0, "New strokes are added in 3D-space");
|
uiDefButBitI(block, TOG, GP_DATA_VIEWALIGN, B_REDR, "Sketch in 3D", 170, 205, 150, 20, &gpd->flag, 0, 0, 0, 0, "New strokes are added in 3D-space");
|
||||||
else
|
else
|
||||||
uiDefButBitI(block, TOG, GP_DATA_VIEWALIGN, B_REDR, "Stick to View", 170, 205, 150, 20, &gpd->flag, 0, 0, 0, 0, "New strokes are added on 2d-canvas");
|
uiDefButBitI(block, TOG, GP_DATA_VIEWALIGN, B_REDR, "Stick to View", 170, 205, 150, 20, &gpd->flag, 0, 0, 0, 0, "New strokes are added on 2d-canvas");
|
||||||
}
|
|
||||||
|
|
||||||
/* draw for each layer */
|
|
||||||
for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
|
|
||||||
gp_drawui_layer(block, gpd, gpl, &xco, &yco);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return new height if necessary */
|
|
||||||
return (yco < 0) ? (204 - yco) : 204;
|
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
|
||||||
|
/* draw each layer --------------------------------------------- */
|
||||||
|
for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
|
||||||
|
col= uiLayoutColumn(layout, 1);
|
||||||
|
gp_drawui_layer(col, gpd, gpl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Standard panel to be included whereever Grease Pencil is used... */
|
||||||
|
void gpencil_panel_standard(const bContext *C, Panel *pa)
|
||||||
|
{
|
||||||
|
bGPdata **gpd_ptr = NULL;
|
||||||
|
PointerRNA ptr;
|
||||||
|
|
||||||
|
//if (v3d->flag2 & V3D_DISPGP)... etc.
|
||||||
|
|
||||||
|
/* get pointer to Grease Pencil Data */
|
||||||
|
gpd_ptr= gpencil_data_get_pointers((bContext *)C, &ptr);
|
||||||
|
|
||||||
|
if (gpd_ptr && *gpd_ptr)
|
||||||
|
draw_gpencil_panel((bContext *)C, pa->layout, *gpd_ptr, &ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************** */
|
/* ************************************************** */
|
||||||
|
@ -60,6 +60,7 @@
|
|||||||
#include "BKE_gpencil.h"
|
#include "BKE_gpencil.h"
|
||||||
#include "BKE_image.h"
|
#include "BKE_image.h"
|
||||||
#include "BKE_library.h"
|
#include "BKE_library.h"
|
||||||
|
#include "BKE_report.h"
|
||||||
#include "BKE_utildefines.h"
|
#include "BKE_utildefines.h"
|
||||||
|
|
||||||
#include "BIF_gl.h"
|
#include "BIF_gl.h"
|
||||||
@ -123,6 +124,9 @@ bGPdata **gpencil_data_get_pointers (bContext *C, PointerRNA *ptr)
|
|||||||
/* return the GP data for the active strips/image/etc. */
|
/* return the GP data for the active strips/image/etc. */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default: /* unsupported space */
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,6 +145,128 @@ bGPdata *gpencil_data_get_active (bContext *C)
|
|||||||
/* ************************************************ */
|
/* ************************************************ */
|
||||||
/* Panel Operators */
|
/* Panel Operators */
|
||||||
|
|
||||||
|
/* poll callback for adding data/layers - special */
|
||||||
|
static int gp_add_poll (bContext *C)
|
||||||
|
{
|
||||||
|
/* the base line we have is that we have somewhere to add Grease Pencil data */
|
||||||
|
return gpencil_data_get_pointers(C, NULL) != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ******************* Add New Data ************************ */
|
||||||
|
|
||||||
|
/* add new datablock - wrapper around API */
|
||||||
|
static int gp_data_add_exec (bContext *C, wmOperator *op)
|
||||||
|
{
|
||||||
|
bGPdata **gpd_ptr= gpencil_data_get_pointers(C, NULL);
|
||||||
|
|
||||||
|
if (gpd_ptr == NULL) {
|
||||||
|
BKE_report(op->reports, RPT_ERROR, "Nowhere for Grease Pencil data to go");
|
||||||
|
return OPERATOR_CANCELLED;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* just add new datablock now */
|
||||||
|
*gpd_ptr= gpencil_data_addnew("GPencil");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* notifiers */
|
||||||
|
WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX please work!
|
||||||
|
|
||||||
|
return OPERATOR_FINISHED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GPENCIL_OT_data_add (wmOperatorType *ot)
|
||||||
|
{
|
||||||
|
/* identifiers */
|
||||||
|
ot->name= "Grease Pencil Add New";
|
||||||
|
ot->idname= "GPENCIL_OT_data_add";
|
||||||
|
ot->description= "Add new Grease Pencil datablock.";
|
||||||
|
|
||||||
|
/* callbacks */
|
||||||
|
ot->exec= gp_data_add_exec;
|
||||||
|
ot->poll= gp_add_poll;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ******************* Unlink Data ************************ */
|
||||||
|
|
||||||
|
/* poll callback for adding data/layers - special */
|
||||||
|
static int gp_data_unlink_poll (bContext *C)
|
||||||
|
{
|
||||||
|
bGPdata **gpd_ptr= gpencil_data_get_pointers(C, NULL);
|
||||||
|
|
||||||
|
/* if we have access to some active data, make sure there's a datablock before enabling this */
|
||||||
|
return (gpd_ptr && *gpd_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* unlink datablock - wrapper around API */
|
||||||
|
static int gp_data_unlink_exec (bContext *C, wmOperator *op)
|
||||||
|
{
|
||||||
|
bGPdata **gpd_ptr= gpencil_data_get_pointers(C, NULL);
|
||||||
|
|
||||||
|
if (gpd_ptr == NULL) {
|
||||||
|
BKE_report(op->reports, RPT_ERROR, "Nowhere for Grease Pencil data to go");
|
||||||
|
return OPERATOR_CANCELLED;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* just unlink datablock now, decreasing its user count */
|
||||||
|
bGPdata *gpd= (*gpd_ptr);
|
||||||
|
|
||||||
|
gpd->id.us--;
|
||||||
|
*gpd_ptr= NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* notifiers */
|
||||||
|
WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX please work!
|
||||||
|
|
||||||
|
return OPERATOR_FINISHED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GPENCIL_OT_data_unlink (wmOperatorType *ot)
|
||||||
|
{
|
||||||
|
/* identifiers */
|
||||||
|
ot->name= "Grease Pencil Unlink";
|
||||||
|
ot->idname= "GPENCIL_OT_data_unlink";
|
||||||
|
ot->description= "Unlink active Grease Pencil datablock.";
|
||||||
|
|
||||||
|
/* callbacks */
|
||||||
|
ot->exec= gp_data_unlink_exec;
|
||||||
|
ot->poll= gp_data_unlink_poll;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ******************* Add New Layer ************************ */
|
||||||
|
|
||||||
|
/* add new layer - wrapper around API */
|
||||||
|
static int gp_layer_add_exec (bContext *C, wmOperator *op)
|
||||||
|
{
|
||||||
|
bGPdata **gpd_ptr= gpencil_data_get_pointers(C, NULL);
|
||||||
|
|
||||||
|
/* if there's no existing Grease-Pencil data there, add some */
|
||||||
|
if (gpd_ptr == NULL) {
|
||||||
|
BKE_report(op->reports, RPT_ERROR, "Nowhere for Grease Pencil data to go");
|
||||||
|
return OPERATOR_CANCELLED;
|
||||||
|
}
|
||||||
|
if (*gpd_ptr == NULL)
|
||||||
|
*gpd_ptr= gpencil_data_addnew("GPencil");
|
||||||
|
|
||||||
|
/* add new layer now */
|
||||||
|
gpencil_layer_addnew(*gpd_ptr);
|
||||||
|
|
||||||
|
/* notifiers */
|
||||||
|
WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX please work!
|
||||||
|
|
||||||
|
return OPERATOR_FINISHED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GPENCIL_OT_layer_add (wmOperatorType *ot)
|
||||||
|
{
|
||||||
|
/* identifiers */
|
||||||
|
ot->name= "Add New Layer";
|
||||||
|
ot->idname= "GPENCIL_OT_layer_add";
|
||||||
|
ot->description= "Add new Grease Pencil layer for the active Grease Pencil datablock.";
|
||||||
|
|
||||||
|
/* callbacks */
|
||||||
|
ot->exec= gp_layer_add_exec;
|
||||||
|
ot->poll= gp_add_poll;
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************ */
|
/* ************************************************ */
|
||||||
|
@ -40,6 +40,13 @@ struct wmOperatorType;
|
|||||||
|
|
||||||
void GPENCIL_OT_draw(struct wmOperatorType *ot);
|
void GPENCIL_OT_draw(struct wmOperatorType *ot);
|
||||||
|
|
||||||
|
/* buttons editing --- */
|
||||||
|
|
||||||
|
void GPENCIL_OT_data_add(struct wmOperatorType *ot);
|
||||||
|
void GPENCIL_OT_data_unlink(struct wmOperatorType *ot);
|
||||||
|
|
||||||
|
void GPENCIL_OT_layer_add(struct wmOperatorType *ot);
|
||||||
|
|
||||||
|
|
||||||
/******************************************************* */
|
/******************************************************* */
|
||||||
/* FILTERED ACTION DATA - TYPES ---> XXX DEPRECEATED OLD ANIM SYSTEM CODE! */
|
/* FILTERED ACTION DATA - TYPES ---> XXX DEPRECEATED OLD ANIM SYSTEM CODE! */
|
||||||
|
@ -66,10 +66,16 @@ void gpencil_common_keymap(wmWindowManager *wm, ListBase *keymap)
|
|||||||
void ED_operatortypes_gpencil (void)
|
void ED_operatortypes_gpencil (void)
|
||||||
{
|
{
|
||||||
/* Drawing ----------------------- */
|
/* Drawing ----------------------- */
|
||||||
|
|
||||||
WM_operatortype_append(GPENCIL_OT_draw);
|
WM_operatortype_append(GPENCIL_OT_draw);
|
||||||
|
|
||||||
/* Editing (Buttons) ------------ */
|
/* Editing (Buttons) ------------ */
|
||||||
|
|
||||||
|
WM_operatortype_append(GPENCIL_OT_data_add);
|
||||||
|
WM_operatortype_append(GPENCIL_OT_data_unlink);
|
||||||
|
|
||||||
|
WM_operatortype_append(GPENCIL_OT_layer_add);
|
||||||
|
|
||||||
/* Editing (Time) --------------- */
|
/* Editing (Time) --------------- */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -919,7 +919,7 @@ static void gp_paint_initstroke (tGPsdata *p, short paintmode)
|
|||||||
View3D *v3d= (View3D *)p->sa->spacedata.first;
|
View3D *v3d= (View3D *)p->sa->spacedata.first;
|
||||||
RegionView3D *rv3d= p->ar->regiondata;
|
RegionView3D *rv3d= p->ar->regiondata;
|
||||||
|
|
||||||
// TODO: this should only happen for scene... otherwise use object center!
|
// TODO: this should only happen for scene... otherwise apply correction for object center!
|
||||||
float *fp= give_cursor(p->scene, v3d);
|
float *fp= give_cursor(p->scene, v3d);
|
||||||
initgrabz(rv3d, fp[0], fp[1], fp[2]);
|
initgrabz(rv3d, fp[0], fp[1], fp[2]);
|
||||||
|
|
||||||
@ -1231,6 +1231,9 @@ static int gpencil_draw_exec (bContext *C, wmOperator *op)
|
|||||||
/* cleanup */
|
/* cleanup */
|
||||||
gpencil_draw_exit(C, op);
|
gpencil_draw_exit(C, op);
|
||||||
|
|
||||||
|
/* refreshes */
|
||||||
|
WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX please work!
|
||||||
|
|
||||||
/* done */
|
/* done */
|
||||||
return OPERATOR_FINISHED;
|
return OPERATOR_FINISHED;
|
||||||
}
|
}
|
||||||
|
@ -39,8 +39,7 @@ struct bGPdata;
|
|||||||
struct bGPDlayer;
|
struct bGPDlayer;
|
||||||
struct bGPDframe;
|
struct bGPDframe;
|
||||||
struct PointerRNA;
|
struct PointerRNA;
|
||||||
struct uiLayout;
|
struct Panel;
|
||||||
struct uiBlock;
|
|
||||||
struct ImBuf;
|
struct ImBuf;
|
||||||
struct wmWindowManager;
|
struct wmWindowManager;
|
||||||
|
|
||||||
@ -75,5 +74,7 @@ void draw_gpencil_2dview(struct bContext *C, short onlyv2d);
|
|||||||
void draw_gpencil_3dview(struct bContext *C, short only3d);
|
void draw_gpencil_3dview(struct bContext *C, short only3d);
|
||||||
void draw_gpencil_oglrender(struct bContext *C);
|
void draw_gpencil_oglrender(struct bContext *C);
|
||||||
|
|
||||||
|
void gpencil_panel_standard(const struct bContext *C, struct Panel *pa);
|
||||||
|
|
||||||
|
|
||||||
#endif /* ED_GPENCIL_H */
|
#endif /* ED_GPENCIL_H */
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include "DNA_armature_types.h"
|
#include "DNA_armature_types.h"
|
||||||
#include "DNA_curve_types.h"
|
#include "DNA_curve_types.h"
|
||||||
#include "DNA_camera_types.h"
|
#include "DNA_camera_types.h"
|
||||||
|
#include "DNA_gpencil_types.h"
|
||||||
#include "DNA_lamp_types.h"
|
#include "DNA_lamp_types.h"
|
||||||
#include "DNA_lattice_types.h"
|
#include "DNA_lattice_types.h"
|
||||||
#include "DNA_meta_types.h"
|
#include "DNA_meta_types.h"
|
||||||
@ -81,6 +82,7 @@
|
|||||||
#include "ED_armature.h"
|
#include "ED_armature.h"
|
||||||
#include "ED_curve.h"
|
#include "ED_curve.h"
|
||||||
#include "ED_image.h"
|
#include "ED_image.h"
|
||||||
|
#include "ED_gpencil.h"
|
||||||
#include "ED_keyframing.h"
|
#include "ED_keyframing.h"
|
||||||
#include "ED_mesh.h"
|
#include "ED_mesh.h"
|
||||||
#include "ED_object.h"
|
#include "ED_object.h"
|
||||||
@ -1199,33 +1201,6 @@ static void view3d_panel_preview(bContext *C, ARegion *ar, short cntrl) // VIEW3
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void view3d_panel_gpencil(const bContext *C, Panel *pa)
|
|
||||||
{
|
|
||||||
View3D *v3d= CTX_wm_view3d(C);
|
|
||||||
uiBlock *block;
|
|
||||||
|
|
||||||
block= uiLayoutFreeBlock(pa->layout);
|
|
||||||
|
|
||||||
/* allocate memory for gpd if drawing enabled (this must be done first or else we crash) */
|
|
||||||
if (v3d->flag2 & V3D_DISPGP) {
|
|
||||||
// if (v3d->gpd == NULL)
|
|
||||||
// XXX gpencil_data_setactive(ar, gpencil_data_addnew());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (v3d->flag2 & V3D_DISPGP) {
|
|
||||||
// XXX bGPdata *gpd= v3d->gpd;
|
|
||||||
|
|
||||||
/* draw button for showing gpencil settings and drawings */
|
|
||||||
uiDefButBitS(block, TOG, V3D_DISPGP, B_REDR, "Use Grease Pencil", 10, 225, 150, 20, &v3d->flag2, 0, 0, 0, 0, "Display freehand annotations overlay over this 3D View (draw using Shift-LMB)");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
uiDefButBitS(block, TOG, V3D_DISPGP, B_REDR, "Use Grease Pencil", 10, 225, 150, 20, &v3d->flag2, 0, 0, 0, 0, "Display freehand annotations overlay over this 3D View");
|
|
||||||
uiDefBut(block, LABEL, 1, " ", 160, 180, 150, 20, NULL, 0.0, 0.0, 0, 0, "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void delete_sketch_armature(bContext *C, void *arg1, void *arg2)
|
static void delete_sketch_armature(bContext *C, void *arg1, void *arg2)
|
||||||
{
|
{
|
||||||
BIF_deleteSketch(C);
|
BIF_deleteSketch(C);
|
||||||
@ -1416,6 +1391,12 @@ void view3d_buttons_register(ARegionType *art)
|
|||||||
strcpy(pt->label, "Transform");
|
strcpy(pt->label, "Transform");
|
||||||
pt->draw= view3d_panel_object;
|
pt->draw= view3d_panel_object;
|
||||||
BLI_addtail(&art->paneltypes, pt);
|
BLI_addtail(&art->paneltypes, pt);
|
||||||
|
|
||||||
|
pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel gpencil");
|
||||||
|
strcpy(pt->idname, "VIEW3D_PT_gpencil");
|
||||||
|
strcpy(pt->label, "Grease Pencil");
|
||||||
|
pt->draw= gpencil_panel_standard;
|
||||||
|
BLI_addtail(&art->paneltypes, pt);
|
||||||
/*
|
/*
|
||||||
pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel properties");
|
pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel properties");
|
||||||
strcpy(pt->idname, "VIEW3D_PT_properties");
|
strcpy(pt->idname, "VIEW3D_PT_properties");
|
||||||
|
Loading…
Reference in New Issue
Block a user