[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