[Bf-blender-cvs] [0ff23fd6715] greasepencil-object: Merge branch 'blender2.8' into greasepencil-object

Campbell Barton noreply at git.blender.org
Fri Oct 20 03:46:06 CEST 2017


Commit: 0ff23fd671546c0b67910473c51a6113efb34b39
Author: Campbell Barton
Date:   Fri Oct 20 12:48:58 2017 +1100
Branches: greasepencil-object
https://developer.blender.org/rB0ff23fd671546c0b67910473c51a6113efb34b39

Merge branch 'blender2.8' into greasepencil-object

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



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

diff --cc source/blender/draw/engines/gpencil/gpencil_geom.c
index e9f07d9c274,00000000000..109b838153d
mode 100644,000000..100644
--- a/source/blender/draw/engines/gpencil/gpencil_geom.c
+++ b/source/blender/draw/engines/gpencil/gpencil_geom.c
@@@ -1,769 -1,0 +1,764 @@@
 +/*
 + * ***** 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): Antonio Vazquez
 + *
 + * ***** END GPL LICENSE BLOCK *****
 + */
 +
 +/** \file draw/engines/gpencil/gpencil_geom.c
 + *  \ingroup edgpencil
 + */
 +
 +
 +#include "BLI_polyfill2d.h"
 +#include "BLI_math_color.h"
 +
 +#include "DNA_gpencil_types.h"
 +#include "DNA_screen_types.h"
 +#include "DNA_view3d_types.h"
 +
 +#include "BKE_gpencil.h"
 +#include "BKE_action.h"
 +
 +#include "DRW_render.h"
 +
 +#include "GPU_immediate.h"
 +#include "GPU_draw.h"
 +
 +#include "ED_gpencil.h"
 +#include "ED_view3d.h"
 +
 +#include "UI_resources.h"
 +
 +#include "gpencil_engine.h"
 +
 +/* set stroke point to vbo */
 +static void gpencil_set_stroke_point(
 +        Gwn_VertBuf *vbo, float matrix[4][4], const bGPDspoint *pt, int idx,
 +        unsigned int pos_id, unsigned int color_id,
 +        unsigned int thickness_id, short thickness,
 +        const float ink[4])
 +{
 +	float viewfpt[3];
 +	
 +	float alpha = ink[3] * pt->strength;
 +	CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f);
 +	float col[4];
 +	ARRAY_SET_ITEMS(col, ink[0], ink[1], ink[2], alpha);
 +	GWN_vertbuf_attr_set(vbo, color_id, idx, col);
 +
 +	/* the thickness of the stroke must be affected by zoom, so a pixel scale is calculated */
 +	mul_v3_m4v3(viewfpt, matrix, &pt->x);
 +	float thick = max_ff(pt->pressure * thickness, 1.0f);
 +	GWN_vertbuf_attr_set(vbo, thickness_id, idx, &thick);
 +	
 +	GWN_vertbuf_attr_set(vbo, pos_id, idx, &pt->x);
 +}
 +
 +/* create batch geometry data for points stroke shader */
 +Gwn_Batch *DRW_gpencil_get_point_geom(bGPDstroke *gps, short thickness, const float ink[4])
 +{
 +	static Gwn_VertFormat format = { 0 };
 +	static unsigned int pos_id, color_id, size_id;
 +	if (format.attrib_ct == 0) {
 +		pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
 +		color_id = GWN_vertformat_attr_add(&format, "color", GWN_COMP_F32, 4, GWN_FETCH_FLOAT);
 +		size_id = GWN_vertformat_attr_add(&format, "thickness", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
 +	}
 +
 +	Gwn_VertBuf *vbo =  GWN_vertbuf_create_with_format(&format);
 +	GWN_vertbuf_data_alloc(vbo, gps->totpoints);
 +
 +	/* draw stroke curve */
 +	const bGPDspoint *pt = gps->points;
 +	int idx = 0;
 +	float alpha;
 +	float col[4];
 +
 +	for (int i = 0; i < gps->totpoints; i++, pt++) {
 +		/* set point */
 +		alpha = ink[3] * pt->strength;
 +		CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f);
 +		ARRAY_SET_ITEMS(col, ink[0], ink[1], ink[2], alpha);
 +
 +		float thick = max_ff(pt->pressure * thickness, 1.0f);
 +
 +		GWN_vertbuf_attr_set(vbo, color_id, idx, col);
 +		GWN_vertbuf_attr_set(vbo, size_id, idx, &thick);
 +		GWN_vertbuf_attr_set(vbo, pos_id, idx, &pt->x);
 +		++idx;
 +	}
 +
 +	return GWN_batch_create_ex(GWN_PRIM_POINTS, vbo, NULL, GWN_BATCH_OWNS_VBO);
 +}
 +
 +/* create batch geometry data for stroke shader */
 +Gwn_Batch *DRW_gpencil_get_stroke_geom(bGPDframe *gpf, bGPDstroke *gps, short thickness, const float ink[4])
 +{
 +	bGPDspoint *points = gps->points;
 +	int totpoints = gps->totpoints;
 +	/* if cyclic needs more vertex */
 +	int cyclic_add = (gps->flag & GP_STROKE_CYCLIC) ? 1 : 0;
 +
 +	static Gwn_VertFormat format = { 0 };
 +	static unsigned int pos_id, color_id, thickness_id;
 +	if (format.attrib_ct == 0) {
 +		pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
 +		color_id = GWN_vertformat_attr_add(&format, "color", GWN_COMP_F32, 4, GWN_FETCH_FLOAT);
 +		thickness_id = GWN_vertformat_attr_add(&format, "thickness", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
 +	}
 +
 +	Gwn_VertBuf *vbo =  GWN_vertbuf_create_with_format(&format);
 +	GWN_vertbuf_data_alloc(vbo, totpoints + cyclic_add + 2);
 +
 +	/* draw stroke curve */
 +	const bGPDspoint *pt = points;
 +	int idx = 0;
 +	for (int i = 0; i < totpoints; i++, pt++) {
 +		/* first point for adjacency (not drawn) */
 +		if (i == 0) {
 +			if (gps->flag & GP_STROKE_CYCLIC && totpoints > 2) {
 +				gpencil_set_stroke_point(vbo, gpf->viewmatrix, &points[totpoints - 1], idx, pos_id, color_id, thickness_id, thickness, ink);
 +				++idx;
 +			}
 +			else {
 +				gpencil_set_stroke_point(vbo, gpf->viewmatrix, &points[1], idx, pos_id, color_id, thickness_id, thickness, ink);
 +				++idx;
 +			}
 +		}
 +		/* set point */
 +		gpencil_set_stroke_point(vbo, gpf->viewmatrix, pt, idx, pos_id, color_id, thickness_id, thickness, ink);
 +		++idx;
 +	}
 +
 +	if (gps->flag & GP_STROKE_CYCLIC && totpoints > 2) {
 +		/* draw line to first point to complete the cycle */
 +		gpencil_set_stroke_point(vbo, gpf->viewmatrix, &points[0], idx, pos_id, color_id, thickness_id, thickness, ink);
 +		++idx;
 +		/* now add adjacency point (not drawn) */
 +		gpencil_set_stroke_point(vbo, gpf->viewmatrix, &points[1], idx, pos_id, color_id, thickness_id, thickness, ink);
 +		++idx;
 +	}
 +	/* last adjacency point (not drawn) */
 +	else {
 +		gpencil_set_stroke_point(vbo, gpf->viewmatrix, &points[totpoints - 2], idx, pos_id, color_id, thickness_id, thickness, ink);
 +	}
 +
 +	return GWN_batch_create_ex(GWN_PRIM_LINE_STRIP_ADJ, vbo, NULL, GWN_BATCH_OWNS_VBO);
 +}
 +
 +/* helper to convert 2d to 3d for simple drawing buffer */
 +static void gpencil_stroke_convertcoords(Scene *scene, ARegion *ar, View3D *v3d, const tGPspoint *point2D, float out[3])
 +{
 +	float mval_f[2];
 +	ARRAY_SET_ITEMS(mval_f, point2D->x, point2D->y);
 +	float mval_prj[2];
 +	float rvec[3], dvec[3];
 +	float zfac;
 +
 +	/* Current method just converts each point in screen-coordinates to
 +	* 3D-coordinates using the 3D-cursor as reference.
 +	*/
 +	const float *cursor = ED_view3d_cursor3d_get(scene, v3d);
 +	copy_v3_v3(rvec, cursor);
 +
 +	zfac = ED_view3d_calc_zfac(ar->regiondata, rvec, NULL);
 +
 +	if (ED_view3d_project_float_global(ar, rvec, mval_prj, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) {
 +		sub_v2_v2v2(mval_f, mval_prj, mval_f);
 +		ED_view3d_win_to_delta(ar, mval_f, dvec, zfac);
 +		sub_v3_v3v3(out, rvec, dvec);
 +	}
 +	else {
 +		zero_v3(out);
 +	}
 +}
 +
 +/* convert 2d tGPspoint to 3d bGPDspoint */
 +static void gpencil_tpoint_to_point(Scene *scene, ARegion *ar, View3D *v3d, const tGPspoint *tpt, bGPDspoint *pt)
 +{
 +	float p3d[3];
 +	/* conversion to 3d format */
 +	gpencil_stroke_convertcoords(scene, ar, v3d, tpt, p3d);
 +	copy_v3_v3(&pt->x, p3d);
 +
 +	pt->pressure = tpt->pressure;
 +	pt->strength = tpt->strength;
 +}
 +
 +/* create batch geometry data for current buffer stroke shader */
 +Gwn_Batch *DRW_gpencil_get_buffer_stroke_geom(bGPdata *gpd, float matrix[4][4], short thickness)
 +{
 +	const DRWContextState *draw_ctx = DRW_context_state_get();
 +	Scene *scene = draw_ctx->scene;
 +	View3D *v3d = draw_ctx->v3d;
 +	ARegion *ar = draw_ctx->ar;
 +	RegionView3D *rv3d = draw_ctx->rv3d;
 +	ToolSettings *ts = scene->toolsettings;
 +	Object *ob = draw_ctx->obact;
 +
 +	tGPspoint *points = gpd->sbuffer;
 +	int totpoints = gpd->sbuffer_size;
 +
 +	static Gwn_VertFormat format = { 0 };
 +	static unsigned int pos_id, color_id, thickness_id;
 +	if (format.attrib_ct == 0) {
 +		pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
 +		color_id = GWN_vertformat_attr_add(&format, "color", GWN_COMP_F32, 4, GWN_FETCH_FLOAT);
 +		thickness_id = GWN_vertformat_attr_add(&format, "thickness", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
 +	}
 +
 +	Gwn_VertBuf *vbo =  GWN_vertbuf_create_with_format(&format);
 +	GWN_vertbuf_data_alloc(vbo, totpoints + 2);
 +
 +	/* draw stroke curve */
 +	const tGPspoint *tpt = points;
 +	bGPDspoint pt;
 +	int idx = 0;
 +	
 +	/* get origin to reproject point */
 +	float origin[3];
 +	bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd);
 +	ED_gp_get_drawing_reference(ts, v3d, scene, ob, gpl, ts->gpencil_v3d_align, origin);
 +
 +	for (int i = 0; i < totpoints; i++, tpt++) {
 +		gpencil_tpoint_to_point(scene, ar, v3d, tpt, &pt);
 +		ED_gp_project_point_to_plane(ob, rv3d, origin, ts->gp_sculpt.lock_axis - 1, ts->gpencil_src, &pt);
 +
 +		/* first point for adjacency (not drawn) */
 +		if (i == 0) {
 +			gpencil_set_stroke_point(vbo, matrix, &pt, idx, pos_id, color_id, thickness_id, thickness, gpd->scolor);
 +			++idx;
 +		}
 +		/* set point */
 +		gpencil_set_stroke_point(vbo, matrix, &pt, idx, pos_id, color_id, thickness_id, thickness, gpd->scolor);
 +		++idx;
 +	}
 +
 +	/* last adjacency point (not drawn) */
 +	gpencil_set_stroke_point(vbo, matrix, &pt, idx, pos_id, color_id, thickness_id, thickness, gpd->scolor);
 +
 +	return GWN_batch_create_ex(GWN_PRIM_LINE_STRIP_ADJ, vbo, NULL, GWN_BATCH_OWNS_VBO);
 +}
 +
 +/* create batch geometry data for current buffer point shader */
 +Gwn_Batch *DRW_gpencil_get_buffer_point_geom(bGPdata *gpd, float matrix[4][4], short thickness)
 +{
 +	const DRWContextState *draw_ctx = DRW_context_state_get();
 +	Scene *scene = draw_ctx->scene;
 +	View3D *v3d = draw_ctx->v3d;
 +	ARegion *ar = draw_ctx->ar;
 +	RegionView3D *rv3d = draw_ctx->rv3d;
 +	ToolSettings *ts = scene->toolsettings;
 +	Object *ob = draw_ctx->obact;
 +
 +	tGPspoint *points = gpd->sbuffer;
 +	int totpoints = gpd->sbuffer_size;
 +
 +	static Gwn_VertFormat format = { 0 };
 +	static uns

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list