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

Reply via email to