[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