[Bf-blender-cvs] [6df2bed1e93] greasepencil-object: Annotations: First steps towards having working annotations again

Joshua Leung noreply at git.blender.org
Thu Jun 28 09:13:56 CEST 2018


Commit: 6df2bed1e9377278c09021397a5475d22945c644
Author: Joshua Leung
Date:   Thu Jun 28 04:14:20 2018 +1200
Branches: greasepencil-object
https://developer.blender.org/rB6df2bed1e9377278c09021397a5475d22945c644

Annotations: First steps towards having working annotations again

Copy-back (from 2.8) and split out "Annotations" drawing operator/rendering
code from the "GP Object" versions of the same code.

Notes:
* All "annotation" related things are now in the annotate_*.c files,
  while "drawgpencil.c" and "gpencil_paint.c" are for the GP Object only
  now. This will simplify maintenance of the two different usecases,
  as the GP Object versions are significantly more complicated and filled
  with extra cruft.

* The general "Grease Pencil" keymap (i.e. the one that allows DKEY+LMB-drag
  to draw) is now for annotation usage only. For GP Objects, you can add a
  blank GP Object, enter Draw Mode, and start drawing.

Code Changes:
* Removed all 2D drawing-code entrypoints from drawgpencil.c

* Cleaned up most of the annotate_paint.c and annotate_draw.c code
  to remove stuff that annotations won't use (e.g. brushes, palettes,
  fancy line effects, etc.)  As much as possible, these have been restored
  back to a pre 2.77 state - with the notable exception of per-layer
  Onion Skinning, for which the settings were removed already.

===================================================================

M	source/blender/editors/gpencil/CMakeLists.txt
A	source/blender/editors/gpencil/annotate_draw.c
A	source/blender/editors/gpencil/annotate_paint.c
M	source/blender/editors/gpencil/drawgpencil.c
M	source/blender/editors/gpencil/gpencil_intern.h
M	source/blender/editors/gpencil/gpencil_ops.c
M	source/blender/makesdna/DNA_scene_types.h

===================================================================

diff --git a/source/blender/editors/gpencil/CMakeLists.txt b/source/blender/editors/gpencil/CMakeLists.txt
index e4d206c2e48..af35be50f0c 100644
--- a/source/blender/editors/gpencil/CMakeLists.txt
+++ b/source/blender/editors/gpencil/CMakeLists.txt
@@ -39,6 +39,8 @@ set(INC_SYS
 )
 
 set(SRC
+	annotate_draw.c
+	annotate_paint.c
 	drawgpencil.c
 	editaction_gpencil.c
 	gpencil_add_monkey.c
diff --git a/source/blender/editors/gpencil/annotate_draw.c b/source/blender/editors/gpencil/annotate_draw.c
new file mode 100644
index 00000000000..32befc2c6f1
--- /dev/null
+++ b/source/blender/editors/gpencil/annotate_draw.c
@@ -0,0 +1,1121 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2008, Blender Foundation
+ * This is a new part of Blender
+ *
+ * Contributor(s): Joshua Leung, Antonio Vazquez
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/gpencil/annotate_draw.c
+ *  \ingroup edgpencil
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <math.h>
+#include <float.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_sys_types.h"
+
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+#include "BLI_polyfill_2d.h"
+
+#include "BLF_api.h"
+#include "BLT_translation.h"
+
+#include "DNA_gpencil_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_view3d_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_gpencil.h"
+
+#include "WM_api.h"
+
+#include "BIF_glutil.h"
+
+#include "GPU_immediate.h"
+#include "GPU_draw.h"
+
+#include "ED_gpencil.h"
+#include "ED_screen.h"
+#include "ED_view3d.h"
+#include "ED_space_api.h"
+
+#include "UI_interface_icons.h"
+#include "UI_resources.h"
+
+/* ************************************************** */
+/* GREASE PENCIL DRAWING */
+
+/* ----- General Defines ------ */
+/* flags for sflag */
+typedef enum eDrawStrokeFlags {
+	GP_DRAWDATA_NOSTATUS    = (1 << 0),   /* don't draw status info */
+	GP_DRAWDATA_ONLY3D      = (1 << 1),   /* only draw 3d-strokes */
+	GP_DRAWDATA_ONLYV2D     = (1 << 2),   /* only draw 'canvas' strokes */
+	GP_DRAWDATA_ONLYI2D     = (1 << 3),   /* only draw 'image' strokes */
+	GP_DRAWDATA_IEDITHACK   = (1 << 4),   /* special hack for drawing strokes in Image Editor (weird coordinates) */
+	GP_DRAWDATA_NO_XRAY     = (1 << 5),   /* don't draw xray in 3D view (which is default) */
+	GP_DRAWDATA_NO_ONIONS   = (1 << 6),	  /* no onionskins should be drawn (for animation playback) */
+	GP_DRAWDATA_VOLUMETRIC	= (1 << 7),   /* draw strokes as "volumetric" circular billboards */
+	GP_DRAWDATA_FILL        = (1 << 8),   /* fill insides/bounded-regions of strokes */
+	GP_DRAWDATA_HQ_FILL     = (1 << 9)    /* Use high quality fill */
+} eDrawStrokeFlags;
+
+
+
+/* thickness above which we should use special drawing */
+#if 0
+#define GP_DRAWTHICKNESS_SPECIAL    3
+#endif
+
+/* conversion utility (float --> normalized unsigned byte) */
+#define F2UB(x) (unsigned char)(255.0f * x)
+
+/* ----- Tool Buffer Drawing ------ */
+/* helper functions to set color of buffer point */
+// XXX: Remove these
+static void gp_set_tpoint_varying_color(const tGPspoint *pt, const float ink[4], unsigned attrib_id)
+{
+	float alpha = ink[3];
+	CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f);
+	immAttrib4ub(attrib_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha));
+}
+
+static void gp_set_point_uniform_color(const bGPDspoint *pt, const float ink[4])
+{
+	float alpha = ink[3];
+	CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f);
+	immUniformColor3fvAlpha(ink, alpha);
+}
+
+static void gp_set_point_varying_color(const bGPDspoint *pt, const float ink[4], unsigned attrib_id)
+{
+	float alpha = ink[3];
+	CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f);
+	immAttrib4ub(attrib_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha));
+}
+
+
+
+/* draw stroke defined in buffer (simple ogl lines/points for now, as dotted lines) */
+static void gp_draw_stroke_buffer(const tGPspoint *points, int totpoints, short thickness,
+                                  short dflag, short sflag, float ink[4])
+{
+	int draw_points = 0;
+
+	/* error checking */
+	if ((points == NULL) || (totpoints <= 0))
+		return;
+
+	/* check if buffer can be drawn */
+	if (dflag & (GP_DRAWDATA_ONLY3D | GP_DRAWDATA_ONLYV2D))
+		return;
+
+	if (sflag & GP_STROKE_ERASER) {
+		/* don't draw stroke at all! */
+		return;
+	}
+
+	Gwn_VertFormat *format = immVertexFormat();
+	unsigned int pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_I32, 2, GWN_FETCH_INT_TO_FLOAT);
+	unsigned int color = GWN_vertformat_attr_add(format, "color", GWN_COMP_U8, 4, GWN_FETCH_INT_TO_FLOAT_UNIT); // XXX: Just set once
+
+	const tGPspoint *pt = points;
+
+	if (totpoints == 1) {
+		/* if drawing a single point, draw it larger */
+		glPointSize((float)(thickness + 2) * points->pressure);
+		immBindBuiltinProgram(GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR);
+		immBegin(GWN_PRIM_POINTS, 1);
+		immAttrib4ub(color, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(ink[3]));
+		immVertex2iv(pos, &pt->x);
+	}
+	else {
+		float oldpressure = points[0].pressure;
+
+		/* draw stroke curve */
+		glLineWidth(max_ff(oldpressure * thickness, 1.0));
+		immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
+		immBeginAtMost(GWN_PRIM_LINE_STRIP, totpoints);
+
+		/* TODO: implement this with a geometry shader to draw one continuous tapered stroke */
+
+		for (int i = 0; i < totpoints; i++, pt++) {
+			/* if there was a significant pressure change, stop the curve, change the thickness of the stroke,
+			 * and continue drawing again (since line-width cannot change in middle of GL_LINE_STRIP)
+			 */
+			if (fabsf(pt->pressure - oldpressure) > 0.2f) {
+				/* need to have 2 points to avoid immEnd assert error */
+				if (draw_points < 2) {
+					immAttrib4ub(color, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(ink[3]));
+					immVertex2iv(pos, &(pt - 1)->x);
+				}
+
+				immEnd();
+				draw_points = 0;
+
+				glLineWidth(max_ff(pt->pressure * thickness, 1.0f));
+				immBeginAtMost(GWN_PRIM_LINE_STRIP, totpoints - i + 1);
+
+				/* need to roll-back one point to ensure that there are no gaps in the stroke */
+				if (i != 0) {
+					immAttrib4ub(color, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(ink[3]));
+					immVertex2iv(pos, &(pt - 1)->x);
+					++draw_points;
+				}
+
+				oldpressure = pt->pressure; /* reset our threshold */
+			}
+
+			/* now the point we want */
+			immAttrib4ub(color, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(ink[3]));
+			immVertex2iv(pos, &pt->x);
+			draw_points++;
+		}
+		/* need to have 2 points to avoid immEnd assert error */
+		if (draw_points < 2) {
+			immAttrib4ub(color, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(ink[3]));
+			immVertex2iv(pos, &(pt - 1)->x);
+		}
+	}
+
+	immEnd();
+	immUnbindProgram();
+}
+
+/* --------- 2D Stroke Drawing Helpers --------- */
+/* change in parameter list */
+static void gp_calc_2d_stroke_fxy(const float pt[3], short sflag, int offsx, int offsy, int winx, int winy, float r_co[2])
+{
+	if (sflag & GP_STROKE_2DSPACE) {
+		r_co[0] = pt[0];
+		r_co[1] = pt[1];
+	}
+	else if (sflag & GP_STROKE_2DIMAGE) {
+		const float x = (float)((pt[0] * winx) + offsx);
+		const float y = (float)((pt[1] * winy) + offsy);
+
+		r_co[0] = x;
+		r_co[1] = y;
+	}
+	else {
+		const float x = (float)(pt[0] / 100 * winx) + offsx;
+		const float y = (float)(pt[1] / 100 * winy) + offsy;
+
+		r_co[0] = x;
+		r_co[1] = y;
+	}
+}
+
+/* ----- Existing Strokes Drawing (3D and Point) ------ */
+
+/* draw a given stroke - just a single dot (only one point) */
+static void gp_draw_stroke_point(
+        const bGPDspoint *points, short thickness, short UNUSED(dflag), short sflag,
+        int offsx, int offsy, int winx, int winy, const float ink[4])
+{
+	const bGPDspoint *pt = points;
+
+	/* get final position using parent matrix */
+	float fpt[3];
+	copy_v3_v3(fpt, &pt->x);
+
+	Gwn_VertFormat *format = immVertexFormat();
+	unsigned int pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
+
+	if (sflag & GP_STROKE_3DSPACE) {
+		immBindBuiltinProgram(GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA);
+	}
+	else {
+		immBindBuiltinProgram(GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA);
+
+		/* get 2D coordinates of point */
+		float co[3] = { 0.0f };
+		gp_calc_2d_stroke_fxy(fpt, sflag, offsx, offsy, winx, winy, co);
+		copy_v3_v3(fpt, co);
+	}
+
+	/* set color */
+	immUniformColor3fvAlpha(ink, ink[3]);
+
+	/* set point thickness (since there's only one of these) */
+	immUniform1f("size", (float)(thickness + 2) * pt->pressure);
+
+	immBegin(GWN_PRIM_POINTS, 1);
+	immVertex3fv(pos, fpt);
+	immEnd();
+
+	immUnbindProgram();
+}
+
+/* draw a given stroke in 3d (i.e. in 3d-space), using simple ogl lines */
+static void gp_draw_stroke_3d(const bGPDspoint *points, int totpoints, short thickness, bool UNUSED(debug),
+                              short UNUSED(sflag), const float ink[4], bool cyclic)
+{
+	float curpressure = points[0].pressure;
+	float cyclic_fpt[3];
+	int draw_points = 0;
+
+	/* if cyclic needs one vertex more */
+	int cyclic_add = 0;
+	if (cyclic) {
+		++cyclic_add;
+	}
+
+
+	Gwn_VertFormat *format = immVertexFormat();
+	unsigned int pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
+	unsigned int color = GWN_vertformat_attr_add(format, "c

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list