grease pencil stroke depth option, rather then snapping to geometry you can draw over existing grease pencil lines. makes it easuer to draw 3D shapes with grease pencil.

This commit is contained in:
Campbell Barton
2010-01-01 16:46:27 +00:00
parent 11e529f4f7
commit 7cc72d5830
8 changed files with 45 additions and 10 deletions

View File

@@ -254,16 +254,18 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
}
/* draw gpd drawing settings first ------------------------------------- */
col= uiLayoutColumn(layout, 0);
col= uiLayoutColumn(layout, 1);
/* label */
uiItemL(col, "Drawing Settings:", 0);
/* 'stick to view' option */
//uiItemR(col, NULL, 0, &gpd_ptr, "draw_mode", 0);
row= uiLayoutRow(layout, 1);
row= uiLayoutRow(col, 1);
uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "VIEW");
uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "CURSOR");
uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "DEPTH");
row= uiLayoutRow(col, 1);
uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "SURFACE");
uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "STROKE");
}

View File

@@ -155,7 +155,7 @@ static int gpencil_draw_poll (bContext *C)
static int gpencil_project_check (tGPsdata *p)
{
bGPdata *gpd= p->gpd;
return ((gpd->sbuffer_sflag & GP_STROKE_3DSPACE) && (p->gpd->flag & GP_DATA_VIEWDEPTH)) ? 1:0;
return ((gpd->sbuffer_sflag & GP_STROKE_3DSPACE) && (p->gpd->flag & (GP_DATA_DEPTH_VIEW | GP_DATA_DEPTH_STROKE))) ? 1:0;
}
/* ******************************************* */
@@ -1165,7 +1165,7 @@ static void gpencil_draw_exit (bContext *C, wmOperator *op)
/* need to restore the original projection settings before packing up */
view3d_operator_needs_opengl(C);
view_autodist_init(p->scene, p->ar, v3d);
view_autodist_init(p->scene, p->ar, v3d, (p->gpd->flag & GP_DATA_DEPTH_STROKE) ? 1:0);
}
gp_paint_cleanup(p);

View File

@@ -127,7 +127,7 @@ unsigned int view3d_sample_backbuf(struct ViewContext *vc, int x, int y);
int view_autodist(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, short *mval, float mouse_worldloc[3]);
/* only draw so view_autodist_simple can be called many times after */
int view_autodist_init(struct Scene *scene, struct ARegion *ar, struct View3D *v3d);
int view_autodist_init(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, int mode);
int view_autodist_simple(struct ARegion *ar, short *mval, float mouse_worldloc[3], float *force_depth);
int view_autodist_depth(struct ARegion *ar, short *mval, float *depth);

View File

@@ -1643,6 +1643,29 @@ void view3d_update_depths(ARegion *ar, View3D *v3d)
}
}
void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d)
{
RegionView3D *rv3d= ar->regiondata;
Scene *sce;
setwinmatrixview3d(ar, v3d, NULL); /* 0= no pick rect */
setviewmatrixview3d(scene, v3d, rv3d); /* note: calls where_is_object for camera... */
mul_m4_m4m4(rv3d->persmat, rv3d->viewmat, rv3d->winmat);
invert_m4_m4(rv3d->persinv, rv3d->persmat);
invert_m4_m4(rv3d->viewinv, rv3d->viewmat);
glClear(GL_DEPTH_BUFFER_BIT);
wmLoadMatrix(rv3d->viewmat);
v3d->zbuf= TRUE;
glEnable(GL_DEPTH_TEST);
draw_gpencil_3dview_ext(scene, ar, 1);
return;
}
void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *))
{
RegionView3D *rv3d= ar->regiondata;

View File

@@ -2265,12 +2265,19 @@ int view_autodist(Scene *scene, ARegion *ar, View3D *v3d, short *mval, float mou
return 1;
}
int view_autodist_init(Scene *scene, ARegion *ar, View3D *v3d) //, float *autodist )
int view_autodist_init(Scene *scene, ARegion *ar, View3D *v3d, int mode) //, float *autodist )
{
RegionView3D *rv3d= ar->regiondata;
/* Get Z Depths, needed for perspective, nice for ortho */
draw_depth(scene, ar, v3d, NULL);
switch(mode) {
case 0:
draw_depth(scene, ar, v3d, NULL);
break;
case 1:
draw_depth_gpencil(scene, ar, v3d);
break;
}
/* force updating */
if (rv3d->depths) {

View File

@@ -116,6 +116,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
/* view3d_draw.c */
void view3d_main_area_draw(const struct bContext *C, struct ARegion *ar);
void draw_depth(Scene *scene, struct ARegion *ar, View3D *v3d, int (* func)(void *));
void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d);
void view3d_clr_clipping(void);
void view3d_set_clipping(RegionView3D *rv3d);
void add_view3d_after(View3D *v3d, Base *base, int type, int flag);

View File

@@ -147,6 +147,7 @@ typedef struct bGPdata {
/* new strokes are added in viewport space */
#define GP_DATA_VIEWALIGN (1<<4)
/* Project into the screens Z values */
#define GP_DATA_VIEWDEPTH (1<<5)
#define GP_DATA_DEPTH_VIEW (1<<5)
#define GP_DATA_DEPTH_STROKE (1<<6)
#endif /* DNA_GPENCIL_TYPES_H */

View File

@@ -223,7 +223,8 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
static EnumPropertyItem draw_mode_items[] = {
{GP_DATA_VIEWALIGN, "CURSOR", 0, "Cursor", ""},
{0, "VIEW", 0, "View", ""}, /* weired, GP_DATA_VIEWALIGN is inverted */
{GP_DATA_VIEWALIGN|GP_DATA_VIEWDEPTH, "DEPTH", 0, "Depth", ""},
{GP_DATA_VIEWALIGN|GP_DATA_DEPTH_VIEW, "SURFACE", 0, "Surface", ""},
{GP_DATA_VIEWALIGN|GP_DATA_DEPTH_STROKE, "STROKE", 0, "Stroke", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "GreasePencil", "ID");