[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23758] trunk/blender/source/blender: - added redraw notifier.
Campbell Barton
ideasman42 at gmail.com
Sat Oct 10 12:49:17 CEST 2009
Revision: 23758
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23758
Author: campbellbarton
Date: 2009-10-10 12:49:17 +0200 (Sat, 10 Oct 2009)
Log Message:
-----------
- added redraw notifier.
- removed custom invoke function, use generic names (was misleading since conversion is done on selection, not just active).
- made convert mesh to curve use the 'keep_original' option.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/mesh.c
trunk/blender/source/blender/editors/object/object_add.c
Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c 2009-10-10 09:34:22 UTC (rev 23757)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c 2009-10-10 10:49:17 UTC (rev 23758)
@@ -983,23 +983,23 @@
/* make new mesh data from the original copy */
DerivedMesh *dm= mesh_get_derived_final(scene, ob, CD_MASK_MESH);
- MVert *mv, *mverts= dm->getVertArray(dm);
+ MVert *mverts= dm->getVertArray(dm);
MEdge *med, *medge= dm->getEdgeArray(dm);
MFace *mf, *mface= dm->getFaceArray(dm);
- int totvert = dm->getNumVerts(dm);
int totedge = dm->getNumEdges(dm);
int totface = dm->getNumFaces(dm);
int totedges = 0;
int i;
+ /* only to detect edge polylines */
EdgeHash *eh = BLI_edgehash_new();
EdgeHash *eh_edge = BLI_edgehash_new();
+
ListBase edges = {NULL, NULL};
- EdgeLink *edl;
-
+ /* create edges from all faces (so as to find edges not in any faces) */
mf= mface;
for (i = 0; i < totface; i++, mf++) {
if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
@@ -1021,9 +1021,9 @@
med= medge;
for(i=0; i<totedge; i++, med++) {
if (!BLI_edgehash_haskey(eh, med->v1, med->v2)) {
+ EdgeLink *edl= MEM_callocN(sizeof(EdgeLink), "EdgeLink");
+
BLI_edgehash_insert(eh_edge, med->v1, med->v2, NULL);
-
- edl= MEM_callocN(sizeof(EdgeLink), "EdgeLink");
edl->edge= med;
BLI_addtail(&edges, edl); totedges++;
@@ -1037,7 +1037,9 @@
cu->flag |= CU_3D;
while(edges.first) {
- ListBase polyline = {NULL, NULL};
+ /* each iteration find a polyline and add this as a nurbs poly spline */
+
+ ListBase polyline = {NULL, NULL}; /* store a list of VertLink's */
int closed = FALSE;
int totpoly= 0;
MEdge *med_current= ((EdgeLink *)edges.last)->edge;
@@ -1045,43 +1047,40 @@
int endVert= med_current->v2;
int ok= TRUE;
- Nurb *nu;
- BPoint *bp;
- VertLink *vl;
-
appendPolyLineVert(&polyline, startVert); totpoly++;
appendPolyLineVert(&polyline, endVert); totpoly++;
BLI_freelinkN(&edges, edges.last); totedges--;
-
- while(ok) {
+ while(ok) { /* while connected edges are found... */
ok = FALSE;
i= totedges;
while(i) {
- MEdge *ed= edl->edge;
+ EdgeLink *edl;
+
i-=1;
edl= BLI_findlink(&edges, i);
+ med= edl->edge;
- if(ed->v1==endVert) {
- endVert = ed->v2;
- appendPolyLineVert(&polyline, ed->v2); totpoly++;
+ if(med->v1==endVert) {
+ endVert = med->v2;
+ appendPolyLineVert(&polyline, med->v2); totpoly++;
BLI_freelinkN(&edges, edl); totedges--;
ok= TRUE;
}
- else if(ed->v2==endVert) {
- endVert = ed->v1;
+ else if(med->v2==endVert) {
+ endVert = med->v1;
appendPolyLineVert(&polyline, endVert); totpoly++;
BLI_freelinkN(&edges, edl); totedges--;
ok= TRUE;
}
- else if(ed->v1==startVert) {
- startVert = ed->v2;
+ else if(med->v1==startVert) {
+ startVert = med->v2;
prependPolyLineVert(&polyline, startVert); totpoly++;
BLI_freelinkN(&edges, edl); totedges--;
ok= TRUE;
}
- else if(ed->v2==startVert) {
- startVert = ed->v1;
+ else if(med->v2==startVert) {
+ startVert = med->v1;
prependPolyLineVert(&polyline, startVert); totpoly++;
BLI_freelinkN(&edges, edl); totedges--;
ok= TRUE;
@@ -1097,32 +1096,38 @@
}
/* --- nurbs --- */
+ {
+ Nurb *nu;
+ BPoint *bp;
+ VertLink *vl;
- /* create new 'nurb' within the curve */
- nu = (Nurb *)MEM_callocN(sizeof(Nurb), "MeshNurb");
+ /* create new 'nurb' within the curve */
+ nu = (Nurb *)MEM_callocN(sizeof(Nurb), "MeshNurb");
- nu->pntsu= totpoly;
- nu->pntsv= 1;
- nu->orderu= 4;
- nu->flagu= 2 | (closed ? CU_CYCLIC:0); /* endpoint */
- nu->resolu= 12;
+ nu->pntsu= totpoly;
+ nu->pntsv= 1;
+ nu->orderu= 4;
+ nu->flagu= 2 | (closed ? CU_CYCLIC:0); /* endpoint */
+ nu->resolu= 12;
- nu->bp= (BPoint *)MEM_callocN(sizeof(BPoint)*totpoly, "bpoints");
+ nu->bp= (BPoint *)MEM_callocN(sizeof(BPoint)*totpoly, "bpoints");
- /* add points */
- vl= polyline.first;
- for (i=0, bp=nu->bp; i < totpoly; i++, bp++, vl=vl->next) {
- VecCopyf(bp->vec, mverts[vl->index].co);
- bp->f1= SELECT;
- bp->radius = bp->weight = 1.0;
+ /* add points */
+ vl= polyline.first;
+ for (i=0, bp=nu->bp; i < totpoly; i++, bp++, vl=(VertLink *)vl->next) {
+ VecCopyf(bp->vec, mverts[vl->index].co);
+ bp->f1= SELECT;
+ bp->radius = bp->weight = 1.0;
+ }
+ BLI_freelistN(&polyline);
+
+ /* add nurb to curve */
+ BLI_addtail(&cu->nurb, nu);
}
- BLI_freelistN(&polyline);
-
- /* add nurb to curve */
- BLI_addtail(&cu->nurb, nu);
/* --- done with nurbs --- */
}
+ ((Mesh *)ob->data)->id.us--;
ob->data= cu;
ob->type= OB_CURVE;
}
Modified: trunk/blender/source/blender/editors/object/object_add.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_add.c 2009-10-10 09:34:22 UTC (rev 23757)
+++ trunk/blender/source/blender/editors/object/object_add.c 2009-10-10 10:49:17 UTC (rev 23758)
@@ -1018,8 +1018,8 @@
/**************************** Convert **************************/
static EnumPropertyItem convert_target_items[]= {
- {OB_CURVE, "CURVE", 0, "Curve", ""},
- {OB_MESH, "MESH", 0, "Mesh", ""},
+ {OB_CURVE, "CURVE", ICON_OUTLINER_OB_CURVE, "Curve from Mesh/Text", ""},
+ {OB_MESH, "MESH", ICON_OUTLINER_OB_MESH, "Mesh from Curve/Meta/Surf/Mesh", ""},
{0, NULL, 0, NULL, NULL}};
static void curvetomesh(Scene *scene, Object *ob)
@@ -1035,14 +1035,6 @@
object_free_modifiers(ob);
}
-static void meshtocurve(Scene *scene, Object *ob)
-{
- mesh_to_curve(scene, ob);
-
- if(ob->type == OB_CURVE)
- object_free_modifiers(ob);
-}
-
static int convert_poll(bContext *C)
{
Object *obact= CTX_data_active_object(C);
@@ -1081,8 +1073,22 @@
continue;
else if (ob->type==OB_MESH && target == OB_CURVE) {
ob->flag |= OB_DONE;
- meshtocurve(scene, ob);
- ob->recalc |= OB_RECALC;
+
+ ob1= copy_object(ob);
+ ob1->recalc |= OB_RECALC;
+
+ basen= MEM_mallocN(sizeof(Base), "duplibase");
+ *basen= *base;
+ BLI_addhead(&scene->base, basen); /* addhead: otherwise eternal loop */
+ basen->object= ob1;
+ basen->flag |= SELECT;
+ base->flag &= ~SELECT;
+ ob->flag &= ~SELECT;
+
+ mesh_to_curve(scene, ob1);
+
+ if(ob1->type==OB_CURVE)
+ object_free_modifiers(ob1); /* after derivedmesh calls! */
}
else if(ob->type==OB_MESH && ob->modifiers.first) { /* converting a mesh with no modifiers causes a segfault */
ob->flag |= OB_DONE;
@@ -1233,48 +1239,14 @@
BASACT= basact;
DAG_scene_sort(scene);
- WM_event_add_notifier(C, NC_SCENE, scene);
+ WM_event_add_notifier(C, NC_SCENE|ND_DRAW, scene);
- return OPERATOR_FINISHED;
-}
-static int convert_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- Object *obact= CTX_data_active_object(C);
- uiPopupMenu *pup;
- uiLayout *layout;
- char *title;
- if(obact->type==OB_FONT) {
- pup= uiPupMenuBegin(C, "Convert Font to", 0);
- layout= uiPupMenuLayout(pup);
-
- uiItemEnumO(layout, "Curve", 0, op->type->idname, "target", OB_CURVE);
- }
- else {
- if(obact->type == OB_MBALL)
- title= "Convert Metaball to";
- else if(obact->type == OB_CURVE)
- title= "Convert Curve to";
- else if(obact->type == OB_SURF)
- title= "Convert Nurbs Surface to";
- else if(obact->type == OB_MESH)
- title= "Convert Modifiers to";
- else
- return OPERATOR_CANCELLED;
-
- pup= uiPupMenuBegin(C, title, 0);
- layout= uiPupMenuLayout(pup);
- }
-
- uiItemBooleanO(layout, "Mesh (keep original)", 0, op->type->idname, "keep_original", 1);
- uiItemBooleanO(layout, "Mesh (delete original)", 0, op->type->idname, "keep_original", 0);
-
- uiPupMenuEnd(C, pup);
-
- return OPERATOR_CANCELLED;
+ return OPERATOR_FINISHED;
}
+
void OBJECT_OT_convert(wmOperatorType *ot)
{
/* identifiers */
@@ -1283,7 +1255,7 @@
ot->idname= "OBJECT_OT_convert";
/* api callbacks */
- ot->invoke= convert_invoke;
+ ot->invoke= WM_menu_invoke;
ot->exec= convert_exec;
ot->poll= convert_poll;
More information about the Bf-blender-cvs
mailing list