diff options
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 52 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/effect.c | 96 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_effect_types.h | 1 | ||||
-rw-r--r-- | source/blender/renderconverter/intern/convertBlenderScene.c | 14 | ||||
-rw-r--r-- | source/blender/src/buttons_object.c | 4 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 76 |
6 files changed, 138 insertions, 105 deletions
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index fcb8749fe3b..4ffb18eb8d3 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -1672,8 +1672,9 @@ void makeDispList(Object *ob) float *data, *fp1, widfac, vec[3]; int len, a, b, draw=0; - if(ob==0) return; + if(ob==NULL) return; if(ob->flag & OB_FROMDUPLI) return; + freedisplist(&(ob->disp)); if(ob->type==OB_MESH) { @@ -1682,7 +1683,8 @@ void makeDispList(Object *ob) freedisplist(&(me->disp)); tex_space_mesh(ob->data); - + + /* deform: input mesh, output ob dl_verts. is used by subsurf */ object_deform(ob); if(ob->effect.first) object_wave(ob); @@ -1694,6 +1696,7 @@ void makeDispList(Object *ob) dlm= subsurf_make_dispListMesh_from_editmesh(em, me->subdiv, me->flag, me->subsurftype); } else { DispList *dlVerts= find_displist(&ob->disp, DL_VERTS); + dlm= subsurf_make_dispListMesh_from_mesh(me, dlVerts?dlVerts->verts:NULL, me->subdiv, me->flag); } @@ -2236,6 +2239,7 @@ void test_all_displists(void) { Base *base; Object *ob; + int done; /* prevent displist to be made too often */ unsigned int lay; /* background */ @@ -2246,7 +2250,8 @@ void test_all_displists(void) if(base->lay & lay) { ob= base->object; - + done= 0; + if(ob->type==OB_MBALL && (ob->ipo || ob->parent)) { // find metaball object holding the displist // WARNING: if more metaballs have IPO's the displist @@ -2260,41 +2265,40 @@ void test_all_displists(void) freedisplist(&ob->disp); } else if(ob->parent) { - + + done= 1; if (ob->parent->type == OB_LATTICE) makeDispList(ob); else if ((ob->parent->type == OB_IKA) && (ob->partype == PARSKEL)) makeDispList(ob); -#ifdef __NLA else if ((ob->parent->type==OB_ARMATURE) && (ob->partype == PARSKEL)) makeDispList(ob); - -#endif + else done= 0; } /* warn, ob pointer changed in case of OB_MALL */ - - if ELEM(ob->type, OB_CURVE, OB_SURF) { - if(ob!=G.obedit) { - if( ((Curve *)(ob->data))->key ) makeDispList(ob); + if(done==0) { + if ELEM(ob->type, OB_CURVE, OB_SURF) { + if(ob!=G.obedit) { + if( ((Curve *)(ob->data))->key ) makeDispList(ob); + } } - } - else if(ob->type==OB_FONT) { - Curve *cu= ob->data; - if(cu->textoncurve) { - if( ((Curve *)cu->textoncurve->data)->key ) { - text_to_curve(ob, 0); - makeDispList(ob); + else if(ob->type==OB_FONT) { + Curve *cu= ob->data; + if(cu->textoncurve) { + if( ((Curve *)cu->textoncurve->data)->key ) { + text_to_curve(ob, 0); + makeDispList(ob); + } } } - } - else if(ob->type==OB_MESH) { - if(ob->effect.first) object_wave(ob); - if(ob!=G.obedit) { - if(( ((Mesh *)(ob->data))->key )||(ob->effect.first)) makeDispList(ob); + else if(ob->type==OB_MESH) { + if(ob->effect.first) object_wave(ob); + if(ob!=G.obedit) { + if(( ((Mesh *)(ob->data))->key )||(ob->effect.first)) makeDispList(ob); + } } } - } if(base->next==0 && G.scene->set && base==G.scene->base.last) base= G.scene->set->base.first; else base= base->next; diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c index 1be709dc1ae..3369611a5b0 100644 --- a/source/blender/blenkernel/intern/effect.c +++ b/source/blender/blenkernel/intern/effect.c @@ -916,10 +916,10 @@ void give_mesh_mvert(Mesh *me, int nr, float *co, short *no, float seed2) { static float *jit=0; static int jitlevel=1; - MVert *mvert; - MFace *mface; + MVert *mvert, *mvertbase=NULL; + MFace *mface, *mfacebase=NULL; float u, v, *v1, *v2, *v3, *v4; - int curface, curjit; + int totface=0, totvert=0, curface, curjit; short *n1, *n2, *n3, *n4; /* signal */ @@ -929,17 +929,36 @@ void give_mesh_mvert(Mesh *me, int nr, float *co, short *no, float seed2) return; } - if(me->totface==0 || nr<me->totvert) { - mvert= me->mvert + (nr % me->totvert); + /* get it from displist? */ + if(me->disp.first) { + DispList *dl= me->disp.first; + if(dl->type==DL_MESH) { + DispListMesh *dlm= dl->mesh; + mvertbase= dlm->mvert; + mfacebase= dlm->mface; + totface= dlm->totface; + totvert= dlm->totvert; + } + } + + if(totvert==0) { + mvertbase= me->mvert; + mfacebase= me->mface; + totface= me->totface; + totvert= me->totvert; + } + + if(totface==0 || nr<totvert) { + mvert= mvertbase + (nr % totvert); VECCOPY(co, mvert->co); VECCOPY(no, mvert->no); } else { - nr-= me->totvert; + nr-= totvert; if(jit==0) { - jitlevel= nr/me->totface; + jitlevel= nr/totface; if(jitlevel==0) jitlevel= 1; if(jitlevel>100) jitlevel= 100; @@ -948,35 +967,35 @@ void give_mesh_mvert(Mesh *me, int nr, float *co, short *no, float seed2) } - curjit= nr/me->totface; + curjit= nr/totface; curjit= curjit % jitlevel; - curface= nr % me->totface; + curface= nr % totface; - mface= me->mface; + mface= mfacebase; mface+= curface; - v1= (me->mvert+(mface->v1))->co; - v2= (me->mvert+(mface->v2))->co; - n1= (me->mvert+(mface->v1))->no; - n2= (me->mvert+(mface->v2))->no; + v1= (mvertbase+(mface->v1))->co; + v2= (mvertbase+(mface->v2))->co; + n1= (mvertbase+(mface->v1))->no; + n2= (mvertbase+(mface->v2))->no; if(mface->v3==0) { - v3= (me->mvert+(mface->v2))->co; - v4= (me->mvert+(mface->v1))->co; - n3= (me->mvert+(mface->v2))->no; - n4= (me->mvert+(mface->v1))->no; + v3= (mvertbase+(mface->v2))->co; + v4= (mvertbase+(mface->v1))->co; + n3= (mvertbase+(mface->v2))->no; + n4= (mvertbase+(mface->v1))->no; } else if(mface->v4==0) { - v3= (me->mvert+(mface->v3))->co; - v4= (me->mvert+(mface->v1))->co; - n3= (me->mvert+(mface->v3))->no; - n4= (me->mvert+(mface->v1))->no; + v3= (mvertbase+(mface->v3))->co; + v4= (mvertbase+(mface->v1))->co; + n3= (mvertbase+(mface->v3))->no; + n4= (mvertbase+(mface->v1))->no; } else { - v3= (me->mvert+(mface->v3))->co; - v4= (me->mvert+(mface->v4))->co; - n3= (me->mvert+(mface->v3))->no; - n4= (me->mvert+(mface->v4))->no; + v3= (mvertbase+(mface->v3))->co; + v4= (mvertbase+(mface->v4))->co; + n3= (mvertbase+(mface->v3))->no; + n4= (mvertbase+(mface->v4))->no; } u= jit[2*curjit]; @@ -1019,7 +1038,7 @@ void build_particle_system(Object *ob) } paf= give_parteff(ob); - if(paf==0) return; + if(paf==NULL) return; waitcursor(1); @@ -1027,7 +1046,7 @@ void build_particle_system(Object *ob) /* generate all particles */ if(paf->keys) MEM_freeN(paf->keys); - paf->keys= 0; + paf->keys= NULL; new_particle(paf); cfraont= G.scene->r.cfra; @@ -1092,12 +1111,20 @@ void build_particle_system(Object *ob) force[1]= paf->force[1]*0.05f; force[2]= paf->force[2]*0.05f; - deform= (ob->parent && ob->parent->type==OB_LATTICE); - if(deform) init_latt_deform(ob->parent, 0); + if( paf->flag & PAF_STATIC ) deform= 0; + else { + deform= (ob->parent && ob->parent->type==OB_LATTICE); + if(deform) init_latt_deform(ob->parent, 0); + } /* init */ give_mesh_mvert(me, totpart, co, no,paf->seed); + if(me->disp.first) { + DispList *dl= me->disp.first; + if(dl->type==DL_MESH) printf("from disp\n"); + } + printf("\n"); printf("Calculating particles......... \n"); @@ -1207,11 +1234,12 @@ void build_particle_system(Object *ob) give_mesh_mvert(0, 0, 0, 0,paf->seed); /*Restore armature settings*/ - if (armature_parent) { - do_all_actions(); - rebuild_all_armature_displists(); + if((paf->flag & PAF_STATIC)==0) { + if (armature_parent) { + do_all_actions(); + rebuild_all_armature_displists(); + } } - /* put hierarchy back */ par= ob; while(par) { diff --git a/source/blender/makesdna/DNA_effect_types.h b/source/blender/makesdna/DNA_effect_types.h index 00d0546f1ec..b8dc9efd959 100644 --- a/source/blender/makesdna/DNA_effect_types.h +++ b/source/blender/makesdna/DNA_effect_types.h @@ -42,6 +42,7 @@ #define PAF_BSPLINE 2 #define PAF_STATIC 4 #define PAF_FACE 8 +#define PAF_ANIMATED 16 /* eff->type */ #define EFF_BUILD 0 diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c index 03e6e979e3a..24d6bcf92c6 100644 --- a/source/blender/renderconverter/intern/convertBlenderScene.c +++ b/source/blender/renderconverter/intern/convertBlenderScene.c @@ -853,14 +853,14 @@ static void render_particle_system(Object *ob, PartEff *paf) int a, mat_nr=1; pa= paf->keys; - if(pa==0) { + if(pa==NULL) { build_particle_system(ob); pa= paf->keys; - if(pa==0) return; + if(pa==NULL) return; } ma= give_render_material(ob, 1); - if(ma==0) ma= &defmaterial; + if(ma==NULL) ma= &defmaterial; MTC_Mat4MulMat4(mat, ob->obmat, R.viewmat); MTC_Mat4Invert(ob->imat, mat); /* this is correct, for imat texture */ @@ -955,7 +955,7 @@ static void render_static_particle_system(Object *ob, PartEff *paf) int a, mat_nr=1; pa= paf->keys; - if(pa==0) { + if(pa==NULL || (paf->flag & PAF_ANIMATED)) { build_particle_system(ob); pa= paf->keys; if(pa==0) return; @@ -1253,6 +1253,9 @@ static void init_render_mesh(Object *ob) me= ob->data; + /* object_deform changes imat */ + do_puno= object_deform(ob); + paf = give_parteff(ob); if(paf) { if(paf->flag & PAF_STATIC) render_static_particle_system(ob, paf); @@ -1260,9 +1263,6 @@ static void init_render_mesh(Object *ob) return; } - /* object_deform changes imat */ - do_puno= object_deform(ob); - /* yafray: set transform to identity matrix */ if (R.r.renderer==R_YAFRAY) MTC_Mat4One(mat); diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index e9c3e265ecd..4b441a38c78 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -1354,7 +1354,9 @@ void effects_panel_effects(Object *ob) paf= (PartEff *)eff; uiDefBut(block, BUT, B_RECALCAL, "RecalcAll", 741,187,67,27, 0, 0, 0, 0, 0, "Update the particle system"); - uiDefButS(block, TOG|BIT|2, B_CALCEFFECT, "Static", 825,187,67,27, &paf->flag, 0, 0, 0, 0, "Make static particles"); + uiDefButS(block, TOG|BIT|2, B_CALCEFFECT, "Static", 825,187,67,27, &paf->flag, 0, 0, 0, 0, "Make static particles (deform only works with SubSurf)"); + if(paf->flag & PAF_STATIC) + uiDefButS(block, TOG|BIT|4, B_DIFF, "Animated",825,167,67,20, &paf->flag, 0, 0, 0, 0, "Static particles are recalculated each rendered frame"); uiBlockBeginAlign(block); uiDefButI(block, NUM, B_CALCEFFECT, "Tot:", 550,146,91,20, &paf->totpart, 1.0, 100000.0, 0, 0, "Set the total number of particles"); diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 3b063e9da8c..942ca673761 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -2362,7 +2362,7 @@ static void drawmeshwire(Object *ob) Material *ma; EditEdge *eed; EditVlak *evl; - float fvec[3], cent[3], *f1, *f2, *f3, *f4, *extverts=0; + float fvec[3], cent[3], *f1, *f2, *f3, *f4, *extverts=NULL; int a, start, end, test, ok, handles=0; me= get_mesh(ob); @@ -2503,52 +2503,50 @@ static void drawmeshwire(Object *ob) } else { /* Object mode draw */ - if(me==0) return; + if(me==NULL) return; if(me->bb==0) tex_space_mesh(me); if(me->totface>4) if(boundbox_clip(ob->obmat, me->bb)==0) return; - if(mesh_uses_displist(me)) drawDispListwire(&me->disp); /* Subsurf */ + /* check for drawing vertices only */ + ok= 0; + if(me->totface==0) ok= 1; else { + ma= give_current_material(ob, 1); + if(ma && (ma->mode & MA_HALO)) ok= 1; + } + mvert= me->mvert; + mface= me->mface; + + dl= find_displist(&ob->disp, DL_VERTS); + if(dl) extverts= dl->verts; + + if(ok) { + start= 0; end= me->totvert; + set_buildvars(ob, &start, &end); - mvert= me->mvert; - mface= me->mface; - - ok= 0; - if(me->totface==0) ok= 1; - else { - ma= give_current_material(ob, 1); - if(ma && (ma->mode & MA_HALO)) ok= 1; - } - - dl= find_displist(&ob->disp, DL_VERTS); - if(dl) extverts= dl->verts; - - if(ok) { /* No faces, just draw verts as points */ - - start= 0; end= me->totvert; - set_buildvars(ob, &start, &end); - - glPointSize(1.5); - glBegin(GL_POINTS); - - if(extverts) { - extverts+= 3*start; - for(a= start; a<end; a++, extverts+=3) { /* DispList found, Draw displist */ - glVertex3fv(extverts); - } + glPointSize(1.5); + glBegin(GL_POINTS); + + if(extverts) { + extverts+= 3*start; + for(a= start; a<end; a++, extverts+=3) { /* DispList found, Draw displist */ + glVertex3fv(extverts); } - else { - mvert+= start; - for(a= start; a<end; a++, mvert++) { /* else Draw mesh verts directly */ - glVertex3fv(mvert->co); - } + } + else { + mvert+= start; + for(a= start; a<end; a++, mvert++) { /* else Draw mesh verts directly */ + glVertex3fv(mvert->co); } - - glEnd(); - glPointSize(1.0); } - else { /* Draw wire frame */ + glEnd(); + glPointSize(1.0); + } + else { + + if(mesh_uses_displist(me)) drawDispListwire(&me->disp); /* Subsurf */ + else { start= 0; end= me->totface; set_buildvars(ob, &start, &end); @@ -2690,7 +2688,6 @@ static void drawmeshwire(Object *ob) } } } - } } } @@ -3677,6 +3674,7 @@ void draw_object(Base *base) } else drawDispList(ob, dt); } + if( (ob!=G.obedit) && ((G.f & (G_BACKBUFSEL+G_PICKSEL)) == 0) ) { paf = give_parteff(ob); if( paf ) { |