[Bf-blender-cvs] [95947c6] viewport_generic_engine: Implement generic draw-modes and draw-plates for viewport engines

Julian Eisel noreply at git.blender.org
Sat Oct 8 20:06:38 CEST 2016


Commit: 95947c65761c140227d7e99147d1b711d9852997
Author: Julian Eisel
Date:   Sat Oct 8 19:29:06 2016 +0200
Branches: viewport_generic_engine
https://developer.blender.org/rB95947c65761c140227d7e99147d1b711d9852997

Implement generic draw-modes and draw-plates for viewport engines

Also made the new viewport use these (at least a default mode with a number of default plates).

This draw-plate design is more generic then the previous hardcoded one, it stores the plates in mutable lists which can be stored as presets (draw-modes). We can further add sub-plates and process callbacks for plates that need additional data processing or don't do any drawing.

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

M	source/blender/editors/space_view3d/view3d_draw_legacy.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/viewport/VP_engine_API.h
M	source/blender/viewport/intern/blender_viewport/blender_viewport.c
M	source/blender/viewport/intern/engine_api.c

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

diff --git a/source/blender/editors/space_view3d/view3d_draw_legacy.c b/source/blender/editors/space_view3d/view3d_draw_legacy.c
index be872bc..acaf522 100644
--- a/source/blender/editors/space_view3d/view3d_draw_legacy.c
+++ b/source/blender/editors/space_view3d/view3d_draw_legacy.c
@@ -3569,7 +3569,7 @@ static void view3d_main_region_draw_info(const bContext *C, Scene *scene,
 	}
 }
 
-void view3d_main_region_draw_legacy(const bContext *C)
+void view3d_main_region_draw_legacy(const ViewportEngine *UNUSED(engine), const bContext *C)
 {
 	Scene *scene = CTX_data_scene(C);
 	View3D *v3d = CTX_wm_view3d(C);
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index b848c86..d872101 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -46,6 +46,7 @@ struct bContext;
 struct bMotionPath;
 struct bPoseChannel;
 struct Mesh;
+struct ViewportEngine;
 struct wmOperatorType;
 struct wmWindowManager;
 struct wmKeyConfig;
@@ -195,7 +196,7 @@ void draw_sim_debug_data(Scene *scene, View3D *v3d, ARegion *ar);
 void view3d_main_region_draw(const struct bContext *C, struct ARegion *ar);
 
 /* view3d_draw_legacy.c */
-void view3d_main_region_draw_legacy(const struct bContext *C);
+void view3d_main_region_draw_legacy(const struct ViewportEngine *engine, const struct bContext *C);
 void ED_view3d_draw_depth(Scene *scene, struct ARegion *ar, View3D *v3d, bool alphaoverride);
 void ED_view3d_draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d);
 void ED_view3d_after_add(ListBase *lb, Base *base, const short dflag);
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 5f53b24..076ffce 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -151,7 +151,7 @@ typedef struct RegionView3D {
 
 typedef struct ViewportEngine {
 	struct ViewportEngineType *type;
-	void *pad;
+	void *render_data; /* void pointer for storing render data for now, could become own struct */
 } ViewportEngine;
 
 /* 3D ViewPort Struct */
diff --git a/source/blender/viewport/VP_engine_API.h b/source/blender/viewport/VP_engine_API.h
index cc0dea0..9299947 100644
--- a/source/blender/viewport/VP_engine_API.h
+++ b/source/blender/viewport/VP_engine_API.h
@@ -27,6 +27,7 @@
 
 #include "BLI_compiler_attrs.h"
 
+#include "DNA_defs.h"
 #include "DNA_listBase.h"
 
 struct bContext;
@@ -34,13 +35,41 @@ struct ViewportEngine;
 
 extern ListBase ViewportEngineTypes;
 
+typedef struct ViewportDrawPlate {
+	struct ViewportDrawPlate *next, *prev;
+
+	const char *idname; /* We may not need this, but useful for debugging */
+
+	/* Do the actual drawing */
+	void (*draw)(const struct ViewportEngine *, const struct bContext *);
+} ViewportDrawPlate;
+
+/**
+ * Each viewport-type can have a number of draw modes which are mostly a container for a list of draw plates.
+ */
+typedef struct ViewportDrawMode {
+	struct ViewportDrawMode *next, *prev;
+
+	ListBase drawplates;
+} ViewportDrawMode;
+
 typedef struct ViewportEngineType {
 	struct ViewportEngineType *next, *prev;
 
-	char idname[64];
-	char name[64]; /* MAX_NAME */
+	char idname[MAX_NAME]; /* Unused (TODO do we need this?) */
+	/* Displayed in UI */
+	char name[MAX_NAME];
+
+	/* Initialize engine, set defaults, especially default draw modes. */
+	void (*init)(struct ViewportEngineType *);
+	/* Set up data and view, executed before actual render callback */
+	void (*setup_render)(struct ViewportEngine *, const struct bContext *);
+	/* Can be used instead of using drawmodes & plates. Used for legacy viewport
+	 * right now, could likely be removed after that's removed too (TODO). */
+	void (*render)(const struct ViewportEngine *, const struct bContext *);
 
-	void (*draw)(const struct bContext *C);
+	/* First item is active one */
+	ListBase drawmodes; /* ViewportDrawMode */
 } ViewportEngineType;
 
 /* Engine Types */
@@ -51,6 +80,6 @@ void VP_enginetypes_exit(void);
 struct ViewportEngine *VP_engine_create(ViewportEngineType *engine_type) ATTR_NONNULL();
 void VP_engine_free(struct ViewportEngine *engine) ATTR_NONNULL();
 
-void VP_engine_render(const struct ViewportEngine *engine, const struct bContext *C);
+void VP_engine_render(struct ViewportEngine *engine, const struct bContext *C);
 
 #endif /* __VP_ENGINE_H__ */
diff --git a/source/blender/viewport/intern/blender_viewport/blender_viewport.c b/source/blender/viewport/intern/blender_viewport/blender_viewport.c
index 14ff48a..0f42c3a 100644
--- a/source/blender/viewport/intern/blender_viewport/blender_viewport.c
+++ b/source/blender/viewport/intern/blender_viewport/blender_viewport.c
@@ -63,14 +63,17 @@
 
 #include "WM_api.h"
 
-static void blender_viewport_engine_draw(const bContext *C);
+static void blender_viewport_engine_init(ViewportEngineType *engine_type);
+static void blender_viewport_engine_setup_render(ViewportEngine *engine, const bContext *C);
 
 ViewportEngineType vp_blender_viewport = {
 	NULL, NULL,
 	"BLENDER_VIEWPORT", N_("Modern Viewport"), /* TODO temp name */
-	blender_viewport_engine_draw,
+	blender_viewport_engine_init,
+	blender_viewport_engine_setup_render,
 };
 
+/* TODO this could become the RenderData equivalent for viewports (but less messy ;) ) */
 typedef struct DrawData {
 	rcti border_rect;
 	bool render_border;
@@ -880,30 +883,13 @@ static void draw_depth_buffer(const bContext *C, ARegion *ar)
 }
 #endif
 
-/* ******************** view loop ***************** */
-
-/**
- * Set the correct matrices
- */
-static void viewport_draw_setup_view(const bContext *C, ARegion *ar)
-{
-	Scene *scene = CTX_data_scene(C);
-	View3D *v3d = CTX_wm_view3d(C);
-	RegionView3D *rv3d = ar->regiondata;
-
-	/* setup the view matrix */
-	if (view3d_stereo3d_active(C, scene, v3d, rv3d))
-		view3d_stereo3d_setup(scene, v3d, ar);
-	else
-		view3d_main_region_setup_view(scene, v3d, ar, NULL, NULL);
-}
-
 /**
  * Required if the shaders need it or external engines
  * (e.g., Cycles requires depth buffer handled separately).
  */
-static void viewport_draw_prerender_buffers(const bContext *C, ARegion *ar, DrawData *draw_data)
+static void viewport_draw_prerender_buffers(const ViewportEngine *engine, const bContext *UNUSED(C))
 {
+	const DrawData *draw_data = engine->render_data;
 	/* TODO viewport */
 	if (draw_data->is_render && (!draw_data->clip_border)) {
 //		draw_depth_buffer(C, ar);
@@ -913,10 +899,11 @@ static void viewport_draw_prerender_buffers(const bContext *C, ARegion *ar, Draw
 /**
  * Draw all the plates that will fill the RGBD buffer
  */
-static void viewport_draw_solid_plates(const bContext *C, ARegion *ar, DrawData *draw_data)
+static void viewport_draw_solid_plates(const ViewportEngine *engine, const bContext *C)
 {
 	Scene *scene = CTX_data_scene(C);
 	View3D *v3d = CTX_wm_view3d(C);
+	const DrawData *draw_data = engine->render_data;
 
 	/* realtime plates */
 	if ((!draw_data->is_render) || draw_data->clip_border) {
@@ -928,6 +915,7 @@ static void viewport_draw_solid_plates(const bContext *C, ARegion *ar, DrawData
 
 	/* offline plates*/
 	if (draw_data->is_render) {
+		ARegion *ar = CTX_wm_region(C);
 		view3d_draw_render_draw(C, scene, ar, v3d, draw_data->clip_border, &draw_data->border_rect);
 	}
 }
@@ -935,7 +923,7 @@ static void viewport_draw_solid_plates(const bContext *C, ARegion *ar, DrawData
 /**
  * Wires, outline, ...
  */
-static void viewport_draw_geometry_overlay(const bContext *C)
+static void viewport_draw_geometry_overlay(const ViewportEngine *UNUSED(engine), const bContext *C)
 {
 	view3d_draw_wire_plates(C);
 	view3d_draw_outline_plates(C);
@@ -944,7 +932,7 @@ static void viewport_draw_geometry_overlay(const bContext *C)
 /**
 * Empties, lamps, parent lines, grid, ...
 */
-static void viewport_draw_other_elements(const bContext *C, ARegion *ar)
+static void viewport_draw_other_elements(const ViewportEngine *UNUSED(engine), const bContext *C)
 {
 	/* TODO viewport */
 	view3d_draw_grid(C, CTX_wm_region(C));
@@ -953,7 +941,7 @@ static void viewport_draw_other_elements(const bContext *C, ARegion *ar)
 /**
  * Paint brushes, armatures, ...
  */
-static void viewport_draw_tool_ui(const bContext *C)
+static void viewport_draw_tool_ui(const ViewportEngine *UNUSED(engine), const bContext *UNUSED(C))
 {
 	/* TODO viewport */
 }
@@ -961,7 +949,7 @@ static void viewport_draw_tool_ui(const bContext *C)
 /**
  * Blueprint images
  */
-static void viewport_draw_reference_images(const bContext *C)
+static void viewport_draw_reference_images(const ViewportEngine *UNUSED(engine), const bContext *UNUSED(C))
 {
 	/* TODO viewport */
 }
@@ -969,41 +957,59 @@ static void viewport_draw_reference_images(const bContext *C)
 /**
  * Grease Pencil
  */
-static void viewport_draw_grease_pencil(const bContext *C)
+static void viewport_draw_grease_pencil(const ViewportEngine *UNUSED(engine), const bContext *UNUSED(C))
 {
 	/* TODO viewport */
 }
 
-/**
- * This could run once per view, or even in parallel
- * for each of them. What is a "view"?
- * - a viewport with the camera elsewhere
- * - left/right stereo
- * - panorama / fisheye individual cubemap faces
- */
-static void viewport_draw_view(const bContext *C, ARegion *ar, DrawData *draw_data)
+static ViewportDrawPlate default_plates[] = {
+	{NULL, NULL, "PRERENDER_BUFFERS", viewport_draw_prerender_buffers},
+	{NULL, NULL, "SOLID_PLATES",      viewport_draw_solid_plates},
+	{NULL, NULL, "GEOMETRY_OVERLAY",  viewport_draw_geometry_overlay},
+	{NULL, NULL, "OTHER_ELEMENTS",    viewport_draw_other_elements},
+	{NULL, NULL, "TOOL_UI",           viewport_draw_tool_ui},
+	{NULL, NULL, "REFERENCE_IMAGES",  viewport_draw_reference_images},
+	{NULL, NULL, "GREASE_PENCIL",     viewport_draw_grease_pencil},
+	{NULL}
+};
+
+static void draw_mode_add_default_plates(ViewportDrawMode *mode)
 {
-	/* TODO - Technically this should be drawn to a few FBO, so we can handle
-	 * compositing better, but for now this will get the ball rolling (dfelinto) */
-
-	viewport_draw_setup_view(C, ar);
-	viewport_draw_prerender_buffers(C, ar, draw_data);
-	viewport_draw_solid_plates(C, ar, draw_data);
-	viewport_draw_geometr

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list