[Bf-blender-cvs] [e781b7692a5] tmp-b28-motionpath-drawing: WIP setting up draw manager stuff...

Joshua Leung noreply at git.blender.org
Tue May 22 12:06:58 CEST 2018


Commit: e781b7692a50aeee45878ee8d0533590cc890fd6
Author: Joshua Leung
Date:   Sun May 13 20:25:09 2018 +0200
Branches: tmp-b28-motionpath-drawing
https://developer.blender.org/rBe781b7692a50aeee45878ee8d0533590cc890fd6

WIP setting up draw manager stuff...

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/intern/draw_anim_viz.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/draw_mode_engines.h

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 9478d41f6db..7b98db6cfaf 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -53,6 +53,7 @@ set(INC_SYS
 )
 
 set(SRC
+	intern/draw_anim_viz.c
 	intern/draw_armature.c
 	intern/draw_cache.c
 	intern/draw_cache_impl_curve.c
diff --git a/source/blender/draw/intern/draw_anim_viz.c b/source/blender/draw/intern/draw_anim_viz.c
index 0b14c6757e1..499f0c697fc 100644
--- a/source/blender/draw/intern/draw_anim_viz.c
+++ b/source/blender/draw/intern/draw_anim_viz.c
@@ -15,18 +15,15 @@
  * 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) 2009 by the Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
+ * The Original Code is Copyright (C) 2009/2018 by the Blender Foundation.
  *
  * Contributor(s): Joshua Leung
  *
  * ***** END GPL LICENSE BLOCK *****
  */
 
-/** \file blender/editors/space_view3d/drawanimviz.c
- *  \ingroup spview3d
+/** \file blender/draw/intern/draw_anim_viz.c
+ *  \ingroup draw
  */
 
 
@@ -49,14 +46,52 @@
 #include "BKE_animsys.h"
 #include "BKE_action.h"
 
+#include "ED_keyframes_draw.h"
+
+#include "UI_resources.h"
+
+#include "DRW_engine.h"
+#include "DRW_render.h"
+
+#include "GPU_shader.h"
 #include "GPU_immediate.h"
 #include "GPU_matrix.h"
 
-#include "ED_keyframes_draw.h"
+#include "draw_common.h"
+#include "draw_manager_text.h"
 
-#include "UI_resources.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.
+ */
+
+/* XXX: How to show frame numbers, etc.?  Currently only doing the dots and lines */
+typedef struct MPATH_PassList {
+	struct DRWPass *mpath_line;
+	struct DRWPass *mpath_frame_dots;
+	struct DRWPass *mpath_key_dots;
+} MPATH_PassList;
+
+typedef struct MPATH_StorageList {
+	struct MPATH_PrivateData *g_data;
+} MPATH_StorageList;
+
+typedef struct MPATH_Data {
+	void *engine_type;
+	DRWViewportEmptyList *fbl;
+	DRWViewportEmptyList *txl;
+	MPATH_PassList *psl;
+	MPATH_StorageList *stl;
+} MPATH_Data;
+
+/* ******************************** Static ************************************** */
 
-/* ************************************ Motion Paths ************************************* */
+// ...
+
+/* *************************** Motion Path Drawing ****************************** */
 
 /* TODO:
  * - options to draw paths with lines
@@ -312,6 +347,8 @@ void draw_motion_path_instance(Scene *scene,
 	/* XXX, this isn't up to date but probably should be kept so. */
 	invert_m4_m4(ob->imat, ob->obmat);
 	
+#if 0 /* FIXME!!! How can we draw text in the new 3d Viewport */
+
 	/* Draw frame numbers at each framestep value */
 	if (avs->path_viewflag & MOTIONPATH_VIEW_FNUMS) {
 		unsigned char col[4];
@@ -420,6 +457,7 @@ void draw_motion_path_instance(Scene *scene,
 		
 		BLI_dlrbTree_free(&keys);
 	}
+#endif
 }
 
 /* Clean up drawing environment after drawing motion paths */
@@ -428,3 +466,119 @@ void draw_motion_paths_cleanup(View3D *v3d)
 	if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
 	gpuPopMatrix();
 }
+
+/* ******************* Populate Cache from MotionPath Sources ******************* */
+
+/* Motion Paths from Object */
+
+
+/* *************************** Draw Engine Entrypoints ************************** */
+
+static void MPATH_engine_init(void *UNUSED(vedata))
+{
+	// if (!e_data.bone_selection_sh) {
+	// 	e_data.bone_selection_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR);
+	// }
+}
+
+static void MPATH_engine_free(void)
+{
+}
+
+/* Here init all passes and shading groups
+ * Assume that all Passes are NULL */
+static void MPATH_cache_init(void *vedata)
+{
+	MPATH_PassList *psl = ((MPATH_Data *)vedata)->psl;
+	MPATH_StorageList *stl = ((MPATH_Data *)vedata)->stl;
+
+	// if (!stl->g_data) {
+	// 	/* Alloc transient pointers */
+	// 	stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
+	// }
+
+	{
+		/* MPath Line */
+		DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND;
+		psl->mpath_line = DRW_pass_create("Motionpath Line Pass", state);
+	}
+
+	{
+		/* MPath Frame Dots */
+		DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND;
+		psl->mpath_frame_dots = DRW_pass_create("Motionpath Frame Dots Pass", state);
+	}
+	
+	{
+		/* MPath Keyframe Dots */
+		DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND;
+		psl->mpath_key_dots = DRW_pass_create("Motionpath Keyframe Dots Pass", state);
+	}
+}
+
+/* Add geometry to shading groups. Execute for each objects */
+static void MPATH_cache_populate(void *vedata, Object *ob)
+{
+	MPATH_PassList *psl = ((MPATH_Data *)vedata)->psl;
+	MPATH_StorageList *stl = ((MPATH_Data *)vedata)->stl;
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+
+#if 0 // XXX: Sample code
+	if (ob->type == OB_ARMATURE) {
+		if (DRW_pose_mode_armature(ob, draw_ctx->obact)) {
+			DRWArmaturePasses passes = {
+			    .bone_solid = psl->bone_solid,
+			    .bone_outline = psl->bone_outline,
+			    .bone_wire = psl->bone_wire,
+			    .bone_envelope = psl->bone_envelope,
+			    .bone_axes = psl->bone_axes,
+			    .relationship_lines = psl->relationship,
+			};
+			DRW_shgroup_armature_pose(ob, passes);
+		}
+	}
+	else if (ob->type == OB_MESH && POSE_is_bone_selection_overlay_active() && POSE_is_driven_by_active_armature(ob)) {
+		struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob);
+		if (geom) {
+			DRW_shgroup_call_object_add(stl->g_data->bone_selection_shgrp, geom, ob);
+		}
+	}
+#endif
+}
+
+/* Draw time! Control rendering pipeline from here */
+static void MPATH_draw_scene(void *vedata)
+{
+	MPATH_PassList *psl = ((MPATH_Data *)vedata)->psl;
+	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	
+	MULTISAMPLE_SYNC_ENABLE(dfbl, dtxl)
+
+	DRW_draw_pass(psl->mpath_line);
+	DRW_draw_pass(psl->mpath_frame_dots);
+	DRW_draw_pass(psl->mpath_key_dots);
+
+	MULTISAMPLE_SYNC_DISABLE(dfbl, dtxl)
+}
+
+/* *************************** Draw Engine Defines ****************************** */
+
+static const DrawEngineDataSize MPATH_data_size = DRW_VIEWPORT_DATA_SIZE(MPATH_Data);
+
+DrawEngineType draw_engine_motion_path_type = {
+	NULL, NULL,
+	N_("MotionPath"),
+	&MPATH_data_size,
+	&MPATH_engine_init,
+	&MPATH_engine_free,
+	&MPATH_cache_init,
+	&MPATH_cache_populate,
+	NULL,
+	NULL,
+	&MPATH_draw_scene,
+	NULL,
+	NULL,
+};
+
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 95256a2b1c8..56db619c2f5 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -2032,6 +2032,7 @@ void DRW_engines_register(void)
 	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_motion_path_type);
 	DRW_engine_register(&draw_engine_overlay_type);
 	DRW_engine_register(&draw_engine_paint_texture_type);
 	DRW_engine_register(&draw_engine_paint_vertex_type);
diff --git a/source/blender/draw/modes/draw_mode_engines.h b/source/blender/draw/modes/draw_mode_engines.h
index 9522e3cddc6..f88d49dfa96 100644
--- a/source/blender/draw/modes/draw_mode_engines.h
+++ b/source/blender/draw/modes/draw_mode_engines.h
@@ -34,6 +34,7 @@ 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_motion_path_type;
 extern DrawEngineType draw_engine_paint_texture_type;
 extern DrawEngineType draw_engine_paint_vertex_type;
 extern DrawEngineType draw_engine_paint_weight_type;



More information about the Bf-blender-cvs mailing list