[Bf-blender-cvs] [9c6b9e889c0] blender2.8: Clay Engine: Mode engine templates.

Clément Foucault noreply at git.blender.org
Sun Mar 12 21:18:55 CET 2017


Commit: 9c6b9e889c01f3ba9775ea942457f58c1b1e63e9
Author: Clément Foucault
Date:   Sun Mar 12 21:16:03 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB9c6b9e889c01f3ba9775ea942457f58c1b1e63e9

Clay Engine: Mode engine templates.

Standard Engine layout easy to extend.

Note that most of the work will also happen in mesh_render.c to create geometry batches.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/draw_mode_engines.h
A	source/blender/draw/modes/edit_curve_mode.c
A	source/blender/draw/modes/edit_lattice_mode.c
A	source/blender/draw/modes/edit_metaball_mode.c
A	source/blender/draw/modes/edit_surface_mode.c
A	source/blender/draw/modes/edit_text_mode.c
A	source/blender/draw/modes/paint_texture_mode.c
A	source/blender/draw/modes/paint_vertex_mode.c
A	source/blender/draw/modes/paint_weight_mode.c
A	source/blender/draw/modes/particle_mode.c
A	source/blender/draw/modes/pose_mode.c
A	source/blender/draw/modes/sculpt_mode.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 0b7060fc55e..b1027a351be 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -57,9 +57,20 @@ set(SRC
 	intern/draw_view.c
 	intern/draw_armature.c
 	engines/clay/clay.c
+	modes/object_mode.c
 	modes/edit_armature_mode.c
+	modes/edit_curve_mode.c
+	modes/edit_lattice_mode.c
 	modes/edit_mesh_mode.c
-	modes/object_mode.c
+	modes/edit_metaball_mode.c
+	modes/edit_surface_mode.c
+	modes/edit_text_mode.c
+	modes/paint_texture_mode.c
+	modes/paint_vertex_mode.c
+	modes/paint_weight_mode.c
+	modes/particle_mode.c
+	modes/pose_mode.c
+	modes/sculpt_mode.c
 
 	intern/DRW_render.h
 	intern/draw_common.h
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 32f3bdffc4d..e3da0ea3b3b 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1413,29 +1413,40 @@ static void DRW_engines_enable(const bContext *C)
 			use_drw_engine(&draw_engine_edit_mesh_type);
 			break;
 		case CTX_MODE_EDIT_CURVE:
+			use_drw_engine(&draw_engine_edit_curve_type);
 			break;
 		case CTX_MODE_EDIT_SURFACE:
+			use_drw_engine(&draw_engine_edit_surface_type);
 			break;
 		case CTX_MODE_EDIT_TEXT:
+			use_drw_engine(&draw_engine_edit_text_type);
 			break;
 		case CTX_MODE_EDIT_ARMATURE:
 			use_drw_engine(&draw_engine_edit_armature_type);
 			break;
 		case CTX_MODE_EDIT_METABALL:
+			use_drw_engine(&draw_engine_edit_metaball_type);
 			break;
 		case CTX_MODE_EDIT_LATTICE:
+			use_drw_engine(&draw_engine_edit_lattice_type);
 			break;
 		case CTX_MODE_POSE:
+			use_drw_engine(&draw_engine_pose_type);
 			break;
 		case CTX_MODE_SCULPT:
+			use_drw_engine(&draw_engine_sculpt_type);
 			break;
 		case CTX_MODE_PAINT_WEIGHT:
+			use_drw_engine(&draw_engine_paint_weight_type);
 			break;
 		case CTX_MODE_PAINT_VERTEX:
+			use_drw_engine(&draw_engine_paint_vertex_type);
 			break;
 		case CTX_MODE_PAINT_TEXTURE:
+			use_drw_engine(&draw_engine_paint_texture_type);
 			break;
 		case CTX_MODE_PARTICLE:
+			use_drw_engine(&draw_engine_particle_type);
 			break;
 		case CTX_MODE_OBJECT:
 			break;
@@ -1535,8 +1546,19 @@ void DRW_engines_register(void)
 	RE_engines_register(NULL, &viewport_clay_type);
 
 	DRW_engine_register(&draw_engine_object_type);
-	DRW_engine_register(&draw_engine_edit_mesh_type);
 	DRW_engine_register(&draw_engine_edit_armature_type);
+	DRW_engine_register(&draw_engine_edit_curve_type);
+	DRW_engine_register(&draw_engine_edit_lattice_type);
+	DRW_engine_register(&draw_engine_edit_mesh_type);
+	DRW_engine_register(&draw_engine_edit_metaball_type);
+	DRW_engine_register(&draw_engine_edit_surface_type);
+	DRW_engine_register(&draw_engine_edit_text_type);
+	DRW_engine_register(&draw_engine_paint_texture_type);
+	DRW_engine_register(&draw_engine_paint_vertex_type);
+	DRW_engine_register(&draw_engine_paint_weight_type);
+	DRW_engine_register(&draw_engine_particle_type);
+	DRW_engine_register(&draw_engine_pose_type);
+	DRW_engine_register(&draw_engine_sculpt_type);
 #endif
 }
 
diff --git a/source/blender/draw/modes/draw_mode_engines.h b/source/blender/draw/modes/draw_mode_engines.h
index 01af249b736..c3b4d5ee61a 100644
--- a/source/blender/draw/modes/draw_mode_engines.h
+++ b/source/blender/draw/modes/draw_mode_engines.h
@@ -27,7 +27,18 @@
 #define __DRAW_MODES_ENGINES_H__
 
 extern DrawEngineType draw_engine_object_type;
-extern DrawEngineType draw_engine_edit_mesh_type;
 extern DrawEngineType draw_engine_edit_armature_type;
+extern DrawEngineType draw_engine_edit_curve_type;
+extern DrawEngineType draw_engine_edit_lattice_type;
+extern DrawEngineType draw_engine_edit_mesh_type;
+extern DrawEngineType draw_engine_edit_metaball_type;
+extern DrawEngineType draw_engine_edit_surface_type;
+extern DrawEngineType draw_engine_edit_text_type;
+extern DrawEngineType draw_engine_paint_texture_type;
+extern DrawEngineType draw_engine_paint_vertex_type;
+extern DrawEngineType draw_engine_paint_weight_type;
+extern DrawEngineType draw_engine_particle_type;
+extern DrawEngineType draw_engine_pose_type;
+extern DrawEngineType draw_engine_sculpt_type;
 
 #endif /* __DRAW_MODES_ENGINES_H__ */
\ No newline at end of file
diff --git a/source/blender/draw/modes/edit_curve_mode.c b/source/blender/draw/modes/edit_curve_mode.c
new file mode 100644
index 00000000000..acf36c29174
--- /dev/null
+++ b/source/blender/draw/modes/edit_curve_mode.c
@@ -0,0 +1,259 @@
+/*
+ * 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"
+
+/* If builtin shaders are needed */
+#include "GPU_shader.h"
+
+#include "draw_common.h"
+
+#include "draw_mode_engines.h"
+
+/* *********** 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 */
+
+/* keep it under MAX_PASSES */
+typedef struct EDIT_CURVE_PassList {
+	/* Declare all passes here and init them in
+	 * EDIT_CURVE_cache_init().
+	 * Only contains (DRWPass *) */
+	struct DRWPass *pass;
+} EDIT_CURVE_PassList;
+
+/* keep it under MAX_BUFFERS */
+typedef struct EDIT_CURVE_FramebufferList {
+	/* Contains all framebuffer objects needed by this engine.
+	 * Only contains (GPUFrameBuffer *) */
+	// struct GPUFrameBuffer *fb;
+} EDIT_CURVE_FramebufferList;
+
+/* keep it under MAX_TEXTURES */
+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 *) */
+	// struct GPUTexture *texture;
+} EDIT_CURVE_TextureList;
+
+/* keep it under MAX_STORAGE */
+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) */
+	// struct CustomStruct *block;
+} EDIT_CURVE_StorageList;
+
+typedef struct EDIT_CURVE_Data {
+	/* Struct returned by DRW_viewport_engine_data_get.
+	 * If you don't use one of these, just make it a (void *) */
+	// void *fbl;
+	char engine_name[32]; /* Required */
+	EDIT_CURVE_FramebufferList *fbl;
+	EDIT_CURVE_TextureList *txl;
+	EDIT_CURVE_PassList *psl;
+	EDIT_CURVE_StorageList *stl;
+} EDIT_CURVE_Data;
+
+/* *********** STATIC *********** */
+
+/* This keeps the references of the shading groups for
+ * easy access in EDIT_CURVE_cache_populate() */
+static DRWShadingGroup *group;
+
+/* 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 */
+
+/* Custom shaders :
+ * Add sources to source/blender/draw/modes/shaders
+ * init in EDIT_CURVE_engine_init();
+ * free in EDIT_CURVE_engine_free(); */
+static struct GPUShader *custom_shader = NULL;
+
+/* This keeps the reference of the viewport engine data because
+ * DRW_viewport_engine_data_get is slow and we don't want to
+ * call it for every object */
+static EDIT_CURVE_Data *vedata;
+
+/* *********** FUNCTIONS *********** */
+
+/* Init Textures, Framebuffers, Storage and Shaders.
+ * It is called for every frames.
+ * (Optionnal) */
+static void EDIT_CURVE_engine_init(void)
+{
+	EDIT_CURVE_Data *vedata = DRW_viewport_engine_data_get("EditCurveMode");
+	EDIT_CURVE_TextureList *txl = vedata->txl;
+	EDIT_CURVE_FramebufferList *fbl = vedata->fbl;
+	EDIT_CURVE_StorageList *stl = vedata->stl;
+
+	/* Init Framebuffers like this: order is attachment order (for color texs) */
+	/*
+	 * DRWFboTexture tex[2] = {{&txl->depth, DRW_BUF_DEPTH_24},
+	 *                         {&txl->color, DRW_BUF_RGBA_8}};
+	 */
+
+	/* 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);
+	 */
+
+	if (!custom_shader) {
+		custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR);
+	}
+}
+
+/* Here init all passes and shading groups
+ * Assume that all Passes are NULL */
+static void EDIT_CURVE_cache_init(void)
+{
+	vedata = DRW_viewport_engine_data_get("EditCurveMode");
+	EDIT_CURVE_PassList *psl = vedata->psl;
+	EDIT_CURVE_StorageList *stl = vedata->stl;
+
+	{
+		/* Create a pass */
+		DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND | DRW_STATE_WIRE;
+		psl->pass = DRW_pass_create("My Pass", state);
+
+		/* Create a shadingGroup using a function in draw_common.c or custom one */
+		/*
+		 * group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire);
+		 * -- or --
+		 * group = DRW_shgroup_create(custom_shader, psl->pass);
+		 */
+		group = DRW_shgroup_create(custom_shader, psl->pass);
+
+		/* Uniforms need a pointer to it's value so be sure it's accessible at
+		 * any given time (i.e. use static vars) */
+		static float color[4] = {0.2f, 0.5f, 0.3f, 1.0};
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list