[Bf-blender-cvs] [d4c5c2d76b2] soc-2018-npr: Offline, DPIX, Snake working. no F12. DPIX draw intersection if cached.

Nick Wu noreply at git.blender.org
Sun Jul 1 03:58:50 CEST 2018


Commit: d4c5c2d76b26c8ef18c04cb256f6fecd02b37f00
Author: Nick Wu
Date:   Fri Jun 29 17:53:45 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rBd4c5c2d76b26c8ef18c04cb256f6fecd02b37f00

Offline, DPIX, Snake working. no F12. DPIX draw intersection if cached.

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

M	source/blender/draw/engines/lanpr/lanpr_all.h
M	source/blender/draw/engines/lanpr/lanpr_dpix.c
M	source/blender/draw/engines/lanpr/lanpr_engine.c
M	source/blender/draw/engines/lanpr/lanpr_ops.c
M	source/blender/draw/engines/lanpr/shaders/lanpr_atlas_preview.geometry
M	source/blender/draw/engines/lanpr/shaders/lanpr_atlas_project_clip.fragment

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

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index ecfe1770629..321b3323967 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -125,9 +125,6 @@ typedef struct LANPR_FramebufferList {
 	/* Software */
 	struct GPUFrameBuffer *software_ms;
 
-	/* MS Resolve */
-	struct GPUFrameBuffer *ms_resolve;
-
 } LANPR_FramebufferList;
 
 typedef struct LANPR_TextureList {
@@ -309,6 +306,9 @@ typedef struct LANPR_RenderBuffer {
 
 	nListHandle IntersectingVertexBuffer;
 
+	struct Gwn_Batch* DPIXIntersectionTransformBatch;
+	struct Gwn_Batch* DPIXIntersectionBatch;
+
 	/* use own-implemented one */
 	nStaticMemoryPool RenderDataPool;
 
@@ -771,10 +771,16 @@ int lanpr_feed_atlas_data_obj(void *vedata,
                               float *AtlasFaceNormalL, float *AtlasFaceNormalR,
                               float *AtlasEdgeMask,
                               Object *ob, int BeginIndex);
+
+int lanpr_feed_atlas_data_intersection_cache(void *vedata,
+                              float *AtlasPointsL, float *AtlasPointsR,
+                              float *AtlasFaceNormalL, float *AtlasFaceNormalR,
+                              float *AtlasEdgeMask,
+                              int BeginIndex);
+
 int lanpr_feed_atlas_trigger_preview_obj(void *vedata, Object *ob, int BeginIndex);
+void lanpr_create_atlas_intersection_preview(void *vedata, int BeginIndex) ;
 
-//DPIX
 void lanpr_dpix_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, LANPR_PassList *psl, LANPR_PrivateData *pd, SceneLANPR *lanpr, GPUFrameBuffer* DefaultFB);
 
-//snake
 void lanpr_snake_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, LANPR_PassList *psl, LANPR_PrivateData *pd, SceneLANPR *lanpr, GPUFrameBuffer* DefaultFB);
diff --git a/source/blender/draw/engines/lanpr/lanpr_dpix.c b/source/blender/draw/engines/lanpr/lanpr_dpix.c
index 794f12bc96a..00542b174bb 100644
--- a/source/blender/draw/engines/lanpr/lanpr_dpix.c
+++ b/source/blender/draw/engines/lanpr/lanpr_dpix.c
@@ -212,6 +212,56 @@ int lanpr_feed_atlas_data_obj(void *vedata,
 	return BeginIndex + edge_count;
 }
 
+int lanpr_feed_atlas_data_intersection_cache(void *vedata,
+                              float *AtlasPointsL, float *AtlasPointsR,
+                              float *AtlasFaceNormalL, float *AtlasFaceNormalR,
+                              float *AtlasEdgeMask,
+                              int BeginIndex) {
+	LANPR_StorageList *stl = ((LANPR_Data *)vedata)->stl;
+	LANPR_PrivateData *pd = stl->g_data;
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	SceneLANPR *lanpr = &draw_ctx->scene->lanpr;
+	LANPR_RenderBuffer *rb = lanpr->render_buffer;
+	nListItemPointer* lip;
+	LANPR_RenderLine* rl;
+	int i,idx;
+
+	i = 0;
+
+	if (!rb) return;
+
+	for (lip = rb->IntersectionLines.pFirst; lip; lip = lip->pNext) {
+		rl = lip->p;
+		
+		idx = (BeginIndex + i) * 4;
+		AtlasEdgeMask[idx + 2] = 1; // channel B
+
+		AtlasPointsL[idx + 0] = rl->L->GLocation[0];
+		AtlasPointsL[idx + 1] = rl->L->GLocation[1];
+		AtlasPointsL[idx + 2] = rl->L->GLocation[2];
+		AtlasPointsL[idx + 3] = 1;
+
+		AtlasPointsR[idx + 0] = rl->R->GLocation[0];
+		AtlasPointsR[idx + 1] = rl->R->GLocation[1];
+		AtlasPointsR[idx + 2] = rl->R->GLocation[2];
+		AtlasPointsR[idx + 3] = 1;
+
+		AtlasFaceNormalL[idx + 0] = 0;
+		AtlasFaceNormalL[idx + 1] = 0;
+		AtlasFaceNormalL[idx + 2] = 1;
+		AtlasFaceNormalL[idx + 3] = 0;
+
+		AtlasFaceNormalR[idx + 0] = 0;
+		AtlasFaceNormalR[idx + 1] = 0;
+		AtlasFaceNormalR[idx + 2] = 1;
+		AtlasFaceNormalR[idx + 3] = 0;
+		
+		i++;
+	}
+
+	return BeginIndex + i;
+}
+
 void lanpr_dpix_index_to_coord(int index, float *x, float *y){
 	(*x) = tnsLinearItp(-1, 1, (float)(index % TNS_DPIX_TEXTURE_SIZE + 0.5) / (float)TNS_DPIX_TEXTURE_SIZE);
 	(*y) = tnsLinearItp(-1, 1, (float)(index / TNS_DPIX_TEXTURE_SIZE + 0.5) / (float)TNS_DPIX_TEXTURE_SIZE);
@@ -267,6 +317,49 @@ int lanpr_feed_atlas_trigger_preview_obj(void *vedata, Object *ob, int BeginInde
 	return BeginIndex + edge_count;
 }
 
+void lanpr_create_atlas_intersection_preview(void *vedata, int BeginIndex) {
+	LANPR_StorageList *stl = ((LANPR_Data *)vedata)->stl;
+	LANPR_PrivateData *pd = stl->g_data;
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	SceneLANPR *lanpr = &draw_ctx->scene->lanpr;
+	LANPR_RenderBuffer *rb = lanpr->render_buffer;
+	float co[2];
+	int i;
+
+	if (!rb) return;
+
+	if(rb->DPIXIntersectionBatch) GWN_batch_discard(rb->DPIXIntersectionBatch);
+	rb->DPIXIntersectionBatch = 0;
+
+	if (!rb->IntersectionCount) return;
+
+	static Gwn_VertFormat format = { 0 };
+	static struct { uint pos, uvs; } attr_id;
+	if (format.attrib_ct == 0) {
+		attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
+	}
+	static Gwn_VertFormat format2 = { 0 };
+	static struct { uint pos, uvs; } attr_id2;
+	if (format2.attrib_ct == 0) {
+		attr_id2.pos = GWN_vertformat_attr_add(&format2, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
+	}
+
+	Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
+	GWN_vertbuf_data_alloc(vbo, rb->IntersectionCount);
+
+	Gwn_VertBuf *vbo2 = GWN_vertbuf_create_with_format(&format2);
+	GWN_vertbuf_data_alloc(vbo2, rb->IntersectionCount);
+
+	for (i=0;i<rb->IntersectionCount;i++) {
+		lanpr_dpix_index_to_coord(i + BeginIndex, &co[0], &co[1]);
+		GWN_vertbuf_attr_set(vbo, attr_id.pos, i, co);
+		lanpr_dpix_index_to_coord_absolute(i + BeginIndex, &co[0], &co[1]);
+		GWN_vertbuf_attr_set(vbo2, attr_id2.pos, i, co);
+	}
+	rb->DPIXIntersectionTransformBatch = GWN_batch_create_ex(GWN_PRIM_POINTS, vbo, 0, GWN_USAGE_STATIC | GWN_BATCH_OWNS_VBO);
+	rb->DPIXIntersectionBatch = GWN_batch_create_ex(GWN_PRIM_POINTS, vbo2, 0, GWN_USAGE_STATIC | GWN_BATCH_OWNS_VBO);
+}
+
 
 void lanpr_dpix_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, LANPR_PassList *psl, LANPR_PrivateData *pd, SceneLANPR *lanpr, GPUFrameBuffer* DefaultFB) {
 	float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index 24daeec608f..0e02cce0aca 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -98,6 +98,10 @@ static void lanpr_engine_init(void *ved){
 	DRW_texture_ensure_fullscreen_2D_multisample(&txl->normal, GPU_RGBA32F, 8, 0);
 	DRW_texture_ensure_fullscreen_2D_multisample(&txl->edge_intermediate, GPU_RGBA32F, 8, 0);
 
+	DRW_texture_ensure_fullscreen_2D_multisample(&txl->ms_resolve_depth, GPU_DEPTH_COMPONENT32F, 8, 0);
+	DRW_texture_ensure_fullscreen_2D_multisample(&txl->ms_resolve_color, GPU_RGBA32F, 8, 0);
+
+
 	GPU_framebuffer_ensure_config(&fbl->passes, {
 		GPU_ATTACHMENT_TEXTURE(txl->depth),
 		GPU_ATTACHMENT_TEXTURE(txl->color),
@@ -173,8 +177,8 @@ static void lanpr_engine_init(void *ved){
 	}
 
 	GPU_framebuffer_ensure_config(&fbl->software_ms, {
-		GPU_ATTACHMENT_TEXTURE(txl->depth),
-		GPU_ATTACHMENT_TEXTURE(txl->color),
+		GPU_ATTACHMENT_TEXTURE(txl->ms_resolve_depth),
+		GPU_ATTACHMENT_TEXTURE(txl->ms_resolve_color),
 		GPU_ATTACHMENT_LEAVE,
 		GPU_ATTACHMENT_LEAVE,
 		GPU_ATTACHMENT_LEAVE,
@@ -197,11 +201,14 @@ static void lanpr_engine_free(void){
 	GPU_framebuffer_free(fbl->passes);
 	GPU_framebuffer_free(fbl->edge_intermediate);
 	GPU_framebuffer_free(fbl->edge_thinning);
+	GPU_framebuffer_free(fbl->software_ms);
 
 	DRW_texture_free(txl->depth);
 	DRW_texture_free(txl->color);
 	DRW_texture_free(txl->normal);
 	DRW_texture_free(txl->edge_intermediate);
+	DRW_texture_free(txl->ms_resolve_depth);
+	DRW_texture_free(txl->ms_resolve_color);
 
 	BLI_mempool_destroy(stl->g_data->mp_line_strip);
 	BLI_mempool_destroy(stl->g_data->mp_line_strip_point);
@@ -278,7 +285,7 @@ static void lanpr_cache_init(void *vedata){
 		DRW_shgroup_call_add(stl->g_data->edge_thinning_shgrp, quad, NULL);
 
 	}
-	elif (lanpr->master_mode == LANPR_MASTER_MODE_SNAKE && lanpr->active_layer) {
+	elif (lanpr->master_mode == LANPR_MASTER_MODE_DPIX && lanpr->active_layer) {
 		LANPR_LineLayer* ll = lanpr->active_layer;
 		psl->dpix_transform_pass = DRW_pass_create("DPIX Transform Stage", DRW_STATE_WRITE_COLOR);
 		stl->g_data->dpix_transform_shgrp = DRW_shgroup_create(OneTime.dpix_transform_shader, psl->dpix_transform_pass);
@@ -296,6 +303,7 @@ static void lanpr_cache_init(void *vedata){
 		DRW_shgroup_uniform_int(stl->g_data->dpix_transform_shgrp, "enable_crease", &ll->enable_crease, 1);
 		DRW_shgroup_uniform_int(stl->g_data->dpix_transform_shgrp, "enable_material", &ll->enable_material_seperate, 1);
 		DRW_shgroup_uniform_int(stl->g_data->dpix_transform_shgrp, "enable_edge_mark", &ll->enable_edge_mark, 1);
+		DRW_shgroup_uniform_int(stl->g_data->dpix_transform_shgrp, "enable_intersection", &ll->enable_intersection, 1);
 
 		psl->dpix_preview_pass = DRW_pass_create("DPIX Preview", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL);
 		stl->g_data->dpix_preview_shgrp = DRW_shgroup_create(OneTime.dpix_preview_shader, psl->dpix_preview_pass);
@@ -307,6 +315,7 @@ static void lanpr_cache_init(void *vedata){
 		DRW_shgroup_uniform_vec4(stl->g_data->dpix_preview_shgrp, "crease_color", ll->crease_color, 1);
 		DRW_shgroup_uniform_vec4(stl->g_data->dpix_preview_shgrp, "material_color", ll->material_color, 1);
 		DRW_shgroup_uniform_vec4(stl->g_data->dpix_preview_shgrp, "edge_mark_color", ll->edge_mark_color, 1);
+		DRW_shgroup_uniform_vec4(stl->g_data->dpix_preview_shgrp, "intersection_color", ll->intersection_color, 1);
 		DRW_shgroup_uniform_vec4(stl->g_data->dpix_preview_shgrp, "background_color", lanpr->background_color, 1);
 		//DRW_shgroup_uniform_vec4(stl->g_data->dpix_preview_shgrp, "line_color", ll->line_color, 1); //we have color
 		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "depth_offset", &stl->g_data->dpix_depth_offset, 1);
@@ -318,6 +327,7 @@ static void lanpr_cache_init(void *vedata){
 		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "line_thickness_crease", &ll->thickness_crease, 1);
 		DRW_shgroup_uniform_float(stl->g_data->dpix_preview_shgrp, "line_thickness_mat

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list