| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright 2016, 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): Blender Institute | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** \file blender/draw/modes/edit_curve_mode.c
 | 
					
						
							|  |  |  |  *  \ingroup draw | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "DRW_engine.h"
 | 
					
						
							|  |  |  | #include "DRW_render.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 05:23:48 +10:00
										 |  |  | #include "DNA_curve_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | /* If builtin shaders are needed */ | 
					
						
							|  |  |  | #include "GPU_shader.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-21 02:18:14 +10:00
										 |  |  | #include "GPU_batch.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "draw_common.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "draw_mode_engines.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-18 22:14:53 +01:00
										 |  |  | /* If needed, contains all global/Theme colors
 | 
					
						
							|  |  |  |  * Add needed theme colors / values to DRW_globals_update() and update UBO | 
					
						
							|  |  |  |  * Not needed for constant color. */ | 
					
						
							|  |  |  | extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ | 
					
						
							|  |  |  | extern struct GlobalsUboStorage ts; /* draw_common.c */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | extern char datatoc_common_globals_lib_glsl[]; | 
					
						
							|  |  |  | extern char datatoc_edit_curve_overlay_loosevert_vert_glsl[]; | 
					
						
							|  |  |  | extern char datatoc_edit_curve_overlay_frag_glsl[]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern char datatoc_gpu_shader_3D_vert_glsl[]; | 
					
						
							|  |  |  | extern char datatoc_gpu_shader_uniform_color_frag_glsl[]; | 
					
						
							|  |  |  | extern char datatoc_gpu_shader_point_uniform_color_frag_glsl[]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | /* *********** LISTS *********** */ | 
					
						
							|  |  |  | /* All lists are per viewport specific datas.
 | 
					
						
							|  |  |  |  * They are all free when viewport changes engines | 
					
						
							|  |  |  |  * or is free itself. Use EDIT_CURVE_engine_init() to | 
					
						
							|  |  |  |  * initialize most of them and EDIT_CURVE_cache_init() | 
					
						
							|  |  |  |  * for EDIT_CURVE_PassList */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct EDIT_CURVE_PassList { | 
					
						
							|  |  |  | 	/* Declare all passes here and init them in
 | 
					
						
							|  |  |  | 	 * EDIT_CURVE_cache_init(). | 
					
						
							|  |  |  | 	 * Only contains (DRWPass *) */ | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | 	struct DRWPass *wire_pass; | 
					
						
							|  |  |  | 	struct DRWPass *overlay_edge_pass; | 
					
						
							|  |  |  | 	struct DRWPass *overlay_vert_pass; | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | } EDIT_CURVE_PassList; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct EDIT_CURVE_FramebufferList { | 
					
						
							|  |  |  | 	/* Contains all framebuffer objects needed by this engine.
 | 
					
						
							|  |  |  | 	 * Only contains (GPUFrameBuffer *) */ | 
					
						
							| 
									
										
										
										
											2017-03-13 11:39:41 +01:00
										 |  |  | 	struct GPUFrameBuffer *fb; | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | } EDIT_CURVE_FramebufferList; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct EDIT_CURVE_TextureList { | 
					
						
							|  |  |  | 	/* Contains all framebuffer textures / utility textures
 | 
					
						
							|  |  |  | 	 * needed by this engine. Only viewport specific textures | 
					
						
							|  |  |  | 	 * (not per object). Only contains (GPUTexture *) */ | 
					
						
							| 
									
										
										
										
											2017-03-13 11:39:41 +01:00
										 |  |  | 	struct GPUTexture *texture; | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | } EDIT_CURVE_TextureList; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct EDIT_CURVE_StorageList { | 
					
						
							|  |  |  | 	/* Contains any other memory block that the engine needs.
 | 
					
						
							|  |  |  | 	 * Only directly MEM_(m/c)allocN'ed blocks because they are | 
					
						
							|  |  |  | 	 * free with MEM_freeN() when viewport is freed. | 
					
						
							|  |  |  | 	 * (not per object) */ | 
					
						
							| 
									
										
										
										
											2017-03-13 11:39:41 +01:00
										 |  |  | 	struct CustomStruct *block; | 
					
						
							| 
									
										
										
										
											2017-04-29 16:52:12 +10:00
										 |  |  | 	struct EDIT_CURVE_PrivateData *g_data; | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | } EDIT_CURVE_StorageList; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct EDIT_CURVE_Data { | 
					
						
							| 
									
										
										
										
											2017-11-29 10:48:42 +01:00
										 |  |  | 	/* Struct returned by DRW_viewport_engine_data_ensure.
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 	 * If you don't use one of these, just make it a (void *) */ | 
					
						
							|  |  |  | 	// void *fbl;
 | 
					
						
							| 
									
										
										
										
											2017-04-03 19:32:05 +02:00
										 |  |  | 	void *engine_type; /* Required */ | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 	EDIT_CURVE_FramebufferList *fbl; | 
					
						
							|  |  |  | 	EDIT_CURVE_TextureList *txl; | 
					
						
							|  |  |  | 	EDIT_CURVE_PassList *psl; | 
					
						
							|  |  |  | 	EDIT_CURVE_StorageList *stl; | 
					
						
							|  |  |  | } EDIT_CURVE_Data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* *********** STATIC *********** */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-18 22:14:53 +01:00
										 |  |  | static struct { | 
					
						
							|  |  |  | 	/* Custom shaders :
 | 
					
						
							|  |  |  | 	 * Add sources to source/blender/draw/modes/shaders | 
					
						
							|  |  |  | 	 * init in EDIT_CURVE_engine_init(); | 
					
						
							|  |  |  | 	 * free in EDIT_CURVE_engine_free(); */ | 
					
						
							| 
									
										
										
										
											2017-04-21 02:18:14 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-21 04:39:51 +10:00
										 |  |  | 	GPUShader *wire_sh; | 
					
						
							| 
									
										
										
										
											2017-03-18 22:14:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-21 04:39:51 +10:00
										 |  |  | 	GPUShader *overlay_edge_sh;  /* handles and nurbs control cage */ | 
					
						
							|  |  |  | 	GPUShader *overlay_vert_sh; | 
					
						
							| 
									
										
										
										
											2017-03-26 20:13:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | } e_data = {NULL}; /* Engine data */ | 
					
						
							| 
									
										
										
										
											2017-03-18 22:14:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-29 16:52:12 +10:00
										 |  |  | typedef struct EDIT_CURVE_PrivateData { | 
					
						
							| 
									
										
										
										
											2017-03-18 22:14:53 +01:00
										 |  |  | 	/* This keeps the references of the shading groups for
 | 
					
						
							|  |  |  | 	 * easy access in EDIT_CURVE_cache_populate() */ | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* resulting curve as 'wire' for curves (and optionally normals) */ | 
					
						
							|  |  |  | 	DRWShadingGroup *wire_shgrp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	DRWShadingGroup *overlay_edge_shgrp; | 
					
						
							|  |  |  | 	DRWShadingGroup *overlay_vert_shgrp; | 
					
						
							| 
									
										
										
										
											2017-04-29 16:52:12 +10:00
										 |  |  | } EDIT_CURVE_PrivateData; /* Transient data */ | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* *********** FUNCTIONS *********** */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Init Textures, Framebuffers, Storage and Shaders.
 | 
					
						
							|  |  |  |  * It is called for every frames. | 
					
						
							| 
									
										
										
										
											2017-03-14 18:40:23 +11:00
										 |  |  |  * (Optional) */ | 
					
						
							| 
									
										
										
										
											2017-03-26 19:10:53 +02:00
										 |  |  | static void EDIT_CURVE_engine_init(void *vedata) | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-03-26 19:10:53 +02:00
										 |  |  | 	EDIT_CURVE_TextureList *txl = ((EDIT_CURVE_Data *)vedata)->txl; | 
					
						
							|  |  |  | 	EDIT_CURVE_FramebufferList *fbl = ((EDIT_CURVE_Data *)vedata)->fbl; | 
					
						
							|  |  |  | 	EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl; | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-14 18:40:23 +11:00
										 |  |  | 	UNUSED_VARS(txl, fbl, stl); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 	/* Init Framebuffers like this: order is attachment order (for color texs) */ | 
					
						
							|  |  |  | 	/*
 | 
					
						
							| 
									
										
										
										
											2017-05-16 20:18:57 +02:00
										 |  |  | 	 * DRWFboTexture tex[2] = {{&txl->depth, DRW_TEX_DEPTH_24, 0}, | 
					
						
							|  |  |  | 	 *                         {&txl->color, DRW_TEX_RGBA_8, DRW_TEX_FILTER}}; | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* DRW_framebuffer_init takes care of checking if
 | 
					
						
							|  |  |  | 	 * the framebuffer is valid and has the right size*/ | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * float *viewport_size = DRW_viewport_size_get(); | 
					
						
							|  |  |  | 	 * DRW_framebuffer_init(&fbl->occlude_wire_fb, | 
					
						
							|  |  |  | 	 *                     (int)viewport_size[0], (int)viewport_size[1], | 
					
						
							|  |  |  | 	 *                     tex, 2); | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | 	if (!e_data.wire_sh) { | 
					
						
							|  |  |  | 		e_data.wire_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!e_data.overlay_edge_sh) { | 
					
						
							|  |  |  | 		e_data.overlay_edge_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!e_data.overlay_vert_sh) { | 
					
						
							|  |  |  | 		e_data.overlay_vert_sh = DRW_shader_create_with_lib( | 
					
						
							|  |  |  | 		        datatoc_edit_curve_overlay_loosevert_vert_glsl, NULL, | 
					
						
							|  |  |  | 		        datatoc_edit_curve_overlay_frag_glsl, | 
					
						
							|  |  |  | 		        datatoc_common_globals_lib_glsl, NULL); | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Here init all passes and shading groups
 | 
					
						
							|  |  |  |  * Assume that all Passes are NULL */ | 
					
						
							| 
									
										
										
										
											2017-03-26 19:10:53 +02:00
										 |  |  | static void EDIT_CURVE_cache_init(void *vedata) | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-03-26 19:10:53 +02:00
										 |  |  | 	EDIT_CURVE_PassList *psl = ((EDIT_CURVE_Data *)vedata)->psl; | 
					
						
							|  |  |  | 	EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl; | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-26 20:13:34 +02:00
										 |  |  | 	if (!stl->g_data) { | 
					
						
							|  |  |  | 		/* Alloc transient pointers */ | 
					
						
							| 
									
										
										
										
											2017-04-29 16:52:12 +10:00
										 |  |  | 		stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); | 
					
						
							| 
									
										
										
										
											2017-03-26 20:13:34 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-14 18:40:23 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | 		/* Center-Line (wire) */ | 
					
						
							|  |  |  | 		psl->wire_pass = DRW_pass_create( | 
					
						
							|  |  |  | 		        "Curve Wire", | 
					
						
							|  |  |  | 		        DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_WIRE); | 
					
						
							|  |  |  | 		stl->g_data->wire_shgrp = DRW_shgroup_create(e_data.wire_sh, psl->wire_pass); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/* TODO: following handle theme colors,
 | 
					
						
							|  |  |  | 		 * For now use overlay vert shader for handles (we want them colored): | 
					
						
							|  |  |  | 		 * TH_NURB_ULINE, TH_NURB_SEL_ULINE, TH_HANDLE_* */ | 
					
						
							|  |  |  | 		psl->overlay_edge_pass = DRW_pass_create( | 
					
						
							|  |  |  | 		        "Curve Handle Overlay", | 
					
						
							|  |  |  | 		        DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_WIRE); | 
					
						
							|  |  |  | 		/* TODO: following handle theme colors,
 | 
					
						
							|  |  |  | 		 * For now use overlay vert shader for handles (we want them colored) */ | 
					
						
							|  |  |  | 		stl->g_data->overlay_edge_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, psl->overlay_edge_pass); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		psl->overlay_vert_pass = DRW_pass_create( | 
					
						
							|  |  |  | 		        "Curve Vert Overlay", | 
					
						
							| 
									
										
										
										
											2017-04-20 21:12:56 +10:00
										 |  |  | 		        DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_POINT); | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | 		stl->g_data->overlay_vert_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, psl->overlay_vert_pass); | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Add geometry to shadingGroups. Execute for each objects */ | 
					
						
							| 
									
										
										
										
											2017-03-26 19:10:53 +02:00
										 |  |  | static void EDIT_CURVE_cache_populate(void *vedata, Object *ob) | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-03-26 19:10:53 +02:00
										 |  |  | 	EDIT_CURVE_PassList *psl = ((EDIT_CURVE_Data *)vedata)->psl; | 
					
						
							|  |  |  | 	EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl; | 
					
						
							| 
									
										
										
										
											2017-04-26 00:35:08 +10:00
										 |  |  | 	const DRWContextState *draw_ctx = DRW_context_state_get(); | 
					
						
							|  |  |  | 	const Scene *scene = draw_ctx->scene; | 
					
						
							|  |  |  | 	const Object *obedit = scene->obedit; | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-14 18:40:23 +11:00
										 |  |  | 	UNUSED_VARS(psl, stl); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | 	if (ob->type == OB_CURVE) { | 
					
						
							|  |  |  | 		if (ob == obedit) { | 
					
						
							| 
									
										
										
										
											2017-04-20 05:23:48 +10:00
										 |  |  | 			Curve *cu = ob->data; | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | 			/* Get geometry cache */ | 
					
						
							| 
									
										
										
										
											2017-06-19 20:18:04 +10:00
										 |  |  | 			struct Gwn_Batch *geom; | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			geom = DRW_cache_curve_edge_wire_get(ob); | 
					
						
							|  |  |  | 			DRW_shgroup_call_add(stl->g_data->wire_shgrp, geom, ob->obmat); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-23 03:28:53 +10:00
										 |  |  | 			if ((cu->flag & CU_3D) && (cu->drawflag & CU_HIDE_NORMALS) == 0) { | 
					
						
							| 
									
										
										
										
											2017-04-20 05:23:48 +10:00
										 |  |  | 				geom = DRW_cache_curve_edge_normal_get(ob, scene->toolsettings->normalsize); | 
					
						
							|  |  |  | 				DRW_shgroup_call_add(stl->g_data->wire_shgrp, geom, ob->obmat); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | 			/* Add geom to a shading group */ | 
					
						
							|  |  |  | 			geom = DRW_cache_curve_edge_overlay_get(ob); | 
					
						
							| 
									
										
										
										
											2017-04-20 04:53:55 +10:00
										 |  |  | 			if (geom) { | 
					
						
							|  |  |  | 				DRW_shgroup_call_add(stl->g_data->overlay_edge_shgrp, geom, ob->obmat); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | 			geom = DRW_cache_curve_vert_overlay_get(ob); | 
					
						
							|  |  |  | 			DRW_shgroup_call_add(stl->g_data->overlay_vert_shgrp, geom, ob->obmat); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-14 18:40:23 +11:00
										 |  |  | /* Optional: Post-cache_populate callback */ | 
					
						
							| 
									
										
										
										
											2017-03-26 19:10:53 +02:00
										 |  |  | static void EDIT_CURVE_cache_finish(void *vedata) | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-03-26 19:10:53 +02:00
										 |  |  | 	EDIT_CURVE_PassList *psl = ((EDIT_CURVE_Data *)vedata)->psl; | 
					
						
							|  |  |  | 	EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl; | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* Do something here! dependant on the objects gathered */ | 
					
						
							| 
									
										
										
										
											2017-03-14 18:40:23 +11:00
										 |  |  | 	UNUSED_VARS(psl, stl); | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Draw time ! Control rendering pipeline from here */ | 
					
						
							| 
									
										
										
										
											2017-03-26 19:10:53 +02:00
										 |  |  | static void EDIT_CURVE_draw_scene(void *vedata) | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-03-26 19:10:53 +02:00
										 |  |  | 	EDIT_CURVE_PassList *psl = ((EDIT_CURVE_Data *)vedata)->psl; | 
					
						
							|  |  |  | 	EDIT_CURVE_FramebufferList *fbl = ((EDIT_CURVE_Data *)vedata)->fbl; | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* Default framebuffer and texture */ | 
					
						
							|  |  |  | 	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); | 
					
						
							|  |  |  | 	DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-23 20:47:42 +02:00
										 |  |  | 	UNUSED_VARS(fbl, dtxl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	MULTISAMPLE_SYNC_ENABLE(dfbl) | 
					
						
							| 
									
										
										
										
											2017-03-14 18:40:23 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 	/* Show / hide entire passes, swap framebuffers ... whatever you fancy */ | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * DRW_framebuffer_texture_detach(dtxl->depth); | 
					
						
							|  |  |  | 	 * DRW_framebuffer_bind(fbl->custom_fb); | 
					
						
							|  |  |  | 	 * DRW_draw_pass(psl->pass); | 
					
						
							| 
									
										
										
										
											2017-04-18 11:28:11 +02:00
										 |  |  | 	 * DRW_framebuffer_texture_attach(dfbl->default_fb, dtxl->depth, 0, 0); | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 	 * DRW_framebuffer_bind(dfbl->default_fb); | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ... or just render passes on default framebuffer. */ | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:17 +10:00
										 |  |  | 	DRW_draw_pass(psl->wire_pass); | 
					
						
							|  |  |  | 	DRW_draw_pass(psl->overlay_edge_pass); | 
					
						
							|  |  |  | 	DRW_draw_pass(psl->overlay_vert_pass); | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-23 20:47:42 +02:00
										 |  |  | 	MULTISAMPLE_SYNC_DISABLE(dfbl) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 	/* If you changed framebuffer, double check you rebind
 | 
					
						
							|  |  |  | 	 * the default one with its textures attached before finishing */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Cleanup when destroying the engine.
 | 
					
						
							|  |  |  |  * This is not per viewport ! only when quitting blender. | 
					
						
							|  |  |  |  * Mostly used for freeing shaders */ | 
					
						
							|  |  |  | static void EDIT_CURVE_engine_free(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-12-14 15:16:09 -02:00
										 |  |  | 	DRW_SHADER_FREE_SAFE(e_data.overlay_vert_sh); | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Create collection settings here.
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Be sure to add this function there : | 
					
						
							|  |  |  |  * source/blender/draw/DRW_engine.h | 
					
						
							|  |  |  |  * source/blender/blenkernel/intern/layer.c | 
					
						
							|  |  |  |  * source/blenderplayer/bad_level_call_stubs/stubs.c | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * And relevant collection settings to : | 
					
						
							|  |  |  |  * source/blender/makesrna/intern/rna_scene.c | 
					
						
							|  |  |  |  * source/blender/blenkernel/intern/layer.c | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2017-03-14 18:40:23 +11:00
										 |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | void EDIT_CURVE_collection_settings_create(CollectionEngineSettings *ces) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	BLI_assert(ces); | 
					
						
							|  |  |  | 	// BKE_collection_engine_property_add_int(ces, "my_bool_prop", false);
 | 
					
						
							|  |  |  | 	// BKE_collection_engine_property_add_int(ces, "my_int_prop", 0);
 | 
					
						
							|  |  |  | 	// BKE_collection_engine_property_add_float(ces, "my_float_prop", 0.0f);
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-14 18:40:23 +11:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 19:49:19 +10:00
										 |  |  | static const DrawEngineDataSize EDIT_CURVE_data_size = DRW_VIEWPORT_DATA_SIZE(EDIT_CURVE_Data); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | DrawEngineType draw_engine_edit_curve_type = { | 
					
						
							|  |  |  | 	NULL, NULL, | 
					
						
							|  |  |  | 	N_("EditCurveMode"), | 
					
						
							| 
									
										
										
										
											2017-04-12 19:49:19 +10:00
										 |  |  | 	&EDIT_CURVE_data_size, | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | 	&EDIT_CURVE_engine_init, | 
					
						
							|  |  |  | 	&EDIT_CURVE_engine_free, | 
					
						
							|  |  |  | 	&EDIT_CURVE_cache_init, | 
					
						
							|  |  |  | 	&EDIT_CURVE_cache_populate, | 
					
						
							|  |  |  | 	&EDIT_CURVE_cache_finish, | 
					
						
							|  |  |  | 	NULL, /* draw_background but not needed by mode engines */ | 
					
						
							| 
									
										
										
										
											2017-09-25 20:07:02 +02:00
										 |  |  | 	&EDIT_CURVE_draw_scene, | 
					
						
							|  |  |  | 	NULL, | 
					
						
							| 
									
										
										
										
											2017-03-12 21:16:03 +01:00
										 |  |  | }; |