[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