Commit: 0d1bf0623b4767d8e688b509277f1f64130a839e Author: YimingWu Date: Thu May 30 15:16:58 2019 +0800 Branches: soc-2019-npr https://developer.blender.org/rB0d1bf0623b4767d8e688b509277f1f64130a839e
Adding lanpr to grease pencil strokes modifier. =================================================================== M release/datafiles/locale M release/scripts/addons M release/scripts/addons_contrib M release/scripts/startup/bl_ui/properties_data_modifier.py M source/blender/draw/CMakeLists.txt A source/blender/draw/engines/lanpr/lanpr_access.c A source/blender/draw/engines/lanpr/lanpr_access.h M source/blender/draw/engines/lanpr/lanpr_all.h M source/blender/draw/engines/lanpr/lanpr_chain.c A source/blender/draw/engines/lanpr/lanpr_data_types.h M source/blender/draw/engines/lanpr/lanpr_engine.c M source/blender/draw/engines/lanpr/lanpr_ops.c M source/blender/draw/engines/lanpr/lanpr_snake.c M source/blender/draw/engines/lanpr/lanpr_util.c M source/blender/draw/engines/lanpr/lanpr_util.h M source/blender/gpencil_modifiers/CMakeLists.txt M source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h M source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c A source/blender/gpencil_modifiers/intern/MOD_gpencilstroke.c M source/blender/makesdna/DNA_gpencil_modifier_types.h M source/blender/makesrna/RNA_access.h M source/blender/makesrna/intern/rna_gpencil_modifier.c M source/tools =================================================================== diff --git a/release/datafiles/locale b/release/datafiles/locale index 469c949d1ca..ad82c4ce43e 160000 --- a/release/datafiles/locale +++ b/release/datafiles/locale @@ -1 +1 @@ -Subproject commit 469c949d1ca882be19daa128842f813b72a944d8 +Subproject commit ad82c4ce43ef2801ef51e75af1f9702992478b02 diff --git a/release/scripts/addons b/release/scripts/addons index c88411ff777..8e6f485cf5b 160000 --- a/release/scripts/addons +++ b/release/scripts/addons @@ -1 +1 @@ -Subproject commit c88411ff7776a2db5d6ef6117a1b2faa42a95611 +Subproject commit 8e6f485cf5b160c425d7da7c743879b20f3d6a96 diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib index 310578043de..7077ff07384 160000 --- a/release/scripts/addons_contrib +++ b/release/scripts/addons_contrib @@ -1 +1 @@ -Subproject commit 310578043dec1aae382eb6a447ae1d103792d7e6 +Subproject commit 7077ff07384491d1f7630484995557f1c7302dae diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 5b83cfe354e..a2c19ebbd74 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -2243,6 +2243,27 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel): sub = row.row(align=True) sub.active = bool(md.vertex_group) sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT') + + def GP_STROKE(self, layout, ob, md): + gpd = ob.data + + col = layout.column() + col.prop(md, "offset_object", text="Object") + + col = layout.column() + col.separator() + col.label(text="Material:") + row = col.row(align=True) + row.prop(md, "pass_index", text="Pass") + row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT') + + col.label(text="Layer:") + row = col.row(align=True) + row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL') + row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT') + row = layout.row(align=True) + row.prop(md, "layer_pass", text="Pass") + row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT') classes = ( diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 3cdf07fd7ff..1e44cae7a8c 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -132,7 +132,7 @@ set(SRC engines/lanpr/lanpr_ops.c engines/lanpr/lanpr_util.c engines/lanpr/lanpr_chain.c - + engines/lanpr/lanpr_access.c DRW_engine.h intern/DRW_render.h @@ -159,6 +159,8 @@ set(SRC engines/workbench/workbench_private.h engines/lanpr/lanpr_util.h engines/lanpr/lanpr_all.h + engines/lanpr/lanpr_access.h + engines/lanpr/lanpr_data_types.h ) set(LIB diff --git a/source/blender/draw/engines/lanpr/lanpr_access.c b/source/blender/draw/engines/lanpr/lanpr_access.c new file mode 100644 index 00000000000..f618888e256 --- /dev/null +++ b/source/blender/draw/engines/lanpr/lanpr_access.c @@ -0,0 +1,233 @@ +#include "DNA_gpencil_types.h" +#include "DNA_gpencil_modifier_types.h" + +#include "BLI_blenlib.h" +#include "BLI_rand.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" +#include "BLI_linklist.h" +#include "BLI_alloca.h" + +#include "BKE_gpencil.h" +#include "BKE_gpencil_modifier.h" +#include "BKE_modifier.h" +#include "BKE_context.h" +#include "BKE_global.h" +#include "BKE_object.h" +#include "BKE_main.h" +#include "BKE_scene.h" +#include "BKE_layer.h" +#include "BKE_library_query.h" +#include "BKE_collection.h" +#include "BKE_mesh.h" +#include "BKE_mesh_mapping.h" + +#include "lanpr_all.h" + +static BMVert* split_edge_and_move(BMesh *bm, BMEdge *edge, const float new_pos[3]){ + //Split edge one time and move the created vert to new_pos + BMVert *vert; + + vert = bmesh_kernel_split_edge_make_vert(bm, edge->v1, edge, NULL); + + copy_v3_v3(vert->co, new_pos); + + return vert; +} + +void lanpr_generate_gpencil_geometry( + GpencilModifierData *md, Depsgraph *depsgraph, + Object *ob, bGPDlayer *gpl, bGPDframe *gpf) +{ + StrokeGpencilModifierData *gpmd = (StrokeGpencilModifierData *)md; + Scene *scene = DEG_get_evaluated_scene(depsgraph); + LANPR_RenderBuffer *rb = scene->lanpr.render_buffer; + + if( gpmd->object == NULL ){ + printf("NULL object!\n"); + return; + } + + if( rb == NULL ){ + printf("NULL LANPR rb!\n"); + return; + } + + int color_idx = 0; + int tot_points = 0; + short thickness = 1; + + float mat[4][4]; + + unit_m4(mat); + + BMesh *bm; + + bm = BKE_mesh_to_bmesh_ex( + gpmd->object->data, + &(struct BMeshCreateParams){0}, + &(struct BMeshFromMeshParams){ + .calc_face_normal = true, + .cd_mask_extra = CD_MASK_ORIGINDEX, + }); + + //Split countour lines at occlution points and deselect occluded segment + LANPR_RenderLine *rl; + LANPR_RenderLineSegment *rls, *irls; + for (rl = rb->all_render_lines.first; rl; rl = rl->item.next) { + BMEdge *e = BM_edge_at_index_find(bm, rl->edge_idx); + BMVert *v1 = e->v1; //Segment goes from v1 to v2 + BMVert *v2 = e->v2; + + BMVert *cur_vert = v1; + for (rls = rl->segments.first; rls; rls = rls->item.next) { + irls = rls->item.next; + + if (rls->occlusion != 0) { + BM_elem_flag_disable(cur_vert, BM_ELEM_SELECT); + } + + if (!irls) { + break; + } + + //safety reasons + CLAMP(rls->at, 0, 1); + CLAMP(irls->at, 0, 1); + + if (irls->at == 1.0f){ + if (irls->occlusion != 0) { + BM_elem_flag_disable(v2, BM_ELEM_SELECT); + } + break; + } + + float split_pos[3]; + + interp_v3_v3v3(split_pos, v1->co, v2->co, irls->at); + + cur_vert = split_edge_and_move(bm, e, split_pos); + + e = BM_edge_exists(cur_vert, v2); + } + } + + //Chain together strokes + BMVert *vert; + BMIter iter; + + BM_ITER_MESH (vert, &iter, bm, BM_VERTS_OF_MESH) { + + //Have we already used this vert? + if(!BM_elem_flag_test(vert, BM_ELEM_SELECT)){ + continue; + } + + BMVert *prepend_vert = NULL; + BMVert *next_vert = vert; + //Chain together the C verts and export them as GP strokes (chain in object space) + BMVert *edge_vert; + BMEdge *e; + BMIter iter_e; + + LinkNodePair chain = {NULL, NULL}; + + int connected_c_verts; + + while( next_vert != NULL ){ + + connected_c_verts = 0; + vert = next_vert; + + BLI_linklist_append(&chain, vert); + + BM_elem_flag_disable(vert, BM_ELEM_SELECT); + + BM_ITER_ELEM (e, &iter_e, vert, BM_EDGES_OF_VERT) { + edge_vert = BM_edge_other_vert(e, vert); + + if(BM_elem_flag_test(edge_vert, BM_ELEM_SELECT)){ + if( connected_c_verts == 0 ){ + next_vert = edge_vert; + } else if( connected_c_verts == 1 && prepend_vert == NULL ){ + prepend_vert = edge_vert; + } else { + printf("C verts not connected in a simple line!\n"); + } + connected_c_verts++; + } + + } + + if( connected_c_verts == 0 ){ + next_vert = NULL; + } + + } + + LinkNode *pre_list = chain.list; + + while( prepend_vert != NULL ) { + + connected_c_verts = 0; + vert = prepend_vert; + + BLI_linklist_prepend(&pre_list, vert); + + BM_elem_flag_disable(vert, BM_ELEM_SELECT); + + BM_ITER_ELEM (e, &iter_e, vert, BM_EDGES_OF_VERT) { + edge_vert = BM_edge_other_vert(e, vert); + + if(BM_elem_flag_test(edge_vert, BM_ELEM_SELECT)){ + if( connected_c_verts == 0 ){ + prepend_vert = edge_vert; + } else { + printf("C verts not connected in a simple line!\n"); + } + connected_c_verts++; + } + + } + + if( connected_c_verts == 0 ){ + prepend_vert = NULL; + } + } + + tot_points = BLI_linklist_count(pre_list); + + printf("Tot points: %d\n", tot_points); + + if( tot_points <= 1 ){ + //Don't draw a stroke, chain too short. + printf("Chain to short\n"); + continue; + } + + float *stroke_data = BLI_array_alloca(stroke_data, tot_points * GP_PRIM_DATABUF_SIZE); + + int array_idx = 0; + + for (LinkNode *entry = pre_list; entry; entry = entry->next) { + vert = entry->link; + stroke_data[array_idx] = vert->co[0]; + stroke_data[array_idx + 1] = vert->co[1]; + stroke_data[array_idx + 2] = vert->co[2]; + + stroke_data[array_idx + 3] = 1.0f; //thickness + stroke_data[array_idx + 4] = 1.0f; //hardness? + + array_idx += 5; + } + + /* generate stroke */ + bGPDstroke *gps; + gps = BKE_gpencil_add_stroke(gpf, color_idx, tot_points, thickness); + BKE_gpencil_stroke_add_points(gps, stroke_data, tot_points, mat); + + BLI_linklist_free(pre_list, NULL); + } + + BM_mesh_free(bm); +} \ No newline at end of file diff --git a/source/blender/draw/engines/lanpr/lanpr_access.h b/source/blender/draw/engines/lanpr/lanpr_access.h new file mode 100644 index 00000000000..ef9cdb1d22f --- /dev/null +++ b/source/blender/draw/engines/lanpr/lanpr_access.h @@ -0,0 +1,13 @@ +#ifndef __LANPR_ACCESS_H__ +#define __LANPR_ACCESS_H__ + +#include "DNA_gpencil_types.h" +#include "DNA_gpencil_modifier_types.h" + +#include "BKE_gpencil.h" + +void lanpr_generate_gpencil_geometry( + GpencilModifierData *md, Depsgraph *depsgraph, + Object *ob, bGPDlayer *gpl, bGPDframe *gpf); + +#endif \ No newline at end of file diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h index 6bf3f6874dc..30f889c0bdc 100644 --- a/source/blender/draw/engines/lanpr/lanpr_all.h +++ b/source/blender/draw/engines/lanpr/lanpr_all.h @@ -14,6 +14,9 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Copyright 2016, Blender Foundation. + * + * Contributor(s): Yiming Wu + * */ /** \file @@ -24,6 +27,7 @@ #define __LANPR_ALL_H__ #include "lanpr_util.h" +#include "lanpr_data_types.h" #include "BLI_mempool.h" #include "BLI_utildefines.h" //#include "GPU_framebuffer.h" @@ -48,11 +52,6 @@ #include "BLI_threads.h" -#include "GPU_batch.h" -#include "GPU_framebuffer.h" -#include "GPU_shader.h" -#include "GPU_uniformbuffer.h" -#include "GPU_viewport.h" #include "bmesh.h" #include "WM_types.h" @@ -104,24 +103,6 @@ typedef struct LANP @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs