[Bf-blender-cvs] [0d1bf0623b4] soc-2019-npr: Adding lanpr to grease pencil strokes modifier.

YimingWu noreply at git.blender.org
Thu May 30 09:17:45 CEST 2019


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



More information about the Bf-blender-cvs mailing list