[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45314] branches/soc-2011-avocado/blender/ source/blender: restore grease pencil convert to bmesh from dan_w.

Andrea Weikert elubie at gmx.net
Sat Mar 31 22:40:50 CEST 2012


Revision: 45314
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45314
Author:   elubie
Date:     2012-03-31 20:40:38 +0000 (Sat, 31 Mar 2012)
Log Message:
-----------
restore grease pencil convert to bmesh from dan_w.

* I could verify a simple case (drawing a plane) worked
* Everything is converted to latest bmesh api, so compatible with trunk

TODO:
restore retopo build tool, will follow soon.

Modified Paths:
--------------
    branches/soc-2011-avocado/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/soc-2011-avocado/blender/source/blender/bmesh/intern/bmesh_operators_private.h
    branches/soc-2011-avocado/blender/source/blender/bmesh/operators/bmo_primitive.c
    branches/soc-2011-avocado/blender/source/blender/editors/gpencil/gpencil_intern.h
    branches/soc-2011-avocado/blender/source/blender/editors/gpencil/gpencil_ops.c
    branches/soc-2011-avocado/blender/source/blender/editors/gpencil/gpencil_paint.c
    branches/soc-2011-avocado/blender/source/blender/editors/mesh/editmesh_add.c
    branches/soc-2011-avocado/blender/source/blender/editors/mesh/editmesh_bvh.h

Modified: branches/soc-2011-avocado/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/soc-2011-avocado/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-03-31 17:15:04 UTC (rev 45313)
+++ branches/soc-2011-avocado/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-03-31 20:40:38 UTC (rev 45314)
@@ -1020,6 +1020,21 @@
 };
 
 /*
+  Create Mesh from Splines
+
+  Creates a mesh from splines by intersecting splines, cleaning, and filling with faces
+*/
+static BMOpDefine bmo_create_mesh_from_splines_def = {
+	"create_mesh_from_splines",
+	{{BMO_OP_SLOT_ELEMENT_BUF, "vertout"}, //output verts
+	{BMO_OP_SLOT_PNT, "frame"}, //spline frame
+	 {0, /*null-terminating sentinel*/}},
+	bmo_create_mesh_from_splines,
+	0,
+};
+
+
+/*
  * Bevel
  *
  * Bevels edges and vertices
@@ -1163,6 +1178,7 @@
 	&bmo_create_cube_def,
 	&bmo_create_circle_def,
 	&bmo_create_cone_def,
+	&bmo_create_mesh_from_splines_def,
 	&bmo_join_triangles_def,
 	&bmo_bevel_def,
 	&bmo_beautify_fill_def,

Modified: branches/soc-2011-avocado/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- branches/soc-2011-avocado/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2012-03-31 17:15:04 UTC (rev 45313)
+++ branches/soc-2011-avocado/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2012-03-31 20:40:38 UTC (rev 45314)
@@ -99,5 +99,6 @@
 void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op);
 void bmo_solidify_face_region_exec(BMesh *bm, BMOperator *op);
 void bmo_inset_exec(BMesh *bm, BMOperator *op);
+void bmo_create_mesh_from_splines(BMesh *bm, BMOperator *op);
 
 #endif /* __BMESH_OPERATORS_PRIVATE_H__ */

Modified: branches/soc-2011-avocado/blender/source/blender/bmesh/operators/bmo_primitive.c
===================================================================
--- branches/soc-2011-avocado/blender/source/blender/bmesh/operators/bmo_primitive.c	2012-03-31 17:15:04 UTC (rev 45313)
+++ branches/soc-2011-avocado/blender/source/blender/bmesh/operators/bmo_primitive.c	2012-03-31 20:40:38 UTC (rev 45314)
@@ -23,7 +23,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_math.h"
-
+#include "DNA_gpencil_types.h"
 #include "ED_mesh.h"
 
 #include "bmesh.h"
@@ -734,3 +734,114 @@
 
 	BMO_slot_buffer_from_enabled_flag(bm, op, "vertout", BM_VERT, VERT_MARK);
 }
+
+void bmo_create_mesh_from_splines(BMesh *bm, BMOperator *op)
+{
+	// stroke iterators, current and next pointers
+	bGPDstroke *gps, *gpsn;
+	// stroke iterators for searching, current and next pointers
+	bGPDstroke *search_gps, *search_gpsn;
+	// various 3d positions used as temporary registers when performing intersection tests
+	float i_vec0[3], i_vec1[3], i_vec2[3], i_vec3[3], i_vec_intersect[3], intersect_lambda;
+	// bmesh vertex pointers and edge pointer. used when creating verticies and edges.
+	// pointer must be retained in order to set flags, etc
+	BMVert *bm_vertex = 0;
+	BMVert *bm_previous = 0;
+	BMVert *bm_intersect = 0;
+	BMEdge *bm_edge = 0;
+
+	// for loop counters
+	int i, j;
+
+	// retrieve the grease pencil frame. this is passed as a parameter and points to the root frame
+	bGPDframe* p_frame = BMO_slot_ptr_get(op, "frame");
+
+	/* error checking */
+	if (p_frame == NULL) return;
+
+	/* iterate strokes */
+	for (gps = p_frame->strokes.first; gps; gps = gpsn)
+	{
+		gpsn = gps->next;
+
+		bm_previous = 0;
+
+		/* iterate points */
+		for(i = 1; i < gps->totpoints; i++)
+		{
+			/* iterate strokes */
+			for (search_gps = p_frame->strokes.first; search_gps; search_gps = search_gpsn)
+			{
+				search_gpsn = search_gps->next;
+
+				if(gps == search_gps)
+				{
+					continue;
+				}
+
+				for(j = 0; j < search_gps->totpoints; j++)
+				{
+					/*
+					in this scope, we are iterating every point in every stroke for every 
+					point in every stroke. This allows to compare each stroke segment with
+					every other stroke segment, for intersection testing.
+					
+					We are iterating every point, but we are interested only in every line
+					segment. Hence, skip the first point, and test each line with the points
+					j-1 and j.
+					*/
+					if(j != 0)
+					{
+
+						// intersection test
+						i_vec0[0] = gps->points[i-1].x;
+						i_vec0[1] = gps->points[i-1].y;
+						i_vec0[2] = gps->points[i-1].z;
+
+						i_vec1[0] = gps->points[i].x;
+						i_vec1[1] = gps->points[i].y;
+						i_vec1[2] = gps->points[i].z;
+
+						i_vec2[0] = search_gps->points[j-1].x;
+						i_vec2[1] = search_gps->points[j-1].y;
+						i_vec2[2] = search_gps->points[j-1].z;
+
+						i_vec3[0] = search_gps->points[j].x;
+						i_vec3[1] = search_gps->points[j].y;
+						i_vec3[2] = search_gps->points[j].z;
+
+						if(isect_line_line_strict_v3(i_vec0, i_vec1, i_vec2, i_vec3, i_vec_intersect, &intersect_lambda))
+						{
+							// there is an intersection hence we must add an extra vertex
+							bm_intersect = BM_vert_create(bm, i_vec_intersect, NULL);
+							BMO_elem_flag_enable(bm, bm_intersect, VERT_MARK);
+
+							// if there is already a vertex found on this stroke, we can also create edge
+							if(bm_previous)
+							{
+								bm_edge = BM_edge_create(bm, bm_intersect, bm_previous, NULL, 0);
+								BMO_elem_flag_enable(bm, bm_edge, VERT_MARK);
+							}
+
+							bm_previous = bm_intersect;
+
+							break;
+						}
+					}
+				}
+			}
+		}
+	}
+
+	// perform weld on vertices that do not share an edge
+	BMO_op_callf(bm, "removedoubles verts=%fv dist=%f", VERT_MARK, 0.001f);
+
+	// fill in faces
+	// this following line has no effect. This must be because in the bmop above, when welding the existing edges
+	// are destroyed and new edges are created with no flags set.
+	// dan_w todo: flag all the edges.
+	// otherwise, edgenet_fill should fill the vertex and edge net with faces.
+	BMO_op_callf(bm, "edgenet_fill edges=%fe", VERT_MARK);
+
+	BMO_slot_buffer_from_enabled_flag(bm, op, "vertout", BM_VERT, VERT_MARK);
+}
\ No newline at end of file

Modified: branches/soc-2011-avocado/blender/source/blender/editors/gpencil/gpencil_intern.h
===================================================================
--- branches/soc-2011-avocado/blender/source/blender/editors/gpencil/gpencil_intern.h	2012-03-31 17:15:04 UTC (rev 45313)
+++ branches/soc-2011-avocado/blender/source/blender/editors/gpencil/gpencil_intern.h	2012-03-31 20:40:38 UTC (rev 45314)
@@ -43,6 +43,7 @@
 /* drawing ---------- */
 
 void GPENCIL_OT_draw(struct wmOperatorType *ot);
+void GPENCIL_OT_convert_to_bmesh(struct wmOperatorType *ot);
 
 /* Paint Modes for operator*/
 typedef enum eGPencil_PaintModes {

Modified: branches/soc-2011-avocado/blender/source/blender/editors/gpencil/gpencil_ops.c
===================================================================
--- branches/soc-2011-avocado/blender/source/blender/editors/gpencil/gpencil_ops.c	2012-03-31 17:15:04 UTC (rev 45313)
+++ branches/soc-2011-avocado/blender/source/blender/editors/gpencil/gpencil_ops.c	2012-03-31 20:40:38 UTC (rev 45314)
@@ -75,7 +75,10 @@
 	/* Drawing ----------------------- */
 	
 	WM_operatortype_append(GPENCIL_OT_draw);
-	
+
+	/* Conversion */
+	WM_operatortype_append(GPENCIL_OT_convert_to_bmesh);
+
 	/* Editing (Buttons) ------------ */
 	
 	WM_operatortype_append(GPENCIL_OT_data_add);

Modified: branches/soc-2011-avocado/blender/source/blender/editors/gpencil/gpencil_paint.c
===================================================================
--- branches/soc-2011-avocado/blender/source/blender/editors/gpencil/gpencil_paint.c	2012-03-31 17:15:04 UTC (rev 45313)
+++ branches/soc-2011-avocado/blender/source/blender/editors/gpencil/gpencil_paint.c	2012-03-31 20:40:38 UTC (rev 45314)
@@ -63,6 +63,7 @@
 #include "WM_types.h"
 
 #include "gpencil_intern.h"
+#include "../mesh/editmesh_bvh.h"
 
 /* ******************************************* */
 /* 'Globals' and Defines */
@@ -1937,3 +1938,40 @@
 	
 	RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", "");
 }
+
+/* start of interactive drawing part of operator */
+static int gpencil_to_bmesh_invoke (bContext *C, wmOperator *op, wmEvent *event)
+{
+	bGPdata **gpd_ptr = NULL;
+	PointerRNA ptr;
+
+	/* get pointer to Grease Pencil Data */
+	gpd_ptr= gpencil_data_get_pointers((bContext *)C, &ptr);
+
+	if (gpd_ptr)
+	{
+		bGPDlayer* p_gp_layer = gpencil_layer_getactive(*gpd_ptr);
+		if(p_gp_layer)
+		{
+			bGPDframe* p_actframe = p_gp_layer->actframe;
+			if(p_actframe)
+			{
+				// create target bmesh object
+				make_mesh_from_splines(C, op, p_actframe);
+			}
+		}
+	}
+
+	return 0;
+}
+
+void GPENCIL_OT_convert_to_bmesh (wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Grease Pencil To BMesh COnvert";
+	ot->idname= "GPENCIL_OT_convert_to_bmesh";
+	ot->description= "Convert active grease pencil data to b mesh";
+
+	/* api callbacks */
+	ot->invoke= gpencil_to_bmesh_invoke;
+}

Modified: branches/soc-2011-avocado/blender/source/blender/editors/mesh/editmesh_add.c
===================================================================
--- branches/soc-2011-avocado/blender/source/blender/editors/mesh/editmesh_add.c	2012-03-31 17:15:04 UTC (rev 45313)
+++ branches/soc-2011-avocado/blender/source/blender/editors/mesh/editmesh_add.c	2012-03-31 20:40:38 UTC (rev 45314)
@@ -122,6 +122,35 @@
 	WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
 }
 
+int make_mesh_from_splines(bContext *C, wmOperator *op, void* p_frame)
+{
+	Object *obedit;
+	Mesh *me;
+	BMEditMesh *em;
+	float loc[3], rot[3], mat[4][4], dia;
+	int enter_editmode;
+	int state;
+	unsigned int layer;
+
+	ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL);
+	loc[0] = loc[1] = loc[2] = 0;
+	rot[0] = rot[1] = rot[2] = 0;
+	
+	make_prim_init(C, "SplineMesh", &dia, mat, &state, loc, rot, layer);
+
+	obedit= CTX_data_edit_object(C);
+	me = obedit->data;
+	em = me->edit_btmesh;
+
+	if (!EDBM_op_call_and_selectf(em, op, "vertout", "create_mesh_from_splines frame=%p", p_frame)) {
+		return OPERATOR_CANCELLED;
+	}
+
+	/* BMESH_TODO make plane side this: sqrt(2.0f) - plane (diameter of 1.41 makes it unit size) */
+	make_prim_finish(C, &state, enter_editmode);
+	return OPERATOR_FINISHED;
+}
+
 static int add_primitive_plane_exec(bContext *C, wmOperator *op)
 {
 	Object *obedit;

Modified: branches/soc-2011-avocado/blender/source/blender/editors/mesh/editmesh_bvh.h
===================================================================

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list