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:
authorSergey Sharybin <sergey.vfx@gmail.com>2011-01-05 13:40:38 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2011-01-05 13:40:38 +0300
commit64c3ea272e7be85c0f589a6f28eae28d7e7d0a9e (patch)
tree05372140ca547e1c9d2bccf90df528cf9da087dc /source/blender
parent730634ca51d730630b083c8312b99c2b3fc7f49f (diff)
Todo item: linked curve objects behaves incorrect with modifiers
Use object's displists for storing deformed tesselated curve. Was unable to totally get rid of curve's displist because of how texture space is calculating.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c2
-rw-r--r--source/blender/blenkernel/intern/curve.c4
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c13
-rw-r--r--source/blender/blenkernel/intern/displist.c27
-rw-r--r--source/blender/blenkernel/intern/mesh.c2
-rw-r--r--source/blender/editors/object/object_add.c15
-rw-r--r--source/blender/editors/space_info/info_stats.c5
-rw-r--r--source/blender/editors/space_view3d/drawobject.c13
-rw-r--r--source/blender/makesdna/DNA_curve_types.h2
9 files changed, 42 insertions, 41 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 8030a3655ad..efdfdbc986f 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -1644,7 +1644,7 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *UNUSED(me))
DerivedMesh *CDDM_from_curve(Object *ob)
{
- return CDDM_from_curve_customDB(ob, &((Curve *)ob->data)->disp);
+ return CDDM_from_curve_customDB(ob, &ob->disp);
}
DerivedMesh *CDDM_from_curve_customDB(Object *ob, ListBase *dispbase)
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 6368c139baf..6dd3eb43e29 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -1266,10 +1266,10 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
makeDispListCurveTypes_forRender(scene, cu->bevobj, &bevdisp, NULL, 0);
dl= bevdisp.first;
} else {
- dl= bevcu->disp.first;
+ dl= cu->bevobj->disp.first;
if(dl==0) {
makeDispListCurveTypes(scene, cu->bevobj, 0);
- dl= bevcu->disp.first;
+ dl= cu->bevobj->disp.first;
}
}
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 81a6b4a19e2..2429c098ec9 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -2330,23 +2330,10 @@ static void dag_id_flush_update(Scene *sce, ID *id)
idtype= GS(id->name);
if(ELEM7(idtype, ID_ME, ID_CU, ID_MB, ID_LA, ID_LT, ID_CA, ID_AR)) {
- int first_ob= 1;
for(obt=bmain->object.first; obt; obt= obt->id.next) {
if(!(ob && obt == ob) && obt->data == id) {
-
- /* try to avoid displist recalculation for linked curves */
- if (!first_ob && ELEM(obt->type, OB_CURVE, OB_SURF)) {
- /* if curve object has got derivedFinal it means this
- object has got constructive modifiers and object
- should be recalculated anyhow */
- if (!obt->derivedFinal)
- continue;
- }
-
obt->recalc |= OB_RECALC_DATA;
BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
-
- first_ob= 0;
}
}
}
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 0ee85624bee..612d0d4fe38 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -660,7 +660,7 @@ void shadeDispList(Scene *scene, Base *base)
/* now we need the normals */
cu= ob->data;
- dl= cu->disp.first;
+ dl= ob->disp.first;
while(dl) {
extern Material defmaterial; /* material.c */
@@ -1140,16 +1140,14 @@ static void curve_to_filledpoly(Curve *cu, ListBase *UNUSED(nurb), ListBase *dis
*/
float calc_taper(Scene *scene, Object *taperobj, int cur, int tot)
{
- Curve *cu;
DispList *dl;
if(taperobj==NULL || taperobj->type!=OB_CURVE) return 1.0;
- cu= taperobj->data;
- dl= cu->disp.first;
+ dl= taperobj->disp.first;
if(dl==NULL) {
makeDispListCurveTypes(scene, taperobj, 0);
- dl= cu->disp.first;
+ dl= taperobj->disp.first;
}
if(dl) {
float fac= ((float)cur)/(float)(tot-1);
@@ -1678,6 +1676,11 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
}
}
+ /* make copy of 'undeformed" displist for texture space calculation
+ actually, it's not totally undeformed -- pre-tesselation modifiers are
+ already applied, thats how it worked for years, so keep for compatibility (sergey) */
+ copy_displist(&cu->disp, dispbase);
+
if (!forRender) {
tex_space_curve(cu);
}
@@ -1851,6 +1854,11 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
if(cu->flag & CU_PATH) calc_curvepath(ob);
+ /* make copy of 'undeformed" displist for texture space calculation
+ actually, it's not totally undeformed -- pre-tesselation modifiers are
+ already applied, thats how it worked for years, so keep for compatibility (sergey) */
+ copy_displist(&cu->disp, dispbase);
+
if (!forRender) {
tex_space_curve(cu);
}
@@ -1865,13 +1873,16 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco)
{
- Curve *cu = ob->data;
+ Curve *cu= ob->data;
ListBase *dispbase;
freedisplist(&(ob->disp));
- dispbase= &(cu->disp);
+ dispbase= &(ob->disp);
freedisplist(dispbase);
+ /* free displist used for textspace */
+ freedisplist(&cu->disp);
+
do_makeDispListCurveTypes(scene, ob, dispbase, &ob->derivedFinal, 0, forOrco);
if (ob->derivedFinal) {
@@ -1941,7 +1952,7 @@ static void boundbox_displist(Object *ob)
if(cu->bb==0) cu->bb= MEM_callocN(sizeof(BoundBox), "boundbox");
bb= cu->bb;
- dl= cu->disp.first;
+ dl= ob->disp.first;
while (dl) {
if(dl->type==DL_INDEX3) tot= dl->nr;
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 7a72207ff69..03fab0718da 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -735,7 +735,7 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
int nurbs_to_mdata(Object *ob, MVert **allvert, int *totvert,
MEdge **alledge, int *totedge, MFace **allface, int *totface)
{
- return nurbs_to_mdata_customdb(ob, &((Curve *)ob->data)->disp,
+ return nurbs_to_mdata_customdb(ob, &ob->disp,
allvert, totvert, alledge, totedge, allface, totface);
}
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index fdf46ea19a7..696d8bc2c6f 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -1036,9 +1036,7 @@ static EnumPropertyItem convert_target_items[]= {
static void curvetomesh(Scene *scene, Object *ob)
{
- Curve *cu= ob->data;
-
- if(cu->disp.first==0)
+ if(ob->disp.first==0)
makeDispListCurveTypes(scene, ob, 0); /* force creation */
nurbs_to_mesh(ob); /* also does users */
@@ -1188,7 +1186,7 @@ static int convert_exec(bContext *C, wmOperator *op)
cu= newob->data;
- if (!cu->disp.first)
+ if (!newob->disp.first)
makeDispListCurveTypes(scene, newob, 0);
newob->type= OB_CURVE;
@@ -1225,8 +1223,12 @@ static int convert_exec(bContext *C, wmOperator *op)
for(nu=cu->nurb.first; nu; nu=nu->next)
nu->charidx= 0;
- if(target == OB_MESH)
+ if(target == OB_MESH) {
curvetomesh(scene, newob);
+
+ /* meshes doesn't use displist */
+ freedisplist(&newob->disp);
+ }
}
else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
ob->flag |= OB_DONE;
@@ -1243,6 +1245,9 @@ static int convert_exec(bContext *C, wmOperator *op)
newob->data= copy_curve(ob->data);
} else {
newob= ob;
+
+ /* meshes doesn't use displist */
+ freedisplist(&newob->disp);
}
curvetomesh(scene, newob);
diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c
index 7a6e5dad017..b4185d1b958 100644
--- a/source/blender/editors/space_info/info_stats.c
+++ b/source/blender/editors/space_info/info_stats.c
@@ -91,13 +91,12 @@ static void stats_object(Object *ob, int sel, int totob, SceneStats *stats)
case OB_SURF:
case OB_CURVE:
case OB_FONT: {
- Curve *cu= ob->data;
int tot= 0, totf= 0;
stats->totcurve += totob;
- if(cu->disp.first)
- count_displist(&cu->disp, &tot, &totf);
+ if(ob->disp.first)
+ count_displist(&ob->disp, &tot, &totf);
tot *= totob;
totf *= totob;
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index e62b3c6746f..d17657f086a 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -3146,7 +3146,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
case OB_CURVE:
cu= ob->data;
- lb= &cu->disp;
+ lb= &ob->disp;
if(solid) {
dl= lb->first;
@@ -3193,7 +3193,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
break;
case OB_SURF:
- lb= &((Curve *)ob->data)->disp;
+ lb= &ob->disp;
if(solid) {
dl= lb->first;
@@ -5436,7 +5436,7 @@ static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if (dm) {
hasfaces= dm->getNumFaces(dm);
} else {
- hasfaces= displist_has_faces(&cu->disp);
+ hasfaces= displist_has_faces(&ob->disp);
}
if (hasfaces && boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) {
@@ -5444,7 +5444,7 @@ static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if (dm) {
draw_mesh_object_outline(v3d, ob, dm);
} else {
- drawDispListwire(&cu->disp);
+ drawDispListwire(&ob->disp);
}
draw_index_wire= 1;
}
@@ -5499,7 +5499,7 @@ static void drawWireExtra(Scene *scene, RegionView3D *rv3d, Object *ob)
if (ob->derivedFinal) {
drawCurveDMWired(ob);
} else {
- drawDispListwire(&cu->disp);
+ drawDispListwire(&ob->disp);
}
if (ob->type==OB_CURVE)
@@ -5820,9 +5820,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* bad exception, solve this! otherwise outline shows too late */
if(ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- cu= ob->data;
/* still needed for curves hidden in other layers. depgraph doesnt handle that yet */
- if (cu->disp.first==NULL) makeDispListCurveTypes(scene, ob, 0);
+ if (ob->disp.first==NULL) makeDispListCurveTypes(scene, ob, 0);
}
/* draw outline for selected objects, mesh does itself */
diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h
index de6416e4488..08d5258f34b 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -171,7 +171,7 @@ typedef struct Curve {
struct BoundBox *bb;
ListBase nurb; /* actual data, called splines in rna */
- ListBase disp;
+ ListBase disp; /* undeformed display list, used mostly for texture space calculation */
EditNurb *editnurb; /* edited data, not in file, use pointer so we can check for it */