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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to