From 0fba0e6b4bd4361aa8d2aa72de5ee501dc419ce9 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Thu, 11 Aug 2005 07:11:57 +0000 Subject: [PATCH] - update displistmesh_to_mesh to free existing mesh data (including sticky, dvert, and keys if number of verts don't match) - changed modifier panel to not allow manual addition of hook or softbody modifiers - changed apply modifier to apply to existing mesh (fixes bug with materials) and to warn about loss of tface/mcol/keys/dvert/sticky for all modifier types - changed modifier UI to not display disclosure triangle for virtual modifiers - changed softbody ui to allow enable/disable --- .../blender/blenkernel/intern/DerivedMesh.c | 6 +- source/blender/blenkernel/intern/displist.c | 58 ++++++++++++++----- source/blender/blenloader/intern/readfile.c | 4 -- source/blender/src/buttons_editing.c | 37 ++++++------ source/blender/src/buttons_object.c | 37 ++++++++---- source/blender/src/editobject.c | 1 - 6 files changed, 91 insertions(+), 52 deletions(-) diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index e46bf147b73..65ff9192243 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -98,13 +98,9 @@ static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm, int allowShar if (!allowShared) { dlm->mvert = MEM_dupallocN(dlm->mvert); - if (dlm->medge) dlm->medge = MEM_dupallocN(dlm->medge); - dlm->mface = MEM_dupallocN(dlm->mface); - if (dlm->tface) dlm->tface = MEM_dupallocN(dlm->tface); - if (dlm->mcol) dlm->mcol = MEM_dupallocN(dlm->mcol); if (dlm->nors) dlm->nors = MEM_dupallocN(dlm->nors); - dlm->dontFreeVerts = dlm->dontFreeOther = dlm->dontFreeNors = 0; + dlm->dontFreeVerts = dlm->dontFreeNors = 0; } return dlm; diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 13a832e2e3d..8d302d109b8 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -60,6 +60,7 @@ #include "DNA_material_types.h" #include "DNA_view3d_types.h" #include "DNA_lattice_types.h" +#include "DNA_key_types.h" #include "BLI_blenlib.h" #include "BLI_arithb.h" @@ -147,24 +148,51 @@ DispListMesh *displistmesh_copyShared(DispListMesh *odlm) void displistmesh_to_mesh(DispListMesh *dlm, Mesh *me) { - if (dlm->totvert>MESH_MAX_VERTS) { - error("Too many vertices"); - } else { - me->totface= dlm->totface; - me->totvert= dlm->totvert; + /* We assume, rather courageously, that any + * shared data came from the mesh itself and so + * we can ignore the dlm->dontFreeOther flag. + */ - me->mvert= MEM_dupallocN(dlm->mvert); - me->mface= MEM_dupallocN(dlm->mface); - if (dlm->tface) - me->tface= MEM_dupallocN(dlm->tface); - if (dlm->mcol) - me->mcol= MEM_dupallocN(dlm->mcol); + if (me->mvert && dlm->mvert!=me->mvert) MEM_freeN(me->mvert); + if (me->mface && dlm->mface!=me->mface) MEM_freeN(me->mface); + if (me->tface && dlm->tface!=me->tface) MEM_freeN(me->tface); + if (me->mcol && dlm->mcol!=me->mcol) MEM_freeN(me->mcol); + if (me->medge && dlm->medge!=me->medge) MEM_freeN(me->medge); - if(dlm->medge) { - me->totedge= dlm->totedge; - me->medge= MEM_dupallocN(dlm->medge); - } + me->tface = NULL; + me->mcol = NULL; + me->medge = NULL; + + if (dlm->totvert!=me->totvert) { + if (me->msticky) MEM_freeN(me->msticky); + me->msticky = NULL; + + if (me->dvert) free_dverts(me->dvert, me->totvert); + me->dvert = NULL; + + if(me->key) me->key->id.us--; + me->key = NULL; } + + me->totface= dlm->totface; + me->totvert= dlm->totvert; + me->totedge= 0; + + me->mvert= dlm->mvert; + me->mface= dlm->mface; + if (dlm->tface) + me->tface= dlm->tface; + if (dlm->mcol) + me->mcol= dlm->mcol; + + if(dlm->medge) { + me->totedge= dlm->totedge; + me->medge= dlm->medge; + } + + if (dlm->nors && !dlm->dontFreeNors) MEM_freeN(dlm->nors); + + MEM_freeN(dlm); } void free_disp_elem(DispList *dl) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index bda35404883..a750ba71f0a 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2074,10 +2074,6 @@ static void direct_link_dverts(FileData *fd, int count, MDeformVert *mdverts) mdverts[i].dw=newdataadr(fd, mdverts[i].dw); if (!mdverts[i].dw) mdverts[i].totweight=0; - - for (j=0; j< mdverts[i].totweight; j++) { - mdverts[i].dw[j].data = NULL; // not saved in file, clear pointer - } } } diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index c9e3d6c84d8..d302d34d244 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -553,8 +553,8 @@ static uiBlock *modifiers_add_menu(void *ob_v) for (i=eModifierType_None+1; iflags&eModifierTypeFlag_AcceptsCVs) || (ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) { @@ -691,6 +691,7 @@ static void modifiers_applyModifier(void *obv, void *mdv) DerivedMesh *dm; DispListMesh *dlm; Mesh *me = ob->data; + int converted = 0; if (G.obedit) { error("Modifiers cannot be applied in editmode"); @@ -700,13 +701,8 @@ static void modifiers_applyModifier(void *obv, void *mdv) return; } - if (md->type==eModifierType_Decimate && (me->tface || me->mcol)) { - if (!okee("Applying decimate modifier will remove mesh UVs and vertex colors, continue?")) - return; - } - if (md!=ob->modifiers.first) { - if (!okee("Modifier is not first, continue with apply?")) + if (!okee("Modifier is not first")) return; } @@ -718,15 +714,22 @@ static void modifiers_applyModifier(void *obv, void *mdv) return; } - dlm= dm->convertToDispListMesh(dm, 1); + dlm= dm->convertToDispListMesh(dm, 0); - ob->data= add_mesh(); - displistmesh_to_mesh(dlm, ob->data); - displistmesh_free(dlm); + if ((!me->tface || dlm->tface) || okee("Applying will delete mesh UVs and vertex colors")) { + if ((!me->mcol || dlm->mcol) || okee("Applying will delete mesh vertex colors")) { + if (dlm->totvert==me->totvert || okee("Applying will delete mesh sticky, keys, and vertex groups")) { + displistmesh_to_mesh(dlm, me); + converted = 1; + } + } + } + + if (!converted) { + displistmesh_free(dlm); + } dm->release(dm); - free_libblock_us(&G.main->mesh, me); - BLI_remlink(&ob->modifiers, md); modifier_free(md); } @@ -812,11 +815,11 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco if (isVirtual) { uiSetButLock(1, "Modifier is virtual and cannot be edited."); color = TH_BUT_SETTING1; + } else { + uiBlockSetEmboss(block, UI_EMBOSSN); + uiDefIconButBitI(block, ICONTOG, eModifierMode_Expanded, B_MODIFIER_REDRAW, VICON_DISCLOSURE_TRI_RIGHT, x-10, y-2, 20, 20, &md->mode, 0.0, 0.0, 0.0, 0.0, "Collapse/Expand Modifier"); } - uiBlockSetEmboss(block, UI_EMBOSSN); - uiDefIconButBitI(block, ICONTOG, eModifierMode_Expanded, B_MODIFIER_REDRAW, VICON_DISCLOSURE_TRI_RIGHT, x-10, y-2, 20, 20, &md->mode, 0.0, 0.0, 0.0, 0.0, "Collapse/Expand Modifier"); - BIF_ThemeColor(color); uiBlockSetEmboss(block, UI_EMBOSS); diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index 5fbd80e6027..46b58eb1759 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -1456,12 +1456,27 @@ static void object_softbodies__enable(void *ob_v, void *arg2) Object *ob = ob_v; ModifierData *md = modifiers_findByType(ob, eModifierType_Softbody); - if (!md) { - md = modifier_new(eModifierType_Softbody); - BLI_addhead(&ob->modifiers, md); - } + if (modifiers_isSoftbodyEnabled(ob)) { + if (md) { + md->mode &= ~(eModifierMode_Render|eModifierMode_Realtime); + } + } else { + if (!md) { + md = modifier_new(eModifierType_Softbody); + BLI_addhead(&ob->modifiers, md); + } - md->mode |= eModifierMode_Render|eModifierMode_Realtime; + md->mode |= eModifierMode_Render|eModifierMode_Realtime; + + if (!ob->soft) { + ob->soft= sbNew(); + ob->softflag |= OB_SB_GOAL|OB_SB_EDGES; + if(ob->type==OB_MESH) { + Mesh *me= ob->data; + if(me->medge==NULL) make_edges(me); + } + } + } allqueue(REDRAWBUTSEDIT, 0); } @@ -1479,11 +1494,13 @@ static void object_softbodies(Object *ob) uiDefBut(block, LABEL, 0, "Object has Deflection,", 10,160,300,20, NULL, 0.0, 0, 0, 0, ""); uiDefBut(block, LABEL, 0, "no Softbody possible", 10,140,300,20, NULL, 0.0, 0, 0, 0, ""); } else { - if (!modifiers_isSoftbodyEnabled(ob)) { - uiBut *but = uiDefButS(block, BUT, REDRAWBUTSOBJECT, "Enable Soft Body", 10,200,150,20, &ob->softflag, 0, 0, 0, 0, "Sets object to become soft body"); - uiButSetFunc(but, object_softbodies__enable, ob, NULL); - uiDefBut(block, LABEL, 0, "", 160, 200,150,20, NULL, 0.0, 0.0, 0, 0, ""); // alignment reason - } + static int val; + uiBut *but; + + val = modifiers_isSoftbodyEnabled(ob); + but = uiDefButI(block, TOG, REDRAWBUTSOBJECT, "Enable Soft Body", 10,200,150,20, &val, 0, 0, 0, 0, "Sets object to become soft body"); + uiButSetFunc(but, object_softbodies__enable, ob, NULL); + uiDefBut(block, LABEL, 0, "", 160, 200,150,20, NULL, 0.0, 0.0, 0, 0, ""); // alignment reason } if(modifiers_isSoftbodyEnabled(ob)) { diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index c16d5d7cdb0..68572d7e901 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -2223,7 +2223,6 @@ void convertmenu(void) dm= mesh_create_derived_no_deform(ob, NULL); dlm= dm->convertToDispListMesh(dm, 1); displistmesh_to_mesh(dlm, ob1->data); - displistmesh_free(dlm); dm->release(dm); } else if(ob->type==OB_FONT) {