[Bf-blender-cvs] [b421eaa36d8] soc-2018-npr: Chain first level preview ok. Simplification have bugs.
Nick Wu
noreply at git.blender.org
Fri Jul 20 15:07:11 CEST 2018
Commit: b421eaa36d88d38988165176fe07a85b91edb7cd
Author: Nick Wu
Date: Fri Jul 20 21:06:36 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rBb421eaa36d88d38988165176fe07a85b91edb7cd
Chain first level preview ok. Simplification have bugs.
===================================================================
M source/blender/draw/engines/lanpr/lanpr_all.h
M source/blender/draw/engines/lanpr/lanpr_chain.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_software_line_width.geometry
M source/blender/draw/engines/lanpr/shaders/lanpr_software_scale_compensate.vertex
M source/blender/makesdna/DNA_lanpr_types.h
===================================================================
diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index d5a24d758e6..158a9057ef3 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -467,11 +467,12 @@ typedef struct LANPR_RenderLineChain {
nListItem Item;
nListHandle Chain;
//int SegmentCount; // we count before draw cmd.
+ float Length; // calculated before draw cmd.
}LANPR_RenderLineChain;
typedef struct LANPR_RenderLineChainItem {
nListItem Item;
- float pos[2];
+ float pos[3]; // need z value for fading
char LineType; // style of [1] style of [2]
char OccludeLevel; // [1]--------------->[2]---------------->[3]--....
}LANPR_RenderLineChainItem;
diff --git a/source/blender/draw/engines/lanpr/lanpr_chain.c b/source/blender/draw/engines/lanpr/lanpr_chain.c
index c592c373cc1..834a458eb98 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -87,6 +87,8 @@ LANPR_RenderLineChainItem* lanpr_append_render_line_chain_point(LANPR_RenderBuff
rlci->LineType = type&LANPR_EDGE_FLAG_ALL_TYPE;
lstAppendItem(&rlc->Chain,rlci);
+ //printf("a %f %f\n", x, y);
+
return rlci;
}
@@ -99,6 +101,8 @@ LANPR_RenderLineChainItem* lanpr_push_render_line_chain_point(LANPR_RenderBuffer
rlci->LineType = type&LANPR_EDGE_FLAG_ALL_TYPE;
lstPushItem(&rlc->Chain,rlci);
+ //printf("p %f %f\n", x, y);
+
return rlci;
}
@@ -155,7 +159,7 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
ba = lanpr_GetPointBoundingArea(rb,rl->L->FrameBufferCoord[0], rl->L->FrameBufferCoord[1]);
new_rv = rl->L;
lanpr_push_render_line_chain_point(rb,rlc,new_rv->FrameBufferCoord[0],new_rv->FrameBufferCoord[1],rl->Flags,0);
- while(new_rl = lanpr_GetConnectedRenderLine(ba,new_rv,&new_rv)){
+ while(ba &&(new_rl = lanpr_GetConnectedRenderLine(ba,new_rv,&new_rv))){
new_rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
int last_occlude;
@@ -198,7 +202,7 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
new_rv = rl->R;
// below already done in step 2
// lanpr_push_render_line_chain_point(rb,rlc,new_rv->FrameBufferCoord[0],new_rv->FrameBufferCoord[1],rl->Flags,0);
- while(new_rl = lanpr_GetConnectedRenderLine(ba,new_rv,&new_rv)){
+ while(ba && (new_rl = lanpr_GetConnectedRenderLine(ba,new_rv,&new_rv))){
new_rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
int last_occlude;
@@ -226,11 +230,18 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
ba = lanpr_GetPointBoundingArea(rb, new_rv->FrameBufferCoord[0], new_rv->FrameBufferCoord[1]);
}
+ //LANPR_RenderLineChainItem* rlci;
+ //printf("line:\n");
+ //for (rlci = rlc->Chain.pFirst; rlci; rlci = rlci->Item.pNext) {
+ // printf(" %f %f\n", rlci->pos[0],rlci->pos[1]);
+ //}
+ //printf("--------\n");
+
//lanpr_reduce_render_line_chain_recursive(rlc,rlc->Chain.pFirst, rlc->Chain.pLast, dist_threshold);
}
}
-int lanpr_CountChainVertices(LANPR_RenderLineChain* rlc){
+int lanpr_CountChain(LANPR_RenderLineChain* rlc){
LANPR_RenderLineChainItem* rlci;
int Count = 0;
for (rlci = rlc->Chain.pFirst; rlci; rlci = rlci->Item.pNext) {
@@ -239,19 +250,39 @@ int lanpr_CountChainVertices(LANPR_RenderLineChain* rlc){
return Count;
}
+float lanpr_ComputeChainLength(LANPR_RenderLineChain* rlc, float* lengths, int begin_index) {
+ LANPR_RenderLineChainItem* rlci;
+ int i=0;
+ float offset_accum = 0;
+ float dist;
+ float last_point[2];
+
+ rlci = rlc->Chain.pFirst;
+ copy_v2_v2(last_point, rlci->pos);
+ for (rlci = rlc->Chain.pFirst; rlci; rlci = rlci->Item.pNext) {
+ dist = len_v2v2(rlci->pos, last_point);
+ offset_accum += dist;
+ lengths[begin_index + i] = offset_accum;
+ copy_v2_v2(last_point, rlci->pos);
+ i++;
+ }
+ return offset_accum;
+}
+
void lanpr_ChainGenerateDrawCommand(LANPR_RenderBuffer *rb){
LANPR_RenderLineChain* rlc;
LANPR_RenderLineChainItem* rlci;
- int vert_count;
+ int vert_count=0;
int i=0;
- float last_point[2];
- float offset_accum=0;
+ float total_length;
+ float* lengths;
+ float length_target[2];
static Gwn_VertFormat format = { 0 };
static struct { uint pos, offset, type, level; } attr_id;
if (format.attr_len == 0) {
attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
- attr_id.offset = GWN_vertformat_attr_add(&format, "offset", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
+ attr_id.offset = GWN_vertformat_attr_add(&format, "uvs", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
attr_id.type = GWN_vertformat_attr_add(&format, "type", GWN_COMP_I32, 1, GWN_FETCH_FLOAT);
attr_id.level = GWN_vertformat_attr_add(&format, "level", GWN_COMP_I32, 1, GWN_FETCH_INT);
}
@@ -259,35 +290,55 @@ void lanpr_ChainGenerateDrawCommand(LANPR_RenderBuffer *rb){
Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
for(rlc = rb->Chains.pFirst; rlc;rlc=rlc->Item.pNext){
- int count = lanpr_CountChainVertices(rlc);
+ int count = lanpr_CountChain(rlc);
printf("seg contains %d verts\n", count);
vert_count += count;
}
- GWN_vertbuf_data_alloc(vbo, vert_count);
+ GWN_vertbuf_data_alloc(vbo, vert_count+1); // serve as end point's adj.
- //Gwn_IndexBufBuilder elb;
- //GWN_indexbuf_init_ex(&elb, GWN_PRIM_LINES_ADJ, vert_count, vert_count, true);// elem count will not exceed vert_count (even including prim_restart)
+ lengths = MEM_callocN(sizeof(float)*vert_count, "chain lengths");
+
+ Gwn_IndexBufBuilder elb;
+ GWN_indexbuf_init_ex(&elb, GWN_PRIM_LINES_ADJ, vert_count*4, vert_count, true);// elem count will not exceed vert_count
+
+ int debc = 0;
for(rlc = rb->Chains.pFirst; rlc; rlc=rlc->Item.pNext){
- rlci = rlc->Chain.pFirst;
- copy_v2_v2(last_point, rlci->pos);
- for (rlci; rlci; rlci = rlci->Item.pNext) {
+ //if (debc == 1) break;
+ debc++;
+
+ total_length = lanpr_ComputeChainLength(rlc, lengths, i);
+
+ for (rlci = rlc->Chain.pFirst; rlci; rlci = rlci->Item.pNext) {
+
+ length_target[0] = lengths[i];
+ length_target[1] = total_length - lengths[i];
GWN_vertbuf_attr_set(vbo, attr_id.pos, i, rlci->pos);
- GWN_vertbuf_attr_set(vbo, attr_id.offset, i, &offset_accum);
+ GWN_vertbuf_attr_set(vbo, attr_id.offset, i, length_target);
- offset_accum += len_v2v2(rlci->pos,last_point);
- copy_v2_v2(last_point, rlci->pos);
+ if (rlci == rlc->Chain.pLast) { i++; continue; }
- //if(i==0)GWN_indexbuf_add_line_adj_verts(&elb, 0, 0, 1, 2);
- //elif(i==vert_count-2)GWN_indexbuf_add_line_adj_verts(&elb, i-1, i, i+1, i+1);
- //elif(i<vert_count-2)GWN_indexbuf_add_line_adj_verts(&elb, i-1, i, i+1, i+2);
+ if (rlci == rlc->Chain.pFirst) {
+ if (rlci->Item.pNext == rlc->Chain.pLast) GWN_indexbuf_add_line_adj_verts(&elb, vert_count, i, i + 1, vert_count);
+ else GWN_indexbuf_add_line_adj_verts(&elb, vert_count, i, i + 1, i + 2);
+ }
+ else {
+ if (rlci->Item.pNext == rlc->Chain.pLast) GWN_indexbuf_add_line_adj_verts(&elb, i-1, i, i + 1, vert_count);
+ else GWN_indexbuf_add_line_adj_verts(&elb, i-1, i, i + 1, i + 2);
+ }
- i++;
+ i++;
}
}
+ //set end point flag value.
+ length_target[0] = 3e30f;
+ length_target[1] = 3e30f;
+ GWN_vertbuf_attr_set(vbo, attr_id.pos, vert_count, length_target);
+
+ MEM_freeN(lengths);
- rb->ChainDrawBatch = GWN_batch_create_ex(GWN_PRIM_LINE_STRIP, vbo, 0, GWN_USAGE_DYNAMIC | GWN_BATCH_OWNS_VBO);
+ rb->ChainDrawBatch = GWN_batch_create_ex(GWN_PRIM_LINES_ADJ, vbo, GWN_indexbuf_build(&elb), GWN_USAGE_DYNAMIC | GWN_BATCH_OWNS_VBO);
}
\ No newline at end of file
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index e2576d691af..7f27bb06ee1 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -348,27 +348,7 @@ static void lanpr_cache_init(void *vedata){
}
} elif(lanpr->master_mode == LANPR_MASTER_MODE_SOFTWARE)
{
- psl->software_pass = DRW_pass_create("Software Render Preview", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL);
- lanpr->render_buffer->ChainShgrp = DRW_shgroup_create(OneTime.software_shader, psl->software_pass);
- if (lanpr->render_buffer->ChainDrawBatch){
- LANPR_LineLayer *ll;
- for (ll = lanpr->line_layers.first; ll; ll = ll->next) {
- ll->shgrp = DRW_shgroup_create(OneTime.software_shader, psl->software_pass);
- DRW_shgroup_uniform_vec4(ll->shgrp, "color", ll->color, 1);
- DRW_shgroup_uniform_vec4(ll->shgrp, "crease_color", ll->crease_color, 1);
- DRW_shgroup_uniform_vec4(ll->shgrp, "material_color", ll->material_color, 1);
- DRW_shgroup_uniform_vec4(ll->shgrp, "edge_mark_color", ll->edge_mark_color, 1);
- DRW_shgroup_uniform_vec4(ll->shgrp, "intersection_color", ll->intersection_color, 1);
- DRW_shgroup_uniform_float(ll->shgrp, "thickness_crease", &ll->thickness_crease, 1);
- DRW_shgroup_uniform_float(ll->shgrp, "thickness_material", &ll->thickness_material, 1);
- DRW_shgroup_uniform_float(ll->shgrp, "thickness_edge_mark", &ll->thickness_edge_mark, 1);
- DRW_shgroup_uniform_float(ll->shgrp, "thickness_intersection", &ll->thickness_intersection, 1);
- DRW_shgroup_uniform_vec4(ll->shgrp, "preview_viewport", stl->g_data->dpix_viewport, 1);
- DRW_shgroup_uniform_vec4(ll->shgrp, "output_viewport", stl->g_data->output_viewport, 1);
- DRW_shgroup_uniform_float(ll->shgrp, "thickness", &ll->thickness, 1);
- DRW_shgroup_call_add(ll->shgrp, lanpr->render_buffer->ChainDrawBatch, NULL);
- }
- }
+ ;
/*LANPR_LineLayer *ll;
for (ll = lanpr->line_layers.first; ll; ll = ll->next) {
ll->shgrp = DRW_shgroup_create(OneTime.software_shader, psl->software_pass);
@@ -502,21 +482,51 @@ static void lanpr_draw_scene_exec(v
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list