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:
authorDaniel Dunbar <daniel@zuster.org>2005-07-14 19:48:01 +0400
committerDaniel Dunbar <daniel@zuster.org>2005-07-14 19:48:01 +0400
commitbefc2bbc41ee7c8396f9acb781977b1af4915626 (patch)
tree79b88a72113f8f75988896782b0d25502c88a369 /source/blender/blenkernel
parent1261dc7e4ede3169d2a959a10ee428e492eddfeb (diff)
- split makeDispList into makeDispList{Mesh,MBall,CurveTypes}, there is
still a makeDispList that dispatches to the appropriate one. makeDispList is on the way out and this makes it easier to track down exactly which places use makedispList and for what types of objects. - switch calls to makeDispList to appropriate more specific function (if the object type is known by caller). - added mesh_changed function that invalidates cached mesh data (but does not rebuild, mesh data gets rebuilt on access). Most old calls to makeDispListMesh use this instead now.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_displist.h4
-rw-r--r--source/blender/blenkernel/BKE_mesh.h2
-rw-r--r--source/blender/blenkernel/intern/anim.c11
-rw-r--r--source/blender/blenkernel/intern/curve.c2
-rw-r--r--source/blender/blenkernel/intern/displist.c162
-rw-r--r--source/blender/blenkernel/intern/font.c2
-rw-r--r--source/blender/blenkernel/intern/mesh.c7
7 files changed, 116 insertions, 74 deletions
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index 0a79d8e8daa..9a718eec5b9 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -142,6 +142,10 @@ extern void freedisplist(struct ListBase *lb);
extern int displist_has_faces(struct ListBase *lb);
extern float calc_taper(struct Object *taperobj, int cur, int tot);
extern void makeDispList(struct Object *ob);
+extern void mesh_changed(struct Object *meshOb);
+extern void makeDispListMesh(struct Object *ob);
+extern void makeDispListCurveTypes(struct Object *ob);
+extern void makeDispListMBall(struct Object *ob);
extern void set_displist_onlyzero(int val);
extern void shadeDispList(struct Object *ob);
void freefastshade(void);
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 6f4040ace60..ceeb99f5c20 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -75,7 +75,7 @@ void copy_dverts(struct MDeformVert *dst, struct MDeformVert *src, int totvert);
int mesh_uses_displist(struct Mesh *me);
int update_realtime_texture(struct TFace *tface, double time);
void mesh_delete_material_index(struct Mesh *me, int index);
-void mesh_set_smooth_flag(struct Mesh *me, int enableSmooth);
+void mesh_set_smooth_flag(struct Object *meshOb, int enableSmooth);
void make_edges(struct Mesh *me);
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 755ca4df4bc..18ca670a907 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -301,17 +301,6 @@ void frames_duplilist(Object *ob)
if(ob->transflag & OB_DUPLINOSPEED) enable_cu_speed= 0;
- /* this to make sure that something is z-buffered in drawobject.c */
- if(G.background==0 && ob->type==OB_MESH) {
- Mesh *me= ob->data;
- DispList *dl;
- if(me->disp.first==0) addnormalsDispList(ob, &me->disp);
- if(ob->dt==OB_SHADED) {
- dl= ob->disp.first;
- if(dl==0 || dl->col1==0) shadeDispList(ob);
- }
- }
-
for(G.scene->r.cfra= ob->dupsta; G.scene->r.cfra<=ob->dupend; G.scene->r.cfra++) {
ok= 1;
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 2d90d9c75da..98aa41b392e 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -1212,7 +1212,7 @@ void makebevelcurve(Object *ob, ListBase *disp)
dl= bevcu->disp.first;
if(dl==0) {
- makeDispList(cu->bevobj);
+ makeDispListCurveTypes(cu->bevobj);
dl= bevcu->disp.first;
}
while(dl) {
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index b2876260c15..96418176a7a 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -650,12 +650,34 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
}
+static float *mesh_build_faceNormals(Object *meshOb)
+{
+ Mesh *me = meshOb->data;
+ float *nors = MEM_mallocN(sizeof(float)*3*me->totface, "meshnormals");
+ float *n1 = nors;
+ int i;
+
+ for (i=0; i<me->totface; i++,n1+=3) {
+ MFace *mf = &me->mface[i];
+
+ if (mf->v3) {
+ MVert *ve1= &me->mvert[mf->v1];
+ MVert *ve2= &me->mvert[mf->v2];
+ MVert *ve3= &me->mvert[mf->v3];
+ MVert *ve4= &me->mvert[mf->v4];
+
+ if(mf->v4) CalcNormFloat4(ve1->co, ve2->co, ve3->co, ve4->co, n1);
+ else CalcNormFloat(ve1->co, ve2->co, ve3->co, n1);
+ }
+ }
+
+ return nors;
+}
+
void addnormalsDispList(Object *ob, ListBase *lb)
{
DispList *dl = NULL;
Mesh *me;
- MVert *ve1, *ve2, *ve3, *ve4;
- MFace *mface;
float *vdata, *ndata, nor[3];
float *v1, *v2, *v3, *v4;
float *n1, *n2, *n3, *n4;
@@ -678,23 +700,7 @@ void addnormalsDispList(Object *ob, ListBase *lb)
else return;
if(dl->nors==0) {
- dl->nors= MEM_mallocN(sizeof(float)*3*me->totface, "meshnormals");
- n1= dl->nors;
- mface= me->mface;
- a= me->totface;
- while(a--) {
- if(mface->v3) {
- ve1= me->mvert+mface->v1;
- ve2= me->mvert+mface->v2;
- ve3= me->mvert+mface->v3;
- ve4= me->mvert+mface->v4;
-
- if(mface->v4) CalcNormFloat4(ve1->co, ve2->co, ve3->co, ve4->co, n1);
- else CalcNormFloat(ve1->co, ve2->co, ve3->co, n1);
- }
- n1+= 3;
- mface++;
- }
+ dl->nors= mesh_build_faceNormals(ob);
}
return;
@@ -909,7 +915,7 @@ void shadeDispList(Object *ob)
}
}
else if(me->totvert>0) {
- float *vnors, *vn;
+ float *vnors, *vn, *nors;
if(me->orco==0 && need_orco) {
make_orco_mesh(me);
@@ -917,11 +923,7 @@ void shadeDispList(Object *ob)
orco= me->orco;
/* ms= me->msticky; */
- dl= me->disp.first;
- if(dl==0 || dl->nors==0) addnormalsDispList(ob, &me->disp);
- dl= me->disp.first;
- if(dl==0 || dl->nors==0) return;
- nor= dl->nors;
+ nors = nor = mesh_build_faceNormals(ob);
dl= MEM_callocN(sizeof(DispList), "displistshade");
BLI_addtail(&ob->disp, dl);
@@ -1034,6 +1036,7 @@ void shadeDispList(Object *ob)
}
MEM_freeN(vnors);
+ MEM_freeN(nors);
if(me->orco) {
MEM_freeN(me->orco);
@@ -1568,7 +1571,7 @@ float calc_taper(Object *taperobj, int cur, int tot)
cu= taperobj->data;
dl= cu->disp.first;
if(dl==NULL) {
- makeDispList(taperobj);
+ makeDispListCurveTypes(taperobj);
dl= cu->disp.first;
}
if(dl) {
@@ -1601,48 +1604,58 @@ float calc_taper(Object *taperobj, int cur, int tot)
return 1.0;
}
-void makeDispList(Object *ob)
+void mesh_changed(Object *meshOb)
+{
+ Mesh *me = meshOb->data;
+
+ freedisplist(&meshOb->disp);
+ freedisplist(&me->disp);
+
+ if (me->derived) {
+ me->derived->release(me->derived);
+ me->derived = NULL;
+ }
+}
+
+void makeDispListMesh(Object *ob)
{
EditMesh *em = G.editMesh;
Mesh *me;
- Nurb *nu;
- Curve *cu;
- BPoint *bp;
- ListBase dlbev, *dispbase;
- DispList *dl, *dlb;
- BevList *bl;
- BevPoint *bevp;
- float *data, *fp1, widfac, vec[3];
- int len, a, b, draw=0;
- if(ob==NULL) return;
- if(ob->flag & OB_FROMDUPLI) return;
+ if(!ob || (ob->flag&OB_FROMDUPLI) || ob->type!=OB_MESH) return;
freedisplist(&(ob->disp));
- if(ob->type==OB_MESH) {
- me= ob->data;
- freedisplist(&me->disp);
- if (me->derived) {
- me->derived->release(me->derived);
- me->derived= NULL;
- }
+ 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');
+ tex_space_mesh(ob->data);
+
+ if (ob!=G.obedit) mesh_modifier(ob, 's');
- if (mesh_uses_displist(me)) { /* subsurf */
- if (ob==G.obedit) {
- G.editMesh->derived= subsurf_make_derived_from_editmesh(em, me->subdiv, me->subsurftype, G.editMesh->derived);
- } else {
- me->derived= subsurf_make_derived_from_mesh(me, me->subdiv);
- }
+ if (mesh_uses_displist(me)) { /* subsurf */
+ if (ob==G.obedit) {
+ G.editMesh->derived= subsurf_make_derived_from_editmesh(em, me->subdiv, me->subsurftype, G.editMesh->derived);
+ } else {
+ me->derived= subsurf_make_derived_from_mesh(me, me->subdiv);
}
-
- if (ob!=G.obedit) mesh_modifier(ob, 'e');
}
- else if(ob->type==OB_MBALL) {
+
+ if (ob!=G.obedit) mesh_modifier(ob, 'e');
+
+ boundbox_displist(ob);
+}
+void makeDispListMBall(Object *ob)
+{
+ if(!ob || (ob->flag&OB_FROMDUPLI) || ob->type!=OB_MBALL) return;
+
+ freedisplist(&(ob->disp));
+
+ if(ob->type==OB_MBALL) {
if(ob==find_basis_mball(ob)) {
metaball_polygonize(ob);
tex_space_mball(ob);
@@ -1650,8 +1663,28 @@ void makeDispList(Object *ob)
object_deform(ob);
}
}
- else if(ob->type==OB_SURF) {
-
+
+ boundbox_displist(ob);
+}
+void makeDispListCurveTypes(Object *ob)
+{
+ Nurb *nu;
+ Curve *cu;
+ BPoint *bp;
+ ListBase dlbev, *dispbase;
+ DispList *dl, *dlb;
+ BevList *bl;
+ BevPoint *bevp;
+ float *data, *fp1, widfac, vec[3];
+ int len, a, b, draw=0;
+
+ if(!ob || (ob->flag&OB_FROMDUPLI) || !ELEM3(ob->type, OB_SURF, OB_CURVE, OB_FONT)) return;
+ if(ob==NULL) return;
+ if(ob->flag & OB_FROMDUPLI) return;
+
+ freedisplist(&(ob->disp));
+
+ if(ob->type==OB_SURF) {
draw= ob->dt;
cu= ob->data;
dispbase= &(cu->disp);
@@ -1891,6 +1924,17 @@ void makeDispList(Object *ob)
boundbox_displist(ob);
}
+void makeDispList(Object *ob)
+{
+ if (ob->type==OB_MESH) {
+ makeDispListMesh(ob);
+ } else if (ob->type==OB_MBALL) {
+ makeDispListMBall(ob);
+ } else {
+ makeDispListCurveTypes(ob);
+ }
+}
+
/*******************************/
/***** OUTLINE *****/
diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c
index 61869e47040..7d59fb541e0 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -560,7 +560,7 @@ struct chartrans *text_to_curve(Object *ob, int mode)
oldflag= cucu->flag;
cucu->flag |= (CU_PATH+CU_FOLLOW);
- if(cucu->path==NULL) makeDispList(cu->textoncurve);
+ if(cucu->path==NULL) makeDispListCurveTypes(cu->textoncurve);
if(cucu->path) {
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 7ffd409afc5..9c1991e5af9 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -153,6 +153,8 @@ 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);
+
+ BLI_freelistN(&me->modifiers);
}
void copy_dverts(MDeformVert *dst, MDeformVert *src, int copycount)
@@ -1259,7 +1261,8 @@ void mesh_delete_material_index(Mesh *me, int index) {
}
}
-void mesh_set_smooth_flag(Mesh *me, int enableSmooth) {
+void mesh_set_smooth_flag(Object *meshOb, int enableSmooth) {
+ Mesh *me = meshOb->data;
int i;
for (i=0; i<me->totface; i++) {
@@ -1271,4 +1274,6 @@ void mesh_set_smooth_flag(Mesh *me, int enableSmooth) {
mf->flag &= ~ME_SMOOTH;
}
}
+
+ mesh_changed(meshOb);
}