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

Campbell Barton noreply at git.blender.org
Sat Jun 9 16:08:20 CEST 2018


Commit: e51e9bda6f86000517f461e9b71e55cae82ee03e
Author: Campbell Barton
Date:   Sat Jun 9 16:07:52 2018 +0200
Branches: greasepencil-object
https://developer.blender.org/rBe51e9bda6f86000517f461e9b71e55cae82ee03e

Merge branch 'blender2.8' into greasepencil-object

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



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

diff --cc source/blender/draw/engines/gpencil/gpencil_engine.c
index f78196e6c61,00000000000..e829ad25549
mode 100644,000000..100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@@ -1,722 -1,0 +1,724 @@@
 +/*
 + * Copyright 2017, Blender Foundation.
 + *
 + * 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.
 + *
 + * Contributor(s): Antonio Vazquez
 + *
 + */
 +
 +/** \file blender/draw/engines/gpencil/gpencil_engine.c
 + *  \ingroup draw
 + */
 +#include "DRW_engine.h"
 +#include "DRW_render.h"
 +
 +#include "BKE_camera.h"
 +#include "BKE_object.h"
 +#include "BKE_paint.h"
 +#include "BKE_gpencil.h"
 +
 +#include "DNA_gpencil_types.h"
 +#include "DNA_view3d_types.h"
 +
 +#include "draw_mode_engines.h"
 +
 +#include "UI_resources.h"
 +
 +#include "GPU_texture.h"
 +
 +#include "gpencil_engine.h"
 +
 +#include "ED_screen.h"
 +#include "ED_gpencil.h"
 +
 +extern char datatoc_gpencil_fill_vert_glsl[];
 +extern char datatoc_gpencil_fill_frag_glsl[];
 +extern char datatoc_gpencil_stroke_vert_glsl[];
 +extern char datatoc_gpencil_stroke_geom_glsl[];
 +extern char datatoc_gpencil_stroke_frag_glsl[];
 +extern char datatoc_gpencil_zdepth_mix_frag_glsl[];
 +extern char datatoc_gpencil_simple_mix_frag_glsl[];
 +extern char datatoc_gpencil_point_vert_glsl[];
 +extern char datatoc_gpencil_point_geom_glsl[];
 +extern char datatoc_gpencil_point_frag_glsl[];
 +extern char datatoc_gpencil_gaussian_blur_frag_glsl[];
 +extern char datatoc_gpencil_wave_frag_glsl[];
 +extern char datatoc_gpencil_pixel_frag_glsl[];
 +extern char datatoc_gpencil_swirl_frag_glsl[];
 +extern char datatoc_gpencil_flip_frag_glsl[];
 +extern char datatoc_gpencil_light_frag_glsl[];
 +extern char datatoc_gpencil_painting_frag_glsl[];
 +extern char datatoc_gpencil_paper_frag_glsl[];
 +extern char datatoc_gpencil_edit_point_vert_glsl[];
 +extern char datatoc_gpencil_edit_point_geom_glsl[];
 +extern char datatoc_gpencil_edit_point_frag_glsl[];
 +
 +/* *********** STATIC *********** */
 +static GPENCIL_e_data e_data = {NULL}; /* Engine data */
 +
 +/* *********** FUNCTIONS *********** */
 +
 +/* create a multisample buffer if not present */
 +void DRW_gpencil_multisample_ensure(GPENCIL_Data *vedata, int rect_w, int rect_h)
 +{
 +	GPENCIL_FramebufferList *fbl = vedata->fbl;
 +
 +	if (U.gpencil_multisamples > 0) {
 +		if (!fbl->multisample_fb) {
 +			fbl->multisample_fb = GPU_framebuffer_create();
 +			if (fbl->multisample_fb) {
 +				if (e_data.multisample_color == NULL) {
 +					e_data.multisample_color = GPU_texture_create_2D_multisample(rect_w, rect_h, GPU_RGBA8, NULL, U.gpencil_multisamples, NULL);
 +				}
 +				if (e_data.multisample_depth == NULL) {
 +					e_data.multisample_depth = GPU_texture_create_2D_multisample(rect_w, rect_h, GPU_DEPTH24_STENCIL8, NULL, U.gpencil_multisamples, NULL);
 +				}
 +				GPU_framebuffer_ensure_config(&fbl->multisample_fb, {
 +					GPU_ATTACHMENT_TEXTURE(e_data.multisample_depth),
 +					GPU_ATTACHMENT_TEXTURE(e_data.multisample_color)
 +					});
 +				if (!GPU_framebuffer_check_valid(fbl->multisample_fb, NULL)) {
 +					GPU_framebuffer_free(fbl->multisample_fb);
 +				}
 +			}
 +		}
 +	}
 +}
 +
 +static void GPENCIL_create_framebuffers(void *vedata)
 +{
 +	GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
 +
 +	/* Go full 32bits for rendering */
 +	GPUTextureFormat fb_format = DRW_state_is_image_render() ? GPU_RGBA32F : GPU_RGBA16F;
 +
 +	if (DRW_state_is_fbo()) {
 +		const float *viewport_size = DRW_viewport_size_get();
 +		const int size[2] = { (int)viewport_size[0], (int)viewport_size[1] };
 +
 +		/* create multiframe framebuffer for AA */
 +		if (U.gpencil_multisamples > 0) {
 +			DRW_gpencil_multisample_ensure(vedata, size[0], size[1]);
 +		}
 +
 +		/* temp textures */
 +		e_data.temp_depth_tx_a = DRW_texture_pool_query_2D(size[0], size[1], GPU_DEPTH24_STENCIL8,
 +			&draw_engine_object_type);
 +		e_data.temp_color_tx_a = DRW_texture_pool_query_2D(size[0], size[1], fb_format,
 +			&draw_engine_object_type);
 +		GPU_framebuffer_ensure_config(&fbl->temp_fb_a, {
 +			GPU_ATTACHMENT_TEXTURE(e_data.temp_depth_tx_a),
 +			GPU_ATTACHMENT_TEXTURE(e_data.temp_color_tx_a)
 +			});
 +
 +		/* painting framebuffer to speed up drawing process (always 16 bits) */
 +		e_data.painting_depth_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_DEPTH24_STENCIL8,
 +			&draw_engine_object_type);
 +		e_data.painting_color_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA16F,
 +			&draw_engine_object_type);
 +		GPU_framebuffer_ensure_config(&fbl->painting_fb, {
 +			GPU_ATTACHMENT_TEXTURE(e_data.painting_depth_tx),
 +			GPU_ATTACHMENT_TEXTURE(e_data.painting_color_tx)
 +			});
 +	}
 +}
 +
 +static void GPENCIL_create_shaders(void)
 +{
 +	/* normal fill shader */
 +	if (!e_data.gpencil_fill_sh) {
 +		e_data.gpencil_fill_sh = DRW_shader_create(
 +			datatoc_gpencil_fill_vert_glsl, NULL,
 +			datatoc_gpencil_fill_frag_glsl, NULL);
 +	}
 +
 +	/* normal stroke shader using geometry to display lines (line mode) */
 +	if (!e_data.gpencil_stroke_sh) {
 +		e_data.gpencil_stroke_sh = DRW_shader_create(
 +			datatoc_gpencil_stroke_vert_glsl,
 +			datatoc_gpencil_stroke_geom_glsl,
 +			datatoc_gpencil_stroke_frag_glsl,
 +			NULL);
 +	}
 +
 +	/* dot/rectangle mode for normal strokes using geometry */
 +	if (!e_data.gpencil_point_sh) {
 +		e_data.gpencil_point_sh = DRW_shader_create(
 +			datatoc_gpencil_point_vert_glsl,
 +			datatoc_gpencil_point_geom_glsl,
 +			datatoc_gpencil_point_frag_glsl,
 +			NULL);
 +	}
 +	/* used for edit points or strokes with one point only */
 +	if (!e_data.gpencil_edit_point_sh) {
 +		e_data.gpencil_edit_point_sh = DRW_shader_create(
 +			datatoc_gpencil_edit_point_vert_glsl,
 +			datatoc_gpencil_edit_point_geom_glsl,
 +			datatoc_gpencil_edit_point_frag_glsl, NULL);
 +	}
 +
 +	/* used for edit lines for edit modes */
 +	if (!e_data.gpencil_line_sh) {
 +		e_data.gpencil_line_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_FLAT_COLOR);
 +	}
 +
 +	/* used to filling during drawing */
 +	if (!e_data.gpencil_drawing_fill_sh) {
 +		e_data.gpencil_drawing_fill_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_SMOOTH_COLOR);
 +	}
 +
 +	/* full screen for mix zdepth*/
 +	if (!e_data.gpencil_fullscreen_sh) {
 +		e_data.gpencil_fullscreen_sh = DRW_shader_create_fullscreen(datatoc_gpencil_zdepth_mix_frag_glsl, NULL);
 +	}
 +	if (!e_data.gpencil_simple_fullscreen_sh) {
 +		e_data.gpencil_simple_fullscreen_sh = DRW_shader_create_fullscreen(datatoc_gpencil_simple_mix_frag_glsl, NULL);
 +	}
 +
 +	/* shaders for use when drawing */
 +	if (!e_data.gpencil_painting_sh) {
 +		e_data.gpencil_painting_sh = DRW_shader_create_fullscreen(datatoc_gpencil_painting_frag_glsl, NULL);
 +	}
 +	if (!e_data.gpencil_paper_sh) {
 +		e_data.gpencil_paper_sh = DRW_shader_create_fullscreen(datatoc_gpencil_paper_frag_glsl, NULL);
 +	}
 +}
 +
 +void GPENCIL_engine_init(void *vedata)
 +{
 +	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
 +
 +	/* create framebuffers */
 +	GPENCIL_create_framebuffers(vedata);
 +
 +	/* create shaders */
 +	GPENCIL_create_shaders();
 +
 +	/* init storage */
 +	if (!stl->storage) {
 +		stl->storage = MEM_callocN(sizeof(GPENCIL_Storage), "GPENCIL_Storage");
 +
 +		/* unit matrix */
 +		unit_m4(stl->storage->unit_matrix);
 +	}
 +
 +	/* blank texture used if no texture defined for fill shader */
 +	if (!e_data.gpencil_blank_texture) {
 +		float rect[16][16][4] = {{{0.0f}}};
 +		e_data.gpencil_blank_texture = DRW_texture_create_2D(16, 16, GPU_RGBA8, DRW_TEX_FILTER, (float *)rect);
 +	}
 +}
 +
 +static void GPENCIL_engine_free(void)
 +{
 +	/* only free custom shaders, builtin shaders are freed in blender close */
 +	DRW_SHADER_FREE_SAFE(e_data.gpencil_fill_sh);
 +	DRW_SHADER_FREE_SAFE(e_data.gpencil_stroke_sh);
 +	DRW_SHADER_FREE_SAFE(e_data.gpencil_point_sh);
 +	DRW_SHADER_FREE_SAFE(e_data.gpencil_edit_point_sh);
 +	DRW_SHADER_FREE_SAFE(e_data.gpencil_fullscreen_sh);
 +	DRW_SHADER_FREE_SAFE(e_data.gpencil_simple_fullscreen_sh);
 +	DRW_SHADER_FREE_SAFE(e_data.gpencil_painting_sh);
 +	DRW_SHADER_FREE_SAFE(e_data.gpencil_paper_sh);
 +
 +	DRW_TEXTURE_FREE_SAFE(e_data.gpencil_blank_texture);
 +	DRW_TEXTURE_FREE_SAFE(e_data.multisample_color);
 +	DRW_TEXTURE_FREE_SAFE(e_data.multisample_depth);
 +}
 +
 +void GPENCIL_cache_init(void *vedata)
 +{
 +	GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
 +	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
 +	const DRWContextState *draw_ctx = DRW_context_state_get();
 +	Scene *scene = draw_ctx->scene;
 +	View3D *v3d = draw_ctx->v3d;
 +
 +	/* Special handling for when active object is GP object (e.g. for draw mode) */
 +	Object *obact = draw_ctx->obact;
 +	bGPdata *obact_gpd = NULL;
 +	MaterialGPencilStyle *gp_style = NULL;
 +
 +	if (obact && (obact->type == OB_GPENCIL) && (obact->data)) {
 +		obact_gpd = (bGPdata *)obact->data;
 +		gp_style = BKE_material_gpencil_settings_get(obact, obact->actcol);
 +	}
 +
 +	if (!stl->g_data) {
 +		/* Alloc transient pointers */
 +		stl->g_data = MEM_mallocN(sizeof(g_data), "g_data");
 +		stl->storage->xray = GP_XRAY_FRONT; /* used for drawing */
 +		stl->storage->stroke_style = GP_STYLE_STROKE_STYLE_SOLID; /* used for drawing */
 +	}
 +	stl->storage->tonemapping = 0;
 +
 +	stl->g_data->shgrps_edit_line = NULL;
 +	stl->g_data->shgrps_edit_point = NULL;
 +
 +	if (!stl->shgroups) {
 +		/* Alloc maximum size because count strokes is very slow and can be very complex due onion skinning.
 +		   I tried to allocate o

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list