[Bf-blender-cvs] [1d0245b3962] greasepencil-object: Move Render code to separate file

Antonio Vazquez noreply at git.blender.org
Fri May 11 20:02:29 CEST 2018


Commit: 1d0245b396288b06360aa7e0d4f7ceb6a09445ee
Author: Antonio Vazquez
Date:   Fri May 11 20:02:20 2018 +0200
Branches: greasepencil-object
https://developer.blender.org/rB1d0245b396288b06360aa7e0d4f7ceb6a09445ee

Move Render code to separate file

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/engines/gpencil/gpencil_engine.h
A	source/blender/draw/engines/gpencil/gpencil_render.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 906de39adf7..12fd23a5862 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -112,6 +112,7 @@ set(SRC
 	engines/external/external_engine.c
 	engines/gpencil/gpencil_engine.h
 	engines/gpencil/gpencil_engine.c
+	engines/gpencil/gpencil_render.c
 	engines/gpencil/gpencil_cache_utils.c
 	engines/gpencil/gpencil_draw_cache_impl.c
 	engines/gpencil/gpencil_geom.c
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 00cc420dd4a..9dd637a6e56 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -22,12 +22,9 @@
 /** \file blender/draw/engines/gpencil/gpencil_engine.c
  *  \ingroup draw
  */
-#include "BLI_rect.h" 
-
 #include "DRW_engine.h"
 #include "DRW_render.h"
 
-#include "BKE_global.h"
 #include "BKE_camera.h"
 #include "BKE_object.h"
 #include "BKE_paint.h"
@@ -42,8 +39,6 @@
 
 #include "UI_resources.h"
 
-#include "RE_pipeline.h"
-
 #include "GPU_texture.h"
 
 #include "gpencil_engine.h"
@@ -173,7 +168,7 @@ static void GPENCIL_create_shaders(void)
 	}
 }
 
-static void GPENCIL_engine_init(void *vedata)
+void GPENCIL_engine_init(void *vedata)
 {
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
 	
@@ -213,7 +208,7 @@ static void GPENCIL_engine_free(void)
 	DRW_TEXTURE_FREE_SAFE(e_data.gpencil_blank_texture);
 }
 
-static void GPENCIL_cache_init(void *vedata)
+void GPENCIL_cache_init(void *vedata)
 {
 	GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
@@ -393,7 +388,7 @@ static void GPENCIL_cache_init(void *vedata)
 	}
 }
 
-static void GPENCIL_cache_populate(void *vedata, Object *ob)
+void GPENCIL_cache_populate(void *vedata, Object *ob)
 {
 	/* object must be visible */
 	if (!DRW_check_object_visible_within_active_context(ob)) {
@@ -434,7 +429,7 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob)
 	}
 }
 
-static void GPENCIL_cache_finish(void *vedata)
+void GPENCIL_cache_finish(void *vedata)
 {
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
 	const DRWContextState *draw_ctx = DRW_context_state_get();
@@ -523,7 +518,7 @@ static void gpencil_free_obj_list(GPENCIL_StorageList *stl)
 }
 
 /* draw scene */
-static void GPENCIL_draw_scene(void *vedata)
+void GPENCIL_draw_scene(void *vedata)
 {
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
 
@@ -656,340 +651,6 @@ static void GPENCIL_draw_scene(void *vedata)
 	}
 }
 
-/* Get pixel size for render 
- * This function uses the same calculation used for viewport, because if use
- * camera pixelsize, the result is not correct.
- */
-static float get_render_pixelsize(float persmat[4][4], int winx, int winy)
-{
-	float v1[3], v2[3];
-	float len_px, len_sc;
-
-	v1[0] = persmat[0][0];
-	v1[1] = persmat[1][0];
-	v1[2] = persmat[2][0];
-
-	v2[0] = persmat[0][1];
-	v2[1] = persmat[1][1];
-	v2[2] = persmat[2][1];
-
-	len_px = 2.0f / sqrtf(min_ff(len_squared_v3(v1), len_squared_v3(v2)));
-	len_sc = (float)MAX2(winx, winy);
-
-	return len_px / len_sc;
-}
-
-/* create a multisample buffer if not present */
-static void DRW_framebuffer_multisample_ensure(DefaultFramebufferList *dfbl, DefaultTextureList *dtxl, int rect_w, int rect_h)
-{
-	if (U.ogl_multisamples > 0) {
-		if (!dfbl->multisample_fb) {
-			dfbl->multisample_fb = GPU_framebuffer_create();
-			if (dfbl->multisample_fb) {
-				dtxl->multisample_color = GPU_texture_create_2D_multisample(rect_w, rect_h, GPU_RGBA8, NULL, U.ogl_multisamples, NULL);
-				dtxl->multisample_depth = GPU_texture_create_2D_multisample(rect_w, rect_h, GPU_DEPTH24_STENCIL8, NULL, U.ogl_multisamples, NULL);
-				GPU_framebuffer_ensure_config(&dfbl->multisample_fb, {
-					GPU_ATTACHMENT_TEXTURE(dtxl->multisample_depth),
-					GPU_ATTACHMENT_TEXTURE(dtxl->multisample_color)
-					});
-				if (!GPU_framebuffer_check_valid(dfbl->multisample_fb, NULL)) {
-					GPU_framebuffer_free(dfbl->multisample_fb);
-				}
-			}
-		}
-	}
-}
-
-/* init render data */
-static void GPENCIL_render_init(GPENCIL_Data *ved, RenderEngine *engine, struct Depsgraph *depsgraph)
-{
-	GPENCIL_Data *vedata = (GPENCIL_Data *)ved;
-	GPENCIL_StorageList *stl = vedata->stl;
-	GPENCIL_FramebufferList *fbl = vedata->fbl;
-
-	Scene *scene = DEG_get_evaluated_scene(depsgraph);
-	const float *viewport_size = DRW_viewport_size_get();
-	const int size[2] = { (int)viewport_size[0], (int)viewport_size[1] };
-
-	/* In render mode the default framebuffer is not generated
-	* because there is no viewport. So we need to manually create one 
-	* NOTE : use 32 bit format for precision in render mode. 
-	*/
-	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
-	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
-
-	/* create multiframe framebuffer for AA */
-	if (U.ogl_multisamples > 0) {
-		int rect_w = (int)viewport_size[0];
-		int rect_h = (int)viewport_size[1];
-		DRW_framebuffer_multisample_ensure(dfbl, dtxl, rect_w, rect_h);
-	}
-
-	e_data.render_depth_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_DEPTH24_STENCIL8,
-		&draw_engine_object_type);
-	e_data.render_color_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA32F,
-		&draw_engine_object_type);
-	GPU_framebuffer_ensure_config(&fbl->main, {
-		GPU_ATTACHMENT_TEXTURE(e_data.render_depth_tx),
-		GPU_ATTACHMENT_TEXTURE(e_data.render_color_tx)
-		});
-
-	/* Alloc transient data. */
-	if (!stl->g_data) {
-		stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
-	}
-
-	/* Set the pers & view matrix. */
-	struct Object *camera = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re));
-	float frame = BKE_scene_frame_get(scene);
-	RE_GetCameraWindow(engine->re, camera, frame, stl->storage->winmat);
-	RE_GetCameraModelMatrix(engine->re, camera, stl->storage->viewinv);
-
-	invert_m4_m4(stl->storage->viewmat, stl->storage->viewinv);
-	mul_m4_m4m4(stl->storage->persmat, stl->storage->winmat, stl->storage->viewmat);
-	invert_m4_m4(stl->storage->persinv, stl->storage->persmat);
-	invert_m4_m4(stl->storage->wininv, stl->storage->winmat);
-
-	DRW_viewport_matrix_override_set(stl->storage->persmat, DRW_MAT_PERS);
-	DRW_viewport_matrix_override_set(stl->storage->persinv, DRW_MAT_PERSINV);
-	DRW_viewport_matrix_override_set(stl->storage->winmat, DRW_MAT_WIN);
-	DRW_viewport_matrix_override_set(stl->storage->wininv, DRW_MAT_WININV);
-	DRW_viewport_matrix_override_set(stl->storage->viewmat, DRW_MAT_VIEW);
-	DRW_viewport_matrix_override_set(stl->storage->viewinv, DRW_MAT_VIEWINV);
-
-	/* calculate pixel size for render */
-	stl->storage->render_pixsize = get_render_pixelsize(stl->storage->persmat, viewport_size[0], viewport_size[1]);
-	/* INIT CACHE */
-	GPENCIL_cache_init(vedata);
-}
-
-/* render all objects and select only grease pencil */
-static void GPENCIL_render_cache(
-	void *vedata, struct Object *ob,
-	struct RenderEngine *UNUSED(engine), struct Depsgraph *UNUSED(depsgraph))
-{
-	if ((ob == NULL) || (DRW_check_object_visible_within_active_context(ob) == false)) {
-		return;
-	}
-
-	if (ob->type == OB_GPENCIL) {
-		GPENCIL_cache_populate(vedata, ob);
-	}
-}
-
-/* TODO: Reuse Eevee code in shared module instead to duplicate here */
-static void GPENCIL_render_update_viewvecs(float invproj[4][4], float winmat[4][4], float(*r_viewvecs)[4])
-{
-	/* view vectors for the corners of the view frustum.
-	* Can be used to recreate the world space position easily */
-	float view_vecs[4][4] = {
-		{ -1.0f, -1.0f, -1.0f, 1.0f },
-	{ 1.0f, -1.0f, -1.0f, 1.0f },
-	{ -1.0f,  1.0f, -1.0f, 1.0f },
-	{ -1.0f, -1.0f,  1.0f, 1.0f }
-	};
-
-	/* convert the view vectors to view space */
-	const bool is_persp = (winmat[3][3] == 0.0f);
-	for (int i = 0; i < 4; i++) {
-		mul_project_m4_v3(invproj, view_vecs[i]);
-		/* normalized trick see:
-		* http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer */
-		if (is_persp) {
-			/* Divide XY by Z. */
-			mul_v2_fl(view_vecs[i], 1.0f / view_vecs[i][2]);
-		}
-	}
-
-	/**
-	* If ortho : view_vecs[0] is the near-bottom-left corner of the frustum and
-	*            view_vecs[1] is the vector going from the near-bottom-left corner to
-	*            the far-top-right corner.
-	* If Persp : view_vecs[0].xy and view_vecs[1].xy are respectively the bottom-left corner
-	*            when Z = 1, and top-left corner if Z = 1.
-	*            view_vecs[0].z the near clip distance and view_vecs[1].z is the (signed)
-	*            distance from the near plane to the far clip plane.
-	**/
-	copy_v4_v4(r_viewvecs[0], view_vecs[0]);
-
-	/* we need to store the differences */
-	r_viewvecs[1][0] = view_vecs[1][0] - view_vecs[0][0];
-	r_viewvecs[1][1] = view_vecs[2][1] - view_vecs[0][1];
-	r_viewvecs[1][2] = view_vecs[3][2] - view_vecs[0][2];
-}
-
-/* Update view_vecs */
-static void GPENCIL_render_update_vecs(GPENCIL_Data *vedata)
-{
-	GPENCIL_StorageList *stl = vedata->stl;
-
-	float invproj[4][4], winmat[4][4];
-	DRW_viewport_matrix_get(winmat, DRW_MAT_WIN);
-	DRW_viewport_matrix_get(invproj, DRW_MAT_WININV);
-
-	/* this is separated to keep function equal to Eevee for future reuse of same code */
-	GPENCIL_render_update_viewvecs(invproj, winmat, stl->storage->view_vecs);
-}
-
-/* read z-depth render result */
-static void GPENCIL_render_result_z(struct RenderLayer *rl, const char *viewname, GPENCIL_Data *vedata, const rcti *rect)
-{
-	const DRWContextState *draw_ctx = DRW_context_state_get();
-	ViewLayer *view_layer = draw_ctx->view_layer;
-	GPENCIL_StorageList *stl = vedata->stl;
-
-	if ((view_layer->passflag & SCE_PASS_Z) != 0) {
-		RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_Z, viewname);
-
-		GPU_framebuffer_read_depth(vedata->fbl->main, rect->xmin, rect->ymin, BLI_rcti_size_x(rect), BLI_rcti_size_y(rect), rp->rect);
-
-		bool is_persp = DRW_viewport_is_persp_get();
-
-		GPENCIL_render_update_vecs(vedata);
-
-		/* Convert ogl depth [0..1] to view Z [near..far] */
-		for (int i = 0; i < BLI_rcti_size_x(rect) * BLI_rcti_size_y(rect); i++) {
-			if (rp->rect[i] == 1.0f) {
-				rp->rect[i] = 1e10f; /* Background */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list