Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h11
-rw-r--r--source/blender/blenkernel/BKE_displist.h3
-rw-r--r--source/blender/blenkernel/BKE_subsurf.h6
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c52
-rw-r--r--source/blender/blenkernel/intern/displist.c21
-rw-r--r--source/blender/blenkernel/intern/effect.c2
-rw-r--r--source/blender/blenkernel/intern/exotic.c1
-rw-r--r--source/blender/blenkernel/intern/mesh.c7
-rw-r--r--source/blender/blenkernel/intern/subsurf.c13
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c32
-rw-r--r--source/blender/blenlib/intern/noise.c5
-rw-r--r--source/blender/blenlib/intern/storage.c16
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h14
-rw-r--r--source/blender/python/api2_2x/NMesh.c1
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c7
-rw-r--r--source/blender/src/buttons_editing.c45
-rw-r--r--source/blender/src/drawmesh.c5
-rw-r--r--source/blender/src/drawobject.c37
-rw-r--r--source/blender/src/edit.c2
-rw-r--r--source/blender/src/editmesh_mods.c7
-rw-r--r--source/blender/src/editobject.c9
21 files changed, 166 insertions, 130 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index e8a6a82ff48..4fb8ae49052 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -46,6 +46,7 @@
*/
struct Object;
+struct EditMesh;
struct DispListMesh;
typedef struct DerivedMesh DerivedMesh;
@@ -146,14 +147,18 @@ struct DerivedMesh {
void (*release)(DerivedMesh *dm);
};
+ /* Internal function, just temporarily exposed */
+DerivedMesh *derivedmesh_from_displistmesh(struct EditMesh *em, struct DispListMesh *dlm);
+
DerivedMesh *mesh_get_derived(struct Object *ob);
-DerivedMesh *mesh_get_derived_render(struct Object *ob);
DerivedMesh *mesh_get_base_derived(struct Object *ob);
+DerivedMesh *mesh_get_derived_render(struct Object *ob, int *needsFree_r);
+
/* Utility function, just chooses appropriate DerivedMesh based
- * on mesh flags.
+ * on mesh flags. Release result if *needsFree_r is true.
*/
-DerivedMesh *mesh_get_cage_derived(struct Object *ob);
+DerivedMesh *mesh_get_cage_derived(struct Object *ob, int *needsFree_r);
#endif
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index 0146d1a2341..ac8c601c5a5 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -45,7 +45,6 @@
#define DL_VERTCOL 6
#define DL_VERTS 7
#define DL_NORS 8
-#define DL_MESH 9
/* dl->flag */
#define DL_CYCL_U 1
@@ -133,8 +132,6 @@ typedef struct DispList {
float *verts, *nors;
int *index;
unsigned int *col1, *col2;
- struct DispListMesh *mesh;
-
} DispList;
extern void copy_displist(struct ListBase *lbn, struct ListBase *lb);
diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h
index a23cd5755d1..39ea8c7a0c6 100644
--- a/source/blender/blenkernel/BKE_subsurf.h
+++ b/source/blender/blenkernel/BKE_subsurf.h
@@ -33,12 +33,12 @@
struct Mesh;
struct Object;
-struct Displist;
struct DispListMesh;
+struct DerivedMesh;
struct EditMesh;
-struct DispListMesh *subsurf_make_dispListMesh_from_editmesh(struct EditMesh *em, int subdivLevels, int flags, short type);
-struct DispListMesh *subsurf_make_dispListMesh_from_mesh(struct Mesh *me, int subdivLevels, int flags);
+struct DerivedMesh *subsurf_make_derived_from_editmesh(struct EditMesh *em, int subdivLevels, int flags, short type);
+struct DerivedMesh *subsurf_make_derived_from_mesh(struct Mesh *me, int subdivLevels, int flags);
#ifdef USE_CCGSUBSURFLIB
struct DispListMesh *subsurf_ccg_make_dispListMesh_from_editmesh(struct EditMesh *em, int subdivLevels, int flags);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index c8d820db281..1c6b6ebe2d3 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -20,7 +20,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * The Original Code is Copyright (C) 2005 Blender Foundation.
* All rights reserved.
*
* The Original Code is: all of this file.
@@ -1072,14 +1072,12 @@ static void ssDM_release(DerivedMesh *dm)
{
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- if (ssdm->needsFree) {
- displistmesh_free(ssdm->dlm);
- }
+ displistmesh_free(ssdm->dlm);
MEM_freeN(dm);
}
-static DerivedMesh *getSSDerivedMesh(EditMesh *em, DispListMesh *dlm, int needsFree)
+DerivedMesh *derivedmesh_from_displistmesh(EditMesh *em, DispListMesh *dlm)
{
SSDerivedMesh *ssdm = MEM_mallocN(sizeof(*ssdm), "dm");
@@ -1110,7 +1108,6 @@ static DerivedMesh *getSSDerivedMesh(EditMesh *em, DispListMesh *dlm, int needsF
ssdm->dlm = dlm;
ssdm->em = em;
- ssdm->needsFree = needsFree;
return (DerivedMesh*) ssdm;
}
@@ -1145,50 +1142,28 @@ DerivedMesh *mesh_get_derived(Object *ob)
Mesh *me= ob->data;
if (mesh_uses_displist(me)) {
- DispList *dl;
-
build_mesh_data(ob);
- dl= find_displist(&me->disp, DL_MESH);
-
- // XXX, This test should not be here because
- // build_mesh_data should have made DLM... problem
- // is there is an exception for objects from dupli,
- // they only get displist built for first object.
- //
- // Would work fine except countall gets a derived
- // mesh before the displist has been evaluated.
- if (dl) {
- if(G.obedit && me==G.obedit->data) {
- return getSSDerivedMesh(G.editMesh, dl->mesh, 0);
- } else {
- return getSSDerivedMesh(NULL, dl->mesh, 0);
- }
- }
+
+ return me->derived;
}
return NULL;
}
-DerivedMesh *mesh_get_derived_render(Object *ob)
+DerivedMesh *mesh_get_derived_render(Object *ob, int *needsFree)
{
Mesh *me= ob->data;
if (mesh_uses_displist(me)) {
if (me->subdiv==me->subdivr) {
- DispList *dl= find_displist(&me->disp, DL_MESH);
-
- if(G.obedit && me==G.obedit->data) {
- return getSSDerivedMesh(G.editMesh, dl->mesh, 0);
- } else {
- return getSSDerivedMesh(NULL, dl->mesh, 0);
- }
+ *needsFree = 0;
+ return me->derived;
} else {
+ *needsFree = 1;
if(G.obedit && me==G.obedit->data) {
- DispListMesh *dlm = subsurf_make_dispListMesh_from_editmesh(G.editMesh, me->subdivr, me->flag, me->subsurftype);
- return getSSDerivedMesh(G.editMesh, dlm, 1);
+ return subsurf_make_derived_from_editmesh(G.editMesh, me->subdivr, me->flag, me->subsurftype);
} else {
- DispListMesh *dlm = subsurf_make_dispListMesh_from_mesh(me, me->subdivr, me->flag);
- return getSSDerivedMesh(NULL, dlm, 1);
+ return subsurf_make_derived_from_mesh(me, me->subdivr, me->flag);
}
}
}
@@ -1212,15 +1187,18 @@ DerivedMesh *mesh_get_base_derived(Object *ob)
}
}
-DerivedMesh *mesh_get_cage_derived(struct Object *ob)
+DerivedMesh *mesh_get_cage_derived(struct Object *ob, int *needsFree)
{
Mesh *me= ob->data;
DerivedMesh *dm = NULL;
+ *needsFree = 0;
+
if (me->flag&ME_OPT_EDGES) {
dm = mesh_get_derived(ob);
}
if (!dm) {
+ *needsFree = 1;
dm = mesh_get_base_derived(ob);
}
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 7387aa545f2..739376591ef 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -328,7 +328,6 @@ void free_disp_elem(DispList *dl)
if(dl->index) MEM_freeN(dl->index);
if(dl->col1) MEM_freeN(dl->col1);
if(dl->col2) MEM_freeN(dl->col2);
- if(dl->mesh) displistmesh_free(dl->mesh);
MEM_freeN(dl);
}
}
@@ -411,7 +410,7 @@ int displist_has_faces(ListBase *lb)
dl= lb->first;
while(dl) {
- if ELEM6(dl->type, DL_INDEX3, DL_INDEX4, DL_SURF, DL_MESH, DL_TRIA, DL_POLY)
+ if ELEM5(dl->type, DL_INDEX3, DL_INDEX4, DL_SURF, DL_TRIA, DL_POLY)
return 1;
dl= dl->next;
}
@@ -434,7 +433,6 @@ void copy_displist(ListBase *lbn, ListBase *lb)
dln->index= MEM_dupallocN(dl->index);
dln->col1= MEM_dupallocN(dl->col1);
dln->col2= MEM_dupallocN(dl->col2);
- if (dl->mesh) dln->mesh= displistmesh_copy(dl->mesh);
dl= dl->next;
}
@@ -947,8 +945,6 @@ void shadeDispList(Object *ob)
dlm= dm->convertToDispListMesh(dm);
- dm->release(dm);
-
if (dlm && dlm->totvert) {
float *vnors, *vn;
int i;
@@ -1769,24 +1765,21 @@ void makeDispList(Object *ob)
if(ob->type==OB_MESH) {
me= ob->data;
freedisplist(&(me->disp));
+ if (me->derived) {
+ me->derived->release(me->derived);
+ me->derived= NULL;
+ }
tex_space_mesh(ob->data);
if (ob!=G.obedit) mesh_modifier(ob, 's');
if (mesh_uses_displist(me)) { /* subsurf */
- DispListMesh *dlm;
-
if (ob==G.obedit) {
- dlm= subsurf_make_dispListMesh_from_editmesh(em, me->subdiv, me->flag, me->subsurftype);
+ me->derived= subsurf_make_derived_from_editmesh(em, me->subdiv, me->flag, me->subsurftype);
} else {
- dlm= subsurf_make_dispListMesh_from_mesh(me, me->subdiv, me->flag);
+ me->derived= subsurf_make_derived_from_mesh(me, me->subdiv, me->flag);
}
-
- dl= MEM_callocN(sizeof(*dl), "dl");
- dl->type= DL_MESH;
- dl->mesh= dlm;
- BLI_addtail(&me->disp, dl);
}
if (ob!=G.obedit) mesh_modifier(ob, 'e');
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index d283c5808c6..6fe6b708f58 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -1234,8 +1234,6 @@ void build_particle_system(Object *ob)
DerivedMesh *dm = mesh_get_derived(ob);
dlm = dm->convertToDispListMesh(dm);
-
- dm->release(dm);
} else {
dlm = NULL;
}
diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c
index 2c16b76235a..cc96a0fdc4f 100644
--- a/source/blender/blenkernel/intern/exotic.c
+++ b/source/blender/blenkernel/intern/exotic.c
@@ -2559,7 +2559,6 @@ static int write_object_stl(FILE *fpSTL, Object *ob, Mesh *me)
numfacets += write_displistmesh_stl(fpSTL, ob, dlm);
displistmesh_free(dlm);
- dm->release(dm);
}
else {
numfacets += write_mesh_stl(fpSTL, ob, me);
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 039ce481a76..53f6f724b22 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -55,6 +55,7 @@
#include "DNA_meshdata_types.h"
#include "BKE_main.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_subsurf.h"
@@ -151,6 +152,7 @@ void free_mesh(Mesh *me)
if(me->bb) MEM_freeN(me->bb);
if(me->disp.first) freedisplist(&me->disp);
+ if(me->derived) me->derived->release(me->derived);
}
void copy_dverts(MDeformVert *dst, MDeformVert *src, int copycount)
@@ -422,6 +424,7 @@ void tex_space_mesh(Mesh *me)
void make_orco_displist_mesh(Object *ob, int subdivlvl)
{
Mesh *me;
+ DerivedMesh *dm;
DispListMesh *dlm;
int i;
@@ -432,7 +435,9 @@ void make_orco_displist_mesh(Object *ob, int subdivlvl)
cp_key(0, me->totvert, me->totvert, (char*) me->mvert->co, me->key, me->key->refkey, 0);
}
- dlm= subsurf_make_dispListMesh_from_mesh(me, subdivlvl, me->flag);
+ dm= subsurf_make_derived_from_mesh(me, subdivlvl, me->flag);
+ dlm= dm->convertToDispListMesh(dm);
+ dm->release(dm);
/* Restore correct key */
do_ob_key(ob);
diff --git a/source/blender/blenkernel/intern/subsurf.c b/source/blender/blenkernel/intern/subsurf.c
index 6baba62053a..8c8863c3324 100644
--- a/source/blender/blenkernel/intern/subsurf.c
+++ b/source/blender/blenkernel/intern/subsurf.c
@@ -53,6 +53,7 @@
#include "BKE_mesh.h"
#include "BKE_subsurf.h"
#include "BKE_displist.h"
+#include "BKE_DerivedMesh.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
@@ -1094,7 +1095,7 @@ static DispListMesh *subsurf_subdivide_to_displistmesh(HyperMesh *hme, short sub
return dlm;
}
-DispListMesh *subsurf_make_dispListMesh_from_editmesh(EditMesh *em, int subdivLevels, int flags, short type) {
+static DispListMesh *subsurf_make_dispListMesh_from_editmesh(EditMesh *em, int subdivLevels, int flags, short type) {
if (subdivLevels<1) {
return displistmesh_from_editmesh(em);
#ifdef USE_CCGSUBSURFLIB
@@ -1108,7 +1109,11 @@ DispListMesh *subsurf_make_dispListMesh_from_editmesh(EditMesh *em, int subdivLe
}
}
-DispListMesh *subsurf_make_dispListMesh_from_mesh(Mesh *me, int subdivLevels, int flags) {
+DerivedMesh *subsurf_make_derived_from_editmesh(EditMesh *em, int subdivLevels, int flags, short type) {
+ return derivedmesh_from_displistmesh(em, subsurf_make_dispListMesh_from_editmesh(em, subdivLevels, flags, type));
+}
+
+static DispListMesh *subsurf_make_dispListMesh_from_mesh(Mesh *me, int subdivLevels, int flags) {
if (subdivLevels<1) {
return displistmesh_from_mesh(me, NULL);
#ifdef USE_CCGSUBSURFLIB
@@ -1122,6 +1127,10 @@ DispListMesh *subsurf_make_dispListMesh_from_mesh(Mesh *me, int subdivLevels, in
}
}
+DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, int subdivLevels, int flags) {
+ return derivedmesh_from_displistmesh(NULL, subsurf_make_dispListMesh_from_mesh(me, subdivLevels, flags));
+}
+
// editarmature.c
void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
{
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 88b2eecf891..98b47482d0c 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1,3 +1,35 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2005 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
#ifdef USE_CCGSUBSURFLIB
#include <stdlib.h>
diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c
index 1eaff59bf7b..7797557c1f7 100644
--- a/source/blender/blenlib/intern/noise.c
+++ b/source/blender/blenlib/intern/noise.c
@@ -39,11 +39,6 @@
#include <config.h>
#endif
-#ifdef _WIN32
-#pragma warning (once : 4244) // "conversion from double to float"
-#pragma warning (once : 4305) // "truncation from const double to float"
-#endif
-
/* local */
float noise3_perlin(float vec[3]);
float turbulence_perlin(float *point, float lofreq, float hifreq);
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index c937fa02b43..50ac321d353 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -321,7 +321,6 @@ void BLI_adddirstrings()
struct direntry * file;
struct tm *tm;
time_t zero= 0;
- struct passwd *pwuser;
file = &files[0];
@@ -356,12 +355,15 @@ void BLI_adddirstrings()
#ifdef WIN32
strcpy(files[num].owner,"user");
#else
- pwuser = getpwuid(files[num].s.st_uid);
- if ( pwuser ) {
- strcpy(files[num].owner, pwuser->pw_name);
- } else {
- sprintf(files[num].owner, "%d", files[num].s.st_uid);
- }
+ {
+ struct passwd *pwuser;
+ pwuser = getpwuid(files[num].s.st_uid);
+ if ( pwuser ) {
+ strcpy(files[num].owner, pwuser->pw_name);
+ } else {
+ sprintf(files[num].owner, "%d", files[num].s.st_uid);
+ }
+ }
#endif
tm= localtime(&files[num].s.st_mtime);
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index 79bf76618a6..796a06a21e6 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -35,6 +35,8 @@
#include "DNA_listBase.h"
#include "DNA_ID.h"
+struct DerivedMesh;
+struct DispListMesh;
struct Ipo;
struct Key;
struct Material;
@@ -77,6 +79,11 @@ typedef struct Mesh {
struct Mesh *texcomesh;
float *orco;
+ /* not written in file, caches derived mesh */
+ struct DerivedMesh *derived;
+ /* hacky place to store temporary decimated mesh */
+ struct DispListMesh *decimated;
+
struct OcInfo *oc; /* not written in file */
void *sumohandle;
@@ -87,14 +94,13 @@ typedef struct Mesh {
float size[3];
float rot[3];
+ float cubemapsize, pad;
+
short smoothresh, flag;
- short subdiv, subdivr, subdivdone;
+ short subdiv, subdivr;
short totcol;
short subsurftype;
- short reserved1; /* Padding */
-
- float cubemapsize;
} Mesh;
diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c
index 563ceed2722..9a833045a13 100644
--- a/source/blender/python/api2_2x/NMesh.c
+++ b/source/blender/python/api2_2x/NMesh.c
@@ -2169,7 +2169,6 @@ static PyObject *M_NMesh_GetRawFromObject( PyObject * self, PyObject * args )
DispListMesh *dlm = dm->convertToDispListMesh(dm);
nmesh = new_NMesh_internal( me, dlm, NULL );
displistmesh_free(dlm);
- dm->release(dm);
}
else if( ( dl = find_displist( &ob->disp, DL_VERTS ) ) )
nmesh = new_NMesh_internal( me, NULL, dl->verts );
diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c
index 563600e69e1..0d67fe6478a 100644
--- a/source/blender/renderconverter/intern/convertBlenderScene.c
+++ b/source/blender/renderconverter/intern/convertBlenderScene.c
@@ -1354,9 +1354,12 @@ static void init_render_mesh(Object *ob)
do_puno= mesh_modifier(ob, 's');
if (mesh_uses_displist(me)) {
- DerivedMesh *dm = mesh_get_derived_render(ob);
+ int needsFree;
+ DerivedMesh *dm = mesh_get_derived_render(ob, &needsFree);
dlm = dm->convertToDispListMesh(dm);
- dm->release(dm);
+ if (needsFree) {
+ dm->release(dm);
+ }
mvert= dlm->mvert;
totvert= dlm->totvert;
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index 7829aa467bd..b228bd444b6 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -264,7 +264,6 @@ static void decimate_faces(void)
if(LOD_LoadMesh(&lod) ) {
if( LOD_PreprocessMesh(&lod) ) {
- DispList *dl;
DispListMesh *dlm;
MFace *mfaceint;
@@ -275,11 +274,11 @@ static void decimate_faces(void)
}
/* ok, put back the stuff in a displist */
- freedisplist(&(ob->disp));
- dl= MEM_callocN(sizeof(DispList), "disp");
- BLI_addtail(&ob->disp, dl);
- dl->type= DL_MESH;
- dlm=dl->mesh= MEM_callocN(sizeof(DispListMesh), "dispmesh");
+ if (me->decimated) {
+ displistmesh_free(me->decimated);
+ }
+
+ dlm= me->decimated= MEM_callocN(sizeof(DispListMesh), "dispmesh");
dlm->mvert= MEM_callocN(lod.vertex_num*sizeof(MVert), "mvert");
dlm->mface= MEM_callocN(lod.face_num*sizeof(MFace), "mface");
dlm->totvert= lod.vertex_num;
@@ -320,8 +319,14 @@ static void decimate_cancel(void)
ob= OBACT;
if(ob) {
- freedisplist(&ob->disp);
- makeDispList(ob);
+ if (ob->type==OB_MESH) {
+ Mesh *me = ob->data;
+
+ if (me->decimated) {
+ displistmesh_free(me->decimated);
+ me->decimated = NULL;
+ }
+ }
}
allqueue(REDRAWVIEW3D, 0);
}
@@ -329,9 +334,6 @@ static void decimate_cancel(void)
static void decimate_apply(void)
{
Object *ob;
- DispList *dl;
- DispListMesh *dlm;
- Mesh *me;
MFace *mface;
MFace *mfaceint;
int a;
@@ -339,11 +341,11 @@ static void decimate_apply(void)
if(G.obedit) return;
ob= OBACT;
- if(ob) {
- dl= ob->disp.first;
- if(dl && dl->mesh) {
- dlm= dl->mesh;
- me= ob->data;
+ if(ob && ob->type==OB_MESH) {
+ Mesh *me = ob->data;
+
+ if (me->decimated) {
+ DispListMesh *dlm= me->decimated;
// vertices
if(me->mvert) MEM_freeN(me->mvert);
@@ -369,7 +371,8 @@ static void decimate_apply(void)
test_index_mface(mface, 3);
}
- freedisplist(&ob->disp);
+ displistmesh_free(me->decimated);
+ me->decimated= NULL;
G.obedit= ob;
make_editMesh();
@@ -709,11 +712,11 @@ static void editing_panel_mesh_type(Object *ob, Mesh *me)
/* decimator */
if(G.obedit==NULL) {
int tottria= decimate_count_tria(ob);
- DispList *dl;
+ Mesh *me = ob->data;
- // wacko, wait for new displist system (ton)
- if( (dl=ob->disp.first) && dl->mesh);
- else decim_faces= tottria;
+ if (!me->decimated) {
+ decim_faces= tottria;
+ }
uiBlockBeginAlign(block);
uiBlockSetCol(block, TH_BUT_SETTING1);
diff --git a/source/blender/src/drawmesh.c b/source/blender/src/drawmesh.c
index 969aa2300be..bca1729cf6e 100644
--- a/source/blender/src/drawmesh.c
+++ b/source/blender/src/drawmesh.c
@@ -933,11 +933,12 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
if(mesh_uses_displist(me) && editing==0) {
dm = mesh_get_derived(ob);
+ dm->drawFacesTex(dm, draw_tface_mesh__set_draw);
} else {
dm = mesh_get_base_derived(ob);
+ dm->drawFacesTex(dm, draw_tface_mesh__set_draw);
+ dm->release(dm);
}
- dm->drawFacesTex(dm, draw_tface_mesh__set_draw);
- dm->release(dm);
start = 0;
totface = me->totface;
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index d12b767290a..2c3796c2496 100644
--- a/source/blender/src/drawobject.c
+++ b/source/blender/src/drawobject.c
@@ -1000,9 +1000,8 @@ void calc_mesh_facedots_ext(void)
}
/* window coord, assuming all matrices are set OK */
-static void calc_meshverts(void)
+static void calc_meshverts(DerivedMesh *dm)
{
- DerivedMesh *dm = mesh_get_cage_derived(G.obedit);
float co[3], mat[4][4];
EditVert *eve;
@@ -1017,26 +1016,31 @@ static void calc_meshverts(void)
}
MTC_Mat4SwapMat4(G.vd->persmat, mat);
- dm->release(dm);
}
/* window coord for current window, sets matrices temporal */
void calc_meshverts_ext(void)
{
+ int dmNeedsFree;
+ DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree);
areawinset(curarea->win);
persp(PERSP_VIEW);
mymultmatrix(G.obedit->obmat);
- calc_meshverts();
+ calc_meshverts(dm);
myloadmatrix(G.vd->viewmat);
-
+
+ if (dmNeedsFree) {
+ dm->release(dm);
+ }
}
/* window coord for current window, sets matrices temporal, sets (eve->f & 2) when not visible */
void calc_meshverts_ext_f2(void)
{
- DerivedMesh *dm = mesh_get_cage_derived(G.obedit);
+ int dmNeedsFree;
+ DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree);
float co[3], mat[4][4];
EditVert *eve;
@@ -1063,7 +1067,9 @@ void calc_meshverts_ext_f2(void)
MTC_Mat4SwapMat4(G.vd->persmat, mat);
myloadmatrix(G.vd->viewmat);
- dm->release(dm);
+ if (dmNeedsFree) {
+ dm->release(dm);
+ }
}
@@ -1569,8 +1575,7 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *baseDM, Derived
}
if(ob==G.obedit) {
- // XXX Not clear this is needed here. - zr
- calc_meshverts();
+ calc_meshverts(cageDM);
draw_em_fancy_verts(em, cageDM);
if(G.f & G_DRAWNORMALS) {
@@ -1620,8 +1625,8 @@ static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *realDM
// This is only for objects from the decimator and
// is a temporal solution, a reconstruction of the
// displist system should take care of it (zr/ton)
- if(obDL && obDL->mesh) {
- DispListMesh *dlm = obDL->mesh;
+ if(me->decimated) {
+ DispListMesh *dlm = me->decimated;
MVert *mvert= dlm->mvert;
MFace *mface= dlm->mface;
int i;
@@ -1751,9 +1756,6 @@ static void draw_mesh_object(Object *ob, int dt)
}
baseDM->release(baseDM);
- if (realDM) {
- realDM->release(realDM);
- }
}
/* ************** DRAW DISPLIST ****************** */
@@ -3737,6 +3739,7 @@ static int bbs_mesh_solid(Object *ob, DerivedMesh *dm, int facecol)
void draw_object_backbufsel(Object *ob)
{
extern int em_solidoffs, em_wireoffs, em_vertoffs; // let linker solve it... from editmesh_mods.c
+ int dmNeedsFree;
DerivedMesh *dm;
mymultmatrix(ob->obmat);
@@ -3746,7 +3749,7 @@ void draw_object_backbufsel(Object *ob)
switch( ob->type) {
case OB_MESH:
- dm = mesh_get_cage_derived(ob);
+ dm = mesh_get_cage_derived(ob, &dmNeedsFree);
if(G.obedit) {
em_solidoffs= bbs_mesh_solid(ob, dm, G.scene->selectmode & SCE_SELECT_FACE);
@@ -3764,7 +3767,9 @@ void draw_object_backbufsel(Object *ob)
}
else bbs_mesh_solid(ob, dm, 1); // 1= facecol, faceselect
- dm->release(dm);
+ if (dmNeedsFree) {
+ dm->release(dm);
+ }
break;
case OB_CURVE:
case OB_SURF:
diff --git a/source/blender/src/edit.c b/source/blender/src/edit.c
index 35b973fc151..fdcdf2401c1 100644
--- a/source/blender/src/edit.c
+++ b/source/blender/src/edit.c
@@ -495,8 +495,6 @@ void count_object(Object *ob, int sel)
if (dm) {
totvert= dm->getNumVerts(dm);
totface= dm->getNumFaces(dm);
-
- dm->release(dm);
} else {
totvert= me->totvert;
totface= me->totface;
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index dd5422ff449..1a87e5ada3d 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -628,7 +628,8 @@ static EditFace *findnearestface(short *dist)
/* for interactivity, frontbuffer draw in current window */
static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
{
- DerivedMesh *dm = mesh_get_cage_derived(G.obedit);
+ int dmNeedsFree;
+ DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree);
glDrawBuffer(GL_FRONT);
@@ -711,7 +712,9 @@ static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
/* signal that frontbuf differs from back */
curarea->win_swap= WIN_FRONT_OK;
- dm->release(dm);
+ if (dmNeedsFree) {
+ dm->release(dm);
+ }
}
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index d139b05a6f8..748d6508f55 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -96,6 +96,7 @@
#include "BKE_booleanops.h"
#include "BKE_curve.h"
#include "BKE_displist.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_effect.h"
#include "BKE_font.h"
#include "BKE_global.h"
@@ -2151,6 +2152,7 @@ void convertmenu(void)
if (mesh_uses_displist(oldme)) {
DispListMesh *dlm;
+ DerivedMesh *dm;
basedel = base;
@@ -2177,8 +2179,11 @@ void convertmenu(void)
me->mat= MEM_dupallocN(oldme->mat);
for(a=0; a<ob1->totcol; a++) id_us_plus((ID *)me->mat[a]);
}
-
- dlm= subsurf_make_dispListMesh_from_mesh(oldme, oldme->subdiv, oldme->flag);
+
+ dm= subsurf_make_derived_from_mesh(oldme, oldme->subdiv, oldme->flag);
+ dlm= dm->convertToDispListMesh(dm);
+ dm->release(dm);
+
displistmesh_to_mesh(dlm, ob1->data);
displistmesh_free(dlm);