[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25655] trunk/blender/source/blender: - grease pencil option to only use the endpoint depths.
Campbell Barton
ideasman42 at gmail.com
Fri Jan 1 18:48:49 CET 2010
Revision: 25655
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25655
Author: campbellbarton
Date: 2010-01-01 18:48:48 +0100 (Fri, 01 Jan 2010)
Log Message:
-----------
- grease pencil option to only use the endpoint depths. this makes drawing shapes in 3D easier since it wont stick to every depth the line passes through.
- use a 8x8 area when finding stroke depths since thin lines can get ignored if the point is not close enough to them.
Modified Paths:
--------------
trunk/blender/source/blender/editors/gpencil/gpencil_buttons.c
trunk/blender/source/blender/editors/gpencil/gpencil_paint.c
trunk/blender/source/blender/editors/include/ED_view3d.h
trunk/blender/source/blender/editors/space_view3d/view3d_edit.c
trunk/blender/source/blender/makesdna/DNA_gpencil_types.h
trunk/blender/source/blender/makesrna/intern/rna_gpencil.c
Modified: trunk/blender/source/blender/editors/gpencil/gpencil_buttons.c
===================================================================
--- trunk/blender/source/blender/editors/gpencil/gpencil_buttons.c 2010-01-01 16:46:27 UTC (rev 25654)
+++ trunk/blender/source/blender/editors/gpencil/gpencil_buttons.c 2010-01-01 17:48:48 UTC (rev 25655)
@@ -266,6 +266,10 @@
row= uiLayoutRow(col, 1);
uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "SURFACE");
uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "STROKE");
+
+ row= uiLayoutRow(col, 0);
+ uiLayoutSetActive(row, (gpd->flag & GP_DATA_DEPTH_STROKE) ? 1:0);
+ uiItemR(row, NULL, 0, &gpd_ptr, "use_stroke_endpoints", 0);
}
Modified: trunk/blender/source/blender/editors/gpencil/gpencil_paint.c
===================================================================
--- trunk/blender/source/blender/editors/gpencil/gpencil_paint.c 2010-01-01 16:46:27 UTC (rev 25654)
+++ trunk/blender/source/blender/editors/gpencil/gpencil_paint.c 2010-01-01 17:48:48 UTC (rev 25655)
@@ -218,7 +218,7 @@
/* in 3d-space - pt->x/y/z are 3 side-by-side floats */
if (gpd->sbuffer_sflag & GP_STROKE_3DSPACE) {
- if(gpencil_project_check(p) && (view_autodist_simple(p->ar, mval, out, depth))) {
+ if(gpencil_project_check(p) && (view_autodist_simple(p->ar, mval, out, 0, depth))) {
/* projecting onto 3D-Geometry
* - nothing more needs to be done here, since view_autodist_simple() has already done it
*/
@@ -458,6 +458,8 @@
bGPDspoint *pt;
tGPspoint *ptc;
int i, totelem;
+ /* since strokes are so fine, when using their depth we need a margin otherwise they might get missed */
+ int depth_margin = (p->gpd->flag & GP_DATA_DEPTH_STROKE) ? 4 : 0;
/* get total number of points to allocate space for
* - drawing straight-lines only requires the endpoints
@@ -525,7 +527,7 @@
for (i=0, ptc=gpd->sbuffer; i < gpd->sbuffer_size; i++, ptc++, pt++) {
mval[0]= ptc->x; mval[1]= ptc->y;
- if(view_autodist_depth(p->ar, mval, depth_arr+i) == 0)
+ if(view_autodist_depth(p->ar, mval, depth_margin, depth_arr+i) == 0)
interp_depth= TRUE;
else
found_depth= TRUE;
@@ -537,6 +539,26 @@
depth_arr[i] = 0.9999f;
}
else if(interp_depth) {
+ if(p->gpd->flag & GP_DATA_DEPTH_STROKE_ENDPOINTS) {
+ /* remove all info between the valid endpoints */
+ int first_valid = 0;
+ int last_valid = 0;
+
+ for (i=0; i < gpd->sbuffer_size; i++)
+ if(depth_arr[i] != FLT_MAX)
+ break;
+ first_valid= i;
+
+ for (i=gpd->sbuffer_size-1; i >= 0; i--)
+ if(depth_arr[i] != FLT_MAX)
+ break;
+ last_valid= i;
+
+ /* invalidate non-endpoints, so only blend between first and last */
+ for (i=first_valid+1; i < last_valid; i++)
+ depth_arr[i]= FLT_MAX;
+ }
+
interp_sparse_array(depth_arr, gpd->sbuffer_size, FLT_MAX);
}
}
Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h 2010-01-01 16:46:27 UTC (rev 25654)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h 2010-01-01 17:48:48 UTC (rev 25655)
@@ -128,8 +128,8 @@
/* 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 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);
+int view_autodist_simple(struct ARegion *ar, short *mval, float mouse_worldloc[3], int margin, float *force_depth);
+int view_autodist_depth(struct ARegion *ar, short *mval, int margin, float *depth);
/* select */
#define MAXPICKBUF 10000
Modified: trunk/blender/source/blender/editors/space_view3d/view3d_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_edit.c 2010-01-01 16:46:27 UTC (rev 25654)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_edit.c 2010-01-01 17:48:48 UTC (rev 25655)
@@ -1474,7 +1474,7 @@
/* ZBuffer depth vars */
bglMats mats;
- float depth, depth_close= MAXFLOAT;
+ float depth, depth_close= FLT_MAX;
int had_depth = 0;
double cent[2], p[3];
int xs, ys;
@@ -1531,7 +1531,7 @@
double p_corner[3];
/* no depths to use, we cant do anything! */
- if (depth_close==MAXFLOAT){
+ if (depth_close==FLT_MAX){
BKE_report(op->reports, RPT_ERROR, "Depth Too Large");
return OPERATOR_CANCELLED;
}
@@ -1559,7 +1559,7 @@
new_dist = rv3d->dist;
/* convert the drawn rectangle into 3d space */
- if (depth_close!=MAXFLOAT && gluUnProject(cent[0], cent[1], depth_close, mats.modelview, mats.projection, (GLint *)mats.viewport, &p[0], &p[1], &p[2])) {
+ if (depth_close!=FLT_MAX && gluUnProject(cent[0], cent[1], depth_close, mats.modelview, mats.projection, (GLint *)mats.viewport, &p[0], &p[1], &p[2])) {
new_ofs[0] = -p[0];
new_ofs[1] = -p[1];
new_ofs[2] = -p[2];
@@ -2197,23 +2197,67 @@
/* ************************* below the line! *********************** */
+static float view_autodist_depth_margin(ARegion *ar, short *mval, int margin)
+{
+ RegionView3D *rv3d= ar->regiondata;
+ float depth= FLT_MAX;
+
+ if(margin==0) {
+ if (mval[0] < 0) return 0;
+ if (mval[1] < 0) return 0;
+ if (mval[0] >= rv3d->depths->w) return 0;
+ if (mval[1] >= rv3d->depths->h) return 0;
+
+ /* Get Z Depths, needed for perspective, nice for ortho */
+ depth= rv3d->depths->depths[mval[1]*rv3d->depths->w+mval[0]];
+ if(depth >= rv3d->depths->depth_range[1] || depth <= rv3d->depths->depth_range[0]) {
+ depth= FLT_MAX;
+ }
+ }
+ else {
+ rcti rect;
+ float depth_close= FLT_MAX;
+ int xs, ys;
+
+ rect.xmax = mval[0] + margin;
+ rect.ymax = mval[1] + margin;
+
+ rect.xmin = mval[0] - margin;
+ rect.ymin = mval[1] - margin;
+
+ /* Constrain rect to depth bounds */
+ if (rect.xmin < 0) rect.xmin = 0;
+ if (rect.ymin < 0) rect.ymin = 0;
+ if (rect.xmax >= rv3d->depths->w) rect.xmax = rv3d->depths->w-1;
+ if (rect.ymax >= rv3d->depths->h) rect.ymax = rv3d->depths->h-1;
+
+ /* Find the closest Z pixel */
+ for (xs=rect.xmin; xs < rect.xmax; xs++) {
+ for (ys=rect.ymin; ys < rect.ymax; ys++) {
+ depth= rv3d->depths->depths[ys*rv3d->depths->w+xs];
+ if(depth < rv3d->depths->depth_range[1] && depth > rv3d->depths->depth_range[0]) {
+ if (depth_close > depth) {
+ depth_close = depth;
+ }
+ }
+ }
+ }
+
+ depth= depth_close;
+ }
+
+ return depth;
+}
+
/* XXX todo Zooms in on a border drawn by the user */
int view_autodist(Scene *scene, ARegion *ar, View3D *v3d, short *mval, float mouse_worldloc[3] ) //, float *autodist )
{
RegionView3D *rv3d= ar->regiondata;
bglMats mats; /* ZBuffer depth vars */
- rcti rect;
- float depth, depth_close= MAXFLOAT;
+ float depth_close= FLT_MAX;
int had_depth = 0;
double cent[2], p[3];
- int xs, ys;
- rect.xmax = mval[0] + 4;
- rect.ymax = mval[1] + 4;
-
- rect.xmin = mval[0] - 4;
- rect.ymin = mval[1] - 4;
-
/* Get Z Depths, needed for perspective, nice for ortho */
bgl_get_mats(&mats);
draw_depth(scene, ar, v3d, NULL);
@@ -2226,25 +2270,9 @@
view3d_update_depths(ar, v3d);
- /* Constrain rect to depth bounds */
- if (rect.xmin < 0) rect.xmin = 0;
- if (rect.ymin < 0) rect.ymin = 0;
- if (rect.xmax >= rv3d->depths->w) rect.xmax = rv3d->depths->w-1;
- if (rect.ymax >= rv3d->depths->h) rect.ymax = rv3d->depths->h-1;
+ depth_close= view_autodist_depth_margin(ar, mval, 4);
- /* Find the closest Z pixel */
- for (xs=rect.xmin; xs < rect.xmax; xs++) {
- for (ys=rect.ymin; ys < rect.ymax; ys++) {
- depth= rv3d->depths->depths[ys*rv3d->depths->w+xs];
- if(depth < rv3d->depths->depth_range[1] && depth > rv3d->depths->depth_range[0]) {
- if (depth_close > depth) {
- depth_close = depth;
- }
- }
- }
- }
-
- if (depth_close==MAXFLOAT)
+ if (depth_close==FLT_MAX)
return 0;
if (had_depth==0) {
@@ -2289,23 +2317,17 @@
}
// no 4x4 sampling, run view_autodist_init first
-int view_autodist_simple(ARegion *ar, short *mval, float mouse_worldloc[3], float *force_depth) //, float *autodist )
+int view_autodist_simple(ARegion *ar, short *mval, float mouse_worldloc[3], int margin, float *force_depth) //, float *autodist )
{
- RegionView3D *rv3d= ar->regiondata;
bglMats mats; /* ZBuffer depth vars, could cache? */
float depth;
double cent[2], p[3];
- if (mval[0] < 0) return 0;
- if (mval[1] < 0) return 0;
- if (mval[0] >= rv3d->depths->w) return 0;
- if (mval[1] >= rv3d->depths->h) return 0;
-
/* Get Z Depths, needed for perspective, nice for ortho */
if(force_depth)
depth= *force_depth;
else
- depth= rv3d->depths->depths[mval[1]*rv3d->depths->w+mval[0]];
+ depth= view_autodist_depth_margin(ar, mval, margin);
if (depth==FLT_MAX)
return 0;
@@ -2323,25 +2345,10 @@
return 1;
}
-int view_autodist_depth(struct ARegion *ar, short *mval, float *depth)
+int view_autodist_depth(struct ARegion *ar, short *mval, int margin, float *depth)
{
- RegionView3D *rv3d= ar->regiondata;
- *depth= FLT_MAX;
+ *depth= view_autodist_depth_margin(ar, mval, margin);
- if (mval[0] < 0) return 0;
- if (mval[1] < 0) return 0;
- if (mval[0] >= rv3d->depths->w) return 0;
- if (mval[1] >= rv3d->depths->h) return 0;
-
- /* Get Z Depths, needed for perspective, nice for ortho */
- *depth= rv3d->depths->depths[mval[1]*rv3d->depths->w+mval[0]];
-
- /* float error means we need to shave off some */
-
- if(*depth >= 1.0) {
- *depth= FLT_MAX;
- }
-
return (*depth==FLT_MAX) ? 0:1;
return 0;
}
Modified: trunk/blender/source/blender/makesdna/DNA_gpencil_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_gpencil_types.h 2010-01-01 16:46:27 UTC (rev 25654)
+++ trunk/blender/source/blender/makesdna/DNA_gpencil_types.h 2010-01-01 17:48:48 UTC (rev 25655)
@@ -150,4 +150,6 @@
#define GP_DATA_DEPTH_VIEW (1<<5)
#define GP_DATA_DEPTH_STROKE (1<<6)
+#define GP_DATA_DEPTH_STROKE_ENDPOINTS (1<<7)
+
#endif /* DNA_GPENCIL_TYPES_H */
Modified: trunk/blender/source/blender/makesrna/intern/rna_gpencil.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_gpencil.c 2010-01-01 16:46:27 UTC (rev 25654)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list