[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