Made static particles working with a deformed Mesh, both for Lattice as
for Armature. Note: only works for subsurfed Mesh now! Change in drawobject.c: Halo option on subsurf Mesh now draws points. but using the original vertices...
This commit is contained in:
		@@ -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) {
 | 
			
		||||
@@ -1683,6 +1684,7 @@ void makeDispList(Object *ob)
 | 
			
		||||
 | 
			
		||||
		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,6 +2250,7 @@ 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
 | 
			
		||||
@@ -2261,19 +2266,18 @@ void test_all_displists(void)
 | 
			
		||||
			}
 | 
			
		||||
			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(done==0) {
 | 
			
		||||
				if ELEM(ob->type, OB_CURVE, OB_SURF) {
 | 
			
		||||
					if(ob!=G.obedit) {
 | 
			
		||||
						if( ((Curve *)(ob->data))->key ) makeDispList(ob);
 | 
			
		||||
@@ -2294,7 +2298,7 @@ void test_all_displists(void)
 | 
			
		||||
						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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
	
 | 
			
		||||
	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((paf->flag & PAF_STATIC)==0) {
 | 
			
		||||
		if (armature_parent) {
 | 
			
		||||
			do_all_actions();
 | 
			
		||||
			rebuild_all_armature_displists();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	/* put hierarchy back */
 | 
			
		||||
	par= ob;
 | 
			
		||||
	while(par) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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");
 | 
			
		||||
 
 | 
			
		||||
@@ -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,29 +2503,25 @@ 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 */
 | 
			
		||||
		else {
 | 
			
		||||
			
 | 
			
		||||
			mvert= me->mvert;
 | 
			
		||||
			mface= me->mface;
 | 
			
		||||
 | 
			
		||||
		/* 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) { /* No faces, just draw verts as points */
 | 
			
		||||
				
 | 
			
		||||
		if(ok) {
 | 
			
		||||
			start= 0; end= me->totvert;
 | 
			
		||||
			set_buildvars(ob, &start, &end);
 | 
			
		||||
			
 | 
			
		||||
@@ -2544,11 +2540,13 @@ static void drawmeshwire(Object *ob)
 | 
			
		||||
					glVertex3fv(mvert->co);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
				
 | 
			
		||||
			glEnd();
 | 
			
		||||
			glPointSize(1.0);
 | 
			
		||||
		}
 | 
			
		||||
			else { /* Draw wire frame */
 | 
			
		||||
		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 ) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user